# What is WLJS The notebook interface [#the-notebook-interface] The notebook interface (or IDE) combines live code in Wolfram, JavaScript, and other languages. We provide GUI building blocks for user input/output, a subset of LaTeX for equations, Markdown for narrative text, and data-driven presentations.
Notebook Interface
Think of it as a multi-tool platform for research, experiments, or as a powerful sandbox where you can try out your ideas, write a story about them, and then publish them on the web. Like this one: Read our fast-track introduction on Wolfram Language at [that page](./Wolfram-Language) ``` .md Let\'s write a function to generate notes in the given scale: ``` Let's write a function to generate notes in the given scale: ``` scale["Major"] = {2, 2, 1, 2, 2, 2, 1}; makeScale[root_, sc_, pos_] := With[ {b = Accumulate @ Prepend[sc, root], n = Length[sc] + 1}, b[[Mod[pos - 1, n - 1] + 1]] + 12 Quotient[pos, n] ]; ``` ``` .md Now we can generate any chord progressions in a major scale, for ex. **I-V-VI-IV** ``` Now we can generate any chord progressions in a major scale, for ex. **I-V-VI-IV** ``` chords = makeScale[1, scale["Major"], {#,2+#,4+#}] &/@ { 1, 1, 5, 5, 6, 6, 4, 4, 1 }; SoundNote /@ chords // Sound ``` ``` (*VB[*)(Null)(*,*)(*"1:eJxTTMoPSmNkYGAoZgUSwfmleSlpnCAuC5DwySwugUhywiT98ktS05iRFWSCFGSCdGdyAAnqqwepyuQBEfw0Uc8FUsoLIgRpop4NpBSuifrqUcMTAOwDUao="*)(*]VB*) ``` ``` .md Visualize it on imaginary piano ``` Visualize it on imaginary piano ``` blackQ[y_] := MemberQ[{2,4,7,9,11}, Mod[y-1,12]+1]; ListStepPlot[(*BB[*)(Transpose[chords])(*,*)(*"1:eJxTTMoPSmNmYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLh8QCJkKLEvOKC/OJUp/yKYJBoSBoTTGVQaU5qMFhLamJKMCeyajRFrECGa1lqXglYyK80JwcAFSsgcg=="*)(*]BB*), PlotStyle->(*VB[*)(Hue[0.03561231666487014, 0.8918383801498982, 0.8795337025157177, 1.])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNBCjmANIBLk7Oefn5BcVicky3lVWfWNfpLliouDmCxfsi/5vOjStL2qHfREDGHywBwA7SBsq"*)(*]VB*), Prolog->Flatten@Table[{If[blackQ[y],(*VB[*)(RGBColor[0.5666666666666667, 0.5666666666666667, 0.5666666666666667])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qUgKDR/aYDAAR9RPe"*)(*]VB*),(*VB[*)(GrayLevel[0.95])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qSgODd/aYDABY1RjK"*)(*]VB*)], Rectangle[{.5,y-.5},{9.5,y+.5}], (*VB[*)(GrayLevel[0])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYoACTAYAyrgOFw=="*)(*]VB*), Line[{{.5,y-.5},{9.5,y-.5}}]}, {y, 0, 18}]] ``` ``` (*VB[*)(Null)(*,*)(*"1:eJztWmtsFEUcvxYEhEJLaWoFKX0RXgEsJCTExx60UJq0cPQK0cQPLHdz14G93WN2D3uYGCXhA8Zv8kVDNKKJQQ0xBgyaGBI+SBQFJOCDRwQFgYBSA1FM8DEzuzN3u7e30zt2TQA36e7M/mf+z9/+5z9zbV6v9SUqQ6GQPgbfupCcHoAx3XwzEt96oG4kRth6oULaWHxboqqaIRtQUxMVthEPeMy29ypdeI0olEZuKzIAbXpi7LdvpS9KaCG9fso1EmSC/iC+dUIEYgbcDEylyKuIBlUjCreAnN19VJasQDIIPo5v5vCJRJf1uqZkDNCPHbNRBboOyTS7Jrubj0849NguCS3+48W3h7Zfk1D91IqzrdOvSSaf0fi2Ki3HoJFFIXoNSfleUgEgTGvxX2WIXUMSe+78h16S/X0ozPpHKHl02E4fY/Wbwia9mvfNZw3vX6L0SQ56nfVss+gP8b75bHDQpzjoj/BxJn2aY14T79+k9GYHvcVhTxvvR+vxo2NARgZUk+siCG6WDbCuX062tpeKoZqaDcu2/n3tXsdQXdiOIRZbhqG6sB1DjM4wNNOBoZnWs4b37RhidMZntgNDs61ng4M+xUFnGGpzYIhhoYn37Rhi9BaHHm28XxxDC0rF0AcvzTi6tf3gvY6hJgeGmO8ZhpocGGJ0hqF5DgzNs541vG/HEKOz2LU7MNRuPRsc9CkOOsPQbAeGGMaaeN+OIUZvcYzLYa84hhaacRmHb0t0XYtBE0R8We3LKCBKoroCJgcU/GcsU0AKqIa19HpPJCtqj7weKPaVNkrC+9TTJsU+gzSWyopzwnjc6FbjMIb1jlO6fdp4KiirZYxVaaKHnqgSa1eNGxFZBUpE0QxztrnOe0+jnwSe0SerSeAoQGw9SJghFovitPawi9uWIznlyV2no2RFB7lWKSOoJJo7BoG+CsEkVF1UpDcXB3Sn5CTI5QQ+Z6CCDSci+2EK6I53Ee1ZgKiLuzQlDlSaSiDBswsUiG4Oo0ijH2UAb7iYRJEVNbIKcCvc+FAzzmmc76gSZehIUNYJEnJGMUxx9ux7N2TV/3X0R0c7MCaH8lImhSPOvMszaszMTsPInTRlaxqKQxUnPb1f0xSW2yqYoYyhI09UcIttg/ibbgxpAyufS7JRnM+ot3KcIni1cBkAOfPAJFSGClJODRkQk12cWCQ55ith16jkcTyr4HUzBQn4dM+sMoqkjY7lipwsmnZJoxcYsglsbxwQ060UwwFlN4Iup51ZVU7hHTF5uVJTnRKJJngBBYOequcHU69i7A2QJuudY+wEYibSMmmuVc5cU2lToyJKe+6v7b1GgcYdmmogTdGLuVuvpplDTytylltXPNY6UZ4v8BE5jr/ApBfYTAyPsiAK4ui5uj1d57fskIoTypz/2qvk2i3l8gdRuBNgw0Ccpjeid7dqACSTNElATWrktoLXLiZbIFsq4/jRtcwOsiqLOzt6ibqfw5Tg8Ltd/3vG3Duug/TyajW6fpNpjp0An0sSWZGMppdSujpdX2J8/7N6nBpFJbl4ZPj+Gbb/qKh+XAh5L6Y0TBlDS+Hwx+y9ckby0HchGCd7eTfYeKk+IX+uCX5eDuYqxEr2CqM+2wM2A8Uq1s5JViL93lG10VSL1+UBLZ6odvdHbt8wCHW2NojTPJ1Wl/fVahk1LqMsVd7LT7SQtCaxr5dnhoLTHvtUUhasxd8vHmcd9NxwqlRLv0s5trFXy+ggoumwsJzMfcXFyhkiaFkigf2ueypE7MyVAxUeI4kkRJONSzE4IZ8NLf/L50Uhg7S0UghDF1clEAAJDaU6MkjXUK8WL7oLJXxxeonRsxJPvkT1wShx25KCYw1Cy0aLlHR5i0Av0AfyvoP8fQ7fHsFRhdbnsSBrhcnCBfn2D4uGmO6zupZ2aIqG0P7GbVdX7z+Sd7BofmBXJOHGa1j8E/T6VULv/na8d33NBQnRX1SeOOgT/2lE/cazkiXoZwmd30K+4S984n9i3+9Prtn2i4TOzH/j/YY930loZlfFrnWf+cX/4rGW038+/6OE+mgkzrFAXPWJf9++syN/2HtZQjtXTX1vx+unJTT08PZjYxZ94hN/lo6tzInjG6LXkE/8GTercZk1hnEwUIL+V3LrihWIyz7pf3s3wT12y1dfkuuC3/qvoHDH+DQbJxl+Dvuk/+zF0ztr38FuCZ+8ubprr+/41Ma9OX5D83UJDXTcvrT1As4/p04erTp16EOf+L8c2rTk41cuSeijG3+dGLzyjYR6Fq185nDDOZ/474osbD11/WuWdnD+SZ75/NOZg6eHyZ8ndHIO3onrCKiWWJuQ7YJtv+u99eTzJoXIUZgBU3iFIUtIr4w24pKj2LJIhnerMSUTB3wFx9I8KyDbci8umPzRiB744GUe4eU7CtzOPoJTyePkz6uQcNnU3IcnhZOo89IQxNfKSgbcf54Y1jHDcH71IykhmtUNkOoh55463D+uwNvkK1mjA2SNqJlRMGKiNcJ+yuFxHhDoT2vcG1RChwLTaZJ+iqhztxwE2vavEYSXlGSip5CxfS/MaurcCtWH1ydsqfMoKbdrthoHXOmtYT7QRZx5GGP7Bd/LkyXLPOCviZK3uFtBmCiQiemFhUMLvXDhX9Ao2eZbAvkjw/7bLJLp6ufywzoy7C2uKgATRTIxPdCwVgnk1wZgs0imq5/LD2utQFx9ACaKZLq6tXwT6wXiJgdgokhmfcDInSyQ3xiAzSKZrn4uP6yNAnHNAZgoktkYcFibBfJbA7BZJNPVz+WHtVUgbnoAJopktgYc1ukC+TMCsFkk09XP5Yd1hkDcrABMFMl0dWv5Js4SiJsTgIkimbMCRu4cgfy5Adgskunq5/LDOlcgbn4AJopkzg04rPO95b/waAA2C2S6+7nssBITPE1s999EoUxXt5ZvYrtA3IIATBTJLDhUMv/VueC/KMT/DXEn/xL0Lx60es4="*)(*]VB*) ``` WLJS is **more** than just a REPL or Jupyter clone ducktaped on Wolfram Engine; it provides its own standard libraries, runtime, UI kit and implements all manipulate features, graphics, sound from scratch allowing it to run expressions **even without a kernel, just in the browser**: ``` Manipulate[ParametricPlot[{Sin[u] u , Cos[u] u}, {u, 0, t}, PlotPoints -> 125, Axes -> False, MaxRecursion -> 0, PlotStyle -> Thick], {t,10,100,10}, ContinuousAction->True] ``` ``` (*VB[*)(FrontEndRef["243bf338-3fd1-494e-897f-7baf372bfca3"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG5kYJ6UZG1voGqelGOqaWJqk6lpYmqfpmiclphmbGyWlJScaAwCAaBXf"*)(*]VB*) ```
Is it like Mathematica? [#is-it-like-mathematica] WLJS Notebook is **free and open-source software** , that connects to and uses freeware [Wolfram Engine](https://www.wolfram.com/engine/). We provide compatibility layer for Wolfram Mathematica features as well as extend the language with event system, async functions, integration with web-technologies and many more. Notably: * Output cells are editable and mostly are valid for evaluation * Wide support for syntax sugar, math typesetting * `Graphics`, `Graphics3D`, `Sound`, `Image3D` work and also are interactive * Most plotting functions work out of the box * `Manipulate`, `Animate` are supported, but with some limitations * Output expressions are also valid for console input, unlike Mathematica's output form import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; * Text or expression formatting is not as rich as in Mathematica * `Dynamic` and `DynamicModule` were removed in a favour of more fine-grained and optimized update methods * Event-based approach for input elements such as `Slider` * Flat Jupyter-like notebook structure * Markdown language is used for text cells * There might not be full support of all plotting functions or symbols representations Apply `MMAView` expression on anything to make it looks like in Mathematica. It will bypass all WLJS pipleines and be rendered to an image. > **Can it open `.nb` files?** > **Yes!** There are some limitations regarding complex styling / formatting of the text, and dynamic modules (see below). But we gradually improve the compatibility with every update.
Why not Jupyter Lab or VSCode? [#why-not-jupyter-lab-or-vscode] We chose to build our own system because: * A Jupyter kernel for Wolfram Engine already exists * We wanted powerful syntax sugar, editable output cells, **multimedia** cells — which require a custom extendable code editor * **Frontend - Kernel** interface based on ZMQ is quite robust, but it doesn't meet our needs for a low-latency communication with text and binary large payloads * Adding a 3rd main language or API would increase long-term maintenance Under the hood [#under-the-hood] A combination of native and web-technologies allows WLJS Notebook to run remotely on a server or on a desktop computer. We heavily rely on Javascript and HTML for 3 reasons: 1. It is safe sandbox for experiments and research 2. Easy access to GPU resources and fantastic libraries for data-visualization 3. The interactive content of the notebook can be exported and published on web User Interface [#user-interface] Your notebook is a file and is an entry point for taking notes on your data, research, and processing, or even creating interactive reports in the form of presentations. You may store files inside a notebook via `NotebookStore`, but we recommend keeping large files in a separate folder: import { File, Folder, Files } from 'fumadocs-ui/components/files'; import {Notebook} from 'lucide-react' } /> The notebook consits of cells or groups of *input-output* cells. Input cell gives you a superpower to switch between languages or type of produced content with a single line: ``` 1+1 ``` ``` .md Here is a text note ``` ``` .js return 1+1; ``` ``` .slide # Slide My presentation ``` ``` data.txt Write directly to a file ``` > Think of it like an anonymous file. We intentionally avoid menus, lists to give the most space for the content you write If **nothing matches the pattern in the first line**, it will assume Wolfram Language input. After typing, press Shift-Enter or Ctrl/⌘-Enter to make the magic happen. The output cells are results of evaluation. They can be many things: markdown rendered content, a slide of a presentation, a DOM element returned by Javascript cell or a Mermaid diagram: ``` {1,2,3} /. i_Integer :> Hue[i/3] ``` ``` {(*VB[*)(Hue[1/3])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYoACKOODPVwEANd+D0Y="*)(*]VB*),(*VB[*)(Hue[2/3])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYoACdMYHewDM1w9G"*)(*]VB*),(*VB[*)(Hue[1])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYgCDD/ZQBgMDnAEA4iUPRg=="*)(*]VB*)} ``` ``` .mermaid gantt section Waffle Iron : 1982, 3y House : 1986, 3y ``` ``` gantt section Waffle Iron : 1982, 3y House : 1986, 3y ``` You can mutate Wolfram output cells to new input cells by editing them. Cell group properties [#cell-group-properties] Even plain text cells are evaluated and produce output. For this reason you can change the properties of the group and, for example, **hide input cell** for clarity: import cellProp from './../cell-prop.png'
* **Clear output** - removed all output cells * **Project to a window** - evaluates input cell in a new window; it can be used for projecting slides, or control sliders * **Make initialization cell** - marks input to be evaluated at the startup * **Copy group** - copies a group as a special compressed string; paste it to an empty input cell * **Split to new notebook** - cuts all cells below and inserts to a new notebook * **Insert cell before** * **Hide / Show** - hide or show input cell of the group; it can be used for markdown text cell * **Shrink / Expand** - hides large content of the input cell * **Lock / Unlock** - enables / disables editing of the input cell and hides the content * **Vanish** - permanently hides input cell * **Delete** - deletes the whole group
import {Projector} from 'lucide-react' Project to a window > is a particularly useful feature that lets you evaluate a cell in a new window. This is especially helpful when presenting slides or distributing multiple controls / graphics outputs across windows. Projecting the same cell will refresh the content of the existing window Context menu [#context-menu] Extended context menu provides you the following features on selected text import contextProp from './../context-prop.png'
* **Evaluate in place** - evaluates selected expression and replaces it with the result * **Iconize** - compresses selected expression to encoded string or to a file (depending on size) and replaces it with an icon * **Store in notebook** - copies an expression to a notebook storage (see [NotebookStore](./Cells-and-Notebook/NotebookStore) symbol) * **Simplify** - applies [Simplify](./Algebra-and-Polynomials/Simplify) on selected * **Speak** - speaks any selected text using a voice synthesizer * **Highlight** - highlights WL expression with yellow * **Hidden comment** - turns selection into a comment in WL * **Copy**
Options except Speak and Copy are only valid in Wolfram Language cells. Math typesetting and shortcuts [#math-typesetting-and-shortcuts] To be honest, typing mathicamtical expressions in the most modern IDE for programming languages did not evolve since 1964. Our goal is to change that in a similar way as Mathematica did (over nearly 20 years), but in open-source. So to style code expressions, replace them, or add additional elements in between we use decorations. The most common one for example: ``` (*FB[*)((1)(*,*)/(*,*)(2))(*]FB*) ``` used to render fractions, if you copy it to a text editor you will still see a valid expression of `(1/2)` ```wolfram (*FB[*)((1)(*,*)/(*,*)(2))(*]FB*) ``` the meta information is stored safely in comments, the same works with graphical, sound or any other non-textual output. In this sense **the standard output form of WLJS is decorated `InputForm`**. Here is more complex example: ``` (*TB[*)Integrate[(*|*)f[x](*|*), (*|*)x(*|*)](*|*)(*1:eJxTTMoPSmNmYGAo5gUSYZmp5S6pyflFiSX5RcGcQBHPvJLUdCA3NZMRpIgVSLgl5hSnAgCQTg44*)(*]TB*) ``` while under the hood we have: ```wolfram (*TB[*)Integrate[(*|*)f[x](*|*), (*|*)x(*|*)](*|*)(*1:eJx...metainfo*)(*]TB*) ``` Decorated expressions can be infinitely nested and fully navigable with keyboard input: Use arrow keys to navigate your cursor inside boxed expressions or click to edit them directly. To assist with writing basic mathematical expressions, we provide special keyboard shortcuts to insert templates or apply formatting to selected text:
Cells [#cells] * Ctrl-/: Create fraction * Ctrl-6: Power * Ctrl-2: Square root * Ctrl--: Subscript * Ctrl-=: Semantic input * ESC: Open suggestions for greek symbol * Alt-/ or ⌘-/: Comment a line * Ctrl-F or ⌘-F: Search inside cell
Evaluation [#evaluation] * Shift-Enter: Evaluate cell * Ctrl-Enter or ⌘-Enter: Evaluate cell and jump to the next * Ctrl-Shift-Enter or ⌘-Shift-Enter: Project cell to a window * Alt-I or ⌘-I: Evaluate initialization cells
Notebook [#notebook] * Alt-2 or ⌘-2: Hide/show input cell * Ctrl-U or ⌘-U: Clear output cell * Ctrl-N or ⌘-N: New notebook * Ctrl-S or ⌘-S: Save notebook * Ctrl-O or ⌘-O: Open notebook * Ctrl-P or ⌘-P: Open command palette
Command Palette [#command-palette] Use Ctrl-P or ⌘-P to access useful tools like matrix builders, color pickers, and more: Palette items are also normal notebooks with special cells inside. Overlay [#overlay] There is also a global shortcut to call WLJS overlay for quick evaluations available on desktop Shift-Alt-Space . Interactivity [#interactivity] Interactive elements like `Manipulate`, `Animate`, `ManipulatePlot`, and `AnimatePlot` optimize performance by using low-level, fine-grained updates that avoid full re-evaluation of expressions. Here's an example of this approach: ``` var = 1.0; Graphics[{ (*VB[*)(RGBColor[0.9324328496246868, 0.4779810744981178, 0.2076180267119551, 1.])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNBCjmANIBLk7Oefn5BcVvQqJzqq99ta+iOnxkXe20+/ZF329mWJrNfmUfREDGHywBwB/2B0I"*)(*]VB*), Rectangle[{0,-.1}, {Offload[var], .1}], (*VB[*)(RGBColor[0.5767811690402207, 0.576646915402451, 0.5765764507985959, 1.])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNBCjmANIBLk7Oefn5BcVLbKzP/G35JF9keDReOsnxUDG++hfJQEgBgMYfLAHAHLqHLY="*)(*]VB*), Text[var//Offload, {Offload[var + 0.05], 0}] }, AspectRatio->0.1] ``` The nearest parent symbols (`Rectangle` and `Text`) become dependent on the symbol `var` wrapped with `Offload`, though this doesn't apply to simple math operations. Changing `var` will trigger an update of only these dependent elements. ``` (*VB[*)(Graphics[{RGBColor[0.9324328496246868, 0.4779810744981178, 0.2076180267119551, 1.], Rectangle[{0, -0.1}, {Offload[var], 0.1}], Directive[RGBColor[0.5767811690402207, 0.576646915402451, 0.5765764507985959, 1.], FontWeight -> 800], Text[Offload[var], {Offload[var + 0.05], 0}, {1, 0}]}, AspectRatio -> 0.1, "Controls" -> False, PlotRange -> {{0, 1.2}, Automatic}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWkgRjEHkHAvSizIyEwuhoiACJ/M4hKEfJC7k3N+Tn5R0auQ6Kzaa2/ti5geH3lnO/2efdHXmym2VpNP2RcxgMEH+zQmkC5OkK7U5JLEvPScVIgQzNhMkLqiWTNBYOd+VDmIA9mBhH9aWk5+YkoxM5BdllgEU49kvEtmEdCCzLJULO5cZGd/4m/JI/siwaPx1k+KgYz30b9KAkAMVHeCtAaV5qQWcwEZbvl5JeGpmekZJZkKQHvTmGEqQlIrcDuNgA8Q0gE5pcVo/llpDw4NtAACGYEmDnYjN5DhWFwA9HVQYklmPlqYwJQFg0LCGeiVovyc4mJWkL8Sc4pT0cziBDsoH2hSXjpaBGGLLmMw+GwP1udYWpKfC3RBMgA53ZpC"*)(*]VB*) ``` For user input, we use an event-based approach by assigning handler functions to interactive elements like sliders: ``` EventHandler[InputRange[0,1,0.1], Function[val, var=val]] ``` Try dragging the slider to see the result: ``` (*VB[*)(EventObject[<|"Id" -> "71ade53b-7a60-40e5-84f3-279c2f7c5c16", "Initial" -> 0.5, "View" -> "81b5b125-693b-4830-868c-be07d724e831"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWxgmmSYZGpnqmlkaJ+maWBgb6FqYWSTrJqUamKeYG5mkWhgbAgB1kxTp"*)(*]VB*) ``` Performance [#performance] How far can we push `Offload`? WLJS architecture is optimized for rapid mutations, binary payloads, and streaming updates. Here are some real-time benchmarks demonstrating interactive performance: Animation made using `Graphics`: Animation made using `Image`: Animation made using `Graphics`: Animation made using `Graphics3D`: Animation made using `Graphics3D`: All examples were captured using a screenrecording app on the notebook cells. Portability [#portability] WLJS Notebook offers multiple export formats that preserve interactivity, allowing you to share your work in the way that best suits your needs: Self-contained HTML file [#self-contained-html-file] Everything is embedded in a single file: all cells, internal notebook storage, and images. **No internet dependency** — works completely offline and remains functional even after future updates. You can always re-import the exported notebook back into WLJS. > Best for long-term storage, sharing notes, presentations, or reports with colleagues. No external programs or plugins needed—just a browser Embeddable HTML [#embeddable-html] Cells are converted to web components with interactivity metadata provided as JSON assets. Works both offline and online via CDN (default): > Ideal for basic blog pages and publishing notes on the web MDX [#mdx] Similar to *Embeddable HTML*, but adapted for JSX environments, particularly the Next.js framework. A working template is published in the repository: > Ideal for modern blogs and content platforms that support Next.js or React Markdown [#markdown] Only input cells and output text cells are converted to Markdown; all other outputs are stripped. > Best for documentation or AI engines when interactivity isn't needed PDF [#pdf] Export the entire notebook to PDF or slides only from your presentation. > Perfect for static documents, printing or projecting slides (when other options are not available) Mini application [#mini-application] WLJS Notebook can be used as a runtime for mini apps. It's a single-window application that uses the full capabilities of a normal notebook (similar to Wolfram CDF or LabView programs) and runs in an isolated, generated context. > Great for distributing standalone tools Mathematica Notebook [#mathematica-notebook] Convert a `.wln` notebook to a `.nb` file with some limitations. > Useful for sharing work with Mathematica users Technology stack [#technology-stack] Both the server and desktop applications run on the same technology stack. Backend [#backend] * **Wolfram Engine** - acts as [TCP/HTTP/WebSocket server](https://github.com/WLJSTeam/HTTP) and handles logic * **libuv** - acts as crossplatform sockets library * **WLX** - [template engine](https://github.com/JerryI/wl-wlx) for server-side rendering (similar to JSX)
Frontend [#frontend] * **WLJS Interpreter** - reduced 3kB Wolfram Language interpreter * **CodeMirror 6** - main code editor and the heart of the system * **D3.js, Plotly.js** - vector graphics rendering * **THREE.js** - 3D graphics rendering * **Custom WebGL shaders** - for 3D images and complex 2D graphics * **Marked.js** - markdown renderer * **KaTeX** - equation rendering * **Reveal.js** - markdown engine for presentations * **Tone.js** - sound generation * **XTerm.js** - terminal emulation * **Excalidraw** - hand drawing input in markdown cells Backend and frontend communicate via Wolfram expressions transported over binary or textual WebSockets. The desktop application adds **Electron Framework** and **Electron Builder** to the mix, along with **PDF.js** and **napi-rs/canvas** for PDF generation and a bunch of native modules (**electron-trackpad-utils**, **native-prompt**) for better desktop integration. # Support us As an open-source initiative, our mission is to bring the power of Wolfram Language computation—traditionally associated with heavyweight closed commercial tools—into a portable, browser-based environment. Developed through the collective effort of physicists and programmers this freeware notebook environment helps in solving real-world scientific challenges, teach students complex concepts from science more intuitively, and explore mathematics and computational thinking in a more interactive and accessible way using symbolic programming paradigm. Your contributions directly support: * **Ongoing Development & Maintenance:**\ We continuously update our platform to ensure compatibility with the latest Wolfram Engine, introduce new features, and refine the performance of 2D/3D graphics, dynamic notebooks, data-driven presentations and many more. * **Documentation & Tutorials** * **Coffee machine capsules** To stay awake after work and work on your submitted issues and questions **Every contribution, no matter how small or large, makes a difference.** **Thank you for helping us 🩵** How to Contribute [#how-to-contribute] * **GitHub Sponsors**\ [@JerryI](https://github.com/sponsors/JerryI) The amout will be splitted between the main contributors. * [**By Me A Coffee**](https://buymeacoffee.com/wljs) * [**PayPal**](https://www.paypal.com/donate/?hosted_button_id=BN9LWUUUJGW54)\ A quick, secure method for a one-time donation. * [**Open Collective**](https://opencollective.com/wljs-notebook) # Troubleshooting If something isn't working as intended, please post an [**issue on GitHub**](https://github.com/WLJSTeam/wljs-notebook/issues) and include information evaluated in your Wolfram Engine, such as: ```wolfram $Version $SystemID ``` Also specify how you are running the app (as desktop or Docker image). Cache Issues [#cache-issues] Sometimes after an update, your browser's cache may still be outdated. Try the following options depending on your browser: * Ctrl-F5 or ⌘-R * `Force Reload` (from the top menu of desktop application window) * `Reload Window` (from the top menu of desktop application window) * `Clear Cache and Reload` (from the top menu) Cells Didn't Load Correctly [#cells-didnt-load-correctly] This rarely occurs when asynchronous loading fails. Perform a **Force Reload** of the window/page (from the main top menu or your browser). Javascript Console [#javascript-console] Any errors caused by cell evaluation will appear there: import { Menu, Dot } from 'lucide-react';
Menu
Window
Toggle Developer Tools
Bypass WLJS Renderer and use MMA's [#bypass-wljs-renderer-and-use-mmas] To bypass the standard form of expression used in WLJS Notebook, use [MMAView](./GUI/MMAView) ```wolfram Plot[x, {x,0,1}] // MMAView ``` WLJS Notebook does not cover all possible styling options for plots, graphics and diagram types. For that reason we give an option to use the default renderer of Wolfram Engine. Logs Dump [#logs-dump] If you're comfortable sharing logs (and it doesn't violate your privacy), you can enable DEBUG mode at startup: 1. Restart the app and click DEBUG in the launcher window. 2. Perform the actions that lead to the error. 3. Close the app normally. 4. A window with the collected log file will appear. 5. Send the log to us via Telegram, email to one of the maintainers, or submit to GitHub Issues. General Discussions [#general-discussions] We are encouraging you to share anyhting on our [Github Discussion page](https://github.com/WLJSTeam/wljs-notebook/discussions). Hotline Support [#hotline-support] Join out community: * [Reddit](https://www.reddit.com/r/wljs/) * [Telegram Group](https://t.me/wljs_support) Submit issues through [GitHub](https://github.com/WLJSTeam/wljs-notebook/issues) # Wolfram Language If you're new to the Wolfram Language, we recommend to start with the following resources: Books [#books] > First principle: everything is an expression import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; [**Mathematica Programming: An Advanced Introduction**](/math.pdf) Leonid Shifrin (2008) Despite its title, this book can be considered a general introduction to the Wolfram Language itself, rather than being tied to a specific front end. It is an excellent match for WLJS Notebook as an execution environment. [**An Elementary Introduction to the Wolfram Language 3rd Edition**](https://www.wolfram.com/language/elementary-introduction/3rd-ed/) Stephen Wolfram (202X) * Paper * Online version This is a great for beginners. All examples are written for Wolfram Mathematica, but the majority are compatible with WLJS Notebook. Symbolic programming [#symbolic-programming] > This introduction covers only a fraction of Wolfram Language's extensive built-in functionality. Consider it a starting point for your exploration. Wolfram Language comes with a vast standard library that is well-suited for most problem-solving tasks—similar to what Python or Julia are used for. The complexity of many utility tasks, such as plotting data over a given range, **can be comparable to the simplicity of Microsoft Excel**.
Wolfram Language is a symbolic programming language, which in essence means: * Code and data are expressions. * Computation is driven by applying rules. * What you see is just one form of interpretation. Introduction [#introduction] Let's explore the fundamental concepts with practical examples. Pattern Matching and Transformation Rules [#pattern-matching-and-transformation-rules] Pattern matching is at the heart of Wolfram Language. Let's start with a simple example: ``` {1,1,2,2,2,2} /. {2 -> 1, 1 -> 0} ``` ``` {0,0,1,1,1,1} ``` Integer numbers are atoms of the language on which we can apply transformation rules. We can also use more general patterns: ``` {0,0,1,1,1,1} /. {any_Integer :> any / 2} ``` ``` {0,0,(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)} ``` **Any output expression is editable and can be reevaluated.** Advanced Pattern Matching [#advanced-pattern-matching] Pattern matching can use conditions and more complex structures: ``` {0,0,(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)} /. {any_?NumericQ :> {RGBColor[any, 1-any, 1], any} } ``` ``` {{(*VB[*)(RGBColor[0, 1, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxQAGU8cEezgAAAxwUjA=="*)(*]VB*),0},{(*VB[*)(RGBColor[0, 1, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxQAGU8cEezgAAAxwUjA=="*)(*]VB*),0},{(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)},{(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)},{(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)},{(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*),(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)}} ``` As you can see, Wolfram Language does not distinguish between data types. Colors, numbers, functions—they are all just symbolic expressions. You can also format output for readability: ``` % // Transpose // TableForm ``` ``` (*GB[*){{(*VB[*)(RGBColor[0, 1, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxQAGU8cEezgAAAxwUjA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[0, 1, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxQAGU8cEezgAAAxwUjA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1/2, 1/2, 1])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEDe3TGB3sAGJkVmw=="*)(*]VB*)}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)(*|*),(*|*)(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)(*|*),(*|*)(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)(*|*),(*|*)(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)}}(*]GB*) ``` Assignment: Set vs SetDelayed [#assignment-set-vs-setdelayed] Understanding the difference between immediate (`=`) and delayed (`:=`) assignment is crucial: ``` (* Immediate assignment (Set) - evaluates right side immediately *) x = RandomReal[] (* x is now a specific number, e.g., 0.742891 *) x (* Returns the same value every time *) x (* Still the same value *) (* Delayed assignment (SetDelayed) - evaluates right side each time *) y := RandomReal[] (* y generates a new random number each time it's called *) y (* Returns 0.123456 *) y (* Returns 0.789012 - different value! *) ``` Practical example showing when to use each: ``` (* Use = when you want to compute once and cache *) expensiveResult = Factor[x^100 - 1] (* Result is computed once and stored *) (* Use := when you want fresh evaluation each time *) currentTime := Now (* Evaluates Now each time you call currentTime *) (* Common pattern: memoization *) fib[n_] := fib[n] = fib[n-1] + fib[n-2] fib[0] = 0 fib[1] = 1 (* Computes once, then caches using immediate assignment *) ``` Using `=` instead of `:=` in function definitions can lead to unexpected behavior: ``` (* Wrong - evaluates pattern immediately *) f[x_] = x^2 (* x_ is evaluated at definition time! *) (* Correct - delays evaluation until function is called *) f[x_] := x^2 ``` Functions and Functional Programming [#functions-and-functional-programming] Wolfram Language treats functions as first-class citizens. There are several ways to define functions: **Pattern-based functions** (most common and powerful): ``` (* Basic pattern matching *) f[x_] := x^2 + 2*x + 1 (* Multiple arguments *) area[width_, height_] := width * height (* Pattern with type restriction *) squareRoot[x_?Positive] := Sqrt[x] squareRoot[x_?Negative] := I * Sqrt[-x] (* Multiple definitions (pattern matching) *) factorial[0] = 1 factorial[n_Integer?Positive] := n * factorial[n - 1] (* Conditions with /; *) absoluteValue[x_] := x /; x >= 0 absoluteValue[x_] := -x /; x < 0 ``` **Pure (anonymous) functions**: > great for quick operations, since it can take advantage of JIT when applied using `Map`, `Table` and etc ``` (* Single argument with # *) #^2 + 2*# + 1 & (* Multiple arguments with #1, #2, etc. *) (#1 + #2)/#3 & (* Named slots (more readable) *) Function[{x}, x^2 + 2*x + 1] Function[{x, y}, x^2 + y^2] (* Apply to data *) {1, 2, 3, 4} // Map[#^2 &] ``` ``` {1, 4, 9, 16} ``` **When to use each:** * Pattern-based: Named functions, recursion, multiple dispatch, complex conditions * Anonymous: One-off transformations, quick and simple operations in `Map`/`Select`/etc. ``` (* Pattern-based for named, reusable functions *) distance[{x1_, y1_}, {x2_, y2_}] := Sqrt[(x2-x1)^2 + (y2-y1)^2] (* Anonymous for inline transformations *) data = {{1, 2}, {3, 4}, {5, 6}} data // Map[{#[[1]], #[[2]]^2} &] ``` Use functional operators to process data elegantly: ``` (* Select even numbers *) Range[20] // Select[EvenQ] (* Chain multiple operations *) Range[100] // Select[PrimeQ] // Take[#, 5] & ``` ``` {2, 3, 5, 7, 11} ``` Nest and fold operations for iterative computations: ``` (* Apply function repeatedly *) Nest[# + 1 &, 0, 5] (* Accumulate results *) FoldList[Plus, 0, {1, 2, 3, 4, 5}] ``` ``` {0, 1, 3, 6, 10, 15} ``` Symbolic Mathematics [#symbolic-mathematics] Work with algebraic expressions symbolically: ``` (* Expand polynomial *) Expand[(x + y)^3] (* Factor expression *) Factor[x^2 - y^2] ``` **Simplification** is one of the most powerful features: ``` (* Basic simplification *) Simplify[(x^2 - 1)/(x - 1)] ``` ``` x + 1 ``` ``` (* Trigonometric simplification *) Simplify[Sin[x]^2 + Cos[x]^2] (* Returns: 1 *) (* Complex expressions *) Simplify[Sqrt[x^2]] (* Returns: Sqrt[x^2] - needs assumptions! *) (* With assumptions *) Simplify[Sqrt[x^2], Assumptions -> x > 0] (* Returns: x *) Simplify[Sqrt[x^2], Assumptions -> x < 0] (* Returns: -x *) ``` Different simplification strategies: ``` (* FullSimplify - tries harder, slower *) FullSimplify[(x^3 - 1)/(x - 1)] (* Returns: 1 + x + x^2 *) (* Simplify with specific form *) Simplify[Sin[2*x], ComplexityFunction -> LeafCount] (* ExpToTrig and TrigToExp conversions *) ExpToTrig[Exp[I*x]] (* Returns: Cos[x] + I*Sin[x] *) TrigToExp[Sin[x]] (* Returns: -I/2*(E^(I*x) - E^(-I*x)) *) ``` Common assumptions: ``` (* Element specifications *) Simplify[Sqrt[x^2], Assumptions -> Element[x, Reals]] Simplify[Abs[x*y], Assumptions -> {x > 0, y > 0}] (* Global assumptions with $Assumptions *) $Assumptions = {x ∈ Reals, x > 0, y ∈ Reals} Simplify[Sqrt[x^2] + Sqrt[y^2]] ``` Solve equations symbolically: ``` (* Solve quadratic equation *) Solve[a*x^2 + b*x + c == 0, x] (* System of equations *) Solve[{x + y == 5, x - y == 1}, {x, y}] ``` ``` {{x -> 3, y -> 2}} ``` Calculus operations work symbolically too: ``` (* Differentiation *) D[x^3 + Sin[x], x] (* Integration *) Integrate[x^2 * Exp[-x], x] (* Limits *) Limit[Sin[x]/x, x -> 0] ``` ``` 3 ((*SpB[*)Power[x(*|*),(*|*)2](*]SpB*))+Cos[x] ``` ``` ((*SpB[*)Power[E(*|*),(*|*)-x](*]SpB*)) (-2-2 x-(*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)) ``` ``` 1 ``` Nested Structures and List Manipulation [#nested-structures-and-list-manipulation] Wolfram Language excels at manipulating nested structures: ``` (* Create nested data *) data = Table[{i, i^2, i^3}, {i, 5}] (* Extract parts *) data[[All, 2]] (* All second elements *) (* Apply function at specific level *) Map[Total, data, {1}] ``` ``` {6, 14, 36, 84, 180} ``` Thread operations across lists: ``` (* Thread operations *) Thread[f[{a, b, c}, {x, y, z}]] (* Partition data *) Partition[Range[12], 3] ``` ``` {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}} ``` Transpose and reshape operations: ``` (* Transpose matrix *) {{1, 2, 3}, {4, 5, 6}} // Transpose (* Flatten nested lists *) Flatten[{{1, 2}, {3, {4, 5}}}] ``` ``` {1, 2, 3, 4, 5} ``` Association (Key-Value Pairs) [#association-key-value-pairs] Modern dictionary-like structures: ``` (* Create association *) person = <|"name" -> "Alice", "age" -> 30, "city" -> "NYC"|> (* Access values *) person["name"] (* Map over associations *) person // Map[ToString] (* Merge multiple associations *) Merge[{<|"a" -> 1, "b" -> 2|>, <|"b" -> 3, "c" -> 4|>}, Total] ``` ``` <|"a" -> 1, "b" -> 5, "c" -> 4|> ``` String Manipulation [#string-manipulation] Powerful string processing with patterns: ``` (* String patterns *) StringCases["hello world 123", DigitCharacter..] (* String replacement *) StringReplace["hello world", "world" -> "universe"] (* Template strings *) TemplateApply["Hello \`name\`, you are \`age\` years old", <|"name" -> "Bob", "age" -> 25|>] ``` ``` "Hello Bob, you are 25 years old" ``` Data Visualization [#data-visualization] More complex styling: ``` Table[If[PrimeQ[i], Framed[i, Background -> Yellow], i], {i, 1, 20}] ``` ``` {1,(*BB[*)(2)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),(*BB[*)(3)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),4,(*BB[*)(5)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),6,(*BB[*)(7)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),8,9,10,(*BB[*)(11)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),12,(*BB[*)(13)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),14,15,16,(*BB[*)(17)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),18,(*BB[*)(19)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHArSsxNdcqvgIiA5INKc1KLuYAMp8Tk7PSi/NK8lDRmmPIgdyfn/Jz8okyQcRACiBnQdPMAGcElRZkF/nmeeQWlJcWsIJsSc4pTAcQ1Hcg="*)(*]BB*),20} ``` This uses pattern matching with `If` and `PrimeQ` to conditionally style elements. Graphics as Expressions [#graphics-as-expressions] ``` Plot[x, {x, 0, 1}, PlotStyle -> RGBColor[1/2, 1/2, 1]] ``` ``` (*VB[*)(FrontEndRef["d84a4b36-b420-4018-b1af-3bd020935a4f"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp1iYJJokGZvpJpkYGeiaGBha6CYZJqbpGielGBgZWBqbJpqkAQB+qBVZ"*)(*]VB*) ``` This creates an interactive graphic that renders as a line plot. It may look like an image, but it's not—it's a symbolic expression that can be manipulated, styled, and transformed. Everything is a set of Wolfram expressions decorated with rendering metadata. Underneath, it’s still real code. Most symbols are abstract representations that can be interpreted in many ways. Have a look at 3D graphics: ``` Graphics3D[Sphere[]] ``` ``` (*VB[*)(Graphics3D[{RGBColor[1, 0, 1], Sphere[{0, 0, 0}]}, ImageSize -> 200])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4XkHAvSizIyEwuNnaBiIFU+GQWl6Qxg3gcQCLI3ck5Pye/KBNkQiYDiACxIAayAYnggozUolSIBph2iDo4gTA7qDQntZgTyPDMTUxPDc6sSs08AeQBAJxmHk0="*)(*]VB*) ``` This creates an interactive 3D sphere that you can rotate, zoom, and manipulate in real-time. The output is not a static image but a live 3D graphic object. **It’s all about interpretation.** Let's replace our 3D object with `Cuboid` inline: ``` (*VB[*)(Graphics3D[{RGBColor[1, 0, 1], Sphere[{0, 0, 0}]}, ImageSize -> 200])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4XkHAvSizIyEwuNnaBiIFU+GQWl6Qxg3gcQCLI3ck5Pye/KBNkQiYDiACxIAayAYnggozUolSIBph2iDo4gTA7qDQntZgTyPDMTUxPDc6sSs08AeQBAJxmHk0="*)(*]VB*)/. {Sphere -> Cuboid} ``` ``` (*VB[*)(Graphics3D[{RGBColor[1, 0, 1], Cuboid[{0, 0, 0}]}, ImageSize -> 200])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4XkHAvSizIyEwuNnaBiIFU+GQWl6Qxg3gcQCLI3ck5Pye/KBNkQiYDiACxIAayAQnn0qT8zBSIBph2iDo4gTA7qDQntZgTyPDMTUxPDc6sSs08AeQBAJf0Hjw="*)(*]VB*) ``` Nothing stops us from taking the same primitives and use them in actual calculations: ``` Cuboid[{a,b,c}] // Volume Sphere[{a,b,c}, R] // Area ``` ``` 1 ``` ``` 4 \\[Pi] ((*SpB[*)Power[R(*|*),(*|*)2](*]SpB*)) ``` Scientific Computing [#scientific-computing] Data Visualization and Plotting [#data-visualization-and-plotting] Create publication-quality plots with minimal effort: ``` (* Multiple functions on one plot *) Plot[{Sin[x], Cos[x], Sin[x]*Cos[x]}, {x, 0, 2*Pi}, PlotLegends -> "Expressions", PlotStyle -> {Red, Blue, Green}] (* Logarithmic plots *) LogPlot[Exp[x], {x, 0, 10}] (* Parametric plots *) ParametricPlot[{Sin[t], Cos[2*t]}, {t, 0, 2*Pi}] ``` ``` (*VB[*)(Legended[ToExpression[FrontEndRef["60812485-07b1-4866-b42b-0fd535a9f66a"], InputForm], Placed[LineLegend[{Directive[Opacity[1.], AbsoluteThickness[2], RGBColor[1, 0, 0]], Directive[Opacity[1.], AbsoluteThickness[2], RGBColor[0, 0, 1]], Directive[Opacity[1.], AbsoluteThickness[2], RGBColor[0, 1, 0]]}, {HoldForm[Sin[HoldForm[x]]], HoldForm[Cos[HoldForm[x]]], HoldForm[Sin[HoldForm[x]]*Cos[HoldForm[x]]]}, LegendMarkers -> None, LabelStyle -> {}, LegendLayout -> "Column"], After, Identity]])(*,*)(*"1:eJy9U8tOAjEUHRTxEV3oH5i4nWRAGHFlkIeaoBiGuG+nt9pQWtN2kPlrP8E+AgmYaFjoLE5mzj2357S9c47lmO5GUaRPLLww+OhBLhUyUmX7lhnCKwjSoDtOcmShT5itOSGtOO7MwkBJYfqC9BeQFwZhDtmFpdOkXW802604ucL1uNlO0xg3GzhOKGldttA1TVMUFq5aGBe27cC9ACIjwUvPTlQBIV/NwjNHORC6twwzZAJCwqCpek6b8HVooccU5IbNIaR1Wxq9o5yZUkX++bwJlVMLHawlLwxM3lg+FaA1c+nCYj7Z3W1XcqmY62DREv7abWXkff/FbbXBjXOtLOX3kpOBVLPAOFHGxPeydszip7au1Fu0+Wlx1z9hM9BbmP9mtTaG/l8Ic/WI1BSU9qUnKWBD6IcQYeCZKTnQaO2w1qXHqzWHqJSFyWo+Ei9mwu+oQ401ctEeCAhjb/EL38fJaA=="*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["96899d5e-ccc5-48e4-b96c-47c912209504"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW5pZWFqmmKbqJicnm+qaWKSa6CZZmiXrmpgnWxoaGRlYmhqYAACEGxUv"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["dfb7c2f7-abd1-4681-820f-303a0eba4ed1"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp6QlmScbpZnrJialGOqamFkY6loYGaTpGhsYJxqkJiWapKYYAgCRXRYg"*)(*]VB*) ``` Create different chart types for data analysis: ``` (* Generate sample data *) data = Table[{i, RandomReal[{0, 10}]}, {i, 20}]; data // TableView (* Bar chart *) BarChart[data[[All, 2]], ChartLabels -> data[[All, 1]]] (* Histogram *) Histogram[RandomVariate[NormalDistribution[0, 1], 1000], 30] ``` ``` (*VB[*)(FrontEndRef["0ccf1fbd-253a-40c9-a511-506ea6e50685"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGyQnpxmmJaXoGpkaJ+qaGCRb6iaaGhrqmhqYpSaapQIpC1MAjRgVkw=="*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["7cf5ac85-ca64-4628-b764-83d7b4a53afb"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmyenmSYmW5jqJieameiamBlZ6CaZA1kWxinmSSaJpsaJaUkAh+sV3A=="*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["9246c81e-1aa0-4103-b8c2-ff1299427d79"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWxqZmCVbGKbqGiYmGuiaGBoY6yZZJBvppqUZGllamhiZp5hbAgB6WBUV"*)(*]VB*) ``` 3D visualization: ``` (* 3D surface plot *) Plot3D[Sin[x] Cos[y], {x, -3, 3}, {y, -3, 3}, PlotStyle -> Opacity[0.8\`], Mesh -> None, ColorFunction -> "Rainbow"] (* Contour plot *) ContourPlot[(*SpB[*)Power[x(*|*),(*|*)2](*]SpB*) + (*SpB[*)Power[y(*|*),(*|*)2](*]SpB*), {x, -2, 2}, {y, -2, 2}, Contours -> 15, ColorFunction -> "Rainbow"] (* Density plot *) DensityPlot[Sin[x y], {x, -2, 2}, {y, -2, 2}] ``` ``` (*VB[*)(FrontEndRef["4c65d609-37e9-42ea-ac16-62ca67291a54"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmySbmaaYGVjqGpunWuqaGKUm6iYmG5rpmhklJ5qZG1kaJpqaAAB+4hVG"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["e23aba53-6182-44f1-99af-3600ee90f655"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKpxoZJyYlmhrrmhlaGOmamKQZ6lpaJqbpGpsZGKSmWhqkmZmaAgCAEBVE"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["19975dd7-de5d-42e4-badd-5152ee31a8cb"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG1pampumpJjrpqSapuiaGKWa6CYlpqTomhqaGqWmGhsmWiQnAQCKFxY2"*)(*]VB*) ``` Dataset - Structured Data Handling [#dataset---structured-data-handling] Dataset provides a powerful way to work with structured data: ``` (* Create dataset from associations *) ds = Dataset[{ <|"name" -> "Alice", "age" -> 25, "score" -> 92|>, <|"name" -> "Bob", "age" -> 30, "score" -> 87|>, <|"name" -> "Charlie", "age" -> 22, "score" -> 95|>, <|"name" -> "Diana", "age" -> 28, "score" -> 89|> }] (* Query operations *) ds[All, "name"] (* Get all names *) ds[Select[#age > 25 &]] (* Filter by condition *) ds[All, <|"name" -> "name", "grade" -> (#score/100 &)|>] (* Transform *) (* Statistical operations *) ds[Mean, "score"] ``` ``` (*VB[*)(FrontEndRef["f69bcbbe-75a5-4719-97fd-fd4a481084b2"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp5lZJiUnJaXqmpsmmuqamBta6lqap6XopqWYJJpYGBpYmCQZAQCRTxXj"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["697df6d5-91c9-4d41-9cac-eb636820bcfb"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm1map6SZpZjqWhomW+qapJgY6lomJybrpiaZGZtZGBkkJaclAQCGwRYS"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["b1696cb6-2305-4953-8f13-a06f770f7dd6"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJxmaWZolJ5npGhkbmOqaWJoa61qkGRrrJhqYpZmbG6SZp6SYAQB2nRUd"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["33e04317-a0f7-4ae1-b124-a75865176611"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGxunGpgYG5rrJhqkmeuaJKYa6iYZGpnoJpqbWpiZGpqbmRkaAgB28hSl"*)(*]VB*) ``` ``` (*FB[*)((363)(*,*)/(*,*)(4))(*]FB*) ``` Work with hierarchical data: ``` (* Nested dataset *) experiments = Dataset[{ <|"date" -> "2024-01-01", "measurements" -> {12.5, 13.1, 12.9}|>, <|"date" -> "2024-01-02", "measurements" -> {15.2, 14.8, 15.0}|> }] (* Query nested values *) experiments[All, "measurements"] Mean /@ experiments[All, "measurements"] ``` ``` (*VB[*)(FrontEndRef["58dd6536-c6c8-4d8c-9c6e-21baf47f98a3"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm1qkpJiZGpvpJpslW+iapFgk61omm6XqGhkmJaaZmKdZWiQaAwCHMhXs"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["c199aebf-5d73-4f4d-a558-2fd320ce6aa0"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJxtaWiamJqXpmqaYG+uapJmk6CaamlroGqWlGBsZJKeaJSYaAACQRBYw"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["1fbdca0d-c55d-4438-be63-2bbf846250c7"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKG6YlpSQnGqToJpuapuiamBhb6CalmhnrGiUlpVmYmBmZGiSbAwCURhX7"*)(*]VB*) ``` Statistical Analysis [#statistical-analysis] Built-in statistical functions for data analysis: ``` (* Generate sample data *) data = RandomVariate[NormalDistribution[100, 15], 200]; (* Descriptive statistics *) Mean[data] Median[data] StandardDeviation[data] Quartiles[data] (* Distribution fitting *) dist = EstimatedDistribution[data, NormalDistribution[μ, σ]] (* Hypothesis testing *) TTest[data, 100] (* Correlation analysis *) data2 = RandomVariate[NormalDistribution[50, 10], 200]; Correlation[data, data2] ``` ``` 102.27687181157289\` ``` ``` 102.95485075612231\` ``` ``` 14.218033684585553\` ``` ``` {93.1823825265459\`,102.95485075612231\`,111.71599949332989\`} ``` ``` NormalDistribution[102.27687181157289\`,14.182444057592095\`] ``` ``` 0.024607704936242588\` ``` ``` -0.14549160118041676\` ``` Create statistical visualizations: ``` (* Distribution comparison *) SmoothHistogram[{data, data2}, PlotLegends -> {"A", "B"}] (* Quantile-Quantile plot *) QuantilePlot[data, NormalDistribution[100, 15]] ``` ``` (*VB[*)(Legended[ToExpression[FrontEndRef["622665a6-5078-4839-baac-50239f9f9bf3"], InputForm], Placed[LineLegend[{Directive[RGBColor[0.24, 0.6, 0.8], AbsoluteThickness[2]], Directive[RGBColor[0.95, 0.627, 0.1425], AbsoluteThickness[2]]}, {"A", "B"}, LegendMarkers -> {{False, Automatic}, {False, Automatic}}, Joined -> {True, True}, LabelStyle -> {}, LegendLayout -> "Column"], After, Identity]])(*,*)(*"1:eJyVUU1Kw0AUjv9aFNQDCILbgiQ2tosSUltFSVGb4n6SvNGhaUZmJmoO4CF0684TdO0BXLjxALoRQfAGzkxsS6WL+gIf817efPO9720GtIVnDMPgKxLOCFzXIaQMCcr8BVnx4BySyMTTqqUgoRER+U814ilVW5ewz2giGknUuIEwFSiIwd+SZds0bbuE7GJpe7dc3ClblWKAUChT06pg+QXYyolnJbRSeW1RHQBFx0mc6WqbpZDrm5dwEqMQIjzfF+ORBHKFQx6PcJFnSxLqhEEoyNUvieY/qO3RmDLW27j9PO09O8zS8eaw+zsVH04+2poEN+A0TgW0L0jYSYBzoqgn48c6vhz2+P3SDFbfHVYtvD5cVp8m5O9P46tuV2Nt1C+9tNyAJmIdYHycD/2Mz6ldoZiDlu6mgnaRIOF/u/TLagdHVPr/x/rB1obrG72o94YCiH2RxYCN8Xp16/JgOg9lNBW+elR6m3YTrdLFQo6sPD+MIBFEZD9BTLPK"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["3b3977a6-691a-4eab-8586-dd50ca951e84"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGycZW5qbJ5rpmlkaJuqapCYm6VqYWpjppqSYGiQnWpoaplqYAACAERWC"*)(*]VB*) ``` Curve Fitting and Regression [#curve-fitting-and-regression] Fit the data using linear function: ``` (* Generate noisy data *) dataPoints = Table[{x, Exp[x .5] + 3 + .01 RandomReal[{-1, 1}]}, {x, 0, 10, 0.5}]; (* Linear fit *) ClearAll[x]; fit = LinearModelFit[dataPoints, x,x] fit["BestFit"] fit["RSquared"] Show[ ListPlot[dataPoints, PlotStyle -> Red], Plot[fit["BestFit"], {x, 0, 10}, PlotStyle -> Blue] ] ``` ``` FittedModel[(*VB[*) <|"Type" -> "Linear", "Model" -> <|"FittedParameters" -> {-22.340701277732325, 11.42455897723819}, "IndependentVariables" -> {x}, "BasisFunctions" -> {1, x}, "LinearOffset" -> <|"Function" -> 0, "Values" -> 0|>|>, "KeyNames" -> Automatic, "Weights" -> <|"ExampleWeights" -> 1.|>, "InputData" -> {{0., 3.9944783541855604}, {0.5, 4.276560670456315}, {1., 4.6416389294081295}, {1.5, 5.1193500548442525}, {2., 5.7268102436014345}, {2.5, 6.487238852433291}, {3., 7.484497703920415}, {3.5, 8.76095263344181}, {4., 10.38137028451088}, {4.5, 12.491007141402267}, {5., 15.187531342151104}, {5.5, 18.6358120609378}, {6., 23.080607635491926}, {6.5, 28.79612798722989}, {7., 36.12124008219325}, {7.5, 45.524489811191465}, {8., 57.596584594168334}, {8.5, 73.1018185390817}, {9., 93.01931070962853}, {9.5, 118.57567538543263}, {10., 151.42086276192015}}, "UserDefinedDesignMatrixQ" -> False, "DesignMatrix" -> {{1., 0.}, {1., 0.5}, {1., 1.}, {1., 1.5}, {1., 2.}, {1., 2.5}, {1., 3.}, {1., 3.5}, {1., 4.}, {1., 4.5}, {1., 5.}, {1., 5.5}, {1., 6.}, {1., 6.5}, {1., 7.}, {1., 7.5}, {1., 8.}, {1., 8.5}, {1., 9.}, {1., 9.5}, {1., 10.}}, "Localizer" -> Function[Null, FittedModels\`LocalizedBlock[{x}, #1], {HoldAll}], "Options" -> {}|> (*,*)(*"1:eJxVj70LwjAQxesXqIuj4ObgqDRpa3RUVBREodXORnOVQppAmqL+9yatoC4/7r13vOOGVxkmDcdx8oHBUj43UmWXhVJU3IFFRZZR9TJ2UrM7PYONkkKvBYtTpQvKq6BpsJWclcNBCvja+zTXSd2q/s+FT/NOQxan8IhM5FRbXYM1S7VUNvivr1TH4BzuV3CTDCJk1Bjjiee7xEWYEOJhDwejqTvCS4QmPvaDYDYnBHszNC9t91mdsrVhwSFq2wEoOwr+Kt2TKiBv2W8pz+ENrqNFIw=="*)(*]VB*)] ``` ``` -22.340701277732325\`+11.42455897723819\` x ``` ``` 0.7226700984087944\` ``` ``` (*VB[*)(FrontEndRef["529d8816-8702-4588-af7d-ae05625dfdcc"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmxpZplhYGJrpWpgbGOmamFpY6CammafoJqYamJoZmaakpSQnAwBzlhWG"*)(*]VB*) ``` Fit the data using poly function: ``` (* Polynomial fit *) polyFit = Fit[dataPoints, {1, x, (*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)}, x] (* Visualize fit *) Show[ ListPlot[dataPoints, PlotStyle -> Red], Plot[polyFit, {x, 0, 10}, PlotStyle -> Blue] ] ``` ``` 15.982581848811188\` -12.77961983952612\` x+2.420417881676431\` ((*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)) ``` ``` (*VB[*)(FrontEndRef["d4846954-800f-4676-ac14-0f508cb2d85d"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp5hYmJhZmproWhgYpOmamJmb6SYmG5roGqSZGlgkJxmlWJimAABzdhUc"*)(*]VB*) ``` Fit the data using a non-linear model: ``` (* Non-linear fit *) nlFit = NonlinearModelFit[dataPoints, a*Exp[b*x]+c, {a,b,c}, x] (* Visualize fit *) Show[ Plot[nlFit[x], {x, 0, 10}, PlotStyle -> Blue], ListPlot[dataPoints, PlotStyle -> Red] ] ``` ``` FittedModel[(*VB[*) <|"Type" -> "Nonlinear", "Model" -> <|"FittedParameterRules" -> {a -> 1.0000803176514326, b -> 0.49999316340911115, c -> 2.999099132627918}, "IndependentVariables" -> {x}, "FitExpression" -> c + a*E^(b*x), "ParameterConstraints" -> True|>, "KeyNames" -> Automatic, "Weights" -> <|"ExampleWeights" -> 1|>, "InputData" -> {{0., 3.9944783541855604}, {0.5, 4.276560670456315}, {1., 4.6416389294081295}, {1.5, 5.1193500548442525}, {2., 5.7268102436014345}, {2.5, 6.487238852433291}, {3., 7.484497703920415}, {3.5, 8.76095263344181}, {4., 10.38137028451088}, {4.5, 12.491007141402267}, {5., 15.187531342151104}, {5.5, 18.6358120609378}, {6., 23.080607635491926}, {6.5, 28.79612798722989}, {7., 36.12124008219325}, {7.5, 45.524489811191465}, {8., 57.596584594168334}, {8.5, 73.1018185390817}, {9., 93.01931070962853}, {9.5, 118.57567538543263}, {10., 151.42086276192015}}, "Localizer" -> Function[Null, FittedModels\`LocalizedBlock[{a, b, c, x}, #1], {HoldAll}], "Options" -> {}|> (*,*)(*"1:eJxdUE1LxDAQrV+gXjwK3jzkWpL0M8fttssKi0qre7aaqRTaRtKW3f09/lEnTcWPMDzmvTe8YXL7qvLqxHGc/gYhUfuV0u3LQuuyewdZjG1b6gPK1ZGZuUJYadUNWSe3tR7GsrHGKcJaNXJq7lUHP/Km7ofq2LDrXxvm5LsB2m0NuwItx05dImSyHpQ2xt94yy4QnvNNCm9KQvGJjLtCCCoE83jII8FiElLCsRLmUnwx9VgUBsxH/9uKp1oUHwkJEmwIF49qBxpZZi0SLa1O+PKfQl0fNwqPhZ5PBcMX2Nw9CdJ5NkhN9hwg7HHmkHxsoDg3DZTyoWsOk/qkR+jPzP+WTQ9fEOBd3Q=="*)(*]VB*)] ``` ``` (*VB[*)(FrontEndRef["ba1db508-dea5-43af-b074-d81cc4eceac0"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyUapiSZGljopqQmmuqaGCem6SYZmJvoplgYJiebpCanJiYbAACVWhas"*)(*]VB*) ``` Differential Equations (for Physicists) [#differential-equations-for-physicists] Solve differential equations symbolically: ``` (* Symbolic solution - simple harmonic oscillator *) DSolve[y''[t] + (*SpB[*)Power[ω(*|*),(*|*)2](*]SpB*)*y[t] == 0, y[t], t] (* Numerical solution - damped oscillator *) sol = NDSolve[{ y''[t] + 0.5*y'[t] + 2*y[t] == 0, y[0] == 1, y'[0] == 0 }, y, {t, 0, 20}] Plot[Evaluate[y[t] /. sol], {t, 0, 20}, PlotLabel -> "Damped Oscillation"] ``` ``` {{y[t]->(*SbB[*)Subscript[C(*|*),(*|*)1](*]SbB*) Cos[t \\[Omega]]+(*SbB[*)Subscript[C(*|*),(*|*)2](*]SbB*) Sin[t \\[Omega]]}} ``` ``` {{y->(*VB[*)BoxForm\`temporalStorage$3296555(*,*)(*"1:eJxdkc2SmkAAhM1fVSpPkexJIVXKooukKgdZBmRQEIc/2drDOAwiICAMis+Ul4zmmMtX3V196v6xr7bJp8Fg0H67A8RHVjX+kV7Rnw+DgVEy2tRVgdmxPGhdSdixKt+GnK+8caPvQ+4nNxpyT8IvCm+x5wmrXl04jc8fjENKFTA35SKrBYavIuuZNg80dO6oG3W1YsEcbTfxOIntzEynQeWm62RziujOsgPmCcFEd9wFMbK+kskuapcw7SBUGe9heD24LLrW4n5MMBALU1KxnIm++YLuisycOq2hN0mDvQ6EtMGvZrbJ0S6agA5FFqhgqHv5Ga/6BmkYIEy8880yvOBiWCxV8yQzeTt5EeWgjMtqOT7NNemyO8rhhoY3nqFG7oHZVyJyO8XqwpOIMiWREJj7yZoEbXCIc6pFhrENp9uQROkazHhnaW+W7nPYqyvaLdraNH2cSKb93EJpNanPmpXIAqUKgW3peDkQYHeZ6uWehMKivyq8oM8i15mwmSqcX/ml1C+QriQt+f302P/dV7jRe/Lx8eHnO7ZdQdHXh6A4tsvi9i91m47+13kcjmhBCcP7grZf7lbDRUv/AtcSpIE="*)(*]VB*)}} ``` ``` (*VB[*)(FrontEndRef["751d680f-41ab-4dac-812d-e65f92fd6117"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5sapphZGKTpmhgmJumapCQm61oYGqXoppqZplkapaWYGRqaAwCD4RWl"*)(*]VB*) ``` and numerically: ``` (* System of ODEs - Lotka-Volterra *) lotka = NDSolve[{ x'[t] == x[t] - x[t]*y[t], y'[t] == -y[t] + x[t]*y[t], x[0] == 1, y[0] == 0.5 }, {x, y}, {t, 0, 20}] ParametricPlot[Evaluate[{x[t], y[t]} /. lotka], {t, 0, 20}, AxesLabel -> {"Prey", "Predator"}] ``` ``` {{x->(*VB[*)BoxForm\`temporalStorage$3296921(*,*)(*"1:eJxdkcmOm1AQRZ1JivIVSa9sHAnbGIgj9YKxDcYDM6bVC3jvNQYeYCYz/FJ+MnaW2RxVXZWuSvf+CAvj/dNkMqm/3SHBuCkqJ0ad+efDZKLkDaquBQ6aOI/kNgdNXOSvU8LhX4nZ9ynxk5hNiaflb6QO0LaXWi9yuhduOMMQfgnq2mY12TxX0AkZ9m570QPojovVubxYhp9igyLZhaUMJZIzeT1qPZ15WLSyq9O0bbIASS2NfbGBfk/vPQDTMoD1fplEURYkstPmc3p5qdIdqZbM9qabjBYeAkAr6qVU3UWLQpbzK14XmP4Yu+vEqWFyPkpynZT7lJKAXu+7kwJS33NFxvRcqpayLujGJUbb28afV2E7rsQNNZfpxh421smzBqaJK9jhgcIZzoEQgtuhxUiYr2J5vcuAfyiuCX1e7xYRliF/Tm3At5lEmslR21pjrr+4NIwBp+384J3d7REQXa93xTwiV7dhpPI02VoRxx8Gs5yPasgKPfdCMgmsua6WTwpqbKsnkSLSQUMa3PPz0yP/N4cnZm/vHx8dfr7DuL9kfn0MKIDHHA//VKtq0X83j8JNhBFoghCj+st9lQNco7+krKc+"*)(*]VB*),y->(*VB[*)BoxForm\`temporalStorage$3297056(*,*)(*"1:eJxdkUmzmkAAhM1WlcqvSN7JBzm4IqYqB0BGZHEblsFX78AyI+AICoOAfyl/MppjLl91d/Wp+0dY7MmnXq9XfXtAjVNWlG6KG/jnQ6+3yhkuLwUNWJofQZ1HLC3ytz7nym/c6/c+95N77XMvw19Y72LHGZrtQtqhcC7t94qo6BNnZmrQLWs6Zi0DogfgtcY5PNhGYOunKxR4no89oLVMyhY+H647sQkjGpQVO0WZE55PG1m+zrC36kSPUQTXoK4jZ9U4UX0YsLGZxf4RTQEiMZZRosXhIlurEbCMEb13xKIVmypmKAl6W9xO92yp3w4LuZZJ4m3Pw7u3JInUwE01SNnqpCVtpYpt6E/IlV+ToBy7Y1DecsD4EuELvRZrD13EjZCPlNyMvQBGvm3SKRuUTREXGVbKfGmboEK6hqOzuiqzpi1UZAdWAm3D0O5zao/wJIaOYgp7n4TGtq7IEMnBHBF7dOsm29yqCuvYqIFaeqLnjsaAl6xtos38A/WN5W4uHGlai0gTdoC01u+X5/7vrsy9vpOPzw8/P7CvKYZfnwIH8San3b/ULmv8X+d5OMQURywIKa6+PCwIaIX/Aun0qD8="*)(*]VB*)}} ``` ``` (*VB[*)(FrontEndRef["5406a008-bab4-4b87-a633-13152a92071f"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5oYmCUaGFjoJiUmmeiaJFmY6yaaGRvrGhobmholWhoZmBumAQB2oxTM"*)(*]VB*) ``` Partial differential equations: ``` (* Heat equation *) sol = NDSolve[{ D[u[t, x], t] == D[u[t, x], {x, 2}], u[0, x] == Exp[-(*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)], u[t, -5] == 0, u[t, 5] == 0 }, u, {t, 0, 1}, {x, -5, 5}] Plot3D[Evaluate[u[t, x] /. sol], {t, 0, 1}, {x, -5, 5}, PlotLabel -> "Heat Diffusion", ColorFunction->"Temperature"] ``` ``` {{u->(*VB[*)BoxForm\`temporalStorage$3302102(*,*)(*"1:eJxdkkuTmkAAhM2rKpVfkexJMVUsILikag8gL4kCiozK1h5gGBCZBRaG51/Ln4vmmEtXd1ffvv4RFvv402Qyqb/dRI1SUlQgRZ3758Nkss4JqsoCByTNE63JIUmL/GVKAfmFmn2fUj+p2ZR6YH4hc4iySNx0o7Tr57D1ZFU9dW6s2f21BGEYVjwhmdV7eg58ljb3O5NsiekRmkbDWNILa7vrrhHHMWPjpFruMex6BELL9IPryJW4ueZDrAcYFNwZJjA3V1vRYMmh7QRLio96q4+VXg+rcGNcgoJf99m5ehve0OjrjPZ+BriJMqmrjkrnXJRHaU2PxYpvIa/TF9NYv6vmaOTI8vahaW193V4uneuJtY4LtGiZ9Ml1YBnbHmYVoKD8FHtzFwaYgWcQaauG49kGmTHJDt0p612fx4mOjdxMNb9bwKOsiTzatDArfRk6TOU/+igqlbm39xoH9pIm1SIgIBUOQqiJ0XVkaj6YMzQrPUF0SVhllXSawEmMPReMQq+6wxJUuPitnRQ28cBF5OhE9TNb9ZLn54c7j1cgU7PX+OOd6eeb7BuM3K93g4LIzvHwrz1UDfpvcz+AizCCJAgxqr/cohbgGv0FKpSrHQ=="*)(*]VB*)}} ``` ``` (*VB[*)(FrontEndRef["d27305c5-d04a-46bc-a897-919a866daedd"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKpxiZGxuYJpvqphiYJOqamCUl6yZaWJrrWhpaJlqYmaUkpqakAAB//RXb"*)(*]VB*) ``` Numerical Methods and Optimization [#numerical-methods-and-optimization] Numerical integration and root finding: ``` (* Numerical integration *) NIntegrate[Sin[x^2], {x, 0, 10}] (* Find roots *) FindRoot[Cos[x] == x, {x, 0}] (* Solve system numerically *) FindRoot[{x^2 + y^2 == 4, x - y == 1}, {x, 1}, {y, 1}] ``` Optimization problems: ``` (* Minimize function *) NMinimize[x^2 + y^2, {x, y}] (* Constrained optimization *) NMinimize[{x^2 + y^2, x + y >= 1}, {x, y}] (* Linear programming *) LinearProgramming[{-1, -2}, {{1, 1}, {2, 1}}, {{5, -1}, {8, -1}}] ``` Units and Quantities (for Physics) [#units-and-quantities-for-physics] Work with physical units: ``` (* Define quantities *) distance = Quantity[100, "Meters"] time = Quantity[9.8, "Seconds"] (* Automatic unit conversion *) velocity = distance/time UnitConvert[velocity, "Miles"/"Hours"] (* Physical constants *) Quantity["SpeedOfLight"] Quantity["PlanckConstant"] Quantity["ElectronMass"] (* Unit conversions *) UnitConvert[Quantity[1, "Joules"], "ElectronVolts"] ``` Physics calculations with units: ``` (* Kinetic energy *) mass = Quantity[2, "Kilograms"] v = Quantity[10, "Meters"/"Seconds"] KE = (1/2)*mass*v^2 UnitConvert[KE, "Joules"] (* Wavelength from energy *) energy = Quantity[2, "ElectronVolts"] h = Quantity["PlanckConstant"] c = Quantity["SpeedOfLight"] wavelength = (h*c)/energy UnitConvert[wavelength, "Nanometers"] ``` Fourier Analysis [#fourier-analysis] Frequency domain analysis: ``` (* Create signal *) signal = Table[Sin[2*Pi*5*t] + 0.5*Sin[2*Pi*10*t], {t, 0, 1, 0.01}]; (* Fourier transform *) ft = Fourier[signal]; (* Power spectrum *) ListLinePlot[Abs[ft][[1;;50]], PlotLabel -> "Frequency Spectrum"] (* Inverse transform *) reconstructed = InverseFourier[ft]; signal - reconstructed // Abs // MinMax ``` ``` (*VB[*)(FrontEndRef["b57456ca-6b0f-4d32-995c-038ecde621ab"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ5mam5iaJSfqmiUZpOmapBgb6VpamibrGhhbpCanpJoZGSYmAQCDhRXR"*)(*]VB*) ``` ``` {6.632532009743195\`*^-17,8.888726048555634\`*^-16} ``` Spectral analysis for time series: ``` (* Generate noisy signal *) noisySignal = signal + RandomReal[{-0.2, 0.2}, Length[signal]]; (* Spectrogram *) Spectrogram[noisySignal, SampleRate -> 100] (* Periodogram *) Periodogram[noisySignal, SampleRate -> 100] ``` ``` (*VB[*)(FrontEndRef["dee28f6e-fd15-4bd2-ab17-0b14f476b3b6"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp6SmGlmkmaXqpqUYmuqaJKUY6SYmGZrrGiQZmqSZmJslGSeZAQCW7hYu"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["79daa9c8-d39d-4390-9f04-e1c3dce37162"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm1umJCZaJlvophhbpuiaGFsa6FqmGZjophomG6ckpxqbG5oZAQCJ2xWv"*)(*]VB*) ``` Monte Carlo and Random Processes [#monte-carlo-and-random-processes] Monte Carlo simulations: ``` (* Estimate Pi using Monte Carlo *) n = 1000; points = RandomReal[{-1, 1}, {n, 2}]; inside = Count[points, p_ /; Norm[p] <= 1]; piEstimate = 4.0 * inside/n (* Visualize *) Graphics[{ PointSize[Small], Red, Point[Select[points, Norm[#] <= 1 &]], Blue, Point[Select[points, Norm[#] > 1 &]], Circle[] }] ``` ``` 3.064\` ``` ``` (*VB[*)(FrontEndRef["cc496adf-d0ed-49cf-a5a1-88abcfa431f7"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyebWJolpqTpphikpuiaWCan6SaaJhrqWlgkJiWnJZoYG6aZAwCdMxbE"*)(*]VB*) ``` Random walks and stochastic processes: ``` (* 1D random walk *) walk = Accumulate[RandomChoice[{-1, 1}, 1000]]; ListLinePlot[walk, PlotLabel -> "Random Walk"] ``` ``` (*VB[*)(FrontEndRef["57a7998b-60a3-45df-a13b-0e2d16655399"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5onmltaWiTpmhkkGuuamKak6SYaGifpGqQapRiamZmaGltaAgB9pRUe"*)(*]VB*) ``` ``` (* 2D random walk *) walk2D = Accumulate[Table[RandomReal[{-1, 1}, 2], {1000}]]; ListLinePlot[walk2D, AspectRatio -> 1] ``` ``` (*VB[*)(FrontEndRef["9eaac57f-9df0-420a-8237-1dd024b223de"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW6YmJiabmqfpWqakGeiaGBkk6loYGZvrGqakGBiZJBkZGaekAgCMqhXH"*)(*]VB*) ``` ``` (* Brownian motion *) brownian = RandomFunction[WienerProcess[], {0, 10, 0.01}]; ListLinePlot[brownian] ``` ``` (*VB[*)(FrontEndRef["acf67522-701f-4713-99c2-bda40943eb07"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyanmZmbGhnpmhsYpumamBsa61paJhvpJqUkmhhYmhinJhmYAwB9xRVA"*)(*]VB*) ``` Data Import and Export [#data-import-and-export] Work with external data: ``` (* Import CSV *) data = Import["data.csv", "Dataset"] (* Import from URLs *) webData = Import["https://example.com/data.json", "JSON"] (* Export results *) Export["results.csv", dataset] Export["plot.pdf", myPlot] Export["data.json", <|"values" -> {1, 2, 3}, "label" -> "test"|>] (* Clipboard operations *) CopyToClipboard[data] ``` Working with Images [#working-with-images] Images are expressions too. Create or import an image: ``` (* Create a sample image of Lena *) i = Import["https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png"]; i = ImageResize[i, 200]; (* Or import from file *) (* i = Import["image.jpg"] *) ``` Then manipulate it: ``` (* Negate colors *) i // ColorNegate (* Apply filters *) ImageAdjust[i] Sharpen[i] EdgeDetect[i] ``` ``` (*VB[*)(FrontEndRef["9c511a23-fde7-468e-b8ba-3b77a17891a7"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWyabGhomGhnrpqWkmuuamFmk6iZZJCXqGieZmycamltYGiaaAwCGuBWs"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["12608338-094e-484c-ab21-b0416b959d09"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGxqZGVgYG1voGliapOqaWJgk6yYmGRnqJhmYGJolWZpaphhYAgBtHBSw"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["ab647878-e283-4ae3-9796-50ab364f2ce3"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyaZmZhbmFvophpZGOuaJKYa61qaW5rpmhokJhmbmaQZJacaAwB8nxVU"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["8488254c-1644-422a-bc8c-b0c4f8a5acd8"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW5hYWBiZmiTrGpqZmOiaGBkl6iYlWyTrJhkkm6RZJJomJqdYAAB2BBWi"*)(*]VB*) ``` Extract image information, domainant colors and perform ML-based lines detection: ``` (* Extract features *) ImageDimensions[i] DominantColors[i, 5] HighlightImage[i, {Cyan, ImageLines[i, MaxFeatures->3]}] ``` ``` {200,200} ``` ``` {(*VB[*)(RGBColor[0.6618013835790273, 0.26296659067858263, 0.3200697735808811])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qCsmJlajSfWpftOrtzkuFVy7YF939XPuOteaKPQBxiRtc"*)(*]VB*),(*VB[*)(RGBColor[0.3580443461509232, 0.07796091751260913, 0.23999659396158404])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8q8pL0v2r06pp9EbuxqLr91832RRc3SUea7jhnDwBOoBhc"*)(*]VB*),(*VB[*)(RGBColor[0.8339663460981626, 0.5542853922003433, 0.49391420257925406])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qSpt5zuDW+lf2RfxXWXZs2fPQvqjw2bEArzn37QF/bxtn"*)(*]VB*),(*VB[*)(RGBColor[0.895786848935645, 0.7484762523318615, 0.6870566597461323])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qEt7Uree56o190S4l44qWz8/ti75VNtvH/XlqDwBm2RqG"*)(*]VB*),(*VB[*)(RGBColor[0.5513531301841743, 0.3151927181891051, 0.5142281560156993])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qsmC7Frh+yUP7onXnlUXkdK7YFwUukpjdV/LAHgBaDhjH"*)(*]VB*)} ``` ``` (*VB[*)(FrontEndRef["f1d1d249-b928-4ddd-8139-7e59b7a545b4"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKpxmmGKYYmVjqJlkaWeiapKSk6FoYGlvqmqeaWiaZJ5qamCaZAACEvRWE"*)(*]VB*) ``` Analyze color distribution in LAB space: ``` BubbleChart[ Append @@@ Tally[ Round[ Flatten[ImageData[ColorConvert[i, "LAB"]], 1][[All, {2, 3}]], 0.1]], ColorFunction -> (LABColor[.6, ##] &), ColorFunctionScaling -> False, BubbleSizes -> {0.01, 0.1}] ``` This creates a bubble chart visualizing the color distribution in LAB color space, where each bubble represents a color cluster. ``` (*VB[*)(FrontEndRef["afa368fd-f2e6-4058-8022-5f006943f0f3"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ6YlGptZpKXophmlmumaGJha6FoYGBnpmqYZGJhZmhinGaQZAwCHaxVG"*)(*]VB*) ``` Matrix Operations [#matrix-operations] Matrices are symbolic by default: ``` {{a, b}, {c, d}} // MatrixForm ``` ``` (*GB[*){{a(*|*),(*|*)b}(*||*),(*||*){c(*|*),(*|*)d}}(*||*)(*1:eJxTTMoPSmNkYGAo5gUSYZmp5S6pyflFiSX5RcFsQBHfxJKizAoAs04KOA==*)(*]GB*) ``` Still behaves like a regular matrix: ``` (*GB[*){{a(*|*),(*|*)b}(*||*),(*||*){c(*|*),(*|*)d}}(*||*)(*1:eJxTTMoPSmNkYGAo5gUSYZmp5S6pyflFiSX5RcFsQBHfxJKizAoAs04KOA==*)(*]GB*) . (*GB[*){{a(*|*),(*|*)b}(*||*),(*||*){c(*|*),(*|*)d}}(*||*)(*1:eJxTTMoPSmNkYGAo5gUSYZmp5S6pyflFiSX5RcFsQBHfxJKizAoAs04KOA==*)(*]GB*) ``` ``` {{(*SpB[*)Power[a(*|*),(*|*)2](*]SpB*)+b c,a b+b d},{a c+c d,b c+(*SpB[*)Power[d(*|*),(*|*)2](*]SpB*)}} ``` Compute eigenvalues symbolically: ``` Eigenvalues[{{a, b}, {c, d}}] (* Determinant *) Det[{{a, b}, {c, d}}] (* Inverse *) Inverse[{{a, b}, {c, d}}] ``` Use the command palette to draw matrices quickly. Data Types and Formatting [#data-types-and-formatting] Wolfram Language provides rich visual representations for various data types: ``` Table[RGBColor[1, a, b], {a, 0, 1, 0.25}, {b, 0, 1, 0.25}] // MatrixForm ``` ``` ((*GB[*){{(*VB[*)(RGBColor[1, 0., 0.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQHOAAALpBNd"*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0., 0.25])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQHKuGAPAA2DFGw="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0., 0.5])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQHKeGAPAA2jFHw="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0., 0.75])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQHKeGEPAA2zFIQ="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0., 1.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQEuAgANwxSM"*)(*]VB*)}(*||*),(*||*){(*VB[*)(RGBColor[1, 0.25, 0.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAozBwAAAFwoUbA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.25, 0.25])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAoIBABjpFXs="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.25, 0.5])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAozxwB4AGQkViw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.25, 0.75])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAozxwh4AGRkVkw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.25, 1.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjgj1cBAAZKRWb"*)(*]VB*)}(*||*),(*||*){(*VB[*)(RGBColor[1, 0.5, 0.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAYzBwAAAF7oUfA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.5, 0.25])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAYxxwR4AGZkViw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.5, 0.5])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAYIBABm5FZs="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.5, 0.75])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjAYzxwh4AGckVow=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.5, 1.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjgT1cBAAZ2RWr"*)(*]VB*)}(*||*),(*||*){(*VB[*)(RGBColor[1, 0.75, 0.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjBYzBwAAAGBIUhA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.75, 0.25])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjBYxxwR4AGfEVkw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.75, 0.5])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjBYzxwB4AGhEVow=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.75, 0.75])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjBYIBABohFas="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 0.75, 1.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyjjhT1cBAAaMRWz"*)(*]VB*)}(*||*),(*||*){(*VB[*)(RGBColor[1, 1., 0.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHe3QGAwMAGGoUjA=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 1., 0.25])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHe3TGBXsAGkkVmw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 1., 0.5])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHe3TGA3sAGmkVqw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 1., 0.75])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHe3TGC3sAGnkVsw=="*)(*]VB*)(*|*),(*|*)(*VB[*)(RGBColor[1, 1., 1.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHe0wGABqJFbs="*)(*]VB*)}}(*]GB*)) ``` Syntax sugar also helps represent abstract objects: ``` NumericArray[{1,2,3,4,5,6}] ``` ``` NumericArray[(*VB[*) {1, 2, 3, 4, 5, 6}, "UnsignedInteger8" (*,*)(*"1:eJydUMtqAkEQ3MQ8JeAtAU/JwR/wEMWbskoEUdhVz45O7zIw0x16Zkn279PjGpKcEnIpuqqarqKf9pQVrSRJfFdgQu8zYrcbMyssQeeVc4prkYuzuNMRmDFhmKLeGg6Vso1xIfBCVh+HJSEU55/ywvjQsIdvCafL8wBua+AtvxJvXb/C6LHZbQtMtQnE0f4Z0rBbgU22SOFAGvJ7Yb1+f4PelAh6jgFK4KFIX02yykJ+EwdQeoW2PqprruD3fnfipcaB3Cf0/215HVsOJs+9QfqXWv4y/ltZDx8C6mio"*)(*]VB*)] ``` `NumericArray` provides an efficient packed representation for numerical data, displayed with its type and length. Even something like `DateObject` is visually formatted: ``` Now ``` ``` (*VB[*)(DateObject[{2024,5,19,12,39,34.05428},"Instant","Gregorian",2.])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwSSxJ9U/KSk0uCUnNLcgB8oKlgMJKwaV5CoaWCr6JlQpGBkYmCoZGVsaWVsYmSgCu/RIR"*)(*]VB*) ``` also: ``` Tomorrow - (*VB[*)(DateObject[{2025,12,31,15,42,21.780028\`8.090633417173185},"Instant","Gregorian",1.\`])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBGXxJLUYCkgQyk8NUXB2FABKK1gZGBkqmBoamViZGVkqAQAHngPbQ=="*)(*]VB*) ``` ``` (*VB[*)(Quantity[0., "Days"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWnMIB4vkAjLTC13SU3OL0osyS8K5gCKBJYm5pVkllQWMUBBMEiXS2JlMQBBnA/l"*)(*]VB*) ``` Time series also render visually: ``` v = {2, 1, 6, 5, 7, 4}; t = {1, 2, 5, 10, 12, 15}; ts = TimeSeries[v, {t}] ``` This creates a time series object with automatic plotting and temporal analysis capabilities. You can query properties like `ts["FirstTime"]`, `ts["LastTime"]`, or perform operations like `TimeSeriesResample`. ``` TimeSeries[(*VB[*) TemporalData[TimeSeries, {{{2, 1, 6, 5, 7, 4}}, {{{1, 2, 5, 10, 12, 15}}}, 1, {"Continuous", 1}, {"Discrete", 1}, 1, {ResamplingMethod -> {"Interpolation", InterpolationOrder -> 1}, ValueDimensions -> 1}}, False, 14.3] (*,*)(*"1:eJylUk1LAzEQXT+pohcvgqcteN3D0m9vSrcoLAi71bOTzUQCm6QkWdr++066glKESr08Zt68zLxM0mWmECdRFLk7giezmhmrPh6tBf2JvGyUArsmWhwFzQ3BzBrtM82zFVaNB1ZjeU90NYI+m6QsYVCxpA/VMGEMKRqPxlwMEHuTnjgOTU4Jcun8TrYdEJwUZvmb8PaHvy9fLx7Vu8RleU61uVT4ELfaS4KMS29sKLetQ7dnU/M2uyB4K/IpVoZjGaj0e2jR0KU6IUDgr7peb9m5bXC/laCMvTnQSDiUDv7ixF1RUC5A03uoHMXuOvcavabaFDzECyO1d/9Z3fAgw+4s/CaoHW4A882bpA=="*)(*]VB*)] ``` Preview palettes visually: ``` ColorData[24] ``` This displays an interactive color palette with a gradient showing all available colors in the scheme. You can use it with `ColorData[24][0.5]` to get specific colors. ``` ColorDataFunction[(*VB[*) 24, "Indexed", {1, 10, 1}, {RGBColor[0.9215686274509803, 0.49411764705882355, 0.43137254901960786], RGBColor[1., 0.7215686274509804, 0.2196078431372549], RGBColor[0.9490196078431372, 0.8627450980392157, 0.43529411764705883], RGBColor[0.6705882352941176, 0.8784313725490196, 0.9372549019607843], RGBColor[0.3176470588235294, 0.6549019607843137, 0.7529411764705882], RGBColor[0.12941176470588237, 0.5176470588235295, 0.6313725490196078], RGBColor[0.09019607843137255, 0.33725490196078434, 0.49411764705882355], RGBColor[0.7058823529411765, 0.49411764705882355, 0.5450980392156862], RGBColor[0.5333333333333333, 0.23529411764705882, 0.3058823529411765], RGBColor[0.8941176470588236, 0.7098039215686275, 0.7490196078431373]}[[Mod[Floor[#1], 10, 1]]] & (*,*)(*"1:eJylk12TmjAUhu3X9GM608vO9Kp7waUzEoFq74giLoi6RLB41axEliUhGqDqT+u/a9C1daedqdPenJy85yTvE0Kubrm/etZoNIoPMkC+G3DBvppC4DwhMaoYw2Iv5dWTuuedDAPB89LK4zAVZYXpsfBchiGn8SEZ85ysnp7kUVqUf5q9P/N78LkuCQtTskUvZe06j8nu88dj8xsZrDgtuajrjz2Ps9cyBP6oT5Y8JqheBLRftn5FCXpVJwTHk5zuD+pMVOTvMPWyHqdcFP9Do7Yup7n8Q9U+U0xJWZJ/hfsuNQV0FGBCqOhQjgroHoRaCx9pp7v3yeogAwN0Qax2tKbWNoym1jJAE3d0ral2DdDSPhlgiYlsU/T+aVO5U+/MQyZAVdomcXazmceniI2zyDb5IrHQ8Fumu36PWA7cuh0xddvDMWrbJbJa1Sig3j7LxmFiuWxHF/YmiObre87u0ltGGLadZGGgBWaO4DbdYNtnEXOKhYMIMxPIxtCf12DnJHo//HnUS2HTGlZPPLRF83CCs2qzzHU/yqgCYBDcLP0osUKEM1V4MHRv2HqCvzhuBCdobwpapbN8sJnfu8Trs4EdSCQ4iXX9bh7Q1AzMpMdzWNLfQeED6CX/VPFWJmiNc3l7bERWZfGifsaYFuQHLPwHTQ=="*)(*]VB*)] ``` Play audio inline: ``` ListPlay[Table[Sin[2 π 50 t], {t, 0, 1, 1./2000}]] ``` This creates an audio player that plays a 50 Hz sine wave. The output includes playback controls and a waveform visualization. ``` (*VB[*)(FrontEndRef["5bdc3fd7-0c49-4a1d-89d2-b5ddce0cc8f4"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmyalJBunpZjrGiSbWOqaJBqm6FpYphjpJpmmpCSnGiQnW6SZAACTvhaV"*)(*]VB*) ``` Too much data? Use icons: ``` Table[i, {i, 100}] // Iconize ``` ``` (*VB[*)(Uncompress["1:eJwV0UVTQgEAhdFnd6LYga1gYXeLgYoY2IGOM2/lAv//yNmc+eZubyz/m/35DoKgUF4kHRb+wpJihKUogz2sQCWqUI0a1KIO9WhAI5rQjBa0IoI2tCOKDnSiC93oQS/60I8BDCKGIQxjBKMYwzgmMIkpxJHANGYwiznMI4kFLGIJy1jBKtawjg1sYgvb2MEu9rCPAxziCMdI4QSnOMM50rjAJa6QwTWyuMEt7nCPHB7wiCc84wWveMM7PvCJPL7g/H+3c0Dg"])(*,*)(*"1:eJxTTMoPSmNmYGAo5gUSYZmp5S6pyflFiSX5RcEcQBHP5Py8zKrUlMwFnAwMaUwghSxAIqg0JzWYFcjwSUxKzQkGCfnl56UCAPKuEqQ="*)(*]VB*) ``` These are stored with `zlib` compression and encoded in base64. If the content exceeds a few KB, it gets offloaded and referenced instead. These are built-in features. There's no privilege granted to system code that you can't use yourself. You can build your own symbolic objects with syntax sugar and styling. # Installation **Step 1**: download and install [freeware Wolfram Engine 14.3](https://www.wolfram.com/engine/) for developers. **Step 2**: install WLJS from the binaries hosted at Github or homebrew. Alternatively you can skip **steps 1, 2** and use a **complete Docker Image** (see further). import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; import { Tabs, Tab } from 'fumadocs-ui/components/tabs'; * [Apple Silicon](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-arm64-macos.dmg) * [Intel](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-x64-macos.dmg) * [x86/64](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-x64-win.exe) * [DEB x86/64](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-amd64-gnulinux.deb) * [DEB ARM64](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-arm64-gnulinux.deb) * [AppImage x86/64](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-x86_64-gnulinux.AppImage) * [AppImage ARM64](https://github.com/WLJSTeam/wljs-notebook/releases/download/v3.0.3/wljs-notebook-3.0.3-arm64-gnulinux.AppImage) ```bash docker run -it \ -v ~/wljs:"/home/wljs/WLJS Notebooks" \ -v ~/wljs/Licensing:/home/wljs/.WolframEngine/Licensing \ -v ~/wljs/tmp:/tmp \ -e PUID=$(id -u) \ -e PGID=$(id -g) \ -p 8000:3000 \ --name wljs \ ghcr.io/wljsteam/wljs-notebook:main ``` ```bash brew install --cask wljs-notebook ``` see also [All releases](https://github.com/JerryI/wljs-notebook/releases) > We carefully crafted our UI to match the look of all platforms as close as possible for a web-based application WLJS itself - **does not**, however, Wolfram Engine needs it for: 1. first time activation; 2. any online features like: downloading neural nets, fetching natural languages data, online databases. If you do not use any of (2), an application will function fully offline and forever. Windows [#windows] Download and install the latest `.exe`. *Only x86/64-bit architecture is supported* Linux [#linux] Using .deb Package (Recommended) [#using-deb-package-recommended] ```bash sudo apt install ./wljs-notebook.deb ``` ⚠ *Ubuntu 24.04 users*: If you encounter AppArmor issues, run: ```bash sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 ``` ⚠ *Ubuntu 25.XX users*: There might issues with installing WE due to broken Rust core library for MD5, install GNU version: ```bash sudo apt install coreutils-from-gnu coreutils-from-uutils- --allow-remove-essential ``` Using .AppImage Package (Recommended) [#using-appimage-package-recommended] Make AppImage executable and run it by double-click. ⚠ *Debian 13 users*: in the case of troubles install FUSE ```bash sudo apt install libfuse2 ``` ⚠ or if you are *Ubuntu user*: ```bash sudo apt install libfuse2t64 ``` Using .zip Archive [#using-zip-archive] Extract and run the `wljs-notebook` executable. macOS [#macos] Using .dmg Installer [#using-dmg-installer] * Apple Silicon users: Download the `-arm64.dmg` version. * Intel Mac users: Use `-amd64.dmg` version. Using Homebrew [#using-homebrew] ```bash brew install --cask wljs-notebook ``` *** 🚢 Running on a server [#-running-on-a-server] Certain features such as image/sound recording might require `https` connection if you are running it **not on a local machine**. See how to set up a proxy in [Container Setup](https://github.com/JerryI/wljs-notebook/blob/main/container/README.md) or use [port forwarding](https://www.digitalocean.com/community/tutorials/ssh-port-forwarding) via SSH. For a remote machine: **Step 1**: register and get developer license for [freeware Wolfram Engine](https://www.wolfram.com/engine/) at wolfram.com **Step 2**: deploy WLJS Notebook ```bash docker run -it \ -v ~/wljs:"/home/wljs/WLJS Notebooks" \ -v ~/wljs/Licensing:/home/wljs/.WolframEngine/Licensing \ -v ~/wljs/tmp:/tmp \ -e PUID=$(id -u) \ -e PGID=$(id -g) \ -p 8000:3000 \ --name wljs \ ghcr.io/wljsteam/wljs-notebook:main ``` This will mount your local `wljs` folder to the container, where examples, configs and license-related files are stored. Then open `http://127.0.0.1:8000` or forward `8000` port to your local machine and open. Some features require WLJS desktop app: * `Export[_, _, "PDF"]` - export to PDF * Rendering `Animate` to a GIF file * `Rasterize` - expressions rasterization * `SystemOpen` - open files/folders using OS system calls * `SystemInputDialog` - open system file dialog Running without a container [#running-without-a-container] If you hate contaienrs, you can start WLJS Notebook directly from a repository. Make sure to have Wolfram Engine installed: **Step 1**: clone WLJS Notebook ```bash git clone https://github.com/WLJSTeam/wljs-notebook.git cd wljs-notebook ``` **Step 2**: start it ```bash wolframscript -f Scripts/start.wls ``` WLJS Notebook uses 1 port for plain HTTP and 2 WebSockets ports for communication: 20560, 20559, and 20563. Make sure to have 1:1 port-forwarding for the last 2 if you plan to connect from a proxy or SSH tunnel Tunnelling though SSH [#tunnelling-though-ssh] Example setup: ```bash ssh -f -N \ -L 20560:localhost:20560 \ -L 20559:localhost:20559 \ -L 20563:localhost:20563 \ @ -p ``` 🍓 Raspberry PI [#-raspberry-pi] Unix ARM64 binaries can work on any Raspberry PI computers > 3B with x64 OS installed. However, you might need to install `libuv` or/and `libuv-dev` dependency from the terminal. Wolfram Engine is available from APT repository by the default and does not require authentification. # Advanced Slides This is an advanced guide on how to build live presentations with dynamic content events and complex layouts. Please make sure you are familiar with these guides: A basic guide on how to write slide cells. You can use pure Markdown, HTML, CSS, or WLX languages when creating slides. An advanced guide on how to build reusable components for slides and more The last one is especially recommended to read. Data-driven slides [#data-driven-slides] We have seen it already, that one can generate plots from the raw data directly on a slide: ```wolfram MyFigure[OptionsPattern[]] := Histogram[RandomVariate[NormalDistribution[0, OptionValue["Sigma"]], 200]]; Options[MyFigure] = {"Sigma" -> 1.0}; ``` ``` .slide ``` ``` FrontEndExecutable[97e73bca-8cb6-4526-80e9-3ab856ba19f8] ``` The same works with any interactive element with `WLXForm` defined (or supported), for example [Manipulate](./../GUI/Manipulate): ```wolfram Cannon = Manipulate[ Module[{g = 9.81, t, tmax, x, y, vx, vy}, tmax = (2 * v0 * Sin[angle Degree]) / g; Show[ (* Trajectory plot *) ParametricPlot[ {v0 * Cos[angle Degree] * t, v0 * Sin[angle Degree] * t - 0.5 * g * t^2}, {t, 0, tmax}, PlotStyle -> {Blue, Thick}, PlotRange -> {{0, 100}, {0, 60}}, AspectRatio -> 0.6, GridLines -> Automatic, FrameLabel -> {"Distance (m)", "Height (m)"}, ImageSize -> 300 ], Graphics[{ Red, Thick, Arrow[{{0, 0}, 2.0 {v0 * Cos[angle Degree] / 5.0, v0 * Sin[angle Degree] / 5.0}}] }], Graphics[{ Green, PointSize[0.05], Point[{v0 * Cos[angle Degree] * tmax, 0}] }], Epilog -> { Text[ "Range: " <> ToString[N[v0 * Cos[angle Degree] * tmax, 3]] <> " m", {50, 5+30} ], Text[ "Max Height: " <> ToString[N[(v0 * Sin[angle Degree])^2 / (2 * g), 3]] <> " m", {50, 10+30} ] } ] ], {{v0, 30, "Initial Velocity (m/s)"}, 5, 35, 5}, {{angle, 45, "Launch angle Degree (°)"}, 15, 90, 15}, Appearance->None ]; ``` Then we place it on a slide as it is: ``` .slide ## Projectile Motion Simulator Adjust the parameters to see how they affect the trajectory: ``` ``` ## Projectile Motion Simulator Adjust the parameters to see how they affect the trajectory: FrontEndExecutable[09d387b9-5a59-4997-8555-450b3a5d7cba] ``` However, we can push the idea of slides and data further and bind different actions to the events generated on a slide. Events binding [#events-binding] Let's start with simple example described in [component-based markup page](./Component-based-markup): ``` .wlx Stat[Text_, OptionsPattern[]] := With[{ Count = OptionValue["Count"] },
] Options[Stat] = {"Count" -> 1}; ``` It is a basic stat display component: ``` .slide # Basic counter Number of publications ``` ``` # Basic counter
11Number of publications
``` What we want next is to start counting from 0 to the target number `Count` when the widget becomes visible on a slide. Every slide generates a bunch of events that can be captured with [SlideEventListener](./../Slides/SlideEventListener). For example we can capture when the slide becomes visible or invisible: ```wolfram EventHandler["generated-by-slide", { "Slide" -> Function[Null, Print["I am visible"]; ], "Left" | "Destroy" -> Function[Null, Print["I am no longer visible"]; ] }]; ``` ``` .slide # First slide --- # Second slide ``` The same works with [fragments](./../Cell-types/Slide): ```wolfram EventHandler["generated-by-slide", { "fragment-1" -> Function[Null, Print["I am a fragment 1"]; ], "fragment-2" -> Function[Null, Print["I am a fragment 2"]; ] }]; ``` ``` .slide # Fragments I am a fragment 1 I am a fragment 2 ``` In general, you can **wire many components from the same place** that share the same event generator like this: ``` ``` Another way to connect multiple components to the same `SlideEventListener` is to have `Component1` and `Component2` **use their own** `SlideEventListener`. This way you do not need to worry about unique IDs and [events cloning](./../Misc/Events). You can place an unlimited number of `SlideEventListener` on a single slide Let's go back to our example with ``. We need to update the displayed number using a timer that starts when `SlideEventListener` fires the `"Slide"` event. To display the changing value, we use [HTMLView](./../GUI/HTMLView) (though `TextView` could also work): ``` .wlx Stat[Text_, OptionsPattern[]] := Module[{ cnt = 0, task }, With[{ ev = CreateUUID[], HTMLCounter = HTMLView[cnt // Offload], max = OptionValue["Count"] }, EventHandler[ev, { "Destroy" -> Function[Null, EventRemove[ev]; If[task["TaskStatus"] === "Running", TaskRemove[task]]; ClearAll[task];], "Left" -> Function[Null, cnt = 0], "Slide" -> Function[Null, task = SetInterval[If[cnt < max, cnt += 1, TaskRemove[task]], 15]] }];
] ] Options[Stat] = {"Count" -> 1}; ``` Each `Stat` component is generated with its own scope and counts up independently. You can place them on any slide as many as you want: ``` .slide # Stats Citations Hours Symbols ``` Each counter is self-contained and responds only when the slide is active. Widgets with plots [#widgets-with-plots] Let's create another example: a custom widget that reacts to slide fragments. For instance, a reactive chart with a flying disk that moves when a fragment appears. Here we use the [Offload](./../Guides/Dynamic) method to switch between datasets provided in options: ``` .wlx PlotWidget[OptionsPattern[]] := Module[{ data = OptionValue["DataA"], disk = OptionValue["DataA"] // Last }, With[{ Canvas = Graphics[{ ColorData[97][1], Line[data // Offload], ColorData[97][3], Disk[disk // Offload, {0.4,0.05}] }, Axes -> True, ImageSize -> 500, PlotRange -> {{-0.2, 1.1 5 Pi}, 1.1 {-1, 1}}, TransitionDuration -> 500], uid = CreateUUID[], dataA = OptionValue["DataA"], dataB = OptionValue["DataB"] }, EventHandler[uid, { "fragment-1" -> Function[Null, data = dataB; disk = dataB // Last; ], ("Left" | "Destroy" | "Slide") -> Function[Null, data = dataA; disk = dataB // First; ] }];
] ] Options[PlotWidget] = {"DataA" -> {}, "DataB" -> {}}; ``` 2. Generate 2 datasets: ```wolfram {dataA, dataB} = { Table[{x, Sin[x]}, {x, 0, 5 Pi, 0.1}], Table[{x, Tan[x]}, {x, 0, 5 Pi, 0.1}] }; ``` 3. Mount it on a slide: ``` .slide # First slide --- # Second slide --- # Third slide ``` Animation triggers [#animation-triggers] Another example of using slide events to trigger animation is [Animate](./../GUI/Animate). The simplest example we can think of is: ```wolfram Animate[Graphics3D[{ Black, Arrow[{{0,0,0}, {8Pi,0,0}}], Red, Tube[Table[{x, 0, 5 Sin[x-t]}, {x,0,6Pi,0.1}], 0.2], Blue, Tube[Table[{x, 5 Sin[x-t+Pi/2], 0}, {x,0,6Pi,0.1}], 0.2] }], {t,0,16Pi,0.1}, RefreshRate->60] ``` `Animate` supports external controls wired via `EventObject`, which allow you to start, stop, or suspend the animation: ``` .wlx Animation := With[{ ev = EventObject[], proxy = EventObject[] }, { AnimationHolder = Animate[Graphics3D[{ Black, Arrow[{{0,0,0}, {8Pi,0,0}}], Red, Tube[Table[{x, 0, 5 Sin[x-t]}, {x,0,6Pi,0.1}], 0.2], Blue, Tube[Table[{x, 5 Sin[x-t+Pi/2], 0}, {x,0,6Pi,0.1}], 0.2] }], {t,0,16Pi,0.1}, RefreshRate->60, "TriggerEvent"->proxy] }, EventHandler[ev, { "Slide" -> (EventFire[proxy, "Start", Null]&), "Left" | "Destroy" -> (EventFire[proxy, "Stop", Null]&) }];
] ``` Here we used `proxy` to filter out other events and properly wire the rest. Let's place it on a slide: ``` .slide # Empty slide --- ``` Run Javascript [#run-javascript] Here is an example of how to trigger confetti with an external JavaScript library. To understand how Wolfram Language integrates with JavaScript, check out these guides: A basic guide on how to handle Javascript cells A guide on how to write and exchange data with Javascript functions and WL Load an external library (using CDN) using [HTML cell](./../Cell-types/HTML): ``` .html ``` Now it is in the global Javascript scope. Define a javascript function to trigger confetti: ``` .js core.RunFireworks = async (args, env) => { const id = await interpretate(args[0], env); party.confetti(document.getElementById(id).parentNode, { count: party.variation.range(20, 40), size: party.variation.range(0.8, 2.2), }); } ``` Here `RunFireworks[id]` accepts one argument: the ID of a DOM element whose parent will receive the confetti fireworks. We can create a dummy DOM element within a WLX component and trigger `RunFireworks` using [FrontSubmit](./../Frontend-IO/FrontSubmit) in response to slide events: ``` .wlx Party := Module[{ UId = CreateUUID[], Ev = CreateUUID[] }, EventHandler[Ev, { "Slide" -> Function[Null, FrontSubmit[RunFireworks[UId]] ] }];
] ``` Now if you place it on any slide, it will launch confetti once the slide has become visible. For example: ``` .slide # Let's have --- # A Party! ``` Programmatic slides control [#programmatic-slides-control] Use [FrontSlidesSelected](./../Slides/FrontSlidesSelected) to control slides programmatically. Note that this is a frontend symbol (i.e., undefined on the Wolfram Kernel). Execute it with [FrontSubmit](./../Frontend-IO/FrontSubmit) to navigate to a different slide programmatically. For example: ```wolfram FrontSlidesSelected["navigateNext", 1] // FrontSubmit ``` This will navigate the first visible presentation to the next slide. You can connect external devices and manipulate slides remotely via Wolfram Language, timers, or buttons: ```wolfram NavButton := Button["→", FrontSlidesSelected["navigateNext", 1] // FrontSubmit]; ``` Then use it on a slide: ``` .slide Current slide --- Next slide ``` `FrontSlidesSelected` maps directly to [the standard interface](https://revealjs.com/api/) of RevealJS - engine behind slide cells of WLJS Notebook Misc [#misc] Dark Theme [#dark-theme] If you want to color your slides in black, create [HTML](./../Cell-types/HTML) cell and evaluate it to override styles for slide number, headings and create a few helper classes: ``` .html ``` Then whever you add to a slide `slide-dark` class it will color headings and text accordingly. In combination with black background you can write it as: ``` .slide # Heading This is going to be white ``` Sometimes you need to make a dark variant of an existing picture of a figure. For this reason - use `dark-content` class we defined earlier. It will apply *negative filter combined with a hue shift*: ``` .slide
![](https://upload.wikimedia.org/wikipedia/commons/7/79/Example_image_not_to_be_used_in_article_namespace.jpg)
``` Embed cell views [#embed-cell-views] If you paste a nice-looking Markdown table, it will clash with some Markdown syntax reserved to separate slides. However, you can use [CellView](./../GUI/CellView) to embed a markdown cell into a slide instead: ```wolfram MDTable = CellView[Cell[" | Material | V ${}^\\circ/(\\textrm{T}~\\textrm{cm})$ | $\\lambda$ (nm) | Ref. | |-------------------------------------|----------------------------------------|-----------------|-------------------------------------------| | Bilayer semiconductor MoSe2 | $10^7$ | 800 | Benjamin Carey et al. Nature Comm. 2024 15 | | Nano particles PS-CoNP | $10^3$ | 1310 | Chemistry of Materials 2022 34 | | Pr$^{3+}$ doped glass | $35$ | 1310 | | | Topological insulator Bi$_2$Se$_3$ | $1000$ | 8265 | L. Ohnoutek Scientific Reports 6 2016 | | FePS3 antiferromagnet | $629$ | 68879 | Kartik P. et al. arxiv 2025 | | Helimagnet CuFe$_{1-x}$Ga$_x$O$_2$ | $450$ | $10^6$ | S. Kibayash et al. NATURE COMM. 5:4583 | ", "Output", "markdown"]] ``` Then it is safe to place it on a slide: ``` .slide ``` Use `ImageSize` option to adjust the maximum size The same counts for [Mermaid diagrams](./../Cell-types/Misc): ```wolfram MermaidDiagram = CellView[Cell[" graph LR A[Text Header] --> B[Binary Header] B --> C1[Trace 1] --> T1[Samples 1] B --> C2[Trace 2] --> T2[Samples 2] ", "Output", "mermaid"], ImageSize -> 650] ``` Render Wolfram source code [#render-wolfram-source-code] Using [EditorView](./../GUI/EditorView) you can display chunks of Wolfram Language code in your narratives. Here is a helper wrapper: ``` .wlx CodeInset[str_String, OptionsPattern[]] := With[{Ev = EditorView[str], size = OptionValue["FontSize"]},
]; Options[CodeInset] = {"FontSize" -> 14}; ``` Then we can place any valid input expression, which will be directly rendered on a slide: ``` .slide ## Source code 1-((*FB[*)((1)(*,*)/(*,*)(6))(*]FB*)) ((*SpB[*)Power[x(*|*),(*|*)2](*]SpB*))+((*FB[*)((1)(*,*)/(*,*)(120))(*]FB*)) ((*SpB[*)Power[x(*|*),(*|*)4](*]SpB*))-(*FB[*)(((*SpB[*)Power[x(*|*),(*|*)6](*]SpB*))(*,*)/(*,*)(5040))(*]FB*)+(*FB[*)(((*SpB[*)Power[x(*|*),(*|*)8](*]SpB*))(*,*)/(*,*)(362880))(*]FB*)-(*FB[*)(((*SpB[*)Power[x(*|*),(*|*)10](*]SpB*))(*,*)/(*,*)(39916800))(*]FB*) ``` You do not need to write these special comments manually. This is special syntax sugar used in WLJS. Copy the input expression from a normal Wolfram Language cell. Syntax Highlighter [#syntax-highlighter] This is more general version of `CodeInset`, which uses HLJS compiled using [MJS cells](./../Cell-types/Javascript). You **do not need to recompile it again**, to embed this component into your workflow: 1. Paste this text into an empty input cell:
Compressed expression ``` jsfc4uri1%3AeJzsvYty20iWNjixl9iI%2FZ9hI2BOTZkqy9TVZVnVbo8uVJWmbcm%2FJE93j6xmQSQksYoi1QRpS23pf5J9iX3DzUwggTwHH5IJEJRk9ziqLAvIy8mTJ889D56cDg7O%2Frd%2F%2BZd%2FCf8P8dfbbjg6%2B9%2Flb%2F9D%2FLURhoN21x91B%2F20ycG4FxzKf2z7I%2F%2Fwo3jeuPwt%2FLi4tCz%2F715eDYYj76L3W%2BidDQeX3tOL7vlFT%2Fw%2FavwWPv1Jt2sPhkHjl7f%2Fcfif3eCz99rzw5t%2B26v7w%2FNw3gv6n%2Ba813%2F0vsiWntce9MOR%2BLsTyIaf%2Fe7I6%2FZHwfBqGIz8UaA6HS%2BeRP1%2BMvv0%2FP752D%2B39VtC%2FcTfI7%2FbD4aiY2fQHl8G%2FVGjPQxEr2YvkL%2FVn4pRntJeQfTK0keuIe4UdRQzN%2BJujXB00wsan7ud0YUYora0uPhvtZ%2Byzfyrq6Df2bro9jr1BE4DkOgBaRZ31Y30SO2eH4Zyxxt%2Bp1N%2FKvfs6bz3dBRcj573grOR%2FGU4GPc7QYcCHffv9sVEvxy9eyvAlZ0byVbXo4ae2rTGaNi9rM%2FN62dfkm1ZTzfoLno71%2Fjk98aBmkw9AnR3dHMVHP6f4h%2B7%2FavxiDX4vyRhdsOrnn9z%2BH%2BLf0sALrvD4WBYiKz%2Fv%2F%2F3%2F%2FmXT%2F7Qa7WiHRQr3D%2F9LWjrHVUARg06wdn74eAqbSEeiB2Qz4Lh6MZoeR6M9j%2F35YvtIGynHdLnsoN8N%2BxejQZD2HXPvwzCvL7qJe0mXo0G%2B2ekh3o2EmjcPzMaX%2FhhPFTa%2BEq3bKRv2arag8vLQf8%2FDkWnevt03rscdNThPRv32xLFoskw%2BPu4Owzqc%2FpEiwM4HvZlU%2B%2F21qsvznvt0%2BPMKsVwc%2BJcn8zV67Lla0E5wbVkL%2BG69%2BXOu5trxL9Gk6q%2F9aOIggiYVzdyZIm7%2Bmgwr7iTOPrX7eBqNO91BNZNntM98%2BqKf33%2FvSfXPziL2Nnr1%2BJoDhRyahL2zDu97FqyWM87Gwy9ei8Yeb8HN55onV2p7D83p9tH0z8xt6TR9ns9BbcYY05CJcd6ImaMVmD09VKi1B3mBerElOtePdoaMduxeKxYn2BUQ%2F%2B0Jw7jk3onoktOqvUIV3LmOblo2ayR9hQ7EXOWO7K9o0FmF0aD5uE7uQNiq%2Ba9brgnjuc78f%2B8NxLcOBgp8OrRv0Uzue1PXnv9ca%2FnvUkOY90kbDmSgEpSxLy5zTELWljwds%2B80UXgRZJJsPRuKMSA15fiRNDuleADp91ed3QjZws8sVWjC9kkFE1Gnt%2F3BMTJWGddsdzRhS8knB96p0HQlyz3kzgSQUes1%2FO9LX0cVNNx2O2fi6eb%2FmnQe54Mo%2BeVgw39figI5NKrdxtBw6u1WkEoUCLYUU1NIqFQE4UCPfNyKeqfyVg1sdf%2BuCfIUcwvF5pAULtUw%2BgjUVN0mF13I6b4ZDPkFj%2BJz6b82UhBUruQEJfapvkUAklmin%2Bve2p%2FTeIaDceSUMRGxd2iWUU7%2BY%2B5VL6IJUkYWxHw4YKpPyz0uqcLSnWINA5JVDFzacnHinY1Q6rH56%2FmNFytbjIT0dQ8v5qVdYLgamcYBP8I6oIHGC2iEyueCdIKR36%2FLZnCO%2F%2BKNPE80UBI3cCXeoX8d0eIUiVc5C%2BhInk9V5119cTeDgefvb5Ql5pSntVrl%2F6VJFNxJjrPB%2F3eTU0fw%2BjPnfHbnRDaYYCAPJSHLgOkUAhiqCC4BYCUq3IFMv1nLH7OUlz%2FlHkJRJ9q2RBk3vTbF%2FV6XzwzmXr0J1LWriI5Jzocy2YnP2WbSN4umsQsXnYgjSQy61EbIBQy0kCw7Ccx5N1wZzj4R9CvyzHnMjg0qEw1oAgz8GW%2BiXmugCJ5mDSVx%2BQgCK%2FEquSClN5nTrrwww%2FGFD94%2F37lD%2F1L74vgJFeCi3UkU7hT7NFstpD%2BovA1HLeF0iL5ccCWJDElHzc6QrdSiPk06Ha8xTnPeCoYOFmo5ML6VdIs26IbvvNH7Yvd8744x5Joz3xB6ZiquqqRas8pF48lmRYaKoU0YQ1CJPpXgdSG64oFkvHjzVEvGsNAaKftoL7w%2FcK5YJ7f%2B5dXP9Xm0sd%2FiB73RuTpH6On5%2FRpLXr69%2FGAPn8aPf%2FX6%2BWXPxkn7i4Ddrd%2FEQy7o%2B%2BW6oNh97zb93vzXqPRiIg5JIuIDsUwCAWrF7hZEHTSar3%2FcNBstQQxUP24LkW2SZ5KBYpGkIqLEMB6PrYR0fhKO5HHM26kfsebGoOanPqEN3EODYHItMlAIBgEm3ziIaybbcXh8v5dcYQvR3fk1Oip0idgp%2BTZPXy%2Fsdfaert%2F2JSG4R8Wwiu%2F%2F8faT2YTYeSMwj8PhdUnFI4j%2F1ypuX11FCn%2Fi0F88kS%2BbIRCX0op%2FI4Mqd4dDbYOD7cUw5ADCk4phbywfc%2B611Kc08HlQZdthC3rC1H65%2B7ool5LrL0aZ3UxLKqHJl2juaBg%2FctzIjbuwIzdfrs3FoppvdbIzBNz%2FG7QVqZTBOGV0H1U458ASMeUJH797ku05DvxDzVMI7zono3qc3e%2FztOm4vDELYR4rtevhZarsCSGkL1rrZpcqjgj9a73zFsSAxDV%2FaTx26Dbr9e8vAXHAJoQyfXc%2FZqzi5IjHQTChh8qb8ZE3r%2Blzm8odFYpxM3eZjMoLo6EzLrzxC9hIP%2FpPVfqqPpdcFLxoH45FvsQjq%2BUj%2BjXz37v91%2B9jfe7c3C4LwrW92qV656QL4Ky7%2B68wZU83aGDJEogmdedENM%2FHZ%2BdKdTUalnpYoAgeUE0ivmUdEkmbMil1eUIObvIsb7R6YSedLyEWosfjEdX45FcduBfTkR9jB01BMGHUOSOxLO6fGFZ%2FbPXpgBTjQsA7kdWhWAXfQi%2BMG3OBDkFnaAzN3Epe0rZUAOaC5GDy1cxU8voF08yHDBqORefGKDfqW2UeqPYWsbs6vRQp7ySnXbNCtez5HJntpzLkpZk4vUEhBLobvcG8mDNCN9q9MoQzmgtFWhuy45GDNVK%2FXZ7fDnu%2BdLijkZMm5oLUMoWV%2FO0ZyIFJweABe8i6AnDIswHanPc7andkDupnaLOJzUlPhNoRhTWA%2FvrH9TEqvXr2ndfkm53tT%2F%2BipZFBYNg73uRS70u%2BFqoFHAuz5nK98VrS3%2FyMOive8cnxHaLtT8BgVCy61EPxXZDoB9Fr3ME1tHg96Cv5IeWVq30EYct5vQIUcPBYBQvMF5qHZ3Ckd%2F%2BXTQ5Jn1yVE3plBoNrmxEpcY7Tv%2FZ6AX989GFkIVLlkHlvLZRNVy5p2XSaZYOfnCO1eAj6V2M97VxNQ4vopaT59KkrBgjZtbqFdTG%2BnRrvsSj3IE9SoDP2b6JQKe8DPCx7F79UahlWaOA7XHjShJCnlWQmnzK0LWAtdHrSchCDtrnC%2Bk%2FrMdiJYF%2FzsNjjQb%2Fcbi%2Fl0ND8lUj2q3u2U2dkNS88q7Oe6uOEkiZMp3gTDCDyKMqdOiFi9FlrzWM9URhhyYK552HtMeEgvTLO8HJBQHSVgY9KXUqbmI5JgZLaLTMPvP0GLku1QVKcPJyFiHIZtRtewywHOkaO52iUyI9SdH21TKEGQ%2FU0Ipe9qAYvj%2Blx%2BiznjsUVbV%2Boo3IEKmrTT1R4kNhmi0yesuH0vMxVWPimYr7FdtE5%2B1pD3o9%2FyrM1XvydwboPUpRYljPaUYRG3wKhjf1etCLcBrNGfTojJkdJGNIqUYHjUzL2twJog%2FbUGifWXvPENONFIlRe7bxd%2FkuzQk6QVPonCPDkBUULw5n6EENIY8UfihiRGLLUdiwwRDpE3Hz1FgsRqWmHZcDnMWiU%2BQpLUBFJVleASjvLrMCKW3tBqCDAqD8P4fyMVQBYlQRJQFPJ3Y3GgaNYMjFYmjWZPS990XKhHVPBv0Vh7hTnrRRDo%2FXC5Yel5ztabUEAg%2FHp9pzVY%2FHm%2Ff6WY2eqEJxQyWlstxBdU7tUNH%2B18RTlnEBkc20KEajgbL3IVTD1GnEPUFKg5gnBA%2B9aHqIRmyLYSDOpIO3%2Bw%2FLFqc6EpqlgJM%2BHIyH7UCYJ5nQ3RP5TPsjhUL0E30dM%2BAhZvniBzJyGtF0Fu97bzD43b8I%2FA4HKR5D7ETbFxpW%2Fc3r2rx4OO%2FV5qzufL9%2Fsze%2BPA2G%2B2dHXRkQmzTuejLuD9aBo232ewUGfGMdMO7RaDRkGhYINEhhpYIw8n3sTFWCJ97E67m5RKBlsR%2F1tswvt%2FBqPyLeneHgckPMUs8BJbaPVb6YggYbdQahRD3MsOD336uHpo6qGkSGMyN9NYn0ULejLDVjwnlhnKBTIAc3TwEQ6nHLLzDmmsVQ0B1diLOev0MxWvIx%2BVPuntbqNe9Z5HhotP0rAZdMLajVvHWvJkhoTrycuO23qpk4ECV2vz0Y90cq2PfzcDC%2ByjsnkvEdBOfN6yvRQBjKh%2Brc19W8YvpGcB20Jf0Z%2B2MluSQoIk9IT%2FRmEiHC0qWESyBJ4ERQzTCIpombZxcbNRct1T8aXcFzrxVpLWZhkcrU5sbWnw6aO60DGU1a%2BPjxWBza4799VH9OTm7lj8bcD%2BLf4p%2F1jx%2FfvFGP6sdLz1%2BdHC%2BKv36YixotZBmsMAI%2FD7ujYFNYyMPgTDD%2FfltxofPg%2BiqUoSO5NRIFMnhkrFxmR%2FXHl1sRLUiyWkQsVQ0TUYX6JauJmoM8e23sh0G3Z2dRroXRljSTwKhkkkReyKkyTQbjUTZsENvtYtcSb8JiRhGj%2B5xuSLTTw4zRpSSUap4ZylNgPHtNZVD053QY%2BL9z3Zv%2BmnRuhOPTSKzJdDyDlDgsCjGkvUl3z6Kux4sn8frRUnQT8V%2FEJCU51RISPl46yV9m3PaZF5%2FFSNzV047P4v3NGB3QzEnG1TBlkGgCHEFbz2rW8o9BTc%2BeZYa5s2wDMnIFWCabntNEHwUT6999GQZ3c7%2FGvFAfqpz48buNo61fWnv7R7%2Fs7v2cnPvTjx830yMs2%2B1uN%2FeOove1Y%2F%2F5Pzae%2F9eJRPfnH2iw%2BcPedvPgcGv%2FoNkCXVqwz96Hd5vNg7ilbHAq%2F%2Bo8qytWEv1bqAykz1aL9Ko%2FfzOnmp8uHl%2F%2F5URMd7bxfEdypGe3dTzkD3MR99IT1I%2BD5snx82cnb%2FSMc3TKzd29jYO%2FtrLQ1hdPjxeXTp6x9gIFh0cbB0cCH3HrJ7dPXov%2FXt%2F%2B2%2B2%2Fvb79%2FvZ78d9rBcQP0d%2FRL8%2Biv1%2Ffzt8%2Bv33%2B%2BnZB%2FHe7fvvT7R%2F%2BIP57fSv%2FuxXkdiv%2Fu%2F3jH%2F8o%2FxL%2Fq3%2Ffyv%2FUANHyjtXfXyJGrf7%2BW%2FR3NNdt9Hf8S%2FTkf9F1HP7S3NzY%2B9khGnAanHf7hxfBqbA%2BJCH97V%2BfHHsnQl4sLBgEqzLNpHQ%2FFdr98IanmKk3ciBpyUeaID0f5iws5rbQEJOdLrCnxmS8vWjdoHkX9th6mhNDbX5pdwn95DIY%2BTUyhwJ2PR9mYQatewvfUZCHQS%2F4JJPw1r1F8sJIGJGJV1t%2Br3cqxCnPHakN%2Butqxtq6YFBS6Q6vkGNG8a%2BYO8t84cU51bRBkqFy%2FTE8hkP9MlJyHb7dOPyl1Tzc2ngv6d%2BYPUZL7WP851j%2BFcq%2FDk9MBJqYwPNsvN8%2FFOfsQLKvd%2FvbbB69MbFVNp%2BF4Kn5UO0GfdTt9YJzvxfD2jdfxTcqwnXvmK%2F2BAP7Pz%2FsHzWngPZp7SmHlj6qFNr3vxxsHG68bf15%2F2D7EIAbAyUPUd2%2F9fu3wii49YfB7e7Ty9tu2H86uu0Mor8D9dtn9dvpeHT72zgc3YYXg3Gvcyvv3IxubsPu5VXv5jboD8bnF7fng37fF38LPNx%2BHp3dhoPbcNy%2BuP0sVnh7MxjL%2F4dywpvbXvf34PZSEOycPPt4KVv7794JaWTmpyroZSJyR6X1BvuJe%2B7LHdK8I09MygDMY8HOld5HmW4c9Ec1xnWimekzCUZGEdT7dUKOIGlnQJ4%2BNs%2Bsyo%2FUY0XhMMi6OoP2yD%2BnoMpQt4yByux1Fa2SQfbwym8H0a2G00CmsMfpVZ2G8VqmyMtMp1DwXNGdDRpptwKRKkdB7P8neTdKZQT1BJhRqspQ5pSfBr3B52iy88HpaU%2FON77yImBNH21ynqXAqb95XT%2Fa396%2F3dn9y7vmrdBumrebH36%2B3X9%2FtPtu97%2Bat7%2BIA3D7l7%2F8ZW59rgbYsWtnyrWDa4WHzQgQ6XrKZeqm9paxhJt7P7%2FdFWdTHjvp%2B4tsbYbCXldZK16U0e4teX6%2F4y1L20M6Lz8Phh11laHZPxctL4hw2KVLrjGJVeuG7EE4YA%2FGvMWIt%2FBHfNAz%2FqDPH%2FAug36GGvuDUbDOL2EE1xe%2BYCfdT4GBlf5o6KtzLixLyWy8q8HVuCc4waAfELpZOBZ6qdBOT54dPz2pd24%2FBbeCgwkmI%2FjTbX9ugYNgDi2M%2BrYvWJr3OXiqDsfNU0HSYg%2BeypuKo3bOPM%2Blfir%2BkRn71%2F7g%2BWf%2F5lfVuQF7q55flufvFlhfoQqIk9L2r7oj5TLtxETgx2pZXx4dgZpQHDVleTuzCwujE%2FPKo7LuXYi5xVGOWYFXm%2Ffq896c91nQrjSilLUpATgf%2BpeX%2FjCMLsqMZZLSRSD%2BPhsMMyPH3NPrBL3uZVeQdfgm00aLIHHqn9WP63O1kzf1GFVPn598WZm%2FE4Lo1r%2FdlQJkHN4ej45Ojgf7J7f%2B6LZ7dtvt33ZHt4P%2B3HHj5I3svi77N07EcLfy%2F48f5%2BbmvqxQZKuJnz9%2Fnnmm6FKI7kBl6p0JvUpg%2B%2B9jhW2J%2BhXBXtRxTM%2Bn78k7EXWNJ79%2Fkxm1djUcKLRJlSC6PxDeiP25nosmPBeEHwpUymyj0XAgkCzzbPxehGJBmZ%2BC7KYdfHj7V4H0sQDRTxD93PsUelfB8MK%2FCoVc8COakbAp3vxZDa4jC43MoLuC7MUxC8Po8pLGwEAoxRdyIAXP2%2F39Px16UmRH0kL6vSRuxC%2B5BPDcEypDdLupq1oOIwEzUFdH1DUzJTGeCxkx6HjtC8llva66XOJnRlWXAGIRJJmm4iJ6rsyqst0HQ9H8UzccCxQH175QWqTYCnwxaBgE65kOF6PRVbi%2BsHAu8Dg%2BFWfrMr1o9Bu7dNQNw3EQLiyvLb8EKsM6toe8iPy51RMxTEMIJ4JW0AoQptGmyNR9fyyoUWjwg1PvXftcKFzMvJB%2FanWu1XhEcGWBUUeMnq%2B5LMw1edxq9OlcBqcyOKJ2YoUdpRxbBblGzZwppiy23u7uNVuxzqgV3%2FjXem1hQaaff2eEFqJOm2%2F3t%2F6U30sZ%2BLKn%2BscC6%2F6L1Mbz%2Bv4rmjD2Q%2BRbEX3l%2FgJWROLBKGRoJR6XEjMa3ppCc1KXS4mJuc%2Bm0OwHzZ%2Bbf3lvmTZyOoNpxWYvCCX0%2BG%2FiH33lACGkHmmZ4unxefdyfHPyg%2FnS0PtNauY2Gzk5TCynUBzzE6anPuEvcn0Obpajwl76S45FebR79LZpQeioO%2BoFAJ%2FalVho%2BwxXZNl5gTezEAjvmke%2F7G%2B3fv6woVR5MwFlQdsLoScFpJBbfXV9X9k6vwc3kq%2FJi4WSfwtGnXVcJL7L8Afp854W1Obedutw412ztXHY2mz%2BvLtn2sqZi3sxE6WpvdwutZGooyfL3ZflRa4reROw0VId3sUxlMvjJe66v5ufAhpxhCbCIj1rGB7pZ7tU0YgJrrb8QECey03S92H%2B9bv4xqwBa6uliji0WutRpmf6hnvVjFcWRpRl17kvCXXGgs58AqQpeZ2R0OQthgBLoQzhG%2B8yUtl4B04ZD6aYrwxOYDzGgCIws84442XGr2i8M6QYeWoGJ4wXsbffeJIyT%2BOhnd1A1psQbUq%2Fafz79%2B7V7tkvvrwh0w46guFtD0ZRbC06ZvJ%2BMvDKnQZn0d1%2BHWi8Go%2BOzaAjyMPQfWS8rsHjdXqu3INpyYpQ0mRLX7VQTHPea135Q1lgh2cVRYZ2ctPjiXHzmQB0aeZ10U6EXcQX8HNbWOBW3OlPkcgJY7BzoH6in2fyBaM4tJydDAdapo3SCJqUYNnO%2BiamsApYYkf9zZMoGUFoWWoEFboKScKHGq%2FVirZ7M54PEhrvFIvfUGM8%2Bf32FkBp9DY3Ia9NsvmJTM5eezdeoVQNI1dF3cLfjbz%2BEyjuycZw6N80uqH6GcEQxwvQzSzzfeqGbDQapONk4KIjNAE0NWacxQBJyyAavQlCDs9li0pEbb6Xiq4nJlPmfXytVPrEpDNDzVPLeL00Saaw5OwsfZe78AO9iS6cwJEYQA6RlPwRjStMN2WOr8dOcfYqtj6qST8b3qPsJIjspL%2F0hEb1aKRbL8Z01LGW9XHry%2FvvoqgK1SNluZ5LlpkatxAnMeJQRikPVfWIK2HGfmUKBGR23jjvJmDJ8zxKid0xpI%2BBknkjiZO1Ef%2Bey4ARYYvaCRbDLMdQ5BfuzJlllpVMin%2Bv6CKpvGN2Nyy6Ow4gZksJsvPwkOdmEXrV%2Fl7rT82%2FKp1G3klIh6wNSMCg5gul2%2FxdDE5%2Bp%2BGEmqBE8jtvTQeXrkXyIDo35qPYHTmQlTqGXeVzpJneNRl7KNZDpT7XnHucEOxtN3c2Prw90uhrCW1LBdlrMdGmkpDzpUTSD%2F3P%2Bt%2Fz4viGwa5QfPphV4ZS5iNtJr4CDScD6lg8Q%2BdP6YEqVgvETKhOobNdc4qnlLUK6wnI82ZvQ4sgilx694kKRqNrtlrEpMnADGQEk4%2BZ3bI1SpLxlzMpZflmtwFksgkZH6uFDo7TWU9sNLHMfLIsS8SeRMMBNBpzWqWYXp7XnhH5HNxwYQBnEGf0FqRp%2FGZmE183RoO3g8%2FBcEuMVp%2FLTYAhw2X3L36Zk%2BB55XeHKQiaRG9r3AfAcXUsO8rKh5JdmogJZbGyncEwbliP282rmaS%2F4cRhi6BNQ4aNAZ6XrqlP3U4gr%2BCAOxP5bxMqiLMzactJdCOYI4NkznvjLXrr1uzqnI5ZfxYTSWnlGL1POZRBlLEwCPrbwZWwL%2Fw0o4Tw7kBqT0pLk8GZ80whHkkiA1mdT2lZulGOGP3sD%2FvGWKpGU5SVjwftDc7rv%2F5542Bv3fvuS9zp7te0W840nXhFKke%2F%2FikYhmJtgu5yliCJgCPi%2BNfvvuiOdwvG5CdA%2BSTgbqeT%2ByqUagzUMJdhEpD79LycF3OrjXujrjLrm%2FG%2BpRowcGUMA8FLDvXJ1Pa0ChUEKs1d1pfKZrgnmeeLDAmjlOtqg5RrtHGN4cvuiNdKi5nNQPLDDCka1Ue7yrYQP%2F7wWoMaJ2mLh8%2BesROcjHfcTXKqT3SlFAXocZeyGwkba8zuZnkaA89eoysYCiQxgvTn5HCJBDNi8ATCn8D7RitGlfyBG1zKPc%2BQBfacpPSR9ZPn2d2xBWCzuX7vXqWmrpFalDyM%2BqpnbH%2BCuL6iGGKepCXNe0YnZRob5UaVxRYlqkZhkS93TBxF9h87D3gzDEUuXbAaV7m6zJKI%2FL1U9pReCBdlNFQlo4S9GY9VGlZ8YlOw4kO77hmT14AZqc3CnJsudECdl78urzbd2fwowmArQ2LSPVKUwJr9DiOvZp9rMIi4mjKJMukACUvf1q2WrPSomKiSt3aSSprdA0GpdFNNTnpiREzSf2UnpXgod0JS7PlwfO6DSpwpWShMpKWtTf8zu7RovHqCEZw52kafXO81f2vRTm3ngq8WW5mI%2BeRYmtnFfPFan4f%2B1XrmVU7p2lzqnTRr2pDNmbzImREKKKMp4C2THZtv9f11nQtGQE5vMIu3B0FU8nTeO%2B8NTkFFT36Xklo%2F8SW7qGoqs2Nrl%2BqeaJKPJm2%2FVjc1%2FuSl0a66NapiBmnDcb8rS%2F8fSJ1CNhobjSIo5dPz%2BKk5aW4NIVlvQuExGpT5DHKLUcUX2ZU%2FeVeGq4KMhpY0ilUgafbxaHY6yMbI4%2Fca49daIWIKJjNoFxa8fx%2BFz6PYl%2FnC73TkVxDU5VR164MvRN2xMSYhk2buvGWWfWyu4SQqkRFa0BBlph7LVlLwnHCzmaAEa5Ryv5fyURHTenbLksJQVE%2BOrtWC23%2Bqrby8Ke0mZSaxIgKZqZMi08Hwstv3BeGEGqN6TuWuiCvABL3jJQsCguGB5BvxacwRKMZUTKbcSqEyrxRhOIeg%2FdFudK%2FYSlmoNghLr1A3XLOkRZdCJqQQZFwn5k1aNko810%2FZvc29TItLQOTuXjeJSss8WAWg3LJ5r7ustq27LO%2F%2FSjka9Mzwb%2F4qtqOK19nD0%2BUcIZo3rhKwKOvMsgYwfycOtydzTS7Fo3nfQRCOL6XDujwTlNc9LNwtGdfSSB3yDBlOpFOTs7hQch6PPA8iDhMM69Ht6FzOYa7mWLVNPCDZ5cYN8skiqcOSIj%2BTSpSiuBEqooggTINox5qznyjijAduZPg%2BH1g3TNjlpN2Ll6MPB6nVZVAmesnuQguSE2zksO33N0aHQs9%2BH0ubLIGReonpNj95bd1oieJuJxhu9Hp5NDstyUwUq8a%2BRRIv3SbAupQQTr8wEKXNzRmHgwniqjh0TIyaNxkHgaEpQz3u3DwqvBBXG7208O94ynzqAKw9TteTg6uyGvJfRrUMChipsxjjBZYPSBCzDDCTYfQKH8sWhGT0lehPipTlHKzYKwyYq89TXwxCVxUhFH4SbQ%2FBRbWkXYpKRYuwUEJSqzE5eAXXgsvIsoZmhanElScrB77TdgH6VEW8mZcxtwUyj0FL71IlrFbqWhGTvUz4q3yW%2BobkgV9X6t%2B8MsO150mqYnSKxGxPFbisx8YzZ8q2ljPGs8jUVksJPmM%2Bnf8zaaa4nTFH%2FMQ%2Bj5YCl9jiyuQYyUJvuYlrSXQ6vsPLjMw0%2Bdf8qEkm9Zd948TL2YhuqEdJRHqb3DWRf46ZmUsSB3lu8oLXGURXvQJ%2F2LsRRrFe9jAqchgq1%2F550A%2BGfk80UJeuvQv%2Fk7qF9XkwHN54%2FulgPMoMLK9gdbrhqJv4s0ef5feklPRdUDTHOX2a08XgTP0ImevOZnKS%2Be4kPRSqYqE0Zq5HdCNZbZ3E2o8x0EwQUHgsmB%2BY0e6P%2BWKMrL78nZI1yId5O6UuwokXgdrQrnip9spvy1z%2FuGp7ZuSh%2F9nzpXc3vgN34332%2B%2FGnxfSdvUu%2F371S9c%2B97ih7iTTZvjhfEIAffa1LjrmUJh7JGVUa3VXQ7p51gw4cNEl3m26H2SFCgaL4c3lyC9778r4z3DjubPudJJNwN6Z%2B2%2FjuKhoyy9lYphjOWUtacMGVARhPy3qZflF7W5SYkE7GHtzeyjtAn58tYB6WrGESDngmCXk%2F7%2BX65iycv22OEcNrOjDoG%2BSYUPkHSApkkpTnaNxGoGTzVtaQ4LZW2sqExHiM%2FQjajS8%2F76V%2FUTXe3sfQGY7%2BvLmTPVHZrm39zywc8j2Em8j6tHBZ2ktSA6tURuc1YJZriXA7QePAsz97nY4qnay3qesVjWpzs0xQS9rmrya28mT%2Fl8gB7d3qz8lABUCPaFcEnhDNb44qgln3RfZ1Iy2BSZVI6fdLMozaeYZucH3l9zv7w63eoB%2FpRu04xBD0zmoC8UoRWvfaPG3LRX%2B1TG9qY5wcUkxD7Up0zuapcZXLmmcG8pUt4BntEkE0iSml3hZmLLR5WMXLU%2F1YMOiJRZ%2BZsyk7nIjkYEbzmJTEYc08NL6GpaiBm8OZHO%2FmwcF6kmvs%2FSo7%2Faqrb6SJ9X5Uv2U0uHou1ICgJ5N0%2FHR2zzsMguTb1yofp5H3GasUZK0Rb%2FS6QoCEpPxOfivBzr6gT6%2FlUaeVMvU06TNbgKwTyC9rB%2F32zX4%2FYpg58froaQwY%2FyyhcUOds1%2F1hV04hyZ6C3RZtpAfBlYZyP1RmAqvtjj8Qec%2F4%2BcoSklbaBVHj0R5V%2Fw0j4Ol%2B3wZp63rYaKrirL6mB4inyXcgYVZl2FinjbMHzVvz%2FHQ2YVF%2B7ZOrgC8Ye0SjqZXb1kl%2F5CoMzD25EvCyEi%2BY5xTJ3PPl5Ya8j9aP1CWB9%2FtS6BEK51CR2v0R08NEM14wTDww4HQ9OSXRGCt%2FagBqLjfj7LXa1kIatnGcnjRWP5AiGAZnOqLaJ75aTTyPsasybHI%2B739lrosChLkD28uTwe9eq0%2F4PeUonqdf0my8H%2FZPZK3Jl5SbL9V31tPDtpF7zdUoFnzteIp%2BlF%2FP2HJZXpf9cbnQBWSht3hxk5yU59ZflHftxt7P3%2FY%2BLkp79m2dvY%2F7Mmb9bUtWUpOySRVdUbKIr1E7%2BmXu6fzXqfb8W4GY5nzGH2syesN%2FM6CLlmUCqv4I89vapmp37%2Fd2N07av7lqKWBUAkZnW4o%2FYAb45E4IyOx%2BLj6l7q9IfTb90lRs9o8KetGsjZUEmhag44oNipw8KEfEVtHUtt6JDXmKRkL0T2xVX%2Fwiy45cyCgW%2FhbvT94%2FiYpQzP33UKXtNdo2VZLU12EnSKf1t%2Bsq%2ByPN8%2Frx8KafH7yTFXgo93Jlxprkhqf08ox7TA8FFauPOrrstiR%2FAR5J6hBGMLMRfW4CtRIVvDpn3XPx0PfKEovdLtwrOhR7rcsDCQTpD8HPeV9EY%2FE1rXHYcjGK1GyZ2lx7UdzlFYr%2FmbDeuYLJQZzMbY%2FzdJSVRH3BqNkmxJdB3z4LS3xrnxgZHOFMRWyzhPcqae9Qfv3JL1H%2Fcbmk1SqtlSdfdXCuMX8zKt5lLXqts9040jXVl9fe5N5ZAy1zm1SGs7XC%2BbUGYVA4lmBeQBj%2B5QlitEFg0iwkJSPRjY%2BzICK%2Fsi8%2FHqWWaVfs%2F1yV5tPq1pnAx1qgNqO31OFmk7jQozisCb0F9lxMolbOR0jbIpBo42zWc8J4SSLfpOAIlFvzkK3AbnpY3THt1gEewifLcyptId6vaVeRmX6s5St3wq91sR5%2FHgSuSYgLtclz9gfvjVoPfmyq1B4laoVcdHY98k1P0XXUXiA0Z18Y56hbAv6cYd0SuJpBESnZssCzumMgJ2SfjRHg77mQVMKN%2B2pX9LthbHM9PJHvba02HjZWJQVqS4Ig5pXSzGun1z4giRlNCHtzT%2BpnDfy%2B6iemqwPmE4SDZ98dEnI0FHgdxofP%2FbLlFhbfvkyAwxD18StibeQoNUeO%2BObmVf1AWx7xg2eSVYYKeVCfeQJEds8Xuw6WTaZgEx31h0G%2Bsb3esoc5vWkc4BbJ7HpuE0jfvCGP1j3WuZGR%2B80XMkUjTY6yMzvomLTyeFK%2B4HF%2BGdSQJtricPgyJWTCSkjjtS6gEI7OhtHqXDmi4iW2O2PlfYCo5ex4%2FuX7qi41m1AGA8j87t0Xrrk%2B0fZT4ZRc1h79Y%2BT5rnfvTdmiwtYJQEC7JGXnxnNjTl4ydev9OfNJDyb6lu3WaEJvmOWEX0RR7ekg6XgJAEIa%2F6YHDDJM0SdlVKSD7bsfzo%2By0qW5JsheTmJstezyNESDW18eyOB2PrNDk1eqt7Y6%2FyQTaIgLJ7QW5Di7OZ%2BICMauhPlLZqUJ7A0r6bMgqN8KjL7MD%2Bh5vj3rkxbiAdMAo8yqUz2zAyZJSGBN5R%2Fk7MJ8o9x%2FI7lP%2BRk9exDocgsZjOL05Vle%2FzhdcaonzNir89eZ9aZN7RASsP4kFCtBT4DSckmb9%2FyP4mSboKw21S0nxAN88WqjVJIkf8A00Q7o2%2Fmanjmk8HRJt3xR%2FmwTlpnZiiSfWVlA5mxpmEADA6nU83HmEjiVg59OD5NtG%2FIpFNgkk9IQl6b5ukto6g80ZYlqsJ0YvvXbJnFFR6z3ujDQMVkR470AGSSLtAQ%2BAyeeWP%2F5mOHkCnkwQIQ%2F7S0V2pAEr80k5eywcsE5kZLDMPJL%2BcApctMVimdXHWyMAqUvg3xJrO5ketmAuUr4hAdU%2F6HvpHlUf6oVzbMYZB3%2BKBkPseZYCj5Lqd%2Bkpj57gcqwk%2FO9RGGmifw8pz8g06n4%2BZlVC87VszzzSUgXqjJuZOyEOiTrkTy2bmH3pvMR2InMDtd0yGnWfqpWMd1GZfi1PyxCpVZWHp3HnmULv3r5BII%2BAxg9CfW8NTV%2B0s%2Fe2sg5nsKjIg0j7uY13XBt8USHpLVGjJcLbYzJgp1BYoAQgl2%2FUuO7hebo5EEBq0UZUQ%2BoBzurUlMjjQfQQeSgnNVAELXcgyAoklHJTMO0BAz2MzuRn7%2BCv0O5F7w2UhoxYTnfF83X5zqw5F8bDl%2Fx9NBT5LL1fBcAnbO7sbm0Ddr1VCXXCfShCmIJkDPx04Xkpm1zO6nxaQyY6rbL7lLYddvjZ5666cnRvarED9p%2FmLsMdDR6Ku4MpwMuPfGMgtdNL7jmTbplRqmS%2BRw1H5n%2F4yTdPzjfW8cHgSXvjROh5C%2FRmk3KnUtNW7SRDg4DtA542Es9Hesqztj9pq4tK7SGwCqVmwmem5uUzqoWc4WtU5qRndDlSy9qzxEAuAUATxTBG7vpOWmTgWdYJLm9qlHOcmT6Zp0akfU0MVEw2kEOc3zmAhPnwRaYZT%2BRsgthtJGdcX5dGcQ7U4dfKlXwyy1PH09jt2CQSqtcaaFThuNi2zWeJFcjbDp8JdB9h4U8igbw3MXlxNONpMy5%2FZAm1qbl2uXR636kRRMFCh5KQY2RCcy7owv00Y%2BbF3kXWUhxO3pdYB5DcNxWoT%2BhAOrSijFHpFTmfXGRs%2FT59qnc%2FmqWfvUzixyWUW8e5w8J0tpjQBZ1sWROB0J0BzdrEUE%2BYvDPIC7MJMLouuJhsGsgCST28rA5goa%2B5Vod%2FG8OVI%2BrYyRATqqdxcBoIt0uZzOZr9T1dnM8tA4XGaEOPBXoPGJlGVIorOe8m7lInbm2WqL42HyJYNOu7KfB7NEceTQQy4swd2T6itS%2FTZ%2Bz9VeJxGqqdtGOzGPBsYnbzJUeZqoC1iGnmoOmkO%2BBkgRHmfEWJ7o4dPiU0Ktj5%2BlxamwH3x2zCYLwGwYSmeA0aIcTDnWVmr4tXuDMFCW38RbtkagTtUNk4yTebHgVMRPRxx7k2eMzBTZCeqZd1qNle3kVf749DdQNn8Ev26Rcz%2BAMWjaOo%2FQIdvOEGU5nh2T2pbpBc56FGPGHdW0zVTGSEo8tsdDpeVHDC35VWIuyQQxGsX%2FyjcGVL3duFE%2BrUmwGuN%2BeNE9G7HmBWm9Z1bZrXdHQXSJOuPFUG8sfj4d%2FdWfB2Llljjy36o9U96nTbO0u7sQVXYVlqaUA7E5AAHrgSf5i3OZk4t2r2%2BTxCjKFJRI1mO8URfH1XUT3SutnmB%2BjkU20WuI3MATJEJGqVDVS4whSXBbBl5z1L8kr9hi2wdDWt3110Xvc7ejvxgRFUb16t99MVM77uZ%2BRca8GKrB0ol6%2BYlEusepr67Oq8YakcDukX%2Biezqi02RGmmcxsvNlnAn%2B9QuNRb7tusJInr4FTMJ8RYEPnhQKkMLGmryXv4NP4x6a6mpPBYnE%2F37mPa0p9qhcGupNKjjVpcg%2FjPsyhbvzR3VD8WntKVCNxK7FLpGsnpi%2FS5Zly6OUu774fCtnUEajh4Sf9pCcXivAOcJabVrSo4yfxrKHxQ5%2BTX6%2B3tn5kYVEfjA4rr%2F9R28peCEhIM9MtvGDt%2BJMUrWrwUgIsa4gqm7%2FrNsXg8rvfMh8Fv%2FGk9%2BhN%2BcZXfi6mFGYyTe00IdNTkBVUefzuqkY1oznvIzxSTnPUTnViSnPZPhsvSh6%2FfDph%2F7v%2FcHnvpGuGJ1hk7eCswlWe9lJb6xnS1iS3qTYEMgHjlRTMzqvogn0xKQpmYnyllU30tLdo6SOl85tT%2B4Q1HXSK%2BmKtcMMrLZYQbRO%2FFGXOLgJU97Um5TI0WuL3zHrxR4Nb2BiYBLTiVChblIg5m%2B6Wu3Vg5Q6%2FJP3k4cjqMmaYChVF0pC68pxlxdCQ%2FTHlnrlvlDohDe7m6lOXZjRlCmhaPSOrllQ5SwvqKErKqqvwOfOYn5LyuZMymp9aF4mLrfi0oBUqT%2FNKvRoCTGSqJ5Jh3Z2G8QzT1hehi3m0QQ8IHz0ec1fJhiv2pQ6kx9x6v4j6xZIWKJuORrIW2agnZJFudDSlPPMvf848hjNlnmb8KvMm1jZQJfe5J%2F0RpbO78m0EBSuIp4MTVSyeG1Fo3Uh7mDcR6mE0bclVHXP9Ffj7n2sl8IMzTz0OSMwQWF0FTBzTkGHBHcqUc3iyMl%2BHlphLu6%2FebOeEzaMMLBuogOME582%2BCZO5l%2FPsQmT730uyoKn2hpcXESrjTSq9UR7h00i%2Bjsc7PhDTYyAySJkcELLMId8a8Bmpj4oXeAzNZEwlE544HcFo1TodkEXaoNPZi4qsxqCi6I9oUTgb%2BNwJLPNjCuWkigUGuGVjYRfMnCyu8BRb0W7BeURnrL3lHmzBOV2fZMgh2AuvmfT4ol47UzUtcj1GZpmGt320RR9KERkwB2R9KXhZIkfyGAAuymqCoSYn2FLXqAbTFfy7nacxGbdf9A3WnKYgUoI2J7EsmFzzelnvlh4dJdV6pSqZgbdunpfXQJ%2B%2FUcz9bif3DGajygmt2y93rkwccomK0RLCKPqLq%2BTXvJBve7Pe6fow%2BeSg%2FlG8q50OZymvyfxaeOZ4Nh%2BblQgGi8xU4U0PW3kmp9Rc9OQTbvONVSpCIH8%2FTPlgbCOk%2BtnIKzanOk0fybfaabnYCqrsgY9uXdoD49Pg1DogGEgfu1sin%2BrTzWpjc0lWnm3W7RERz4dRw6T%2FFL6zI%2BvOv7I%2BGy2IIVLla8TRwveqrul0VDy35DTGp4Mo5skmLhQxbHxWKX%2BpQMSyOPZoyRC9WE%2Fwdnqqm4Bc9%2Fglr9qSJ6nbmL6WTIr32tGg2okgEvK%2FcjZmLlYkcEDvcuvB8y4cyzlBtDng%2BKrk5QWM7dC42XUmNj5IpC27iUbnAB7l8%2BtlEIdY1re7ZLsM5kGpLeZn42rxWAI2yv41B2Mw96NZ%2FRteEeD9HfPP%2Fdlyo9YnsCjYI4C17%2BCGX%2BVF%2BwhNuH1kcwN4IRsLrq9jqBInRiO7jko41nLL1AEJMdnKdcfFQ%2FY7wcyJelmMB5Gl5UVUYSetkPEOuPhVJUegRFZR0D853uJl1NWnA2GEn3ytI%2BH3dGNN%2ByGv2fvcvPZi1zL%2Ftz9vbugx5848tFFoPcg%2BroUXcf6pAFy9g%2B4kTX2s7VVHBzG2bpDmbJ44vAU3SR%2BquQfTVXdfj8Yyla8SUnXM%2FklZj3xXID7xHqSbNeQ%2F5auSdwykTJG%2FQmjmkOU6%2F8lecuvSydfrvbWmc6YVWQyqEm0mYbSw2FjcPCl9%2FQmCKkDNVd4pZDHc2FHs54vz1JIDTs2TLZ279H%2B9r5sdjn4FH9yTRfmWlpqLHJGlQyY504xjAzeMt8qSCvJG2pCNk4QL5poEhZnUWbEPCwgqI1ecAEZ905G1vEyAYlw4%2FIsdlhFxyCvRJtRujyqVxTUx4K%2F7uuyFgQPaT2ouIxYPalrZHbCM8Wfoel3U9EuC8norxCRidJDlHEmswodP0YVOviwYkyjzIfnfTBLd0Rf0OgPPrOajz8BtPCB9%2FtvB36HZ71MDW8ybHGo039KfUxW4Q6TkYFbHxi32Q%2BKpBWYBoNRNsXHstyMgqGLbApy9zs3hyNZDVzFXGW5M3gVSKkZdB2onlG33xG4EEpu85NUpIXGKyvO12vb%2B%2B9iRi9RGnRkASKxCm2J2mVsBn0gKX2SWhXHDyKp%2BTqpMtr4%2BzgY3ujaYhJzWpgbJccoeNEYSZYRP%2FKTjvQwOJdYSUrGsBogaa0qFTbOBo10qSGk34MQWdw0O2xU9C%2FXaz0YfreUE7ytJXdSO8loKmYma%2BjJr6jFRfZOg2SxsqpPkQjvxGycRDGRcDq69yLo9drsJBejLesks58rFYxsRN6X5J%2B2tJ70prrZ5CTukmnaGPqf0y2E%2B9o4lSW1VAU8L7vFugZwIzZ5QTmXaMfie3GksaltqZh6%2Ftc5oBHft9I%2BAyWuap%2BDIGptptcrFKRSUzadd3qtkKlp21%2F9PFFc0AKVARntOIXLWCYtaoxkUjfpR9jyfZFoYNP51M%2BuJaZN9Sqq7z5Hq7Ygd026H31FqKJf%2BkijRL06cWSEmtJUZykxAJlRwI3qEEkn%2B0VWo5l3nPxiKU6UtEmzSdUj5NAkhEAxeGI7%2BxO1P%2BLnRTuY%2BnNYdk4%2Fk5VjbJ%2FKlVPnOlOUdKIb7nwopPd7VZl14%2F1uParRCrYnenGccfpsSuFZO1Eg5LXRunP2huXEHpKco7pA2W3K7x4DBexu9v2OSPavqwJCjUAVmFazTTKkLdaDiSxmQyBc5ZgZ%2BajK6%2BCGKQzRAyAKHo9OJ6JETIZ5xEqmiIsMRx%2FOyzbAfEtaz7aZtVEVpYToKdTv%2B2cQDJWMmHxv8HlW89KDxJ%2FrjPNblgrJX2WoBp%2BUGRpVXwRQt0%2Bl9%2BYT98jo%2BTMfeIAIIGTdPkVXpdOXdQWLVX5O2pLEPvuFUKr6%2BC1TKqw1KlUvYcT0epHyKje640kX5zDo3Ygd9T4tLYs%2BVmPSUp5S%2B5oz9mLCn4GTP2fx9MRJTW8%2Bx%2Fw13F%2FL87CFFAA5b1ghZQ4fr7IcOZgOTAeTeC9OHxxkM%2BYSePvmGXVGnhDylFvs1peROT9PsU4VUvIyq6%2FSetOm2kbeGJIYzhZrPOQdkfVsGcqrQ1tr1sfGTzmTQTMmAUk6aXSC0%2FF5fJcyOcjspJgl1rm34o4PGPpnQYHxmPmeGS72SR4qZU60j3%2FnzaKrFq8zXExQEt2oweB3%2FyJgWx8I4mRpJJHpz7555vdv9saXp8Fw%2F%2ByoexmEGG7DBBE6uuQUcq2H%2BYqren0s2p7YKwB3guBqZxgE%2FwjqaRcXto%2F4QwST0VlzHfE2eUo%2FYpDGvl6rzwbUzc%2BmpNGZfvB5Vyw%2BThGOnIeZ5lHN%2FEZwLb8HE5oVw8CIyclVnyqwtdQfpMu2UuiIAZD%2FCwYl4w6tCBAWXep1TxcSU2ZhqS2eyT4SCcPg72MhAlry8%2BytVntweTnoy7VFs9QKjVmrx%2Bufj%2FFhbHlaInapnfdRhg97282Dw639g2Zrd7u5d9Q6kEeqdrzx%2FL%2F85%2F%2F4%2BHG8uLq0%2BFz9XN5RP1biX1ejX18sqR%2BLS62TMp0Wn786eWYGOCKwPr1sGd98q0VjrMZDRT82ox8v4h8eGGQNDLIc%2FWhGP16aD1cXzQlWlz3ychP0SJpGP7aih2vRb9EaVzZMcFejeVdfEuC3zX5iKWjeHQL3JuiYQOERdMUT73jmlBq4eJw1j%2F2M10p%2F5Y0JDIt0YS5tXACqBpUbhHJ%2BJPiJMboS%2F0Z7NMmoMag%2FOgDu0J%2Fu6I652%2FFW6lHcB9VjrwGErSx6tCP9tYmo7pVHYH1BzkmM8lcE5DWHHlu0TZP9SvcMvrRhi%2FagU%2Bvf8PGFHZuIWjYJJcHzt0o5zQoZJoYxZ7vil9vmU01nBA%2BrCavKcr%2B4uq9UeAxm%2BszkiojtXgYjH7DNl%2BQErZDZV0gThgyywKjJKmXkrxiRQkaeA9YyoSvEJhJWYBI74%2B0rW%2BBEJ%2FtHm9JTtwYeMsbQJO9WCVDbALYc3uWyGgem0ySY0jhH69YHeQt1JBJBbzJlJC%2FQYaKSpElOEcZCYSQ8Bnj13kOmox9S9rvovlBKH6X7g%2B5OcD%2BO6cn2xr%2B9zD8GbFrCU%2FU7uCPTouSRrMn53DMpiEFcRUKZaUIxNgocBSYxNxF0Wi8pSm5k%2FVpveEn2q1o%2BMPMlabFLAaX41bo%2FGYUyyFkulygwummBdQJV4F3zaINoNlQxeJbRFZCOE96Eo%2BCypX6PvxtaQ1iM6WOVAEcgZkeQyBe2zXRoarn96N3X9Fq5podzjVAGpFmiMetztALIjOm0a0ife9k67w1O%2FV4rvmAnt%2BxiECl2vvz6x2AQXHri%2F9FA%2Fko1MMo7mNJCmqyZCFylMFNdEfLVZuF5LTxzlarHjFdaztS006%2BRFa6WHZSIDI2oJbK0F4gHYC%2FKkuVMbJOWryqFglgejKZXSI9Vhx7QbNCnYHJ%2FK0lo4kOGF7NCieVOzWd6wNkGE3mwukkntLlsoIq%2BDKbgXCc%2BgVPORI3JyRNy%2FwncS4rLFTLTUtn%2ByGmnrY%2BXaPPo0JSt70ArjzA3zshtduEKGCZRF93dV1ZmQzCkQXR3ZlF%2F7BL5gbwNkJFwB9%2B9Qb9kAY1yBbrrNrCJ34CSCXRtcdcfBHsDkaCNyK2jWZmiQ3%2FqE8HKjwfPHH66pGfbIktB%2FJE1cfAW0BVQ3YzKI0oNhFeX10yo8Y1CE1YOaiGjVYr4VwRb2HXhPj3tR%2FxkTCXAxo1teihNoE%2BSKYmVDJqji8Cxmd%2Bc9Cd2qqYrJs0gUFAaTcvsnGd6lDwPQm%2BVfrBHaS4JRyvAJWH%2FAlyS4pZOvEj6b5tgOKGo8KDVwu0ymsNiqHOIMhvKnVikiXSndi89UNTc3yHzaq6K4nDs4StzplUShWHMZROspYihVBa0iuy0ktNrKotNA8036aDI6mJcmAoKakxsIwibiJBeEXqkktAaWEWsmds5MCy6SQhjsvDjcVkTidyDXHYmZADrftVOwaxMc03Yg1rR9EXt2FXqNl82iYarQVOCRvvRljR4TYGpZl7dkgVUCWaKOwGmAw2vkPnqaJSWmgpE5YAOb0h6jBVzJykChmpvlF%2BxXIUZIho7pbdsLy3ydEr6LHvUk4SLki4FRkOUbRJnEfRHaUm0%2FZiAodk3Vg8SE3M0MAE3lpLABgEx3jU6Nl4ioesiuXsU0dBHWKnt7hBlWSW0q5vSnEHa37Lr939ybNobzNyi6ssKjRC%2BAGAwhYn6lbGmQgelEYviYrna0SB9eICusblMacAqyihoM5yCsQyLmNSZUdSKom6Jba9AU5gVZokitgeh54fdvueP%2FL536ofBj6vldlIIQqO7S7xh0ZOzB9dXXm9wLv9fWvSuBp89CU749%2BHIkyBdX%2FZKw6P7ugGTtGaEnfsCwLWqc4Gp%2BxSGXaGnFBtRHtlzqqlQ9YcISRgjZCyCalhb9zcTaUIVI%2BihsJkI0ItAQFp9QVZGQ%2FKUh5YIaGPjrfAwpZV85ymKxB3dB3UJ0EKlhGpBP4JzwbOuzAlxjpymDHFq4dTIeFhdQk2ZqllSNky7q1xxhYkChTONC%2FvGnPVmu%2BlGwS5wW4O0LOqCXKV%2BTTotJXCLNypxSE65CGi%2BQoc9hd6WwkaVZrovNMq%2BiBZhPcIwb98lDwSnqlDnAVLzdcvlKQ8QTiqhL6kyv2V9CRfuMioB0sWpT60Q5FLBpOWSakMDU1CPJKmIBawt593nt67IRC%2FQYEiTskGWc3Rnt3gHbsROYrX5LnRliJ1oCwJaMM7Ql8%2BVWjTPTwFZRfXlF2QtMXE1zR%2FMsoaeAHoWWcYwBHuDgL0JAKV3jzCfxrld1G6kTJjR2m%2FhoF%2B6c6oTFe8bPcSabiGgCqsgNIpclSYCAXUX4tM5OphO%2BgosIgnyIUC5%2BpoPKLSwmB8fpp3Qh%2FfAsmw%2Begc9ao1sHTUprFrCdFAUYIfw0FuDKIVlEKJ%2FvWzIzpgPtJLk1qqUwPvLtCXQk%2BgUDyRPCQy%2B0jnl2O6cjI4y7W4XTzCePZ4pTPYbtLSH3cvHWiOdgmU5UYsVa%2FvXndEADaz9WhZFRp94au6yIKpt7JlwdKKVwTgLE%2B3U81UyvIMNB%2BjvsRlflK5sZouVsyFUWINaSE2hyQ9MHyd6PEuEhbUccOYdTSNcQoPSXUK0xs522WvFxKiG0pdRBVaZKN0XxoEliGajjlUqzSC7YZlbhUErG5ecdl7orKI6O6VmJr1RlLO4XlPAbQ0nhBa%2BjRNh04H8KHmymQUK0wOpw0en6RW%2F2EJaWm8l0JR%2BmIpc3O53uB4z7fUalj3r3rHa2xx07GnvdsDRKNVRrakAwgs4IR0u79DTsjR5bczcWSGrsZjtWh7ikwHI1cao2VmHDB7ewYBlSeiRt2TGuNQpmhY%2FxVcGgaF%2Bmxk4gJ0sv0pgsttcxKvHxCKdnjhCoDqJA4XL5GzZbBcH7Y5d6dLGpfXqFn0J47gwFcGiDCWM1iXewPgXfkronKlxVKeksNqsmNLZD%2FRg48Jd1jbovEGrxOJmYrEwykkmy%2FnVzdTZ6wArzjtBOKaD0VFWyDEqqva43OrC9XTgkijYlFKhJwFafNQDwcqTocOInYxF4XXBhWaa7tfmLAZKwnShy8VmIWDdzX0YrMK596%2F2xhmcYtpraLZBXfQ690ELqHfOg9q1PMswOGQyOZAxZcxiph6uKZdLY6gbCBVFAxklQCupWEG1xcnJ6g6atSAmeWe7NzZL0CjbKl5slSDWEtTWLWklqLJBbQdWMsPl4jscNB9hMX8UliAS%2F4BJCpvggLGTRS%2FuWVxazBjT%2B%2FHPiEn7USI06SBfrPihWQgbk6dnLs6y88K7cbYjXNiXSnTm%2B%2FAyP3pUVOTVvq91Wo8N7b4CVlYaPw4urQdWdqbE6z3Q9KNSHioFpiyCHK4r4tO%2BSgiJsm16HYbSaEkHbbU7UXrVxc9wYdAqSt9xn7C4P2OG5Fj4Kp4lfecxatRTLvCfWof%2BOnFXXmu2OHCKFB4ikQV9beYF6ojyN%2BDlqwKJ5jZUUi78AsEC41XY5wHFKvVXvQAkw4pVPHBg330tpbH2iNaZc6%2BNbAzPCqRpRfDYw0xhumBIsriQ35TzEqeue6ETfY%2BBHltcHYLCMiW86GIcnWIVslxqsk82RTRGWNoIeVi2LgHD2mSWzcIpsNLNIoHQ4hSdqe%2FZRg%2BQCaBNdgoCUYOcHT%2FLbZGpA9sw5EgPrDUnv6Jh0DEqnFqxhpbGiA66%2FyYD46KJkMH0fO6XSeiGUsUJ5uFRM8n9mxOLoOUqjHc4ZwlbOcMD7wAN6MTvCpRBfBTQT3uDGq3FdrWu%2FB3gwjNRDkrVAlq7xfm6n5UFuNwobAJg9IQ%2FknmhtX5%2FgBa4%2Blh4ClvG2GwGNX%2FjdhY5fiylHQIDBQYU0BV5gSBPcJB6D1Uaoiy87hKK%2Bn1gmlClmlrhtZStk5rMS2vzUAqi5gdBEMughdY%2FriJhC9c7ZGU9jmQy95wDhy20ppsWjgRDip%2Fs6ZzNhfhqoP9vRXZqRfYxbURpffYRLmJatbaSJU3pq3YJVd%2B7n%2F9rRkwJJz5aLjvm0DdHYvkPfccAVislHl0c6V4mP%2BiWw%2FIhWDhWM2FpL%2BIMgHG6Ij%2FD6ZE2ysPoU85L%2BCgXx1NOUdoFUHbC6cIk0Invcv6mBZvq1DRrgdkuU840ndSk3K5iA6zskmysF96IjpvQ66gFyJEW6KBygMRkZxpZcEjfYhK5PbgE9G0tYV5iltyavGUHJIRABTNyluFgLJXB8BS4Z%2B83p1zLEprQoYYdzY9wCJLr7lPCS6UfjQDuEDKmyk3ZDIMd8pDyI1p1wiVR4J4Xz9wXOwA0HHik3WkEi7oPiE7%2FuFBR3LSs4khYJ2LZilPiwL1eJjFMZvMRHHRBFUsp0p1JFMvd27Leya%2FABTMdlgtfA8Y1QKiPE6o%2BFIXWWiePYZ345iHZJYYYeomWSoKKPmAVo7LoN6bdqZjdDkQMuqorgw%2BDihKlZKYEtID9TwgohgnzWxPND1bGtCxiqJCDzDTuhwpUMqOCIqbKuiZVrfOlSY3uV6%2BwdgQdidTYoxIoln%2FTMiBoD1azJJcrFpWC%2FS3J9EocRavbJmIwcUF11QWFlSzQPb%2FTAenUcfKVss9ZYIRpOcQAZJx556tGoUPppXimVwSTZfWvB1aZqOuJ%2BMmYGLUxEEuIp1oIWVSQFsgk7gGnhOJHBRPZgntgn7NbBOtg8ZhVtYgZuEBxIGCyjzYnL6XwktYQTPS4QudGPAMNOG6CMXnuFFkSxRZJnarU128PybsjrcqULYpCh5Stqbf8gaFHxHHv96%2FK4o5GMqFK6pCBUK11aFtu9Ns9uHGrQYwl9Ii9PrQJPOx4ue6I%2BXboVdvgVKW0KmUzmJ6xDJeU9imnpxUdp1UCqKCHNxkpTyWxJiYxqY8NBQCwkuTg6pjWNmkCKHCimu1E0ygaFdgoTmf10MB8A6asTLnq6bLHV2maBHVn2DiCTceijIiyQTomPd9UgaexY3zVt1IUwrBZk8xrSe6YoQzA0YSKsuSKoqnSDEeNwko1PEJ%2BVg1Ps9tKEUN1CMpuYf4GtLnIzuPg27dgmTCGRQv70AkdAtg0Yqmx9fghNInjHnwb97ak%2B%2FN0OCS%2FrFLEfmWKMYwvw7sz0GNbTQS7qgIwU%2BKg9PTfAgEQPdzpmqFl2rIpqFPmP8K16JkoeyC0yZpQYqYYsRVeIdEEp49aVLJOm5JkrZFFL2DQfbFpiNOq1YOOP%2FIrwQCzPVbArlDPkf7NFrW3UfvDOpfYoaFaH%2FJpuORufqVsq8DV2mkHrRTgWfh3ZmJtI%2F8MtLan5toPDD06BvftK3BIbmSHypbc%2BBiPdFl7kMCUc2%2FMFo6ElvUygKJ41lQ8X9kMMCwMiq6lCCOsaGy027zMi%2FUlAapsnYl7cIxRZ62zR4zt7Ezu7qKkb5bgQ53%2B9N0aWZlDSs9MFgFDB2twZfcFDCbVe59%2ByoykWUD4leaizQQV7tIaZepjoe1CY5XeOmX9bSl4Dt4%2BWDuBOqTRTlpT%2FNlpoOY53SZKLNBlbjHMinwQEHrlqfTZBP3xjbe4JdOKLDNBJZLu1urWb%2BGgP%2B0Y6RcDSw9BUEPfrWRBhPeBFsFJYTyAiTlvMnHSqi%2B0ENgimJ6x4RWwLmvKRKUush24wJdknVABmHw0bBuHjw1VrDSE6CzRwajfzP3QUmFXNt7gojnjsakNZUHelC5lJnKXQQf2NQMa%2FIecllI%2F7QeLgrk7tGA1HqyjFiVDh0Ov3ScwVgnvIFrNDJoew1xoNAmFOVJpDxpnZnoPbAqtU9a05Of62Nl%2BoLqOehHUEHWoC0L4zSo6D0zTKpweVBa0mXjYS0PvwG%2BgOqKTqKMfqLYs83JTGo3HJKylRIYhXMtL0B%2FHIl1kd8kpmKxYIvtDeOjqynVnNIDTUA1706VN9GPHoSluA8N5jAJQRyw6KIOkRgXrP9kpxvawrJNl2nnphDZhc28VY1cpeekD5FlAtFw4YGKJdaT3qKivaJtswhpYBo6m2uSodXrM4SzUykajAgx%2Bq92hI1swHdSyYO2cLmKmuDQFZP6V5ijg5VYZAs5RDGG0uLT1YBu0tByePCh2TRYfjeIUmoxxB5oB4eBgejXdvPYttY29RlAD17TtmR2tMXTidYBqQXKAKxqN4MQWrS87L7NYKDOnih49wSi6OksE3T%2BgZAZ6DZCm9aLkQ7tBGB8jd1RQnxSlDqptUuqgrtHSQWwTsmpS%2ByqKa9wD7ggLYrJtssm2ugYm0pkNlNK%2BCfRC306lgcfiyU5UX4a3Yqi%2BiTzPXEMrDMWOOVNyv7za0QjA7mEVxiZ28FOCKW0DkKbYvEKmBMu12UFN6PT0qC3CebXHxzPxh4Pg0OZz92w%2FsL5ceGX0eLm7kWycrWx%2By2LZRVCnhSXjtjSeXBJbqlVEqEFg2ZiEJVviYVg6WRx7LJOFOo%2FpIsrGRb8eeBE526w%2Fmz1dwKtZKX4KR%2FimrPBbEfSTA1kz%2BVhNpdDnnFpCR9SmoMwCKXyUqvQW7JCH1VQrfiBUsLtSO2haerLQYWfhMget%2FDEihqrl8VoeYSXjijDy7VVKfRSIKaH9VwM29YKUjH%2FgKO%2FDJgw%2Bevx8bRmYFSH066wNWNHi%2F5nLklWLwibqZ4P%2BgS2hKQPTj7CmbkWIIewP9yucb08DdVBboE1sJmLp%2FBcC58P6nKrZJMam9S3v6MfjLZpUEQ7%2Bu4TSTBD6GG8FzGSBtAN1w36zFX%2BqwSRMSP66v5v6VSOm%2BHdTK1rudGlTX10e%2FiyQRkU55UbLaD7KXKismRzUWSGHx6WMyixWjQeDy6UTPYKiKhXh4xsqSfAIMVLENe2ALh2noXabXj4DHD8tu5xqRyuMHGtaoUsbExqm%2FOyAfpoY9Ngoi0hDbPuoqCVScC%2FB%2BdpPHxeXlj31pz3ohyPv01rrvDc49Xst8fsouB61roaDq2A4uvFee7XPIdghWNo8uYFNz%2F4SAIcJFyIPWL4U5KhU%2BGo%2FXqXTbyFgiPiDVF7%2Byx1kIofIZzXRnmqwhe0LqOizCak6RI8KvIH8I2iZUKVHcOKgsBHfS3GFrTi6C4NGFajJCjg%2FjCUn1CKQeGtY%2Fg3UixgrtbjIqEuOhbmoX5qtaYXQF1HSoClfXssqOaHtPOgsfeZ1pOtGAoFj33K1lYFIbmjzKCFBxgrpB92jLrwshtD9uukmmskZJQkvjOelkSCqmmudwEOUUfi7bZR2odIL%2FTj0OJJzVNpopUuaSSTSxn6oX%2FcVwj0jYBvXpdYgLNJjcT%2FM5H4e%2FmyJxbbg60VeIkwexDHD%2BDtdtkaJBw4JA8ol%2FdUD9FxC6NCXttEmfxOKqco0wAUdA2x6W4UnqvNVyVFXq%2BSoifJUQDjDZCtK2DAjBbJLjRI0tnuIo3ge%2FrTBFHeDElcle0GwAA1JqwTcQdRKzxzVEShlUOxRXRttPl%2FMlPMStDHkU%2BcdYl9YCdpwh5BKVWgju6%2FXijamPyDpwQIqyBiCkoyVfIKRFEpX1u9HTFlP82H9ccz3A88RIkSrdEYJ95z0LCWtbHE2m%2F%2FX3c7B9aCgnUM9GS7qVowZlyuZ04WAsIOCElI82Iq5NKeMMTrv5PwzfZqWyEy0OzUwrGrWlFBQiwZW6nGQFWWnLy4dSs9E42EwMwaqLXhCGAaE5h10G1i0lhwEE2UA3w21XVdkBkq23svkqrd2Z5K1DAjYHWaxrZAOlP6aZEE02Qvy9tLJXmWhrzSEPi0qY02eECorxk8jvtBYX5wSikqsKFyXz8GKKg02FfIvzZbTjm3LJKHaDPaNuNdzWjHPty2LAWp5SOKzfdyAgFlc%2FFOzv9IxI9KSihmbLrQx5bwvEAFAro2dgQD5Ltr%2FtPAWx5NlC5EimaO2VwM95TK0cljpBVYDWqU%2BPZr8Qa9TVbORa2AUliBEqdECC3PmrqEO1VLx14Ls%2Bz7e7vevsBFY4vBkI%2FabH3bfHu3uea%2B9Ty9b4U04Ci5b6o3fH4XeM%2FmURfQvg9HFoKPeZaL9tnc6EwAlDcQTh8EobA3OWp%2F83jgIVcpAcBot6EdCIdwW%2BdztdwY6vaBAU6qaknwx7gN92EwE7K6k5G8LFDK7hWqclLh1GI2mA2Fsuk%2FsgmmX0WDOSUw%2BQX98Gba6gtyGZ347kPRDsLaMzjJLgiLw2ZhqE71zSKmxhCemlttmS14GZTKXgGXMdRjHhsIYQhRctblstBtoeeKSVhygYNim5RgoMTkEimz2%2FSsKDEzbta2XWXbRD2SJ6sFYSKqwFkvPF%2FQp0EVYjfPox7Z5Lm25Z1iVRl4Rl3uWUEEpjBH8FQyKEYcEK8S3sIVGC4kSkxHemuN7TfNLWBSEDAo92YsEbOi6Jj4T9slcyhEc0qkrAptqLzCSEv9mPdGPEaaSh2iRroUG3AgLYdGAHUKqBbaQTkEdtPCLv4jzUXlffl7oiKSec5vfqji6pwSbcjkYdbTxl%2BK5gHT6DUS5LA1uyhVaIt3WK5s2E2%2FHYcImekhtWZo9BA1qZ9nLmYgNJpLPURqzuiN1q%2F5IFsO4ARUkuNI6WikiT6y7Eq%2Bs5jCksCAmgWk1HngLlx4uqopSQXsPwuURQxgNXVrUTJYq1gAPNH%2FhInAGfqXTI%2BaBa7VPjsFPqQE7MQZnia5xUBQmngBMeKbLnTxbphNyErBsd4coYAHZv0bmtaR2FK71V1X8zLIkfMGMQIG%2FmeW8Z6wu2iz3jOYGwYQJxAAZqZJy8Ro%2FJZU45i53OX1Unai0TBUNw1Gqop%2BCmiUUFpHCLmeVNRnL5pGv0gQEWraFRi2piTu5Igi%2BkkNJnDrm4cFG9v3Ueg505CKdAnogctK50Q7Sowzp74UDTLYUlMLb8wrQH2PpTTRKRTrmfa0TX0Bw0MEna93wY1ZTIwZ%2BGoumX9lI1F2HgfcVKf9a9dBLVM6Q5d3QsKHVrQt30l1Pr0RTgCKe6SlMT39EYLuEmDXYZCaYrOJQisslhZo6h2HABVWTL562ho1Am3%2FJFiWgq15FMBU4y5WCVpqjVAMFvJ9EM6K%2BFkBZNiwVxDA1%2FlGsbKYO1Ur56PJUWGN32aqFiSJvBfWjrKCira9mEYWlO3RGM59PpRCWDTHGS7JFhuhN48exISXV7gfjQA%2BzavYxQ5v27exUesz4KeuPmdaEIIduEQGxOIvlugS%2BHmpeE9t2w30WENLu5M6T09cZow73Lr9p9%2Fj00UNPT5%2BLXJodoCy%2FiqR2WEOftnTPsg6Vwn4DKg4fMVebfC1dd7DekZ3hcYMBJzYv2d1ZcidLMWqcEIXc8FZxipyMM7S4Z1ojgu4LtOEoS3f2pjOMkCuuLIhf2vlQpR%2BHcTM4fZy2dt%2BCoURG3Symn%2Bx3Kq2hfmWqV0WZlV%2BLvHe4re5i%2FzKuT%2BUapWZ0Fq05%2BpR3TCu%2Fd9CgMB5973oczAyDDnSWRUXWG89EShpgLrMIZqjKT%2Fuwa5kls3mYld2%2Fe8NB41y2gI1EGNbjCoRyp0shm9aTNktn8ZQrc7%2BVBb%2BQU1GC7cMsonRCzeTaCS73p2ja0gsARMX4sYaX0X7SMkuTjc173OvZr%2BURH1oUQlilS6I05pD4Y3PfECcdr5VczZIeOLn9YaB3CbGU9X09Yv%2F%2BlPnc1GUMs5bQDQDbHTA9Jkp55U7pSqDH11BtXhWr525KmNxzSCgngGHZohnJjLg28weriNdUZKg7bI8WUtWA7cAsKFVZZBZGpVadqAOmCdY0dTo4GAUnN87wegkxtG1ZkKWZmwNC7Yl5FqKcfb5EgUTN4hq4pZziA1trs897gKvWIoEkjzIbFzmgsQ6CAt0OV371u9m7Q3CkZY0MSngyO5KV8qHSKoX7WmxeCkgHSDUo7vR3B80llZ7aS6gONTtntMM2%2BUF4a%2FK1ocLwUpbnILhRedfy6Co6vbsCeB%2BbXRj6mcBksVUwBVGY3MVUAd4zJUzE66opjx4Y62kgHQqEzoousNLbVdbIHZW8VELQe3nwojwuL3zfKyPuIywJiU3Fmjg7r4qcnsKBgeIRdnPxpS1nl7XQQbcRhLbzQtkoOTasWCvVnYiGgo04OhEMRDgrqkWOKdVz6MXDTXpCyGZZUOH0WdDCoE2ngpWXSw8EL6wTfd%2BBgXtf9ZQ51tDILcDZSzupERQwlekx7iCUYNCJRdQGtgiUa4Cv3Fdk3U5eEgObusihpT570Fy0SViqmB4UekKKZpPpuEQBeKnLh8i88tf6EG3D0iXYq2MDe8ncO1zrZ7Lvo6JrefcOL3WJUejhpWNmjRcG23oflVD6IqCj1Zce6khFCsxlemG2rKYMY3I2vvXCo9CAYWJuCe2duycG2vaTw0BfgYfVHXdQo6fE4e5bssULaAdae4lG2WJwqZiZ1jNQJV5X4fmkPIMyMAqoc4GEIoZzNRBSxhXvhK1Ar%2FWOvgUmzRDoh%2FtQagdz5jtoHyV9HjhauwMXsQbGxqyOnh6mKdDR6KZb3A62whd6MagOpz28bIEeEdDUhwkufiaDOkTqtds2%2BjGLYDMGzWLrsBNK5KktYKqb0Jsoj8pwh6iYTJxfOfQzoW166qnAgFrhI8Zh4bXMBKNUQSK2DpYC04nJRMJYgFmlewcNAxo3gOx%2FDS2Cpp%2FQMWFBqcnGwmOmsVlEzrFjjzT52pjxfSU64UtAMK4Rz074Ac4M%2BGfB62Q1pXSSv3O2FUt6eYw4d0klLUpp1IB49Itn9gNdEpQVj3dJFfmo1yzdofWjleyZg8amp%2F5GCjYNdDctLWeyQFo%2FIgam7NWRaROTbWDf9zVAByhYUHFaG8FsaU89tIFG%2BQM0mGcQIMWOSqRVsdJ6s9yl6VDhktz9wNBT3kG9XlPeUbCBhoM6JKA2rfLyOMSUQ8SERvSt31uHUzgogNBgphb2TBigLRRLUfKonJKT6zowpzxFHrsD7Dwo5d%2F3SLko%2BqoHRa4ElrDknBCbBANsXhLq8CTi2d3kKeGZdYep9E0PSs%2BLqMciISGiozzOb5VM%2FiTn4PS3oD0K9Sdgu9G3Xc0pmN6zit45ZGYtkTNFrVZKJDSaxFw23gxAg3mYlF04qLUFvsJFvJKY41MEIbcgY0H0tyVClFBe4W9ble4ItSmau4acx%2FTrs%2BxTFZRpUWuJnDAaTmcZwD%2BClgkDLfkVDIfsJL2FUMIh%2BmfGVklCqIqaZ4gRh7B6WUNVAzHzRbgkERJxgdPaYB7HfW%2BIJie6JB2toPdGHRgZ1YIs%2BZyrFE9f2QkpQAFUFaMCHClBRaaAqVWUVqhEogkK5CMcOSbblGmzBUh9WkAn6zvBdfvC758Hraue3w%2BdvkNeWiRDtdzi87OmA%2BpvoFDk7JjIwbFPas%2B%2BAqcSeh6Zm4L63a0eUljMz%2BYzrKQYVZFPsloS1l0%2BUzVTCCeT8Mg%2FHff8YaszaI8vg%2F4oJeLZizuqXlKTCVbWo1u8htACbVKHoOOU%2FIyd7jVbj%2Bg3%2BKGNoqnzVdVYgnEFiiCKezgRxW%2FJT54Uv3R7b4t3ubP%2B6JdbIPGZMl2kexV3Kn9DtTMq%2BmbtY2Jj7pnkMTBs56uMEj0SjNjSVpfN0dzjHUw1o0ExmifDDogNpkquRRTOhnvMu0SGgZooPJiPeUkOwROigug9WyEd4K2rr3S5OwRCeqQeI4eF60QhgRIpEWRM5FrSrnLoLH7E%2BKkyje4eisJ8E2iynb2SHxMrruzOMu3KWRF%2BxFv%2BLXF7Vl2l8EY%2BxiWtEBKlSsfj3xDqY6L5QI8R%2Bmb%2BhDhYUEDnpkFM6sWl4Jd0gJU1Zkv4jhz8guFF0Bn3gmHqD6xEuOiHBZI2opbTZTYwfRJiBZoCtL50Uoh4Mv7OBsNLfzQKOlnPaumz5p63YnM7II9x1adyMn7%2BPg6GN5y4NDkhLRUGFOnXtPTFXJvwRlYyC%2FHTaH4BYxsGyopMOBltw%2BBqMBy1TsfdXsc8nDBdpJpCCVU666FjCftTbZ5FpO4WT6dk9E2y4AqbW1AiYLfq5KGtOfm2oJ8t0R9el3%2FgLaj0bofdg%2B%2FCs7s9M2ONsluKKOrs3TCPAWThqyvuce%2FCBSWpQQsdXIsTISxRuJCccJrZygSRi4xzFRoZ5vf4T0m1MqDjj%2FyW3%2Fd7N2HXMcHSGiVGTSjVMVHmIZxCJwAtQwndyDAHyHq5ucrSD7QJholyb6pCFtVji6DZfQdnHhYo4rhBGCmrrd07tmaQ9MA81HQGFGWs6HvQD4s7q0nOzCn36dG2UITSMSnHoZKRchXIaqxqWIFCgTPcENISijcYj4xbojyVr27xMxAy9iIdj2nx1HAmRx86hrCjAOb60c8uPX5UOLOFb58fOKACpnhQm9Ti1nTP%2BIEnsWJMErMER%2FSg2UmtKeoKo8ouBhSmuqKLmJTimGykMWBqhty7EKcGPb2a7VBx0Ra6XiPQT3kUrVYA1NseCKOlSzS6mEIPtCTq%2FSCaBUy7t9X%2FfGg6%2BlZRuEpXBu0NyvGWEUj3Lhgew34w34yDB9JBAV8E7yYo4JN9QdeXvdZv4aDfug5bncFl67ozGrQ%2BK6%2FQ5xDhsGRu0QpVLBbRKMgflDTxLLhAZ3B1%2BfrKH11ch8U7IvJwuMpE6Hd1U2K17NwWD5%2FNSY2F2SLHAQV7chKydnW5aEnWuaj%2FlikHGkmSAj00Ba1SsIymQdpred%2BrOA8eogVkE%2BKD6JxBUPlWzw5iJiJtESpLbPjB4c8pc5EDAIrRYbZORAYkSGtsD0pUbawkwEGDLCZbKu5tMsfh%2BkHVgMNUsheIPhYRxLPzrjLuTXk0rRaRMKqKFkWOhzXvxmFPKW%2BH2RV0MJtKVdm%2BVbrEyRwTzmAVHCzikqzbIURF%2FepF1V2%2BRD6zRdhCfowVSUsQNtm%2BZGaq7xWOHlBccf5%2B2aOzQAwRldrlHvGM2KwtR41KQToCFBo0S8Ri3rCSPFTX3CIQQw%2FXckXwV05YlXABdvXOmS6No1XSBoFF2KzZEjR5l%2B1Sql1a7ltg9my9RmrYHfQ80PihpUpX6by9F3xNZWl%2FpSjtC8VNc5YczoNQZhfv9gGL01%2B6MVavNeRQluOBS7olh8%2B%2BCvilmB00NdrwVF22uVFtBTj0u4T1WsGdOilA0KfyCrhn3G%2BmPYt3Sldjzbx1bGbBxHTZgilrLF5tL9fpoROuSXIX5vaQPlDLwmwhGVPB5ZgZ1R5cXg3C7qg76Mdv7TlSq1C%2BUhPYps%2B6n0GsroD9sPovS7tVyqoTa6DDtHnA9460Kr2g8A6xS%2Br9w%2BJgJiUUlp37Qe14G%2BHcvWDltALlG9oI6gpFPjtcwuUrXW6VtTe%2BDYzA7jSq9t9Ic0HaQwn2WSyQcciy35b49lBBr0rD4iAPtnhojFF4qe92kZAvjLZYrUzzhzVdkNq4jwMxy2ZTXIsA%2Br1tla8ex8q%2BbnZdckmlPwZBwXb28j0SxCAPOuN0DrYodEWu5R%2BJR7L4KeuwOWg%2Bj2Od1BW0QTaLMqBv8Oi7L566m215%2FY9qgV%2Bp%2FPw6ecZ91wB6JKsmFZfwJ8WopwtKPgph4Zs2D4yDwpoBjRT%2Bt7OI424FdVg1gSn%2FnaVHRDiMc%2BDUkXzcwZIHj0uzpBTucHXfFhJwKDlU8iTCnBscDkeFHL95vBbAD2XM944YWy5pEy2JemT%2BWegHMW1YVZlZr%2FDW2KIFQmuU%2BCujLYdDVwlMU%2BsFs%2F%2FGUelbFw%2BzdTSgynhi0aSmr8ZtW%2FyayAwopkBu%2BCP2Hzwm7z81kooqwCsPZTlReIlhq%2FEKUwjv%2FdTMjm3SBGTsSKRrgfEQW06Vg7y9R4Q6fLDq0u%2F2MulQVDEl0OBLT8TTAONN1JCi9%2BL00PQLEsh9z%2B4m0PNJdWz3j0iVzqd29xV9nfgpoKZSoia8xj0dkN15uWdsFchcehxo0jjww3a3SyYtkEj5VdMn9Aa6n8oH5j4om5pNDwufzGCzkur6llgFu74D3e0259eDYXuyFOwNzk8Hg9%2FTApKTTU3bzTQWvoxJEJaZcL%2BU%2FiPZBOT3YIExuoaS35VMyqq4E8Y%2FGWLovJSQqctq64HhnXwO2sObq9HgfOhfXdxkDkOlxtcLMDRrSbgdK2RGKw1QdSzugOwdprgh%2FZqZ6TuoA7Ly2Hxr7j4rqloWvfT9TaGi%2BP2iKnFAuVK1i4eayrd%2FCCaznH90r1Lzs7B6TNMnLAE8a6Vp5t8RIE3uo70Vky%2BU6336EWFfn2WJBucBiaS03rHB5kMyWQH2NMMABLlyx9T3V%2B67V2hVZS1%2FlODDaltDpkJhXSkPOYuw2VhIaZyn8BRVbpxpfTJjGIwuzO9ZvDTn1v7rDQQXDVbBIAMVKRbrITnmVD%2Bb7raY7X647Xt80Jblt8Up2EVjK7jkG7RJ4RRaCsEc1g1yvMhZ5sLI%2FSBDXy4M51UbirAdUVg6zplKNPKmXFnTxG%2BJ2DSlThigWp5Mj5Nv%2FDEa3QAoTN5Vk2RAqRJKLcinHeoLOvinsOxABi6r8LiBpoc4QKS2SpgOzcbSUmSF9HsBJnIIcySVfAsbxjOMftKaqeQbXraqXy6eKIom4pvLOd5nIxf5Nwz%2BPg7CUStsXwSXfioIZyGJbMybajVL5OgiYqrqg1oPdP8B0eJ9LJdybeLbZUcIlVmh3J7xwpdkhntfGVW1SZp%2FkVNz32BPmWJj4c9MuNl2kFok1BlAP69yb4iZmv3NBN7J%2FPRqOLgKhqNuIEyLs9ZlMPJVcZDB6W9Be6Tq416MRlf5%2B5uwC4eUptmlMFgDH7BwH803oTsKL%2FouOiwQZmLZMkwokcOPby2iXaf3NTW8ZfOrSiqsWA0gqgXLa2fVjamVAdOQyCL0saBORFyspmR0gOkRVPzsmKRqD2JCmIpyL1hcZxUyE6qSo3UysUdPEVSiHawih3iUPtKrCDG2kMgrdKbW0EOoRKPSoJxypvvmF9YW6bZCawFFC%2BmNk%2BJfCGEyhq6eMp2iiRUrs09BY94PyjzosYPnFDIUMjsM11k%2FxDn75TIlBTJelItj%2F4Ll7KG%2FP2E7w0UgfwNzLVj1tfuGkPIj6oK0JfU4eHDoRHRFTHLPbrlY34EFgSf7bKb9MNhXRsxTg0a5aclayLP0VEEtoHBKYjXrxKKERh8XbcCQXaKuDaoLx75CGFOGaTf3FpCxWyDkTBUOgNLp8bwWgwt%2FscPB415A7aWME5IFPX1Uk6dG1ZTKLIUJW5bu05MJy1Za1Q%2BhWoZcR0762Fe2wBf5y9WSGubwQOON2mlrjxcjBfwUjxB6B1OD8jZ4K%2F7xEiyVzVgwuPgJHvsC7YzEJtecK6NQHdGWrcacOrN0aLjHddbQLkO3PIyo2FyVNA%2BZzmAjw6aJLbaf1AP%2FONZZ9vMBs19E6dzo4kL5ES6CpGG4nJ5XdC3U10K54iKAfobmD9MzaMYFXDz9LqTNRC5s%2FWA0VeKX0LzxFZoBOiQgFyXxDEZ%2BFmdtgZwxNiFVDVYJRuIJ3W%2BL2iLCVGFchDCVtRzcPS9WQRhTEMydpAww3lBbFja8%2FHJvrpqKMPIInVDVrGxKDwguNjmtB%2BSBMEmPedyR1nCEseJtc2U2PcNlnTZmodmCO9jOl8xKiGh3KGboTaQMlx5T9wBcgRs8s1sLu%2FUXUxWlI0JxmAFRMQyBcAinFeYAyN7WFGOpJ6HhhM61FwQWijN62KmOT3cFxX5WC5yhsrqkJZA%2FE7p5AVryAi9lVx1DGDNvh09eugtMl0CoCdL9KYqFL6toKKgIgO6%2FrXyYCnCj2UxPflB9j3CjVYpm8lmmAuLha71NgIiL6gD08LxEY8aQNW1XE%2BiGwCuEdEnVpFnMxOt9z%2Bu0Oj4YU6wEpmrdsux8Ux3f5mUozipL1m10SWApMKhL%2FgIgL8zGoUP2HsSG83JtgVh2xGwcDOsGDlcPJrO3bzDR0eV2Ah3tgbLWCgNaMe%2BB07t80sDW%2FzHFHqaFcMqowbTTu8dn8TUHq1VGrrhBu9rFX0bntaYIu3zrtHt2FgyDfnSZgcywSGZw8NBCfytM%2BKV2KhQmRQuqP%2Ba0I4JQlysH09oJZC3UG4BOD9MGoK1dUYpZYVQQ5ki3FQtSih90Er8NxBTOLqD%2B3TUwka4KQvH6LWAL503EY6PMq9XJKCxyTfRhwUYGuJ6BBiipqKOyyXo9qUCeh22YDcuaqMLLcr0syiIzTZcQpA5fU3iM%2BeZo1WxllOVZL4VBzCDbw34o6aA%2Fknc4SwJ2pNEl6ImyYbFo%2FN6%2BChdu6QHaYyVzbH7DRUJtNFhOSX%2FKmVg2AUKU9inNwsO%2B8uL0ZhQMhp1geOkPf5%2F9RRF4L7eAiZsP0kMf%2F5L2%2FaOMT3tkUOoXoP4aLS89BAY1kigvgE4DSA9UJMMyXNbpHXzji9enfhhMO4gz4eGrLNXcgHAh1SrnpX4%2FqCVYsfbPdg%2Bj0gVS5z36YKJNV2AKmvsiplTiGMUuIkCpBxb6heCe0ZCHQ9aZfreBpqD%2BUShubOqLSxi6AJMj0ENq1mbodPkz7CMbFDOP0AB1WSf1YS6a69QwOdRKcJ9pdRlNuEneUZeZzUdyf3h6hJoVJCRO8YTyZuBZYuEtyv5h9AdvwVI%2B2PrhDujPkqsfcfBpygVOJyVn4zgmIBEBwT6lWgA%2FFcWfSXfqk6ZMxpbArLXSz91%2BZ%2FA5LAxolZ9EcQp7F%2F6gAQWbqi1lv1JS4CwW%2FmA9ZFKbNmBKZye617mkfN%2BSrM9OoYP5uBb0R8HQFsvbJmMhZwKPQZJRKAuAMtZ29mmgm9Z6cdYK2WDfLosrWTaUOZNIAQ0IL7xSpUFz%2BE6JLnP6wgRtlTBMrSJu5w%2BTMAlaoRT6%2FLDTPxsY3nq7cXjovTYCxGEwUlXvPvm9cRB6zzKx4648QWd%2BOwDv4gp5RgE90Ci4bl%2F4%2FfOgddXz%2B6jByD8d9%2FxhqzNojy%2FFgQVNwougM%2B6Jk5x9dTYYXvqjUdCx9f%2F7OBjegOfD4GowHLVOx91eB4%2Fe7cFFqQEt%2FVQBQb%2Fv927CLup%2Ffdlr%2FRYO%2Bq1r0XZw2brujAatz6ilGqk9uLwahN1RV%2FSI3iJEqw%2F2ZZ%2FrTxhl35CPumRfy2rsYNNV9XWES1KVNttgQplFsPQkbQFmOFz4Q7HrUXeZ1yCQBBhhzr0Q7yyu6DilAr7ywkuLQ7qUpUyb47xJKseodkZz77SvOzti%2BbV8DskIZX1aCQfT40F%2FCSvJ5pnOUsp0qfuCsvUCXibUhuEWibHVnetYeZ02V7qw2aOJeMUUHoxioDd8jciOaX2MdBXxS2rmYYJKEEdUnOIuPXcVFzuDC694BcGEssnghRYayWS3P%2BLur%2FK3BodF9YGDEBLfAoMQXj6nXnZquFGTiagxiVY7QyhsW09VbMjamBbkVQJTWcwwlyA1gKihQO1c5q9ODtJkGsZkCgOANJnAdnTu%2FQAW5Wo4Fxzjh05BzzhEicPHu1m8nvrd76O%2F2RInk1mngKEBd1cRRTv9DNMs53XJPJnFvMVzRSZPj71v8O6xzdNFtTUahKCkAx0ctmS4wt85Kb74mVzpMHH30OmBECNUIFCHxTbMBHLJmheWZem%2BF6PLXunOBJl5ujR1msHNIW4rWPOU2joVfaemSGXvFMcurc%2F8cNTtnw3CYFSgl7EXLs2lY6FA8%2BtCgzt9AnGxwIDg%2FNk1A%2BdBi6TMuA%2B6Qjqw9AA7NeBw%2BrSfIEL5MiVs%2F8FV0A9DRgoFMisJ5qjzmt5f%2BLr1Uup8QH51l%2FK5BSjTEkdP5FTCU2lYAiakbCNA6LAvbYBUOjYM6EOCdg6usVL9M4QXVuxiZ5weQJ3kWgmEE7xpU00xvScRTV80TAbzpKsqh83OzEyykqkrgoJKPXt6sHuACt%2BotqQQPdx36fM7uiSZWBRM%2BKEt5h%2Blss%2BWP0A9VQ8kkvDhtjkpHTWZwtd1WNY0pUiagOmQPkJhRlFj7uqb%2Fbyz9LXPDvoCOTCzhMJ25wcn3DufIao861Fcrt5PNW35o1vpOr8ahgVzTBC89GvekKoK7C5VyeAohRNkvjZs%2FVPSiIviCX19r%2FKnzeGb8C4f84k6UOy9o9sBJqIvMoUPZiU93kV8dTwAFUhIL5mFtBW8oRNPRqu7UPc6tU920OZPjqLmfIYH3ubCYdTUH%2BnOrGgm7EPR33TwWuuoIQ2MOQ6Z8WR4gamlRzaPbQxMV3E3ADRPrGTer9xRSBdPEyRWyQ%2B64fRGxmJqh9EB4zNLc8YdLvpN4ZKoBgDntCsj6aGSmUvkenMAnGOxerwZeHFY8Vp3L467O%2BSB%2FT3fArJt%2FJTGDty35cVXvTtlhcEaAu0rFQaFkQbTC6BPiRIxjJHTi4cu8duSYONbPxqVaOyyKcaUqG3Jdqv0TLjLPw02lgX3B3ihLMFKYbTo%2FoxbOgSI1xAQVOwifyrkj7NaMI7WI6qgRwqSfY4SMSWM1vuwlCVY0pfuFWI8FxmMhjJdUowy6vG0Vxaur%2FzRBUOAng0mBN67LKGYs3k5kOMG594jsYFDGIW3iLF9Aj3OaKWRaELMTp99LzvFw%2B6kO6DsEyWLZDAqpE0vwD3MlrpuppuMZV3knFQ%2BGdSSKmJhCUdAF6IZZEgB5REbOloTQWDT7JEDqATlwXkf6hhAC4jiEkW6E9MuFQUVDZhP91A14PynmukJK3f6DuX9zXvPdDrlkia6m6Hpzlya1jbkOKA7PtqdoFUhOCjOvnuoLDrIOG0aRYF0pOuwdw%2BzkM3ZQC2boJ%2F1NhjhjasrnIQYe7BV1KcaDFVy6H6iGwp6cTE5kLseLAl6Efx2j6wedafSBwkhlg7YJHtPoy3uX239792x7g4DgoZ7LalOrAB1ATuhmt25b7UFMiTmrEEhjxW45VAGT%2FZDQG8M8wZQu5tBlihNWEdnFdOQE7a4dxD6ox%2FogpqLX3kRAMOgIBGIRNgncmFKhuBkDhWm3yVCHpSPUd5Kx6YRaferrXRCPehLQPHFTffCToICwFhcZasr1Y5GDt39cbIpEw9YypWsZWMZmHl5HbJINxAI2B0IS83d3%2FRkzBhzOrIyA5iqzdipBjRNW%2FQDSDYf%2BjKaNl5L3I%2FeiYtbotsd2DZcngFZPMp1utPfj2BJjLaLMxAUU2ahSChYSBJRiVtCFIripq55fAonDGANrolgsrpRbFYrVY4oqbKqlUggslRAOFNZo2raW%2FVQxYDmEASNiqfFSmCC9%2FqwdNRaE52XeZjiCVNt0NqMbPz96QAPZPWx0wNvwlLuNot5Yf4yC8rDlAoYMF4jyItbWotceWD6lQIafUpaK2h86vSinA3upnuQvsAlII%2F0IITGMJckNqeapFWm2VJZbMTj4PClYzPVYZmgCaX%2Br27qwJHLQNAvZnFHMgsfWk0vCS2jVECaiMZUiiVCT00TffbCpEXWjVgf1SlYE0TC2CGAdHhWuW6RPKSKwrSfm3okWKC%2BmX86ZFBZMf053QIj%2FPMRaqXL%2F2opdEosVE2ak2Nm2nhaLD%2BsDekPJcOKrMaSL2K9nTw90cDKHaSlTT1bJZhjxEZ3imk%2FHMY1MBfLxHGrDlDgaqUlOwZqt9Q0dLmEuThzmKqyPqiuRVzpOR2THSRWI45UuEfFCxiILxDIdFB62imXKPupzpwKj545gC0wsvIiU3PNqVdac82peZpn59T8utDgRWquOQ1YePOdB3Wx5wtD6sqL6CkgFmpCMdtkDGrU21ysX00s38t%2B9uHTWmvc734KhqHfa7UHvV7Qlp8SiIvmh%2F5Z4A%2BH%2Fo1HJoHBWipkSidioOvMTKrp%2FUJOXaYz0IigLfiNP5a0hmbamG6J7qUK%2BHdU3P1xNHe7NKTIhcM8%2BlXK7CJIqBS0yXlxU9NVlfAyVcPpyGSP%2FtFf3zfjD76Q72U8y2MKmRHe7h41DzbeSmbRH%2Fd0ohsM9VBbSGcuIj9oUgKPRiaa5rksnqzdzK5%2F78O7zeaB%2FObNRe%2B3sNHtXwTD7qiufonetd7tbzfnMh0Pjw52936WHb%2Bkr8TLnh%2BGe%2F5lsO7VwtGw2z%2BvzZvvT4Pzbn%2Fde1q7%2FSj%2B3D4lL4N%2BR736jj4WE478bj9c946%2FpAPUnnp3J2mzuwyE2xtHTQ5e3Lv2tJadOPPwut0bd4LNqMtoOA7Q66bsmnlpgGw%2B9ig0HGH98eVpMKRQmFBLlHW%2BrN7Vj%2BW%2FGh%2FjPwvrz0%2FeRO%2BW7%2Ba%2BLM6%2FuKvRIe7MX61Ie%2F9hb%2Bvow8bR7v4ex92lP2pfrHsLxz%2FV5559%2FPh8%2FfX8ycJ83uZfjfvt0diXR4YuaBj0gk9%2Bvy0aLdog2dp%2F9665d4RJc6v1dnev2Yrb5JDou%2BbRho0%2B5Sd2IHXW%2FvX2e0Qg39GHvwc3nwfDjthktqvfXckvLg3FSB%2F2tsXp2to%2FaLZ2tyWkB022u%2FEg696fmn%2F98%2F7BtuA8Eu74N7PtXR6FaUxZN%2Fbwr%2B82999aj%2BvN5emghxHyvxA6frpdhycmORI2eHYkoQEqMyE6kzSUIaBP%2FrDr90cOZys9N1muifIntYufCdtbU3g5fZkse4QjjMlDOpd9mRLStKB6xUFlnGK%2BEE5RFSqtF%2Fw41VpWN29dp3Bf7sqaA%2FJnuSZL8a4p1mRj9iXFkily6gXJWbwM3%2Fvyw2RAMlrBgKCoHqZk8Yf%2BZZid1gB7Mts1lzGPx7IKeHOtf%2B6OLqzrlX9yhYX%2BU0RosEET0sU2Dl6e5%2FW6Yj6%2Ft65VWNSK84Poj3UD5Z9YrcyZONYdc95KvQ29Ock%2BRNBpacjfnNgZXVbHONo9ettUqsW898VCWd7dnIN6NQxG42Gfbn4%2FIuilrfWm%2FIrk1bAbBnSz2n4YtASig778uuGnABDYTLQQ9lp%2ByHHUkuvf%2FLD79mh3j71Xx3M9%2BnwmezW6uRJQSzOLvbBRX66qQ4eQihIbVasV7LEmCvY4UorYQ0y7mGYlrbJHhgY9kSwSVn05kN%2FvbATX8nubodCJWkvtuJVqcxdpt%2FL%2FhQWvP%2BgErahLuHDRPb%2Foif9Hjd%2FChV73dKHn98%2FH%2Frl45Z%2F2z8RT2UsoTZ78AmV3GLTkYzmF%2FGzm5aD%2FH4f1mHJqBQeu1WOA5%2BMFzKU0qHU3T7ZVB2rOJNBICRwG58G1VvDVLxk9URGsaLLwt2P%2F%2BT82nv%2FXSfxz8fmr5yc%2FLGQ6xBQs7QZCLrWNt%2B9%2F2aDHq7a5e8SebP2yccAfZR%2B83eGPjt6yJ9u7P2cG3%2F6fH%2FaPmuzhL82%2FiLb84dHGJnuUmfPtnw%2Ffs0f7W0dNPmmm0X%2BCNcqh0gcnedaY3qv41%2FrCTwvz3sJ3C1njS5zpd7t7G29bm%2BLvg79yNT9sD67yjA5taP7b6fHi86WTZ%2FXn0c%2FbujB6o3%2FOPZt7s2AzL5Lpt5tbu%2B82MoaP0%2FwdMdmreP5X6fyviswvdndjGhiu5YQbz3c0GOqfCSTqt4nAbG0cNluHzb3D3aPd%2F9w9KrcZx2H3pP7mda3xQ23OOtvBByE2xZLfbhxAP4KeTUinYfd0PArghIobNMSIbX9UV0xAEJqY%2F%2BPH8IfXcwtzNgiEFNr9eS%2BmVzi3%2FNKuPxoM8VrFJAt5GLXI8Y3xufy%2BctDxNv327%2BPw%2BZ4%2FHno7g%2BElnabb6wXnUvItHD%2F593%2F97m%2FfP51%2F8%2Bx%2F%2FXq7ztwpqWTXPM1NLKbLZ6KJ7wwWkuwpO8h5b2Maz3ttHAM%2BKyNOpJcpttmKRHCkkYFGhrtyCsErxVUFkrfdDsKwNzhH4le%2Fm1IGG1O4CWLdYQpp%2FMvR0fvWfzYPNrPi9eeM4Hm%2Ff8gf%2FdLc2OatPmSkZPNtMyMlt%2Fb39ppbvOn%2Be0nHh3zIjaOtX9izo4ONrWaOiLOd6Su%2FfRF4Gwp33tsBc2fnnkFBK7vv6aNpXL8Lf5Pe3aX5lTvl97X9s74e%2FevF3dybjx9PFzJDGg7YF3abSCxiX33NPIIurHA9AjIB5rNJAC5OBPAg%2Bqx6EdhQXMKAjUiehZpQcKInQVfiot5oNNJTMDeHXSOyG3%2BRsvO0f6ZRKhs%2Bfuzb964Ct4reDQmQkHnHS8snESU9zU7Np8%2B%2Bv%2BOPJpjcYve2%2FVFQxdaJoTpyKO9yLLjUhf8p8HyvHQwlPrxe0D8fXcx7o4tu6F0Ng09CSIeRsBeDgaHC7uVVT4yggv4R2xRD%2BwI9Kyee3%2B94x9GPgTocEQf3Yms7BOOdDcaitYAk6pDw8PzDcSz24FicebEd%2FZMva%2FPigJ9kt8SdWJbsOzHNcZHQZueOTsGUUE8%2B%2FR9CgU%2BByv7IW0h7eqeDQTiqcIm1d4N%2FCLB9cUbExkRHxPv4sZ63bnD63Ve9MnHVhwrcClkeAriClfD9m0Yt08pLFbqZVIfC9rB7NYLqWfp6Wg2NTOSopKV9pvWaSN%2Fka2FkRP6S1neG50T8Alwn7%2F%2F0c2tv410z6kjkoLl10IdIWtfqKkBdm0%2FberU5YTimPbIeg6ipdOCJ9kcfDvZa0msYL6J%2B%2FMPJbd5K5rJL2ThcET0Pj1obB5HFYIszDoUC0fKHOFVh4bhx8mXljhK6Ohw5eEiZrjW%2Bneun8llso3Y6DPzf2TPpGM48EgKNP5Or5M%2Fk9Nlno25%2FzIfsBGf%2BuMcbd8QSudVe6wz4gxuhQnfb7GngZ2AMepmlBNcjGVhhT8%2B6fb%2BHnvVu%2BFNu2eeEkmvnAV9c9%2Bz%2Fp%2B5d2Ns2coXhvzKrZo%2FlOLFjp03b9OLKtpxoK1teSU7SdVyVEimLNUUqJOVLon6%2F%2FQMwpEQOQEq%2BdN9z9Ni8YIZzxWAwGAxgApAXwHW9WRwIgNFsAs0cXJ92kRg0ihFJApYbbgQMrQH%2FAJkLVn3XLBQuW6IJ%2F963cPvABDrXBiS4csLQZcWFBC%2BBpJnQ0L2yGCJMwiB2BrFjm%2FBp32PooFdeBjBinQKNFbNvo%2BnEXGFUomuXDwLk%2BxgoDMy6x6GJRrh3wXpoyrAVZg8TErhm9a9Hrmd%2BCIUdlUpdk60RTiNwF8jEcIuPI1RIM4vvw6B2fegeOeOytTCNoA7NTflULc8FeoQLD6Re%2BT3nwv0pc8%2FJXAyZG0S5Hb0Vd4hoiqydtDrLhEcrSZgErSM52l6ztf%2FrCvEyIqtlHHkimxRWdriWTgaotGqD4GhDCsjM9mbgOYuemS6FleQ2YEfSndJm80sIjt0YGDo9H5kxjIXj0tVJeVtUd19TNrM5LZ0l88lsQcvX79RU6Uz%2Ff6ydypXd8Ec8zq8LDRg9pylx0sKfXhT8UCbc%2BJLRSjCSu3MFzOLJs%2FiiYGdffhAWnEsVObIrmg7%2FvlSuskxvINsHum%2FnlVB%2FcenR4%2Bi%2FbIlr00U7ffwo4v8Kih2rENRc3GWENRd5OYE1oi8ltOmPrQekaCtqmHyRJYWvcWtq61nxOmb9zhIyquVRvfu2ddB7c1rL64Pmic8Ch78Sd67KltaLJecjrK5tS1pU29YD19KU7GpLaNsqWjk3jrv1NzDh0ppSq1NXe6SJbsPqlLFf9Q8nreP5Qrpy5tTPz55vnO9W1EYmKa54rve5egnfor%2FOZL2h0vVxLh2Er%2B9WEZjNmKC8bHu1Tv2gxyt0vVEUt6Q4X2GmLMVcOaXQ9d2vVi1uwuksytmvLlLNlAw%2Bn2GA0IaYMk%2B4cQBhb%2BofqINqz%2F9jPf98Xu3tJo8vnn%2B%2FeS517V7toIdqEMha%2F3F2jiX6gpe%2F%2FvnVWuWPpcroqf5D5fnzyjNUDOfijHe1Nu21siMSMJi6rYPWa9UdOZGjaLUWKSt0YIzF6YixVf9WxbjzBCMnugWqfGOkMQquHVitAb3R8u5bJ1ZxoCLHgXffvob5CJge%2Bn4Ag0xdwxTlGGlEwdgJfEfZAZQAc59M40WBSGr9OvtJVis02nitb5JqOIU8rb7%2BafYDDa%2F12U8%2Fz54YuqJQgKXqk1tbyYqk6BjGnO7Ne3S1lQGbZiEnYDMuk2pDS1q4ilNzmiRvFeDSyFZeEEwi2hKwHZiqoSv7XjC4lAX8GX4Gv1PDIJx%2FRhsEwtxuqtTekY%2BCgsKyHJbL3u2iQrBq85CMukOX7e3lOY5CltWsD6IQHYKiIWD5cSK3XRBnKMbAsadQVdwOmcbJ0tFGJs2ZEFv0ACYXF%2ByFQu6UUixt3EcVaS8X9%2FW5FEkQiXFZjSg7sfqmqAPSYjIt6CeWGJ50MzOF1OIQ%2BAMzSd%2BUbmA3m0IBiMZFKpGD5%2BiEr5mYcoEQhojKrEzkIEfM5FAJYrFUXTN3JitEqsgSM%2BUo0kitRNM%2BR8GKxZqLyydhKJhp3fqDURj47mdWCdqYXE3AmQj02OZPxTLzi62LC5bThePDwsaUvMniwNiKTCk1jTwzySA2RcWT0LoYW2ZyTjh2fd6v%2FcA26y4LIqGDmDDWxJ05ORIkf8sl7qxuRbLPlByuKuw18Sq0mGa4IIdMJhH2rc%2B6ynY8hkCeO3Z5yUNnwCh%2F5Zq3LKRoyhdodmPJjVlaXC5quxcuE7cDfUbZtiRCNb420QvmOJbWp6nDJKg3MCoXgFWForZR7Yeo7K8sEmWr80qXSYQJfEhS4Tw4t%2BhcUZBaoECPPKTejEaiFvSt0Mjrv7YrfX%2Fll4qQGv6KZ31qNxO0XNllMLJwMoVpQ62tLefY5tHTbgcO07u2bqO0rgpZd4z1kDZe21zbKi%2B5VDat3jUvWFkBlmiCzReGd%2BG6VihhLdUuLi2cpPGcKVxljZboCeN4D6ZbT5SKtlxcnJ6fqbF120fuN3JhUZbMr6U8LQoNi0tIK%2FQ%2BkkG9Glvf1ZBkTkyBGqaLo2E6Gs6maZwCqWql6kZs7Ya%2FzMnJtKJ8cqZkyk%2FSZ6KsIKOdr%2FPu3h0pj7S1WIXoOZOOqW8tekn4dpVuy%2FdJFTtltmDA1nN9UU0LM5sXZl1aT2e6gb6Dvpj3uH5KJka9ztYL7x%2FKe2tRJmlhhikrN1JJukpaZySNcu0o33FotRw6z2lbhoQWa2mya2m2z1QUQJAVC6ngF4TluBoFHHK84Frv8UDugQ9rVucGCCHcA6AGnEyUiQfwVzo1FExsIgol5cVmUcGQys1RSvpohfHM8Sc7pu%2BMMvjLoE11piOK45jiLh%2BimWjlZ2KXDVX8SXJ1aNo1WB8O18QgIqchtCHOiMifM8KuFjK3O%2FRmwtthiku7ThQv4C8rGOvrFFfsGeiTHwp7JTNmi0YhJfeInadHNcqibGQviBikeCe0%2BArSE%2FythBJ35KhEvsS5pp7M0nVJI%2FfOk3CZYCmRZ8Pif32X0KiUjBeFZvpazm2FXr7rJInsu%2BOQBjOq0Fp9mBmIrBVNhfMBxtLxA2jU8HI6YSGGWi6yvyjyjMYof4x8dzJxTPV9%2BOpLauhHz2g%2F%2Fazva0IVjKivf1o16kYSdcOIelfdVNt6hH0zWKV7xUqpi9AH7qPlslltP23xSdG%2BGp0Pb%2FhdwNsjnMJLdC3To%2BR5%2FM6PJBS8zwBZPFTh%2BA4v26%2Fw%2BnIHr6%2B%2BxutsSmFTHTjVoVMdjLeZXvjMQmc4I3nZzA6mfc%2BZDb3AimfWNA5mtks1tMLb9YrU5Wn1tE2wt5Zve0vrV2ZFJ6O1er7xS2mWCU1alpsomU%2Bz%2B1HamfnZkFYU8UZGlxpDyWyRpaOHJbiZ5owC8Uxts2IXM5dVvlkibeeSV9efvTBFjJLCrawhK4qvApaiKKtn0khB7C9IHUUdxyK9TyZKhASXCsC5wPqGxeFbCBdOzOotqMMG03i2bcbj4u8CTdRIyKRAD1XSN5V0nxMlZ5aspG6sjQSyPQVRN3fs3gBusao6%2FtSUgeJ8D6UQJPocKiizSoqwonLyMAzMrItE0OnOD2sVvqUj6Z0XCcJhuoFOYVswenMyvr2H%2BBUnp6UqqYNCnVRR0ArTtt78HXhBhMxQnBiEJW54%2Fyva6f1Xjgeac16V6u%2FTCPeKibFYqCH0SJPifOOHJ3rVnk6vmlfBs16wSjs31gF32r1eSySxbPl0B3GgaQMRf6JxxHydsfDC2iRTfNKa2Kvt%2F9pp1jpve%2FXOfu2kztUn73T4q1KpoE6DHQxSITRAlrTTHdpiDVJbk1uDgu6%2BOqmkxXxQqQrLxAP%2Bn%2FbQihp9dN7Sv%2FCc557rz9cikZjWUnU%2FFJsnixlJA0PqFFSMta3Yesio%2BV2PYryela37zu%2Bq3ADlm1NoBYum%2BTSfXeCKpcoq9c5TKOAS5oXc%2BvjxS8mBv8rZD2R09Pl5KSaZQcWyl4K64ZP0xSqS%2B3kDmPw2G3SPI3GgMt2lN4QjWfj7f9L%2BuvB%2FT3OLUZfqF4slzWXy%2Btm5Hm1yDivlUprTXarOSrcE49Ifw7z0J6ggF8aX1JXviNHlqzzAEIrw3PUliau5PONfJ8a0RxRlBVq8yn5iEmeZNA7V0GYoJJvRwaj1e1Be0erFapub2VmysKDV57vrWtT%2F4uzmQ38vaNkHeLJ1WHt%2BODc4RYYy0FSGVsWl56fru8Pd2eJ9YwgJzbWT56BdVuns612FXAsp0CMIu8iqiiTn0uZWHibiShNfTbpFsYsEW%2FPd6cMyKYyEBfPTw0%2F%2BeY79UWoyS2dz3ywSWyqlOTROerWDg3a9U2qxvTyXexigKS3TSavd7T2s6vOs7mGtS6MaFGXoXhSvHSkWRjKWkCuo%2BZSfSnyLXHYJK1u%2BdHEKzkGlDfMjmTAr4DJ%2BvqP6zAJ5hEkw04vynh7u5i72AOb2V6aRQnkEVmuMO9Efjppbb7tHTa2oro21hDBo1XUw9WwxZb3hnCogJbs5wRCTUrFlGsiYt3zutBY%2Fn6S%2B5Mi3Yd4Vf3dlE7M9V2D1Ltt3eIij3K4GC4TGSGUauHfnf3z59c7HnRcvPu683I5pj96xadclq86uJk6oIgcN4zi3eqOddmgWWQnZYCKWunLCWy2jxtP3KjlSrPfvq1Fs4ZxBwhJL6d1%2F3CXUEFzlPYdXM%2B3sCcKeiIYVCJYmW5Lh%2BYLeiVbcNQ96JyGREzv%2BlRgUOnh6wkHsKwt3fOiv0hgwqsSDnhU7GExxlRoGphh1UTrNNcn1dcIQGiNJRIzhBZatZz0xOCDVavEUYWXkWEXt7LlRbOp%2Bzkscosi2uEIYjLSXscXngjaAxiHxEK2mYU8kpb3SMZJHsbkqZQWYgGA4pNMQiEZKo4yoobBkYVGwpEiNTha6xFj8UguUH%2Bnnb0mxZJPcBXkvPwKsfwvaE4n2nPRvbtXpyeOWjFw69IvUYjLM1MePxE4Ji%2BR8Af8qirDC0hDPKAyLl3sLllCOIa7g5JYpnVfTnMQgeeriMVlhzBPYuRVBLqv8oeg7LhaIa3qMdcIEYhRuii9CH7piyGaz4rJh%2FskDzDTpvjM93GR7YYUz1F8WXUVnrzJ9yk8lntTataPSNYB0vLzwWHnBcfLCUSaOraXGMHTNly5ejcOalFJvm5msfv68yGZ17sMd88Ns%2FtgSHz8%2BzdcagE9ZU3y5Y2Pg3hNOQMC0RfzMYb5quRYp7%2FfMAdZcKfIJPisM2nnGsJItYBYxCjfkeye1brfePmblwFV7GNOKwGhUi7h6IQBtKAGnApO3EYDHChnwInQs0hwEtspMKPLX4lkVD8HiQ3oYdl1VgdBY3gzoCmqlAufr6GdrCCnNkn41%2BnurmuQ0A%2FoAZAHzq6J4m9Ja3zVja0Znd0b2SWicRbvrxCkbMZPs6GQwC0I93WpSRCqdWSpLVVETBv5hcQUMkhl%2B0uo0Pqjq0PWc2cSKR6xWaF5zFrtjoIZ6wWVE%2BDQNYr3GGG%2BVIQI5kOg1josxYeC5k35ghWgxcxgY2aBy2jwCQ4hhgAUwwMizqqrtRpfRbBh4Nm%2BccTD1Y3UVeMBOG0HYFio2S1GljeEZsHU%2BZrieHHNlmODEM2Dk15XD0HEwDVFlkqyWGkF2oKKRg7pxNL2YeOykJYWlW4wUwsw2hHUDrKu12MQIi5yCeka3MJjGar46lYOlDgGUQP3vN0dds%2Fq4BJmFU38WxYCX63J9NBBXo4DFk8BH2YARpdbZbzRUdX4eZqarZvaiFwwsD09Lygg6GAW4mV%2FFmdsdEBcOQ9gLwhkhPV5INJTgyIyEE4g7MGjGgNsq%2B%2BFpu2lmDwg28axbyAAWbUBFXMsLLtYLxkKpXAo4iyUaDUFk6Xa7s60tPG48TTU9iVIo6wJnp5iUGpLT71YEmKD61uAyoXuaA%2FCxm%2FrOyIUoWku%2F7%2FgOjpC%2BQ1S678TXsCxWgEFovwBHPIBD3bv6zNJchStVqIKHya2y3StthcBBFm2kUBUKuQtNNvUVAnHZqxySPuBJXjV0h6if7IZQfpRMDINpiADsO7j4qEgH%2F%2B4VFOrCC%2FqQlDtU7oUfUKGgPK4PyOtGChJzgXcFRihWhEkK8Hrs2rY%2BlqDGtwqqD2njGfdgqHDViJ9CpqiqROfrVarHQnYUgNaqOb2Fpwm0VNLxmHfCuEYkJMCxDP8oGRvhdjh8ELk3%2BIzzTYzUIKYwPEKB8prZC7z6KCYDQonm7KYXGBpOFY5I7GO8Rzg0Y6AIkbbyAs%2B3Coid6yViNtJfgysODRLP4IVpY2VOHmbxU9HWCkl0hngMJMHqiatoNoD3aOolBiVUbPUVN1uX9S2kj2xnxxnKozzH8pONyrlVAaSaikYs7iBf0Em0KE5PpcH86yl9cDUhBdB4NzEZukFFMUBTZwKJIdGnk7DQ68DXjxTa5A%2BGQ%2ByLEDkLPRiAgqkIIkXT8RjWqZ%2BhoVC2kzmflznYh1hN4k0bviAMHKNEzYXJDAmoNkUNCEWYhNTmBZ1quAityWjxhIduaAVBh%2FKxBIQyRGsRRLpIjnOJmeC4Vlryd%2BsY5y9XPNyp%2Beu7cuWlYk5ZzZf6W7CdxBeuW6Jl%2BNTM7MIUO2MnJJNalJgJNqS6dxLiLq0d2uuPnqYHQczM75TXsv1OMnlH%2BE0YBghNB7nDaJbyGNmJa%2BxGqG2jrixviqeHHlS0crsgj9bH5trhb%2BtiU1VDktNlnLc8%2BfLTD2if%2FT4W4zIu2TL24nhkvV434Us2IKDNJC94xfId%2FJs9%2FxmN9JDt%2BbM7y3vm0pBHEPqEA8sWN4cp4IGinjTx1aQ8FPtx7HCn1ql659pxk34WTFNldNdzGDrn4UwxgqCuLmqOy7q6hbrttK3Sn15c8L0AZmNBVF7X%2Br5MDVnSwlfFth2ZmnyBdrOgba4EszmKW5Ap0M8vULWXdKCVYARYSWaA5ycGisdlkY2HCjqV6gD15eU5oJMt%2F0aei4UdBuE1LJXlDxs%2BHfPitTm2jjnMuW4K%2B12VkwYDdUihUy5Q1%2BpzGExf6CfLogUtRw1u2lhJxo2VZBhZyTaPzWZfsKFmu9dMk0oIGwQCUChPDRtCgPImr8EoFoFvHKBtzPw1BTIzQAiNhGFQA7ZZBO4I0NgajASD5xgGzCcz%2FJOgJgcCNyr15p7m6Tl8OhwKpEaDCxth33F5q%2B%2FT1qow%2BPZHqMfUBT76P4GAyvueO%2BFA4l8cbopIh0WB0MEIh2WX0BP7CWsgBUDrxgcw08l0kCLcvJWwfl%2FAxn1c33BoGKAzGw7nS74KOucxz38k4JrN2xbhB%2B6QE1cMaPmmkX4KEGAOWisUwHRI5x2yrUKgH7lDKS2CF%2BLOwfz8nxA0TFbuQlD0Z%2BAKbQsBZNS%2FMKCkIDpCN9gPYIoXzF4lkVzfNJ5G5H8sYZoG74utSUHIxbOgOiCZF0ycBqpmo5oRx5U6CWM4OJQ4jvoNH1EAkxNGM928foeOFTMTXQt4wz8E0i1QjiS8Y7oTyAXt3daiKBi44rZ8Ll6Do3w2WGzNbIQTYFksrxGbJrCMaG3H08fWR%2B5kX9IVL4wtl6CgbQi8d9vRFutELDl0ufYKAMOInQpDuBcITN1hGIyB5oZy%2BhgIASfiaMLQf3VanA85RKkKg76x%2B%2B%2B0ZIQHaT0l9zMvAozIsSOxc2%2BcGEaCC1lJGjYYXIJduVDgsTizDDHQdRWHh8F0sicUZypMZm%2BtCBarElgmk28lFvBtMOXFaDQ4FW90WkcotpIC3jsOn%2F8TuC0QeQj6zREY5oY2FM9RvgEc3E1LKJQPrcg7YE68JHQooWyNqD6eCOxwIzoWGJZG1HG84SIvgdeBKORzgAX86gfXnmNfOG9Q3ldKHJrOUBpwTRIlFoBfHhQEFE5BzLUlwa4FHD2yOEU%2Fsm44TGLyABjBuCid6I4EXD9yPc%2BNRIU6CBPygfWslLSIwUfAWbgnVhh3A71ywWc51kSkVceAzE4Ul9QpiQEkKnZ4Ux3D%2BqeDNgmBB5DH7rHErh5z1cbKsXgiodIisTYHo0alQG9awIp61oSPEJlWE7S0T08C7%2FZCGIwI98RVpWk7kmA4SAQwb4YT2onh4KlAAv89dcJbGocsqE17qRzs2FOBz6PJWAJPPOHMHcAjaU5qS6Z4EY4SLYEQtAFlG9E%2BHne8ZmZCMTyIxVLh5gaDdgYjxzTFimB55MH0VjiDEuGTuPKOMFw7nis0UEcS8nQmclwAC5E%2FSSkAr21bgKmfHWCDyMpZWRxx7u3EtsOUhytl3FQSJjJpSRgfbh3TVgDCbsfY4u6gZI3SFUgvClk40BWKU7g%2BTgMKqAkGw0JmzEcu0IYiLhDJRhEP2A3eCtSyGzRxg1aAn3b3BajEgXSDiTCUusEUjc5xeGgNLtEHtOfoQ541oaxmnPfAPguUieLt662ZbPTSiIVLy2ykzsQxDS4YMeTexghpBkUVS8PLKnUwLavJoet4dtnnKSUpi0N8oBxEtS8qPgWWJdxBNazi5in81OXjEw9TCqzqqS81zelEmqZOQ6%2Fui3KQd6gpLSGCyIIX8d%2FvRw6zeoNgNx4JxBlZdYidhZbqX560W4eNZr33TrvXMMzdX1yEzgVMSHayRDKtmVi%2B5d1yb3%2FSOa0KntsXODKCk9KRAXdsN6YdepMSVoaSjCGFsjVeBdUdij6B3ikJ8oPYHSa7sYKV8QvOhlRQ2mSAPOuWmXxBrRVMdTqxuTWcscm0V8aaE18JGoTuBVrDESUxso3wueaLCQ%2BuXT6IKxEsQwdOUb%2FpULlVdZjUIDCkuX9PDSzKSIfKGekwKaMpLEIb%2FoTZMLrirPz8qIOJ9leuc13qC7Lz29Feq3lf02N4nOQJGjM2N9ezgzWzX%2F5YZ1Spun4sWLAxzmu%2FOOvvnZ%2B92D7fWOdnb3jkoIXbqN%2BWx86rsLTrZccdZLsmvBk6p3udbmkvTPumialcJ%2BDlSz58YSDkr3zAEjtFGTWDnEbA1tb8RB4uSMKy%2BnTrRyfN2vx4QWnNBCsoadX%2BkGpkAMvPw5qmZ4xOpXZfYQqieDlDcdmPlruvW%2BHAhdFkuTDhzA6lSAbET5aqyWt1j95%2B67hba5BudL4%2BqTINr9RS4zhF5ngyxckeGyjTUA0HbxodVSPlCKOL7%2BL8YBlOC0jyGK5cy7rv0R29aqptAMWDXZIFisR%2BBmplpw3jMGv%2F88NxX9AySvSUqyOVHou8t%2BOEuW7LRurv67XJOqbZL7PQvbSQSwtaWFj60jh%2FLRdTqFphvHLfEPj7uyy2iHbFNKOxFEUq5HMvoUeA%2FrV2t97upG739NSqO4vsivfXiwztrGCXerkK3GrOPu%2Fi6NOktEIUEUey%2BFHsYjbXkGSub%2FMpGVtZn2kvERkPiKnR4ocMiKwnvaKUHmdMlHmUxV8hE5fLidEF%2BdCrEVufpIvo4Fz5F8VBK%2Fi9TX9L%2FN%2FOo61mUd2IXm5ZPf0tmQDN36KLDeag%2BKP%2FnnWp0qnmjoTsrs6exWPgS3viIc6cl9EOw79zGQUp8iiu%2Fhc6hX5M9wJ3wOYVsC2rw3w2%2B%2BcyXfZMSzw5q26eb612%2Fv2r6u4%2F%2FrF%2BV5Vo4o4fQxvanrp%2BIKpDU8hD9aHT5FdSiB6ceNMI%2Fx%2BgEy3M%2B8yt7taWdqv7LH9%2BOtuD2kCG%2Butc%2FcWPO6OPAvK6XTvtthL9a7TRmLpnqKL9d5q7BVfFtaN656S2X0%2F1trVNvx6ZHbx%2B%2Bvo1%2F2S%2BpKi135weLVS%2Bfzz7%2Fcefzzd%2B5l%2Bge%2FBuozX3DY6xAc1giT0dxOvVxAVyvg6pb2QtwtEWXCyvmi3vOkYyCix8IpV3vcDB8v7JSe%2Bk3ThqdBvv6lTcUvMBXKaZE91g2chAXe%2F8aS8mUKkdfHRiUdsHNjWRCnRS%2F9HUizdalf7Qej48%2F7Lz12yaff%2F62Xd%2FzUhI9OXlX8TddoTq6UVgaZUkuUexXKuA916rTr%2FbnZ3Omuu7%2F10LvveZhZHDnRd3jbCRdwSi46bguGYFe9GbS6wxUk3qxwe9DuB2r9bp7dXfNI6rRYXdqu6%2Bnhe3Xame%2FV4lDlydf3nxbPvVX%2BvizDef9Xj8ijmT5E4SlW5%2B6LX9na3sFeITTBWH6LECMPA5bXWkBwQ2V%2BzIs43n57vQQPCHo%2BMc7mu79LROBos3pYD1xLwkD8DYdeecUpU%2BY7Di2LMXZx9uzpPsk1E7D0%2Fe158CJFvMwnjru9lCF0c7O5kUlR6zOKSPtl%2FNXu7MXn092975DpKt7h3O%2BsN1gJ41vfPZMmOi0GeN%2BbnUu3eWXojvvn5xttcnkXhSyO15m5XWcPYihX2Lb2fbUjVPpwhrNndnnre7PsP3s%2F98PoeqLqAIhA4FMD6xWlM9j4MYhXx0lhidRuFWyPO58FlXXkXT4dC9ocPIwTM6HD5xwpE1idBzPR1sRasO0ygOxklc7YweLYJoP2tCzmniGX%2FmaF0LzdGNrUuHTnTjnrVNbsbHQegYnfAImwEn7fpJu7Vf73RapTsj3PJWSrm%2BIuv%2FMCmeb7DTkKKhs6wNs8WpfneYnJj38Mm34ao7QdHZF3Vt6UPn%2BgA9GVrXTpdV70Tf3SHGc4cU3dV6mObWyuruCEw27QHrxNyaLJmtiS3kMzRfO5Ub0VziGvXHzae7Py9ZUzxAUrzylLJYg5YyXtyvYO4YbiG%2FSAUUJZ6rDoMFM4slhULeJceF%2BJhYOs6hteudevtd%2FaBX6NTHgvHvW0yRAKHMWzz3bQOQnvPJBEampxQLqJM76A2wPUxXL2kYrMKYb5MkzA%2B0Q3szdMq8offdmBcSgMwFj%2BimiPsLkvyzCEboK4OgZ11brPwAFr0XAfwWVXoYeDwxmwc3rXjVqXd76I%2BIO8mhMMA9ISWA30zMpiA4HmXkcMlrU7oUZGA6ZMSgnsP0KZiTcfvWtzR%2BSPURPDsJfoAKvONIh2gTp0Omhgk%2FKCm6MeJesIah6zCkuwgYcjKfVaKjIdfnOr0VyRppZTyNueHHQm9W7DRvpWBYce9UAOGjHI%2BQTsz9oApqDlt8uAkAnmKB26oCF1UFXpJE11WhM%2FQEzAdSizZZOZh8a0xg6BagZCJGMqmAONZRT5lRUmCuYkB4ICTsCEYaJueshRwmUPJqFt36g1EY%2BGjVydTGcYDO8CYV3GPFIzTm0vO4zigGmVp9lYy1nF5kDVkGRnAvGfgsGiM63HOW7PcLoabGMQG5onJlypUKK%2BR%2BimkXhcgbm9AAD4%2Bx0Sf5tOMO4G40%2Bi9gXJthPnOnUqP8tI3GfUx6PTJPBRFo%2B1WPUXYAv9wRwd8xqHb9aJI8XFYzwmVCvIA1ZjTiFI8f9a9cY1lYUaZ%2BBGwJQ2cRKHmr0yOrtNlJaPi2IVh7BF7HxEFkQHqcBvYtIGOMqvRdPCzbi5yxNRlx7TlgUphauGYImL4fHicg%2F7I92favEKHHC082nADbC0tk46EaaZLsCdP%2FEEZDjytKEpjXazgVdATdsXXh8gPFFXKmS0cQwx6aqjKDExv2MVAqkyn4U9MvEy0Fpg5PgPQuphbTxRzjySVBAxTBvGIwJbPuSll5E1xSbpi%2BL60Lx%2B7FVmRyqRPLNVEL5sIxO72C82YA677bHnQj60gJFjqDaRi5V05PqsYiFE1p2WIcstZN04VZat5U2h1kT0SFJExKR4eImeugktLpCHzAAl3gGVHv9Ei1VAoR%2B604bxERcaKTBlM8ZccecbaCPpOaJAnh1Zr6ZPQfS8TwNxMmI7gRgfffIgIPSySyJhT4NTYVXsM6TCj7tSRgSKG9pQq%2F81V1ASnv81nIMk2VVCxmqKSCxprYLBD1pMnGYrZEYDlrHi0ikGFHBBadHnSzCWS2OgAUsgmf5TnwzMOpFV4tgLBVLncriys%2FvqyEpQ8D3QzIVggDS8szNsOwfhjy4%2FGVIayITJC21mNCgQz6MfMPO5maR5hhGeewWS0UChgNLJ%2F7m5UmNP8quOROhS2Pr14ROhlZDDrw49BsXTey3QvWkm4kHX9wI4%2BfQwYoNQqHTpmJDIDKrpGn%2FPANQG%2Bkonm8S9FoJPOTUfFs3twcfQHClkUote4JMyPBRcfDmZAeYE4PF59km1KKJxFkCtC0l4UI43fsjGE5JgDNE38EnJhEBoACtxHYJiKOoR4mH8CWaeKQgBEhrCCEcYImQnn9pFHBKSBA2DrVF4sTyVB2JrUSiTnHbJEQ25xcApAXMbY56YN5Z8AWPAhkXYpA1qUIZF2KwGjCsw8900sMAn0xf1%2FMyxczm%2FRDgcmRqyCWK%2BKM0zXjG%2FgUBxCzz2MnHAtn3SuwnCK64N3yuT8OJFIWBxIhupKp%2FpUbMeJ0JcdM0a%2BMyWg2uvV2rcnZi%2BPTZpNNa1y6iBK0gIvfRLkayUTKCpMac8XCVJKNqQqPhhopRUYSkRN9bQgecqWY75mxbYVctLkVvrSBcqELY3FpkXPBxA%2F3Ri7t5y9W44soJVsoB43OSa27%2F7ZsqydVx9pEm%2BN8IVioSV9oHnxrS6GBLjKhPf%2F6GW3CZh2GGRuoVMPXBp%2BajZLfLFtuFFYyCLtV3f1HKq5n%2BokY6A5FMJrll%2BBazigGkdyLhRRvj6WWaoG1u7TQaVZ1q5pqfM3W9Y5WdSunOlJ6wq7%2B4QR9AWFTZg4A5YYlQ5NcgbLb0bkAQYcrH75kF3M1JfxE9SUHSzZsy0a9Ue36B3a8DtCzi%2B4Ayb3cALmcSKEo3InIEnZyoje1aA5RLH8txhh0eGauvWgkSRvkrrbzihbYR%2BhnED%2FMaBT4t3gi%2BkKbXcd%2BjoAyXDoq8J3XRnJ%2FJCem0GJ7df2PZ%2BoP2pF3h%2FqlevM0mo6r28%2FUzvr6H9lv76xKtvVTkTLTD3e15lyqGrxQC75PqhlNbt%2B5JhP11%2BmpMslWbGEdsq9F7g6yU0IuykJlQRhd4mm6%2B7cSC1qhfKuXUXsLOufa4SWqFLmmWy%2BcJFabmOr7zVq7hs%2BrzE0VifbrA0hM9xV1VnHz%2F%2Bn%2FkCLA%2Bcb6Rj4eqhUYpS87QaO75OzLDz8ZtrlLVdRX6K2M8e%2FfP368Jmd5T%2F%2Fn9Y8%2FbxoZra4pA5QjDlKvqKizRL4r%2Bk7iM2M4jRzyx4EqUnM1bNL1KMBSU234vlj50JMcr8v6b3kfGq240IF5yJkT1LvXvlD7zsCaRjRb2IFmdKwrh0j888TDCbbzyEkcnaAvUJaW0HEXodXvpypttPWuXqObEUu9fq1wcb8iqXn9%2BiE6U1C2zI7DMsfr8zxF4hahVZATdCob3%2BdITaqxxUMSdsEMWKKwPPePhrwqiXUnHvQhcIiWtj4TPVPO5sXma%2FaZ1phQuFOnhlVgXdefqQvyKpQ9PyC2UOnZ1NRn57OHuFIoOr%2FzN0899z8Z%2FPinN5diihCyjLHVP%2Bh8soasu4o8HxM%2Bj5zIiTZ5%2FLJTz%2Fc%2BRbVij%2BDv4UehS32YrtZ1%2BLtL9%2BGvuAvxV9yNVCrelVLERzhCvRxpHu%2F8f3ZJluPGZJ6rxOrC%2FsZGvkMX%2FsDyWVYG3LrnwPwYYCMJNuG220bcLOLohhvhGgDsQaz64njIj1v51OeEspZW%2BYskBMk65inWXD6XZQ98FWpUUGKEC6NIq3OWB7L3Rgw2nAuX9PgT6BSQurkVAKit68DSU%2B9Zqh9hyvtZhUEwjlT1%2B%2FUf%2FuBf563skPLEjFzg0Vb7LL8bP0N2Zkb7zjOdxWxsTdDh4UwrgszSXddZuj87y23nznLbrzO%2BW2uC8BsLnR7MaDNjlmolzJIl9CzFiVmqyjFLlTeSE%2Fk%2FVnf%2F8aNwZik9tSQes1%2BZci8hyyVEeSXix505r4IRWVtIWZ3r16K1Drmu98o44YvEptDsWGipRDsIkAq5aRs9t5Ebuj9QPVYP%2FD9IPKMBWnVQwFwtPKzuvsZodGQo2oAbJTBLTlWu786y7zNSniuYrdER%2BkZh0PWG4P%2BcL0xyLJ7IVGyXedHC38v5sXKtsr3C7GcAclgjyh%2FnH2T8HtGp4KJDvrX2wWnjuNX79b0sfmcOigo8fvRvBbu0UltUOlqTonh%2BKXbf8qtzS85i0fFGGMAcI1i0DmApWBLeCYbxtYV2AIHMcLujdTz%2B5DsxBF8JX6fB%2B54rmZJvup%2Bmrr0f3kaSbeN20A%2FipGgs8E3n6F3gDpx9S%2FAJkmZ7enDCw6KJF4RW97DLgt7G8aSgpFSWo4Dpvyi0HHnoFnwFhewMLN%2BXnRA4HfIsy5t8MHJQXVwwkQ%2FpyQ3929QvKAOEFHzTOKnZNgqSpXyKa3QU2EKhU1Qr7AsWUOQ%2FBrLYY4dAFh0njA9HNCR6EgYDqXLYXxJiQL49aF8%2BQizX6wec6Tvt7L0NTLUh6ll05sTLedIYS%2F6DChq6oM%2BgkCcNwS8EYFOjxcB7oWsLWRaNZWS3jiT6wzTlUsLBoLWp7XKXD1gZDj1kqtYKrTebGpNY65M27xfsRwEoOEuRxjo0JC%2Bm5M7roITypvucJt0FpmvKFxNeINh1D2F4osfr%2FWA8BqyvpWr%2F0LqC1yA0EBtcvEc9l7YDo2cq2hwO0US2c0W0EaaOArP4tEOOyIrkvch%2FiM6w7Vh2SX4RMJAHqDhkeWim%2FoTp8eC2eNDEsxp%2ByycD1iNp5KCK5b8CIIru4HJvGsdiVkuLnE2lIzuxiwY42x1or9VkW55FuXDi%2BfzSia14yglJLhX0VMHnc%2ByoIxfiafcNPA3ywVsag3jYLp68IP%2BlQoWhqB08BOjhSBUdYwCSLUEsSGNJDG9p90Eaia3tfUmDPumaxO432rsWYoyBYgOVrF0B0eWa8RzXeHvh6avDAMWk%2B4LZZJUozofks%2Bg9VxjjQ1KshWbKTtGbtBCOZn61M7NA8A6A33edMZ20knw7RcgvBWh3%2FMplSnbJ901E2o4DMygPhxYqxZd0TBcZ0Lcd9IJHvl3Cqanfkm%2FANlOKVmRmsPR7yDS8peVrl%2BlOJ9XbA%2B44Kmhd5MRKOg%2B%2BpvE0GUlW%2FOdfiyUfwFqsOGk831%2BecUp2fisN%2FcCxHufSNgwLKxKs2AcTx0cvKeJ8idpzx04MK4dLPhb8YN4LAunRo0iuDVGdzsSxLqVBisU9Qc5RKK0b1WghdSA1P315EFoXF8KXdkJJgwvBpZ8f1KZxoEkuxzjbPsFNBJGkhM44iJ2CSRBoFvCz7hCoFc%2FzMuFpRVxJsUEMxLPE%2B0WeZSeaMRWsZivaDMH1mEx5aMoum%2FcKMUHPRJq48s4GmnlZlGw6JsR60mgrSBXI2AHwwUeSKX%2Bq5Yk1uBTWBW6kOQXJpxSkuefG5LlHRtnCNIvJ8RhXdZE8DOzQgmlkPJFc0SXjRyYkMJTDziB0TFVQqgNy3%2FUriesPkax3A5GZgLqjG5OO5DfHgw%2B6gczJ4GFXJ4rRp5yE4YVkZ6DrLZP4BR%2FK27qY5CDLXrCwgcEP%2FI%2FvCD4ekSgcOV5g874jPDrkhxmVPtxXQC5g0MMi6lSqdFQahE4ymHJxwpTUqElkZsET5%2FEFby3jsty8gFRW7OwzVe85JndiYZkBHV1EsPE0cVA8pxUx4tM%2BLOqPpNUaec4%2B4ScUsITWoEjmQBTqjThiQvJE1ZE8vGheQ1wfLtg0sb8KgvRscSJ5Xwr1SJFcHdO8dhRcCSXsA0W6CEWHU4CHH%2FaFkzY66LeCIODsrp1QlHvBV7BMY2YcFJ3RLZCVQVMUEM1BoSNfXHEE4jfUi6LrSvimAJWsQmY%2FoQhCqw6Bwy7ivhP2kdf0xi1woovfyKhH9dmTvonQa05TWtIXy9XcqGgQEkbeRoKDn4lFqCVMouhJ5tq6bXBRVkQrMWltAL3QcsaS68x46hdwtn6QrHH5tBNYtizV0qrGkqgq8Nt6QhJDBo5rHoBRdLIdRoKUGhZL5Iv9oMCnNk0ZDYE2oW7t0BM8HQ1GzuBSyvzSD%2FrF5FuSOvWBLfQk75%2FacU2jLX0h98okiFxRGkMo236zxwJQt3dP3HbQ8iRxypMda9Egk0aFHwBdZafm5nRVwFUyKiF1VDSaxnZwzSuIyCCSMr1oEUS4MLjkRtTTh1BB9BEdS6TPDwpGFmFJ2xHkDYQ%2Bp78KFXSHcUtgJ1x0Yis43qMPGrxMk6mHKF1EPuVlhMfjk5kQoYsmri8TICduHNW5zNQuIBcwJnGlUbQgEqcMUQAz9cXVge5%2F7v4Vufi9I14vGOzieIiK8tUMgDRGRTIwCR1UthKGLrkMFUdVwTAU298PgPRJMyA%2FRahSAZ4wj4njVQuBCgaMUJKutNyHGTcSlgF9mTKPHHH9Aq0rOZoeuOFAZhlEoZ88aEPZx2mjzU%2F76344OBapi0R0AHuleXZMwl4BjE5%2BZZSWB7BMxkWk4qUYepI32GvXFqTHwLUIk19fHMoDcXabiNzQ%2BNIWNgrCsQQdeIEw8GSPxIJpNqXNk%2FAU9jqdBicYA881zTSoRFYvti%2Bf1CR%2Fo%2BKonEi%2BC%2FuOI%2BwUSaRc9B%2BMAkMBeYWMhhL9ED3zSp5OgHYI7O8oEDxJIr8ufC5UM5YICT83DMA29B0Div3JzLtpssLzFhQ1mLUFJRyMVsIxbSV4HlSCnQqKx%2Fn%2BsbzukiZDgSGIS3Yt5%2Bc7zW3Lg8abRrfW7B3VO53amzpL9rDRPqp1a4nzKBZcO641W28Kv27XT1rtbi%2FJpChYJ8Ip8vHJabd3ctpsnvJ5vFOHoMYx6aAKX3brbUh05903r%2FiXv3W69aMenoflzHqzftCjM64C9UtT3X63LSVa%2F6BdDBV%2BxwLqHwoCDuqHtdMmT6l12oUmkRuKQd823rzl9Wu9X92xaaL3pH4y%2FSCwmJfX6AMip2K69fSp%2BgX1o9SXNjnM%2FFEbgnlm%2Bbc%2F%2F6We5jTKkpw2U3W8RVg2L8hlk1I0Tolubm6mQc8M%2BEJ1i4IXoedGuql5ZTnpJLQk9SRGcQapxlZBDmlwSRZplOI8tG4C5JD5SsMyEdO2Rj1r9C5Q08pvFSFKonJN59MxyrkQJ5pO0H173BpiYoPJpML1u5O4K7kRocI8hh%2BRsRWNRTciGPBQLyJJ4is5EdGxi5QLE2V61CwsOhqb9xXy%2B5lC5d74%2FGl196ev1ueOQ%2FIjveRMBfdvkw03bErn8z774ZfzhaeSbB7yd%2Fc9Z51B8VXPC9TaR6oWRc64byoyrOCkcXG2oAK9VSnS5Tfa%2BMkElkZOmGqQb%2B5WSs1LA7rDAuu1MjTxSTv4zfEpnq3DVXFkBlc2d1BzVG1%2BrW9k6Blu0cB19e2z2uwnUB0FfWmrTfT6qzbpWPYmsEN0cYd0G9M1hOunKVxCfLpxYwTrY2ObF14AaarNEdZdbeJ32mb6ZmI0fTOxmg4P4URtouFItTm2YKWjNqEmMV4%2Fqc3I0aMAHgAUXboQl8wTqU06xb6p04dmB8BoOu7r0m%2B%2F0veXO2pzGIQDp5cE0q2HgwvyjIPwQtWajVoHr2%2BOFWFBu15TtU6n3u6qWrfbVvvHMMoO6nSBdPEGySK%2BtSDkRB0Ag6MO9vfg%2FwD%2FT%2FHSgsvhAV3wvQH%2F%2F8Z%2FfHmP%2F%2FBwrOrNxiFcOnVVPz7AfzwTgXcEHx%2BcwKXb%2Fk3V4bP6B2R2khsUWM%2F%2B6rBRbx7Atdmcn6dQb%2FaaNbw08dJRb%2Bpd9abZ2qs1FSTbOKJ0Gsf7e41jvDVPoW6N48OW%2BrVeP1HNffgYLk28dFSz22q%2FUUe1%2FXYLrifqCAt6VP%2FQ6Krj1uGJap108dQFGQf5Dn2Z76t%2FHytowoPWcfM3eIDBCdd%2Fnzba9fT%2BnWo3G52uOoSIwJMo4KRqeGnipaM6x4rMn6Mz167qvj092tPXD6oLcd6%2FbTTr6j2Ww9DvNg97L7ScK%2BELFW6rcEeFL1X4tQq%2FUeErFX6rwu9U%2BD0EYTCEw9fhNsTYhijb36jrF%2Bp6W13vqOuX6vprdQ2QV%2Br6W3X9nbr%2BHoIwGMLhq2v46hq%2BusavAEmutyHWNkTbhng7EG8H04F4OxBvB%2BLtQLwdiLcD8XYg3g7Ee%2FlC3cDftrrZUTcv1c3X6uYbdfNK3Xyrbr5TN99DEAZDOOR4AzneQI43kOMN5HgDOd5AjjeQ4w3keLOD6UA8yPEGcryBHG8gxxvI8QZyvIEcbyDHyUB5oYomCkZW5Kmor4YTZW0ra0dZL5X1tbraVlc76uqluoLnb9TVK3X1rbr6Tg1fqOG2Gu6o4Us1%2FFoNv1HDV2r4rZpAmttqsqMmL9XkazX5Rk1eqQnAv1OT7yEIgyEcqjCBKkygChOowuCFGmyrwY4avFSDr9UAIK%2FU4Fs1%2BE4NvocgDIZw%2BGoAXw3gqwF89emF%2BrStPu2oTy%2FVp6%2FVJ4C8Up%2B%2BVZ%2B%2BU5%2B%2BhyAMhnD46hN89Qm%2B%2BoR5TaKwN9C3G32L9G2YhN2k9wS%2BuCcxonlMeIp0epFOL9LpRTq9KEkvStOLkvSiNL0oSS9apPdCRdsq2lHRSxV9raJvVPRKRd%2Bq6DsVfQ9BGAzhUKsIahVBrSKoVQRIEAESRIAEESBBBEgQ7WA6EA%2BQIAIkiAAJIkCCCJAgAiSIAAkiQILo5bayXygbrjvKfqnsr5X9jbJfKftbZX%2Bn7O8hCIMhHHK1IVcbcrUhVxtytSFXG3K1IVcbcrV3MB2IB7nakKsNudqQqw252pCrDbnakKsNuX452f9LfXlXa8O12z6tw%2B2wBgQR7kBa4LrfOj5svIEHpIq1Y4Ic1DuN%2F2CU%2FZNT%2FICutfb%2B20a3vt89bWPQyX4HSFe9dXgIRIWCj2qdo967ehtPlAGA1lVwb7dOGnh7T7fO%2Bw7GPm7ph031S47I3NfDR%2FbwcuEJlvx5MssezKqf7N1ZNNqdTc8%2Bjc5313ct265%2BN9t%2BtQ6gyLKt3e8gTi5G1YpmkbV%2BM7N8e2bZoQcJ9AezMDrrD85nVhTO%2BmfezfnurO%2FdzPo3f84GfX%2F38yzun%2FVH57O%2BO5j1h%2Fjvzs6i6Xl%2FCJEuJ%2FFsYE928EDQZ%2FgPnZvZYDyBf38Go8A9c%2BxzfMDDbMAWzOz%2Bxcwe92d21J85QThz4e7GZ7GDDqNe%2FjXzIg%2F%2Bw1kIYWF4M%2FPscbV65trnZ1b%2FfH02PLOjc6igZ4fVajRzbtZ3oWw2gsbBVQzXK382Dq3Z2ArxrNzsbBqdw92bRXA961%2FH52f9%2BBzfzqzo3IYHjAVXD76B%2FylcLAR4lrdbPbvuJx%2FY6xAcITzydrEQ8DiYRVfw71zNxq5VxWjoOW0ywsKE4e4AGmU8CEO8hdFsDLUKQvz3Z5PLUTXuz%2Frx%2Bizsu%2FEsdK6q26%2Bgr%2BDTyPGoeSMrrlJn%2BsFkNsH%2FaTSahUNn0RwQOR7nX8PqvE12CUXWd6Npf1ZFNPg0RwQAaVShnG7iqrU7mlm7fcpwfRaFUS7V60kfry7U2Z3FUTyLnU%2Bz66ED%2F%2B6M5KPrVYD4zmwQzQYDaI7ZxJtdRTNonpEL%2FTm7cGZePLuIZ54zg%2BYdRTMvgGJGkzi8QZ9aP9GhQtEv0pC0b9HQxK0i7i4fhx1J1ry%2BAV3JnflDXNxIXtr0QUi0b6J%2F50KcB9gGWeKyxqQas6ICFgQu9Zf3SEWXfLjhr9RVsngEEJBl5NxIIXOnYF89%2Bel89wU5O0QXXxvSKUBWkuLs%2Bq6%2FQnZ9dDj20KyYFKggO3IJ%2BeB6oQMy3TFlGdJkVJyhCXpUH8e5sXk77vNDffdEIVwv41ovuoUJvBSbFuISdDvWo4U6Xp6c4zugWBa08fqBfbJqmVYoykNR0eo7HvRdovFfipI%2FfaV9pz4%2BgiyVNZeJAlFs9nBJ4M3YE8SAAH2YDFAnu5IAEKI%2BwH9wt%2Famhx7FtNfcnDnJrbOPHydfmn%2F1zremz0wvZGkg4tXm8%2FOnr7em68%2BUCQUgy%2FHDUbM3Pzr%2FU%2FaTzd7r5%2BcbW1PxE%2Fig0W2Uu8uViEBqaeZ%2FtF%2FAH2b%2F8xW5bqSnGwAO9ZvokTpbgKN6t1ZoKXVhzya6r%2B2yu6wBtr7apUFOQ3sbGhvbrXj63kKvgXcdO6zuJ7V2tv45V4KsgZ4VtU9VcsuYN4souKCunbQ6OoMM72YWgl4oZpbBK%2FRuyDLRzOFKuXA%2BcvVscMilu3YMkZbaCFt06o%2F5liyUyd8PBa3YNDmc6cfsGH7MGX1ukxPNi5TbbGOBpfZCxHlsFd4ef9gnpTbb8FfKaBQWIVvpimwhIylBeYRM5bPEUrDvhD9ppl%2BpiGvLilgS4ZGKOC8LLqqiytpPP%2F78BxA%2Fzkng7z72rVYgjCUbRW%2B7R81nOD7yqFRoXmoUj7m%2BzI0IDQWNJ%2FSHyT%2F%2Fs89hEVdYuYl4JhPuUAnVuCJmaqcSXZWZEFlhW2zqu7gH00bGQgi%2BH9nizoHxN3dC%2Bw%2FiAoqM%2F%2F1cSnK270hz%2BJzI48hTjhBRnACFeOJsvSpjv5ilz8qt8gktuLQ5CnOlL5d2oVnGwq7Ml1Xo0pVLi79VOpHFXdL26W%2Flzk9%2FIhIURS8irI9FJyXxWrqVb34LvfX8Oe%2BJrefPhf75kh90ZkmWeqVeYAjg8T5uv4r4PMdl%2BFs28Murnp3OjCBYSeJaMNFHR2OZrq8NZqFx1QfTtbQOu0IF7i75mDccJAillkdOOUGkYi8bVzLer4qXdyVmWBsiFYkY5FwyN3ZXbC%2BXxFoCI7n11IR0R9pEMnk7UIm2h6ru%2FrS5ubkOXRtNQyfSxvLXqDJrKkC%2FEmQKzmGKHGs%2FRvGt56yhfWtLIa55jsJV5LOc%2FNxS1yM31g6BVRAqi4kvUY8DELUf0iE%2BZtH1KWu%2BeUtTAUiSH81%2BFmzBFZLkjBJMykhRWqblSWrpjB3r7EqKS47oQB1XrFmUBFBji%2FIRZwnN5cnmzZMMpv1mIrIpslI44ExbEgIjTBCIcbOEj46IW6rjOGRSG8VTZG9bG%2BfW%2FafgK2X1g2lMQIahxb0%2FCN1J%2FFjdT4n9N%2FqfMvr7EOBP68pKKiPjwcjybc%2FpW9xcRBLhcRAFuv3aIYPtCt06k8VvP7H8%2FWfnw0Oxao4FP8%2BwVX9eYr4bSoNnChDXHinnEk84lOGPcg%2FnXc4sSURlxaViZ0G9foRSbv1cElgWhkq58qyLBXNcNH1X3aIGfqb0BUWO6%2FybdQbjzi5S9mFL4h8eJk%2Fh7rXTX9Jfy1pyqdnudHTniMDDZ3a0%2BYtHg%2F6bqAk98N%2FBTnNY4m8VRPlfhAuPwBEWrAmXYpwpB7wHsmVf77hjBdPAIyiuo1qvHQwk1fUk6IHK64sMVlNfT%2BI%2FYAvrbavd%2BA9aAG%2F22qfNesHWTOX3tS8vn%2F013699ksfIguWe4Fess187qR%2F0Dlt4dKkLqxfzzAWaY44G1gRm2rnBC3iGiRY4d%2FT8Bhx8eBmpqrvpbD6D8jyF%2Fx7y4h8%2F%2FpEbjF8yEhlYwz7t%2FXG%2BZaB7JjNo0pWygwyf0q2XZArZ5vOFRMdTqKt74Qeho9AtvEfMoI861WbKxpfEXaCHFzUmt1%2FoDqbvQKu%2B%2BKc2UI2rUm2XupZ0PhpU39l8ofrAcwKTgpoHDtr8wSzQ%2FeOQatR3RtaVC1HRGpCLlpeMyTLfXPr39MvOXygp9s%2Bf7uo3swX5V73FN72VPvhj8cEfwgfQKORI%2FnUZPsDlNm2rSegMtGOdW1V5jUcifqhAVxlpVv6qbOrFoCLnGyoKEq5%2BkQn1gx04EbpiizTbP5Yrc%2Fb6h7%2FOCcequ%2F%2Bg%2B3pOqs59zcHivSWiv%2BvjKVIDIfFYONS1mqxMMUYe2fOk0ticCfjmzKIXsFurugM2dteTbs5GZv1RWkIyj%2F%2F80QpYOm1j6eFPkI1VqwCHroDr%2BozGP1VwdvY7fOCTMtn6BjytCzu%2FWyt8K%2BWZFCYPN9mBotm4qJH%2FViRISRWOnGTYIFHTEg8UduD5D3RLZA1iU5NpgUB72FwfP3agrToLatFZT1vxen0ldPo7kelxKvqUds3O08FC6JO%2BrJtdXzr460cnb2udBnOqWTS4nPFkZEUwNdyn79OPi0hAL0cAevcb%2FosS3r3PlhSwnAT0euLw7wHq9Yzh21th6Jd%2FJw17KMDfN%2BT%2Flo5%2FnNHQ70mDvnffIf93INBjVLRXNuh796%2FmlDY0kl79NA1iR1VROWVw%2B5i1LqgqtgKwSnnRdq4sQSgpi2cVV%2FfWkNVZ034ymSMbrRpdJdVn1OpfYzHm7vNSFjyXf7Zo87IbbVG8rhZWsNmi448KzmxE4K9swWx6NFl1qJdNBrWDo9ZxY5k30xL1vMrv1eNWtz7rNk5m%2Bghi7bg7e19rH8MCa7ZfO8W0119TT23cc%2BW2d9ps1rs9OltYUsr%2B1PNMqxiLUtKaYmP2fIPo6%2BbGTOv247zz%2BvV6Uj65FGXHi3EhdBAYrsay54ZhlWQcHC7EHVTeRmvfqXg%2FH1q6T1v5fevL18%2F%2BKtD216cAKMYTcV9hYMGC3oNlSB8XHUA2rEiQZ0LENZ3PkzUpleLAO%2B4Mk8q879yvHbaE%2Bgu1Ns%2BpLy2R4G32Icc6fp8rdV9vPn1i7BMIsk3nxkIfUc%2BUZY%2BDxGH3%2FwDdsnEHQuPNih5OK7%2Bf0ZGdp%2BclKLM4XuLnogsteYcNdzrlYeEu5V220JOz4ktyvuM%2BeoY0%2FPRl%2B9mrv9bPFETbPt%2Fc2K0mj1jt7fXdJ9JuVi4JTUvIe%2FN5SlXorpvu%2Bf%2BHV4qzcf5lB1vxPuJtICVT2vZDFU%2B3P43NveT7K1hVfn8N9RZ8oS3wQNjlKnUkzTpoaf008fs7Kke9s6n75LwchZcXk5iElQZctoT0VUkRe6sNxt6jDELUFUQWEF3KpSZu7lyjgWCIMEtkCPOJyq1IaMwvHlxNNFoej8JgejG6I4WkobpaqedRheLeffslLcGPhRrNRf4ZjU1t2n2%2Bz6YMo0sP6YQM62aELDhPIwAYDy6q53G0DFP4NhFvcGxIVkTR2ApjPYjvNAkV6JmvOMv88QeQn7W1ZTMJxbrX5FAqGXmsUb1FUvKC7ehqstzCOOvL1QjmC1RYGEe%2BO5k4MSzAu62DlopGwdSz1YUTqwjNUaHbsVjPfFEqn0PSlVZv%2FbHqV6liB%2FxBS4SNZL7YEByl3tEHvY2bIgalfURCm%2ByMFVGpB813xh6dUDs0phklM4m%2FMoWtYuTX67vVURxPZniJZkN4GrqeM3PDwYzSfb2rl44d3RVnZ7%2BfkawHZnGpUrhMy9ivekRyTMVdlOlehHXV3e5s10uWVfMlKxQl5M%2Bwn50zN9d%2FW6HLjuRki31WVuyCTqYIzFJZWbQyNbC%2FeTLMvt71mGuyw%2FoYmgMTWD%2F9KSoOUMhD9QbS5FdUG6DoD9AayJxkzI3iytDyTMPAldSRnfvZNKZdYfaC0R5rjDJKAzzkTmXQ7PKVZfLz6JzAOHonO%2F1FjxGxawiNKv7UtMBbcYdmDtgEZvlMa9YVxHYDdD1irhEqHtutqiC3fM0KG7qDeDgxs3V9yzON6qEB91jw01FxxxPmSKXiWzHz8aDTNWCatBvAq8A0jF9Bt9cmiCMF2rJj%2FhWxhJ6DTIYZ0Afu45K1sOVH3FtrxXfM1htYzO1kBY8SIMkIzO7lrqArZEiT1dyDlmP9OWAW6StAlB3W7MBeMdjEGlwyq9gV2xlazIdMxQ6mzEVLZQIwhtKx6WSrgkomZnEEz5yI6ILLNI2fZgI4GKE1mCO5iiY2LbOVLfvKHTjOjTMQnJhqFwQsqQH6A%2Bk7zCmIDmD968au5bmfLTF9pzRc04bSKKiD4%2FqcLazEVsgMQyex2RiQaw%2Bfv6f46JDxmOn%2FJUrPjOBAr%2F4rcP0TboU9H9ahyp1YDP8wVt1HBU5gHZZHtx1gOEx%2FCujQRRi%2F11bIfURUnDBkdDMKTGdrlWTrjjnHpALXCL8ayWjOyHAFlRtgpLswdfFpi3dYxCDQrWatBuj2RM6xdL8CS%2FyvfFoLLX7x7Fvm4PrHj1uzr1a0k1B%2BrgxSKlSgoQBBsVZgPJeofi450VRwqhGl7VasphP1y1qEZyycseV6kYoD3MlFb32kjYXvfQeKMAguiMHA1SkqxVmmdDv9LTawrzd%2BKTrfWM6RFh2wLqhKli3XRZNZ6kXZfjmrPf8PWdwQVI7FU4jLDjSYeykr2QAusQIsxWPGI4Q4DzIhRs8Fi%2FBf5%2BMnmXEKVuJbZ19%2B%2BEk6w7xsobIYgWevf6jQRsO5kE758paVNWGD1ILxUcBqoD10PWPQG%2BqE4p0mFnxaTITzN%2BVGev8cXbqJ%2BEntf3p8UG939lvteq%2Fb6DbrRYdml5xwJgWI9XOBcGQael0yq4I%2FTutS7Z45heZa9GYn0UqDR3rUs4grIhxFU%2BRoc2hxD84PxbxS%2Bnp5h2JkUfhvxOC7ot9Dewxte%2BkpVe0HyQFhRvzNYpOvGuC%2BlDVEfZi%2BM0RlbYs8QyricHFvRs%2FioiBljuTlPUpoWtYT9%2B2IkgGaU5gz231ueYYOPz1Fm0LyYFsuyjMKWdzDj3BCvvCg%2BtlroemWl30%2BJMWvSwbc8s5dwsrh7%2F9C%2F9%2BbSt9dmimzBo9AF%2FTUqfnFSK35zrVC0l7FQ%2BLPUMeNRjpuWa2pYRiMoQX1sM%2Byk9ZCckanKUjvYxl9wawEQU55%2B6xWJWdRnoTkYxn7bqxsd0g2BemYyZwokufoEI%2Bu6iMO%2F7KuLJUKD8umvzSb4q0oZKLVBl6rpEhzvbG%2Bm2BVwiHABQHVqpYarAOuXwPg2TnEhOeC8bfy6JUm1BXG39I59%2F8E7V165u7exHlVjjCLLYBj1rjgGHahBbv0t7Bkd7%2BartDnRoPIK7BVFjK5uMsWNLnI%2B73j06O9enuFiGWOVxa%2FFftuxdXenbJfyaJNSX0l2mb5fhCTsI1oGipDTiMgXGRiASCrEK1yG1aFK%2BuH7RPRfsojbBNN42AUxIDM0k7RPPCBm0XZTFbbL5p%2FUbRltFfb%2F7XbAIzRWiPkMWmuTkEqRRFtIZ9XVlbqhTzfUp75zryjx6DR5aoeg5IAyHoP9xpwKUHCb7UfQkYDy1P1G5hi8VKbTNSbIJr24Qpz6jFM9S2fQk%2FQO3harQ76rY0Ho6brOxG%2Bdd0xLDU6U0AXWGR0R%2BirEm%2FAgZDzdAXF7bk23fTMjk%2BTBOLcOHRH7%2FXMj%2BHciSDtO2nGVB23uqp2fKBazI91xnvLfjDuAPqqfc%2Bd9AMrtBdPNQ8qjSLaJjBQ3n18NRh4IdGIFSyDLlI30js3XVuZTrF%2BWM0j1uqCrlJxQZEl9mQkUB4JQXxcy59AYgAbYRxek85OXxuoGQcAsQaDaWjFjhoF19CLIaAGiVEhnJbAKhgKqc3JB3DDm1q9qu85SJQ1Mwlvt0IeZG7JGsRT3JSUkkXVoWDsKAf41EFc1pZpnsU6N%2F9Ek1RAzV88%2F%2F6r3pNfzjf%2BuUSBu7Tv0hGxRIEVmTZkc%2FVz9dnsn6LPhQZq8K%2FhVjq2hLpEWzHuUE9iLgqxY4InXR7fo7vpNMiiv%2BW%2BhqzmPQnT6J94KshzL9n8iXq%2FqQ9Ei%2BQf0I9j6xLI1nQCawsvQDxRC5qsNcbGjoWyER3dZd2JRnOofIhyuPiYlwUyuUXp5kVZjxTo7q%2Bm67eWqIP7lR%2FON16%2Fru7%2B46f1tTsbu8inohMR2Tao6mcnDBZjGNeNMB8MtLWxRRNSrcWdCcNTx%2Fw41trrNeR%2FxtBkc%2F5HTOCuWjQPGCwraHpHT7%2FSI%2BVv0Yh74FCu9Ra0g1nzX2X4IddDe7dX%2BoCMBfyTPm4X5mgnGWWgYYch8%2FoVleuZbrlnZokewpvOebfHYU%2FduIA1BWx%2FMFtKia%2FMkiZMg8COZtSTKnu3bWeo9oEj1NLhOWOXguilGQQTdeCO1UGg6sg74aUxVHXfPkR%2FhnDXbx3ow0FMT6QygU%2B4WQ%2F36XjBIlJ6h9Dn9PUb7bARUmj4qhkgM3mMxkDaDmbZTtlFSllvt8PNmagki%2B7I8VU3SJjEd4niiXoPWav3I3qEEmSdu%2BpmOGi06%2Fvdxrs63%2FCGT9uAdEz1gPw52o6prUHgkIG1iRPsFKZ8QfIVGfo84Dv5x0E3tG4bA1aglo%2BzTgO1EMIYixzFTPNhEloXY4MgVcTqtTXC1mzmzrvSde3bXmtoVlGDxcgnKPBwoDhRqdZBs9Gtt2tNxMUu8uaHxJvXoO%2BOp8BgHwPZaIXqINHyEQ5eNprdXuOY%2FAH3I1XbD%2BBiw%2BBJW0O%2FnfqL92iA%2F%2B9VrQMzRy2K0P1orWv5KmlLJ26RK4rk%2Fb3rv8HVCcy3C0gnhew5gIl7rm%2BFt8mtCeion45gbaKfukGHNE7hNcY1B9xw%2BQG3VhuvbVzYO%2FjUGbnDGB8%2BYAiqYTf8CZDJZNkFjJHaP0BsUPuO62GS%2B6MQ%2F9%2FTygRKSveTKQ3lKPCcNq6jkuf3sJZwci%2B0gqGBHgYefDm4nL8g5fbt9PXAjYjLTV7rfvbtMBhMo%2FQFymC%2BvyWdnAzgJMgGd3G4J69vXXsesQk99s6FBWTyfhRczcM6zqJsnXwSHeDw0udu6DhJEhGg0QDIWLgfTG7pjkr7Dj5BGTruZ3qkPODedsb05HnU6Mm9ZtuhA0vP5LVvDS4PIYfsO9YuDrOQOeohjAzAwUMLbRTCvUM7cmlR0ndI5ACd4GYBSarzd13iFNBJvwhh2sXP8T5%2FOwQ62LmFQoznoCb52UnfOrDMtBavqFulX46sCVR6%2FnyQfgPPiGz03Mml1sGT8bpV5q9d5OmTd0B1QI66f4Xfw62jb6cTG5ugfkXCBOQf4OUG5gko%2Bv4IZkKYDkL9Rm1IT9iT9EDtd9w97DRd%2FzID6qAmIe5kIggKDxSJHmEaioAFwMdDF6YxN4yokeYQnIIWAG8ajegJylyj43%2FpWx213HAcJu%2FNwL9AVit9R0xPHnNlSd%2BzcalHk2cUh6TP74CKIkHCV9LlAoTEZ8JVfCBkSh8OoCMDXR4a%2B%2BkDSlrmL92gFiIV0e%2BD24HnZJ%2Fr40msAzvWlZNJUc%2FDh4FnO2ECyDZIBxvETh%2FTuncy1dEkaP6kC%2BUFyAzEE%2FwmDG5uiTGglnlz2kjGBj7FoaffalduHrA3jWNooRxsf%2BQMLvvBjQENYHFognx06Xzk%2BNN8wAHL%2BGA6Ht%2FmQXUb2Joc5E1oTUbAphjAAJaLORDO6AaEiH0OpEdWHgS4yyFE5kRoA8d9LoRXFSFCPGiZEdCxPLTV%2FzMPODErC714QYQyB21btms0fcdzEZNysK7VZwBetDllF6E8PtCX4Hre3AkpSN4WU9QC0IkznU8Daf48uDqKLhavmrqnjd2BQZ2G4SSViYqv3SCHQigGvdwPvCDMQNj7NIxyAKL0mVdnyBMBoAk6hN7MvBpoCpAGHh%2FKvDfdsZv9ouXXSblwAcEhvnhrO5H7GYnhApRrRnq%2F9bLvXZcGxaI%2F3qT1bfjDIAEkbfgm83na7EkQkqHBABIJrTgIowSUaRVqVjSVkjzPmzTTLvD41vEmyWM6OvP1zlYpWx1iwedjPFmbvHVu1Nsg%2FtW5xUnubZyhcMnLaeSEtQtM%2B%2B17IJwNH4pG0xs%2B4QSZ3KkxkmeaJvCZsLLhu0njwVMKwXsncWCff0WqGmkYbiZkImnKnD4sAoAi7QERbUAZGxEtDvBOs0cjSlhfeAgCWMNFB1rt2cbHlDWB50M8oYJ3XPA1Il3XSCeZ6AXA0zGJiOEBCUwjQoanESWccxMmoCNnnAzMSB0FNvxPI0czrYvHA1jv6NcDHO%2F0NMep%2BSviLT3THEpPpxN9fz9ygOACXmGtkyJBgZJpaP7USFXJEKTRAx6wy%2BBGc1e6OsMl75wHzAIzq5ITrOOJe%2BN4NGtFsFymtzcpNaC3jmOFgFYn2ueDRpTkJWFokrd5MyXvNGMkz4SCbgCdfJuC3ltunH2ep0xEHNZ9i2d%2F%2FogojV3UBsoZ4EL9IsFDeML1PvRr%2BvgOZhB4JOyEu8a0NmmTtac%2B%2FtcifaWSwBPdicfHy6%2BwyqoNSKCEHAatWfCBtOsA2Tojx%2FNSpjH7opMZTWOi%2Fbjg63i4Yutg3iceoDA9QVrvgc95F3hT6LfOxLOiEdFCqK5%2BwzbQT7jSQPAnIPOdpO6ap%2B1bYbqY6cQwq4VUX3h0fV1jfAx028JjMI2TCITg%2Bga89n47ed7XqinJ2yEZ9UxfwmBc6%2Bw3GnocamDDh3v6HNU8wN3M22RkLd7w0%2FnbgXvhxvM3PVTTNxyi6XMzuHYW6RNfP387nUwyYR%2BySTad4eLRT58yaeE6WT8hugDLn31pO9Dq84zMtyvgjOdvJDzXz9BV8%2FzxOpk3Kr297yRvwAabrdgNEpqWvIbuOFMDfM1mpOuN0oPu%2FgnOQJMYn6iTOwF6uaDXwPdRfAWPOBIdio00ohs0TvAZeQq8E8bjPUHZZ%2Br0YP5CATjNTCcarp8V7ZweuICh9AQUHHICcoxTK4oKEnqFHNHilThAfE2mV5IwQZRkDKevC84oA9ETYAZAOJ%2B%2BZ%2BbLDCj%2FTSfzDc7GRMOTF5p3k%2BdsQki3cAc5G75IFVPM1Bnvp3tEYaCloEfpnu0WeKVlE9yp9bFBsfXf6VGMC%2BD3rk9UB%2FNIn%2BlJj2F4SKguPB0ibVBaWLQPo5ZmmOQVxe9EgdN3PJdHs7gGJC2sXxbfJQQ5edNVTaRR2HZZwRQ8%2F%2BrCqhDuaUbYwXq1Rj2PENcHfu6zU9MRM6%2BnQMUIFOj6Uct3g0nyPM%2B6k8kPn%2FGMIT4TmU3ui1ZazCTJy3GQhHJBXrKrTLoRBZtY99q8zn%2F01SDCz74aOJXyaNqsV%2FScPAHoT1IQ4EglY87hXDAH967WbtT2mnlND9y9eHJW0%2F6Szzcqwnd6a7%2FUzp1wcL1wz69QK1jw9ljoBvLeun5blQKnkn%2FzVlyJQ8lCR5L3r%2BRagVvKB1Zy6Z5WijJaY2LpsNlrHNfavxUqnHF9tHIEP2nXT9qt%2FXqn02qXoSvfCk1Hw1d5sLjrmfXdM1dAymzbrKhmU4gh2tSlX67ifh%2Fsy2g6i3s9hZWbRxc24ws3hkuRV5OU%2B2isltnIeLBH2iLrUYuK%2Fiw4JsLfvR3MPpIP3KIoJSXIlaIkF%2FwtO1upf6KnRfz9L%2FXK%2B8BGKyKy6e9vajQJ%2FAiHdcQhmfAeK9P9%2FdZxBw3Z3tUoLiozJeo7v6yZIdSla08YfEGr1mqTCQof90mRATdkEgA9JoKNdJ%2F0pHGQPKUbGPrtw6uvsb49Yu1R1KNTwz2BCNPBdS882%2FQAi%2FiQpClzVcyT0xoKQWBFt99uHqoDJ7qMg8miRAngAJZio%2FnLAv7WoeVb8tZ2hqETzeO9d238KDFjGS0SpcP4yrkBjhaVu%2FDhyIlHga2cVAhxaF2hUMXJfDUH4cub00YPhZ4LSTO9Nkgk2UOxFe03pS9zeDBJHoGLTr59G4wdvcGHTycWlBkfOiMUF2iB4wmKaKBUb1unbdU4STYutxePO4vHl4vHr9Wve03rFl30QduSNkamh5vBBVTsuHMQjGFkJ6%2BZ544Tombd0UHtN3XUOFZHLfjv1PfV0WkDDf%2Bpo9t522J6x9Mx6QlEqtWhTm119qauZ8Odorc6mKI7gCrC%2BrDVoVVZq5OiE0mirPEccZL3TAekEHzukKu8xdPh1POo6fQr7kQl0j4NIKzDwtM6G5dTi3TnoPnLdGKETgnpOu97B40OLQbgsX6cPr1tHNAdVWrxflT70Dhq%2FIdg0HLz53a902216bHztvU%2BvR%2FUD2unzW76mn59MAckSWQBx60aMU4p6Lg2f9Ihte4iDO0aNvHt9FgXkTaPsUbd2p7qOmOqXbdd%2B60HozxVT6FFMAqzUsA7N3JRTwDF3NSe%2BACdgkbUMIH3iCmA13ZwTX30Pggv4Xt8%2FA2DfqvX2owcZcj9NxJv%2BUtmlVVGQw9Pj%2Fclw%2BImD3fIVHhEXmx%2BbFEv9chE39nsn5XVuFSu7i2fRkeVb1MPdHN%2BFo3rbpcqAxadSsquWatFOooYKFgeLJ3205WxMJ0Xcqp6VfIIK6YlByoahlWEFQ5TLE6qamsheTZl%2BWmKguNYiwMIqX5T0YGGRH0qG7riqihhOIyEC%2FpH7BvdLwYwuzJkLI5mWQxwOgqXdmC5GqcbP4IK51VoRWNJhZMCHqjCmSa%2BmgonxeYqnGU4%2FK6N6mzOuG%2FaPFsBkwtx9UnimzcZ8Ju7FbWhidX8vGYBcnOTOk%2FV2HfQNvxAcPVcseyBsmwb%2Ft1rUrSHf1dZUaj6Aw8NyNuqH%2FYHeIngMsCnAT6hZhxcP8HlwoHLCENGGOLiJy7CvAAvMVzGLlx8hE08uADv1w9j%2FCLGL67w6QqeIgciR6ik7nlq0HfhPwTaOYD%2FEfzDu4cnjBEWwT9E9K7g%2FzNqPKvBBP4g6gSiTSJH2cC3Oi4l5bh%2FjifK8SZj5aC3lfHUo0ukr1Olo1EsYKtcf6DwESrv2fjvwn%2Bk8HMv8uA%2FBCS6wv9rhUlRSjoh37kAzJ%2FgQW5gQhWydBN4naAqU0iZADLhv6tCzCIMAIKeTaCNoz7eQ3qIVATFj5wRvLgYihcXg9wIL9cQBiDHh3%2F4ysH46BHuCv4%2Fq4j22yIoLzRmFKP3qgjP4%2BA%2FfHVtTVSMZ3Ps0FjwmxPZgihKiHXh%2BGS5djINJwGdMtMbq5GEaeELFW6rcEeFL1X4tQq%2FUeErFX6rwu9U%2BD0EYTCEw1fhNsTYhijbEGcbIm1DrG2Itg3xdiDeDqYD8XYg3g7E24F4OxBvB%2BLtQLwdiPcS4r3cVjezF%2BpmpG48dQtPtyN166nP8PR5pD57ajqIwu2BmtpQMnq29K2vpv0w3Pb0bUTAFwN6ezFS8WAQvhzom6Vvfbj58cuRvnkqwKCRvum3vn7r67eBfhsAzsFtRFdA09gdR5d4G4aULpQtwOtI3zwVXw8gBPoNLhZeIrwA3gTRAHW4b8aD0KJrH3EfngEJoPB0CxVSwAsFi44LNUGOEd%2BH%2BD5UEXQexAJ8gxF6Y7tXCriUyWdKBdPCgl0kV0jJwSJeUDkJSEUeD6YDfY10%2BV9Qe7zA0r8AopJAt3WjbetG29aNtk0Ns60bbVs32rZutO0%2BNdM2NRPEw4936KMdDMYLNMi1HUPm0RA9SjqOFY7oCo3q2AhIam9hbS2svUXvfXzv43uf3gf4PsD3Ab3b%2BG7jOwyiiY0NSa0JyQHWvNCYobHmhcaaF56ysP6WPZ7ewFU%2FQxfCxaM0HUzTwTTpMlwyBlGeCxPBJlqBVJuDCPpp0%2B7DvzPEC67U4K7B12oT%2BMSxNQgDePo0hQsF4NJZbSaCTrWJhv71FaKqzSS%2BH2h4AOixidbm7sHh3Mk8V6G7lh84h%2FtwZy1Lz38D0%2FLiZnNz8xlOHe7Y8p4pMvIqJLNEtK%2FT6jNnOQ85q0mcQL%2Bqd7QyZ4VmL4KzF8%2B%2FPd8Qj%2F09ofq8CFhRxNPxD7KFViS7Tsu%2FVrSm0SfayLKzEGexwsvEO%2Ft97fwhZyslKV22rL8nh%2FJxQbv55Hzj9UMyKz%2Bb9lVRsyzz%2FlN45taNyYSnSuy1WYrGd2lz4GfFRfzlTDyV9pDFA3Haj7B4uL6UVg7Xlw9cNlCyq60Zri%2BLznxld6SLxMXyoeLi3eXMPtoTbbjG%2FuqX8%2BSpd%2F7U9FVsfPLx45fq5lP0qfvX1h02PHOn1%2BpvGseqfnyAx4fRjLIiI9LKDuhEISCcXhykpnqBmJJyC%2FmaxguKoRbthw8k2Z1tv%2BAaCvfbnDeNzOAZ%2FU6z1nmbHtJ%2F4FZ%2BdTrrr%2B%2BGu2vSHkmyRSMF3cFDytK8K9KmVrKnJgU9Ut7hbBqu32WX%2FzHzvYsKxaPk25%2F1S2v7oHRLarPCVH0v06YrDPgyWcf15Qq6AnNasSLHeBfpF9WqXX9T%2F3BSWOm3OM6XcZ6i0sXdZ7Hry0eYwm6sSWxJsxgFPHAiSxNfbS6j2EXTWSp6Sv0wCFbECo%2BK9grdM6DdhduJefhW9o8g2MEXfCskmMbO5NrcM4Nosl7wFnAxZT4FuEVzgLz62oAJvhTQAMcKlvdhXjMg03iAVYD1tlliwJpVzvsWd4Js0F%2FynCF4oyC3EmXZ632tEhSQHWxYpm1zKzIPdVtXZutKXhkINhFs0PdNNwT9W36iXHCfIDlvGNBpSbJF45vJCkZ7ASb4iZCBNPg5kjOPHwXOEQbBlKcZBlEkFxbZtQthqBAX10OTlCyE9YvtRhPPYim7V2z8mWPPds2iSp46UIdBdjngkG4wA0qePSSPIrL3kiEeVB1a3MUKwgNfjo%2Fw7cKAF8UhZUEsDM%2FIcssIkq2EZPuKtQKG%2BU4UO7YXBMybC4aS9v%2BITp%2BKX0ek8AyTP%2BsNCJ5OBLorYJGWJceO0JyCebHKSKC%2FzBZEkesWZmkBfbHdMBj6SOmh4VVgcZjvhQKj1hrOEYu5N%2FkzYKVAO0gGaGzdMG8wY9fnsMCcn5BnI3fpJpy5osE1mQkKhg4ncX4Qi8MrmMCchK5DB2g6wQwU0CKYChYznCgqTmUS8v6WnS0VeRoSHdGguTsB4UJn4lgxLssxAgvk7mtER0ShPihjzus0WBgQVXgYMI65gxLRR1TEOBbJP5DoUUfwvCN5exJc9sSR1ed8C4BpmcPBOI8x6g6sJx69Y92lyUbh6JtGvGWuLM%2B1kTvCJmIsEvcKdT1ymKsY7Q%2BrjJnJcDG5NdJ8%2FWNwO7n0uY6BHM9UNZjHWkQStBObtU6nd1A%2FbGgHqmYJS4RKY2RoBN2RrSqxLrM5sUPLyYILhYJdaXLaEm1Uk%2Fl3tiDIS9LJw88FmVZhianAd0w9C8jLhgBpJw7bnt%2BZ6wCJ7hi%2BzgenCkaA49l4%2BTpxa8FyV5cszz9sGJbNMlZHbyCsyOqoiIHLNnj%2B17lpubt13%2F%2BCiN4ckjlEkzq4RNZAa%2FOHixv6VjQShA0IfpioIUl4JUEDxn2Ar8d3NToAw0ngXru2Xz%2FoJeE5ypuTgedpQ2rp23BhXDgEcA4fmihRKOx7%2Fbz06BOUtUyrjnZ1kuU5UHBvmre0WCDEa%2FX%2FBCZj0yI7W1XI4tnj70DkzMoLdF%2FenuAzxBbqzJDHRwULkMvn1gjPZ8eh65BrLQtnbk3uSWNBK0ZFiWHX0EEjh0KaJ07oKYzheWRfVD1x0d3yk2fqF3r45ZkCDnfT%2FPKP6u4%2FyDj0NV7s83V8f3K%2B%2Fkc%2B4jr3aD7HvKLuWeebG6d7nfKzBHxbLofHVRmP1wvxWN4NKWUq5kdEc7qy2fRzW%2Fn5TXdjUBSzGb%2FPYMoWLO1vfbX59IkhDjed7cpztJ6lkwOkZTuXmRfeRW%2Fr7XrvoLVfRE5%2B%2FPE5eZeo7v5EribyNaCDrCQdL59O68cHvU7tqN6rdXq0vVYtpCZVIRv8zX2ti6HChpnRIjlf6TmWiONEdiq%2B69ZcwcEwcRunvNFMNDYqjUQvD6HhtgLxpHibaeabqLpXzVaZY4kuwEGPYpktkiA9HXzM7uzwds2wQfdt1jWpWddKc00Lj7mXlb08lVq70X17VO82CocKUCwYKtViqlVGuFaca4Fkb3yFygrW86Hk6k1Qtyln4MzNIo5kKyBU6uoTmOZfAYne1ptNwU21ywR5yCUZoM8MwgADBrlkkJhHsnlmEcZaQIS18HHr%2FTFWaK9GKEutlbzmSVifrHu8hvn1yZd8Q2yiIKxamVXW%2F1r%2FI5d%2FwQ6uMJEWnSlZ7jko4zVowaQkjnD0bV3fDJax3BuOOePmTpjkj5WIBdiCSp4XtcWLMiQr3GNhwtF45DDnv4Kk3WMfDl0zJb4hxUXQkqPxKRoPXiaaZVsEduCv4OHaiSxTSAZsQhiYQBktUildGfInohne1IKbdb2TVpbaSa37lpCCrAqkdBdwcAt1%2FTZ7z8831je2RLICo6iXipN4aaQNsQFzYy3vHAHKmf2DDqL5lgvbs7kR3LpfOHEwYcLjEac7k2sucy2Q0wpi1wiN%2BZoo6rC9GxIUMiGnZe4zTMdWZDbf1M8rx%2FLe3EO2pLhPSDBjEnvXN2tN0kI2IPAQARPtDrTdYHOoiO6wncGIbbv5fAVYGTme2RoeE8R6eFiVwS6CqRlxbE2GnASQXN%2BkMKLQ3bIttBdldnYwDdkWRzRlRENQMUCQIFj2XElIrXusrMv%2FU97j0zjwAlatPtu%2BBixgDoYq%2FVtO8cyuGYxsl2GFJ9BKsm92MZX2xTCMHIgL4FiC4tZv6PalPLCzpfRpM08K%2BDQNuHYHwNFvtgRmGxII1RIScxi4bN%2FS1oa1OTS4ZrMiDJeY0TwEmhOhM556wl4nm3LMTicl84J5ySw4EFHe9wD0zGKP3CgOWBuhIP%2BCUY8%2Fg76Zz6XL0EAaGTDUDYgfXHhB3xzmwYTtx0k7erDU4vt20YhVLnSEaSMajNg2UiQ1V0QTkQmMWR9E2i0W28m65YNh6hcwElNfKOnUl6mMWLArtOxpclMW%2B%2Foa%2BDlGCQu2uNgm4OeBtv5ggodk%2FpBBY7NFP%2FNPx4EtELzPQHsiR2ADPgNvZs4Dnyexib%2BfSepIibCVEVmYY1A0FWsC48GklJa%2FOT7tkV7babchMHiDEXcKMRhdhJwkc2oyGPGt%2BoH5oc0mcrNpOK0HyABtlpoNy8YO0wAZX%2FLUxpdDd2hOouNLn5V9fBk7Y7P8Y1PPB3XeJlZsol1o7lqHY16UaMTxP7pl%2Fj3iYMr3tsMpSqfZXjDPpL%2FDt9Bh%2Be283BGATMtvwMYIGZMVeDQTFKHJTBPIeCfEeEaHhmM2ZwSeGWnEWSlB8WRsf8OL65s0zp%2BOeZ4MISZWxHUyYlO5ZsJ72doWtBhG1s7O1zL8m1ci%2FOV3cvxvtoUujkZTc2RFgiqm0Ek8rZgtOGOLLW%2BZUmcs5Df1xQ6f%2Bu4nk5YzhciQDQLEWNwhZoQoDAIzZ0lF1g2Fr%2B2pwBCZIN8kA1AtpiFmoeZYHri1Ndc9zRhCSpUilOXhaiDnzK8icpWjIIq53q4J8FzfXOABVyPU2Xe5MlUwYpppviBlQNo3GDGlJsjZnOCILeItJ66T5HWyUB8kg4KIw8QmOjW%2BAlsU230%2BbGI2V8cOW3LJy3C2WEQE0FKUVfuf5z4VehD5LtY404kgwJpGXNfxmmE4QKyxuQq4dYoWiiW6G3uMSVwob2Shigt8lZYKZ0Er%2BpddWJnY%2Bvixj3Km8zN95pHkTQAzJejLbKiYekvFNlbYHuDm5qYhynomRMkLVlgMwBYyRI6qB%2B7QhT40Y1TYkj9pVMZ4Jzn%2BpzRDiJBnFvMRcjv7K56HyQnVjQyhfnGgXTiSB09fRVjdiCx39IOA1Ce0pNhwdpoTzZsno7PJTv1cwugtEKgoNOnCVSZ6WYXgvmV6y0zl8Ebyi70hI0A2h5PuuRrguYTUgGe35oyg3L6cWajFZlvBVxjDCFplv6dYhQf3cx5FgccdyBo87uDBKjyU9Ko6PO5gBXeH%2BbVTba9j0MtaZ9%2BEHB%2BYkO6xCTnttmamNvxevX5igpqt2sGMqdvvdWrv6hy8X2s2BZBZ5P2DPRbtba1hlnH%2F7UGjzWDtJ0K%2BjeMuA7X3m3UT2KzXWIrNVofHY0VuNU2f2wA74pCjFqtGixeuxdLvHL9hoHaTt8k7s2%2F33zUYxEz9oNatcVD9iQmrH%2FKeIe07swIA5AVGYNdsJAAyPOvUzU9PO%2Fy7Zr1r9stBw2zxg3btvQGqHzTM4tbZiKgfv2u0WVclULNd6q1DE%2FLvdyakXWNoVG8f1Hk8gLEM2mar19tmgwCEYWD9gzleDxv1plnXw0azbmLEYeODCWm1WUcdts0qvambbfum1fn%2FuXsXxraNXG34rzBKupHsyI7Tbs%2Bum0RxHKXxqW%2FrS9s9jqJQEmWxkUiFpHxJlP3tH4AZUuQAQ9GXntP3UxtLxAzJuWIwGODB6Ws%2BJX8%2BODkwSO%2Fav5sV3zEb9uRdm3XK7nGblWxnH1gke9q%2B2RxAOTULTLSHEpE%2Fj4%2FnnT3%2BDvaGg%2B0Ts0OJZr4A6mBQ2JA8eGs20e7OsfnCX3YY391tv2X12WVtu8u6Ew2TTZLwRlwWGMlciICyxebwLptMuwcmO9g9POKtenq8w1gODA0z21776GfznXs7b8y22PuFLy5A49l2OOmYkQ7Mxtjf2jMLsd82OdV%2B%2B3ez9PsHO4yN7B%2BYuWAsmUXgA8es3SHr%2FcPdLXP8oURnNvIBv%2FPgEOVUUyjgHPCAzb7DLd6zh1swDtlAOdw%2BODSLd9hu%2F2KS9rbMGXl4ILzj4Bf2ArYKS8OOaB2TyMfd4VFbILL6H4F0doAotya9zSbUUdtc7Y7a%2B6ecBq9l%2FFFD8HLqKRuXR%2B2T06N9%2FoSdn9%2BxUXa0x2fNEVtcj3hDHJ2aowUlSJO0fdRmQ%2B34Z0bBfa5JY5LS8cEpK9jx4dY2k3qOD02%2Bdfwvs47HJ0wyPob9mDkWoc15tiP2Qto1MepvbBwf%2Fxvea%2Fb3ydZrRjHrfrKzx6qJNLNaJ0d8eTnhYhFbybm49uuW2SOw1ztkq6cimkX7dYexxt%2B2mBD327sdJtD%2FxiW733benLxjNJh07BWwrTaf9ztwzQWhqvJp63jHGEI3geGtfVgr3oxamNkUN5AO7CPHft9PxtcO2lsMnNTbQBvwY%2BwnhKlyHn33ADEzHxYs8qvgo2ootM4CEq0Lz3rYWSmWSdBd5ZNvG9UEqrpHahNllKtrRXbfql41Us1k1axhJV1n7BMWqud%2BMh%2BojdmXgamVRBOaPyr1N1nmAsBbwwzURGxdCAO1weJAmXc%2BrhY%2BqqydqeWU6S7T7d0M4I0gzRye4y7AQVkx1WCHcnqR31c6EfSmcerow%2F%2FE2Xi29v0PD%2BB77Zn3d%2Fz6%2B0O6ePOsUVapSgiB5LiySjiBa%2Bp3o1U%2F8wbtN5308uzhg06rtOa3rvjIu3I1emLaTU79b%2B%2Bu4HOnqtX%2FdjZ619Gm3VvNt52vG09%2B%2BGZCHlYvZ9hPCiU8uLq6jzKGBx0CY4TS%2FchLl7%2B8ue7Q79%2BD8jAYSqrDYHhHxSE9tpraMBjeCGD7tdv%2FNIvfv589e7rx%2Fb47ixyMyVmrxq%2BhZVSc9FniLRkZ%2BY5203vs%2FPe5jf%2B%2BXALehYvjFCbI0O8vKVHmQLj5wvayclZvJi2JqiZUyV4tqWq6eiokB0%2Bq6Dmcy7rUezjLu8SDOMtXioiGnxtHOCiZssHwHiZsBJ05nPUlmMss7Y6TN%2FeKalM4vcGm%2Fdenf2XuGPqksDjB0pF4tto0vXeWO0CU8ZC0wMXX5fzje0PDPX6J%2F7sFuHgdIWrP3r%2BHlXbtyfv3q%2B%2FfN5%2B%2FdN6%2Fj96%2FDzqCd%2BPZTXILk3dJtC9xui%2B8us6czurNClzWF4uPEMPL9NlUj8EOayN7YZuL5S9aAvZcyt8JnMG%2BjpMDMP3pdO5VSroJWjK9f%2B3J%2FRYAD3pHfoxz23NgN%2FQpdtyYznPRu2LxZIcww7xIuN9PyE0bblR%2B2qEzRGx0OhOmbU84hA1ONAvwR4o5JTwnDtU78UbIHZMvt3rtAAuly8J8uzNHWPS4hfG6Om82JY%2FXxczQ3GjJHkcI6nJTfp9ymbtzfel8t%2F%2Fsbmy%2B8sGu9VC3AjKDsLynN2S7wPX1xTYw1015XzgVItT51pG8%2Fd60t3dP%2Fn3Y7uIZsMKjJE8X3HNR7CR0tlBxkti9qNYmJZq%2BT2sNurQ1ulzZ3OS3nLT3Dne3QGrYOvr5dC%2BDwKw9P%2Fvw%2FGVn9SW%2FIzWD6FIpVe46RnBhJYf95xwTFJYC4miFgTuu50vZwExGMYVbpFLSrUIjYBGYq2%2BBPzJvmeVwEGrziQWlXWa3s9JNiMTDqn7N%2BRX33CSc%2BP0uWR99%2FR52TWh2dANo6u13W0db2zB3tSqDMKpTnPj6Fe4YYbuI%2FsBfn32bz%2FLXPzz5x7e52q59%2F40ihx0LraWExdL2upcA0Y%2Frs3%2B05qfz3Uar9liW9x8LCcUAaAFfLu6o%2B7EVt7Yo7mMa3LwjcHSvCcHKFHZOKdT%2FWhW%2F7JvAJrQ2s%2BIe1epnH%2BoNbC6n8%2FXpkw3YqTOv9Kyc6JnO8zOI5kblAau8yUvHk6RoWI7ehbOp%2FrR39nTjcWe1IQHBZ26lTUSA79VBxhhA3joIGurnSqM1zy5WG%2FX6eDzf3Z3Dn0Z9Nj%2BFVPrKkVvz4fztvDd%2FXemFT8%2BufkdNLWpwSP8G%2FfI4f91YAQqWYEFbMfKsNKCUQDubHnbOmqudltLkAY3Ko8pZpTSkJoNnk05Mvxd%2Br2ha9h6vrd6jdGcmb7rhLuWeQnmvP0S3dGKa3E5T1A1YQl9rCH%2F088b74O%2FAG6KOdRZgfJlLNwoQdkdFYiXl6zRyzyeu0z1U3%2F4Q8%2FlDyo6PSb%2BJYAmt%2FX8SNrzgiq%2B5uhnZUXPyG0Z0XKasf7620lqmF7oDpFpl1rOAHihd%2FfnuqAD5ZBVT7AHqqs6LheSEJYVC3uSNuN7gIEG4BoygKQindgjq2HTnQCHSIImu9AI6tOxML2NscwRkAYSBA5IjoiLzfBeBf5OIwaifh6xqHDsXTeXNgqTx3RgZJwADNZW98%2F0vHnP0Q3nTQuzOgs8zDpieRDMOoirCm%2BJBDMP0ngXcU%2FMiHLsJ94GUgCu6W7DHCpgLvyKzinS3SMQ1qT8j4DEn74diu3WPCfe1C9PUYw5D3ZMRukR0BWd82HRqNVdxdIsVcMXyB3KJ4pICJWXlCcLEcZ3tzK8DTcx92JFi9BiKwogOMImyadeRBSE1gSeiasC7cvt4nEygbmHgrRVbQq1Kpd6d2910A2Qg8Ahu2GKAAATV44C1gUjmTs4S2L8QJkAIbCBg2HZfh%2BYpJ9D8ZIe9totx3ccM5bq7M3HPCZzHTHijTvGYB2SawLwg04R%2F%2FmhJ2Hj2D%2BuzWLkW97Ckt9hRG%2BwtRObFJTIvrHoIL5F%2BivxSoZzpc67YOBd9UETgfhHTmTJyjznLhO6Lvdvjo8PP%2BrtsjixFOd6WgYuR3W6mM6yQkrkGkWeXQ%2F59sBcyDaGgeicHbw42HXc6hVmOMO8of6Ku0kF88DFGvQydSzSzuHRjB9GAMOZUfzrVOrP0SQtfo5qKgBrRg%2FR3H%2B%2FB6Kx9EG1B%2FAnPMU4qEOFvSD4vA0zQZh3IfCbApPJXYeEKxYXuNIlAfP4M1aNAivBjRlrR%2FifnghDyYQsypUCtU9ePnJ6f4O8JSAV%2B9gNzzAJCTfcGXSQvropp2X0GCXNNIz8EMfe6q8owcT95XXongag48QhBBai8hOHtQN9MYFQkHlwD5%2B2HqBjG2HGJGzyjvxSTN%2BxDe%2FljaLl4hH8ocBca%2BUB%2Fwn3AQSm6bjhwhspjEb5nwMqHkefhH8wY990A6DNYUqDnYncM0g19T0ewm4j7QRLBGhAP%2FHMf14XzyJ2O4HscXnoRfNNz8RvVlfBNGPfwPZtOKf1K3YhwK3hDEqqEMZZvPMASQF9vPMW%2F0CxUJfROx%2B%2BJN%2BmPIvqaTOlreo1f1DfhYOhMw0tH1wuqhRzaoeqpKkF7jfCPEwc6U5x%2Bf4YmjnWuJOqTiVCE78IveBd%2BwbvwK57iGIzGHn0FOm%2BgcwU627SH8yGJ0ofou%2BB%2FB%2FpqhH%2Bci7QPLtLvtDyw0cNl1k98YCVfvKhLwxX9i2ceDoocaxDwAn9HS9FjlNLRM2RLgLuxxiPnbGHZtqfaSbDWqRRoeodXxuWMqrR%2FZ2isyI6yA5N%2BiID%2BONwjDFaAqnIQ9TGsHeFsOJeQxQ0e04SA6Q5CTqpTNx5JW2xfhVzCuLKjcDYe4I0LHzsMi0SAt2RQpk5cUpFn03jcR330GYcTr974%2BMT5SHt6f6gu6lcr8WxS33jiPGsUgWxvHvnOaonw021joZVr3m711F8yVQdGu3AonEF6PMy3VyV1KGysLdqUJejpwmxJMZOrqz5KW4glLSlb9fIpnOuOqQop1bkUmqx4542VAHhcsnW0JSE7Zkpo1Dyz85ZVfXy68jfSByB0XjEfaheMspXhOarGPvv60wvjTNy7IvWWfIa9pB8yZTcZDVxCObHAm89frnVuC4Oq%2FHinEcVHwpNajLMDbUUCTxgMZ7E6W8Uz1%2By4j9Q9lrFnHljdZqzd4bhal6Kk35b3ndGCBSVgEYqT6cDWMkwnhsd5s4qRzA7yCG1xSUabYsBUQudzCeXrieOtna9tstuUnschDPRhHRbvxhPnvI6SR%2F5cVGy8fPFY2VNV%2BJObMth8I02h9BMW%2FeJPZVyllSq1hrl%2Fw7NUhcxTJHFEfbgApD5kNjeDSZsDuo8wyJkHGz2GUr%2FEkE9sd%2FyUtD1%2BKrQ%2Ffkr7AD9LrJIcOYBC%2BqnWUfi5SWfhx95h%2BLF3Gn6o46SkDicy%2B6clR6zSoLi%2FCCt5YbywOstrcIkZneEjkjOfG90suAyM9lPE%2FnUG%2FnDo4Tj3FRskIyB3MIBlqucllx5sgj72P5KQ%2FBF2%2BCjNwuUlLJ3G41Cn2PNoF94ceCoA2CJ6RI5M6%2BDY78OuLX3DNj1%2Fe3U1%2F0wNELkFd6obSz1gnq9bDZI7cogMvvUwuk2Sgp6UPmOLA5Sw%2BWfdmeFHYCqapbBzls1NafqWBTFSH24yLFk15tYYMcBSVrKcpI%2BHJOpOR50OOIKSX30ycQ6ELVOi0yVYYlfJ3k5xIwuv52Yv6mNggPMsjKEY7KSQXpSwtXEXc5cCiRBBqWDTGkabZWNAq7Q2LayyvH%2FFmBF2c7l78Gbou2PJUA564m6WcvTYarZy7vgO1nL2eLwsUipHjWQofhwxjp0HBgzx7YrlUQc6dOBvapOFuH7C%2BaeA2H4ZsBNH8ZzTrIAALc4POSUIanaeyU61VIxHdm7FQPFZwSXUeumQEP39zAOcanGayYRNKcgJBY2fYOVWezZ4KrlZlFixr7NgB44QHMthPnx2tlT%2Bsjpse4X3rQhiKnM3LLyzrGX%2FlKgqtiV%2FYcn6%2BDEascqC1sJ88Y4xX%2BoPyTJptTQ%2BC8Ll3NTkbLlb4ZuT%2BZv5iWHiV1XP8%2Bb1rkLmorBZO1uvd0tLKDVBdpqsT3VAUBsFPp5UXNOxMp57wILsBTiVQpQQM7YP8qEfKLN1eL5DOMFC5U2Ty9QOs6xitLq%2BOT2yhQIyndRobR7MIk%2BYBjyO5XpmDIwBQ17xmGp410phX18lpuUGNLFe302Z6XuuECms%2B7fUVv0fqxJKZTwRGA4%2FuflqUx%2FkwgWZOZZsBNfW1gqsvdCHZSPu4PV%2Ft7dPLHYNJwLSPfehrB15QsyON27iCuRtkKRAvDbJv%2B%2FtCpn3QDQ%2FnvkMWfYQhC2D9K%2BZt%2BRgWtW04sRSmSvNKmVo5sGa7UV16Id8izK4RHFaIksUX1VvvUANb9xh43R9jU%2FeRyUzN8dZv7%2BHKc2s%2FB3n71Y35%2F%2FKLAMLc38JHzxsH5382xZVDPkXmgC%2FeP%2F%2BhRk5T8MgWDxx7%2BQNuL1uYn1UQLuwQlHcGBLVzjoXJwLv368zqcjKr9JmNl4sMik7%2B0IBwSTxBVrSQdnDo6lJxPRRenVcyt1K9o7u%2BD52j1PEak5CcQ%2Bp0%2B66k1y8ouJ%2BUt9wY2BN0SRSsBzNQnlXMIkkVG1mPySweCkcu2To5AYgrrlCmAwdIXzZFpft4tiDmE2jsA3DUzGT5F8VwnPzhUdeW3%2FlJnmCRd5OkJh2ZkBiFmxAY%2BZrQGO2a6fC806lB55KTzyVHinbzsmmcyfQWYKYYJC2guvDkAYbTziWxuq2O3V7PrBL0xJx14%2F%2FNyOxmTG7zdVruSMOkyfX62p2znE%2BzrMZKMW7lSPXF%2FSvxcSO3dGFl0NPM%2Fm9K6KQbTfqz91n2ml0ymwn7rD%2FUNrgCgJI2fLvThWayD8D5zBipvC5Uw1ixtaTjRvKAcoyUjrquYGEUI5KwMAtbrZaU%2FI7dAwsOU0q3cVxdyX8pHu4V0%2BvdIjLzteNH7%2F9xMdaXgAK7nIyvQT9af0VCuvoN1X%2BDpMV3Eli0Qv7Pcgt3vU4DCShhRLuKLGkD68mrlDuG8sqqGKe9Fg4R%2FUegzh1%2B5%2F4RlGUQqSwisL5kVUECnt%2FeGxZOof9AHMVwShzXG3un3OfEiYeWOKEBd7lMllHlpFiEKfioc%2BC3rk9WHPcPgu0xWUqFm5IdPcQnZ9kTycyuBNPFcyDgWvgyczwnenuhaMC0ddHOIuoFohWiCXo8sfTGR8btMKRAY%2BSiaAbvNmZaBTPpozGbvSuQB4yiUEYeBMMl1Ym2eROkpG177zdUX7IxkZiJAScS0cTb94JO3uRHd3gZu7HlaJBmg3IwxAFLm7M2ZumkYcBvtgkw64yG9dzx7xetg0J2pOjle9vygGWzTo0HS9v7INtwmFIzReNAz4WIqhnDqyx30e9NauFONtYJFv3%2FHzJhobC3Jcq3Gc9cwOn7R2tdpJl5pDp2vvxo3SaYlKXKHBtscFLTLzZSDckCFiBL7yoB4Nhoo8TiunLHX6zI4Maw2nQxwY8wYo2WZRFeFn1iUcaFCmMHAzEhzPn1sW2FNok54RQGkMlQW54sdF0EVgBemSokt%2BytBw%2BIkWVuElpUoDOpWWRdaJpWR4ucCm7nVVCEnl09nQDf2NKl3AO6ORMXaaoAqtNRBVQZ2mN1tmnvZ9PDiezYDrk6Jw2Y9Pc%2Fic%2Fxalj1tKegpGfmwcVt0kk2tUsk3LZ5ic1ehKXHFOfjtuGzSLDtHdiEe%2Fk0dmHpxud%2BUP4ypBBDd1uOZBbRTO7DLuIzMoRv4h%2BrJsgRtpkvhqirQ66GjmLVcjMVXl39fgVgUEofCAYX5u1sw%2B1zkqt0XpcvKO4MU%2F7KTc8cufolTY2NE7uYVcz9lxxU4P0O%2B5p9KOrbWkw8413NExm5TIgE7wFzaQUr1eQatnWQN7lIOYw3%2BTgCdelz57po%2F8oBgWXpKGFw5IpjlzHsOxU2ccJSldxE4fe%2Fug2yyQ1JoIhiiqT8vowJlhDCFAGILl6fL%2Bmxof5SCEkepwMBOq56NI%2FABoTXf1g6JveukRjlkxItJkNlfFvHMc21VaRJdT8PtOV1Ab98W1iCi5Tg%2BW8cneCxDkCodzZRkdKrjbP%2BwyfoM%2FwW0N3ezPt2P1ZVFdBnK2ukNvu2lVy0qqxAGmkgH8cpDGVSpov58%2BbZ%2FPNTmv%2B8EFr%2FvLlC5JMvuKfOf2kP9%2Fmmy9ezF9szp%2B%2FvEe8amKj97EqhH%2FMIk9cFyjlritD%2BviKawNlt60Ox%2F%2Fee32we3yydYT7qpo208E2bj5Ya62uvHj%2B8m%2BPBYA5ui0FJHzYaZ2hs1r%2BYatOrSMRQeZZ%2F2nzEQY7YE89H4c9mC8KHJFQnUIcM%2FBNash%2BOMbf2lQafpFbEv3wklE4wF9Bk%2F4S0e1HIf5ANTZ%2Bw74bNfXstSljMDeWi4gNWXWLu8OML5gWguvOtu7q9NnFDGlFoT2wDAONHOAPm2gaBl%2BwFMMXGYrBvxfOi%2FlT5zn8e4nfePES%2F7zAP6vwbx3%2BrcC%2FJvyLvInzeYY3euctZxrGLaj72L1uOUrD3ErL1KL9bkvBGrQIwuTci1oOKWVaUK4x5EUv6xa6%2F7cQLwsywz9Yt8O%2BT8oNTPo8I2cIyIxxob1BK4VEbTno1RfFfm8MGdV2BAtDIBktJSe20Gsh8WGwttChvuUQognc6Sr4JHzGYNanhyGp5YQD%2BI3egi3amFEJWhqroKW3mC0ELYBX%2BvgazWFbzhcvCrGeSsZoYcs2sYDX6qcbXGN9e7hIt5zmS%2Fj%2FpbO25qwhIhgJvujpMYAhFWL03Rjfga7uifvJw1YPLzz63SR1nTOIwqkD%2FYiDEX42obYqr%2FpFNJVT%2FSUNL7lnD6Zk3ZHW3OlfA2dyKKJ3E13r6QeF5lAGwfg19lGn5NDiA98RsAsPNikR%2FP3iTxFeQbnueQSI1oQ2o97S1XIR5wGvm71rqB4i4Q5CxLUJklGAzuIBouPEiAERJcoJHPg5zMYQH%2BReun6i%2FjbRWxAHL7AqWCoRKBNNGQf0pxkOh7QUQOWaU0RuC86bmBCj%2F0zzkoIcQFEvnCFMLC%2B60K2qU%2BiRTYXqhoWBojTVa2B4Knpz5AYD3J0Urxbp6BP%2FwFn8duLRLEFbb%2FWkmGaOh%2BelMNLRhX0Kr%2BrPIu2QnUTXwGpBqoTbPeyvxRWCShDHUXHQ87%2BbG%2BRECY11DQMJE%2BEKxOaA%2FtCUpx%2FYbtgfzh%2BzK93U0MZqgvWxNyeh%2F8XLInMAw1AIKhPynB3gLEyuHaW1dqae9wlm%2FxRHK%2FrXhlfX0KwRGfnH5FIU4yhLaJ47NCR7s4S%2BY%2F8csYz94TW8nNjTUN05VGNBXQR0gRs8ChPTpF%2FwUB9qBI8m6CP8pSRmeN4QmgtYD9q2jmG2Nun3BbJB%2BIU%2FnAhHE8qC9EehZEDJJ35M0yN0EBgs9rG6U%2BQrMYIuPcC6%2FPFAcaUHyE7oG6pOF5Ayg9uVmwutBOh0Q1zGUUhJDqEbOb3rhMQT2rv1%2FHOE7FBfyBbxJ8wgBaXR1OuNuhjMpmp4NIFjpxAiqGRGDAR3kG6ZnXMYhX7gzKYYsR5%2FTSP4vwlzKfAuCaZwOJ7FOKnhpng8i6b0s0lJ8awHLE61dAhzB0fDEB2hJ8gnmoRnDd8qpjxO%2F0ETKxDRUISijsP%2BJ9S9qdHRhNb2B80h8gQlYuOoCMcX%2BDBcePEv%2FEMUkfjShZaEZA%2BaGmcS3Ysc40HKFJv4Okp3cd7SUNC36N8o7cwS1QbZ%2FSo3vgdvpu8R9GkYXTdpBSHKBMaTpqpr9yq79oIY11iaVn74ANvRoVGJI8KhAiVhU8HHaPAW9dXsa9CuNNXFAgAHaKpxojgvId8oVqQAw2lldEZuDKMdkugHNRGte0Rb%2FERWqq9yebBJIAH7UsPr4JgfjlHSCPR66amxrIeywuXBkYytpzzEMifEvl43YJ4qrkznbfqrScNd%2F84kKBwWwM6VUKCWakdpVGA9nQWf1N9mb4Zv0BcgnuBj1YWa%2Fuo38RLoEge6CVcYKF5%2F5PU%2FeTj8%2BjQEC5TcFeTmlNwViC%2B4ki0IuEYUHwiU3BVMETrvMTKlZF1iNT7op%2BKB%2BJM6BqSIKfqtuzD%2BiJmN3S%2FXaqWc0pzEjlhBCYNGQzPFgku%2FlXiFowh%2BIQfoe5kYA3y7sFERFVZF4doCHyGLolX9F9S2zXx0arkqaYytntMVwH0Jglbh5y5Unav7LQ50CxJzPgqT%2BYHkp1fP3CXvQVRs29NV7CT5g0%2F%2F%2B7PSh59tNP9JlYCf0ZGuDsVws70wPSaEITDwrxSqxTN06Pj%2BR0x%2BFm08xf%2BeOP%2BI%2Fv7sCVCjjR%2FLi0CQwe%2Ffr6sfltfSgLPXc2N9ST0VwnFdq%2F07K%2FVM6Z9CFu%2B1GnOTutea7zUE%2FGJ4o1ppcy299sMz54e1Z%2B3mxp7zw7P2BvzZKy1TfdH4sMdp7JtwxirEA8z5%2BiBEQKKJCroGMxYXvKcNTMZ3PltuC8MA2m0zJTsSqt10TuDWOoTKfE9tR1G3nn0TW%2B408FEz6BzQ0IXNnfP9f%2F1X2WNn%2BVBjP5Q%2F9J135TyFDzz1LXzKHlvX4smcBLJ54vbmKN4MPW8w77n9T4qs1HryGNBqz8VBmrEdZiqj%2FOvfvz%2B%2BEYIyezvs62B%2FF%2BBmK9FCJRak8mA4av%2Fc%2Ft02EMgHozgIMrjrmnRoXLNayC9DuhcWitQHr4AQY1HjQa9m51DBDMQfIUwFKhC3bFUl9LqZoGpfALPcak3SWksz5kZBo%2FyToWE2opna%2FTp5He8a6Akx4VFxMie9yTzwx42iVZ5Uw93d9nYZJhRF75nXH25uthY6M41b0KDz1q81PpgUYhQdoH3r2JftsqL90mauLsuMErNoP5uKeRUKXPYuDGle1gB1qYoqKErZY18fvGF1QKXCb7BXOiREGsGyo7LAtLXHXCJTnd4TW6vh7lVss%2BXCWyGBdBzAGrCGZYV80367dbp7YsU2pGldeDJ2RYGQrXgFKrG%2BAkXww9ETtkCDYWXkSWdAgazEUaNkND2LL6VmW1C4YdDPuwev%2BZw2EC%2B01rXaodAy5W%2Fu2Eg%2FN5%2F6jY%2Fkx3U1yR%2FSCcZgXptvqrMN%2Btugv%2FX5o8Zj2%2FqwZM2sHizMVqElMEmlllL4gbVWwUmqKFkj98JDN2eQwkAMFiHbcJrmp2jJUt5ZmGcUB7tlK4UjPG9MUmg%2BNVyKQxEmeoFQnHT5IYcp%2BUebJcplXYz7ijeUno7SkULF89H%2B%2BA92PuoNgpLz0bwl%2B3FFPz7OWQTeYuMuEn%2Bx%2BQAKPIZzGSufETnNfcRP06dr93Zo2ERVvv3ksIvJ93J8mL7oJmeIR3DLjeLgpodgR%2B1D03v1VmwNtTJrqBCeJlbmtv4BQwRdrjXJqC1eedhttF685DuIdG1lLyyJU%2BugGnZXNyUBPakZaeYz9iB3O5POmv4eBhliS0ijC%2Bl3HFb60dXGE2a%2B2UjagzvsTk%2F0cj8w46HeyEV6sZ7z09y4H%2FnTREGSTiZuYJ7nKk8DVa%2FuKIyTrjIygrerk4Cs1t2JH%2FiT2aSr236gyVM3gsK60flsQudQmhqO%2Ff414b%2F55zj%2Fh3iQkLowEDBwFg0pGKB9kNsf0c%2B0qVV8JPirTsPhhzpt9K68%2FiyBNyiMLYcejGrN7uIX9HDkRtfqQvu0pBfJSP%2BKwvPIJXUnvTt78bmXdHUlItg%2FRsk1kQZQZ1R7XxfJ%2BFLsahyA0zDAEx4kZ3n8LCxT%2Bt2FgRcpnaw6a4O%2F0aeuG3fdAYkweAQHpZxA7bDcKh5POsZij0498y0eS6XzPZWQFYRU%2BbA97AYKgYUMmmcBklONX1cdV6p2dgeDrj4A6i4s0uICXRVN02ZxEk66epjlScCvUP%2BPFPNBAw%2FV817Qx%2BIiQfUuqR%2FxMu1I9Tv4VHgjsLSs2kRIUKfvzq66cTiL%2Bt6iUcjgYZCVTR3xUXadVZ1UUCyuRYtBv2KjpKwivcbbKEoXsQtnOE4%2BdS8jd9qd%2BdT1%2BuU4MIpDRbWDQcMyLAaLHiFpwbFVUpoCp3XH3UkM%2BdF3KkuKvPPZ2I26Oax0shXA41FstPzjiKCalS5DF9oFxj%2BdV9JTPyeqOv3pNPsNVVMn2oUejIu1jc2xV6xwRoUqF7OqR9AJoKPvkUaekTSETgTOwujpENFkqU11EmucPH3RRnmq8XBV9BiP19P302%2B0Q%2BhT39LI078zbphdX3gRjix1SYd03R7FC8mNXZVI4RK8%2Fid9SRF%2F9Pyitk%2Fps6CreL4mxGPPm6a%2FKWSw%2Fj3rTfz0giaO%2BqkOebMLOgdWs4f4Bs7PjHWqGZBO0uJk1gNQFy690ncuCKod03Go5ycx30UDhLNkOkuydUc%2FUtutKCag3x3ryxhPzrvwLNi%2FDaDpYteZJeTtrntswfL0U2PnMkLmSGvI5%2BTvXXqAkh6y63QlwetsioQYe3no5OKsaDsJtI5Ia6SXQ80JqbmVZ5njx93Au%2FSibjKC7SdcLeoNF%2FH1BIcd%2FnR7cTjGk2hSWuLUxdXvnFhZ5HhoyUukrvqpE%2FQVxbhQaJnpHRhKJZ%2B2yFm8leygwqBL96cX6UPSa57VIBWf6QfdHMcdFA8Y7wXiSvZ1w89CG%2FpIwN5b4Fx9W%2BKuXFD5YoRIDC%2B%2F%2FsRZ73TWTX%2BESs7et%2FIqv4uAjtPsHkRzGP2ep3iOJKHnku8oqBdfVCavYwFk7wHDsh2P%2BWCq6iflshX9BwwfAMMBwfR75V6vkjcr4VPmrw2nZNF32YD7FJyHmRc0c%2BjlzsXcATfzZzAqbnpRcO9j5kEheaiaPsCCh7Ho7izELoTHj72iA6vpDlK79r3xwHx40duSO3XA0PjvY0cZ4lEQB%2BDsZLroZqeC0SyvGIQbaufFNyMpNgoz8Hqz8%2FPi%2BSuMyuugX6SgUWKxjVjcMsGng3l%2BCF4Wkm87lHQneYyrKsqCGMALF7rvn%2BBmoI8RoXCs4dTFFX5Ak8bwYcmFU9AIRSlhoYHEeSnjxzD0GI0dU5ggs6IPSI2i5vpGGMDavrtfuN4JSIS8tpRHgBqCxngLz3apcmNHIRXkucMBwy6ovZVm62tllFegHbODKeUa2cNoRygroPyVf9mea8y5N4bDdm2fWb%2FUXvvnRlRCDFcCHZ8vCXP5rB155%2B2rqTkwoJmvcL8fjsfKWitfvC00Qys2hYI3siT8%2BANPQIglTj317eTtsTuZegPxURs%2FimSpRPgsKTvSpfyqWaUqQAreJCRBC%2F7iXVvb79jgD3tuof1rvwGzNvMgzcgHb1FATzNUzcAYcs0%2Bek12ccWxSOgDtlQVSTU2x577q2%2BsVP99fLBvlGUbuHcUjp0UygD3pHweHSoT2cLDKFIrGlnKVHGebSH7lFKgJEfeULd6YZwTsfCQQ7Q0ZkOfNt2pKZzhNYqjypzJv3m9LQ24UuiwjGphQ%2B2jo4MjCVO01jbBwWvtC3fMqbqsQsoR2tQLZE9bYvKk42vgfFecfgLrL6eeHu0ooly116c7uyfdnf2uOrwy6wcLJBX9omi3gPQTf%2BIZiCk19HWKxBsoRbpFy6LCslgc3J75RD9%2Bi0uHZxDNFYZUoG%2FNgLaKbHBhWP7RiglaTKZup1rEYsEC6aaMarkp7rtFzFFYMDWxvKOoh4RQGmZH5h5tQm3lhnNKXBi0LNTpOZHe5ue1ffD2bbvdLZRtkQfFgqnp6kqm7OWwc%2BqhViy7a4bwE5jI9Mw7F%2BpS5Z1Wr2YB22YW4FaaETkkPvp7GCQGcXLJn18hiAFDxPFjFu0YAx2U1Xz%2F4KT769buzht75S9Y%2FGUJ0ZL7eVsAnrSsXFYoZRSAitwXTh21EQ3nxUun%2FumSvh8gZU3rDmOkSgZIVJdHG9a4vSZAgzEEGmvKRr%2BelaXOm6pRVCYw%2FDrj2Sm5eNfC4S%2BbR8Z9Gb3UwPu%2Fj7tZYBr0n9xq%2Fo%2Fb%2FPKoS0au2YXgIHkb%2FJvMHJHpaRY6midCu%2BdgbB5tlNWmBK5GmTTu7G8d%2FdvqMcxtF4vexc5X21mtMhAjs5p4Zb1RHX%2FEhLpAI1G9eXASpawOHXSso6CDIYbBwxEeQ0OP8tEKKb47pqD7G2w7FCL3NP9oo8jLsWKsJsRlsY7WHz9%2BLB1X66gPcuINTE91u7GHlJWopDz%2F%2B6Wp1Wr28lgSlwRUEkspPEYD2%2FCEO9aopD5%2FjdoUCdURl%2FJzRE2oe5kjtfX1dfNB%2BFFcxJK4pNWoLcRWknXV9zwIoNRn5%2F6k8%2FXpk%2B%2B%2FESb9%2B%2Fe%2FNaR62O3lK76RQBwwOJSKFq3OwEiRpyzqkSuioO5cOevOM%2Fj3PQVtvQydgX%2Fhx8Xd%2BvKHrjwhJQ7wVQS1I1W7G4DUpEzUamkYlAn0DcW5ts%2BT9%2B%2FX660HZ85Kp7G20sKfZDPdWENPmmLj%2FWZCAt9hEKc99Aqto3PrfTHXMmiM0lcUbZH%2BcC9ctQUw%2B38JAN5Sw87bzbaPHz%2FaZxsm3mnglz17mTlWsRNl4bYiFpmGWcfIeKIXRjFYry58XvoTfDAOD%2BA1r%2BG2w62jrb1jLSOSlFNfWyFbYSXxKL%2BA12fNF52XXFRUd5fJilL8moI5PkYAgS%2FmWVAWunh9xfnNcwIPgzYHhNuU8lCg4Nk3HYCS6z2wDDzcJTNhgmGA22ACDPKPm7p%2B5IRDFVk21vGQ0HkXnpZWwCkGDqp%2B0nl%2FgXoebbBMHGCtHLeMDdRyB7U%2FAfCdxoaM5Z4bsiyN4N%2F1WcjSu42ZeBMc%2BGrFYy8oNGnhThnT%2FZkB3G687IdicjrdjdP3YrWqb6jKLCBJyXMscHi7CTjdYtag1o95iNGa3zeqsCw4rjHkbxkHZm1tLTcdjEIVYQwfPnyIGIb4dSvDgFJDB1kBgp%2BUI35QTNdYztE%2FSyW8WKRzDi5zl5pi3SzxRsHh%2BTIoR5x39Ipg0peE92KtRg6VYXA9CWfxQgVJopuNv55tAod98qJD23ShtrcNjy7IB1V7NVe8Cr2Fn9IeU%2FVY1mtGhdT77iEWt7kYLOtCQQ7B8Mi8WqrOQsLyuqocdl%2Bhig68NzXGyWnC78Mm57NoivP5rhY4nysbyoefbwzr2Z0%2FNfXTDGefwUWGHNmxarBbDuyuiGZgHv4GDnQPFI5QCa1hKs9NLNGdt2aO5fj2EwEun0csPozYkYAYauBYwM9nBwUnLHqdGIVKQlQVgFe3ehz3E2gsNMLWwKzU1mDC4iASjaPSb7Hu2Eot5k16HM8myq7XTLnyGY7qa7dvRmZA0ol5PoREPPpmmX02Fl%2BPIRseOBj0bVyvfB5vedt8wDZaBps0AaWWaOxoa3scsgmzHXpRn5%2BrpGT2iPCtD0zBZ0dD2%2BFOMJj1hXAC25k1BEuY9EyjHkWestCEQA3QqIB5F%2BYSeFkVCpl03mROa8obuVK9AoXmGEbC8xMetGs7jKDCLot9sU2Gse%2FgDW96ZhKbEG8UEh6jMiOolCqhCL%2Fxxj6fRW9yxtuWJH6LALX7hrMdz52xuN5tNgnahEXM4pG1L9jwb1%2B5aHrGqApVjaMU51LMqlES52NtCZlYrXpSZrS74EQhgoem8j55y%2FO%2BNY0WU5pZh7c8xIplMr4N%2BzPzbr6UveXY0ZJpTY7MWlxZ66DBDA838jP5nJvEkJMi15wQQJpM2EExUKfmCvMzulixKfHOc82x%2BY63kjgXkWg23bvraUh2obYEfnYuzKIdDX9okpmkMJl4A5%2FHatmZIIQmm887Etz3jjrPZlSZQ%2B8IqNlAM6fyDnIZ1n07Eg74ToCms7xUInZ6SjYbcQctyyQaz6i9D2x0grs3h1OqmTbJ3tAs964Ho5HRWK7Uj0iks%2FCLoWuOWiQdukyI2g25YIA0NkB2E9cESd%2FbNQkcyH1PwpVXRLMqe2EQTsJoOmJo7HtEjU1%2Bss%2FXx%2F1QHDH7csCggx5sUcoTzEIeTN3PLHjWwZSJugcgCU4Q9Y6T%2BUMPUZHr8dhSGd1yA8etF3oYSeb9GtvDzBmOr%2BUOOIywFGb7H0ac7RGNr26HymOLU%2F%2FQpqw8hQVMwK1IGEuyyOGlOdr%2Fxbj2v2aMuR15Zj2PFEI2I85gojPGduQpJytGHktD6shD%2F1xODIXnMjtDosZedMGqhWReAoIy5VRUUjEqeayZVNy5Mxrr1SMhytaxy9583B95JiAQEEO2GSQae6Cg8oXtphux3asiSltAlQILt9l8KuFQnA4qTW6gY3HPcay9qhmZlyfhUQaPRywC37HQj8cEpGoSE8%2BUSY4TLMo5XzJ0grlmZHbfJn3WkzaBJ4JQRjSesZ8whnLCucmJx3auJyMvjFioErTNFUi8108QLZlOzlgKV0QgqS9ubDHFpJ3CTkba%2FwDdFCpOQdbhArOmso5EOhPYTwOfcHEtZP5szhOANvL4YJLUL7%2FKAf5Ssvm2X9VRm0n1oh7XB%2Fzqx74YL9qq8llQuO2l3ZjXEvoQyDPG3l1BGeQO%2BWJMIQpMGtMsSiEz3UwzZCawnHyLi6RI5EGYMpOGS89DNAqTGCYJ25H1EuGNzORXiGZE0CLeZ5PaM2vY712YlBG6EZhEnHioouqOuYC8SIyEZUkSvonWCwesIoKaV0N4C1SuJoJhdx4RGD1PgAEnNMhCv8NTEkTGZWN0kcDHS5%2BxOKDIg4NiJhg0RBdmAjr6DMAmj%2FXwwKKuGXixFAk%2BJQtxqEAgnElS28DHg4qJH%2FAVk5KOTKI5UBV8vUmUhrQnTV7POi8lVZMnzALP3r%2BepZ28klp7uKQw2hXnY5587OCrHTivjh%2F8IcornjDbpDIAKeErpheEs3NTBvNk%2FZsnj1JPmtFejD6h%2FvCazyePYn%2BYRG71LzYa0sbX3ZBPX%2B8K3URZj0uNPFTYAybVZb4UQ0HxRrRuWr3SRF53gp2XaLBjYYuVdNjEixPOIp%2FfalPHnafqOLP5sgQuS5wLLYPRubszU1wduXFX6MlRYG4D%2FQHXRLDjLttUsM0E5aieCIoxX9ATEa0rb6J9SYdkY4G%2BRbfkl%2BqWfLGlgMqJY4nxIa6%2FSeKMYOybWqlxZFKE3asK%2BtyVF9CAPTOI3eSLQQsn3rmZT5i1cvsLSxnBxXAPqKmgY5gKxaGQOAYtkhQFPAR3RGcqnDgG3nLBuSTsdTwegQDIHFC3pkIfceLYZQ1FUTV41ovzkB9lyHxaU7soVbMHCSycO3YQycb6ImnN5nuYmHbNXXv7ZRmkVsgSpQrqxPh6gmo1y3NV9J1EfLO0uVLE7izwh9KGihpDookZxTVB0vNoWAnOpqW1k2jdI9gYyQkTHhQ%2BTjxebKCZo1ZwxQKaKVtgdB2TJHdCIukRpIGTcP1AIuoHEnbGWNLDSQRUtiYKxYyumXmGuEvDYWHeLDllSlv0i4mFwZbsmUttK42BdQ%2BhQrPNeT7DTWJ%2FVgvEmVpHkqV2MdCzQk4XbSVvFL%2BzACzNxGD8LPUwKBqWz7WpJH9Ohvh%2BuWrG9VxWyhtEGV0nKz4TmCp%2FeWOzs8%2F3YW0Wi9Zm8V2tzeLq1maxNUwoDcNSdwLJndFuhm7pmse1x%2FKokBJubhwK3aFc9wdSalYG4V34KXOiqmC1uXSAFYM0lTa2FKkpP8V6xAsGq%2FS1Rr9XGq354mrVcBOrHqzjOO9%2BXstAN6fpWZ0OtUd%2FdZy8%2Fhhj9ukL7SqA7mEaNZfgUvtoPrWAtsUwm%2FOnGtpWwdwiWtI5BjMcuWN0GwnOnRFkgZQ%2Fwp7zB%2Fz85I%2FHzif4gdHunDH8UBEwMS4cBc2DOZU4nylIqjtwIvqh8WATJ4bLBOeZn2ThHsPxGEPcUODHRPmnYTTBCx%2BeqIN3ojTlXMK9ClHXuYKfX6gkXwLlG%2FclcL7Ayjp1vqjMXy6dL18GswkQNIWgFpwvqj2%2BIGQxvOgLoUZ%2B0WkaqPFLjO4yXzR1cgH%2FUyw7%2BIrweuBP4K%2B%2Bh6r7RUWdjPu%2BX6u4HLr90fv3V%2B1%2FOgqhyZGOoCqAK%2BcRmkHQtnkU5IdUtfVRTxBjkmoeJa939xVHu3R1VMheJdjkP1n8jMx4NvYZSbOywlqYGhUpMCwYs1FTo3xl%2FB7aVY2%2BR19QPqz%2F%2BHQF%2Fv%2B%2B8cR59GhyjQ%2Bobzylqw%2B%2FuuP6RqOs6qngY697vbVJYJGPkA0BE1prvH%2F%2FoXWWhlFbghMp1XGPYJ81OOimmtyPHj06%2BOVuBVWlhP%2FvUrZjDW5XV8FBGhlUatbq3%2BES78XJGlk6BslPzmssGgYG1edwm8532rxlbUdFIb1bxb7DCnVWqSPW1O%2FGyi3qpmzPshptEvf8oCqKhYF1Ae5RtcyRywovxRkq9smH77Kxgvj%2BndsU%2FDicqCUGMbUy3bWaCrDgPHxIRaofKoDate20gI21PVq76jAbHj6MZ7Di1Utng2Zu9vroV8310%2BYP1eSEb3%2BypGIIRz%2FrNTMJb9PBqM7oSTmcjcfXqcM0TPTeNbE1%2FN7YWN%2F4%2B%2Fqzpxt%2FZw9D1RetrQR2oaKkFkEJ16rJbut%2Fiz%2BPb%2BpLWWHrsDTuTNERGgpx071DVoH6H%2FH8D%2BU%2BMl84VDee26okxJW4%2FwrlPLtvPuSTkY9ylvvJi3X4Z1wPdCzy8ycY81nl8QmdU0XuuXSvCQEFZMyB4zoUsNcZJZOxteEw8Tlu6uxNhalSHI5CXa8mrPPutC%2BL72FfNp1K%2B7Lp9I77MnpstX3ZdGrblyn4BO16ThdcYueyjxlqr4bgFySEOF%2FzUtfXHP%2FFT7DufOtIPutv2tu7iFLW3To9OdAe6xhbGtUFpJlANZXSR%2FDdztZe%2B%2Fhwa7udoiEpLt%2BlsHaXK5ub%2FJaT9t7h7tYJvO7o59O9BZDS87MPz192VgVv%2BLen%2BxQViLDUUpf61gO1ADTq6LXJ6rDq1OaYQM26piDrQQ7Kl7eBmYwCC7dI5aVbhebYPjzsHh7t7O2c7PzazpAMrRtBrpApbAOxbLTf63ZWugmRSmPpZYGaNAIM7fHe60%2F9SuFTvXWbw87XZ9%2Fms%2Fz1D0%2F%2B8W2uQpp%2B%2F412msdC9f7XFAn12T9a89P5bqN1E5VC5sZMlRZkqRvCFFVdemqL4j6m0cg7AofjmgDuojYQj3nCoi5rSxYOqkl7%2F033GMZ2d%2Bu4%2B7r9885%2B3bpOggSZFfeoVj%2F7UCdICgexVDZ%2B%2FNYoFwJ4%2Fpop8hSEqz9DV2IdT7h1QghKGIFNcv5IoeIqCkE1iooMDQT%2FU8hi%2BH6soiQ3SCO7JiWkqhmegLnbXi7WsnEbo9lzz5%2Be%2FX7V0a%2FXszZL19eNFdodLIppzddo5Qttz3Z2OLWVHl%2Fxlm7a%2BHH%2B%2FbP5jz%2FMN579Ax5bf%2F123hs2gHq2O%2B7MG0uGr0aYhf3RrTpL6ctam0%2FPXvc6Z0830kJuZG1WWsP505T2X3hFwapZNU9nSNvdbc3H41Zjjtdn%2F%2FOlA1VdUJEIHQpk%2FMVqTfXcDxPUtKC1IIn9hY29rjyIVMOhf0UodqGS8GCLMXKnMWKtIFwdCnoq6onOS9uHKWq3wiGmCm9OH56JNI6L0YBxxzEh6dInACcM2gEvnISRZ3RCCRJHVeXj4VH78Ohgu318fMAic5tx4sRFEUEQ4xW19cWgvYU8Ytg3MUBYLQu6NVbBteCv6gSHwNRBgI4CCm6EeL4YLAhVfO75xHW6h%2BrbH2I%2Bf0jZNUBm7dYxO0wx7Q7KpAKIUapSQ7GQr9AmjOIS7ZiMd7go%2FPO1lRY7lTFy30GRV3lJWYA2lQpePMSqrsgSeZEKKKLpVJ0GC2FWA0%2Fd5I0LxBIVcpk9%2Fah93D76tV2CMgvbwfOAm%2F4ilRmUcGxcoPCDfJc5N7kEm97tY3uYR8JpGunq5bQghF22x%2FwmJHNfP%2BGFBCIzaWQBPxyLaTDHFRCghGr9sMuiUyiyCDAAdBaAw1GGumbzIM4Urzr1LrRnnMw3TIQISjNxuzP6FbNtIDr6RXM6izbiLLaCjMxCmjhSJBJHsn29Dlw1PqT6iNgVzPYCKib5fPJQH44K9sH6hAXXcHSMGpPGgS4in4Np4OGWQWKmFDxWCZnLCT5%2FE8nzcKKiAhpUPPehoyqT7pkOOZZphdDVjMJnOYYemTJ0ADxANCMVOAKGdigYmGPot4gbdU8j%2F4KbMk4jkJ763HloOuuNmWWNsrJiIx9YLbrBc7KPWPrTyLNNsTRCGiMLcz32v3iMkyow7q7oYaHT5DeLdtg8VBBZHgX9URQG8HqzjRIP%2BAxvUlQdMhJF1RsLjrUszFFqcqS8%2BbuxO2QvMJK7euKzbIzpCKZJwIKA5whU5ouGRMHocBZwW1XRPsmPEm4lfRGiZySbfSzOFdCu2Oi%2FUsN%2FQeP%2BQNnKLcS%2FwPUrNE9Y0BmFsXYgbfzYZZwdyN8%2FE8n%2FYFTRMWFoRnYgxsWsbkPWmPGIczwzPBc2I5aFFWUWxCCWsOEsEiWs%2FAoQ%2BKQ0fLezfyJISgHzmAIBpMt5YM%2BNBFN0HcQy9ibudCS4NPkJNxIlgcDjXj6wSaFJJIf0EzJ0eeH74Yycm60lGnjcOZwWya6w%2FA9hNnQnzPyRyLxe6mSKrYbuObURG1cEpgB8LOoKiEC%2B2opg7Ebmk%2F2H4l%2FmsBSEOjQyUVGI2SI7TnxeMSLzisGSzLorFeVNckm5dVTNQTdxY1NKRRRVvhaaMYPUuhlGGN8TupF1pESLUt%2FwrlSNRSoaGAzEPITCScuFWWrBAJoCLXXFoaDTpOeoFPHlKqmkdCoDn7DAF%2FiLqHe6Fz4Tm0r6zf5ucSDiQidNpmTG7aZhtYI%2Bk5pEp%2FBqzQLypsESsfGbS5MHuJGB998iA0%2B7EN1oLzzBt%2BwS9mFC2S8lBUNKVb1SxsazXbWFlQtoa9xs3O0z3xfZb7YrLTZuzBx53MSVSCa4HtqAhaZQ1PeYMXUfxGWTxN7ZH4dmK%2FJqAYXtcrmJOe78%2BLYStj6MdCU6xnpX0vaMrTCsH0DY4Hsuju4HG7NLzr%2BHZD5nyonD6Yx7w0Umvi6SeAHjvsv8uOQFLbgIPzFi7I757hWp05HpJ%2BTH%2FSCJzNb144F%2FzlrSj88F0Cc%2FHoeXTBTx46mAdgJUPKRmVGkz6aNhivDcK6loY96lYxd1q8zBa8Cbmw9foLBtEYXHFlZGoiu%2Bb0%2Fpwsjp4uZTcqahfBJDpgTFe1mKMH8pWDkrHhAnTLQA4tRkMkAUpI1wYA5EwYltyrZp4pSAGSHsIIR5AguZUD9pVnAOCBS2Tw3E4sQy9TPfLotvTtgmIRlwdglEXsRkwFkfrDt9tuFBIutSJLIuRSLrUiTGU%2F76aMwAmIAYiO8PxHcF4sumPQbZA1S5CmK5OBak4PDElzigmH2O%2BEuS0zhsp4gvjK%2F52p%2BEEitLQokRXchcH2OXMKFEzpkOvzIhwxoqb%2F9010QTk7SLqEELufpN1KuRTqSsMKmLEhampg%2BmakLEvcPD%2FFlA4UQEJdFNQ%2FFQKEV2ZsaOFQrZWDy2Qir3qiokkzzcHfl0nr%2FYjS%2BylByhvNk5Ptw62X5XdtSTGmKtDWC94xtBK4C51Ytsfd05QDs7tLrM7n6iomGkx6swmo0DVKrhpiGn5rMUD8sKp1EsCCUVgx2BOmjb8SBV1zNzTUz0hyIZqiLSlZ5RTCK9F0uxH485ui4g2n1yR7A1qq%2FXU4uveUOdaNXXC6YjpVH4FoEHutsH%2BydbApAOGyaFAuWPowsJgg1XMX3JKWY1ZwTJC0If2JbNeqPa7d9ZQEEYnidoEkpRWvoo5cQOqsK9OFZuYoTM6xBmkXPp6ehNkAN9RdzMbtF45CBD0iUT1HgUzsYDvDFnURBcJyNloOAmDvZzDJzhE1qlepvG4z6mnjvhxKs3Pj5xPtKJvD9UF%2FWrlXg2qW88cZ41Gh%2Fz997YlGz9hc2Y6aeb2qBXjDhzm6f%2BkjEbPLbRDky6jfhxWEkd8pdWl53cklDIsjBZEGZXyoX%2B%2FLg81vJVL6MO2mNaOFSPXNCwLhLVFqb29u7W0ZYU3Gd5iIvMqhBNCZntK9qskofw38gQoLPaWC3mYwFEyuM9qC45%2B%2FrTi45hUVNm6F6htxZBZTAU1SWUFQu9%2BfzlWqdifBnRJH4RwNNPnGEUTqC9kOvAU4YISUeR68gZQhtgk62HZZSaZsO3HZV3cPfSJSnpv%2BV9aLTiwgamc4eSopW95w3QFcXru%2Bg4eUmenVnYL2TxzZ4HPH%2FghCqkX88bI%2BOamQ0ud9x55PZ6qUkbHb07mxgc0HU2Nyl4WEVWs7l5F5spKFvuxCGu%2Bk6RucW%2F%2BcnokEAbbxP8R3aCxI8WF8yEJQbLGO4H49%2BSrEpq3ekY%2BpAQ9BVA8BPHWztf22S3KYsJB0%2FqnGEdRNfGE%2Be8jvqCvP%2BA2EKlIYF0gLD1JzddJpfFvsPPn7z03D7W0XLDN%2FxU9WLFz9KRIqQsE2zVBzp%2FG08KVVfh7FQgpATyvsbzi676pT2Bn5LewE%2FFHsFPaa%2FgZ0kUWNRqoLAg3lu16%2FBzk%2B7Dj70L8WPvRioV70op432Ep1o6aO7PPTu%2FJStIY7LMVeYEv7pa7FB7mL2%2B2fO1vnkz0EYSbcpiG9dGI066uuKvANqdRPWFe8hzI%2FRxxii30ip%2FlZQgeZ9ju%2BVyR9Y98F2oUUFJELZmkXbn7B0o3hs52HS2bunxI%2FApYHVpeNMIaut7sPVUZ5bOc1jyXjpRGE5ip%2F7Pxk8f%2Bd1FxA4ynpijucKcjtrnxdP4OYozczp3nqtXzCfudB57yVwZgszTU9d5ej47LxznzgvHr3N%2BWmuS8B43itzrOR1mzFOrhLneQs%2FTMTFPTTnmqfGGDlH7vN568FwMSK28lsRQepU59xK2XMKUKzG%2FO4XmZjbXm0IYPVtdb%2FViW%2BBU%2FChxLHIdbR0Egwql6YEH8jLF2%2F6I5rFq4n8k9YwiKNNBYeQq5WG9tYnZyGUoRlwB5dSuvSobrXn%2Bek7Gc5bVel0O7KqTLk0EBvzwjUlBxBOFio0y33z8fG9Ef62w%2BpVFlxb1jyX%2BytPpPfgrR5N4JHksI%2F2OPsv60dW8ljGzzW8Z%2BPLB6dF2W2MIIZK8D%2FvBKO53M0tTAXtob29rX%2BEOnUfhbIqgQYHnAIOduGiUi7g%2Froayyn4SS3OGGJMrOO8m4RSSzq%2FVq%2Fz%2BJw8dmcbdxI3O9U%2F1aPSsAu4Nm53EPXfQL11wRzo4bB%2Bd%2FLt73D4pgiHhw7V1e%2ByE0%2Bw3f0YBS4k2JQ56LznKKJoAXMIpbYcdN0kivzdLvNiZJT6GhSLFD3skFmrr5ICcImsEdKSgOAZecO2kvmJon53%2B9oNuhLYXzgCa3UH8RNxCR94Q%2F8FygIhq2cvpyMe5AhFg5GiQVmIY6OeUOOcEKwC%2FPPjpOd5nB%2FoH1wLBiVsbqWr%2FTEdb75QdmdX2VDcfIxATFPx4jEqEY%2BjTKVwpeCY0bAuptvQVQyIM0gD9OWg77ahjtWpCII3hqmKgGdEBj8L7k08lUloFDKXqSIS4yDiox1v0f0qRZG524pZPvglO4Y3jLjN1NYuahB%2FqTV5t%2FCxgAuOVOmkyL7vNzupmoyUx9ZIHLfXokt5IL3yk3trJ3r5yi6Xipor9jGnepLEq1bBK%2FcqatvCAV62z4t3kJbyJz7inJslEZvKU16vCGkG2AqnWWPsj9IN6bV5TIAtULLb5KkKQqWf8SQ1bdcjccXwU1qM%2FdYwYs%2B6G9agEb1qqvuMOvllz4KlH2B%2FO42tYKiaDOUaN8vuwr4p7jU1dbBiLwnC4gwZ%2BGdxAvnQ0chk642qjVZ%2BAqDwfzScSH7unwmmuby%2FdGaIX%2BAEd1V7P4Yewe7unsqBIYdfA1s%2B2mv%2FjNr886j4kwC8caw3hJPaeCgNSi71Rnq8LPaLmw3pL2MP%2BScHNURi5j%2F0BzAx3LO4QKOWue4T08RV3CZTdtk%2FYAZni%2BPTt253fCbGn2zqb%2BZ36P%2BYFwAiYL%2Fwcdfdgy7h1WKdbxOzbR%2F8%2BPtna7WY7dg5EdPag9aJTcute%2B%2BTdwZuye%2BdnzdX%2FdF7Nnz%2Bfv3w5P3vxoPOf%2BYsXL1rz5y%2Fg8vnLzguFqEGe2SuQe331uw9%2FW%2FnPvDNfX4f%2FX8z%2FBk9YwWx%2Fy%2BXDv8TYOmcvWmUlPNw6eZeWT02utHz1TQL9uFxtrBBPas0flLWSzRrskQ5JsMnaU5JpNxdxqpRUDfuIQAeqxCNYN27Bv4mahRlWLILEEsAsAicMwgwhVgExwL8YAexIe6GQZunkCsYbAsVqoAXH10FRu8rT0vHjrtsCkbgHG0nElFTjFfYuV4kT%2BOMWwmIgrAUhwngRXGkPUyfzKYVZFPdhewFf0zAYxLDTbKVbCz3BnNjDWN34NXT0m5VuxCEUQDzEDNT%2BCv9AKqlM8G92ujiAK5iBsAVEqHTcgfWgwSZojBOkiLSo0CFfcZjHb3aOul34RnQfUrLjxdudXfVDUYoMLNsYKANErL9jmBJys4Xj09fHzI6oAP7A0fBzmBxfJSSO9%2B%2B%2F2bA4zIFYVrRft452tl7vMjAHOpw%2Bp2gdTTyHdrQzAG51vck0zh83q5YgDZunTJJMc6RXFJT4FW6DH9HPR8qIaUKGTX4w8DGmbAa1hyfg0ax3DS%2FD81Vbq8nOerrhPtYzsfK3xryuruavXrUadT2ZG%2FXWi7MPrx61OvDrgZ7z6jcQH3fyhlGifdzW%2FvES%2B5NUW9OUi3pjYysSj77SH9uSi4nf6M8tcR7VO76zPf878dn2XfxNh2W29mXucXTcX6fSPcFCNIz2pu5Id%2BGmjaKtnlLtyur0k%2FFKetnZUzq%2FSV%2Bc%2Fizk1UxOSPtmDikl7t8U%2FK1c%2F2AisBn1Js5k77ybWwM%2BthkGPL6tNWDN9kSGi1b1iR9tT%2Fx4yyfWvjv716WvsLLqZRNT2C4sus8Y8DX9tPTOxt3LdlZWts5Ny3aWlq1zH2WzMTS%2B0JWWbJ2WS3XXHUv13NZawp7G3lLPsZVe3kcLzct6b35bVN%2Fnz5u4Gj6yzYkPynQcc1Tm%2BVXNOf%2FVvR3Lu%2Fm6%2Bd3nv%2Bbc%2FPzXnJaf%2F2oz8vNfYzJ%2B%2FlPn4WOcZo%2F%2FT2biUftnEGjNeZipDFsPlNinsIBJsDhC9eTW0Un76DiFA8YswVzpnnErOveHc7Wpm6tt2Zy2ZXPcjc2Vfwtl1uYQxWZdyI0EI4b7U71BLGzxFju7ilJRqZ6LXGiY0dESW4oqchZ%2BmKzFuws%2FVuYmlj7fTevrhN0oHkYsjc8j3FP%2BMhgU2G%2FrogFLpgDUJRJeyFriTxrUz8pWF6nD%2F1ICde276K%2B5ckV%2FzZUr%2BqutXNFfY%2BWKbr5y3X0Cbp2AePf69KQUKtQKR1t7JQwx6%2FAyocdTkFbLcZoVs7UU%2FDRVYbxpv9063T2xekZmyqFCEdX7C6RUAi4QNd8SaAVS1roFaqrQKxArmCIYQ6cQuInjc3I7BaV21qphCVQvC%2BY0%2F8lMWHgysSOskpW3kn2FAdlLFwv3HRwGerSZxwAMvddm4criKpJKXb8Q6fyu7ORs2dlwYU38dq%2F9hep8OgcQUPv%2Bn%2Buq27aa2SiLI5b%2FfzWI8eAc%2F352qxEm%2B1Xy9mR4kouF%2BLXgXr%2BswewtYZ1j7PxREFbRryzvU8Ym5a3H123aDA%2Fj6Jzt%2F48td98DUY6MlrcyP91%2FA1vU7QPYr%2BYNzusPaKPaarSY5blto3Q%2Fhaqx95X0nSAc0LutfcQWkPuum2y%2FU7JnzcqqTHue9upnTze6ndUGahJyBgyCFb9xZ1jHKBK3uvUK7WUwIsXT5j9v84A6xa04o7tXKHKFCi2izhJVYBKd2mjVz7x2p9s6a66qsB5EJBfyvNXFKqlVug3TOWjZ2%2BdPWelv2eWLi%2FzpFm1g86daNpk3d08m7la5by0e%2B32vvpH3cy3zNFMmMDYz41o%2FsodONQ4cLfsFW0GljUCZ%2FRGV8x4skBBDTQyqRgl3tD9KH17N%2FIhy26yPUrQheygEAVO5d80wqgSQtIHX9ycMGBGx7885xpWIpywDYQsw97cGXg54rmDGaSEFCTZhvoRmkICcRczOmVAY4cUz9UB5lhtwGiAL7LzdUZGiil0oor%2FfDEBeg0SzJvYijuFre0ZqCmWSEZPd7GMpFoEFCX8WCKDqMjw5R%2FuPPXfM0fLdCG2RqsCc2eeNHPrBhnhmkJYCm%2B0fHO2Vvd3a1uZU5tE97j0ICEeBtQXRMGNDSEEuLlj4aXuUCymgBSJoMLRaDCYlIKdyiueySleMaSGVkMEs0owaCsii8kxjkQkEIOTqkS9sUSoY7qMtJIWAOHE%2FcSrcAQZtZeQ%2Bc3LEmBaMIoWfIEjuKrzAFqii%2F0nE%2B5TYZPXoFHKsCSGghBT3gZUSJICR1%2F%2FEqiQyzJvEeGCBCUrDPpSxMe0Yf1rKygZsIUHJ0aTxKExxH%2BOWsVq50Tm7WViCpMhFPbPdB57lJRbR5TM0J0NY5g2HwD8ml2E4tyrsuElEz07GPATGw3gWOhSZ3IS9E5kJG2diaBxhUWNxRYT4NwMvYo2cLseVpr8A9atlbzazZR4wFiQ9AeZ94gYYi8CcCO545s1NHOYLJhvjiTcnMaxstHM2SCpCVtmcspmuZzbphuyQolcIc7GoPucYpdWQTivZMBdC0lVUmaY%2BCB21gycDq8sG%2BuDx%2BM33HUXV3N4%2F7Z093XhMagl2oLewwWi2GlobgF8DyK%2BVD%2FpyESY1TW%2FUZ%2FPT%2BXi%2BO5%2BN56e78%2BH87bw3f730NXWlNDm7%2Br0DrTTcar592vwnPG%2BuEm7wftSEKD1IRms1avdytr%2F12y2NxzK70lqtXsP4ow9qjfoaFD1orLSA%2BP79xrqtSBtlRfq1ffR662Rn727levzKCLwsRmOWwpA%2FrtUeO99Kzy%2BNInb3D7q7b81JY2TCSbM45FBhzvkcuYuLw809HKpwBSqRXENKqlavHWBsR4cHGJ%2F8zR0H3Pv3j2pCPc2uLZbJ1uuW%2BbtO7gFf1%2B0zfJ3cA77xHJWtW1SbFqZwWT8UWvB%2B5gg25asqbfmnNpgx8aSmupdGksdw2R3Gsc7%2F1Yiq0EDlYyk%2FHZleulDg0tawZhTSy%2B6l9t86PDi2OmZX8N2WcOcqROVlKnrVcrdqEHXrXZpFeMKf2zgFgU5EupO4eZmou2BANkFtIWLYm%2BqvNtRyNRa4zM%2Ft%2FfbRznam7rXZ%2Bxoma6K52jLOkTvR9gN0D%2BVS50Iwr8wnCUs454bMgMTqz2tSTOe6MjF%2Boi2NpSyNlZeNFuVT7sKSi%2B%2FWiXq52Hrr66lHZB4QXmO0f3yl4cMImNcPYAMaoTHzcOyeQ2udGw%2F6mIKNxY6byj1ST71iVbmhNF128vaw2ON2bB9mbFTrP6wEv7gE19rEHS63zNXswIBSdNAuet0sIFAfcZpgDLEcF3op0p5oRl2UdQZhX4RYUJ9Si%2FDSd%2BBnYR0utEK%2BomXm4eojGYnr9y94x4Nmc95svpTOtW9QWhFUYvFJWZK1pHKCgNcq5uXghkWCaRuol6X7wmkt9VEoR3d5yJO06RpPyKFn5VAHECpAoQYo0AD4q6DQHIwkNHQu3ShA1GIvihDVDBMw7HMYYGb9a0rRchzSIcezCUM2YrKgZOciI%2FTKJs7MENVyGoKfUkBjK1o%2FfoqI%2B%2FHmEyFPKTPga6MKE6IOv8QZk9Ne8URzQReyVByauaxlYqj6LIE0XtpFlnMl%2FNxf59y0b0ob%2Bq%2FYipIW%2By%2FchP%2BPjFUQvs62MizJeq3WYItBdW78QcmbJFQi2gRpmTuCv46OBVImZ5Q61pTGEqEyl7IlaVlcposx6ir56WfFZr76%2BLkpUrrUVe1F4KV0NctgSR5rioOVqK%2BtrTUe5%2BKZCA%2FDCXUeEIwMyd2ZHdQiONNSzuZlYYVUjCE6CrSEGLoncC6bYbER6Ka4dVrVYHU6ug3bDamBixHEXnRWX6qrhg3gYLmQnGp04xUL61k6gJdsGqhRysZ4fndGsRbysW0yizno%2Bo%2BE8SegOtvdIRcDgFtUabRF2F%2BK0%2BN%2BvTLv1o2qPMv3OxVCPpgHb3Iuc0mQcklA1rdqtiw0CtQd42JUb9wqoVHwc9egHBUWgVw2%2B1TBT4Xpgp%2B7B%2FewmKirT3mQjcprOH6kUBt%2FDRGioBTKJ90UwZCsbe%2FDgFi2Hr6z6fAN7IatRsN2W2E39pqzyDfN%2FUb%2BeNCMIxa9PQwCr58IKdp4UkgZwlgWydGk6QpLaG0Ic91r4vSIkzDi4c0xlT%2FPn5wL1Ikb%2BEN4jpTkDXxXoCvTYSFhOp4Bi2ii5RaPJY29IzRk7AaDXnhlUvuRP5VeESfXY6lywHBiWCXFdyvjsObIjUcsDZjRJy%2BiBy7oea18mSLy%2BNDQPTNkcLKNtSgZDZ6%2BgGHMbED0NzpYCFjODEs8n1wRC7xUgLNJ16n49tim03l8U7ARE2CWNjkl25dtDGZq2swu3i8E7TAXJ6OAd2KP98IbY5E3xnfljfES3oivw7UFGZ%2FmjS9e5jtIGv87e4cHRydb%2BydsEJMBmmX7mfbeA3%2BCpXGDpGYfsYXVb7OihvJd%2B%2Fftg92DI2uxZC%2BxDNKyjp5c%2F1SmRZ2v3z%2F54RsiNOZp0L2K3kBnR3vxWZAjVqT8kM8CMlkKhkjKzc4q7NRBhGuUvDZzve8et3fb2ycHR9RI1vZQpoFh1JRQnRdi45kpF6YCI9swLcJTMb3uMlfQ0lPFLFfJySJ%2BSlxgt4%2BPu0ruK2%2BT0jFCZdBP0Sd43829ydy7mvdH8wh%2BXVzOL0bzi4kfwB8XyJP5ZDKHq2kyn%2Fbn06v5wDufn0fuYI7%2FcHLN4%2Fkknr%2F7Mv8E%2FwZTH%2F7BXYPp9IpjildzlMS6poALpSOvrN%2BbzQxvWP%2FQC1FxAIrcMvuF%2FOXdyd5u92TrZ0O4qhU4RM3t9aIiYTBAHUqRFiV%2Bv2hbXHNjw26%2F5s4GfsEWuNYrXqFPwedZWFxjar1wcF0kzJKkKHzV%2Bm5wUTTUBtLUlNFqfd94dt8Il1ErWoCjD5lxDZOlaFddGwyLLxn4F8Vr4xGF9bHmFcyva0M0ujWsgIF4LtUGyLOiIS8Ip9B6kUEqxlKpjTaKl8%2BKl98XL38oXv69ePlj8dJzB8bbR8xMvDZKJsUW8YtXJCgXSZPz4nUwLXqKAKXYJ596xX4cuz2jJ4EheoGRqViQiVtk%2FUCIPhUJXjArEAK32PXcm69WdHGshdOEt1DI%2B7qYYer3E7PrPxev2DSK3UnxIbHHNjGCUXotDmdR33jU1DVuSyLDybAWzybQXtcGrViCxMQ4riVssifFPkq8q8SNvCKPSnDYFykj4xJGZpHiG2OsyHBrs2I3GXb1tQvgbWEmJ3UKfPX4158ltgobzeIYPWeDy5g7Ezcujje9FSm26YXR7szbRwAYqA2912Nz%2BA%2B97XAcRnsuCPpXLAWEwwBk%2B5PIDeKhyWJUemxyV6QHF%2BH4whMf%2BsYfYojwXRSSjR0NpcbTsdv3YJIle%2B7USH07DkOz%2BD%2B7szj23eD1eGaWb2cCgrdB2%2FMiTguj6YhimhkJB8Mh48re8dTrz8ZuZKnBieFug6RZ1ANJPzAmFB6Lu9HPIHn4xv6phjR3LCZhOC5jeYvMVdgbj%2F1pbLJTszHw%2FeZIK46haTi%2BPjd5EtDYnZHJP3DGFqeWURzMcGi%2BL2E8Bl0i%2FfPggLPUPlSRHiDPRz4X19bWMuHnSYGczl35SXvtNztb3bftrZPTozYTm4Lr5gj9FYsyD1B1oANDOpqisobC0hkSybjorKQozXN3Yqx5iu4HA684sQYexuhpWt%2Bg00cejlop5dIfGL0xoLl43ZyY4hJ0St8bNKkoBneLir57NeF9vLn8ACiJ%2FETYa4f9URQajDuMcGIwFCZyHR2Ow8tmz3RVXST5AR%2F5QmdNKXRfrArVjPsjzyjDIkOQRG7RcSFLjLzBDBtrEvLV3ciSIJelON%2F9a2N2xeF4xpftvrkgk6LOZEmz6cBwkK2xvl5fd04O3hxsOkMYWY4L2w5cc5z0ta18h%2FiBMFZgdyVRIa8wAjCzJmdTbi0Oo6TeWMPjtyj26o3CHDw8bp%2B%2BOehu724dH%2FM52Ef9HpuA0MnFAdAbuwZF8F%2Bt9WdRZPJcwde%2BpkM%2FGjMmMloVKPVGIUeM4o9xW2SwdG8yTYpDwAv4bUM%2Fis0tA1CapA4X6OGQNLLFlNl4DMPG8wy2O2OS5jDsz2JOaV74sW8KdCoFvQsNYXpU3K5BAwGl0ECjsFgnzAIkjAqC3ywvzT5jsdH3pEnGPZz7wP7Oi2CsmtMERi9F9TSZlTs2uJxv1sovVgqVgEYOJBl5xK4jstRzY29Y7Hw23jF%2B65hPA8OdlhSjxTYKkhEvCeZL6Tx3UdJM84ZjllOupr5hkWi5T3xNmiTfI7Td%2BrqZym613iXdgOABQtcRWeq6NAp4kTij0vABN2VLCwrIIK8O8KxkFF4WpxiiGTRNOANFpSC2Bpm7LtcixrAjc6dF%2Brmi6EbRfwWSxAYwMnBTmkgCxccNRpGmXJkL44BIi06ptpy0d9uou2brydAUBXpu%2FxNj0j0PhVNj7WDXTWXtKrDjMa2xUoIpnZxHLm6rm2RNa6ykbP%2BI3uy24VLsQ9r1M6FiHCZme4NMCRuK4FwXoGIjZ%2Fpvvl73YYFtcpkXOv88UFzbWIBVCgyESSzQzSj1ioxbyCaeGLP2dIvQASAt9Ecg4gWmBsoNYNPEWiijNvt6%2F2vPMfBAgLal%2BZHQ%2Frn0WVT28qE%2FHnPRfJFOTvK6mDOzObNc9jo3SfZHwBFbBs6qjLSmqWww0ymgqiUH6mp4z%2BWTcURKdm01dzqFjbVr7rete6N0emObSlMfTcSVnOOPfUMww3TU5Rk1XZDxOMftjybmkM7l6KFWhvdlLgdudq1pbB7lEvmuP5cIm6hzgzPnUsWhLaQ3r5bmsDUZMEfoKWu7IDaOkaZmMyx7viH90H5PuIMgPwSSsEHMJ0itmk82R7aZWOH%2BJplPlGfhW6pCFj5%2FePKykqhMS8qiMi0tTekz7HfDilPEoymmlNRApaMo3ERdmbFBKeYisWZ5NnstVLq1GlDKsWtq3RZpcg2wk%2FGfvVhqpGDz2%2FMIszyX0ATR0lRjFtKlWZhPJzDOkmR%2BVlBIt7aYoIgppNibTadbZuEitcoT7D2ey7OkDvaZmE9fWpolc7GQa3mJyp9ivZ9tLHN0ew0o1fpOSrW%2B0T6w%2BVYkn2AvjUq2FkclW8uDbkemFi1NorYvn7FpL5bPWWvhTP3%2BgmyvLyYu4YKYZRkLxDxl5bI3mZQgcPWrJonmjDpANyUl2DF4SJVBFJYxZTg2NOEpscmPWDEJB79Z%2BSsQhQYI3Gi5R2mbGRmGCS9pPHIHRUQ9Rfa%2FsCGFNW0Ku02iC9tLleAHzMZC2wk0hYTIk6ZJf%2By5JsWQMJHQZCdCRI1mxgixHV%2BQUn1K4H2mTQZP19J3LOSbRqGJYqdTIpiKnmkZWbOq7CFhNpF2RDoBN1US%2Fdw4itRkqSFSutTquVQ%2BzfKpfDrpVHZApum2G8zWJLMviYZ9EeHQ6jctojTPKKj2eaZ0OVr%2BuApZpGpSHs9saU3lG9xFEtPLSZoHTbNt%2F2gk0aLajzy2x0tTI8%2BUv9IURhc0SJxDIFVUP0WxOeSKvNE4WJK5qj73K9JC1I%2FbFCp0XtHse2PDSEqdWjQte2SyepIYI5uFpOsIcVU2mp8S2CwUtvFslaAVAirjx5wsNwsl4QEip55HEjUeRabuneiXkWnYYMKLIyWUhFdFF1uCFSw0BiN5Nkh9SwlDd%2BKPJTrsDGaRhwMVTxbNEyDI8ckjX3%2BekJo%2BNyU8X5UFNeF4SCENAkyfuqQl5QmMV2TUpjv4Y2aei1HiJAwN5pGji6%2BPE1g%2B%2B9I9jHsr8nWAboPmmCokyXoVI088cWFgw7Je%2BqRlpWhecgZNOTRYiDUBpDTCg0484f1pHrl0aaqHpysuGuaU5JmEf%2Fj2ZJAUaeyVvCWYTWD179sz2BubciipyTq0xfZb2D5IQ82UFM7H19NRM2eu0BzBxRdchMZLMqJRBM6OYjbTwgIJTWYcp6izJGxKcsAilbGNRRLwNOEu9Tgbne3I82l8j0yprMWQaDLUlCi%2FABMsT09gbRqbOuxCCjWeUNMs3dqCWQ7WVCNgfaienqJ6esbFX8ksBrrfC%2Bh9Ixeh9U2b2ix97E%2F8hHLFQo4ize8bb9YaIYv5TKoPkoTqNE20RfEnHldgkz88HkHzk65ikrArtImN6NHFrIBhj8NmgCJzLW%2BOzgZTPo2PJ5UqKK3yCZZnWtVEfixtj5Ct%2BMNr8SwsTeOnYWkKOw%2BTlmhuP6C6QlJ%2BjLWpoyCRULX4np3IwijP0aExvKmRGEtL64IsKDpziSKvz6UzeX%2FiRub5hyIJwyafwPq4kMj7OE3mGhGdIoypQorthdZRpdNZH2s6V6vpBFP3lJIjn5Wb2y2T86ZQUiRPfJEslvyTYQFoGkQjoSkc7OTonBflEwV9eD5ZUIfnk7k2vJDKleH5ZMlyDlKZ9kVRRftqSuITgchytYVzPqKLE4ZSbE3A2DFRhYkVh0F0bRExJm4yag68KWsIIPODPUVmTAFtCC2Kipx5oUm2rSp280XbOyyWjblJKd0ivePKdv4buBfNgWneg0Ru%2FYtUNtmRyGc6Ug0VZxAazCcIo4lpnqT8zIfFUA8pWRxJIbeeV6SmMriQUmB%2FmrCDe53GlJEp3f5ykMyYAYO0e%2BbMBF0CXEOYAr7B%2BLSmCStjmiI1g07iwzpN4QMlNV8WiWKLVjCFJnWusAyW2UpnaUyPkaVcyeRrRjZVEUiL%2B1EIm9%2BeN3IvfKFORrqlemYuS0XMbLzkZo5igafuwIzOktKEghVS2FJZTOVLY5bO5Yg0STJtLyRZX2oVJdIMjL2kCZzFpCmmNDE11ywkNG3HILlEQdeZSxUORKauj9olNqunrumHQhTx7UiXXgxDAu2ITJPzHF1acMkKT5TnVQqX5hWdyfLaVaGpYKqMJIERZkY4AovI0iza7Wnkp4Z6kq6D3A2LRSg%2BHzaL5ioIpIQRhPYnstD8knEqY%2FGoDzDVCtGsdy3sM4ksNlzcdw3mXMaZdJrASwspAlMQ0tkslfLwqWrk4myimEFgFlKGJYWxMo5iNsY%2Bism8W4vpJivRqRL7LSbZG7ycGYuZrJUsYc1GDnujL2HUcq6lJbK1u517GxksLR8H7lSYTvlU5qmYT2R7Bp0omn0aaU33ylCxmxnYqZ%2FK0HMlU6xF2vmMKaoWiVwki0fuVOskmskIOBZaWQs5JKZACbgRNZculSKr4GCBMfQsRGka6ksDkWl93Xmlz3j6Xj6bbFJCZElIRn%2FvT55Aag5chCWLXCk%2FJQoysE7F7uobrDqXZEaNS9MmaN5MilAp1V56oRcTt8c3a%2BSk3gTx1IhOSX6rwrhfkJumdXkuaWy6cqg0vjATHbb%2FPRzMsymfpJRhYTVTliZ0sZmDTTgzQ%2FzJ0E9IGZrmaSfLxLY7Zo5k5Pc%2FBSbQCOXyJrAhM4%2FWCim2imbp4jJfzGIpIu64A6EHtMaVJ9gU7CpR2spRijztKUmwK1J0y5knJZJLKcMCoSQEao9sG1Qjh73h2B4wo3J9xiJJaOWUcwueRcYqkoSz%2FkjA4qtZKptSmwayXS5FkNcXiUJhMU1okIwsi4i5dO4Xkk%2BUHD9y6dMII%2Bkm1vvLXCMoGzsPmwU%2BYuI0e%2F6geB5LjlrQkeYYJ7oAG3KhEKy84ZCnqMNMgXde%2BN6lvO4XUviqX0zmJ0PFdCYTqORFuwkZxF3RRYj%2B8j13zBRVKkXsP5UkWFmohCnD71B07mOT0hOJjAYLBvNUCRd4hlm843IEa2iTQezn6bJNOyyh5nknX1Uv0TKnP2LFR5RE4byIyNLREyUwLoOejDjGGY8pzvBiS38RFKdfQhDX0%2BsSh7YcbGlsgy2NvHPvKo03RBcsNhCWF2EECeVPPUeIv7j%2F5uCoe3jUfrvzO8WeykDA6pde75OfzCfhF0QpCxtNBIx3m186CFUsRSLKIKbhQRjDGP2ogzBxyEFUuuHw6OCwfXTybxU6af1Vs%2FX%2B%2FSVi3nVW6k34Wm2srPPIdItgSyleZtMEzLQE12Igr%2FcQ1aoqYuhxrfBcjhjKkJNzwQ9ezB%2B%2Ff%2F%2BoY4s%2BSdFSCNTqUC%2BemyruspOEZhCPDARuK42eZKDEgQQPS5ED%2FGjmjh0d3R7YkoO%2Btc7HxD13vn776GD%2F9kCaBu7sXHrsEYMweJw4sDB5juucwxRM1Jvp2RgavFW8RahAhlGIkYjyuStCnNL4XysgRz4p5iiM%2FiesDkm4QODPCuj88PQ7x0v6DrCu%2FshxI8%2FROytEcVdggk44BGLEHpghnDoUW5lKKJXZQCw0SlYO3Zo2mhnXHD8Z3mUB1m%2BVg3%2FfUyCArDAqnIytPAQKv4ao%2F2LMsJsVSLWgBQ%2FzVoWHJWk2CHnpS6NgLeJPbVKwgyKoiMbgn9caFOhNDrSTf8Rmo5V%2FTOpMzp9jPmYJVDh6s8M4dK8dF22HxuNrJ%2FC8Ac1Qp77xbP3Z02dPG%2ByerxS9gNqlmbaTo5DoWd5SGHpKt6LQU2pufms02OLsMKu4zoH0F7Mqxca8yUCogEus4mBjBy0c0Y2%2BoSxL4JE5i4iXlDNt2k0hgIUKrPPTt683jZqznHEucqXIu9YMGWSwNUc5t8MPwmapBVxIRGAOGLI4aMNF3AwdUsONHQVmHdOCBTlckFEHjh%2FH0Li0pIlP1Guvk5nHYYwOWMMm9Oye56hzIGcWjXXKZTgbwwv883MPFzhPfGwG0Jy9IE7c%2Fidh7nPSorPr8Nb5wE1cRFVv3Da4w9JICygIoAyRyhlSnrwMkoIZw3yAAjppAW1x95YGcijtdWsj0aMrRgrStXSD60VHOyF0HvagGzgfGxTw0odfUKM6XOFOA7uflnpUh5c8FoQAV4%2B%2BJ1pagC6JtRwFD6srEQ0eRUBcSmJv2J6YYUJ%2FaAgTOv3gG36DFxzSE0vicVDmUmz09COGLqwY%2FULNcAaKfcNVysb2aN%2BzNg7DTy7Cb9bXX63zoDYKGf7s609ClKrSOZAL%2B8nbG%2FqXNpawuXF2YRuspIHeGKb2K%2Fi5iaP3Rkx3aaAXPdXkkawbpLinqtZFpazm%2FfvYylyqjbNKwWGW8iJr8IT0swiisI57QVGqLTxqs7BjteTNVuNNA5lxEURJuvGWDM%2FKz7Kpr2oG%2B%2FBNC1On94iyi2VuW56ylPeKS3dVRnHX6S%2BK6WK8Wi6gIfZmFdEsf3njwBDx3QNDDISwEIO7BYUYVA2XM7Bpnd50c%2BFyCt2ymH8ko5%2Fuv4FZtX1wtIjwJukucIT2YImElVdFc3ZIYwuL7gT%2BxV4E5BkIbYjZrPlt7xpkY9Se4J8E%2FiSwrirVgiqj1lh4zsDrzc4dDacI32MvQeIU9vQuxlUbhDqubDCbOKpV4AsrgciUIJvRX9gRocoCbUNceJP%2B7mqt3XzjqXMeQgn9oeNPJjM6ynNUnAuUG%2FwgnOGPZBH%2F1UEsMto5ghQKEuGXa9h%2F9aMQZMsruEP1ioNx%2B4JQhezDR6RubQ76gUNvphFtp5F%2FAbWB7zCBeQDVms56Y78PXxHGwR2mWimlmMCjU8iDSEuQB1p%2BBi0fz6aIv0mwzk58HSAEqoo6mDqdqP2gKk0SXTt4oI6hd%2FEbpGn8AmlnFuDggb8wEqAjsIGQQAL3BXkeQMVAEMK%2FKAN1u293dtvdLvyg8Fj441yVENu128VzbneAPyLXh6nV7b7ZOlH52gdv6ftkZ6%2Bd%2FTg%2B2do7pCut2VE%2Fj45R9ugWuUNOWu2FIUj6g3CGfYdwYU6fvCRJKHT6UAaQZuk3DqJzbA%2BdeaDEO0dlz%2BaPr5N9RffpCeMQMtKveISjQ986owE9o9fOcKDMKONMZbqk115KQuyYQLcw4gbFGnKCGYimuMLWJG6VzuCB1%2Fcn7riLwxF2KjCOUY9afzo%2F22j%2Bs0PxQAfdzkqDq1DNO4MwnsW2%2B%2Bf0Y3GZ%2FlqlUH8D4fE9mGzRtVGup2e9152zpxtwI79j5F25aaEG%2FjkMkLQ06m06dEv%2BAovSLUsVCpZ%2FjVm6q987FKxSKom1AZHVINB5Vlqv3TlbbXZa%2BChrK5N%2Bx%2FpMGmjpA5c9p076Nqr4yjyfOV8yfJ%2FqxdVMPVf20Lk1F6VbXtFa0uCFelF7160NnoaXXCvNocrZKs3TOJse3rpLjJllbZEaNT0f9mmKZdzJL2X9LzZi%2BmgpQXioF%2FfdqdeNQfpAPHn1%2BI%2Fv9ad%2B9piau5US3N4wiJKLznymJhXMKJhXna8%2FfJufPW3%2BV%2BfrxpPvv82vionPvs1Pi5R%2FfGvM%2F6bPcygBMj359tNHVrw33Z39k%2FbPqRrQEEjyMqIU2acgGWKjFNu4vjufzU%2Fnu7P57ul8tjs%2F3TVD8sgqac5x33Tf7h6ovcbdCkn9mu%2By%2BtnwbWe%2BO%2Ffn%2BMOf7%2FqN1lyoSi69cds6bL%2FbOtraPqnQ2NJalQWOozoI4wpH5ppRuDSknHwoVlsrXefedNvH21uHqP%2F%2F12l7f5sVWReJl%2BWWDZQ7Hbxl6zyuPbYdbLHadHhLPa6d9S8Hndbj8nL%2B9u%2Fjnd%2F%2B%2FXP3TXt3Z2%2FnpH0vJT%2BLPneM0hfLZGvUv5cXdmsXRtw%2Bynxpse9e2NpHaZh9VAVdMqbetX%2B%2Fj%2Ba6quXFDgqCjH8C%2FBN1VpY12saSoXhy8Et7%2Fz7K%2BZkYz1epYzHhW23JWHu3dfzu9VaFQvCogVnEx4cPpO56ZOVjS0bU8WF7e2drN20jPZ3uUMCHdTT4EVnXrQu5OL1cVi5RKZgW7ZVeRbupeURXracrS0b5PmykcOjkwy2mpiaaVs%2B%2Fj0bJOv5ZLRaEEkh8XC8mmIHpFpyuRj4oZoxty%2BAvqGnyxi0llhhviiVZKBYXuo1q5gUVAztXC2DpWJqdZTI4EEsvSytl%2FSx3Ke9luRnPYTkWUhBLystxLLEoefAGyfMY3hz26c4rXJh1d9D%2FDe6u%2FUPPdHTHFZSAadLddIG5F1RSCab572CPtrNPcwXjIlmEsfXnwClaWfDJdYGnvixO33jW29V1gsSrYti%2F6uLbu4Ojnf852D%2BBkXJ0umuTFWsfzprIzFYwROw3meOXvWV7CTM3Q0WWmJjkYuhc0an2eIyqOTrzhksMbq10bNBAaadDpjgsPmZhYlL%2FiHVqnH342Kmv0R45aKzQ1m7j48qZA2sGV8svbv6Pvvk%2F7Ob%2FWG4unNqr0mcDG9XAhYLrGhmvL17m5LuPH%2FlBgJbyPn5cxfI8ummc6vTZ%2F%2FnPf2zPhqRqz14UdG219VFoV9vL660XH%2BoO7qexaRNzM6ebFQ3y0kULW%2B487KEucjZ1JrNx4k%2FhN8GSFoaNQz5nSOqhitZNUL3toLm%2F8IbeTNl0puZ9MQiQ8NRw6gXr%2FXGIQ9A9dy5iyOQ5qFrG95nPuflhaDYL820gH4eqHqmrkWh2CHWKSTIljlKTs6VrQzrjd3eOT8pmfG8G29nEIvmeOUDe6KzUz1ZWm515PaeMazQoJDTsG1ZFyVMlGSnWw36p3Pu%2FdI%2Fab9tHJVvn9Q%2Fv35%2BdwZ%2BgA6XqGIfkSgR7rbKyg99bxqVnYSaLBRICVpeErM6axFbI8lajlrvJSaUZHKlY9k3osRVb6R9VKfttB%2Bnp0W73ePtde4%2BMsPXqm4v8vLqGoZ%2FFMWKOjLL1KglD4ED9EXCDT3i%2BFeNhFTnyORikJSY7mxjyoDlOJqgIj9FsB3LRaUo2T6txURwka3gM0cEfuEoJA6O6uSnaQYZTDNGpTvgCjxq0qt1erjD1eh1NpuZ%2FuBeuCq43n7j%2BOAkbm%2FN6a3OUJNP5MJk24tYm7bbWG1R6wRAgV%2Fpnt1vnlGEN9HPfTeqFQq4%2FyY2XJzRssSy6KNz6pnpZoCUhs4vG8GRWd4sWPFtbb%2F3tYadCu2wsLUu2COIZ8RMH1kkvWjzBqStLQHRv6OEaiJPbcfEUe9y4QclXdMkrFLl0EfpTWC%2B0AoHtZiaUeBDujik%2BHtUXnezMmyZ4IK9qR2tUp7F%2BwzFYxXqv1GAorzU%2Fs4lrmChYhFVYElTz%2FnkrQuW6degYpqyCgnj0v7vm2Vbsm9XxT%2BjEJXWsvHi%2BPth9s0S9GpoDODcDixMX%2FWZUpE8HrS4KDiTWpdXKX7pfn32rtx6AXCEwFiVXYJabTs8F%2B1pZ%2FgKVyXxF5dbdgR35znZZ%2B0qe2v9rLQy1g%2FqfrUALdMqa4LZN3MWnd0uf3r39mrFsWHd%2F2zl5d3B60s16gZQ7fjDyIj%2BpY5YnsJvNt7XzjbsYqruzh%2BkJU3iUylL%2BMLxvLU1em87iUV14cv4OlWzcI1Qsfw%2FsxpxtVATt7KObiOkvmFNhFZodZeHFdd4nsHA7NVnheariZh6jgMIthUrn3rwGS3Tb7Y%2Fq9UnDefGyOLQmWVtAvRYXqZyXq%2Ff%2Fx963sLdt5Ir%2BFVZJN7bjR5I%2B9hy3jivbcqJT2XIlOUnXdhRKoiQ2FEmTlB%2BNsr%2F9AhiSIgcgJT%2B6u%2Ffc6y8Rh%2BBwOE8MgMEj2yW5Ucj3TeYuKUTNCt6xsZytVj2otUrxJXeGf4%2BVWfn45MvL9R%2B%2FFu0bT%2FmD%2BczLtOp%2B65YENZtK1ck929kgBYanwl5cLgPJSAKgjLWnBVZiHJTphjLxCFVPzrBEZ1CH6CBdkXd5fIPHI2RmWzY5yAdYgbTktSTzENtxZ7lt7bhT7%2FyuV2xrC1mycHtrC12xbSpJPMowN71gtPVi87uXm6%2B2nlhuZEe3GxR9HRUMcmwN6WQSHUiqfPm6J4T031bmxs0Xz2dPzvAKs%2FvvXyH94eYC72NlNprzqz9tyY0pORQ7ikWv%2BRqYiYWwNjsrE2aFUJkI7ytwTvp2UbRN599TeEIrrAj5GiRm00AM1YrI1shMPO3BPj8i0k4JWCWOfxVAczGa9lDNqoUrpPiYKZGXP4KuuRlEkro5gB%2Boca4KXk7pHPIWnS61T%2FfKBanhtBdGhZvGlxxL8TRj%2FXzxHLBqOWZqVffxpPRhNViaoHx6fv6lmJIsp6QLDrYryN8YWSVhVOaGf6hjTrrfpdhP2XfcVXOtkMEr7pSM6KBHSO6MRmht5fx8M3u%2FujtXmc3D4UVu%2FJsrl1RIMX%2BsbThPQgHq9aX3LHXYfVfdmrvTMsGzZ8%2BKCBl8dD8i5VlQqWgqW2mxz%2FDRPWmfoLiu%2FMFcm08RI%2FduSmFD%2BIPH%2BWZlwaDcjdYjbmivuv9ru1Ftv42V%2FQTKjLCQAM8iqUU02bKdumB6%2FF%2FfQGk%2BLj1R%2F69vvbQyll4y%2F7mtXwJ5Z4vLMsS5mqtNL1cZhe7nkAtOKpzWG8CzH3c7v5%2FUmK8hFD0BibPd94KctLGy703QdUbP0VibyoEZWR17wsCCyy8AHwou2ABcR9aCl03gyNN27UrD1okY4A18BtH8hwGsSb75NeCJsgnUoC1rVLvRy2zrx%2BCVduT518KX2sKmGgP3psOhTojEj9pM1F5pC7LpSkdzFQug08DWIGgwpoGUxZcGtF29UUAq5SHJrBhHEyeXs%2BawEI9zKA1T2VQ8Pm00kNftsjmZB2xOTH9lxSJZ0aenX6yvu5%2B41Gav2q7vZy0%2Fc%2FM6teDUqmqGDIAGnQx46%2FZ12LVp6%2FkwFKQO0h27GRiDlmXrC3NI8EdUobZyGNmSMrAQ1A4ngbI15VArCKwBmzE64Ba4cVvvDDx%2B1EFsFlUUf8WAEZrpS9CQIwpl%2BqpLISpDE62rbxmUV4vMZSWYw95meKcAeY0YVhjbuo5cxR7qgImvlonedGWXyxYpX7XKUleH68Xpri0RZPcCk%2FUWWfbqmMC61iFTR%2B8%2B1iHojFNA277JmhUz8fqsCyyy4uXQKcPToWU67P2QjUg4ZsUp82IdSJymBrvWXVEikGME5FgZiDeDrF91kD4Yse2yBr0y9bqh2bIGuh5beieRObMOsyO9TbcYfrYUYxcZ1qeW8nksnCt%2BbsusYfdYKF%2BwG6wmz7myjkipQDuOUSWCSfmO2cwtQmdGHOdBhxZtg4Qn%2B1O%2BExooDbaC23bs%2FqH8aVWo37Xtoo%2FjHMWY11%2FJ%2BhRhWlEkL9jdvbus9YCt1bmo5m4WCIoi1dpVaKVB3UzaOmvq3BJViATHNvR8iz8QDhry2tcTUYic9EfRmSQ7RdB1iBY2CHWPjV2hJYLW3JcFZy4cdJdWznnLzbKDF%2BH0aVEfSWcty3XcoxmolOp5lDl4%2FHUuiVR%2BOgo22LSDtmQZ6CJHQsucpmXqElNHRoZaEA%2FYdH8mnXqnwU1EaETyAL0wgadc0Kvc6iztVDLvipHS8%2FvKsHZeM9VoQMTHHh0tTP11Ax29G2ZG7Q04n1BTm3iYrxzE%2Bo9wgGE5%2FtiWjjDowQMPMZLClzvGoNxFBxmFTFRcMqPLRnYYMbJpyGmOcKzTjixGBpXXZ9aCFcnFu0ikQ6OXoH44hShwAI7Zs%2FQKT0OLtd%2B0GZvheowChR2eEaoSixeaQ6tvMiqb035FLAAnvJX7nWXoX%2BuGMbXMRTjBSCeGtSfS2UWBMQyjgdC8xHUQmzF6Y8xQZyuHrGcwJDMGHZWONhS3Z%2F8pSafQbRFr05UdoNNZvb5TNoFcYc4qd0dL8V%2BM1b7xAvTqrncJenJibBrrAinWAXHljMO3r4ShcDxTz%2BhJwjP0o6RLPKwR4yPFgWCV45GgaCz1wKv02chmwi1LeYpi01%2FqxIkVhlrsPTVgo8DU55fAKaHHJ1Z5it8tTywgCyx%2FOUGMyxrGRAeS%2FGhg9dl7ei2QImRzR7mv4tjF07%2FKmVTfxIhwek0ECVWB1IayikOmx8LCj5HHMFZ5xuumlJI0DrKkh4oOx2ydwnToW4NpoFfF7FHEdz5TASMHsOdyjCwLRJjwkckPiqSWqPPCCgutSc9h23DPjkS0JgomCySJvi9Mrz6fMyjzE1sKhAPsFzQqejHouk0PUUOLI3GBxzFOMsJcWikLJyWxI2waL3%2FkxMS1ySiPkeVC3fVCx0BBsb4ulunhVh1MGQqwvf7Y6n9mMjuPrys9FktMG4ooxBNFZa5HfpwpQIA%2BQZ3B0O9L2zL6Gb7m9E1owiYR032MgPGGEXkA0uG%2B1ScMySkC6F%2BO4snLIt%2BOTdg7R2GpmCrLIMrhNBZxnDl%2BXrF6SrUF9X%2BzPLDxdbX0xRXUrF6PBRar%2Busv8f2ylhzUW7X9Tv3dHf1%2B3Eep58v5uWTBV6TUs750wSvU9pKyqWe04rO3f4GCS1K7Z4L5vg7MsOzzyDPPnm0t0Ml6ZJUkYDTbRNRuG4lK5%2FX19eYwsCy1D5NG58Drhxson9wKrCH%2BD60fN3V55fKzAz7askZkOKgqC1yltTnaXDdevvqOfja%2F%2F%2BFH5kM6o8ukHCwOYg2p%2Bd3q7l0nFNTl7dxfHBq10Q6fVOjp3w9L6vH0LHXe1r14%2FsBPx5qwyneB6xnKLV%2FJxx81dglUptmPhB742%2FevCnvgb%2BTcDn%2Bg7%2B%2FR%2FD3yAMg%2B%2Be3LFy9fFH70W%2BUU8%2F6fu1tHf%2FvXWJmga5fuY6vRpZV%2BMl8SZVqBT3JT%2BCI7m8vfyw98WU4cLeXGdO0uCoYULKbA%2BJ42wzQUVuz5MlxTTgHWqPdUUrARXNo%2BlD4yl3eWVjbx8V82kDLnrAtm5%2BHP5kyMMWdBjQLeIY53sv1TYZgssWT0NDwvHO%2FS8uGmUtQ1%2BbHWOmrRMsz2iYqaU2HrqyRoTmlojwWHSaXNwD%2FxUAn%2FMotVeJpSU%2Fqji7l5UYZy1Gyk9bUjlrawpGUP4EhCm%2B%2FxQlOHgc%2BPFgfDCYP5Otc4Z%2BJzbcjPp8VB4BYM5zxGBTq2fXr2ZuMfo40%2FL2bqnG%2BG%2FpQgPSukuvI1Fke3eNzFAw1CWhoswQ2PPMolpwo0xI9wrmAPh9KpAoAfeKagCl7uRAHy3svtVtkagDKLVgDMW1TKWNJU5x4HWDkujT2Nd03lgsKykUtmx75AyXz85Rfj%2BQZ6xFnHH%2BM5eRpM7375RQqQgS5r1tQ%2F43nu3bX0n0BS4osbGxu5V%2BB%2B4%2BmWnnMBXis%2FQ4XJJOg5LAo0x0GaG4%2FCPqSG1fEMAvCH0GjVcDqkKHy8g6fvxS9vfPmu5Clah3%2F3teTbMKalBdBC3NgA0pWNBP5xdyT4l7jU4c%2FkKHwJGUfVffnD16dbjxvBxBwMWHxn9ZdxtCSEs5HbcadPU1CM8k9v%2FCUfXqLN3yz94YUEdclGARPoEbaJPyDpSRsFPXjgVpEUvtxmQbmLtovDOjr1LPLnBYRCqlKwvVtERX9J9hCgVXCjtggOTZ54V4DuRyG5eyMZeNgLjFsrBPZyZEXKxb6BIbJDG3UJAtMdeBNyLuPTe3isjS7nUGZtJu7nM6UZjuWOonEXw6aQZkJAv%2F1phA6DMEjr0L7pmhPfCkITVTsiO3Is5TI9LhNKHNoBvOSTGhqMP8XddqzerQFzEtb6Z6vr2JBh6kKzrMAaxLcBfBwdNFID6JAs%2Fih1A%2FonHPQ9gMfOcuLvYeVj8Y4ROja0ekDhQ%2Bx%2BhOGf00QcTmaQhKvp2sOuS%2B7znGlAgt3YAxFGLqIYJVaQhrbJDUQXRVLG1Ce%2Fe9Rfhj%2BGkl7RAYKtaooxrqkh2OgQ1uXYwvpNR%2Fbw1lAdpHr%2FD3L607e68WDYgR13g4PRd%2FBAnX5C6zKtBoYsgRFCQTvWe%2BqmSUrQZ6dRn77%2FJ9SMRSgu5bJYLOZ1IZMe0nkJlruMWKI1VUgu%2FWG7f5g6ubSYsl%2FgunSB3%2BGM%2FPxb4vgV8YDJb5UwPX0EWFN%2FWqpjhy8%2BwQKeSFlL0XoSL6g0GBdVrAi5q8rfiWMVKaCcMJidyvAaXRfEixPwXtyZxrxfDTzTT4MlofNLe6jC0Q8w1%2FzGHqp7tca8IXnUAghe7KHrRbBvmI7Kk95RvHsy%2BTFSnTWXdOEMDGIPW3gYUjy%2B9AbovsCb%2BlBkpjyVDEMbtrVrJffr3%2FYdcraGqBcxClZFpVTwLOUVFKBxAk2IMSBXjA3gQeauHwbDbuR9ttzYbZjlqPYqR7Qq5FQEWD9U5apkUri6w31C5ez6gYXObREysQa2mQAURiR4fxpg9MFu6ig2TeBT88q0HTR96s7DrkpvdXv2wKYnKcR2hx6HqJ0gxWZQcwGzJVC6SVAcQtN0tg4pENB%2FD5o9KYqWSsFGi8Mf3iHsZ0YeBlsJ7nuC9IktO0U5cC%2Bp6q9cdVUMIfqoJHSKd5IonKXIp9zEfhECinviEWlQ2l4egQp1Q4kEJePGh9CfVOxyxKcb3lnxsX6snUJX9Xv400GH7YM9HXbS0CD77L39g%2BM2VIRB2zqk1urooOPqUU2DHbzdrx%2FosMY7HSK9KdWDVeNt%2FUSD1E%2FatX3%2BpgD5oAEazX0NcqRnOa6edFo6TK%2FTMVRAAH0nwU6qreqR9oB%2FotVq19%2FoML3hPEu7qY9uu6V3fbv99lAvqaO%2F1uG912m0WS5eg86HToGqRBktedw2%2FuHpqniF4ueerWsVApCI5hzCuYvIeDnCsvJTZZ0sFRYoZTxEgx3lGk9XOp3G7E3tuNaqdmqz%2BvF%2B4%2FSgNmu26m%2Fqx6vokaN8WwD8WD%2B5%2BvEOVZJUAzKVqqysrGQchHx5uf791%2B3VL3%2F%2FyqCz7dXVmZj5x68r2yz3ysqrHwD4w8XsFVy%2BJ8eWg9lLuqg0hVCMAySqGH13emX1y3dfV4sr9cNXaBmr1ir8vsLX%2Ft3V%2B76wevia9Gj3X1Tnkkp%2FV1jp7wsq%2FeUFdPe%2Fv%2BKvCiv%2BQ3HFv%2FsPqPjLwor%2FWFzx7%2F%2FFFd8uquPfi%2Bv4w7%2B0jnLMaxG3fv%2BouDWp7oqq7%2BwlNP3lV3LjtJpJbkJVYb4tm32Z1uQ8jtJNJnL5%2BtzdYqxa9fxsML6eXOxu5dQI707cu48RCxz4YytA8ahE4KcPH0jnZz%2ByHLmfvnFnqn8YeLpa8gSIEiRMmOov1kTwgaDbVpiBbgUxDVlZnou20syoPfL80B65ucP6ZQm6tBMKBYSqn%2B4uIXwQIYdxsRaafepyUinPUgLX7FJagC90dZ9g6hr9CQrKouDW91Aqf%2BU5UyWbhkb6txT8Z2AHBlmNGWPLdKIxaXcb4djipt2l0pJYTegjoowL8aw3L5jtmeGYWUlqwosSN3xz10k%2Fb4lu9kpQRzqzHgODiLIB76GyAW952YBXKBuIZ2lZiEFkFcK1X3YDa4I8Qa6LdTtvpgY%2Bf8h92zSqezUWjmyRB%2FvU6SxOonAtPjTb7O5m%2FQM8ffLLPzd3L9ZWtmeU7TnN3nsG4C1EpMyCSTALFMzauHGnYNKkW6VwGwbBppGbZ0ImbrYUBF4ATWdGoLF3dj375VT%2FjHWpW3Ywc0%2BH5RlFerNHkEfG%2BXmfXrznfW4FMtVb4%2FiRLhkB0CsOeqn3NbOvgjX6PQfppQNILx1AeunmVLc6Dcf2kDk%2F4vaMbGvuj%2FVZElqRZGOTiMV5bg3im1NuggebgN4E3%2BcGl7BqPeZMill4RVFg9zSg7Euq7zAnUczMeNzXXZn1x7yj%2BuPPg5B9YPzZjYbsE%2Fyjur9l6BCHLWAYZ1YT9CzHzH9gbl1xR1wDbsbMmzGww8%2FCdxSYjRGgfCBh2MrnJpasD4ZM7EWgkC1fdcyuAwUbx1FgDiOzp88%2FtDXTQFBlfXZI1upsTCafeX9NWERHADGjR1ScYKuAGcZKC0PwpVPxPZ9ZW07DsWCBOWE%2Bo7i3qL7HHP4AVKfdA0uwoQss3%2BEm9IFF5vo6dMI7T8JJITc3JFpPh3FnzJWIe1Ik%2FRAdFlgMxKcT7xSA2EN9sl%2FplAMGlrLdaWTn41tVfG7D7TLUaPuwdIe2njEyw8%2BfbbY33wgrMmA2vQPrHjzPHmrEkbqOsXLQbGs0TbEwW1%2BpMW7Lgu7MJM01oJXOc6HaUv7DqVutAi157lKrnc2wpMZKqbBk8Vnlt9%2BefTQuZvT7fPfb2Tcq8c1DNO9kG4zMV4ki3qQblkX5L0J6ctvSrdhLOwL%2FuAAmYzGRjSZ71lUBD0iadU0WLJurazp4e3VXg1T44QT%2BxfyE%2FuAh582L5FwkjyKZ23OeaXkDNaHmdxU%2FeY8hfgoV3pE4yPjRA9nI%2BQeW4yXj%2FEUMJYksDronreZJrcUjdyxrwVqRLFgrBR7f1JdJoPLQ7xZYzpZ99%2FT4kdp8Bgvp%2FHxj9%2BL5NleKSnQk3uuhXpdjYt9VG6e1Rq398B7Cqq1ANfG6uiZVkmIPvl%2B9a0WlTS%2BjMJNMvMojoP%2B42GIk8lH%2BWnYgwnu4ScsJRx6AA5Mdsnj7WkF9qVkfWKvImo2saAbc3oxUzq3VjRUau2I9nPs0bS5s%2B%2BaXJ0%2B%2F%2Ffi3tRUh6tK%2FrgM2HqOV5TXUlr32NIeOtGcMZWjP%2BWrVMshi5odsVvF8f4QdKxLFndFDxZ3R8uLOqFDcqUTpzLD33hbPnK7iIvs5efVsZWX6X7uz09VZY3W38mwJfY70RfXebusuoQN0a2I9DsC9gzecx3%2B7gqvNJcI4bOqnhQvnbd75ROnwSeRhicF6jmqMw7yr011Kr63uzuZ3z1dXprPTmTNrzKbO7LQxG84OV7nW6Jecofh%2BNz6gadXKAwcvt5GftGqAE%2FYBNzRLvXBw7Z%2BkqU%2FyYNEvalb1OmXXKqhSjGrIiXIx%2FCqZsTF1IWHYQ%2FWLN0tbFhRNsy01x9xH9TKhH4DFytxF01jwFlvQM3E5ggbx8nxZjJwoFidHSDKDtVABvyiKc6anKz%2FLj1UfvJYflofywb%2B7ahknzRcw7AM86S6NW9JYcWWrSpYbJDP2bxgtUHm9yGvPFR4qlX1LJFKTIds6I5fY9D344sbFmnzE%2BahnbYrj717ECfoytHW79Mv7tUZjKaZD8sZQ6DeoYOqKU7ZwBcbbiTaV0omw%2FLYE86ysZSTr3BS8oqacH%2BvZQfcXGFPipMLz8y8lzNTmq9JZ3Wx2ug%2BuH0wAxdWhT5OSyrws3bqqnU4L6tIl6lavT2Lpm87rjfWL5%2FDNn0qannuQBPTEM6bSCYnV0L9eWGpcLW3i5Gup71DIW6wx4E5Ocngh1V1D5i%2BT1mhFfbed8b2YffS1rNknp8csmnfSZz6SzlPBtWSZ365PX3%2F6BGVPehTS2w6Vx%2BrIM0wM3wAJNzS8oTENlWFU5hvES4TS6J%2Bff%2F1pdvbTl68X93Dub12hkWeHHSIUrv90cRRhAA0eI20NSqhVgwmF4rQTQOmC0OWPWbT5yHuiXlkRDcrbcZb81B%2FBBFuShWAelLa3yyityp0ZhhJGN3oMqSzMdInJxQXwMC5XFbwcmwt5i%2Fjc2gcYqHa73jzOxo4iAv7SAHrdieCfZYwi%2BGcZIYXqSG2aYTGOAeZXllx3U%2F28L6t%2FB8%2F%2BZea5j2Mfe%2FYEdruLEis1%2Fmh%2BEPbTv96ANqUZNjf4XhR36KNZMBZuCGJ7ZYnIhfTef5aZ4uON%2FhyLCWvyEdEaLMKH4zWr50o%2BlxD8MLwWF7wUXsO8RXgtNvo%2BQi8IO4u80nKNQ9dzO1YwQXfZcRGFNLFSVWLusFOK%2BMy4SBgioFPPgOTrwvJLIatrpexf7DS4DR2MkekXVaZQmLOFQjgMhlT6tQB6es8b3EqfSQrakU5yzjZ1j36FyCwzMtoaENq6aOHClI3icWJ%2BMZcRbpR6bVpG%2BzrNt0gDW6x%2Bpl8rn8pkK5%2FuIzZZiCVKd%2BsauTEAgn3P7H%2BehhvH5jQwDpmn8qxqR%2FvBU0Bbd9rT7PR8AApEvPEIKNCxb%2BxAQoL04IFoMCl8OURIue%2Flfi6mAhv1D%2FVWNyW0gQLUJQ2oLb15sbbyDYm5d1d3K0WlHNU6b5sHejFK%2B%2BPsm92di93Z2cbzf178Mvv559nr17Odf852dnZ2Zz%2FvvJ6d%2Ffz6YkdJ0kmlZA2ybj3HQ8J%2FfppdEPyMjAJ2hO8XBz8d8vA8YgwBptC4bKhSj8cVsYbKXymHwxgzJT6myC2GFGX6lizAA1cZFwJvLhFfk2uIs5Ivpx6PASHEAgqsvmUz5cl4tTCoXELYXyJo5NRF%2BQEDSvWMod3Qd%2Bw%2BV%2BvjSpxSVEkghGcvShXTG%2FVOrVVtCKZVQmhWHvmEQmWWlf%2Fre3bENY%2BHqC1q6dimQLMu9ju9nda%2FjGagGN2lAmOu55nQEk8YBV1APWesrN6X1uZ%2BXudTrTY63XvhKX%2FRz1dnMaCnPHmn9zdo0WhuDKsbhwq8QcabPTJ0PFOBJ9XhoLoBus%2BqXQDWu9ilLM9XAYHe08pEHcm2FX7dijFiCJvvxRY3jNAOcgtkqfMiRUEp%2BgrbVP6D7lfldv1NvdE9gAl5hBMK5%2Byns63ZytmXnyvPLj4tyi%2FHsdCIqQJ9MEkjTGcIC0p6Jpf07O4lCaE6k3m%2BdZ%2FSZkWlze5TGnNdPXdcfY%2FSzopKu7hPaYy%2FluNxLFXaz3JZr%2FMllaFbtQba9sh2au4AJuQKFEFh2bUzAk5UL7GaNI%2BwsYdlWuHAq%2BKXdHK44Hg7uwCFA77m%2B1prv9oGZgWX2T21%2Byr%2FpJONld2divGcL%2FDnRkVDb3NmQFzdKsb9DXVm7qw73%2BQbnSEsE5rlh2vlZlPoQ4PhSJaBNrg8UAvrulrg3zxW%2Bzx5jN5GYcF%2FVG%2BLvXunjmnV3tQ%2BLO4XWg7L6unog5d2YLB85z1eB0qdKFYT%2Fwgd5dY%2B9em6sXU2tcPJzfD04suL9b9zb496jQVRBpW%2F1HJQfwsXhfoTlob6EyS3TFyxelc%2F3OlYth5%2FLHl9lxtdeXwLRvjBY2wsXoDSa4LIfJWNhjYY2du%2FIABVuV%2BEBdOPTbuLh2GHrUqFkY0p4Vip3Df017NnjIRMichnz%2B5b6j%2FbC2pbdq7EpsfWlpGEnk2O9e5fr8Ja%2FfvqtGAM%2Fn31KqzVv6tOJTW6Z4kl8%2BG%2ByObxAhihAir89%2FFnYvYDL01otsYJx7HHfVpsGdHYQrmshVotSlreuyUgaUotj%2FCKLe4KOrdMuBPXOsye0modvthbUqqVF8e3ylUzjRVTPApFSmL5IcCIodTxJNumAQm8yOt7BJUioSfD0Rt48DN7Ovspe6LFT%2FLijjqoHVZPG53ufvO4UxU8RQixczLkaQ6epedzDzTOKvdsCXc%2FPCiPGJJnroq%2Bva2rEWuzZZHa5pyk2l7Z%2FYYE6%2BH2BaOgSijLglBTX7RpOj8S0EgR3VdxIUv7KM3Ujzmeq4ZvsxbfqxqADk4xqDbqspnxac26oQ4BgH%2BP%2BpvF1S5UrMwYaqF8EbnAzIHMBTdbWq7qQlSokk4t0oTIiU2f4s97dJ1Hd7NfftlV7u%2Bun6%2BuFmkfUq9tAJVthlCa5cYRKoAgBtrWJVxgmM61eRuiemAIqBUQLcYon5jBPEDcvLyszIaoxM1k8sKCL0AFSx6H0hnbkkb0Or9KoHA5d7DvixyIFVRfQt4lZ5%2FUjMc4%2FZyIR5%2BTh557TpY%2F9Jws9lX1pYgZyPvR3dhQjnRLYhlra%2F38%2FAsLurO1IWj95GQmldByhhVdSJKZvtIG3DwGLHu63yk34%2BH%2BL3IWSwpz0HJ8drHG%2FF10mgfNbYOiXWfjLobGChlQbtjuumG7Q%2FtmNYfElj0AaNT5EVG2eivCHk8PNMycKhvoVmz31PRjfVbWb%2FGRzsrc6mtztj6LMRxVdnV3gXvLZX0FzCVk%2B4LtR6F4vODwbN45OA4pRiyl%2Bt5WW9V9IQzRsgLLQtM%2F0exPNvm7g4c1h%2Fth0Y9r2UF4xI90hUN3QQNAd6qBh8OCvyBEXMucvZPrTH4GLTi0EXUWdAAtUwmmny4TUD%2FUl%2Bo3HFqCfyrYgpk%2BAh719jFSFLJf8q5cusVqukX39a2JCM3zN8h13RydQZ1CjQSTuasMi4LdYagOMKQRxT81o%2BVRzLdCKM6guWPE3WlkO9AoLrJU1ouLXJAeFnlYYVnzBnvvFaL7aQFmKxTWSlN%2B3muldpPxuwbQhv8rukLebpbpCHzTEFb%2Fwg7IEA9CPxR0j9p17tBv9%2BmPnG0thgxSOMqQsFJpNy02m00NqwvUMh%2BzWdsSCi2tv4YeShsY13RBzQD9NZQGT2ggUkH0qmO%2BdIPX3l3em3BZrxZPu2X9S30kt1EZipVbNcedsWhYoDeOPQP4xc9Tf31OsRo9zwuhk4pGceP17OeNUnMimYLZ%2BknUsC7jyCYPZ8eCae9W4McQ%2FDCGLC54KY4M8z5ACbV1uvd7Xnl05a%2FTHl3l6qMkf%2BtiICD1%2BcLAvCh9XCHGgNT4lULXcyYbjoPAoSQjXPy6AmTmDhdlZir4vt55S6n2SXU%2FV98kMHe2MevG1sr2duyHiZd70q6dHjS7SpkwT1eLbg8qKsKdTjkGluDt1Z%2F2HFt39%2BoH9hX3ZIrSHiCMmF9hSSM0GgfedalqJM2mDL%2BQwwupRGuTMptuVOFCnG73sA6YqctEOV1lUCk9qB3vNw8Qa3ZLhD3zryfrTPg6SQr0D4RT3woWi5F4aSLtwPWd0f8j4j8G3au90WOAYV7ukFfkmAzxOMAocCQtaEOLrJkC6mydpCcNsNrxgZAvnOp8m6RDLTCPAoNZwPORk9Ab7lOTKVgLKtak%2Biz0hag7XaAnTWCmK62gU907tsgVk7o0OmrhUK5vTeBI12QWFagJyEIyAPTWtvToD4axubk5x1PFK2DuElRfAoBe%2BuxTjjnpDVjwK7Lp6pr9PjRPGBN6ClN%2FwL1LqmfXgc0MDtLZ3p1Y0djjMzRGit0UI8mzq5sebxZ3Qqq%2FrfcBKZSz%2Bc510WNt9NwXJKomQba%2FV1sHzf1OtVQNZOD1mUVtQm39ksa0LpX%2F1Ft73ebe%2F9T2C6WJTwr8fJSVmj2RY1tgiRBYd5BkCPR9TvybdpMuAV5f9osfd2T8%2FHFHQHpc9ilVhfEbZa73lqx15SNuhQe4RaoHR9XOPhAszc5b3BxbtazM%2B99tUZCjFMrmyf8GTad%2Fp5bHsiV%2BKirx031L%2FPbs8rfr9zcYYotpuxfpu9%2BveKb%2BXqQAf7%2FiS%2B3NH1o8U5CXVeTvV3NmAVFkA3Gf4osjlT%2B4aHbKlxS98Qidwgw5ikw5RCEP8JaoajT0HMe7BryDUlIgAUMUdK8b5%2Bd7SQ76sos5gIGgLBbGH%2B97I9cmzt0bGrsbYWx3HbIPKRn1Lio5YXGA8CIDzRjMPkYhJ3UHH638BvgJe2ABATi0rWAdJbfY5E9Is%2Bx%2B%2F0nfGucHWXvn57sr6sBooKJJbhV7S8zmvzlTMfqQi1ZRMpd8cQqLaTf%2F8o8YVnp32QKONvB3f2M2v%2BlTuq8As8xlf0PdrJ5BjV%2B9gLubv1sXiz9E54392f69XtxFg2xp3uBoAjEWLpivpN6G6hZormpMzM8waZBhAqgZGdeWMTavLMN0MSgYcCNJsUrk6EUwKYiyFIpFWT56dDFWMDL9xsBCvl%2BpyDC9ZMkmRs8Dhf7889nGPy92n%2B1Kfk3Uy47nfTbHQLavbCmPv7H7aQwz5qIjPndld3t%2Bs7q2q9yYvUTFP64vfQ9BNJJEbRTJVNtd4qhXWKdnmrxV5JcY%2F2IH2iU5FtoDLEN%2FJH93UvRnfXUPxwSK4hpYfXtiOmRIjiEyV7rKfnJ1bfaCC%2FAG9sgmkWqFMs0z86z3MxMt9GlTSIfBZE%2FaYLsRTMNga%2Bh4Jkx2j874TMe5pcMtFxcR5PICIzDVk1weKAImhRncFqz7T6StsPL0S%2Fy5r0noUYBQt3xdXd1VVqjPNy52M%2BBZsLprK%2FPVTxK2gNqhjXQ6GFs9qscWcnPO1ti6MbUW8iIy7Ugah1hiCxq7qF1KC%2BPF2eDgQhvUIKl1iV%2Fd5O3eHr79Mn775R3f9pr49t%2Fjt%2F9%2Bx7dvPlzMrYWT%2Bsd3pSVBx73YgH11aN%2Bg27xJPAzU72lfP0Lfps16nq3M0muUAsgzCevynMnco9%2FKPUjwRX5B8a%2FE1DUXiWBV8gGvHL3vqSJEf1e6qnXJCV8Bq0ktXbrD4%2FDr3dqHDmwoBSbdOh5aiSX5MyW7X8VYh3pry84XinlQ2SXlK02pNfs0P6j3YMRVRQ9qh%2FXjumQNcOfJJ%2ByQW1RvqZsWdZWQHR19Pv%2F5PoUt2koXrY%2BSBuJ%2BQY2cxUd6f0X9HjpvtOp8n3%2BcnCRbg8edYKcnJ7VWl1T56Si7eszkUYscwW6lyoN4gEmHfMyARNKxnp9IlVUwPiYtXgIFaGBgDSUntGzY82exdx3El8WRU75LB1CUYy%2FpCl7tOUtjTCUy7u63alWpr%2B7o0%2FcOax%2F6dtO1rs82jZWLe3n1LUShi9FjoZvyRc3NHx0L9SyolaC%2BirPoHpY3On7PPcxvf7lH2jjnnglLWvim7NCXrbbcU24GEl6bKJJRije%2B2beMy6npkEwEzRyGHnDLylBF48FLvN4Wr5L7WsPQV06PD2qt9n6zVcuZxczdfDF%2Fu3%2BtiQ4Z5JAh0mOaIWmqJY9ihLTYhAb1d6yRiZKODRQ%2BGDDw1yhLQQ9NEx9Y1chDwdkVkI5KVqKWoBUajv3Z2mal%2FUKytV%2BQSXxKyadKFjNB3R1gCQZ234wsJbWBfyiEIQ0gyAITsnhEFtj3fFps3wP089nHX57uXqyiIVl8lkdpAD67WP10r5kiE%2FQZPzjwgR1GtM8lqPqDRbT8gthVJS5tE1lZ35s6A6ihYRoO9L43RLA7Cg2gv2PzilS3ajUGwBC6hmpqvtAl%2BIZFBmkk%2BfKTpaNru6X2W%2BhMgdBBC9X%2Bqi10phBjgpk65ScDh3BNH4uM8qKsDVCyaAXZF3P74XNubqFka3m5VoFUix%2BJ5t1cCpFmFngSLfQHkUbpkNqJf%2Br8WoURWBOcgHIWYJnvbX0biGdJmW%2FiiZL66tZjfbWCX2XGPnpbyZLmkdsLX%2F6m%2FKvfPP4XSd1wcVsvyr4sTE4dpG9miZB8riuxntdwWNqN1PxmiUIzxB8zvBTpwMwLipy%2FyxuJn7ijk0YNgx8cnXRI7vt69%2BI1l%2FYmBWUy0sb1BHkykjvhLkYTb5uOoJ7Hl7PXaxe8uNa7o0xR8dsbq7vqHRK7suSKr66ru2cUJGdwcfbx9cVzobLYxXGFl3R59xEx885rfTkX%2BnJfQpVe7P989ty8W3pLRwfVmxjW3GcKTqnq94ry7ZMdW9yIEKqNZALOjAi6AEJqxOB27HfvkIId%2BDE7LrPIMlMht7Y2py6FWc%2BsvuxyK7GoagH1t6TJctBjSkUja4IuubmmmjcQ4dFY0pyEgos532U6uDx4uB5EoP22tlc9frMCtD%2FJvpGSwF4wvq7msFg8RqupwnQOmyVQcThFp2bFCv74%2BYdr%2BFtBTzK4DnoPNLimYpczuA56XLu%2FzJyvtZefDfeN1pFXLfv52ydorP3t68qyQTHhlbNvdzYudouscs6%2BhYffCvHr8jUO2GqiIpY4ISiPFptbHnebWzAmjzG1ML0RWL4jTjF82sWnD51q2c8sOeXwlRa8cS%2B7krLJSSUbrdpJo8jmVN9tU83iSuib165Bv13Hdj8bkrL%2BPOYjuR8ntQj4D2y%2BN3v5wujhPU1Qo4eMeg%2BY%2Bl7owH%2B43sANqtEb5GwcmzowBvYVTlfsHMMeGo4VEYMPLCZk9gLUj8dyL6dWcGvEPrfRnQbMuFvU4HGNGz0K2HLLr%2FTMrWQ%2Fz%2Bzoyunxa4NnuUOc5zwa%2BFby2LCgstKZfrae6gw9Jti6McG29uRMndZSG1a62bvVtZmeeyVL9KXQ5OwdPUAnhGB51OtlOmNBbIqlbPlSGVmphg2GD1nZ3l4V1Gu2lC0T2mcJ56eAhswIJiuqjHmuldEO4%2BXgB%2BZlcb4TNYesYGz6IaCMQMOiqyUn8Ruvy87pvc9lT78RHhbNH%2BUdHPm5Z1kvPc8u1rYlYOJOXHz2kMlRWEHdfxBzBbLgOw%2FaqRJU%2FlgbVuFe9Rjb1N12qKLdaa%2Faru93q53mUSYchj7UnAVM%2FH5ljBGVjC5fHh4MiNCZCBVMHmutRpX08du11rsa0yW47xb25z22sOX2L2Ni3vYsgxuDpSYvypzF0EInFBp96MGh0n3lkVTG%2FiO2lmXd9OB0O%2BjC7CPPSUnVYbRI%2BPtcnFVb6puVEmeN3f1qg3l4jktnU%2F353TwCKRKviPgulNgvT%2BwU1POvwM4FwtHCtscPF0fkU51UdKxRVnfadCtJb1XiKO4DAwPkaTv48gpMndOTBjuVvqtTo6I6L1VfXqd31dbLMg9Vve5Kqs2hjLa7sEnv3m%2BdwcdeFX2Mufhbu983lBOPbnUfQ7AWWsulBz%2FCOfByK6l8Ad55nd2hSmWz4A7mGHcN4vgvXizoqKMbx%2BEpisosmZ3N1ZCeKrdlZx9xX5mdxcYO332drc42V0vDAQLTgDJYYiHu8%2B1KBciWNTwGrqwmQWrWdgF6fv6y9MNiTICyL%2BpSQP34b1mzubTq%2FwQeZLe0%2FiU2GPQyaZtmbMsW5z%2FL5C%2B18aD8X9LcXxfm%2FTnN%2B3qJemxl6rG1RP5ZJv9sYf5nae5nC%2FNW0ryVhXk%2FpXk%2FLcz7JM37ZOsOa1EFyG53qp0aEosyWs04NkI6N6Fkgd5FQpZIYiJiJQKHGfFmgsLmSXW5mnoFs0dquaku%2Bc5Jqb8clDvsYVIHNHLOkMHMVY9eq9zDHJGYe8KdKGfxEa9kuaRDUNchOiQHQSpAB7zKAXLbau5JFlHP4dy6WVHQoq358qPy%2F7tUaGo6289eXmRnfqbHM69SVRdny9Xubl%2BID5%2FrUESn%2Fo4Pd2VDdBK5Ibk9r2wIPjgqG0pCoUPtoZDVHkoFmFN%2BalfZgJ32NkDxiP5goPvQSNogPLgKdfeaG6L%2Fyw3ZyVAC7jp2j9dv4jPPIVA7IrhYH3GnnhuAaJk%2F0I2hUGTPGptXtjdlXRQ%2FYHB%2BMlrZ8Nyu45lsRF17GJb6MJJNaxZpyN3Hse6cfspMZXmPWXioUnTgXLECp1J0%2FKttb%2FIBcGXl5y2Siqzt0OX5zmxjZ0YSCCUtWVOPVzIQamxha%2B9y1CHHlcj2%2BEdRQqI050qZ%2Bw3h7LGcscr3CxU%2BezLb2sr2Bv7Ntmc%2FlSl6CMpqataxd5b23ZfvAMEalB%2BzFilmJP3zE7Vnkzdk2SmkN1uc5epP06cqcOG8rEzn40aZQEdoUYmS6UIF1WUmTeH5Jv7Ng8dWNlI%2BvJD5zgiI55tcNjLap6dfbr7OXm7%2B8Gl18w%2FPdlcqRoVNB65dd7%2FZyWkb9VdI4ag%2Fmc5hc7Z8UgiUkFyhksosdVpXTCsJlJZAa0kUWp7OKmScYLY%2B3dJXB6kYl3jUvNch0SMcEN30LVGXAeEPPB6Ki17udAgzFx4OndYbna5gEVOp7rU1WgEGHKZER4YeMXCTv99sv%2BUwXmCzw7K9edOqvQFGQ4cfHACqZR86gvlZe9PaF%2BCN%2BjED6275KrC89%2BosW6tWZV9qtaq%2Fd2C5fGCtaLP327r3QgKxpnaqLBuAXgkw9irsOLV3HNiqvmEdp6BVGVw%2FLILrHbBXfdsRWg9bm%2F7FPRinWqMuQv9HhP4qQn9n0E71oN5mNQDwZgG8fqx3EuUWwPXjVwc1fSAR%2Brb2QYA299nn6sfNI6kaCBfrlz7YbAElwXqRHks17fBpDMBG%2B239kH%2Bj02xxWKsg7wee%2Bff9ZoPBWs33GgwZYh1Uq8MSfCND0UWbPqmTRyew7dTZrNqv8S%2FARsJAdaGrAco7EoCdmpS1%2FZs0XPMHmy35mfgJBS96RaxAs8kbT0AYCn1VqgcwHuxBo8awyz7s8AzUOD3i%2BRDISmwe7TG8poA6cgEobPv6utlvHu9XWXMJWDvmGB%2BeHCIxuF%2F8YPO42dK3o8xT4VuA3Ti01aqxqcX2NGFL4zuasKHtN0%2FZTkow3mkA3AOmQseG9IAh6hjKq3l6clD9nW3pMbwIzLZKfHC8r%2BMZgp7yLj89ORHyvuPLE2H1Kg7OSfEjVslWvUPoUIeznRcgrP9P92q%2FntSPakgzC88WPDhpNU9gzuh7EWYArP1r7aDw%2FXaNDbuCijMCHr2rNk7ZXD89qp8c8dxHJy1O3hzwRYSgAzZ3ECp97UAmIWCCcIg%2BSAj67scXOnSPAfbZm1KHHIhr5ICXV9t%2FxdESQvnGjVC%2BcQO0flTVEQBSlbUaq2qtwetUe9f%2BTYe9YYMPOwcbr6Mqq%2BIRb0uz0WALSQEZOlfgQ5YbZvHBKW85zG0d1O5wwlIBeVaGCA5OW2QKr4M5IkCQXmBNmL%2B1w8Maqze5Pa%2BdtvQxqzWPmscMAdda%2BvQHSAGRAU%2F0QUJQYe5Ws7XZ%2Bf2EPThtNeXNpvaupvdO7UOVt%2FAD65wPJ5zsA2DzWCJW6IEAP%2BSfQtBB83SvoTfisNpgLT6UPnYowQoopUNgQhm2VMAPR%2Fp4HtZZixGko4BDgfI6lKmuQyFnvf1WqBECpcwfaqxKjSYjmwkm0bjqgTydDpsArvKujMGbtY6OjrKPNonwYXg0l6UNfG3zuNqos%2F0sn63DyLT0OcYiYKsZnh6dNqoCe3jYqv12CuuVfU8ifQ8lGBuCd7DH1w5O2Xx9Uz060nEzwaQ5Sw%2BK4MJ8IngBuKGv6BhaMMxvqqdMjvGGUU9vAJlxCv4NdFBNRw2w15zU3zU7gD5Z%2B4EzYHMQuCahaNguhY0UoZwvRijfSN%2FC3P71VK%2Fd2%2BapPl3ewgTb16nct4BGUWYjwLEvpEGMHwlPGMVTPyRkzaCMdeEUNRAHjJoGGKOSEAasUEuf6gBvvTlFKT57AEv2f04FYRc%2B4Z8UOBAECsUySoNg%2FOWDuj6hgU5mW0%2F9iM1wADXfvNSJPYLq4qv60QkGquZQkSSpH7VqjBarH7XZFCQYbxGXvBFMyPgb2xwAeKrvLQjTqZz6ERfcwbbEyE2A0TkFAx82GYhngh1xv3YiwFvCfOEsQr3FurwtMZeAn4Sc4mJpC8RLvR3jfgaHqVDf50PZ5iuufQxUG986AH4qsFb1dvNAR5YAO6p3OmxrrrdbNYYJ2uK3mpuyvAqevK%2FVfuVMb73NO%2F1%2F6vqq%2FfWUTbNG9WjvQO8EoNoZQmns699s1JjUDkH6pG2wYQIIz8SKgq2dYVK29GFcOYShAoAJZcGUYFsoAFGKI%2BH3%2BFHxE2GjFveghoCBjqq%2F1kioz%2BD62xRNgsH01Q4QfVABxLeTo4MaLG19ZI8KWKcj4N4Zsjmq6xMdIPr4ckYSIEJ1uPQOQKcMxQAQ2BlGzBxxPHME6EAfr6MmqzGXRSJoU365ttk%2BfqPjEonZO2o1TxnTgGWi%2BKjO0NHR6XFd%2F5zebax%2FjmtvCoX6yTPxUed9s%2FWrIDrJPIEZ3dEriTU%2FZlUvWjQFKwbBfLUULCICt4tKbxfAN9sFRbUlMC9BP1M4PmGL9viEFUR7hCTMAgJVIGgRyglahHJ5Ed9oAHJ40qozkTTCf6%2FXGkL%2BRkH%2Bhpj%2F8JCLDdlOfFKALE4AobUFKBASx516o7ZZ%2B6A3PPOQyxPnD%2BUHKAAtLpOeFhba4qQIPDk61RuvgNRafR2evNXPGE%2FeNmEtsfPcE5aP7dwnzXq7LctS4kcMyreUE6FcYfAJJogDCX7EWG8glHXcLtPOSlStA%2FUF89tptSUMaQIWxjN9xAcTFUjqnLNpVXHX0tFciwuwECRtwgjfA6xYY5QMzarqO50GUVNRF8MKk0ygnoFGr9XfMeKxVYM%2B5nnfIAHZ2mRbMPp2qAr5CaoPYItT9q36m7cijL3bPGIUgbTrEeyg%2BV7My0gkfqQrHCq2WvpKajHRd6ujV6S9z%2BrbBkzFaCoF1JvLWT%2BB8cOzUdYBbSV60ocEmJt6rc3ZuvbbGkO9BNN7oV1%2Fw9rD9hmB6Wz%2FWtP7GEHsJKzNaG5gppiMuX3Ej9zbTcZtIGhPX14C84sghifbvzU2SYDHkCJ6tIWVe1D%2FB6tXp7n%2F61tYJE0mCZHOFgjGu4CgrOMRqu8C4tmEAvKstd%2F1PZ68x9U7nOCFB51mh5Fdwrw5PWLiJoKx6p8WCD3gAVtGAPvw6uh3XZpC4BMRLGR%2BX%2BecS%2Ft3fZ3o1eHSDUEDqQPskw7aqzcaDAcTVNoG6YFEBHWkXVgBN18VwNl87khlcMYfQdVDfiSB8L0aSr2FB%2F%2FTZMsdwe2TBmMmOvUjVgKAJHq1I1DPBBMaLeRsckUdWIIMq3ea%2FDQXibH2Cdc66bRYHFuA1fUFgCBBoNxp8Sa2ThkJ0ZFOAjoSjJ%2BzAfcm6AAhlHOXAP2NVYjcdGswaWwIJmr%2F8aNNgDB8hjAdHQBMR1DCoSiCWDbG7L8TxR7vJDn7%2B9oeaqzz9YhiLj43ZOHX%2B1p975RtPzFUWr4xfytDJab3fat6Iug7IVggTD5wMcQHsUs%2BSMKcD5yt5Jpwv%2FNjLwQdtqr6jJZwGsEEmp%2FgnOb%2Fh7Qo%2FkGwOehiSTMZ0kIeesFk6piaxVGhf8YbJ7zJZ1XAEueKaGvatd3QclW4NcEioNAaYG4JsBU7I7g4Oz%2B%2FPj%2FfvFjTbeLnntFSleZshvu6GdtaS92hm5kQhhb60jdCe%2BRCF07dAQY5zPWoYd2YE9%2BB17gLqdRl6k6Rzf%2FZx50Lyei%2F3IPG3EelUDA0xHOdW0MFBQihEY6VbYYZGcMAugUd4Ti2awn1voObNPhaZPXHrt3HoFDrGLExQC88LrolR79ZyuH4K3S%2FE2FAAui%2FvudMJ66KV7AO4xkpb%2Baxb3p0a%2B4OHbsfGdd2NDZCb2KlM4dVtnwcA2sI1UFrgciD27gzYPQcodWLowZk3TiocCsUBFI53%2B0VjzE64C0M9nQfRykL3U2U9UJguiMLRx%2F7QZq2d%2BkI1QsvVC%2Bsbedv7%2BLOQnQ5t8Cv%2BnIu58qat8BHH31AiRiTUBXf6m5Y7tYsGJg8%2BkDTEJr1JqyVATqt690a%2FjSKEPtg%2FNM4Ay4cc27rgcsNh%2FN4ZZWNYElIbxWI6ViMTUZ%2BIxhUspJb7IN0idmte7nXn2u2PzlLrrsa%2BmCPP9zOZ2jfCFY%2BAH2YjY8qdikLH8h6J6e4h3WN372zhxzCXtNX3794CZcXL168vBCCdsV4Tst4L4y3yKAwszWS6zWWodScT%2FSinwZA1Zu6c1EeD3XnDm8s2tJZ6%2BXWUQsz%2BAvIpkDw5S%2FFEChtu0BHzNu5oo9sUa8sXvJLIg8xzr3QTB20fDw4mVq9G1qB1fgISMWRsYrzYLTi3AGvOBJimbuEKnMKIDlISqbVs5VNsqU%2Bu%2FkwPc34GYNl8qzcJRNt53f97PKRGOMKPqs8k5EZPCibSmVVRxcqZRWncGb5ehdaYc%2BRMHQabJLn55FRebayur756QtQWLAuL7Z%2FuqAo0vKj57PSV3cuSkdBxbAqa4zspUD3TMQ8gcQbxvbOF6jJCtTuJ223KEUlGRSPnV0wGmXbIkz3fIUKOdPU5pztJhVEIZwUrIiRJA2hEwjK3YUoMBCmAlj3IqKAwH7KYOb9RD0QfEpUHFPKChNTLGBgMekAlmFJZRAfIsDTcHXCsxA4P%2FGl6NaX8t%2FalsOCPwIcGUht39D9QaSuXPkAk1dXXijtzHqp2dslRRCKTO%2Bi2lU3Gw9CYnL2u8oHU0k%2BxNMaSAxUpxa1%2FJGY1dF9EtyR3Mbd5BE2RigNWFVpb1RPHrg9psUvt0Oq7PcKDPAvcK9ThsXnvoe%2FFO2QeafE3yinxOhkJbsz6Y7W0Nk6yZgOmy08QjD%2B%2FncjjG6dlGUNiz%2Fxcf%2FMuFjuM%2FqLTwtfm791IYVlPSElkkYyydunh8AeQa9skSvkP7sopXm%2Buru18M3ahxN67Wxgqfj2yg0yf%2FF%2BTpxL%2FEVKzvORoccKbK2T14wVFLwAgS7VmgNVJ5R4sy%2F61F9T%2Bua9Si%2Bm8pd1X5s6djuoHT6c3AmnvcCbRihbTfGHH3gjWN35F%2Bculc6eftnBlexeLMmv6z5rM76R8hnvGLz4foR3IQFbOJfvH1Fi6aYk4Z2Yw5PPtu74sjLwNADOyWmAXq61B47XNzWiqBKOzcDSi7wecwdvfmBfmZEORVmeBrJd7OXQ1p27XaN4XYMhCSnBOa2EHj9lqOgaEL19w8D29S5Ad3YuUE1DRrxxl6IIYZ0r%2BcNjANhxeb%2FAmyIcTzz4CCrPyNpIW0Nz6uhNUsyCPqyR5%2Bt9Orb0XD2YEZ95NQvAsI68vs3ngD%2FtOWy054hkxjTsZVRUEfFMZdN0B5s6zAsYyPUiBgPSTgdZlww04rlGQlkMNPIifXaE5pU0xTXQlEHEOSxOYM65Vcx%2Bn8WThaE1XX0MB0CB8hVxY4c6TPDvOJywTF6gjxWC8DRUX0i2F0Y6k0ZMlADS33WtmyhgniIl4qPi%2BZbL3ufvAoRhQSDPMdwOR49Q76net1O3qKFT12YDBmvZdnVuLO4qfQWYfGr0b%2Fscu93wz3TdqeN0%2B4DO2RPTsZgv0X63Z%2FY%2FC0wsPMG6dYcWa93QmYYaZ1u5NllVBlbfnrCeDPAIms2LSTjSe%2FzW7Y8Dz%2FVYt7uez8QTAHS73pUVBPaAB%2BauCC8AlolgFbDGXXmOGfF5b%2FaAaDCFVRPhFqO3R%2FLaijUs2hOvTIfNjAEeefI9eQRzO2AFDG2X9TQKYKzAjJjLVUG8UylC6j1OaHDBDswVm1EZ%2FW445r3Q7zqeTnrFQPkJHvhbA3lCh%2FafVpd%2FAeryXzL45Y8y%2FLtXMvzH72V4l%2BJzFXxEPSz6lHpa9EH1tPCzw5KvDss%2BOiz75rDkkxPzhj3Yxwd%2BFAhvDB2PYbN%2Bd%2BBN%2BZqMB73gGRWEohHf0QV1aYGFjzMFF%2BbpebpOAADFWUYIFZorPwAiRnxmXWOkQ96wvgk4yhxZXZFe63dhzdh%2FIt3ndCNT9%2BPc7wKKi1BRRXhoh14X2mUjaSutMB1n9LHuEjjFBfrKhze6vkeEM3sidYLYN1jNWBTVtdwr%2FSUYAUCzVtAF0jXAfsJFrmOgIPCCrrDJIsFS9qLt%2BtNIelFRJl1O%2BycPGBIl5Gr3y74GdG%2FB56gjA68vd6ZtWVYXuM5oPLEihurpaTj1cYvpoo%2FzANbKdRfpi4BNaco8srIZgcZk3UJFLsoFU7qIrhlN%2BTYN5NU0CG1GCPvMr7fv4QEm4wNMiTkYWI6t7z6BZQ6uobvYNGGDZg6IxdcbpgfWrRTxhjhm1mDK%2BFQkWB1OP8t%2B2hWRyflOx0KJI9vGff45oC8EINR5xOYS9A1Dc8kSYyMpYUrHG9lcXND3BvYED575ABXAUc7aNyMkzjgnSGJji1cJyauAUzZ4XGT37YgXBEQWo6OkDcaH2WlLtQyR3hB6lpE3no%2Bzk4%2BWuKIjMxjpJ0vsEAvxBR%2BSCasjHiEAwShMoQH0b6l%2F%2FNhlMZcnbR7iiRBjdjvBFIBlJRb75DVh5rA54I3YkJlAYkiwlwxmuzyf7fJ8Htu3gHrXQX2PgawbXVbS523oh2zc%2BuElo3MH%2FJMDk39zYPLicBRFmG4cMxDKA5DOmg0GDGMOeFMHnIIf8NYPpBEcCKM1EEZmwEdm4AqfFZbgQOgmALGmSiMh9CaA9FclytXmg2jzzrSFrrOlhtlD%2FcweiCHeVmE9CB0srAahy0N3pGMo0xnB8tKnsDBf%2B8L86gszpy%2FMk74wYH1pdPqXwocvhQ9fCh%2B%2BFD58KXz4UpoWfdhE9OGAFrt%2FsDkPpIAA0umygTSDBtDXrLNhCpl8YQmjYl%2FySST016WAWC4FxHIpIJZLCbFcSn1zKfWNMFKXAgq65KvmkvfqpdCrwrBfSn16KfTppdSnwpy5lJDapbDmLoUVdsmR2qWw9i%2BFhS5M1UsBqUmz91IYSQGp8bkiTBVT6DqTt8AUWiVMMmGOSVNM4rSFSSfNOQE58BnHp40tfFJQA6rwVvIZI00YmC8cH2sQoQuFecE7VZgVwqTgPS9MCT%2FgdZCYJ75inZGexxmxrmKUtsMOqviCQUGKPdRPv2KOgctFCx6Ygz%2BmYcS2O4IyRpAdvyWF6nUzXVavIvFIz44kMUAvshhn2LdsR5DSeFMuRg3H9pBTl5HVNd1BN7LZ4cnAHtkRowu9CAUOgymXYHvSByw%2FtB3Oedz4wF%2BxKsLGxzjtYSCy7%2BMpm0S2yYUuvb7DlmqPt8ruhZyr4lw%2FDzpmh2PWZILp24%2FTE44rgPXqRgFbHxMzmkz1aQVYoaDX4AkXvgHwivGUEytgvQa4pahcWxDqAVAoF08b9aPLyZXQ0a5lBnwS%2ByY7Hga%2BOuRVkmdeYA4YPRzAZPAmXfFYL34W8gMpMgfTYZZvMXIMajc2mfJAEOD5F1%2BOYd%2Fkh7F9hmTV%2Baw1IFm6oJiRPkdZjJwh6hYMplRdAcUU1N9HyZgOZIc34W0YWZNuXzjtj2yG%2FVBuG%2FoeO58UFsRUWjxTV5g2V1Yg4H9pw5aAVKUhmy8DLvaBDg70zwxwdupI159KqBXFMYh1zWA0RVldV0LYKG2NMxY%2FSYsQsljulR14Ln2AlI94O%2BywWyyx%2Fs%2BUHmeqzNDxxLuCKjscbRWcoqQrCieDuKLMidVFNaGuqaOy%2BMRWPfV0FsQUSElToL5MgbLqWSFUrPuHThgmcJ1zSOBMG0fBbwvKuS0o55bt1ozBEvgrBHUJ0bHZKnBZQPd2Jfj41vf4eXcw0al%2BM%2FImdr8rhh2NnwUs5Kp1Y%2FWnkZUuHWFCOIDn%2FuRYwXZ0YMlpDe2yXWHz67G9pcfoXr5Ee4zuHRChpa8xBWXkE8xpvhxsQcuO06e2j6ufQSfYbonhcfqeiKhl8MQMP3MiJ%2FwsnI916ZtM8UKqne%2F5fU42eL7PkD11lz7%2FxJ4VOxbN9FW92C7ospPQsUBXRBZTTet73V7gmYO%2Byel8r8v5QgRyIZXX5VszAAMLSCfr7j4zDtURa77AJRxcFPrTGP63hpAI9kOJO41lfGWgFwJz408yrHux8d%2FdC3RDMDs%2F32TQTd1iM7VrSrRkteepWUxy6qE9v5MXjqyh9xbGzc33a5GOs2i%2BklXV1h6lBgmf9o0dg9SCPqHhhqEOppSZfeihVf0tmtu7zyJjYocDS%2Bky8cJCI54I5aYNJdbTH%2FcxGu%2FOyu43O4LR7PJuA%2BQ4sEoRPjeH5jdLWeqo5j2CsQ6qQPuSrQ49eKCpTlL4clEwYUP2rRUafslOHsgio2WNaje%2ByrMJzI5j9q2VrbMNCmf88ena893NldUZ2kh%2B%2BXqxNVpXZjZP%2F1ZZheSkssq7Nv186E0DKCzIf9seGivfICypxNRxfso%2FRprKG0IGY2dnJ1WzT98ILI66AmtTfa6kPo7nfTbHsMXrVYrLiI0vKiu7O5V1AEIDV0sbGL%2BwubkJZLhkC4Wxd60BDDk%2BzwbojbvmZjWJz5v5Tlof9XZZB0PH%2BE06QA4PA29Sha%2BsFFTF82ma49Mzqo1juaNobGwYLy%2Fk7ldv4AB4vT9Q0df4298IuEklBsCJA0LBDE16vppf%2B%2FSREA%2FYrRXtg%2BvGy2xz0wZj4Rn4VwOVnfOlJjtV1sbha3EPWTZ64SkZobhbinuSnVSnY1pZwUjNK6pHTB%2FqZRm7RqViwK65uw3T9fniYZ9RNphm9xh9hQuKzPAKTT4KNFA5m8lYHtg7uOJvjyuQE8bXKRBBV1S2PxhYuENyca0uYBpIKhrXrkA8IZip1lsOM7MQVOsFI46bvuULEkmlYpIHwq4Rm8iuYzomJHQCHb1FMbL9hmtLc9noVK9EgSXEyPF6XPmFmZ1wfRWKOM%2BgAuNUpOhEcK7d4ph%2F6k1mFtOStTQwV4JAT7R2mEwjQeBRYGmNAgI%2BdC7yophKKDyWYYp8VNHQMqEA2hPoIGZzoHTPl7OWEi1lJAMF0aLH5FIdhdUZq8Oqra8m7AxlIl7UGVxeJlhfTX1h9XITBi6BvvJsbnPGai2ZoZFZfB6kLOjnIEFZqXr8phsjWDLE040EoROAvjMHNHMGVjB32raS%2BCLrWUN0Ced67kYPyLs0R865U9iHOQPbSfwwX1EqSbE%2BK1TnmRroGSyl2cCb0fMZdN%2FqN6WuLU5atZNWE%2BPaN1vdwm1jSWzJsgnIwvWuTTYfieDVJ66OTbR73Umz4zExtSB9HVsOUwWYAporG%2FFChTfuGCHB%2BPkmT5nEpe2xmh3zLa2pi7hrqLPMsCxsI4KoJgbrQ%2BKyoweADEvb3z6p7derjS6GE%2B7UD%2Bu1Fu%2BKrvLf0NXK7nbbzdPWfq2rQkA1W78XZzmsN7CAspr8etx8f9xFD7isBoipzdDuG4hacmxpRdDS790yfBoKMDQC4aCXP3LYd7qUciq8O5Venkpv8%2BP1qaAKhrYlQjYGdE2U0whlFj2Qra5E3SRJMZYysjYpr5NcPMaEc4JhtWQM17NHrOYwCzwk%2Bg3VMjUZDOBUHO%2FaClBylcimtM1ZIJyuRKigoW0Ggakvv9C6ZFNOkkpzsovnUm3hRhDAmemQacRfx%2F2RvZx2lDIzM93IOGyTiIKvn5YVIqVeuimi8EtQ4IXPIKq7HpsR8EM9G5iP4NbAPkTHm0Ra2W7K1YQGMCJKYBVuasUceeodqPRE%2BYi0gK0ILPJEe2T3Ay%2F0htGmasTmPmyvWgF1A%2BYVZI88YPjM20ToFKGfSXOA5i7KXyz6mpzgx%2ByB7U2QTtIKwjpSBthdB4ZyDBqie9eI6gWEI8wxPDS9ndfRDFW%2FbuYHlp138NELTJttKIElQQc2Px2HWjShUQf8EVd64MrlgpEennkw2lbJDAQgMHkMjlQ4B8IWCWw3WwwwF%2BxB4YMmU89ifBNbrCE%2F6xy5HjOEEM6xpyFHSz1Pl8tPXQ4D%2BvdUAJMWld4TCsgIdjGvVQZl7KGYeViQ2bQdgTpOwOX0QrXRyJKSOeK4XN5eLm3XZO2AbnTWQJ1zKxEVLO3KtkS7lJHDR43u3E1QzuMOUNor5%2BdrK7vfnJ%2BvrionM2vkKVZzETKX4uMR87CSFUVzgVLGKVG2lEJ%2FIfMKrucfFHnRyuYqdRMy7yF08buTeiDvXkC7r2fPVte4Yx9ySnKQ6Vy9HQkPI6sgJKcDnz5pXu%2FILR5Ay%2Bq7V3tTP%2B6%2BqR3XWvV9ogm77d%2BP9pqNuPrn53srz2bn5x9Xeb2Ft4pqLjl%2BLhwd2B1w%2B0DUR0doho1%2Bpy%2BnXoT71AC9AgxtK9jOv%2FUl4eZikXJZy9axXzbXdqFzuD8h%2BfN4hm46mc8bK9fkYvkZbWHawPesPjoOmDswx%2F2sB2STq%2BgF04etL%2FB8%2BA7mWH1QW3TvPVQVePIozowm5mer6Svj9SNvYOE5T0xorHwxYrO6GjmE%2F6qJr4GJxiO05O19oCmysmklKc%2BWsJrvBf1dFBh%2F8%2B3f1p5vbP288%2FqXj7N%2F7lZy5SE%2FvXwRUgmJiy5Am8BmddELHiLfKtKmm8PAm6zoJa4uel8tpORg5Kyybmxubua%2FQPJtddKER0IXlcWFwvWg2VFlxxJ6%2FavKg9dWaVmH9Va7E5d42KXQlifAP2arXPDd9cxZUEGWVenTat7CLE5fyrYhP3p6DQpru17UO9Cba5VVvsCPEnf2kUFm%2FsYro0%2Fzw4vHNiyvSdrFleeV1cWloyN2LF8uXjzI0Q6BE0SaFFDR2hTjC7EbqU4KAwNnn1ZhW88lDc26UJRCYWmBqW6BkLWDSBQlksgYIMkPHXllBWjuWVKRre3z893Xgk95hEtgMa8UzWLLaKXhCyhww%2FwwnxewLX1ry9hGTnibV%2Fr8%2FKnmdl6YeNUkbMTTJKwF8T8mMm1pj%2BTfKjrXz53fCW4G1RjC2tJRuIa3leaJRFal8%2BB9vfO2edrp1n47rTaWKZEEeFKR%2BCZOiiruiCbuIvqm4gP3Zt%2BsG%2Braxnm%2FKh9g5rspJoPilSqMm6m2dDP9Mm3sesb489IKGntTZ0C7OAYdwRkcEKXwzBs%2BS1aB%2Ft4cSepPYkIDcMQY%2BVoPCx56qHEC86F3y7MXtIxKQr0Q2Y06rtfYPtqgYxspUwHayFTTSg6CDW%2FIpn5aiWu5DlSG1Dvxw2clr8VOdubkWOHHPz5CKU9Kyhg61o0N1PfCQnRCPFdKTMYubo4QUyMtxEd9IyUMMawb1PRHjFqQ%2Fcv5%2BYzFw0iLAorUvZ1401BfHdIbqxzIQBpAx4G0TNtqN8sscY4p907fbKd0NDkJHKkQPufntHJdC32soSAMlbIorg9KJlGbZ%2BpE9gZFI9LaFKayJT9AZOvcGrECtjXYZDWoJbGYyB9i8t1YF2mAuzuufmSz2KsbRqIjYKjzVoMUbW1VCYxahIf5qNuX5juhGkW3sL%2FYbmSsGUqCKxQd4z%2B9bdtEcA8NQEY7%2BLOyamzHefMYVyyyD8vTGOIZWJit6zbwItW4StgBe5BWFdPjJRC7WYzuClEMhWsRpvrWDpu0C6ZWod9QhX9g4C1ceTBmn13vWnUgTBckS7IPqV%2BVfg7aXs4PHjFjLFsJNw1rc7S5jVPDNZ6Z0CsofMt%2FdK50SRxarAuwkhXsoN9h%2FN527lDmq96ykjAkshzDkJhzlidXLSaFwLrFZCe2jddKHdIi4UmhoFBCjnODAkLFaqU410PgmdVGNzFvjV5gmZ%2BpnwGJhWyCGwVERz5X3kF6KR1E7a8eHzdV2O%2BYeOEkyMrW9tZ6hr7mpAsG3GvVj%2BrHVeyn02NUG12%2B9PPznjekuF7zs2j%2BDSrvoLbfqLaSAnNkTkzk6AKTlY8zoAB4tBjcKpI4aDRQSRgoRWjA3bbxSY1guBnSxEcU%2B0krBR%2BwovGDOjAnBCmWPWT3AI2Ke1V0VG8Y3yfhLjaVJlRuDnDJ1xwV4WY625k93cpP4PnyzK3IbJZ0fqc4wHZ1%2FLAEKihcviVCyPsvy8dflItxCVNZhkocwrZ8ZYcoGcLessMI2K7bdSPVzVU92YPd77OFIcsy3PemXt4i%2Fneuy%2FHz7LW2cegCPm3Rst7LEoshsWlj8yo35Osw2Db0MFIT%2BjaspoMCH90iKvj5WSeeHB2YHIly3s9e7490l3%2F92tjJrZcylAaz5uRU1R19mbdq7baAKqAh6EZqGvM6czIxz28nHZvJuzHPy447iSqb0OjlAyvGFMTASjVb4fW4LxRd8sVAn99QTRKqfk0SuDXbMI%2Fn02KY%2FWZGReesi4YIwGWsrezuIMdzfv5ldWm9HKF%2FoJXkRiwMYaoqV7z2laU2%2BmFoG7GZU77DClDwR4kFS3zRA1uR0aMVtYVW2TLGzWJJHEpoc2JFZmUhJgwRD5b1mRxmoNz1%2Bh5siq3fswE%2F5HOVu0QE0U5HZFfy6flCSdioinQsUlnSakQMHLl03d%2FVWnuwTo8eUPtfHlR9hpeT5VSpMOoaFoSSQQ8MLR7NUtE0l%2B4U6AqU2j58XCty1%2BjgDFvwqqxe7dO9NjtCTCsy7emH4PPorV%2Bkepyff91agt4oq1H9uFNrnTQb1Yd11Pn5079mEkHLsfElE%2BlL%2BUQqKfkr9l9JyV%2FvMUW1PDTgS0%2Fb3GA8wsJegWH5ZfYL%2FK7%2BPzc6y6Olf%2FG4PhZuwiW3JHr6XzWwvOvvhYrpeC3WXrlL9%2BdPzTV6ikmZiw7LMALi%2BfkzIeQsdoSSgqfhv93USHBAR3xA37G3KNzW7jZGrxx8%2Be7r7ObM3BhWNw4xRtSXV19n0%2Bz9919np9n7%2F%2Fq6Kg0IfAdtUZOPG4kr23xWRlQ%2By5VVQAjSKG4mE1PXRixDhOuFGYXnZe%2FmVmDuSXZu5B4wk4L8awKrzXnr7FONTdRLE1iwXJYslZ97oIjgHGgRg53IxOYwQb9cRFaFdPtCtKeLdpYd9cXjbogkoJal%2FBNlb2YnyBK7QJnh%2FpM8eik2yGchOivDJ0uZ4xeKnhZYuSchtKpJlTScXsTPZ8Rr2ReWDDJZvsQKbOxlIVf52jOYJHQJgRPJGs5%2BrkawM%2FSmkRWiTfDrCzymPfv50ydl4%2Fbp07ZxdLs%2FDSNvkubsjM3ovRd8DpsorUUL8tcXwgeooLaFHlp%2BMo49Ouu2o1tM70N3w1ILPfcnA9M25MHxWakoXeoqOrX49BLroxecbGjEv7MtZ05RnP1cFCv99fm5sFllN1v2sDSw%2BaKxibsDJWNxObAR3RqJwqjSPeevLLHq8a985WfqV%2Fi8cItQf9zRAf7p0b61F5eQ%2FpeLGfmqWLSDlOwh4i6yjKCW7yR3d%2FNARtNxxgd4eRiZk1Dw8YDgh3l4iAteyr8D5n1AGNaFCtoVswdVMMx%2BgMfsyTVUWwmqJ5KwUWkhGT3bxfPsvomCVNscwU%2FoO%2BatMuK3Lg0MqkE%2FIR16DwPLMkbwL0JVyjjqgAFZHM%2FzDQdl%2Bzf2xP4TT30mtpsmoR8d9YvH6PBvpOx8XI%2FOxpW%2BSHwhux%2BU7KrQEJALnbQZsLfgf9%2FEY4VpFDmG8vJnoL8vaFloTWzEDZTAU9QQ6gI%2FNvq0cKCU0Atf4s8rI5xODOX4ziB7Y6VtMnUj2zHIWsAgq1PjBipyq%2FswSnXd0U8mdMEQ9m6NJUv13dFu3zAD9DePlxDRVtAHjBVfXhl7gIIB40ZmyxrhaHgTG08vLBt%2F0C2bj1guxP9jo391guZQMEhX%2BP%2BFYR2gRU6SjyKjDA10mdXGo2WYjMYQD%2FrJR6eBXjkNcuClfvGLjkf%2FqRZwfUNPycEt%2Fr6C4fTfQX2wJ7EjYQQNt%2B%2FvH%2BHvIf68O%2FW9a5XA1sU6y74Ng%2Bfcwg9WF3037iVNw5uGjT4lKdlBYhG5GgoNZgSqgTA3J3SMhHMUfxIw3rljI3SwbaGjaho6gdU3wkuCXcawywD%2FExxWA3Y5em1DxTO3D0NtY3yz5FrHHaSvvoFGh%2BhdVSWsyyuVsCe%2BSpBaNSa8OC9OEnvYwRkE%2Bx%2B8QReYpHSJ6OKoO0fdwQIYDWCNjQbQdaOxNw0M6AHTN0YToMHsECoNKReoBLjCjB4boxAPOQbG6Bb77Q%2F0AGv84cLbf8D2B837Ay1m1fg3rCtYajgHyOiU0E3LQqVQi9LvYl3IMbTRsfY9B73pxXcHkA9KVjdtinqX3Ex7ExuyQS0PEQVgomEnoLb9J9TH672lvJj6Fc9X4BoXAqmOFUCbsOLoXMQNLVXR%2BCbOB%2FOsltYcBtnyDWzZvuOhZjumgNChRM0xfVRjpDS8Qok2dkZpLOkHBbHmKlKJ3FU7BrduSDNxT73GvGzFj2v4Mj4sq7DaUktrfCdLhzR08dbOmTOy3Jv%2Bxc5WcYBjUjHVlPrLqvsbUEjCsVfTtZR2VKyLFnuhEhSOsg2Lcy3bsgI6tvKMk7gq9PizBYcORSU%2BqzyTS4QHWonFDNk8djLFTc7XMUMri%2BLH0jGoAl335liyTkp6ZKvCZ7EOnDOMIrNYSM3jDJCP4piJk5xtr9Hc%2F3VhPhZWWcq0THzm%2Bx0RJtXDjklsrl5s%2FPffnqzt7P6CA%2Fr65%2B31ldWn6IKru%2Fnl6zfPv%2F24cfGcWzQdwIB2ah%2FYUMGiOUniIm2FVrSVWGIZAyvsB7YimCLrJhIGeCvvP29tBRBXcrduXKD52%2BrumXF%2BHl08vxvmopnylE2f8L0djU9QRTQS3rrLXJlP3kWLcSGmiLuRLCFifIMzel1Re0BchnYPaJSJZnKc6cdceHeB6ctMAplfPTMuUoXS8%2FMQvh%2Frc0eeZ5DbyNi3CNKcrnWNODIUVF5VRYDjPSbf2M1hB3a7cCUffh4%2BhrHns7Va5bqyZUy77sTvYbKsN7DTFkmzKiPYY%2FMIcQn3lPfFSXmD0I%2Bwp0FOWDpoDUp3wyHd6p1TOudKhScVEug%2FjRfdxfOiLegpf6B6tGgFlrZTrLNe7wJdt%2FLq87xfddACaUZuDFT5a5V17AG91%2F9TtwtYzwfkF0BpXS1DK%2FyaTli02wfONAqNNNzdPBUaKXZPEsDP9k34VnwJgRefxmpVcYIJgJM59RN%2FUDpjlh%2BZO4zOXUZo6VFadqTwr3Ajwb9k173jHJZEwEqAkHHbvmgiCB7O8K9w7P4KfJDWG3W0kEP3rguxweKqz6svoDOtgknPM5k07238%2B985N8sJT%2FWHpoyK3vMAGaDUIRF8pyQj8MjzWX7HqYzasolEMmN8cYf9T3ZbiH%2Bp8%2BAcGbp%2Bfr7xHG1EnpJD5y%2BvvkoHCH%2FJXE9bSsrcizZIylS6PaqWKd%2FUgp2TNJGV4EF4EDP499pNS9QfhWLvKHRHYdFjiNynoSxzB%2FhDhe6q6CWl7pB5CberBTJ1lPTFOut9FKHjj3WDJtZW%2FzP5ywymPixRB%2BVz9DuCixdalNlB%2Be0EZa19dVBH09h2p5CAMiNk6nrTUeJ2iBS2EWiHCgNAu8n%2F0sBx6OsDD%2F4BSTCAf3YUy%2Brhxx4CHo73owH%2BR5E9%2BffDXx9%2FPCUlxLokCTMiVW0jibdrDF0l60dZbmSMvMiDn3DaM0aB6Y9R8B93DKlZQ%2BWMpIIk40GHfvRD%2FrUohV2F1yH9fqbfCf369BvS742BUbgcQ8XioiMFFypFYQsMhxzewOXaHkRjwwnH3jVq3wT2jTEJbycGNBA6%2Fob8Y6PTTkNF4MaLesV30AoPfjC37%2FmGH%2FRDYASpXPrFTkX1bMOfhqhfHvmpp2oXo0PiBUXgeJmiMBc4XxS0B1PXCFFhH39wgIBDt6AGcPHwDjgF6gqqc4gGD5A1ghrEdm1Kez09kgjMvoW%2FPnCq6AlqSFa%2FmIqHVN0QMorT6Hc4TqKP0Hn29FTDis80rm1XtdilgxyHznKgLSjyvqGDF9psrEv4d1V%2BrtEfwn9iPg3TurUMDNxr4GGMa1QpPrrpkth%2FH7uEQbpvoI8%2Bh8KD%2BsR%2F52lvnMBI6gCxBITrBbTzNWiLn2%2BL327nPtyWvtrOfBJjEsPPlDo0MdB4Y0UHymtymIG2rWjv8yAPOMTzqxwEj0r2PYcUrzRwmxz6M3BnbPc%2Fu1ZI35qaTgdDbbmjA%2FOWH0WpiFgGzU4KwaOSasXFSTtSqQidqhlm2LdtWuGQcsyehQ4NogH9oEHNdGKYdL5Fp1tmGjDKMG8mgBThqz3gZ9AZQo8OWeCnP0bcGifCOA19FaeCK7rArY%2F5A3QXab18gXsxzGWUpmAEnD%2Fi6y0dphk97wb%2F9%2BHSHwzpeCu%2B1t0rSqZHbfN08ujKjS%2BvkquFiX1z2h%2FfzlNx9n3o7%2Fhqx1e3nybiTLUbP77EgEPKcugmlxj8xpzQxXJRmgaIF27e3vpW8MaidMMkX%2F%2BZZPxiwxvZYaRqkqTjR5N9Fd9pX201ADlSLTxKWgaJfpKIr1HyJEqeqFeP6Yc65pg%2BdmyNsn2ZuY0%2Ff0y9cuLZYei5mWT8uGXCLIYNPpuOH3X66pcK6Kiu6qiqv7fsHpqizZPqHTtQZ6f7FL3lAG%2FHBBzbe2bQBtYZnSPhhMOfgWskcw6vUxijMbDatHHDFj3AH9q7nXCIW3dPHWClKTrI8HHT6avAAuRt5A%2BiKgzo9XYfvQXjXo9nfOiIJPZGEoVmhO6Y0tsogHt08hAEE%2FUb0uWqT5cb9RtmjoIx%2BFioLteYCLww9GFLhgRgLPqF5oRBHxsXBg5agIdXLdgVjpJEu2r0pxM8XO9jAtYuXgM0PLuC6hgYdzyhT9Jk0mKEkD9ISiBCUAnY1TBBOzAmaF8cxGVY2Ob4ihtfnLyd4NuAa27x6a03vAYMawx61cHgAIrABQ936hQQrkAwAlKCBFXot6mFpFEPTwGTNGBc6H7X6kdxeAAFSwojqzAFCWzof%2F0%2Bzv4Whmj%2BqAEojg4mjwHH5SEdoFIUCJ7RruCcBFb%2FBJ3VxNU5Af6CSCZ1hxoalCIe7y1x4WEGEqdPw7Ryb83wEJqL8QoGvXqoKlq9Mm1H0YgAa1Kfxwl1hjroxUDqGViZg3eoKZUA9oleTW5wrsdp7Exogk9OMGPYoRX1x1XHOdIBMI%2BykKZrHemATBbYUWD%2BxnfQxj08%2BM%2FVKgcMM9BDdBaQudeGhIHjccnC6y6GQ6gfaOBk4iSwE1I98dKeq4dVstSb3x96wbUZkJfOOfAYcVJ616ZIdfP7d%2Bj7MrmNeze5bXnXaUvbavan6UM7CKMsAGucvT%2FOtBPvoewrGx1spLAoX92WhVH3MmurBXRqz%2BzjZ9vC2mmztdPOLY920cxvp3O9nZvNHaQLVJBYQ2kdHNp0tuUAdwG%2FAXUHagZ0vLY%2FT7VqmO54%2F7ACD0%2FCUD9kAEwI%2FIeOHw4j%2BrETXSZzFKCmjFJ6Aer%2BGsUnzfZ7291PmDN1q1aJFw2B7lWXSUSJkRVfkvvkEt87VnxJ7pNLfO9a8QXvA%2FMafhBDhvFmrKh1%2Bp2k1%2Fx%2BPYgGyQV6NCJND7h4g%2BiKroRS4TqN%2BnC9ijVwIIVZ1JUeTSeTW%2FXbC9R1gB52Rgbtvvhzhb%2Fwo1QrsnQjMBJEa1nu1Qh6GwPNWJdt0qqKr5NonsrXPwU3p1EehCJxCxWWgmGffvq%2Bc0MJdUUEZmGzoQLRGNViLNwpjdoUHZdkmQsGSYh0%2FiAm1HMPkMbXAWIJGUo%2FhbfzNWiLn2%2BL327nPtyWvpplLqybfhTC7kvaPfTTG5GSl%2BLcDeTBhiSRgL6DFCJ3SqEeH83o4dBBzhbXCS0T%2BJnQDyWB7YfpruY6%2FAJVQb9mfImBeKH%2FmAsWre0OPaUhaKLDIkOthVjlzMEU5US%2BGVeDWgpDD6mXIVEJSs7Qv4oTQCQNgW8P1S9kDREdDmHg1YwYRuhFbRh5%2BAaSKUNaA%2FtZ1TaaQJQCmpxEPzDVRgOz6vvIE0MqnomQOkDdozRxpNKwBdSJCVJpwlrzZBinmwFt2%2BqGHM%2FNkwn4nRnUsYfgrh7uU70GZgPpJbieIMqFK1JjyXXvNv0yEWme%2BjSllegguVNSA7pD%2BVfmS20kuuB66g%2FiVqpU1R0kn3xnqpq%2Fx%2FDvaeK7V2lSfTgRXUBiYANRCtch%2Frypnrbb4zhLLIZJU98fYJps7eMrvYPb1ByrJJD3MLzxrRvgrxf3qhX5Juq%2BwRYS72f5lxNopoAWKtTBHKUzs%2B8O5mlVo04QZyBkNnImKNEaqMkCiaNOfJnE1%2BQ%2BBvhKAObDfkYJnFRjM8SAkslBirpMUC0OGHD8gULVZZRcr%2BPEJLkmgCRnmnWeN82sAL4xRtIbf4b0CwDEj1QVaBssDeLhUTQDCbtvhcn1VZIYpgkXUy69AtS60uoNYLa8HMzTeZwOYIS%2BShLfYWLsv1SXV%2BoSA79XF1YA8GKDl0niVZKglwLAXFdpAvAKJkOkpdAVBqpi2lTdKx9reBVeAyCkYVQXaFoIZAL8AnJyTXcCDCfc0OWzdYv%2FoXwUYhoOdBj8f4k%2FLvz4NdgIe0nCThJXKeiKYCNIJtdxmrhKUirR7o%2BB7aPU1aAP4xUnwzRBIHw4Da%2FiZBhfCTJwfPxBBhUYOLXhItN1bQMacKC%2BLjDAvat54pVKTRJQconhwEM7LqkEO%2B4cUTqun7xCiUgl4vuIZLNKohsLKjFJS8jxcJrT7yRKrvmRjjWM4wuKeEe3KqoD%2FqJISV1gBCK0ZoGWTuEfJqB645of2uj4EJ0c0c8V4i1MUAVimdIEWU8UX6Hff5RYwTXyFOaamDcYIYSUS%2Fuknw7rA69X9AOrZqJER5Y9T72YJ18myfTx%2FCk%2BhF0airCA2IR6YBjh3q264nHHBGVBqAhP38RZS5MQf6wbugCBOvFIOUldMEbBFSA5xOBpqnbjX4%2Bi%2Bf37EcpvE9E4plz1a12pBHWOi7sjeezBn5fwO9mPRRdKzd6h%2FzBy9JsfNwBdBur3lbpMyKssusyJSFWfPgb7zhhF7NGtb%2FgoEcYA70A8ItWOSdJyCNHLD4qg%2FVSK5pN8DC8oGvOzIi8%2FI%2FLy5yIvPyPkotnpz6VKfkaO5M%2BlQ6iGjn2OPxMl%2B68OBlUgI66Tmz0YpCTp3STJt4hdM%2BnD7M1JcgNczvztdp9cHaW3JFiNb5AP7c1L77ST1IffVQq6nBJJbZKqEH%2FeMG9RpEP3sSiJ0mRQlnmYFTPjfdqIeQvm1c%2B8B70K%2F5LkhyShqoaMEfBHg7jH5k0mEoMSmYYDk1e9scIT1K9Tt0mLVPIQ1cLnt0Bw4WRJIZ8HStQd32dzvwnsNF%2FDGiEVl9ylEvIMQMnGswBSks5C5nLyGHhsXWdaCoAOHgQnN%2B%2FR%2FdLv1Rs7zf8Bb9rjef4PDZKHJ3ct5QErvuugPBb66cp0srDcK7%2FrJf6ef5wr8R965n9kMk8prh%2Bl49mGU00NnufckmdoTFhUHUgo4hlTdBoGV8K4KhEDAs%2BLU3i%2BgQkFuURBPLl9Q3JM4SQ8Y0JRoTpYG06SK%2FnBBFwIaB2teBSKhsQQf6Ay0LtXMQbyr1IqnJKAHhTxndy9syiYqX%2FVUEFKIUFT%2FopoXHWx4%2BskuSaAMLmmgEmaINA094mORSWfuojUjN9grkSAd%2BIrtCpN5bFoCp4zvzEIBsz47SSAhUe%2Fkyi51t044yXgX%2FhPCcs38A5vVBr3x8uADkkuo9uAfiz1C4%2BnJp76WWliYFxiHsqicvyJ1jef6QcG7MbA40I8nUcLHYu0IezhbSa5jxwZetwaoClLP7QCOszHRN%2BPE0EfEngWGqCHALJ5UedLgUUvXxkBcp4BsZ7069PFVb%2FqxsdT1T1gZz3A4La6iUy6piZE7iDeRTA1tmOxPt6oM1rVgcjOERR3GLgo4yZMwMaCF9SlpdLS7QbS9Mlfj3rxR389gpWhEvETN7701NVXl6m6XFHeZMvC5H5SUmM%2FLqmxb6uLG1966uqry1Rd4pK80TEaKkHyqENPjt656kLHz5RWBWQPYgI87YefZH%2BEZLo%2FQpp6pv3ZpjxUqvpasm9i0kabS%2FgGHi6ShhiZZ6FYDn%2BGRhAAUxeSu1oUDRrxicY%2BnYEP6DdmUDFJ9IiaFPT7XXwXKAXHDJmOt3FiDDw%2BXmDDC2Ef7I9VJF7iClEogGCSsIYkNgytSxN%2FJnjgPiAAXkIERkQ24vU6QDNETKo6jVGaEI7tYZTal41QqIFoJ7E1gwWjjh9DIHf66lddFGjcjy%2FqSuWqqwJM1CVQv3Dj76Gp4h9vAuTv0Uv2%2Flhd8kCFB0L%2FgEykpj3ExHBnm6PW1RGlideAyy1maxw0DIzd7NLNKfwcTyfH%2F6hBoomEW%2BjjKm%2BPLWCU6RxIA7SrWYgSDIR%2BW42an36%2F41F9MBV00mQ7Vlf1UTQL37r0FbuSJIAPnifzSHIOByaM%2FEayB16KPhMY4k8y7UOZqUUx7SGJHR4NQvxF%2BRD8DlG7Qp3YWUrfArBdiJwlheJGDRG4pGDiMvEK%2FThPnJjk0pIkqnQdxhfinzAZ2BMnSQQqgYaGScJJU35cFKYhY9yp017Yj68R2v1BAjkTOpKDH8yodvTwaoD%2FX%2BLPK%2Fwh1jFEvjFUTGN4G1KXoIZnxu7RmvgkkCH5Mf5AU%2FCCAlW8ooyYNN%2BM6PPwFZq24hUvXh8RAbTdvMV3PAt75E9IfIYujDxFVaC6Sn%2F8GWO1KVJCdYTqBfJMiT8wJHgZouGl56pfWJ9wvaQBSBIxbGrFF7z3saPo9yVcAGEbUGUakfh6BQnFQRIdASt%2B37s6aseJD5RA6bW6YC6UlMdX2KowgdNBXQiuKnvVn%2BB%2FyNC%2Fwf%2BQgLGB%2F2P8CfAHiQQSjV%2FZ1jX93Nz%2BaVzRAekV9ju0%2FMpzptD3V%2FQNXGbGVdwn1ybMNfzpw6%2FzWSEf5QL8WlGk17gYA%2BNGaVzcOCFQQLRK9%2FEAOAsgW8zMvZJFAuAI6DlFQMKNWv9xAtY9pNR6TxJHaQqf%2BqgcBIwXFHRrYMtuVUVuCfYnrfg%2FcZ%2F7U8H%2FJDgqPEx8m06F8BTEGP8QHyePfyDJ7%2FgH6gZ1SV1jwD01N7nOHzgDJ%2BGc6Hwvw7xlKd79g8P5d2PimDiEienP74mTIpI5zDMWpISTsADAuRHZDngxw%2BQg5a56PiHNdcA%2FyLw1VBbQE1zxpKIV3uK5B5YU44oi2%2FKDvW71sFNrdRvVdqfbar43ENJodDvVvf%2FD3tuwR20ka6B%2FZeJkD3bAECCbk2WTZQ0Y4rNgs9hssgeTWc2MxqN4Rprowx%2FBnN9%2Bq6pbUqurqiUD2eecey9PYlv9vmr190d1ddXz3UN8erRz9PgH6zll72DfhO0%2BRX9Mxm2NfevR84NH%2BHv3H6jjvH%2BABjYet6883dvfO%2Fxh%2FPfXu6%2F%2Bic8%2F7D37Yfzy1e7jPbLxCiGUhL39w91X8OsJhRz82FLGTw5eQ5p4%2BN7%2B0f17YvA3X%2FNgo8tKSXL87BzCn%2BPD3SMK3995sftk%2FPL5zuPdHw6eP7HslweHe5ibneccerX7cucVvIO52zPFRhkdH%2B79N6X4cO8FfgjVwNGWEYb88%2FBo94VTzs5fr3b2D3ceN0X3en%2FvMTqShj%2F%2Fsbf74%2BFoPD48erK3b34fvD4yf%2By%2BegV%2FkJvcJ3uvgveTd446yui%2BM7uNv6Ly%2B18FM94hu7PhW0v1lZ%2FPpUuhX2iXQt85yrGkPx4bNXLYCFzd%2FQqGbXgaJXPz0z4YW7sQaNVYk%2FkqmsLPrLiHG8hkDoP9hdVmJaVVug4H84T5PYdJN5%2BSQQr4TS6qh1oR0m7ykp000RtA4FbcoFvCzq0J66fmGlfA5GKu4xH0yz%2FuRphk184rKOnKc5MFDfSvOH%2BqS2Sf7GqY19sGXHdsDJ%2B9fnxENm%2BUK9ZoStkIy7nR%2BtpoQKEZa90wb6pXwq9xSQMXGOoFDc2L3ye%2BItpYXjjcHTf2FzqZ8LLQZ44hYJBBNcnQe7WZm2XgEYevOQfdgQR6qNA%2F79zB9VLBAbdo7GJB6rdt%2Bdw2%2F7FbKnwM6b1Scp1LU17PYrjTg7pQ189G%2B8CtDz59vU8z8fjJ7tPQjCdc57lO%2Bx%2FqtRJSAQsp60GjcS3WmQtuYRu6NbJ%2BFgrPx5j1VmZ8k3UcMny6S1lNSoSpiIeF%2B0OnTb%2Btb6G73dy7fM4mzs7g0XVJiMXQmAO9jdcxNt367iXzxjz0Fd64e9%2F0GrvoXBFf%2B3Oo%2FZBrZFgbQ%2Ftjzdn4Q0Ml%2Bpy8by2TKTTqS7pob87ozb2d%2BrITrq4KrT%2FUtzjkVSDO1JPNjdHN5lLU7fqF2yQKAWxj6zZuZjY3rja2gLixRS8F17X2PqSQt76FiLIAERcevWZTPqhnNw1PrplO90vHzBN8z2CDBYjlh74lYDrbuMUbjzZl9ZhDUGcjfSnhr12bNlBf%2BPL7sNtqB1yWjlaT5KTKqqJpvN02i7o5o6hN%2BSib%2ByuOIY15QLH%2FLmsct6WMZVNTYoMZfwqjU2p1O7sJbxXV3Odifd0rnkYu0RBtSGe2vo4xjn7PHdddvQ9vmW41%2Bddmm3HKA4xP%2BAEtwY1cm8Ha5uHOFUFTKq8PA7ZUig%2BwpQINsb5Kiz4G8Y1t541rjDOt3eDN4%2BN3b%2F7w%2Bdsr%2FHF8%2FP5q9N32aOs6fk8GtIvfafM3tCEEDKQGV2aq2RVnx9jcwN00epRXZkK8olPyK3txtIVgj3iF11WvbNxX89Q33M5syjar1M0NuunaJAttT%2Fg2FVz2PEXO94zTK%2F5oL6zOJSdaZjT7s2z53o50gmPSwFZrkLmTYZYf%2BrYxI2nI90kfYFRkSro9o1VcLrLZCDopd2SLxWMW6EXNS0k7An3GNxe0rbMpwemhakeP0jR01XIbV4oqSTKEMDjq4svvNwQB0UdI6sLjvrQfvbbJhKr4FDYTUMtCspkwNZvDj7GZYKMeZjMByR9hqvgZCsfHmnGFL6xvQDRXt7P9329vXv1BFIhxx2d36KqlZLBk4%2BiH3X1mGH%2F3%2BeEuD9x%2FsveUhfIg8zU8rfa%2F9ezg6IBF8IQH%2FfjD3nP%2B%2FR9%2FkJLEwh7vPH8uJAktuLNOvXH4%2BpEUqRBsXfUZ%2B%2FF%2Bxnb%2FzmLZ5xl4fsSCnvEgIefPeNCOkPODVyzoJx6GZYFWX%2B%2BgRiDsFmDAO4G1tPfiHwKeEdpVsO9jYedohzemnUeHPOzxgRB4uMffloi7P71kYU%2F3fuJhrznv1cFroeie8w9LiTn8%2ByteYVKed3%2FaOzw6HLL6NR3%2F%2Be4RHl0%2BwsShl75XKCYn74IOtRlmfDY2edy5G8uIeIf4FmqSrSHq2JOZJfNRy7ptzs2%2F%2F%2F770Vdb%2FrRqFtcdyUxnbjEJR73IRzGsU%2BIX5M%2F0%2B5Eb%2B7oq3%2Fhf2x7dfftnP0l%2BNH%2F5frTx1cboP%2F6DfeA7QP60ce3USh%2FBfG%2BMrx9XXbS3k5O0jmzT3Ze896vXLtFNrb65uf324eYmiZlnN7euNumXff5y6%2BEWt3lKPgN2no9f7B0%2BHjuTMkX37MVbIwyZ3WwifcjjODo4eH5o3zmqX%2BA0GPqgixzhlsFwDwZxzUGzfeO72zf%2Fwtk7P%2B3W33%2Bz8%2Bjx63%2F8%2BNM%2F%2F5uSzrm0LtyFRt688fSHvf%2F628u%2FvzpU3jBT52NzBNwZl8zITfpObnDXxCUtmY2MoLte79L%2BjCTfSXG%2FEbMB9tB6NnPo8hYXF50seO22dlJiHDBrgu3AMhY%2B8mz0DD3rOrJRID776tbo2R9v36Wf926Nju9%2Ffe%2F43ldfHd%2F7%2BhshjhejF0kxdSN4ARG8%2BOMfb38Dv%2B7%2B6U%2FhGN7VLsI6xlr5CHlL7RZbwjpaODOyy2otFmEpvpGlD%2BitjQfqIOy%2FxZOChupGRxlbH10n63Vvvl5W67c%2BVda6Ad2TqFsDWqpkiL2vhR6MDqsJGutADYq9Jw9GB3e%2FguZ1cPfuV5%2BqXXXGwOuVcOfV37MFdYrBCL0OviuyVfyX36EU6tH9g8uijuD3LJHHeI%2FbmFMa2bUtqrw8GH35nzByfTl83EFXXvWkh799e%2F4f0tI1n%2BiQ7v3Rc6pDMlT9YLQPid2HQXb%2F7lf3gi26Tu3P%2B80Mfe1k1cZz%2FWTVcW8%2F%2FPzDI1%2Fjjfy8vBTy%2FHJxWZCyYXQR%2B2erge4%2FvPHaxcatdul1vbbb%2BYAQ2f%2BWEVTW9kDDy8l8HqPeBekPF7TTa6wn%2Fw4F3lmxfZpiV6P8dxR%2B%2B%2BDuVkInDtskbNrcOzwYffOnb%2B9vqacP6dQ7fIDqItsBCd4NwYWqvW66%2BXj%2FcSNL2cIqtB%2FBU206xKZhZUJGCsuFUfLGcwmyTUhXhulpGZdkM7uIo9UyLorl5W3v8z8A9yzOUbaFt7byeI7%2BU5dLL8r2CQ9ASOQa5d3Ihh2kHB08OXiAHgXK0RkAlPpyEZPVRRy3s%2Bx0exIv8F5IuaDDlhSdABhbnR3JrjX5uVOVUDBlPJX0jNrjmK6ATTlmabcS0pY9IMyctioLHyPMXMT5aZJK4kyDfKRAs4l%2BmEjT0LlQM9QVzDtqB5gbs1xeL3DU%2BWq7XY%2Bi6emJuUi1M0nQj%2BPoEd6XxDuo%2B2hH9HAKTSJPsuaPog06qEq62dMEHMXQv1CZfveCbmEVo2fQQNPRDkRP3qgeVeXoR%2FjjU%2BgRykvbrtrIl5Lt8g%2FWoh3uauGvb34mlysF81Mw1KEPJf9KU9AlEH%2Bcfyno6v7uqrcbb36%2B%2BiQeGIJFrC2d2mR8p5XPX3pKnWQBP6AWTuAsLdz6lFJqdIM2dI9MG8wnk5Q8Js1wOdc9BTLjxScYOpfFUho3IfgjB00T8bARE7jXGy6fH3onFqoCSnPCwz2iwxqiudfngxvWEHdtQxsmTePAMjOXB%2Bbkka9OozF7XMCkPF3QfI4XFSKy0NtcLJqgKZz0ZDSpcJk5mk7PrffFZNb%2BAXVwiaRptjBL0Sle6ErHq%2BiXLK8FyOcQ%2B7pcjNE7rfnrhK485fYJFyz2TyhhslI6G8VRvrwcz%2FPoBPM7RpuYxuHHclysoyl%2BdL5E%2B1u5MZkH4bC%2BSVuwDc9msyYYWwCayjG2gOAnWnxIUrtAxr%2FQ0DatzfDaHE5Eo6WxC4EPY%2Bx265ENx5%2FjaPZLBOUxvTSWusdF8ls8vnAfOshvxpQ3NiNYvq3R3soYzZ2SPSI0mVKt1tAbYBVWrGNjXzGbz9GsUpYn0LXHtEKDMpuTGW9rWwR%2BYVWuk4t4OcbaAUrtiXSdwV9jUqKlP9GedzxFaznmNyYFzQwVo%2Fzu3fn4BH9M7n4FjeXuN%2Fj%2FuEjpuvXdbygowR8V%2FLx%2Fb44%2F6C98%2Fhb%2Bq7nf4jMGxtEsQ%2FuKOZk3nZaj%2FARjPWmjPaF4TyjiExPzCUV9QnGfmMhPvsX%2Fm3e%2BpSACIKnj6F7zhwmL6CP4q3kFH%2Bb2d82xZPM5%2FF0%2FW%2BBb89OJ41sLICE7t%2B3cXPke4e1wvOa9yjK8jV3O7n79Ff76%2Bj7%2BgqJAO%2BbGtadtR%2FVj0f7ltKfaI2fdyZpmcpZByyfD5XgXEMvXm278%2FRNuENFCOazmk%2Bm4QnMWxnr%2FWTy9Rz%2Fv08%2BvR7MVmrCinxf17%2Fv2t0HN032L3r%2Bonw1qf1r0a4t%2BjWhWkVFW%2BuSMPjmjT86XGZrkQjtd8d0nzR87ZAbDPN170vzRDX5x6PzZhV6RbSx6uF%2B%2F%2FsiMZebhcQX7jfZP%2B3adik4i6jR0ktCmwEuA%2B%2F368%2B7X249738YByLSlHJPQ%2FGlh%2B3zvifOnD2FynAcfNomyj%2FfbiOqk2UeTOufBxkN1l1DdJVR31FpsY7FtxTYVaim2odh2YpsJtRLbSGwbsU2kzbuX9e7j4SLC%2B79NYPf53pORVzrdR58NJcYKrFtenSf%2F9e7z%2FebjtkTdAmXl6Qd048JgG1K3yqrTLKu6XVadhlm1LbPymmblts2qbpyV2zqrtnlWXvukcaNqK6nyaqlqa6DyqqByi7ti5V11C7zSSrNyi7Ni5VlR%2B6yofVbUPimAns0jrFnYvalG10FacT3GJUwkLbhOluMX0cUODal0zRlSaZZMxUjCKAd0E92gj5fJGl1V41awcMJewpq0DTBGGmZCVEGKD%2B5hTb4284mGlQVsk5%2FaBdcBOQrxqXj1G3bt7RstDuw4nErG8DAljQj1fNe%2BhE9ZSlYvOvCPWX76LM%2BqtbmNLmNOzTzJo%2FNu6utSCWRQpPiglMUGQ10KloUOaiwv%2BZCWew%2FvvvwszlZxmV8GciRSfFDKUYOJOapR08J64H%2FUS54uqLWHBs%2FKaNnzAa3YavwfZtXFcProoRUvOUFuOp7jHrN%2BeIlLcy8jL41KFuQjXh6Y5b0BjmAvZC3BBKpGYwm4VEEuLNaRQ1BK0WFoleFSAvXh0LQqQcruWbQ0Th57ykUhyhStdByGWkAtJ5CzlhQqppYVKoJncWocxLdB1LYEMn3qcYYShm6Y8HkKd4O0lm%2FDn%2BJ63QvrDi7Y2GNp%2BgsQfAjFEN0wqa4MopS%2FC0oJ1IrEoFpNdFAv2iQ%2BNxIvfE5SuZejyNsYZ7QPNFq8gP35El6Ykf1qB%2FDCXqDgBO2Z2efDGBV%2FI3JVYaJ0Fxb1My0q6geTA3qq33mC0hdjCQeedi9jeuHv7sMr9%2BHQfTjCh6fZif1Fzc7%2BjXNQ%2B0wP9osMIYtp9d%2BYHPMAI4PzDjw9NYKc%2BlEsvBbxA93iowBefs%2BW2YQ89Vg5zd4TDN1LTYnWT130eXQZ08ttcpqnQ7LQRo8oBmKveoHG0Dm0H4wEW9QLa0mcBe2hn5wi1pGjxtMUp8gYFNcvMcnNhK%2F6oPR9hTPsa11WtSwT6DrUSL5iIXdZyD0Wcp%2BFfM1C%2FshCvmEh%2F4kh%2B8aJRPNXW0Dm2diEw8dq5SwP4KlZY1LAwQTz3PYv5%2FmV93zoPVNH6ywn9lIKQrFe80fTq%2BipXtc23lvw7zxZ0dGtaYHOo41PaAWByh9S58GqNsVlEmP%2BfhEVp90nkzLz7OaF91%2BzoLBlgA80ae6laZx3QmBiqEMuHD7NCbvpmRMfBbVF0QlwykEK7%2BSzQ%2Bgg7ZBs5zoqi3o%2BacaEpiUZnG1eEioSFAvvQo0ekszRRo0B9Z%2FprKlyfDC8Nsg4MszMjwUpCaDoPiL%2FeGT%2FsXFnh3%2FiJL4zm9V%2FpfVfOHMenkfr5pHm%2Be7Tk3ia04FGN3gv7QbvXphjAfv4An0qmr8wSfTXQR3zTxm6w8vzBL41SawxOPhjjo6Sdi%2FQk2T7bFwfNY%2BvYlOZ5C9tuoTG5ngXQ29io9nT2QX%2BwJOMkzxGV0yob7NKUjw%2BmNXT7ozcRVbR0voiWd8boSm2ufE4NJon6ez54SP6%2FQJ%2F45LqEaxAjrK9tHQfXydp4zhkFZlTDfiJsc7JkSBJiOfGm6c9VjmCsnL%2F3qWE4Cn7%2BkW8yvLLR7Z4SL6z01Sg%2B5h2HpuqdMKaOnHCsGLcRzxnaR8POl%2FEeqJHcvxBf1EzNn%2BV6CUuWVVLqLEYmj%2BZdDBF8tTIi8kCHQrCIb7H9XlUJ9QuuTphZgDBcx6qaPubjGaSZwT4CTU5Ws6whJfGhjKeT1GZ1n%2BYArXm%2B%2B%2FZ26dYRjhr4InOaNUp585TZ9XbhayUqxNGq9Nu0KE5Z0C3miv09JqhffzZfJRmSRHfNb%2FumV%2F3za%2BvR8YFEpYvejKF%2F00eMhwD6zUSHiU9ISn9vYv79%2Bjxh2g5v3dx9xt6OMRIuk9fX3xLD6870OsGys5H6J8E2ukoj%2BdkmBZ%2BUyOurefCz13U0ShI1ImyX%2FvH82zW%2FI3TR%2BehBe89af5wA5037rVvoG8sa9F2YQ9qihJN2RqrqfCXYx0UVu3kq8350zap0gzk9W9IdPMXfqZ5oER0nhz43pP2r06w%2B9Y9%2F637T9q%2FOsHuW%2Ff9t0hg6vztQM%2BicgGNrvPUzaYbVjSBUK%2Fu391XnPjhzy7WfXKTjX%2B78dbP%2FA0nfvvIOd0QcvpmDVB2gtqYaPhpvbMaO61VNJs9hn5nxN%2FuCFS5o1OVer3HBDT9xzy2Pch5xo5iHl97cNOPqqKaPMrQR0PPQV9rLBNV5GDOWRZx55WupkdjpiBgNUbQDPl0Bgd6DRx8hA7U55pyzhe%2Bcs7HKLYsi%2BUn0GpZiUotq4%2FVaVkNV2lZCRotzBN8pzFsfA7FmUNh%2BzeQNj5fRbBa8gNFapR6BzIbRsfXC0PlFi8M1Vb8IEwvmoDwtfA3ar0YL9hqvbBQdL7oByZnfoifQ1S08YNY9uK0WvlBF4mfBGYWQrFitnFCwgpoNV544llc2oCq90LS%2BNwPyfx0sGTk8RrWlSwQtYq8QDS4nUz9QFI58gJLppC5QR7avTCeSVJj8sOS0o%2F%2FAnLRBnCrebVZHN7CYSfkt9dllK%2FGJ7FfBCa84OGk7TGzqvpTP7VRmqzIvfAYF9NpjEpMJAruJ%2FLqczi0%2BFfhGSrjZJcqDg2yKFnOG1jIvYvVKRzCGZMalso0qktSTosEo%2FAbRLRGO3AkR6OvrK2gIECzRuTH6Ih0bLTPB7AHE5PCcv3eZ9zO88CCDX4QCAtSMfAeC82jyzFs2OXwlFU5hZvLGBpE64AgCO1Fe3utfXF9OZZ6r4XF5utA6hfFodtAtB2XMzJPlrBsCkDq93ADL7dhC%2BeF8iLsbyM2EhpM6F91eOBbCYkyFAgPWGJp%2FjAEWFPJb5odsAitorUWrhbXOpPfQVNgIgD73IoPmhZCfUoFol19CFOTKAzhJnwBm3OlvVpMjzNTKoacPWjIr2y54kLSx9Cl6xj2K%2BMyOmEtnUDyf6vD1MJmAUxqfQ0ajJZbXbbgIipwZMK3VVyNOSen3SJezZJsPKkKm%2Bd4ldAVKZ0mDjoNjHkIxtHMy2x9Z3Ezchl1amgSFVsadnjrJVQ11DNvBC7LqJUGGZfpdEyyP5E1iycVK3eL0CIh9ImGEv5GDDmelqECtgWLBR3EB0Qhr106lDn6xZz7C2SPk8fh75xEfKLuEqDB9OUHOYMiQqcpaLUBRtfC3whx9lpYZHPWGevJnMKmb075rZfS%2F53%2Bz4S%2F0p9hbSXYIRXXKumzeJlNE%2F%2Fyc03Sm6FtfvQ11MpnizXDggbYP1gQq2eo6LSfKcqd%2B2nowLyfpRYRsgAM9hPk4PUYFUTPeuj2uifNDS2YZmn6MSAOW0ShGUWuspakZ4cosNxHR8B8te9wkNADj8lkV1yEUqOXHcFFf2KLMltLmwWHUqVqaiGr5MBWR6FZsitqFm6aEJYpmo4Ks7I8qe9Mh4nBbt6wsGwGR1kE9pGcGRwUGmaQ1ddxqNTVejOoPmJYPDxj04iSpINogU818JhvL32GsJz1KUr508gXSAb0o2qlF5iFe9%2FvKYthc0cxYGA0me2DccBqO2oPc0BkA9LecjO%2BjxMoYy79FGlkrLCHqM%2FwLQeP9k%2FDfdWQ7eAkiXAclrz3dQnhYhhQBIOy35f1gS2v4Q4pJkySnVm1Idxw%2BnpFaIohsO8jWEBq1zRwTxIaOLDZcUidltRHDk%2BCHjEwHxaXUH8rZEVnUbLUW2bDS1KovgjqnX17EhXxN19DZtFYhYzFqYRlvjWDjQn6taWl1bqCDVy0JqMOHsesUSMns%2BIRDqfxviGQsrXQSi0vmFOBIkwyXZpcLoaCtmGFJVmDMlGng4zRADVd840v7KI%2BQMa7oWoq8ul9X%2BrbQMLmuIMNT4ZG10sQSzhUQKJktolU2CxZbJ6w0cMiJ0bYpX%2BSCMvkJEVNMp0iiBFd1AjydYKws7CosHR2ENPKA7ha1GaHAKNv4nu6qhmr2R9lYB3H%2FvRQI9mpkg28w60hetmhh2sdCWWecDXzhZqDoq%2B2kIBjdaDGi0V0V0HgncyXGVmsjLU2She0PQi9usBYmk7Zzp8Q1FNjx9ew18ujMR4w%2BaOMhWjgaBQC%2FQ5Rk6QRooON0U2vTJAPDS1IXY2sFeg4zQrjYpona79uHZZ8JO8QYlzG9EQC2%2BdfYCkUYFTrGUlHeyLC4hjTGW4PZ2JkEL6oS6EFSpFoC%2FRK35esYP6IUUB3n%2FWmybD6klSSh%2BgeEqmh9nD6kqMkpBjUgoq%2BFlQMaEFFbwsqhrWgYkALKrpNo4cUTBEx%2BKLVZwijH6Ngk%2BjhyA0iZmob00WWcU2dBcspaluzsGR6imthnOdDmDBdtLhRU%2B6BgzGIa5cWFpcvLUzzUnnJG8AyWU%2ByKLebVzEBlkBnYCFCocWQVTNcQsXSfGxQY0gqgMNEvcizNBHUrWak4IALv4RrOEyz5ZKsy4ynST7l2fdg2sOqHJhhk7WQAg8PR0L%2BkUNg%2BHXSRgmj4Qhgr1uKQwFnKBFl9lxpyWT9LYjXEvwNU4suAm%2FmUh1arEB7fZK4tKWg5pIUeRVMdBVOdRVKdhVKdzUg4VUo5X6Xnok6OzNRaWcmau3MZLUdmkiM75EYpeFM99DHy4TJ%2FjscFTeLvGAUVY6GvIIc%2BsEWwy0k2aZrYYw1SLlEa1286AyGko%2FxKkvZOqNDuIyZbhjh5rjBX2K4EOQr%2BPYC2kwI63t%2FlaSVXMEt2huHln1q73QhLoz2fQCr6LeMDZYNfs43YR0sUMTaZ6nstHpP0qlWbQhpdYKYXt6EaiWJoF6SiGplgJiWSZgsy0zJyDKO1uqLtl1o5UPZUFFb5zocrnDqr3Jv7%2BnKMKwms%2BBIgoWoJgwLQwQnUIo4X7PwE1oMzqE0xifLy%2FWCjdXAmFRlyeYCBKZoXX6S%2BfsTgnCOU8J50wNglmfr8Sw7l75TwEJaWooQJirpOYi8FnUJ4mqUCFAZbIPRAmO%2BuCFwLYgwEBCWm3WwkRcLoCBdqIP1jBGq5uo84qcjM2GWRtE%2FWYjk2v6IkE4yutstoynr1vFJmeVMCDaLz5JpPV4uuZqLj7Ne7%2BG%2BiovFYcw4jS%2FXEQzaa7ZCspxVhoe61ICV9q3xxiSyZesnnY%2Fmi6OeF2YT2v3IWtIdJipdK%2BXWEpSCM4Tg2xc4UJxUSYgTjP1SiSDJyfCHoqrcwrLQrMXlZp0UdOpNK5J1wrPo4Tz6Fp%2FjZSK0JhngQP5kiZNPksQ7Lqc3El3pwmUVyzhej1dRzk%2BRXBrMKbhxNY4%2BA7xQqk0tS0pqnKEVoWFwveEahw6mYoUt2VV0Ablh%2B1uZxsQ3Pk2Q8LiUAeVbDCxfEoQlMEQXibHeznl0IR67UUaGLAIEaX89y0gWh%2FeTdWR8n6WvA47t7Wdh2BJ5vwV5gyLTY8IRLaKrnAIgD96IiDIUB5HXKB7O1ypEWAqrzgYYR8v1wtfPMrdlRJmMC%2BmJcglyqszkQfdyxGnb4RSnuHaAyQke0hnqVLIh1WWfz8eRmKH5kt9DIMCcJCrFQEsHLZ81KOfRnGdcJw80pmdyadAQTAeeGkr3RIXFeo2booGtyBk7m2o4Z6EvkAHqECbIWQlfxNGyXEzkdohXXItpxlQPCKQ8odAf5XfRapIobaXDMzOwMA0xpjgotSx5idPiXETeBcMp5nuEOlxvcQ0qNzmCxSmxi%2FZ8oOXIn1lH8gfU4jTiU%2FWjLax8r7ZeIyqfSJSxvfUfpnIdFSJoktwuqGenS5GzRKYxcmHK7ICBb3QpWs%2Fr0nqSYjn9cSmEIl4yQYIJDwywdHHJTGKNxXqVp5VGERyIi8CwWgSH1aJnWC0GDKtFcFitZ4YQNm6OEIKsxBqxC5IkWQ0RRElAi6h1btAT43U0wFhzPUgf7vkGP%2Fx0UbzJVMJmVuzRPqfnS6Vw4MVwNQ5RS8WFet4MFqalqKXp4H2fCZeYT%2BqLTS8zl6DFIsmb6nC92zeo3O8JDkXcH%2FmwD7S6OXIRSLwBH%2FbZgUQMScDwjw%2F%2FMEyx%2BsK65FfAm3B%2BwdhA1lNGCAsk3mXIiTYKjzqiR%2B7goahDK48uo%2FdTLo9%2FslDkS8X4JE9mglKFg8ASmWmSuzD9IZp0cVlBgrjvrDGuT9tAosjNgorAzaLCarxFKMcoYumlxPxIgnH4GtSnFOyisEsJp6MnCeGv6x%2BWBXgWXKFJVK6A6MOhhtNw%2BltPQw2yBN3UFpLEYBYUJHItEsoBidh6E2%2BupocIojWBBuX2AmqozMarNf2pEEiVwTSwYOd3eFpDcyhapRvKgA%2BFv6FFL%2B5Ta0xajRakNyOPbIQoY47BxDHHQMqYQ6B8ctWAyoBEaLxac5mpxVTbIh2CpLpSE0STIA1YSDpGDirMvxZcRfnpOAq%2BX1P0SOSua6H1UlgfW1TsuwbRepVBxeHAQGKHI0hpZmjlRGxlFlDKpkbFYkFQaZ8Eic2TEKV1IqY1ToMpbZNsuMhN05h3kfs7YtQoJbs3Li7Ym3HhVFiRO%2FA6j8%2BSjJlWcClKr0BcbfcWVKvmNL5E9Y0xWWGRKXKbNojSpB0wkK6aoSauiKe4DhSunHCCfPWnyxPUQTmhJyIlL3I%2FRIRqra%2BMlQ4J2%2B4MkEu5Vzao1fatn0NMuSe2uNgdW1jpkw3BdEx5ncdI0nrOJylt3qEpvb1hKF2%2BwalrhRNsKMHk2j7cWwFyZ2pguRk1sNJMzGVxpW4tKFasxZRaNegslqxwOLBSAQZWSt%2BCaTDqhVhWBpPL0d6aFwvRYGXEdPkbTCldc3NCEdEWY1Ku0QrfgmLhW0wpfIOqpWtgpXQNyO2StZAguagxuWQNJpeswUr9c3LB8v7EdYtrK0tC6XYMMI2jScbG9i5jEi%2FZ8XSXQd56g4wlekTxGelZkmd0HdMeJUoOtjfouBcWr4sYC4MZUCV0HecofQph4h3DLkNUSTCUquDJv5jGdBt5XKUwjcxQWGl%2Bc6ZfwTEaii5U%2FbwWJjUZ8xXJ7o1IRFMwg2KUpgiJGI4MDejx%2Fo2cHN0tT%2Fl9%2FwYzh6oaKhjdorsrjVNqP12EThIoqiW%2FY9SAgt5cgylmEBocu%2Fh4csn6pEOQumwDC9dVW4wPEQ1GkaofFkZJChcX%2B4SIrY4Qmo7V8lOX8y0qrNYJzGPBRBEhRiivfdIIt5nCsYstxfoiECsbL8ryg1uPQ5fbRd1ljyiM8h5DbQFEoSYEP%2FxO4TF6koKcQLZNewl%2B5bw%2B4Ap9hkjid7Ay9ctyDWOWMMvVDZTz%2B8ENGIhSaUaECXoG5C3FD0OVcL4zqINrJRymFtQQHE0dnSSekHqolFFkTKPpIjZa6xIs92xEbKrM7Mt6uMMoZqxLESqODJmdoifZUiw00kOShoUGhD%2BkiqtxwVpbi5XRkpkOb1BBeNBgoS9C%2FhVbzB0KVJPQ4RuGMGbXmHys08DVmVjK9dZebzxdhtaAwmkn9QdqYlIO8oiV9oW83IZwrZwNso5ywLgJAx8WFy0%2BScFhPUxXJIUlJjCKcCqKng8U4Q%2BctMOghPBph4Ip1cKlagIFoU0TLotYCM5jyXIUQYL0pgkPxFgEUokXEKILuu3LV6UdgrTIrAn2EgHdKBhAUW4niFTlYoLPDaTeUkLpJ409zOQM%2BplwYcrl2ejKBeRhwYdRlwp7VzIjIPh36LDoZkIoC1ZTP%2FStFSyO%2BArAZYgml2rCIiqDKUA8VILUgtIU5iq1qoBSVGt0WaJSrN3ncF6KgZVVDK8sTcXMx9lZvEsIlq%2BxrzARbyzXHNgIqfU4JVUwvqsFQNRVhXAanMqILQIsZAw9wHoZhwhBOQxoqpcDwHpfh8ygQHlGvpOAvh7XlwL6maH48uikNybkBOKY0zUmcUi0DOqXg1PusQNfJuaAHDS8nriG5QQa1HRhrJWMo3MmgdeoZYZeDVnzYewBecmzkmRUgoaPQOvJdEmnZsJYZTkDszs8q4OyOSCL%2FdnTs1aSu4cTPsO3iCgZo6V1horRGmq2zXbn1YcLy1RjjeEsDsXRwbU4pC1sC6jpx%2BJkpZLMzeZMVMlEVJAeYbC0xLLBygprtYTlTHSy8rePCNjFC9kD9%2BF11d4%2FwZFfHsZ9Vh77u72aQhdMgpE0V1D6cBK6DyJJyt2cKdS3xIFJcj0swiJnDUHihCKj6Z7EIsEyM7P%2BAF61XAaKVhKs19g8Y43eIjh7azGimqDo4IYTAuWPpFV0AaNWUvj7dpEzIK5V4kvJBUZfPGgNJByPYfTGsx5PkogN7AJlQEzBFtAlDYitt%2FZaUk9sovc2TgjH0pecISnpS0hvOn5Df3ga1jtK%2Fhbup2tjlVnsUngeqILNNZZgCjoseZwuesfphqEMJh1cKUjGCQ2szdYnXHbtDmgATx8Li8BYWKhjYREYC4u%2BsbBLCBRZ31jIOAPikscwj9EXjzoWeozeeNSx0KcMiCnYAgaNhS6xt%2FZ6x8KaqA5BXUI4lr7kDElJX0J606GNhUXvWFiEx0JzuI3SUnZS11zJFU5VWkxSRmhRYQvQgpIMaVGWa0GHvw6mfYOGkR0M0uTNiiLLE35JlKjrrFA2GATbWCSoGPSRBBVAp%2BTfV0TK5IwPXwlt9lJ0QyEg6FE2zslnmDE%2B4HdcJNV2CWYxqvWIjCqfLnAPolNQ4kxVzg74EcWBlyllJmkinvRi%2BGmsOGysQfFoCkFhT1YHB851kaIdxjaY%2BmbQAJNLUFOtntG2oPJ1ayOjbh5SBTCOdHjBWaIGDKeJlxkamngc0qJcWaHFdHUinxPMzyweUjYOa2hs4fJxiOESkpXTGlhpMhZFLQsVq%2FJywUekBhcvPTVoCsNz4GUYWCZ6KUkKzV1QUmhuGbLmDcNDkTAlkSQtv%2FnaD8vEeSjJYXbLfA0yGzrOpRZdiHrJECy4zsBzDmiKwqxKBxJocyw7i3M0oiONZoXVLOPhSTpH3x9CKvRSQaxkfiNMMC8vMjhm7AqTufxOajlZNBCE4WQXCV%2FriyFlyowYiLMa0wJAPyolq8pCHFULZTilcG5QCMKr1Cio%2Bbn5paCBX3AOQojoNoQQaelEgElZMvdLoyl56Yi0C1ojJmGOfIDqkZSj05YldJ8GtGeKIRiqcpnpucGpXvIc0iHYNGqUIpyKoj8VVdoTx1mSl1W0lC9JchZ34cI4xYKp2XKOtKqi2Yvk1opFB0OYRNPTk9w4YBN29YxEsoA%2BkjjZc5akPMJY8rTIaOL0yFiakSaROCirZFBJslogMtmpu8wSLvSJROmsTiEKikMy01hqGEIli25s%2BpGpg0voooApcVCcl4OYw%2BpmUIkPKu1hJT2wlAeW8LDSHVaygVI1pt7mcjkFOrO0cq8RvW%2FXjqPr0Uvu2zDi01WBFb%2BvYAlGaqSkOjBqzLN8akzLBTIwv9D1GgzDjDj%2BuqOD1ZmQ06Gd%2BLRoXQbSfoWzBF9ULYkyPev5nlKWNBLqfSQw%2FBloHPVlVBAGtaDRjhJNezGSNq4TZRFxE8gtbFVV8oxtC1pOqNsSHi4lvXjlnoKeP4JzfKBWmq2UmXcCkeCWpOkMtqGIRLJl2ltOvdXVU1WFsVkr60h4lMDY1HBCQ1FDCgwXDYc6dX%2BaqLfEsDxjuvAKkdutEojBGuwwRc%2BlAq9%2BGMDERqbPHh2u3MS7lIFR9VRZz0qh4Q2qi0H1AB0Fd98FN4nFiaJjUI9GnB4K3zJ7jKGV01MxQyqlJyXBylAnl0FDSs%2FQGxjZrdq8vjWoCXrHNgR9z2AJga1RzQiMVoYRHKvqCwD6SFXb2gtthVxSX57DeyWHpEz%2FLkNdhzskfTbrkNR1uMPq%2FVaowbesYFX0jUCG1Zvz3lwH3%2B7PRzAPgfSXdPtSbUgE662D4ECfMLjeI0pzpVHvD6V6s9HBw32hofRkwxwhCiJ%2BjxNomg0nNI41JLnGW7in0vSW28I9UfRltzcbgSz0JT%2BQ9J5kq%2FZwupS%2BZqWauelSAiNfYCMgFwxLDK3iYN3C%2BQ3C38l9%2BeUSTR1n49nED2dVi9eNpsUZCz65%2BxUP8w8TIMiPcBWdWguGsEvxo3XA%2FMRPWwNWwVcr%2BV3YwtCmeF0kS9aACS5CcJ6gt%2BuE3QFxIah02G%2FzU5gOZ5llp0yxo8NAL6P21DjLy4WvTKRx13EOjUtytzvgDdje8QKlt%2FhBoQUUy38W5YZ%2BakA199EhoJBFMM7R4XADHV2YG%2Bno4D1J5PY4LNxYOZWNgnJTOKvZHyUtFAy2yulVmgiHRS6hnH%2Fro9za4yqeJUIgLKLF%2B0ktwm4micd3JlAy5WARbUHnwIKtb24YaJVR%2B%2BRKRBYQaq7P19FgJ0fDvRtZptSSCTlfxPFS8vflwhVrZHiFLUpnxng3bxMIT7KKBCG8Hhy0yJZsEiJ8mqXQwCUhZQdW38%2BqsoCEae%2FXsPq%2BeMROSJGygzYKt%2FdrRD8BRDjP%2BYvr1uDslLtid2FN4OxyNNv%2BNaf2iqJ9x%2BCBhBhC72ekRUwNysuXBs0j%2F1yxhugKgp40wZxCDeEaopAsjwIBXUJAluS3HVBWp2k5RRkLleuAagTrrMQJOVoqiejiA6KBgQdN%2BgsNxeGIye3i8qdQ2s3UNNK4PM%2Fy0%2Fp%2BbBgVbzn5HN4OBEY4JqN8VcT5GROviJzQNy0vm56yUV3kCDqvNU%2FuADUKw322ZIujGi3QAfwkh%2BXulJuS6JDWUSCpxNBzS3A18xuIDwdjQFX6dJ74GiwuAS%2B1ZczZoml08g7GYkZvgxk6dlDhSMZB0dEwG6JdHK1Eoe5xiLO4LJJpIIHSzOLC0m7bweUtqiWgOhdOBSVbLVlCESyhYkAei3AWip4s6ELPLGdRFrXGT5yvkkIw0AWME61FWUwwymKRJUxVVcQEORYVRQWAoRpXd8BhSyvDEmXlAKHCTsBrYIYLhXOohIhc9QjKdlnRKGWHCoau5befGQuKQq3lEunebYuKOmfG2cYqKZExqbjdnA5BWmh2CdLaoMOYxfzYwCNIA6hEEZY6HZpY7l2GNAx1GHgxOT9jKnwdjtjIPMYyEjbFHQ5qZ0T%2BkpQY%2BCOBoi%2F0CmopahU5FLmZdChqPfoccVenM9kuj6jFJYxVK1Ho38GrMoMNcDKVFpIysVoLbutdqlpeNa5lz8GDmdKLskMQFSlcmqSl0MXVflMzcE0FA3T4M0BKxNZhCXqfsQRlvPYpffk9WWYTXKquuTK3S%2BuLRtHmdil6G0G1FSOjvxuGfaGjB99XYUm636Jq4zQoNk09YQTrCSNYT5gmHvUZq8SXtPgMLgntMqqePFQ9mah6ciGKahmlLx%2BiSNehqL2c4FnMN38uqnZdgytOIVuG3ikJPsmjMy4TbvFlMtfTrq9yWo509OGgi4ipfzkot%2FvWBdkxgwfr%2BZJOOlxUWOE6MN9EO2A1SVZ82VnPeXqFEKoOkeVCkDjWwaLsyYCSWVGDwLqSnX8QUhuc1%2BI0wiCCeT4AF6%2BbOYge86xaL5Op1F0AVPKhlCcqhS3ZzeJ1fdJCF%2FzE%2BBA95deXGkzUVGpQYQPaYtLdpAY17kLldtmh8DbfgXmbr2HFynlDCH5b%2Far4PePGRa%2FoVZLnwuIJkDyWRwyC0IyzDGXCFfp1fW6mV3YRqOyQZXhDWCRzMXeSkUMrN8AOubzE9Wy1hE6UrNbVkmepwyXdxiBjSCywPURz1b1xGd6QGMss%2F5Xdd64pVjdzUrFtpSXME%2BMGTh29PN5EqCWBIsjffJo8IXskeQzzSIVRR6KanEUrwbad%2BMZ5dDok5kl2Ic%2BPAheGbLTOPZRtPNMOpteOWseolM%2BGVOGNGZpe56sKgRnPToYnZJ4n4mJHoEKnjmmfN4BrhfXDa3CdLS9PsuHljRdWk7IamPQCCo%2BPjZZ40lu6J%2F0FdTIoTb%2FQdBLsCJaSdK49B7n2%2FsMq4yLMLrHOwpBIT%2Bj0aghPNvTZZcHarzAiggFRwjC5jBXXOV0mzF7ZstIUKj1upm4cOrxiUIbO46VyNufx6Mw3SFzBqhGVNNYwuyfsSLJmNatZUZ7ESKEPNqxgO%2FRYVu6GI%2Bj1XjAD4%2FXewcGg9w1BKCVxArNXZ4cQHqo8aumrEaq8JmTQC8FRqEO1m0x5Lyi%2FAPMMrN8jdpgp0tHW0KCmRgNfNEvY7VTOpBT0LU48unR7RKP2N01DHNYkLXdQGRB1WHcyXGHjJROtevaY%2B4wPvzA0f0YTIC1zYePf%2B0Z%2FS23eGNRnGjasHiDsGi%2FgIDqcDYV5ndwi%2FRpZvUbMA2PFuWQY0y6j%2BsjGD0AZn2T55bAxoRg%2BRPavVjvUwZ%2B%2F1pBXXG%2FIK64z5BX9Qx7qe8knYpZiTZfbRapC6i%2FJAUv4YatlMiZuTHNou5HzLO9b9BhK70bV0BQ5aYdjTgvGSRkbU%2BhaiXfYotCFLNFIGqYGEZxOWV%2BbcVwKjd644khRFsg%2BZVfwihi5s74PguP7ctSJtqqqUU2prCGUeSLj1tiOeF2jQRUJeg2LhVyDSnHi8b0fxgy8QJ8rs1nsvyyqF1oDPkYDlVVRwLyPhYrQiwkT49hwJlsXDNI0laPWY4eh1WWHpNRnHs%2Fl%2Fppny%2BWE1LIXTDW9xcxR6QkXvzYUYycHl9h51Oh4LOGtdOq3AP%2BdJF0zfSWRY30GSKoMPn%2BFeiJDIl5LB5ktKSmQMCYXgP6I07CUYwUPD6SFBMjm0scaakr9EM7%2BwVpYxqj4EmIUAz9FUtZwTJfpdJylplI0Es5%2B2AqkhUuHtIpSa92GCXc7vCFpR57tvHKxA8CPe0ywdG5DiHZ6QqB4TEIIrZEjtMeooWLLsZhw4NFgZ0l8vuZ%2Byg2elXKcEC7552tBxZc2EVozgHLhtRb6hPNzYmifDn1VdmtEUBEsXERF20wNqqrrNQwsZMXkR4ejVQTi58mMHWmR%2FRUvrJgu4lm1NFYVUJpl%2FWsOofFrEQUM2nEquSVwEFrJcphsMVzE04q19i4oSFQagtAhLKY07LAFhx7bDWGrDa6BgABkVbPVt5v2javjHC86iLrcDf80vjQzVhr7AirGIQlRgAfTKoxsAmER3ZVuGFF48IpRh8HvGJkL9ONplQtqvRa08uZplqeos8catGFp9d2iBWwnl6T1xy8QOTTIh%2BDj1xLIjxTsSnlHtQQyVSJDIaD%2B6tjXzpcooj1IkSi6BBGYyQDK0K%2BaS2xDeYFY0e5lrPrkKhbZ2q5EcKvGlvho5c5agFzFRcG1OThBGmhakmxHkgixcBJOQODL9TelaxBEIPVhvp%2FrYPLbfG3BXXkXpyg9xBjSZGW0j6X5VKAJo5tIgrWM6E5MYRv%2F1zRKsaFReYPXlkyU1o4h6sDvK8qHAlu33yKTl1kmCL4ErmCkVmBx7TeBJIxOImlYsRfDi70YUpRlGU0XZGxMnrdVoqji20NnGr8SX1khCEx5sSAQQz2rZVm%2FrMOZg4vA5Q8qg0CbmWSw7aXlRiBXLakvplBDJwL53%2Bj9lmEFPtbqSZBQMcAkJ%2BTFMlMJZN4DF%2BBq1dNBQpLy%2B9wdRlqteuIpThPljL1LCZQO4aFCJkKgOLAkjDp08DPIMorDw1h9X7TKu0Miq%2FpjEw6NOEGziNZlSmVpDT6xbW0LSINrCxofA6LLuJolCRZqI1BN0xZul3UMRQ34kHj2WGOKDCNkR8pi8yU3qeBCxiaETKD%2BhgpXk6wsmXzWJy1jpvfnUwQfQT4lF%2Fb9PoebeXAYouSgY72KiW0cVNrvOGiSxgXURIgiqbP22MXyYcn8p8OR3ZO7hNDb3Hu5A0oiD9fQVjafCz3eMaEVIpDtChlqClYZdA0LhYeCRV4PDbVoZaa3xrsEkUuL0JZbaXeNIzDbzyVFeYc64XoOHhroKUZ2pjiAFzn6EFj0t2m6UBmo1EJr07%2ByTvArF1mVpFEmzDUGEL4qXcq0wpDJJY7X8hsGFLXULWG6QGMQytvTLJ2GMamQa5y5TWkQflRtIXk2sFhykvDh3mAxLGqgF2uZVBM5z6Df8Z7VgCst94sI5hASTp%2BjxqhCEsdkF9NTZpTmZUw4nHAQPc5lVNAOKYwG3g%2B0I6i3Ms61qA0YqsGlcJBqoSyfqS1UzU0wI6LLshaTxsoOKFwptgQayUIdsoAlTQjSE03HCqFWDj%2FZYqVFBM0tF5UOLWpp63qtVY04cTqQnJtKM%2B1gMbVXVlNxb9sAZh7CvqlTUkkuY2CCtOEJCUb3RcbEQdsCerrM0lgcLB1IPPeocXHl0AGlWrAEYzF7lhSCxk%2FNkavKgmaQRFmTKl%2BtmVxRpYaMCml%2FSqiKxVHZIcijrkMwtnp7CYFSCyxHHYbYOVp8nVww1UgfDqTBNWWuU4S1kgWlZZ8DhZpc74eLUCGW0YnR9SyQljBpRAfnoD%2Fz2XroCuDZa5YkbQtrTG07LgH%2BjhUXOpwmNQCXxfckLhp82956FxQKa4pxKjXzh5UaVjYVNWw90bKNi8VbRdB5xjVNGEkacxnJrKz7aZJDIcayAf28ZBlLzczloWHREE4qmHzj0uFUqRRLbcpWUjxrQOHmaoNJJ5ANKN6rbK0BS7ckCS1CKSoCKSpCKSqCKSpCKSKbuMKZkmPFVkfQdYc01LoUtCg3vhjMvBzClA4tXNx2YUGE5rLkkcYh9LxPhdsbCbHE8cYj8UWOy%2BiLQWoXNSY1NsT0Lxb9dVsMKmdV8cYl9Lwfynq44LRCkQqE8iML81xYkOa5sLxycRnCxJSs4vFkvcI9bxHD3p9P28iwELKALDKyKtdWrS5BPhVzGeKy1CVQf10ky1nO%2FFP6tLVkDI6R4jxhlmZ9EuwQjWYHCjIGkWFTESUpF%2B%2F4ZMkxvM%2Bh56ERVinfjbscybmHi%2BexscUmtSWXJbX9Ds79QrsEaWfaxZlcHGEUywhHJA0kTygWFOVQDaq2PELVHmhxvK2xylZyezMMQumkxuig9RCDWRG2AChnZ9Y7q3xp9mEZth4BFNy81sHCKr%2BB5hWTlVTneOfsDOXeZVZNF1bDLzqLEsnhLNKXyVls3DVEeElcyrFAS7MymeMJEtcI6LBdnnhxT2dzqUqAe7FOcn9I0%2BlkOUZowvobZviN8strZgIW%2BsO5sDQkFenrJAynnL4Xfq3iSrl71OEZtxtKA2hKYEBjkbg9Lab7ijhKcNparIkuR83UWZQnRmtxmTE5cwPSUpGLl1rcLILEgcsn8dW0z%2BADesMIuwTntMDHOu7fpB0kZ%2BoCPM4NZCIkovRJgQz0CB193oDEh8SQPknIH%2FkAGEfcQJlFpEHDQpLmjwMxJZ8aM%2FJHUXtUoggTiUgjeerwWB26%2FgV7kz8UKx%2FsLTCH3X3p26dzMd82nYv5dulc7GsFM1JXshiv14zH0irJpVUF13jgtBT%2F9Gd1TlOU8XQivzfIufA4zbj94C4x0JItQxy7uxS9tg2u7MRqEqxp2MrLYqTSYZqjsDxzSKJahcVDlRAu%2Bd7iLqrJip1SdTC9G4Xrp8LDMaVR20uwQ7u4QBe9nJwlszgzZr9ERLDHYQB7XQB1aEU8oJrcEsTjihbWKqohiOLOFkYzMmyrYWBV%2FdfAwnLeANK2zyDiVs1ARRyjHxoFU9MZn%2Bs3zhp0IdxWasD6yIHd5mgYsgXyBpbuQjXgRQi81ED1nleDqlkqerOkG1VvYDVLRShLhZqlvMS7jqfxpbCEd1F5THUIC%2B4lxoXxRoIHn0fL5Tpa2xsfou33LgWGJ7NnFu7cn8cR%2BlaYj6Mlt7LdgullmCDKrs6TdJadk30RNmBZzGx5ZcyONROyu7yMi4L2zWZjLL9htIKvRZ9Ga2GscQnCWsKD2SLCxaucGytz8CFpFAWxDo5tZCJZp3Y4tnvQDXTWBlqaJLN1YH8ecSB%2FD2%2BhRZTOWK9sMKijbMqGcgsbR0vmHHxZRtrHfZqSkJaGjgCYGJKxer8W%2FA7fafhwMBlFX8sswi2z6GmZRU%2FLLAa0zNrKSqh11pxAszJnYGl%2FNMDpiUZZODgMzf6CQ%2BnrTMThC1SL0qzR24g8ltKSkFUMi6wIx7Ze4P0MK9KZnp7Q1WWt%2Fehk1pp%2BS4wJMOHyKkLipICAoGeBwVX6GztEbcLtbbwWfPvn9m%2BYBItydPjPF48Onh%2BOvh%2B96cSxU82SbBeWxOyer4MccUVrQp8%2FPRCgZy%2BsQ0bB%2Fn2DCbrbgKFaEAyKk%2ByC9X5ArYNHKlJBYg6MvEpJ1I%2B2fnljB4IM7Ef7Xsj42Yune893x0Lw6%2F3HR3sH%2BwL0fG%2BfvQErg5MUpe4%2FaMA%2FGOBv0vDKGoxIZ7Gx7R%2F%2FlrAO2KVMo3IFI1TOtuZdmrFd6lMKY5nW3pIjtkhBTQ4REG%2BNG0hwVmYAwRG6AcQDDQvZy%2BMyKDlIt5BgnMAikka6gei4U0HMyYkIVulpyt0kRth5xvefiMGTCk1lMnGEAefQOrL5HI8GYCTS7Sv1sGF7G624Qae%2Bt0h%2FKPxSkpKd7WHp8smDksVeGpCq2krvkER53EFpSrms3RBWWepvcg1QwLI%2F9iG804AWxeHjEbzpf7OB4%2BUyWbNNdwMbw%2BMqbCd6tDwtUFAzqfV0oxFwASR5KmgIxuCNj0qGaSbGyYzotLzGpOnYxdjsO0FzLWfBiBtcibyDax8o8mkofoQD0dewFDu%2FnAmBogwPwnnzg8BA2hoIplt%2FcLWwkuxQkmEvjXY8hAh%2Fi3PW1vPsvEALHAuYpljqLYgWvhVonsDeml0QqtFEey3BU%2FAJX5PVeIq3Scf2SeGgBWNWqBYronmU%2B9equmA4ASWsn%2F2xv8bk2aRGzZq3QAUHpmFhpZ6TLGOtx8pD736jAPf9s4ga%2BMaXy9YA9zJZIwlf11kIltK%2BLKeWeGspK7SUFb6xlzochY5cSu%2Biiks1lyLpl9S4dO3KYiWXgFuk0jJYaRmstKKvlJyfiYJxCwouhmF0%2BLXym%2Fh0PFlGzE8ghjIb4tPxDDZHzGaJCY558By1OpgZ3OlYjONE2HdTKKfCHMWTtizFaDFYiGIVwdqUfy6Nzjg3E8SAECpZX5yO11W%2BZqPAFFqg3z6nsKdecne0U2hSbC6Yjs8XfAk7HV%2FCkoF1MHP30djvzJiiCd70g8E8zg%2FX0ZQ36%2BlqPa9SnEbOo0t%2FZVyDsELnSbTYCe2AWa66aCgClGMGoNCraSyUZ41lpfgqDKqPhTmxDmcT4jRHXyfSaIFIzsc7CJ5wX41T9E6Q8Zyiv8p5VC2FyGc508%2BBUJQ2SvbIEYLUnyy5ZelpLq1sp%2BYUUrjUViNpXAiZM5DwDQOcsxVrDZ0LQLUWixCWpXh0Nz095wtgA6K%2BRJwHOWmGv3iTtzpoMeytI%2B6CwqIJenhdM919D4VuXiapP%2BB1SAte8gz%2FYx%2FBn1k4Yb1kMmZG6k2tvDCpdfbwqMJvdbXp0SW0StjAMWEQw%2BkWAd%2BH1Tw8iMojdgjtw1os2DJm8dRv0BhelLMpb%2BqzPFsfLiJYcO2K5hN78aL2oceO7WpIsORRQys2Y9fIOk%2BynBubrmFSmlMwGKrY7I7HVzC2%2BUmEYHkPGpPYYJkJQjaAcM2OlnMFBDajQlw5l4NgKO%2BaEFqsMuYaqQ5mjocQSNnwgaEwrgjpw2GchaJotJCrNwyewdgZMUt%2FGNwYp%2BLL1C58xvWBOwTR%2BygyyK6tkUFgz5gIdS6zMEliVhwuqnjnM6F6atosiZaZiq7R0kpApbIh0o1D4YbUNQjZNGFzfItap7RKKRPnPPbV4lxI7jYuIWF9uAuTNm8oC8iypqgDJY4syAxbVyChrxUMq%2F%2B%2BmicbUhFbXzoIndN81YP76nI%2B7u%2BVfNxXm%2FNxf0vl4%2F5c6%2BP%2BVOvj%2FyngOVTvFO0oyPYagYI6vikfvs5aq0oCJJ0txWfKHRkEqFeKNh0R5QpPNlTUm6sxcQQjRJRi1eA6Y7NeA%2FEp4gw%2FM87m0skCgGjgW04IIdLiHDEoJ35JpQXGs6xCfYFS6sENBxbhyqddRjgJxDkRe1XNgAWN1HdreJ2kU8n9KaNI9dhlZMzUOKP05Mbc2AynxnKGxBQsF7lyapX1AfXoUfXqFIha6jlVqdwuUavjLitU1RJTrHGJKFe8xByW72AzEKnXiHdIeYYqHO2zjSdVWUojq8uB0YhtmD1KHsPozdfIDWmVzGaoShD%2BmmWFv2dJfV8ku3F9HzSk8PcMR%2F9c5cvATaA2YyAktodfMliKQeu%2FaxMtrAJ8irAQ8CnCWsCnCMsBnyKsCHyKsCjwKcK6wKf4Ut0OZcY33h1cMDjYwSVTgh2CtPqo0Xv91XKvv1ru9VfLvf5quddfLff6q%2BVef7Xc66%2BWez3Vcq%2BnWu71Vcs9sVpO48tJFjFleoMoHRoQtRsHB8PQKBge%2FnrGvfCA1zfSkbaXEjyW1G0bkIy6a6BxcCrXqsuQqiXN1LymqCOQo82FaCmtYGscTxaEwsjKhZQfmLELrjvdAtqGy4WFLu3CQnd2YaEru7DQjV1Y6MIuLHRfFxa67lrz3Y1Yv9QhPG0G58ueidL415FmPuNgRV74aNIL2OgLzQ9DtYmXMPH7hGhbtbCApIRMn0jtErpJLjQ7DBaaGwVrdI0vtEsKFxokhQstkcKFJojhSvRK7ErkStxCs8ZgoTljsDD7YPCfeDCKgJS9fUBSpcqo%2BqRTfXIpkkiR4qz%2BviSxmkfjKJ8u%2BBErAKLpZQgX71dAuHboCdAC5hd2vgzhwoQNoWY24uHCuRmEooWtLGU%2BnxERpnsIhn4mKBADwI1YQKC5NcUOFObRkg09ZG7oMPkt%2FkkD%2FukBKDExdpfna3%2Bca7FVgqeVosUXs3PggefSsWodzo5VEZDF6n2IFHoojK8n63F0kRTjaDqFUdvc12MK5iLJr1eR9JtGMip56IQXRvfyUv%2BkT1Q%2F6xO1T2d5Av3EJM8X9UkcLWUuR0uUy1HSs%2FTXQXX4mRyeK%2Fxc4ONNOX%2FqsMH%2B0G6D%2FaHdBvtDOwSvuXKjCWWNnkJZy6bQiocW0HiYVh2GL7JqiRe6ApB%2FRuFgwvcbSHpN7iq0G5FSgOH%2BJ2A%2BUc22IDZFjVvefxGKUeSdChdKLbjOs1nFSqkGK5g4%2BPrLouiCj6vMWZAgYaJCeB4J%2FrgQqL8nYXk8r4STFITM5d1gCVkKJohPrg4BimMK69Egx%2BQ7SKnSAYmp0iRNSliQJnKOmyLUC6ylZL6gE%2BFAMlJ0cMTOu08nZ6TEPI3WSQkJ%2By0eN%2FpM%2FrwkcIXZW2AVuLiABjsgQlgMsfkQaXlcVnmKl1mhcZdJyg7nuyRZ5cfjyGlvCTF5GOCOa7usE19h14czflWsSxHMjncJgrvMLiHPuIvGLqOIcUnYQ2Ezf5dwGS0yKbOkFBEV08QXZTagXh0Eo101f2RsQGOqQWoTRo9DUP%2FpgpLRsIZRsUmBHMvC2IpXjsw9ouYCWx9T8TvDeNlyZq0R9jFrD%2FNmG9nHVi76cJ50fYexSr6eFjkDsoHjOLpZZiUY4%2BUjksS5ld3HoqtrKyhtNPbkt4wlbhBMq0tYTA0mKfjhhRZZh3NFyyR%2FNWdDBRm%2BQfxxw4aK%2FGKKboslsVmDMYGZ9c9ob%2FtxeYzFUdIjIzDYLv0qWU3woj4PFHZ1ECru6iBcmBcgVNq7QTDKo%2Fylpg32l5qrZI2KxqextDtEMJv79vco1C%2Ba2jO5MXwAC4ksmZlmdc514zwy%2FErxdiXS%2BYmfR7Z2140TmSlX%2BFfo0HuM0alq5te694Y1cDAwfsseHj3Ka1M03od6oOQtAW%2Bc93zlPJ4YGrZNmN7ZXQqHT0UJyw0urfBJdRJ6aJDa4cy%2Bb67RX5eaMpwxx5Mk5To7HYZwo6HBTTHhzYAyy5hc26OVU622LEGvTks490dLhmsEc1%2FWFEuIInho6%2BJJMSQWPg528E6THBAfGzs9VF5wt26kJsso9dfbDioJ1RwfVJJsrQuzTVULC7ZdWlAYlVtQtArewqKzFgcWBusWLSDJ3Mp9i3OxW5rx7pbNcbexRP83KCRl%2B84OXrK7ah34nC2iM5TszPKMyfkAOJn51YmBFyeCPUHU7mbecCAQlguVvyTI8EryNGNLBQiny3AnAgDhq6QwLi3jNGGtUKLg5gUPS8jNcJB%2FkkcpN5iMnMIX2FCgL66hQF8OT4FnCevpEF6cJ7xdQHh5JpWhrA%2BPwLnffjJ00ZN%2Bm0rXzgyGl%2FpEQNojAHIxyS5UoIjzJC4uWITCOSIsAnDpKElnHYgJaC32hGuvW0SW0QZB2C9EUOPrhbyOReU%2FmmzJkaq4j3YpKPfgsqwug%2B6YBxiCFen14tJ6FclRVTYfR9HEl6MxTusccx0lbDso0FcDOOiQYxGtWZdnVNyiM5NHjJX1Z0P9HH0BxqvpIsvHd5nkWKD4aw5Gudcfy71gLFxw4aF4b5DbOm9Js2i1JvdeKMZWWfPc7Fv1pBgHaWN%2Fk8AI%2FnbBIaAbNDfRKhNNDc2znO2iuwzRZVuXsoKlbz4gKsOD%2F3%2FlnbFD7KMM%2BR5xJAeLPqfnY%2BhIjPo3fS%2FQ0DyiXscNsefL4cSXMN0VS0k7oeWQ37WetlALXoxD4fkyOkFjMfEJPwnV2MJsEKCy2UHhKuapFDaubvEPqYcK9Pr8K8RuM7dKLoQZRuRWQ8kxOktk1jQ4b52dc6s1nIaCrgFfLeO04MIuzjvDvQu7Bch55%2FwanETimwLO%2Bi1bTdi6t0MzfpCIDEt2ttbVuEW25FxfLkVSMjQGkZ5FAt2iKfdEsM7JPIxwM88ikvdbgChK%2BS14gbrsnHkqc8Dwq%2BJHC7Jgk49PogpWzDzyGocy6KOIdqLWBTmxGk%2BqnKfNYribYmocANJqQTFy08DyBcMGFkwuNZhmym5dWsI0yacBVFCIaUAoEn%2BL1WDa1ceGIF1zbEApRzUmeS1qQGkwqDHpVmQL8iuQLSZchHRA2C7o0f5aBbIpXKVEOTBdMYNtr3YXquVYGVYsSAEYSbC37XPQkXgGW0s2avlEszH4hV7RqK0YCPVk0MZ0KGKUop3wU5wGp0tKgkOULiGUR0uA4Syv1oF0E8%2FYa1Y5i%2BRkMUZXHnxJ23DWdEZC3gL9%2BaTlWOFpb2Giytoiz9LkNyhM9GMbLMyWbdzJyvQiXvqS9CL%2Ble4w4lmgYLzbhWFbXSwy5sYy%2FnWW5JLQyiKSzAkgqpd1ZpZ16L8yOWF%2Bmn3WEv7mHHNVXkw7QWq6zeV4KLB1xv2Fx7%2BiiBfzLUoCHVwUBTr4LxUsf%2BbMZW1LkMuuRsXjGAdXyreG%2BVYdwRwajTnixdoNEQSrSR18ChOV4O9N5EiO4WRiUUl2FLtcYTHOCGwJ3mFIjhs7BBK7sKWrR8mYILpDUA6QOxx51O9SJC9YHUbwXLnDzLntnA6unDl3OXTeTAqTzN1xhyeZheowhKOUgoxHSMK3FuFVS9DBfF7Epa%2FY6WK%2BbqfBDrN5mXIldpNNMmaLbplo3rWaWlxSJ5JnMXq4Q%2F148TxCfAeVgYazIU%2FV%2Bhp0Ckyzci7oP4hvyBJd64PWaMXmRgk2x7lU8uYpko2qrM%2BsHTLf%2FYa8umjw%2FXtB%2BNsK1fc19KQHnkQ9XwdGTwKA8XXfR8RUdP3lGi0zcj%2FMXSQKTGw6g4mC30OBafzx8kjR%2FH9SZGWerdkYWc7lnROES2oaJYyyp0L3I2vTmgtdcp%2BrORsN%2BM9VfOe63jLXSQ6dYM7ndYGGueQnNh0HkrKHwwaWdMM9r47YJ6UDdU6z6oi9PHJdEnK6Wdjbx5lgM8jlkWvMsTgTcJruD%2FU3VOtaZlMx6QRWJWtlK2PT6gzXvyzS1bhYxuxOEAbTDAnxCu0%2FZ2LK8lKaMCFUnNo0taja44%2B2dPFxzQEVEUIutFqC4kerJSjOtFqC4nzIHLCHvBPhaga1KAJulyxnCftA6MgJ1yTlvHPJFUCHFijZlqAVrWHM4jU7BOgQ5syGTwfuz3PY4ZTl6L6uDKGIVtyCYoeBUiC%2BZOxSFP9T5IrIeu7CeSqEX1b%2BTQPrychMHuRLSv5Ara0tDURdBmzUNNdMjcp3DOtfgXQq%2BeGBQKa5ioHp5SmzggnhuMUu1hFbEJ%2BReATmP1bdp7jsS4R2cKo4%2FkHpyZng8edUUps5kyy5UiCfsDBYsjEH4XM2gmCYf%2BeQAkUmG18gUApjwwyEsYEDwnyNBAzzrwVimH8nEMP8C4EY5t8GhLAFN7cMobBFi7krp9PxUmwlS7XOhY08hhaLRAon9b4103gEJM3EZphWq3U0E%2BrHAEIdGUCoEwMIFWMAoXYMIFSRAYR6MoBQWQYQaswAQrWtYbCS%2BwEibP9N4YJjNhS%2F4Zm%2F5LwGwFys7lytbqNFL4RLsxQEK%2B1AC5YHHMXOOCBlxFyVnnIludYDWJ%2BDMMc5mKQBSJaT2xDudeX5zv6z1zvPdsf%2F2Hm1t%2FPo%2BS53wCJZAozW62Xjo9nslXxGflIJwpA62O8gdbjfP%2Bpwv3vU4X7vqMP9zlGH%2B32jDve7Rh3u94w63O8YdbjfL5p8qRnWcsxG7gbQ8sxuijeAlmvROa%2BxyidcKOvxPtTnb8jB0U1TTxQ1hUczyS5kcS8hwvBO4VJ%2FJ4DLXmtz9aJTq9aWPfdmZdL70Ai%2BjnLBFHmV5%2BSvhFv3tshCMNNsIdgI8ctGDQjjH0uOxUQJTg2WggFyC53H8ame0ksuNzBOyeRbLkYZCw9dGYB%2B34RkSGt8cyueL8trK7oRMwGcR%2BfpeHKpiUvJPoRVmRMhYVA1gHhjxkCifyEDCV6l0E3R2Ip0aKqUPJTxG%2B0QIm1553kiZYaOz%2BpSEu5lmWM4djkYQ2unVtpbZMmUv5pHZ1yjxYaOtXoUjcwsJM0jvHQp1A1Lh7EDIXkZsYhwCm8Q2s2KCMm0RERsFAYSM0HIBfkHEqFLEUodpcwSlkkcV1p74yteGvcbkJVhbbRpzFe8DYT6Q3iBNYQHXhfFNHRU64cJZoaWWXryQjydWUUprkpZaHEqVqJ8xGOMJ4m2daxZJshbAGZfoVC%2FKMygISYrKxR%2FLwCIPlizQhpoIFT2Lkdqw9DYxWGQQClVBDjGEiRY05pzsXUOWRC0u5AjNX8DSMqImLmi5ItOVMUSBbMEWBsUVmU2wAho6U2qJbcgjwBqERhhk6iq6cBStI7utaYH3VKU%2BC0qR79S3lqJ%2FNklzAGikiD5zbHmLUUdySSFzTvzn4LIKUCSJy%2FEak9natVYgmqRROJIOVtx1xKkv1f7lZfibUGtBbskUbezAQMxBAqVJOdywWjKuuZwT8qOQVgyjbpMdAZTrbKy61L4vW6Lcy1GEy6dJlhIGMMsUhVijHkGC4yVajup0cSJ1glMkTl3seJqVM2TfFUfhKo0uxgOkszKj6XWw%2FEGib%2Bj8bSfqjTltS04piTDbJB8dt5FgLitIWTJr7FSuDqwGgtwQlMjQNoiFVNux0T0oFmvYFTVDEGNVkqJPSsXM20xaXKzkJgFA11kpKggg5cyiP4rUDDETq%2Fi1VpttbX7TjGdDSjoVjWYMgs3uNywGlgqVnKCPIVWyfzMGcT0CwmKxftTBC3QCYoE1MfxrMYJtd7RJehci%2FFCAy5FQPyAVC7n8eRkqeTR2ptTK9qvW21euZAuh%2FmRaVPKpXm5DXNlgkZYOnrnvoHbvgfomvh5N6ZpVFDnRBV%2BXFo9GJEVtw7nzp3REldPsKYeJQW9su284lJhJ0AmaB50v94AD0Z%2F2%2F3njwevnhze6uLorRmXzQ9Gj17vPT8a7%2B37jOJyNcmWD2oP0x66cRbldCf%2Fdp3UjQeCWNR96X23IGD%2FHkGuHnTlpqPRYvlLcfvxmJwuPz548WJ3%2F2j84uDJ7i2R9uj5weO%2F9fJ2Xh4cjg%2BPXu3tP1M5f399cLTbR3o83n%2F94tHuKyK4%2BNv24X3TNN7Xf6yyWQVFFVP%2FKUbfj05WS8sizvstesL%2FofJTcrRKrxR3UDuX7IDc%2FqW4s0wmd%2BryLu6cZBCG70BdjPBSGqpsnGQQ%2FRgXo6ss%2Fa%2FDTdsuNq4V6camTeotm%2FSttn2hMzUcFkcn2SaWyZbb9Kx4fO9o99WO4JVcUEGQjBgmGb%2BUnyyDEvmmFXNB%2FHrNJRJT7hpRuM%2BN2m1LNnlMs7U%2FbKDYwd9ds2OYVcQ09lNm6mQdpXxNn3OtIgpb%2Bp8QJFvowIWv2OxJbahEj%2F75UjjWkDyNXnL5qik45s7Sht%2B9x4ycCgpNRo%2FDl%2BdTKIs44WcLEMQccEIYixDCWHSy%2BovwkUr6SiV9ppK%2Bw%2Bu1koPWJVtzV2m4%2Fv72o1B70ECYdJ3bz5su2KUhipOHSVeyZetZEMrlvoL90mi5LBd5Vp34C8g5byAVM33LrJudZKUflPgXBZKVsHoh9XzhhI6bj1rD8lS41yI4BxVPVUUrkNAAudFD0VaBsNuD6SDcMuySAJpHZ9XQrhl%2B7E73%2BI0HZkDohC9h0Z5HsEaoB%2FwOKiwxpEkyvH7yKi9aJtBccdEANYuT1sbbW0IWCmXdkyyX8QkmeOO7O9667N%2B0HPGWafBh9M%2B5b3IrDTv4j9ZaackT13y5b%2FHSEHtWQmIS8R%2BZGYck%2FounDv%2FBDEsgx977QW%2B7Ae%2BvU0DSQUFvAYn5WUXQlR6M7mw%2FPD6efPXm4qe3x8e330Tb853tp19t%2F%2Bnt5vih87T15Zv1y7dvbm6%2FBfoMMPi59WXy8I5YGLCEW8QXI7yqlFXlKBqhijzs60az5CQpoShhKItHt0ebsCKA%2BgaCAUgp9zyC5luv5mZbUvxoq%2B4MN%2FcPRl8JBT60SnkReJm%2BubkJhbIZKJWth1sPpZLZejigbD6oYDJS2oiW%2F8aCyQ4o319t%2F%2BfbYJ2j3T9M9VfZKJuW0fLflMLbTrlvvol3r1cZVpfv%2F1ZjdXOMLbST2a2HH1cK%2F%2FZm%2BbEDpB2a7zz4%2Fo4PQdaaj49g6V5Agj9i%2BK23fnwApjT8rZl8haUZ%2FjOzxDH8K7Dijo%2FfXX2xJdAupstqFu8iG3eMjKBO1viPprmjvaPnu9ea4Nx8klC5kGe6urSPjzfl5kSZBHhLhYuXEYr5lMzhv55lTP2vWc7cebNx4y2r%2FQFty328rggj%2BxQSjKUsw1h%2BtBRjeQ05xlKVZDhL5e5OSt1%2Fz1igtH0XtxwmicImR5BCS%2Bc%2F4vaCH7CeMXWD84Xgi4JvtzK0ecP2Hwm%2FG8NM2wl7zPOFICDh2xsckX15g7SJlbeiUXUiaVOaUNEnEM%2FgPGHSozlsbPghWDyruOqIv9csebaFXTCZbRPc2JdM%2Bj0VygxSDLtodowXCfHBTtuXQGX53nyf2yZ4Yk6xD0jf4oopZlr4H1YqPGQ7ezDBw0SBzbfY%2FFDojM4C%2FLbOzalEeR5dfoDcHsaEbkwfLGlvNslsrhLEoab%2BuEiUwslwTTe0M55fR8D%2Bw87hD7372euLxK%2BzmljFvpQX%2F9Ubzb%2B%2B2dn%2B72j7t7c3vSx%2F3Jy1%2FBSzVg6jfCzNWwR85MxVRz5s7iL2tWevkl8stfqKfvdZLi3Abo9XEwXBu%2FrziIejPGgmnlobdf3KONLxX5vFKL%2BP02nC5pk8pjNa1KZiyaObmYcxS8UsblT%2FZZm4N5bmTE8AZnMmUkxpxeoP7BdSqEmZXwLYLwRf1%2BjaO0mpXJ4w8%2FD2q8zm51oqRvPZx9kKvpJMkiXXyCqj%2FCQuQwzJIMR8GZU8abPsOdeKmGVPBe0KjKBkk2KZcXP4WBc8NGLz%2Byz2Z91oUkg3S4aKw4U59nqyb7%2B9CFN%2BfFHG%2FPYwTeWDpne%2BXpPk3MbJAV%2BvGWWRzH9DtF4rHFrlyRm%2Fdo72gCQ7QOtqsmRnXLJovBQ03EQpuGtSaMAah8LYpWq0xZjw5SJfdJ2R1R62bpGW0SjSnZbzYWcG4q5AOiAVTNgV1Zrf6F8kPJN8kQwbmVyYEaaLeHpalJcsT1OYytIo9ytGOBfF08KYnSVJB4ZcB5qGRNaRKr5clExVCDsu5TxnKRhIWgjKLNwsNx5m8grPq%2FSI38qQnP1B0BFXQ4ehitWPX6zikXZUPBeWv8WPeVIKa%2Bwpt%2FmIWq98BYC5jPL4yB%2FCJF34WeLfl55VK%2BZpkm%2BxMOgRbxQY%2FJQXHAY%2F5zb10LQzGxSlvVs622F5lychmA53mGu0uNzlLtbick94%2BYC524DAI24T6CRnphyS1aqS6i1JhVUajN9rKbQkOzQ8%2FCw7jV%2FE5SJj801SPObzn%2BDwCe%2BLHQqXO%2FG2lR%2BnchkYppG9dF2Vh5IxSQCh8ALoSxSqYNvmngri81fkgYeHK3xWH%2Bsl1ynmZsHRRDOb8mSF5MEKHOizmAXxRohyJiEI%2BxBfI0cz7C08XDKFbkN3eR%2BVPEoJN64KPnQWa1hK7sqdVnBsDBuLF0wAIEmZymwPWjj3R1xmwkBYQpNPeXKrNVvLo0edp1l%2BkP8tYcMESqP0loeo2PQQEBsyAmpUBtiRxvpzQaGcwqiI2%2BCh0g7aRXbj44qKTFrdI6X%2Bv6nhpwszCH61%2B2z3p5cfrf5HBf5JJBHrxa9LWRSByEfLImz0Q4URSNekETn01QtIEJUjPTDNlGd%2Ffz7e33mxC6w7b8ZWAPRm%2FNX2n%2BzfX94Z3KLXi797ureu8sivS09zZEB7t96udirYnMa4tZGUd%2FvlhFwO%2BGvFli4UjksA%2BbxtwzVhIMBcK4iCE5xwpdhgrb8ShHH1zWF%2FD2gjE1fUhFWpkuwp2kUQgHkeCaJ6guK0WgnBEH837K3H%2BX%2B74PUaYtcC9mZ0sIldtVLaVH3E%2Fub223f33%2FPTS%2F0Yu%2FcQedD365PVN8fHnx0fbx4fbx0fPzg%2B%2Fv74GELeHh%2B%2FOz6%2BOj5%2B%2F%2Fbd3d8ncWfi2YWbsuPjL%2FiX6%2FPeHwWo7yD7E6RalqLXdfnX4%2BPzm%2F0J%2B8BvmysCannRGH8busM0Kjfrof2WDV5m2Wm0gNXS5h1UB3hwZ2vrOsXTmXw7LzaH4l7vu%2FPmz9%2FdeOuXxZ1Hu8%2F29jtH59efy3HW%2BxSTeZadXYpzOQIfO5XbyAfN5LU%2B3Wb9x71bo2zyCyqMvu%2FM7BB4u%2BYA2tD5LA1MXpjO0gGT9xErh70nOJ6%2BwpXDhj05glXD%2BIu3NzcY146%2BTno3O21l0Pp02OrUsAy62W15G3dQA%2BZL%2BuF3IdKR%2BfKOH8w6ottBWO8JasmIOjDQWOOoHFXr0V9vFKMkHZGn42JUZqgShfctRyUsFPB5Eo%2FwZsEJSVxHUTGaoc7bSSFF2w6f5zf%2FKmvFfCItMfd40SSID05OivRDRvqqHxRSnnEUv95usRZndg2%2BvrWbWmrV3q63Lrf%2FeXh8fOfNz%2FDj%2BDh9exN%2B39EWHNTeHu08%2Ftvhc1xn7B4%2B3nm5Kw5oddLMKiLcFx7t7e%2B8%2Bqd6zhu6GSUUhlnWuF90I3vT0%2BTrQtnY2NDmYoSuOaPVsd64cUOLFaEPi5V68xesN9f6cDQOfMFRp0%2Fc7VkdfPgWWJ9H30mq6W6j5zX7GBrd4fjJ7tO9%2Fb2jvYN9v8HbVYk%2FMW%2FSh66a%2FcRVmUdJeYXr%2FiscZPLZlT0du2qPsJh6HS4j2FKHMv16%2F8nuq8PHB692x%2FU0oWfbrm28urz7gKyunDODoqPR%2FQconiphTWBOLDobg1DPUy5YcTm4dB4hHJgIHsL52YZ8IiMdoYhnLXQM4vTu0N2STr5garHLGBRVJ%2FNk2uyUu1%2FlZ7e92mVQ6tzGJbWhbhikwayfmk8bhd%2F%2Fis6iboTycbF4HKmcBWqHieLh5%2FXOTwNnndJxsXSOph2G8a02P0WWLm2xs2fxKFQ6uBWO26VTeflcXTmEv8aJ74er06mH6fJBPj80Fw97lbtk0uG4emivX%2F8KCsywc3ZjUkVZ4uVvOm0eCcfQjiSGBC9GaDbiZ9j6RTNBy64zzF5D%2FnL4w%2B6jnf1nm3yyJsfoD0jLhRWFKT19Pvb3rnbJ74WaedcLNGtDL9CspfxIvem1b%2FnxQcp2n1JGgZd96i0pTP5rrMViFKUzanWzEenZx3hKiTuIqCxztn9w84AENQ%2FNBvAmbABHQLr79ssHnzo3NDyMjNuiUWz6%2Fyib465oBNnABjQix9lllguvw74pwhnUKRW8RgJZHy2jSby85ZcL7LrzuuC0JevxsXCvxSxZH4TlZNfbMcpNGv%2BJzRr%2FiU0b%2F4nNG%2F8ZP15%2B%2BHVvxHTaHZUsFCr5fKABO9TGekRaGz%2FXbWsDGpovyXLb4IMNLs%2ByYrdHJi5RIkgV143nE4vF7nx%2B9R1uIaWlaUjKhYPixwu5FtFKOq7C4I8TcNmIB4m3kMtlTYHZ8YedfjsurDrV3vQRA%2FXPn3322eZo849Xd3HTePvu1SHpl109JRclcXn1KCqS6dWLbALrr6tXT55GVz%2B9eI7cye0vt7Yeftw2E%2Br56d5PL3ZxvIMZHOsK%2B9MINijVcoYyIVgoZefQ2WCkK9ZROkLjS7DWnI3IiaowHcuyMaj3n%2B01sc%2B%2B%2F%2FwK%2Ftv%2B%2FOrO1u0vhfTjOoIFvut0El%2BU4%2FdMdeNeJ2L76vurz77f2nz42efSfTUabIWjgaKaPLcNFEU81URYVQwZEz5OWu%2B2LlEi5uX2D5xxfVFiZ0wlCwdZvt0rj8MEnIuyuA%2BRADbf9VX3%2FM9%2B%2FoY%2BvC2LAT%2Fq08LuS8r07U%2BSgnZJ8A4rMnw%2Fsfjy%2BFg4SKOchKpb%2FbqbpwemJk2D%2Bv4vcgE0qQEYicLis%2F5nxuZQJ3EiLH5ENZ2%2BO5aDMhrMLMXQuz51%2F3nFI9R1%2FU%2Bq8%2FrfUEMOHf4QCxGDcuz11WB%2Bw2L9Jq8a9FYGRL7AvW6%2FoSxtmjYr58u9wIw%2FhcmAaH3nvvjv4ztZp4%2F1dbH%2Fj%2FWwT9g6%2F%2F%2Be%2BPE98bo7On9N8ub7%2F3lrO%2Bbww5zPYR7U9TWEue%2Ffs17r7NGutwvDjcun2IOls2U8ifJC3InV4Mfux5yPDNyV1W98hB6Aawew0zC%2BWKOGf24VjM5vwxb4rXdc1Bqs8saqDcnEO0qqYXsjDUn1VQrpHbxPkaWCptuGUZRhweQChGk5j6SLFDZw2z8hGdHFAxa2iHxlc0HeLxy4aIqEG7DJO932FarpHIoZA4EwthfYQEmKf8HQqEGysKwqmWUDkp%2Fn3ENorWG5Ldv12MjxfikvXzQvvGTHMiPjSBbmPrZN36jSCdeSp%2FAl8%2F86MpZzWSA3eACBl0m8nHVWi8Ezfcf%2B5nX7gKY0KapMygqTmp9QSZEymI0nB68fPd8d03z5ZLz3ZEzyRNQN3ti42njz8wbslu6wtw5hWpXfunHj6sabn2%2B8vXmDv%2FXo1c7jv%2B0eSa8Z%2FcMr%2BIU6GG9RAeMtj%2BDl8529%2Fc57yC4%2B2%2Fj8D%2F9xY3Pry5u3sLj%2F%2FN33f%2FkrRYj%2F3v78r3dX7%2F8H6oBHt3P0w%2FjJ7vO9F1iXbaRo7wiScmeLv7Kz%2F0%2F4PpCMWDJO0IhER7AiF2inkuTS61CUoupwuqXRIlxngGSde0%2F3nEx29AbdWA1Q21pCxUEsCyxXLJI7XbGOsX1EF1hRih5NimxZlfEIb1m7PFNst%2Fh3ovRyn%2BzNHczxRl%2BxqaZrJFaX1%2FjNd9ywra1QwZCi8MudVzsv%2BgtmY3Pj2lUEXShQZV3q1ubD77%2Ff2ggmd%2Ff5S8g5qniOD16NqUB2f3r5avfw0GqCdE5q3BrnPd9GRrnfPSL1JJrzkxSadFJuhj92C77Vnl02g%2BF7QRXp9SMvkZ31gGbqqTXx5DU4PAfaqLc8G2i8O5rNYpSMLrPzEZq8QQnpKI2n6DInv8QV5zZ69wJiHo%2FssBkaE7FV%2BOmED89PI7M7SibQxrdhx5ScpEaf3j1ls0dV6N52dAOK6PuzaFnFN9zIwtstWyR%2B2%2FR6j3LERDbU%2BWlyXczf%2BwtyU8wsuIkmtLns0ZAfvBUbtsPz2ysjdBtaF33b3RIEdYaMuil9h83u0Ay0qn737nPSdLnAw8ar0eXo6v3727dvv3t3B4Pfv78hNfuoQInB8fFVtwIcrYD2VB61dLyNWd1JrlRlxZ5tHNnlww7R9BJUSYXPxbmrkdrsQdA0H%2BR6AqvN0%2B2mJOyRKiZQ2yeSjvx1N2naUMWqJayO0HPdbNBFkJ7m6bYZD8J%2B7AeFm7LekN96gwCKk8QtsB0n1zmelJeXqHU0o7HSDn8ja%2F95ZEd7Ml5IYye%2BZtpBMULH2rdHe%2FORsQ9TeF%2FIDLuocrq4im0D37wFm7ySvuiIsDZGswxG4DQrR%2BhsYgRfjUebye34Nh7P11ZWMD7vIxDNNl0srXub%2F7mtUMvpFuX48cH%2BEUyMh9ee67TRm3sebLuu7PShHlml77cNHKfXdgaEadXJpDvFdvN3u%2B4HqBmoZJ2rEx683N3HZm3a8IvXh0c7j3%2FY%2FTRl1Vca4bK8flm9R5mTXly1Cu3B4f%2BaDAdT%2BmjncO%2FxJ07hv7v5DqoSo0Tf5vTHPcgCZODx7u4Tqqpa3V5fP5KtUyaNLE6TtT888mECvvQPVAexyaCv7%2BwfHP2Aubp2KmAt%2B%2FB7k5it66UmpB7RSO66FdZeuPXkAAvfyAmGlavlbR1QPmFxAvTZaIC2Rlf2e7HyZEjqLD64dXjJvm61ShN%2FrTxhDnzffba9fefW6M72tm3YvpqD%2BA6%2BofClFRnM2ekoj87NMmu08Q7%2BweN7%2BEdlhCsynEhj3FlEqPmBjDuWwpZgHd0EK2%2BT1QQ6Z9v2v82Hn5EoRJfxN%2F9xjlOjPbOMf7FY3cm4n37n%2FHdHOmb3VkgCgzdJn%2BOdqwxSYUQ%2FN20NftoKEbN6zcromQE%2FQBeQ2qxpr40S4KfK9%2Bfh%2FH5Us7tmTj80CzAhoE6%2FSXBPZ%2BJoOymbmwH%2F3kSPkvnHphiiuG6ibTfCVf7v1Kx6O9K%2FuQvVaR%2FVmv8oUl3ES9jBbaMpMdj9RCVuy2AGG%2BGEvB0X02jtyrICBTLk5v07aQXll0pfwShr1t%2BzQH63wviI9jGwGHplIKGD6nq59imOq4vTeClrDRPysQfVdfQDT6mJrh1RW08ST9BBBBbExuYbdJUy%2FnJLuIi%2BiC88onGuotDNDZXOG3cVKjkg6cb9nwo1KqaHpPROV%2Bc%2F%2B%2FyLP%2FzHlzdv407hznff%2F%2BXhX%2Bt9w8%2F%2Fs%2F2Wv12lSfs26U6t3x2%2BvzJ%2FvHy%2Fxd%2Bg%2B3%2BR%2Bdrm1q0%2FI5XOw97%2B6%2Brde%2BETRR3%2Fvza%2FeNek9v0VrP4gwEb3%2FurN%2BMHGjbdbW1%2B8a9L0futffIPdXP5%2Fp7kNgrb5hC4%2FjmZRsSARKl7RgBVtMquVnkdZuryEqWOUlDeM6AiPnlEORGr28PMCJoTbXrSHMXT1H2yr%2FdO3IzRgnJewYy3LdfHgzp3z8%2FPbdXvM8pM78BF0AU6sOybK4jaOKN14va8cLRrd7BgTPIuNgAslVL9kEyMDOwdOlN4oUZA2SiHNdFCGJ%2FCTeJGkM%2F8sbVbFJHXNYJwrqjWmaDS5HB1GcyjE0QRv18W5n9%2B%2FdPcc%2F9p8%2BN1nUGW2cra3b0Idts%2F%2FujW68cUNdop3mI3wrlsczW5Bqm9AyUWzGdRHmm2vovy0Wo9y6Ku1mxbMZF3HFJ4YSSD%2BXYzQQrwXPWSK7iXXQkmod3KsDi%2FOk4vmOk9hRnQ7io5mbQPpZLqT3w3I4cat0cYX3l2QgOY7Du7b7GrztjCid44%2FzL2Zt7pNAlGwsPPsxU7IKAG%2Fi%2BBMQdufS4din1NSe%2BQZL18dPN49PDx49UEf3%2Fj58w3%2BZSjk0Fdhjjs8evX68VH4o9xulqtkN8Frcm%2BNqvaNt56OKHa8gycHD0bkvMF8Fr0eYNPZJNvn20l6y7SqrU6bkXXzJLWOwyNFumNUV6ViEdRUm6tANzZuDBNymKbCJRhNRV5rmS%2FaJtPK%2Ba3xFLRJP2laun1168qoPG5R5rYe9qzfO%2FJA3z2Qo2v4Zkzm5prqVa919i6MWrsfjw9ePdElcu%2Fkc%2BX32pEZtoBGkB76cGPVQxevCq701JNb1b%2Be4zuLbAjAlmh7nSVpuW0ViUabaKmugnmrJtaI5yrrXW0d4l%2FUAmBm7yyl3m%2BZBsDDXX9fEkrR%2FUu6ywTLr2hw6h3ysByQR73xl5CkZpnnZMIJwwzUPvSulwFa5dWp6UkMerH74p2zLny%2FpUdsVpoDY548wpjdxWkb9YCeEpQr01JIEypvLArV%2FSf6PcKpP6GDuXREO30UA%2BMS7ZxO%2BGaZXeaPzFX80SKhg7tfK%2FjEPMGDSBipYIovYa0Rn5sHGEPOkERdaVTfwScDSMZEgV020M%2Bl%2BZXjEjJOTiAVtL8YTWmHWJQz%2Bj1Fc8P4%2F%2BiXsxWkqkwh6UU0j2FxTb%2Fm0SqBxSZEgvTVDM%2B%2BsynaX%2BqWDKx7cbH3CrWErnMfEWeubL0NfT9etvMW%2BpC47VW9OGg7bt8kD1b4z0xFVOwcPPXfHynE4F0CHBoFGaowYlNbZNTWNSy23R%2FNRPPn60qGOrOYaVb0p1Ykwn1Gpzhsu2wbJDQz00j%2FTxaOO%2F0o9%2BKaJZ69hgNjY20cyPS0rWBx9rcw029tj2q674c0OGdFKRTtNUv89ytJM5viIHa1CaPY1kMcx8KlGG6UNB7aAqQx0R8br1mO4trygwvYrLh%2Bv5L3RzzRME2wKP%2FXNio%2Fa8JE9qmy2es47FNnq%2B4IdiL%2BiOZfT%2BV2bP6gGf2TNorBd8p%2Bh7EnbKzg889IilgVOf2GFSL9jtOzUV6lC2lx59ZCOF2waNn4cQEL1GIdTeNiw1uqXHfHCtE9N6vd1kCNv%2FxBWRSMb7BAQetr0RT1LPtWSI2pXMW1e2N4kNQyjo8f3r6hHmgJpgmvfzG%2FThBm4bY5l5BvDtYmhGmy%2FxDfstIuvK%2BdynaP1PY%2FdGf%2Fc%2F%2FWHip3HyWBKFC8VSuXFkwIiD7IIFrcAnTtn9bGMPwGUafhX5sPP9veaoSd29s3r4z80wnkezHZ6I50IOUkvsflc9tBt%2F9y9d32J3SvaLv0pzjyuZD8K2Lwxx72XAz2rYhc7ZinY24YmtbO9n%2BPv3hr%2FzKGh7%2FkJxk%2F7Py0W0969O6dze2HKBMwwoI35vQHX39782rTODq%2FuWmsQ8zGb2E1fNU83NzaNHKP7Zvk5%2Fzm1lVy%2F95VBf8n33x9Nf%2Fm662HwiUhSoI5%2F6vtT27speXoKco%2FRoc0So0eZdlyZD26jv6BBqt20I3qaGPotv0i1vfsF%2Bqe3WvWjnK5tcc4ItOAZhsPP0prj6s2A9hswWGHPLOpp30%2FmjUcoV0%2BSDBZ88O9tFPRKA3AoxwzpaPUgM5d8Ph2FU3zDJa4Z6hJHp%2BPMvgjT2Z4jYgs9Y2s7cbRCU7x8L8x8FgXjzEZaazijYwBxBHZySN7hCPMVQw%2FzUoakg8LBPprVJF2ATZ%2BMqU4QnNTft15o0J7fXXDxsvcvwVM8Y3GXculw0QHwdWBNufBQEAGKNcZHXjT6bnhMtNc9Uh1Q1smCED%2FytM3kCzMf%2BLc2clcNfGdDIn5gwYmcRyXAuJZfpPDO93zlPrfh1ml%2BWRpDif4RyXNv8eK4RM7Ewo2aElm7hRMd3hnrI8wPegmolc%2FxJibxgFDsnb8SVb4xpIuej%2FMR8jQVrV%2FfaDaJjw%2B3rySvGl8OltX%2FUmHkWKWmMuk6sjz%2BQdtE92rUTCzmFkIfuDfsLuAOSTLN66tvtl%2FioZXAetpDRlatu48eDM6Pi7fCjaiTPW8%2Bbl1ooDM4%2BPtvzDnGR9kDeP36hdqgXxUOYT8uvy7bLZpGTPiyzIRB2xfmsMMEP%2FvyqNjQF3KKq7g5Dp0sig7imoUsoO7Z2%2Fz%2BFG6tz15qVez6pBD0qmaZeS3RjhQkNVRSqprItRAdEquWieETcO7L4QO%2FHGW%2FeSm6eSF353uJgtvkMlwf%2FNzaEoTxH8ftFDqzxfJAQTPSm7WhF71fyFrZfa%2FMWNeB2VLyYGTcbOVpAoss4%2BchHu6OiH65IM92%2FN9sSWVfbgL906w7Pgr4Lnv48YDxUUGz7Xgz0NrdK66vnlrpNneH5QJNSN%2BZvSe4uSmMxir5H7rax9j07Cva3x0A6%2BXlMqWw5mCdWaz6v%2BABtzarj4%2BPvyYadx91Mxjf3d949goKfwEQs9iLck8i%2FVHijwp2mESz2J9PbPYhy%2B9W5LXcRrsNTzfONXYN03lSgRPMpilTrKimtTpM6LBPF6jB7Nllq1bsSB6dB5F9HOWrEYF%2FsBjvOj%2F4e5N2NvGkQTQv8Lxzm4nrTiHkz53MhlZkm11y5JbknNsOqOlJcpmWxIVkvIx457f%2FuoAQAAED9np2feev0TEUbgLhUKhUJheYAAfXm%2FW%2BH%2BdxrRBS1LIAFhm6CtvFizws4yDOZ5bAbpS6dBfSzrt4%2BdnoMxz1BODRAsfa4VqYx4Z7gLQ4CZElXHa98EXGgK%2F00U4vcTvEnaENyHdHlgEaeAtL2ch7E4v8Bf%2Bo9IyXjTyZ95Z4l8F3tk0Wt%2FCxns5R9Gg3F%2Buo0toK%2F0u6Pc8SGGxw3zWS4QGDMCjLXBNOTnKK1dRGiTBgr6oV43fmfBTkQSApcaQOFqG%2FwgoaLOSqUjyiW98oxAPBgDFoAGKaM82aQq9NL04n4WAxcFNMIXm%2BNBR3nJJeS%2FxzgtUZUn9vZyG3ppkqJTlbTKNFvj%2BAfQqvZbuETWCdibeNIyneA63SGAkVwRM3%2BjsN3yU3FuHUyqAc1j7C%2BUIAMlgdGZ4A%2FI6nKUX3jk25Jy69PwfEXAF52Rj4my5pmZfJFecGCqF44ajcRbdQLMu6RMt8UMG8bCq6DnbzOco753GAd48PAcHzDpUtMf6YWlxBIhDMubpIsaXFSHZHGPX8RI%2FVIMkRfw4xxd4MUVKYubk8wZNBeEL0pQgXKIUGvO9DNf4DVYkUJ0GC%2B4BQMDwCj9YQcBOqLBH5vDQASONn%2BnqCkbgGhsToy2iG6zSdbjCD0zm2TI5xzg2uEIOPz73Eh9PBWCaQfYwEZCMYE7XaZQwEA07UCOcVTBCabBEEoMycfyiSJ3cU8gUZgaiDw0ezl5YL%2FH%2BK35CsuUCmE2fBX9gMiJuw2d25aN6QurFNG%2FjBXQ5%2FD%2BHkeXPnvi%2BFN9XKFanSQ8jig%2FLe%2BsguIT88XdBvwCAdYYP3Y4AJA9Xc76GQJbEoFFLwPdzgegYCv%2BXIVVgjuFoZQw9aYwUJ4RZAJ0Cu3XPx5%2Fkc5zKKwSQ3RzVCOZIQeac8xyQ%2FHou858z8tzw55Y%2F197F9QpfEpE6TBezqXdO1USswC%2BQDvpC19MXzwOQkk0m3PuTCTtfPifXDPCLHNgn5EAEJQfSGXSQLUpONAvmEIL0BKbGDfzHOzCM8ZNVFKNOrfDJSSe8F3h6Itzz8CaY0ZiLgBRPnmQkWvDhyTgBCiJcQLaEKz4%2Fey6c%2FmJ94WvBuh%2BJGrtwtWDXGspd%2BNxdk%2BWNdNwKB%2B4P2EWTlVzXNy%2Bk61a5bvZUmHRdydyuZG7YvhvNLcNhft1kThkKJOQmc8rQWHzPxfdMfKFvEUPZg9PtRnPLxFMZOJUhMF0AV9kNJEG5VdFQsMCiCZEi6TlbIi2TPsJAnB1L%2F4bXCRxKQLvJdEMr1wRoPn2v8coMfAEVOX45I%2BqH7lmQXCL5R%2FfydhZNyZVeEWWXuETuswgWU3KFqY%2BnbORGc5Mx5UZePEm6DCIgduQlARkeP0qyKnOU3vNNKJcO8kN%2Fkl9Q2glSWg8IYATTZwqOZbiaXkR4xriBrBfifO4auQY8VYSlPvUmzI1MFAsijv7o5FKeUibXDJVQ2hlyJQv8wTc0oCBAUlhyZ3uz4BySnO9hNZAa0KwEBpHcUMXZBB9qVR5suB6l%2FNPNWThVsOzLReqp41SDl34HgApC46fTQCUR3ny0Ckku%2FMsMnn25SBWAy8J9zii%2F8AnRF7PL5dLiWAJihLuEzHwiWrY5q9Ip%2BvXXfxa%2FkVp1R7jqJdn8ANiX3%2F6br749yT3GUsfOyDoOdlHLPUiS%2FFNaW6igPfj0BpYP3BpNmbsBTn26XEdr4oI4SFz7nTMEOOQXB1GoH8zo3AeVEFBtgDZc3vkiOkPOZQ7%2F8OQ%2FnK%2Fow%2BbGcJfGOYJDfsMVMB3whW3SUt5doAzxBysVB%2BdYxRgp0xK1DUmlIAmQx4MPsGJ58%2Bl1DswNFas87he9FZt%2FAauGYcaa2qE1Z7UGmp%2FZD5WUAJ7S62Klk7TqQTGU2%2FMdt%2BvG3d8e17nLVmE0sOAp5u3VuZL1F5BqpKlTrAHBD5RrcMb1BBsA%2BwCj8m87Q2EfdudoPD559ujjy71P4gkuvIPvuOV%2B1Gm2hdkzsgUt3lfMnqbf%2FfS1QzuLUpVd21M2Xp23VA0DwTt%2FB9qr1QOosThHoudnksfWreQadlVLZYVr7O2NXyIoxPNWb8s3CatMLbkoebnA1Rb4GzOk3Pwq9%2BZo0uy3J%2FuD9gf7lWOON%2Bpj1Vs%2F4yN16FxfFTbYMAf1MX%2Fg4XqXpaSpmqfmG7GI%2B8V6fWjCYKdIqJqT25ZdRouDZA3dHVTgXnZX6M1rPBeVs7Th7XjYs7N%2Fvvx9m9faHnb04eZDtHqK6tUT6VcWV6SKpHcMHR3LnuArD47Sc4vg1lPwGRWz7zq%2BqZDc651uz62qafvEgTefN0GS1kQbwJq%2F0z3zhvfo6ddvHnsWDv3534c7RYy8Xl3PHc00sCjy%2F%2FSk%2Bd88I%2BqcPe7wgP%2F%2FexrgK8P4DKeHb9KiKXAIILvGKL6lF%2B9xS%2B3jFstfni2s4baMp9J6lt%2FBPYSrhIXiC7CVty6m8vaBLOVtbYbytoidHH043h%2F0RuPmEG117Ii7AUh9d%2F%2F09E3j69d%2F%2Bet%2F%2FcdXeYaR08krBUiL9JyAHn1yBQIj%2Bey%2Ff3TdNZC72eI3YFSJJieptMhtyzTPVJ5mxM6fXnv%2F6f3na%2B%2B%2FvP967X3tfY3%2FwAH%2F8Onqhtd47T3xdnfZBgpN2d1d8LO6PTpfe0%2B9Z1jAs2fAK7%2F2%2FuL9Bf%2BB4zVU%2F6%2FeX%2BEHfuHzN%2B9vr72%2Fe39%2FTVJ4fzrdLDdkho0O4lYz%2BH%2Fr%2BetdemUJtt7gnEW4F07QSSd%2B4rvLcjvwzaHBQcyuGA1irXdhUw6%2FC5992Ar%2B7PITDuvddbimtHEw20yF6zc8p%2FHX6wXUINn9KxrWCkN5OgifaIp2FcRBJbDwC77BsFjweQ040P4E49wuslwQFovLDjM8xkO7Q9MLVFtdLN7QwVO4InY7kSqt9AX2KSHVVsIE%2BnmTHYZOow2e4Wzi%2BBZ%2BwXWLB2mzgEQWUja5C7T7go4%2B56wxAg6%2BCSEduyxTld5n539iN8p54auSk0ALHRS%2BypKxjGQV429MhApdSfAZz6TwP%2B50xIHobhzhyy2zcJrSyHp8MJpg3y7JDFOYrPEqyC7ntCvqGibQ5ime%2Bl7RQS5KbYEYzmKUNseRGGFyMTYEy3V6%2B4bsuifITOC5ClqypZ9dwK9d2dEUgNighQSrN%2FgbYw4302Cd8pGnwC9Grjm2C3CI7I288aBbsCewH%2BhKShR%2FTfbGfFRQ4lfHvPNgBRQJzx9Xye2SLprAf%2BoeIUPiT4KHhJv17tktXsSieHzhCy2XeOEM%2FsGuIEzZaNn8a%2Fi%2Fi0c28Fnfwmit9oz7L1NxoimPl96Q0tA5tEN8d%2FECoQplR7wI8MRUXCRI6AJNmOwivvJ3RX7qZXLggsTfmAKoV9ChTrXILQpWTiqb%2FHiZBRFAutOIwgWhQucqOKdPRPd5uMnw2SxhgZuiM5oRHJ4qw4dZMXKx2Tlw%2FSMAZAoTrU6LkD6wIxMKVTjAsjJv2AUIK6v0RlJO%2BX3jLWDpnfkeISCfWMI3xOM%2FHhY8Zf6afhnjF9EUR5gUG3gCsi4BueXBfubefWH4yG6IjylvPGj4ebBLz4HwNN2FyR9x1y1h7FkErYWh3yA2RJugX9%2FwYQd27Rv8pTrSOSD8h7HCD0RAQaK736DFGg86%2FA3b5EVdCOgUerSNUH0dxMtNKoqBEXmDP6mY%2Fui89heXeDaKzAu7STFgHQPVnNIXjyqfITFNMt964wEui2w%2Bb%2Fwk%2FLyJyIm%2FsR%2BSReTVOSoG%2BDP62eXTZaCTSXgFBChYL%2FBKlaD3cbCMUCOCtU34E8yA8INTsSO4j4VIfA%2FC46Lpl7peENjEi6%2BXHspn8ewaaF8SiPFOxAyH75WXRNDhCczNYCaOBcTnjZdslvJwiRH2jZf6lwH97GLXk4OpWxrwXTN%2Bjg4%2B3H7x3UUdjqm4dZZ41Lu03IkDLkQY%2FPmafjUEIS8Tp8S7CekwmPVe6HeXNC1xDr3x%2FhGu8f%2FuIoLOhs658%2B5ee%2F8y2PHyJzO6xyc98wrljrgAKa5KChths8bjN0U8VoE5Ljc7VNc22%2F0MbsmirWbdqwYskLefXyiW2Ks9Cd3%2Bcz1FoSxlFtorxDMew28J4%2Bx9QxaXL06801XWheLyYpFJwrNHH8fpJ9jA3n08mH%2FCm413q3Bx1wf69BhiS60Stga9Xqc1Ln4FbIcuj9PPPz%2B5DO2xDVP8%2Bd2KrzuCR91%2Bzr6fYemFr5gX2yf8e7ZDMG59uYuatGgumId2lA01Ek%2FvqDU7%2BbH6ufOhrKKuMw%2FVjT9%2B%2BueLJ3u%2F167qA6welmUrxLf%2FtNKWv2xdmxqw2L%2BYFuTeNimUgcs9l5NuOEmWlFOY0gPH85qdg%2BZpb0zmn5v8Yq4hvMpZm2ECYgQhHuUCELGMQJcVA0AhC0ZOQCPYYRBCEAqzatQTWYgu0TaMJtqNNLFfzTBvxzocoQMUPcDsXb08jNHLs%2FtZA80aXTNBmXT%2Btlg2f4syji8gnKfeGh119pv9w0f26a7DOpEDYxw4U4A1RdYvbMwpxJ0CcyICfx4iwrp9uAALFaji5XcOKZaIeZgoK8u%2BljxLgBcKtVDeNBGviiLTRWthnsHqoNDShDIMepegb5dq4H1XiMThdxYCP0TZnMxKA1OtpGRLtB0NjKvgjGGDQOauu989oY25Is%2BWeRelJ2IJy1hcFsJaZIfvpBdkPAYVjWG7k6AauQ9MdoS%2F%2FoqMkYr5FyhL2%2BA686eXLLggC9zTYIV7ZtpG0ZMuM9wiXsIHegQ1LM%2FpUWt6ghRalvi3pA0S4xZ2RjVDQ5hoFNsShhui3T%2FSCoRYw2wbxPhHa7grovSk%2BIFnMMW2EeRqq0%2BC4sMYbQ7kYbY1gVDes%2B4n5jOW%2BO%2BP3kYL2Hrf7UfR5R1wNeld68JfAzrdjTjt3RglFsQdFypKbVlDQPzhZiEesw1dV5PJRD2Jhtj0StkE0xvTugiml3ctH0WXsJO%2BG5Jd%2FLsuG4cHfL4bR3dY9t072Lfe7ZNB%2BLvmHNpb1sIfv8QtONlqpGYlOMQc69hhmEWvkc29qr7%2Fktjj3E1oVS1HdxvVy7pQGKe36vqA9VesVl9iEQ6dC3D40MU3rL%2Fwhg9QTGL%2BJv%2Fk7Be3863MmD17hHaqG4%2FfoBWqT42JMEb1LI97xg3JTGJT%2F2Vdwf2N7D2qvh2VME9lzW3%2B3q1%2B8%2By%2F3W9N%2F9mwWmM2qSCn3ANgzpzcOwWhXdYcdpv7vU7pMLqtvtQYr19%2F%2FTNep4Nh2vkkHJNPX5eMlzBJRDoR%2FDxm7RFTT60%2FQIYDa1I0n98hK3dH1qnuboPkbhVVCXB4q1FatIsTqdR4rtnfBUR056uvik1XuaK0qfliW2soiqPaKeapXFFfpMxiLu5%2BOZaZ%2FNp2JZE40hwOmzmhT4Z7H92vMXyquTmWtMi93bSD1ax3bpntUEHorVBeWI3m30tctd8cdiYs03uWaahOgM7nVVRJltxG6El7cAoNmFAIJuX3n3buPv5959Pjr3dK0%2BL7dHrarz7%2B%2FatPX3%2BVT9PsfxBVY%2BXWIMTnVYztlqy%2B0faCehbB6PXJQPKSz%2FZgLJKoGgl1Wz1jUWlTNv4os9PyVFhzeVKZ6PHX9tKNReIzTT6q9%2BAzrsnXr%2FHn49%2F%2FAz6fnj12V79k6z0eHPeewFY7gf1uv1u4AU%2Bj5WL7Lfh9xEwFM%2BlhmyGY34WmNWCSNyyDdXXpVIYQeRbY0tvO161SpcxpaK%2FCvEVB7%2FEfkUBnTAGd4r8iasV%2FbprFf4Jy5aNyxi1K9bK33SCEX2BzEK%2FnPzx37Q8o4oFbBJl5vV0CQT9go0DPn5cyR3StOik%2BW7rnMcvgBMWyzZ483BydHhx035Pp2wmay53QNuLxmzzht1N23p9Qso%2BzgN%2FK4VPefML7HcVWs9IGtX8mrPPy89lPgbbPvn4MHket84HcCY%2BLefCiov6Y3J%2FeK%2FeHsx0HSDXfDYbtHGJmVmqfHuAe4Kn3dAwLy1NzyLJLeiTPnEVCVUGa5CXrHOEKuf4knIpXf%2FBGHrvIBADgsfyKC3V4CAgNmKZ0b09aSmKzjasZFMLX%2BeCfeJAH%2FMJFb0Kqgxx5z1eZAo7W%2FBaRMBGcbM5QISRcBXcvnmdzfR1H52jh4Km%2FmkG7oxh%2BVlEKvwvsh%2BAz%2FJyj65zC4IfMkZCtCrpuiBfCRVtEQ0iH0J%2FiZUrvDGjQJSrQUQvJ6ghZEZkvU9I8E%2BpnqGoSRmSegdV94GdG%2Bj6Q0OMJRNLnAPVl6DGihcc6c3jfmgw7bFCSnmW3wduLSg9RaLmtfawuKyGSkZTpBPURJqThNZ34C1SenE5Q%2Bk2G%2FsGNKSfzAHKcLzbJBZt3ke94sbpNGKHFiuR2Nb2Io1W0wRc616iotYpWE2HCmfTGKBB6PIXegAyvyPotG2VgM2GaySnUjcP0GUbhG%2Fck6IQMITUq6qFSGZuYDkjpiTRkWEmMVEBDRMyzkJBps%2FTw%2FjS2L7mgVyQmqBgjPtKdhOfQybJD8Ib9JOV030vHi2%2Bl6%2BWedH37Sromi8BPMmD2ZknYnyVkv5Z8bqSem4nnZtq5kXTp34Czhc51GlMoa%2FhNJ8L4hWiq8lE0rqrrBSxpEkwL0MC10DM0GzGVfUQIhPY7hBOmlvAF1xM2ujKZ%2BoADsBJPxOycTmAEwn%2Fg3F1MUv8MAgBN0nAqvGESTaCccEVPhGE9pljdzYodamxnHgZP6BU5tDAr6iGqgLkA%2BgJqrSb4DIZ6R2IC1CHG6pAFBVLtm9B8IcsbRiTpZXIkT9BJsJopJ1ogYGU7MxUQGpWMKhhHU1nJMAiCCSx%2F6cUyoIdP0S9Onti6AgzLNRkziFEjEqPPAz2KbERwsnw49Ho29c83OBuVYh1MwBkq9rH6n1B4nQWLcElaeNdQKegOaJQ%2F4xcNVstFZr6O3kELZpuY6RPZSZL3pzP9XTYVBzNyjYBSmxSyX2T970lcWkTnOOZoFwo3NVgpNMfgp0gukE4TnxRgEjYoj1e4l6Q5l2I06ZkKdF5DM0POI0nozRgoGy1NrNnmsCcHAHYB5%2FxcHd7MYJ7SQ2YTCAy1gd5cotUbB%2B4qxJO9%2F7L8gAWZh%2BOSi4DXJ%2BHiUPV0OUYoD51%2FSW31NNqgQmE0TyfsFBlD8yazYO3N4yBApnSCCyF8aN0hB6%2BN4OKhQxcOpMVXZpbqyRoU%2FkDf%2BUAv%2BPcF%2FIar5%2FSL7mgGa9hZ4k3Ris4UGGY884RpSIZ12JgORs98jJ%2F5GDwjQzv0u%2BfNKBx%2BLtjOxgyzwMXdm2E%2BMy5%2FRiXPqMwZKYyvCITGbkaZwg9kwSVS%2FvBz4Qm1ZaxCiNmHlHXIyUN6RYnyoPZRIdQ6KihZnS%2BgA86h2d6UWjGl2k6pjlOq35QKn3K5088E9JmAPhPQZwL6TECfuXJTGNYbbPLqNzQfEs%2FpZ%2BrNuK4zKA8KnKH1KGg%2BlR5%2BxupS7p%2BpIz9TR36mjvzMHfmZ8%2F3M%2BVIdPlO3fsZ2f8ZyPlM5VLHPXMpnKuUzl0J1%2Fcwd%2Fpn64jP1w2fs8M%2FUY5%2Bps6g5n6nDuU2fqR7U4Xz5Awr3KWsfU%2FmUlqrsS0NLex4vCVRprjN1G9YYKxiyIjnQqxsyIYV146qRpjSqMGMw1QczptpQZbAEqgorIDO2kwmX8wD%2BQ1ZAABYLMtdAGpbh%2FFaSEmQZlNOf%2FbZJ0oX4xnyRRUSK6yzZ2nIWpkzOz1JUn50G4YKWI77TkVyEc5wJKVBznNpoAmLGb8DPonQilaSDiAGDdRIuIn6UcoV0CVAD7yDIewcXG2hKiOoC4dl0Ad10hjmFZ2ihLUSaHJKy%2FcU85d%2Bptzgj7muBhpzQ7hUweMsNap7fqDLATdZt%2FBu8VkG66NjPWXxIKyp8KB7Z2MhbXlHRaPYGm80mL8AZaKrfsT%2BDecY26iaCPxW%2BBHlFqd8tNLaTCx%2B4%2FjhGppL0qYHooxUqNM5FTHMwI4aGdhYqBBcNGQSLraw0Z8Z2rGR%2Ba1IlJ%2FVssnw2maJ%2BhpeipSdc%2FxO6IEHdtOFuAxYBGwZsB%2BEKoyZ%2FKAGalJud0Q4Ftbhn2HJvut7wQOOqgaMOS8kG17sJIwWu0yJKdyswCgRWJAQ%2BmZLJgyYY04nOX%2FyxPIJWGF45ABZ9wmaQFMumxgA7RIwBLMQT3L0B%2ByUZdfZHcyIPF0QOLogUXMDqB4vbYvLbc%2BV6oVwr6bpVsbcq9hbmCBA2omv4MyFkgf4k6gb0YsKui9s13X2Il3tQZLQEHkyYgRE%2BtCCJV4I2aaAGghoHLPfsHzjK4eIfnsG30QyZEPqfAf6enaMlSPjiKzc0jRfiixeMVjPsspC2vUg50HIe3fhBG4ETJnOLaSTQTTqWfnK5oF%2FiHScEnXgi7Tpao30%2B%2BECAR0X5nihZFIx25TiV1x2eTJq97mGfVn56VdMtASjTBBueHPzw%2FAGGRTO5QqEkGv59vY3Oo6FOn7PrdD8FqJJ3D2zVynoq%2FX9wJUrzr28iOBN75GQe%2BcTZw7Mf%2F%2FxPsl2y%2BrSlug5112kfL1W3BsPORHshLg%2FMclI7fCuzV3%2Bqa%2FbKTMa8%2BSyaYnLkzNn5T%2FN0Np8Li%2BUeIisn2fIXEJcnZwuXsByCHygq54zrCcoBtkhMruGA8XwbH3j%2B%2Buvm%2BasXz3fpu3dAn5fC%2B4q937ygz%2FMXkz99uk%2Bq57s%2FuG5qH5z2SXeZjPQ8uGpfsmaCjNI9dlgoOI%2FvWcooPPxpi%2Bw59%2B%2FY9w1uMOVF2NWMpGKLWyEupavYDNfkT8fI6hvO6lv27bHvhZYxbDNrJ%2F%2FGSL6v2rGascC4dkYHBohI8Dy77RumdItXtNRspt0G1YCC2sF2QySkK5VmrVBV2RgBlQxZQ71VBVXODzawqcAWT8gjNKl2Rh9Gw85oQg9wTpqtFriH3cOjMb0%2FN%2Bm0u2OvHOTgtNerAHnb7bxzgIyIRMNE%2BOW0O%2BqO0chbu%2BOE6w%2BkqzArE6Q4K6rWaNJst%2BsU7IT%2BQFDlKVpHzf5hrbYVJahTSrvT64y3KSWXoE4pnfed1ulWxeRT1CknG8L6JbnS1Clr2Bx3Dz5sUVAuQa1SamdfiNdafK1MtiyzboNoHjOOVsVXZNJ53x2NR1XxFZkUEB0ttiKDwv5Wsc4MaBEnkOb%2BYJgjjVo05HZSEa9GogQMCE9zPG62juiebiGc7PkmLOVVQD93%2B9VAo%2FFg2MyPtQY36I%2B7%2FdNSiJMPJbHDTnNclpriJ9JaVyEcU7Sq%2BFqdKECri%2ByOUFGG4A%2BxkjUHs9O%2FZ7LW8AMd0U%2F2P0xanSEQom6rtPMKk5DNqZPmaERMX830NeDfn8BsmLzrjo8maIK1FuTgdFwB3D3Osj3t14bFjKvAe90DwLEPrR6ieimiV%2BSDBmcPBsPJqDMExKkABH4HFpFioOPm8OdJE9eNZrtT0t8S7rRfCVlVIsVXEI7jwVvYVMNKO2wddd%2BW9NXg4EDDnWI4iVEFK4oG2BlC5x4XAww7LajccHIwHBxjHzd7FXQHQsmyVikAbiApx8oWDztvu%2BXUYkRXaD7AmHVzS5YGhQK14tjyKlchO8dzi6rwVFA%2FLLKMwkgwbP1%2Bt9cdl3S5a601Yyejo2Z78K5i6ABjfj7oAVi7M2oNu0yfqhD83RB5m6MuDqoD7K3V4slJF3rqbbOXW9loC3DQGQJ%2Bs2yJLf%2FaQF0qupQJE0CAqiyLqoCWwD8N9ieIS%2B2mwVm7aqEnQQqxBTjfCduyDO66cvjjbh8GAdlo6B8xHtQX%2FcPJKWAlEpjD4eD0RAzfQ9M7%2B9KZCbEanOJ4q9JdCe9R7Natdqa8R8HUbfcpV0tYv1jAqeZ%2Bc9Th1DKvByTdpupmDsTpPSzpVoXLNNsimCvhFh0uU2%2BNYM6U9yh4WwRzJbxvsbTa3b%2Fl7jzqV%2BZw2MQN0uHkoNsbw6qxVT8UJX5I8cjXDLutbXG3Tkb3qNbJsPu2C%2Fugzr3qYqe%2BRwWkZO8epRtJ6xfdHSEP2BccmGB929vUoDSHrSpycrrf67buWQdn4vrFDzuwn7jvzChK%2FJDi7zkz6mR0j2rda2YUpr5HBbafGe6k9YsW%2BNwbHAJyb8UYOFNuU3Ujg63YAmfKbYo%2BPQHOAnsNBTOHxM0%2BPHH9Ts9yQN6Cj8zvVQE7%2BT2qQAJbOhu9Tw3s1PeowNZ8gjPlPQqGHSAeBt%2B%2FfEcG96gG81un4yMpnd6%2BIs4s7lsVnlX3roae%2FL5VwD3t6VZksCT9FpXAtOXysfoJ3bWH2cLHExggBRantgQaoDDLEaNWaaRrv68gBJ0sARy8Iy5CO0fKd5YDypHXyQmJk1AYwMK5ErnKycmQFy0UvcFQDQtyzEGV5joawXAAnzgZne6PgCqedqgq9aBcGdK5hYw9Phn0cbaPBz937FHVANuDVnFkpzT2YNBr58SDWvxPg%2F3iSCUfKwYZN0e2oBJJBiSCphceTbhAXJ2FcP3B207ucBAjSvKuyvNdt98evLNnCMTAYOC5SiUaFYGW4tLpeACtPj2eHHfGR4P25KDXPHSAAERn2CyiMggBtGIAxVbnNe68H%2FNKWlUxgqSfWpCnoyZSI8e4WPHVmTgk5XmA6mxQmFwJUJ4NnqZ9eHcEKF8Fh9JlqBWzS1WQBQXvd4jRNAWtDrBes%2FVz7ngL5jWb3xwMbfDT%2FGFYMfS4jwyHdRTRavZap70m2kgYDnqFpKyFw8sif2FqYLJ%2FOh7jIUJe3O4ABkoMW%2FBjNzQQnR7g9oiGTqnbAcRpL1fbYdvZiGENAb9%2BlGotMeLcy1m94lSErHgo%2B4DkriRHHcACOl7gaEYcDsgvSHnwg96gOd4CvtuHbQgxIHVT0EFLffBhp3PAQ1OYpjcYIQp2WkjJkcDJtnSQYerXBT9ujgCd8%2FCIEdoSzOoZkHM1WLsDS9LgxF5XnaCD1qgaCtdwwtg6sO%2FHnSEe1LBSFk6l6kQDWK9q1LZgwXeDnuQUZlxwfLJXDXc67DmAspnBnGIpiINE2QCiyFIo7TSyFK7zvtU7bdfNlfHSBuGHbQHKWfnjY1xoOmNkMspPFWnTTiUeOgoR%2FcwseyUn7ZoTWWBuCNwzo3YCx%2FyoOTVyYBUQ1fOmesq4Zwt5y0tXsFVgOKvKYRg7y2Ecs0kOB0n3cKmhfVyhJmK2leRHmEtmBf4edIfHcovMiFsFBSx49223fdrM1RR%2F%2B6hSRaf5jsWQfk8GgL%2BlEGKnKsprD2imnfQculYu%2BGLQsejG4imER4w8EPsD4KCa%2FaLodi7%2FLI6W7KJIsT4XReNiXBRXQOQzAPEsSUEssrZFccTb2YSQOBVanQsIHQGgWlBTuAf93geUeOSbB3EnnX5ZPmpYyuIqEztYRQsgz6%2B0FT%2Fnrvq4e6ya6cDZdqdp6fMWipp0fRnSker%2BD95CKW%2BflqYcbvzCwU5D8J47%2BKU7%2BJU7%2BBt38Lfu4Ga3R9gFayCZ%2FKuoOIITG1oDrgCFYPs9EHvBUgFWAaADbTJA3Bkhsa2dsyuBq4TWKbERQsd35MxUwIw7xye4tSvJjSwvlvUgXiIZDMWUPugC9GAfaWdRiwx42PVRY2olqeRVGG6Ecj0i1ojdlfIOmUioJI%2BAZxmi8hbXrFNO2mViZCf6o6rZJKG5tbC4oPqt6IE8BZHQGWNRnCMuT02AGJ106Oh2WK%2FaiFYnvdPDbr8ePOGfwh4kvrDHQjkWxDuTCW6tztDpoKMJ7NDKJy4nKNB9FuLEOsnKISsXCoJCnfuKYRJQIxxyOeuKSTrBHzf7JDbj6V4A1Ac2rqINynR3RStqdh5qHNKSXF6x0VGn12PZU6YI6ljoGBiXrKF2vn4y7A6G3XE5jeekTOaETKH%2BBR0zMfDDp7AhqEMttGRKd2y7ZDRbUNFD%2BGsnZA3ok%2Bb4qH6aERADmKSjwemwVbeiCkGrIWmyVqK%2BVMIVOrkshqyABRYFxV%2B1YIGgDuh2Ryk0Kwvz%2FUU3CNM1ISwUTbebBysEvlXU0UCsjMT0seV6jiLz%2Br4uoOwEoJqMiqt55jwoKp6AcUBo2ZYY41iJ8NIWu10RrlnNF0For8hyA%2FtgKAdRcL3ECee%2BXCJAJVKUlmsA9Zr5hrmhBAbbwHUWf9Yjqp6BAq4GiDw2PHauIQ6gPH%2BnA7H2bWk%2BBFKYixTlFu%2BaWO4sFiSx%2BclvjxiqbHPF55h08DYYuvBPANDCjGa5B%2Fs%2FwZwdFQMVCah0GIdUSY%2F%2BCahQcSwejbqjtREqjXeJFXWQg%2BZbXDNtmZIO0u3vD94XR8O0Ko2HAcHTp%2BZpv3VUDDXq4L2akngYszEQnpJ6Ip5Zsair22buoDn8UHHaSTpD8vTdjUEOCBfyy7MmcQY1dBw5aTBCWQuiYQmtgnI0UsIcwJ6UD5BLihs137ohDoEtHzZLVqjDYafTr38uKLWPWoNTKVHkqZ7vLwZVTezjFHed%2Brrh8gTDgsNtU9fJZhQAFuYoqKaEP%2Bh2em0XIWHwTAetjCxnSjA1wOTSXANUKgRDdDlPa4DXrIfq0ppdQUtAZbblPKECKc7lqNtud%2FpFB7VH0HmT3tteRRbiFpGYd7y%2Fr4QT94Qr4Qr2vMCbDB1rWoU8rtseVXRI9xin6DFvzHJTVIuFyf1hBPuE4vSA%2BYPWERDUHAgyPUjoqIMLI3uDd4VxPJOtaMXM17uM1wUG%2Bhi1KUhXYnharHTQ7Y%2BLaJwR5VgA5JF2FTMi4QpEud2Ri9yWHlhkOvakT1E66Op8hjmv8lx10LLzkO6IeP1tKpyDFwEu6HET25ZbXdrD5jtwfrARE28YVhwqIYjg0vpj6LS8npqCKI7pD8Zd%2B5Qju91IBh%2Fsq9ZZNLJfeUsEWTxiau6URIiFiofXAsjTORYZScmkukXbrVgHOJl8hZj2vjQcPBDVKSkFqeh0hHhYamjWTws1zaEAqa3STYJtsjmGRnRPhAJ6dqO3ThcISRQ%2BL6SZLSIhXPZGc0nSWoIQHb5qf86wSAs7uojWJY%2F4GTjbbv%2FkdOwgXrQVJYXkTrUAwRyG4bgGGvS6vaZjChcxiCSs5S2WtZuqgJMilwqwvFJrDsSl2ZoDyhGHHETBaWgOLq%2FoKgTWB9U4gM9sV%2BuiiZM8lvtoGx%2B6IlZwSl8e1z9FdYfSfdMx4JXQ1qhuhwAm3QlUaKnicY6b77vH3f8BKlLQ5GPn6iPV%2FppjPGnnHZRjjZBg4EO9gmY1ZGc4xHOoMpBun%2FmC4ry6%2FYo2dfu4vcwzDgB%2FWrH6A5%2BGxy5IMCsWSIAcH5WcJtNeoO7ZcOXGgQDwvbXTXrN8L4CQzX4hGVNMRxEnWMaV9Ae2vzibQU2lbAB0Ju%2FXlKgCJKo7sR54TvdwG9giPUWxU65ZG4KtzYkJ%2BAJMxmPoetc5iiCdeVYNCDJtVeiPNK1gG4BRo3EFlmYCdla5H4yFUn05XAWMElkR4S4EY8LsiO62ijYdEI0KC2VtUici9bZctbG2DGUdtSiBduvt3mNKqAeukP7x2gU9Q2cwJ7DMdi2B5mBId6dqMzdAgIFnbfZwbS%2Ft8dMhKbQhXFlsdQ5v7fEenI4PB7U2xDS%2BimoOHcJBVsyWu8NCiILpZOnT5Ek6ARSgLbDS%2FUyfrrgfkOWmsZS4KzRjbSjWW1AasXV1mlTjiybDyeAdG5wRG6%2FCY3oFyHr%2BhWB1DrN%2FASLQPeh2mLd09KwDwJENzBrs4dKicONeG%2F0RnYFhGNfjbY1JUhLlaJ8Rv%2FWhawYu6IZh1aZkDAsTStOCWycURtdqJCyYJxZAmYAgUyQmE1Y1LE5pKdrdEUw1HS3LE2qKwnIaO%2BUeJiS1AXcmlUAj6Md%2BO7dW6mKt0tWG1aXpnqjQGEPhHWp5O%2BFIc0O4K1hiR4oa4EyO6kDWkjMIWHEFlmZFOfgvQoCSaYNLoYeD6GXgAp1rwaqjiZolEG%2FZfNvs9mjX6K41ARWI11W8OCAogSA2tE5RBTtmjK%2BhO4VggLk02QtanR2Z5eJEtmLrtv9hctq3bXLnoFhDOmcj1w2HesYVcL3OQVWRtNGogMmMcxa3oF5%2FShlzRze2MqoC4%2BuG9aAqM8ubzMzDOG6NFAC9eF4P7EU9sL16YC%2Frgb2qB%2FZNPbBv64F9Vw%2Fs%2B3pgP9QCq9dte%2FXGaq%2FeWO3VLLTeWO3VG6t6mdXLq96w1xv1eoNeb8yLhnw0ORl1TtsDnT3bhvrQuwb0AhLrAuYhYF9dfrw9HJzSCVnnZNI8IF0u2%2FyGDsHHWkWGOjRIFFZWASpdoV7nfWE8com9XsdePjIAWNW7NtM02hdXL3CbVSqYMyHLDiJH%2B7j0jqrhmJGqkAKx3hErWFdYLmBQ8krGpcU3uYrgULEKOkVy9XlOXIGyhnlpbkLVqRwIDxfLIcpwUAHRZrEgH0Qnx%2F5DzrOsB8UK7BybHDCpz9aDdFTbhhEXdF7Uy1FA720F%2FXIr6FdbQX%2BzFfS3bmjc%2Bk4qT4wEnJjB6M7zJ24YecWu22vXAidV3Qrw0%2F6oqApl20KpjsTKqJU6SUr4U6mWlB0ACHsMNXW0s3S1gMWhCFtMK63PLz3ZFdJ%2BzIG8s1S6y9USilZsmX7cxE22JPilRKQYVF1VL26gkXhURy9MGZp2YbdlhFoqAzhwwoIUpiDqQDprJBV1isacJSEk3CzZ%2FQowHhU8PmjhTeCc7MQAI%2FMto19Om8OyzNy6KQYIK3xW5iRE45VwJ6dD1MeohKOLJ1VAo9PRScd%2Bs8SA%2BNBhWYMzp7bgkI4AYjwQVsnKhzS75kAXH0qis7lmA2nEJhfV%2FblDFxTqnruJRyC13TgzoK6l2QDVmNVi2PK%2BsEDyYlkBUiCqzDSo83y3o7jTfWJHqhg5Up%2BWtH3SOh2SEURhAq%2FASJCVqHN8Mv4g0bUiTekxA1VYP8XMmblyQUyOO7jVGFVAus7%2BCEhQdu51te7keqoctuQ5mFxCPOOuACnJiecgG%2FgSO5RiKH3DUwilb3YcQCVKe1q8mzIaAPzMUVkWpHFYGN%2FNCbu0SKd0nE9vkD9whdN9uhpLpQZdCqYueJdDjWqYPGCozlvz2mMBjJhaBWV12sejymwIiFSaynIhgPZ%2BaSZyp1OSjQCpyqi0VfLUvrwT9a1pWZyzFAMgT6zZbp%2BbVCv2pbyIqhM%2BfIT1oNvf5ggRBcIjtempOGoxgcsht1NGgB0JKy2ThZLynN2Q%2BeGsNg1RbRNCvIZQ43YNQ2YPzOjqaaXtoXSA3nyFA0aAdFOKBWUFWVj3dVwQ2h6pOjsNuJoVzyc5ZYXMSn21XMrx0enx%2FsmwW7GDERcijZtC1RBFGdW7Q0SgNU1zacaQK8HEIapYznoVm2U9iaB51eB1LjSx7eSaF5QUsH4%2FqQZIYVbCZnNmYXnguvBaDFswd6VJKc3aWVmeGVxFfvwQoWvdcoKV5yaGsW4lCy4D50DKC1UgUO4J0Ohmjlvjt514K6ZkPI6rkRlcFcaMtkHykf3qRnWCMkZKQhxmBrw1ujMqlh5Xb1uFue16k3GkFhVTS7RO%2B5Sld2nSuMbiovBFStNrJhBXISuB%2BYS%2BVk%2ByiZrCyx1GtDt1BRa8a3bHNVSy33X%2FB%2BXgpMfWa%2B53eswjCmtqTthfTjvDD2K3etShvX1n3OyR8mbeBptItJ1QTikQ1leXoyRkrQwvFaJIr3QKELh6y%2B%2BIqpidLDk24TUS3K8YwezaB2VmytHgYLxNSkqk4IdUcjUUlmJCvT%2Fu8eY6N67v8SpFpQ4fQiEfR0Qzj8cfbCsA%2BPxzfzDZK81UANUAqakOiNBFWpYYx8H5p%2BzP%2FCQwH7JvDb2DZm%2FU8VbhwlNq%2Bn1UgoFdpDcegq8yx%2FM42qwnK39pZW6s8sarB61T2AngBQ8zWK2i5hMJ2tmFEZGvziyYhkkYrSZni2h6OVnH0TqI0zBIzIq1YZBHmdXNg%2B5wJFSkUbIzRNf4g2dB0XpbFCm2TGRiyQ0xJJVgIfIpgBG75VxN8g2dh4tgEtykwYqaa3Z7%2FwNbniEDKkRCcQUZotm17G5YZl7FI1fbHUdWJSbl6RmmLJd8A36LzioGKbvASvIoNN3YRi31rFs0CNIHOEBsO5oAEvXHuUhtFeiMEZFyYOqxa2cJKlYt%2FIyJ9WDNYc9A9zsH%2BGxuZeUEHF80tCNZF5ctpbgKKes5YaxImX13ZoBXq4VyQ0H0sNNjxYXqsdKhy%2BDQRYIXR5w5F7XwDh6NoNweZyI%2Fg%2ByCE1Eo%2BM5HFrWlaAzzrSmClFvrkom98FfnG%2F8cKenMIqed%2FmEP8bvX7B%2BeKntcsJyOus2%2BFerKeLOaXoSrcyIb8cpfTPz1ehFO%2FRQoiDX3kuVROJsFKy9ZHvs34TL8RzBDd7hS7n4UL%2F2Fdw0O%2BPkQJK4yw9Xl5DJczaxFx3yShe944v1PT5GOLKjjCBOKHlkAdnHmy%2FioLIwEu5nXUVekRent2l4g7bpKg1laxeRBRxaXz34ZrcI0iitonriaWEzVTAAHVTAB8vPLjCdF7rfNXmW8idEWUOmENmHNiWvGVc0jE1qoJQkdppIZtYrScBpUdLxxIc7R72a8Y6UoAChaLKrAzZYb0I5BN%2BLlasCBo4Jc8gNlRJePqQFqDqkZxR6TihsQDkJsxFfhhAFcg7xGZ78F03QSXAUw8CYKzJKgOQfK2PJX02DhKe8iSgLlaweLILW9g006mI9jf5X4UySmKrq7SgDZlHewDrK40TSOFlkxp%2BuZr2XMXlfG%2B8E8ioOsksIva8nerJrSn%2FrhIiuDQ7PqsV%2FWj30Z9GDVXN0Og88b4K3ToHUBS5QIp2KHwTSKZxzABXfiOIo5APPUAU7iYO2bmbNbS8MBQ1iY5mEw01O%2F9RfhLGucCBCZxVghrlzmBIANrE2sQkWcNr0IxJtInj1ZHBqO1GMK8Qea4C8t%2FJHn6YB6XbQxIeROw07bA975bXeARvuV0V7e2Rxl90IE0qINEpwRrrLTiyC2WH1DEiUP6dvdZm8gHk0yJa2Z%2BLHZb%2FY%2BkA6OuCqDy5afxCks%2FEEvmsLSLn3DYBlB9xY%2FWGQ8eyCX3kwimt0DabeQtKG8Blo7HrQGPaW0idZXvY5l1rSHRnE%2FZO%2FJ9T6wjY92fUi6%2B4FiT0eKdll27XwOmWVW67xPExcorgCNu3SbIw7F7ZjZVGHbUWz1UGzU6x6jMqwRw%2BqhWhxgBuEQ5wo%2BsnpBvsNO6R4se%2BgV9Rwrodn2FMOSrSZpiinDFsDw%2FdMuW4zULIMjcpTF7emRtKeHgP3RhxFgjId4q3fT8kxQuuUZ8Jn4M46aC%2FQOfoYfZDvpl0OPO8fy7Xk0Zt%2FujIQkbkQbYuqmZYwZxSqjmPKIszykWRyhdalPpkLbAurSdSFEdsm6Ioeq5IDg0BZ6EE8qadpv2BB2ssRGPv%2BF%2BhRdGsHeYPBz9mpq7KeCnIKrMwtT%2FIp1QR9rSco0sdNIPTLmxcuWDyQ6XvZCoFOj%2FeGYHx7r4nW3t2YArOgdGB2vQAXw9IQEDULRSF3g0983Rkl9RsikuR4eJjH03imKKrp9aVzmCM8kaXvtUcqi7sgOVvgE2BMHYT11bq5saY88JZEso2jgR%2FUsbiBb2WI6kQEaJrgoEnq%2B0xwrG%2FZyZRGN6bzHZ0iVmD6%2FUKzj8CpcBOc2k5s9c53tauj4VDz7lMUL4i1oAr1B5Y5kMqFHSlLC93y1mM6orflE23NQpnV2Xtjy0fLZGByzXOQIUpJpBtYwzOJF%2F7mbLCJxsdJCYcAxF9g5toAw6hWVOitSkpmPEv2Uj%2Bj2Afl7PS2Cdqe5vmDNPLqPr03ufIEFOoIOxEiCzQxYu3kQB0BVHTIGTaWiIFd6CFe7%2FqmW%2FhrQVTVGaPUiUHXeKl9NblyVqCoeV19c6oY6Oe0fQJWKUgitMmcckPAOmUQQxKEIKq8qUhewsOCDkjHUpg%2Fuo8WtdTSD5VY27bAwuqQJdRRWNT3SAiBWUnJHkfDfGcWHi7UnQSw3MsCi77dQGDBHIVgwRtnPFW0XLMbevqAgXp30chH0yqozVH%2BtsqpOnXY0HaVR7J8X18mhba2H9IHxbHUPRmboqEl7k75XpIxdVrFptFxjdfbcfTTA9fqkox%2BEZZww8yIuGDLfXRLPy0QZhGZ4oeiQKmtE%2FoyKzs70R4p%2BmahSsgA8WMvIDfAGk3edfTM6ZzDeitCO6mQMWaXJJ9Deb3NEOPIxbEdoUePM7vov2bteRgBd4lAh9qG7EaQbOlPR9I6R9LFxyZb17o4MJ6PyRpCQVBlhuAgeks5a8VsjApSNUZhBmV61HY4zj87neD3NznYLQcRu0ITiBwyyF%2BWM8I5ZG5I06wGatdBc%2BSjB6pBig26Y2gAhCyhdq8NyGaHxLyMgs3DTNZNKRunnzoei8Do9Vw7u6sXs8ldupMSG3AhiauUKg032sHXEb5%2BUAPEjNoKZdEPoL9W4QaznZQqA1NsfpWDS2Lw7lncnONWcHTHSHqxxx0tC79IFz8Ea13uLYJRmYQFA7jUcN1xuuEk07MRrvvLRGuengYpx0KtCABf1MoFR%2FsfPvFTF8%2FssIzeYULF2RCpDQvk444qMHkFyyPzIKBEiIaS4HVkNUd4JtjVLB4RmXo9sneZBmAkrI9tSu6UkpnRgayxLJnAXJkynmWkEOeKVpNYJwPYN3HGDPptfLmiJii7EGQHFMoaK6PyKomAK0Y6lr0qdKh%2FlHAURVYCVFCs0PAticzTAjCocNSWCzbML6j7ZsOUMR2LnjHAwCiqqYD034zvuxGwryRmVrfTOaCfFk5G5BVzZmixeNnWQgmzxMTh3BFFtZ1QheWYz0%2FJarmELU0coTcKlgmDps7TOZaCJbhRGm%2Bt8SDGsNVkp4qjTM%2FNgXVCovslNa3Hdtp07hzty5wh9RChYp9nmKyoyNMN8ze64CgKK1dFUQlU4noGatSA9ayEszvLUJ2DRjNMxTdrjnOhvqP%2BCxjNp3yH9DvHzfnPcOuILE4eVYDoWOoCyoE6f1O9LYHHjuhU8nZhDPQ8zMNFt5tZJmEzMaYFqMSwdtkLVixV2RK%2FTP8x4NRmKmvtdnTeWEblBlxEWkVfBdKvKDiV9lVybdDyVYSTz1MKcrJcR4Vigi%2BJdeGfA5vmugmhrCTWgHD1TwHSpKIuEGOHaaUouPm%2Fe0caQAs5NRdGEFSwJhuYAiji7QoDSTi6a%2FRlAEVunKyO7kaGAWyuKL62G4MWMq8H5aD4eLYq1GD072ubzjHiTqhpROS7PHVuEoU4ezx1rrJUGSBGK5xg8K8Y1bC72zoy0uDsz0onwpbydZXs1iyCeQff8%2Buvm%2BStpFe8Xy%2F7AyFywdWKWmUdkt1ZGdidmZD88VgxSHuvYEbOE2jy4MqOMyz9mnM0byBtXxnsfuWCumHr4yIRqD%2FQB5DBqt3XB7Bddsd4MMi9xmXG03ptB2SCX1ctca%2FVrTpngvDyWLuhWgDiEVeWQlpyqANhA1yIY7QJtBWh2Y9YBqG5blfaLg%2FrqN8F6g%2F1mHtVH2iVXR3jhoKvrgjJYu%2FgkeP2uS7k2DpLNIjUl7%2BJCxNvmUB56G35g6A5dOW0WwSScBStxbJO%2F%2FUBPDWQrGpl1h0q1mv2xJNPGXXkXQN6svIIiUaL24pJlrRrvpVuwpq6QGUlnvjUzyo4muZYjK15uAaTOrh0rCygEECoedDsfKUWfKJkbaJgdQOZAj5s%2FZ83o4ziQ9FlGoxIFarAWjRSq7oijkT5tQOlWvcjPAhqNs2bzC0Ck8q9D8RuAwnKSFt7HrDNVGSNOjv%2F%2B4BSVs1xR%2BRHNI2syjcN1WqF6bFhhdKgeG%2FEO5V8jvuQ6hwFnKu0aUdUa1cnmLPWTy6p2GVaJiu6FWFCO5psAIzpNFQbZnRCaMnVRKZXq2ZXwphayCe4aIwNAamhTUEEmSlvPlUFVN2oPRxZBsALUYFgIUONOT3GKKli6qVTWhxZ%2BGnHqKhKr6hZBSc3yQjSod8%2BnIE1NaKKWrAFQACPs%2BbXLW1OMTGTDVmqPFaW2FePNaGXLtCQLU4ffjDvt56YJSQMHhTMKF7d6Dcdr4XQoKirJlqdKqdNtkgZL0leIVsAn5M776SmbVvbkJfGiFCi0DZTfiBT3KZSfXx4vLH8W%2Bovo3KaJH0bt3qF8PEPpCnsF4TpTSvGGirkMpYNJ9Xy1FHZyjMyIH0ikfhQqlQqGJeBK7TVTYLYgUNbQc1RaaArnwi1FWhkMayi%2Fem1uk7Ioyfa64oRutGHCLIulaeZKRrgDY0kcrSuOUNAMF7scYClUOGafayaFunqvEDMy%2FTtUR8ljCO6o8w%2BRiR3TgW47hQ8h6HkUFVugnueOzxTy9HilHoZWAvM5lKvdSTBl1YCIVhZs3aezqm9F55NpIahFqQUIo1Kmwp0RaeixqRhSHB5ZXo2%2FlTF8iqR5UYMF6JcZYgxVNv9abFMin6cBUJaY1fks0bAN5UhsdbBFEvLBZZVUB1COOGUSzxX1XhkAdUSTsXIZzDOc1S%2FpnEfoXurxhn6mA4Q3olbDNdpOXkkvWayTC9aFxlmwCsALp1YBeLlUxRc8M%2BqMljd3VWJ%2Bw1J585PUfBkpC81rh%2BbjlKyuIC4f7AhxlqA9PKSF6pqmI35gGCZYabw9RfkiQpbnQOscZh6YVzCHUotRYby3ybzCmnvmZ%2FvPBsUyAu0%2Bt5gYswZmpB48htUl85siThlMC5NVHIXR2atZkgo3Q3QppAjKT2HmY4SHNHCVJxN7OoLytIgvS0hNYCWQOhC3fHRPPrHQ4pVeYePTtJDjWlRT%2F2zhUuy0VlBasMQNrWMlpjWC1e0uLdRRXpBYLGVmwFNYuXRa69QMdOpgljXOAgOcbpubhWY23ZY1KbQ72v%2FGLo%2FCchlrBtH3nj%2F%2FRstZiynopE2ChgbSi0CwwZPrcDWLri1eJ%2F%2F08PQsaUXLpb%2Ba9cLVZYL%2BdjD3N4vUa7keIDbfGnY9K7yU93mX8eCyvKbRdLPM7RdMpZSWUO1TdhZMBZQOMYNF0ertUA2grEKd5gQ6YgKcYny7zgs6p%2Bu2n%2Fqd1TRcXwQx1ryzwrkw8yAmPA9TfzEKz1d%2BuomDLKbbxp8k2QQxOE4Wm%2FNw9TaI0YoM%2BEdBDOOFjg1ddO3DtBK%2BUbhcLwIRQNduD%2BJo2caLt8I%2FjshX1iTAtN4kmJElBKMxFDH60B8336MZIuFCa07Cmc%2F12g%2BrRGu0eSyULGmxDpGNFpuXZmiR5WIPDdAUaWgRVTIF50YiprYulzZWEPmUVwI95euPlKGs433kZqSPX5XJfIen3czT7Y8PMh%2BQ5fYoS%2FhLj2afMogl9sWO6mas%2Buus6rLODdsqVaPEqFSjloWnRrF5pEaV4aFGoQWWxhYmVBpO0ycNp5GRRh3bII0aZiwahdYNGoX31hu5W%2BUN9%2FXBRtXlscaWF2saW156adS7i9Iovu3RyB9DNSrOkxo1RPiNOvLwRplYqlEsM2pUCw0abhaoYXMqjTqrcqN8QWzUXJ4alTS%2FUUm%2FG0VkLkdfxs3pNNqsUkQJpIF%2BeprA8uanh0hD4DuMFq51CdJhvcXieAz4TKmDpQhpLq7928SDgHaYWCECZLDaj6EHAyOI7lFrqSRQZ7lOb531mM1OIkBZXISxBuv9AJZlz193VjMn%2FAIWdhwagl70gjmUtxiG5xepEzwO%2FNFFdK1amCz7QCOgh9CM0%2F4mbW2SNELDThjSTHp%2Bko7DJfk%2BBEkOgDvBUZA26burK%2BQJaEINAz%2Fhlk3DuEWj6YFrGFxFl4GzgRb1oKSp4ma8KbA6SH48LVCEuDK7CKaXeDN9P7rpwlwapcimYJaLs1Mg6BCLrNHirJU5D2P%2FtqBqaPIExjiZUhYBoLc3DUSfTAPuWFc6QbO4LW0xt6AFQzmzsTVEbcBxurpcRdcril5HMQa1ac6C4wBWIUIVcEaLGTJyaUfLcAy0CD4%2FRWfw26dlAxytaJXG0QJDnbVbzQj%2FDtCsF%2BHVdN5d8SrnTeeAyuuF70ReSLoKqEIIzzg5DU9XyRqWajTgAmP9Lg6RTwwBE9ydGlHSn4EeUfJL2bBLrWGX3LBLathlSxLSMSAR9MVlc3ULv1pvXsrevJR9eCn6sKAG0D3ZCCHZ6hDVgs7bh1Fd4HeTptTxOk5R5y7PIs1JFGAK9Cec4cjtEzjHgycDbu8LSHAsFuE6CRPyHAfLiBx9%2Fyo897kS7f2hPwsjJmroRUTewGw9o7qpMiGac%2B%2BuYMymwVFIaCHyPPFXBJ5VnnJVLRuG0wuR1dg%2FG10EATrfBWdMw7Ai3SWs0vA9gs6KcaOG2YlaQN1hiQ211gzDszOV89swuKaarYJY1oS%2BslX7oexk1yAhGsWAaQJf1GhBubQRwZxT4FxidPYBb%2BJwis6TcHqJXw07YLKlMaxR6BoDP%2BcsD5oCpEUVs0izKbFIT%2BJw6ce36ESu2ZEeN2ijIO1caXXNWVsyTENZ1pxMC1Q5%2B0e2saftTFTlrDXZVqEsG1amtSWnnagiy03bmbjKmYSyDGblrUpZdqhsG1mWXS%2BZfxuoEfIfVgfYxrKcRqscFrGKEUCtOLMkobkFX9WvieAgKAw5kquirAImzgqT5oz18IXVPVYe%2FNLyDW78QunLdVGWg%2Fk8CbIsI0gN6xh8j6JNTI7jcLUBVhKdI%2Bjh1cy59MtCJQmfpZerGduRIufpuOVMFvjAvAVJQswL7WD9uA903fNjohV%2BzNxUfLCBwXflINYHISdilo5qMPMpB%2FhSFo60GC6ZomAJtb30gI1DYOASgLFA3w0uHe%2FC9EJEd5cy4HS14CBhaYylKH20lRUsEUNhuCD3cH6rYHrhHIfjHCHEPIUoYM9SmVyVAA4ugGsQzLQ6QBYE0DxjwCFMWqr0sR9fNhNcZWHZld7TVSwDToIYMHyJSaHX15w2gf5TNRTjwN0wjDZUQ3QPzgBfkbfBJNMIXLcoAKIhbkXrrI3vIiiUxpSwSgYzf4ZB40hj75zxJ36SXONcdkUSdlTkmssAemw18%2BOZbNFhwERfDRShCvQYNGwciY2oGpsB7Z7tkRYmUuVIZgOYjXXrdrpQA95cwz7nCpYcA7UQHlYzmGQIgwOM3SqQ8HRFAVEs%2FMI3kiPBGIIJVBBWBjiGwJhWOGbFDDKzOczY0ihLcgDjnB6EsHdCx0kcYY7uDJZJM5OEZHMw8KGjvcBnBPG5N5XDHBRXvnJyY7tVpWYwy4EW4BcmG8pjyP3LBlCyNJdRGqz1fRC0ZslYAA6yYFWVWoyxqkpyleJmyZMOQb7RO1Lsb3mmhGmKpaf2JfPOTTDdcFbga8bTi4JVwc4o66QkHf3Sk1gBPhrHshxE20ZA96daPldJyjMOXTYwjyvGMJqgaxwsge1MhW809YHXm9UuXa6UV0rwj64EZ8xVIrr3KgE0jYh6urJUJIEaIGqfGjQnzQhE6iIbrmxvkGBimwHwPAJUowmigmGOvPPjFWHjtLua01IduvlYSdLV5jXJMIpxGz6SWgxWCzdai0xsnJQoaWLkVfH8OAiDxQw5FZnFfCZ5Y3BJLhqckrcGJ%2FEa8KXpA1%2B5XwXnu3AWZMl7fnweyISuwmmjp0qGMs5gUzJPgS9kx4F%2FFSHbn4CbZQdibzgnKY%2FyqP0gAv6yAYa%2FR%2BJaT3BHMJ8wZhT4MJtcNcHN2jC6PgpIjAKVOY8vmps08uD7%2FgX97tHvS1dq2guh0Fc25WLBnQPf4fgAP0fj454rKW2ncIJke%2B9wPt8%2FPvHg89NJ5xC%2FtKs6wRnePTjAgBF08CLQQ%2BT3xKk4z8VI0hcuvycZRwKrd%2BCFy71XZ8PDfXC8ODuOVtH0ApYU5%2ByiXGQbYa%2BGtUy5kum7Yyg%2FLSo%2B24xKHjG8vNAnCnjlDAInM%2BXg6EfdqXsa4RaddoI33GlTiYXhVGz9w6mirOGUsDAGxJ0JeUA4bcJW7jYNpypA37Edweq0ANwCMMoi8%2BNAWSC9KLo8XVuB1g7BiuXdBiOknRCoW8tfTDcL0TXTESzrU2bI7GyQBThhCeqtmYiiaN6fkODfSilYI6rAkETjrqytsNHmDOUwyHBaMUjL3f2HMc4Owgi7czHM0cEYXN6fQHQ2U6SmM0CKK6aKww2itzOKUvMYlEHQ3hEA3oX%2FAA7BKpIDD8JVmNhDyFHINBRGlKTTJdNlAMQn2BDMXf0UnSV2GEsDExsHnWNDDXfG4PjT1sOuGXD%2B80V0TWhjDyuL3tz4wXHuFM4acFQ5OjCMA5M4gmQZxPO6kN6RDFvtCFYipeMgvYhmAlOVhwtTXsFEH8N%2FoKMyFxdtQ0E18KpE2BJyhQlaY4bP%2Fi2ufNCNsGs4dzLkMPaSyP5G8tLfLoUg%2BLfLckHwT1GoWInfWE7n%2FZbSCcNvKZ8w%2FJbSXvy3tBVH7v0ACQNPItrOL87WgCvAgoBjPwDsQAflB9%2FCI4se1HWFR0iKrVmksHnNZM0eB9BBjzO9vvk6gCa3ogWsJ%2Fi2xRzWiVkwD1f4jsUcxtuHTTU4DuMAX7yYw5CKCNiSwXcQk3gHXL0QYOsVN0pvFwEXl3RTwLUpZJAgX3QZABFHj3hBw5UdYCDO%2FDaKnaM18seZuFt0yGKGEkx9A4UhTBzIKZZAdKpFED0ETEhO3tyqiIHWukjJJJ5TBTBE8e4qRIjXqXTaedBccaLIsX%2FD8roWntzB6gM9Q3WU7VvG05h5d3LRQJOLHiTxF%2BzhgylXAUNl%2FV3meJV2Pm8g4VV6SMQwHsQyoAfzMfMNi8R5wwCX1qugLTYp8ewDVDyIZ%2F6tF8%2FGkfwuI2BertF5ESbvguBSOIG1Si%2BE%2BwMsu%2BDsA%2FMig9EtoJF115wM4awRDhBskIAU%2BHIHGc%2Fe0cGuF%2FO%2BK56dADueumcKEFGd948V7x9nvH%2Bc8f6x4P3hmwnTwSOOYNFJbC98SegeZ3uD2NoNYFbycMddMabuhvi8zMi%2FI5PRPgolZeI0PVxEZzDGacqiyZTxKk1HdMruzIHYI11skCRLIbIFF%2FNl6CIOPfMyCKRxT3EGVFmqfJY9IBBesThCbRllm8T2HHZ6m%2FQC1RhQBgPDp%2B0gi%2FIheqqfoyTqUIRdge%2FuEoJJRoB5KiUUB%2FQag6DxaR%2Br6C%2FIW5iBMTkTOTvBgbXyQyfLn7FpLJNrppDV2SY7Jk4iX7UBnBKD0S3xDt2IwynKyNGjEFmcIGAYITE6CIvRsR8BU%2B6vyJ2dSqJP4r5WCKw2C7FQadWwQrmeViCWZwXJylrBokJWqNUYK1ZV3AoXTbBCBXok5JHT2DEqiiHMTvpTP6YQ5lW8zCuZxExw4soQet9Aj%2FQK5SKQdpZ44O7c%2BNP05CL2YRJi1Aqzdc4XLJ1RhU9LMbNNQlNmg7qmaxQjzcANi%2F4IEDDGcFz5ledDsIDqKi9xCcrHvIHynmxiyFB5DyJMeuo8fMGKydZtVOdumCBtUrH0k7s5W%2BJOIY3pIHgjiJUO0Q6TKbNGbnkjE8j9TbiYyTLPoNdm3lnKp13sHsTwA4wifYvkTigpl3Trakly8ytJvq6W4sC6YFwRmkEBQGUC1I%2BEGd6VoKJr002n5xjQj1RiV%2B76zkg283oOUyoOrsIIxh49uMiSQ5wHopM3YsVZEtu%2FCHDeyI025x2sM1YSfYi3L5XrW%2BX6gVyjdci6QehpQ0ZtHHL0aAf76D1Y%2BOcqLdRIOb%2FJnN8r596LzPkqc36X1ei5VQhM881y9cIZuucMdcq8cp2TdXqQZmKHADkPDBpz1wf45ES4DGUwqw4U5k95qJzXkrqDSxJ0cEo6D05Jp8GpTkLBTXQcvlyJNc8z8aVnK8CtqCOKpXIBEsqisBLWESxTsJBSArL4hN2KwiJUKPSrRc2LuwSFByywoT5JYknIPHAfRozi6MowH2CYVUaXwHyEANR3MyhZSarvkxTHGtJp6x94sD3EroDbXn1EcHEp5mEhluKjAPzaF0eVQQyV94%2F91aY4AyVzyGp6xkek4BBzG1xiB0yRwRq%2FbaFMjO53fkjwx6yMS2C8gwKX2HeKYJaAodM644OQE3%2BTuEdOVFRntq8zvhqcBwtYZdEhMVyw0NczDZFnGX7PWNMLvriXxwxYFg4ubXxmOfYGghj5Z0JBEmFQQzKrjsYHyIqZQTnWRVTWDJHVNkPzfItoihkCjbKqQc0zw1z8TL7JZiQ23gyRhE7PASWwRkg2VWca0ZiJEwXYghG2yJYHPl5hCWS%2FjAKCzbNZBZjCOgA4TwlPwh7s5q5D%2BeZmeBSeu5crSEr7e4VhcTqK5lB2nB4V7CgwjTp2u05Ik%2BA6GW5WJIm%2FTtrIK10nQmyEt0iuE%2BLlyCXPrguzRnpLjAfkJlf863RJIiT8xtGytYljwtV0iUyH9OYz7PRPj%2FESgaHw23Dp8TZMpdqGrjPbsDRiG1WKq428QmqjSK20YWiINjS9z0Zey7Lh0J5smNqQDVM1sVGgBNcwldUaDt2zhqWO1MjpFDVyKkENS7GnkdfYaRSp4DQ0%2FZpGkZJBo0h5oOE6%2FW8UHebbEfqZaKPkuN0Rl0uTPxd3xcou1U6fG65D40bh6W%2FDfaTbsA9oG8ahacM%2BuGzYZ5GN%2FAljQz8NbOiHeo38QV3DPGhraLLpRiZpbmii44YmAW7YstxGsXDWGcWC1EYNoWijSqrYyEkFG5ZMr%2BGSqDVMIVnDKZpqGLKmRk5u1DBEPg1bkNNwSWQaeVFLIy88aVRJRRr5DXrD3mI3HDvlhrZJbeT3kA1tK9hwbe0ajh1Zo2xL5Yo0U2V7gYaDF27kuNZGjsNsuFjGhoM9a%2BQW4oa9vjb0xbPhXu6KjIDMBQnii7CzGTCVgu1rzn4DTh2Zh31YpS4Tr7lEZO6uWPpBonnUrG7GsX%2FbDpeE6uxDtmAfvDP2AtOg%2BQZz%2Fg4DSOQ1E1I%2FhQ%2Bi3cyjGyeDOQuahecElxmIwubAIM3DBaqjwFgxoZYVafmLBZ1rzfBuBmwuUP%2BQBM8tKlCMpNcSy4%2BaPR5Lb2nmCe1DybchKCxCGBzTD9ISWnEJBTQnoaWHlMCPhd4JQIq7Qp0bWJ%2FJiysoDxSf7xJvCuAeqTDhD9eYTgao2sLd8qcXeDYiZd0iNDuI4gBx9CE8sFlBzsAIFJcJhEdJv9ivFc7E3UgKJHljZoZa91oa4kWFEw922Ika%2F%2FGt6HXPUGUUnnWwMrKFYTyPUcmPvawyxG67B8TRkNDk86%2FMHhBbJ%2BH5pXcSXkXZMZRU%2F8PB0qo%2BjgNqCZMRmR%2F7IA9w0o%2BaKYJRRCKFBgozH%2B2ihV%2BqZYpuQLk%2Fdj%2F6ocrzuScZnMwTIV60ccbQEQyrd1Jvt8OYtoG3ArHEDS%2FCRoMr0iOQ1cV1AKqsrUgS5NgHygTkeRSsZiYE5AKUcYxAXnuzlkpViEckxGB%2BN1%2B2Fl5QNEOUldxZzSQxIKcgBQptRfuVPwGmUfdBGayaIL9SexQSQs1v1v5q1lldhXFEPPlbPw6xShifxv6UZCHtGDXXtIAONjrz0ihr%2FhMfa8t%2B1nfxOBVVFZ0jvMF2AOwKDSY6MmQ6COOl5HFg%2FQESJMY6hFoJvok%2FRK%2FYKcVO7AP01OJkvoDU2Ww%2FDDKmxfCwshoTNwpnAoZuPAA0crA39ByES9I%2BUPc5zAVUb8b%2BFM5guRayge58fBGsvC7%2BmwU3sCbotEVzwwyhuy4%2B6Q%2FSet5NsNuQvsB60U0OY399EU6pK7uJ7IlesDqHYehF%2Fkx0QOY8WKYenbsRnxThlQBYovBmRhJ4wLp5Qi0CryVlTqjJMU7PABnrfWDKgCRlAaIQDGDWW4PgAAWx8gChg1u5kKKqN1W%2BH1xDP%2FWBnyVdcAwaQK%2BexFI6NPRDqCCuato2EDeuBKtWOzUsLazGLVo6lSHQO2fQ%2B9rAiSWQOjYfzIvaEJbhaEULldT14CDOzgqkqx5aEN21gy%2FfvRsGeD9Y1JMYfG9IvIEgr3RcjxX3MnrLgUr2NNLQEtzH%2FgoGaMaIRVuUhBdYJDgSMNHRi5hhHldvtAiCtTeCbR9khmX90tt73xuNm%2FvoVNwG0iax0sA4CgsT2aRVLmaC%2BGBEdIJHlVaUnU%2Fn6abRAjfQmNE4Bk7odL0WKEhaNcz7Am6OI4Wr3lsWCQTvj3vgjrtJa4HH9%2BTkW73k7KNQg7hAWSp1PvW6cgE%2Bk5tX4iMgTrgvZLPnz%2Bnzss0f4dvnz%2Ff8%2BU6AvjBgvtN9L14ZcW3984pze%2FWNmY0oo8OfpjDCzqAM8mqPP617J6TP3nO9bhLk%2BxqZfm80QzSxU51w74WR8GDb1pSnf1ij9l46esoaN5FgT8cCu%2Fp7BoxI8ao0kuO4%2Fi%2B%2FMZrYMRN%2Bo6fYe1EayT7RR89doK9EJ5lFHuifFy91SKs7RAd8ayB8y9X%2FL4x5I%2FvWrFPbqBqDvjgwihcd9tLZpo6jxFd7BozMRzTY1ePmhJe9cGA0%2F0DHG6sZziJeHZgwAv9eGBV%2FjrS3GMwcAhPpX3znqt%2F3Rk%2B0nHm%2FMmprkDdrXpkU5Lkzt%2B%2FM8S2ZHzLFgTGw%2By70qpG%2BFpq4MFnSLlHUdwYKvjCGWeDuD9wbJln%2FQVTfVdKrl0ZLDUySq0Nny84wx0uMkCJSnpG3MQqy3FJc1cfbpBQv98y8TcIhcNGYxwUIZmbzvdGZJnF%2B6WiMWcQrq1LmGm1M5wIkNkfhhY5SJo1%2B5U7%2FjYGEznWkY4C%2BeuGo6p4TdO87Y%2FytBUyAmtO%2FtXUD6pAPAyvM%2BSaRQy9QziUDfW2SacI81xO%2BcE0GCzette17fTRlb36vg5YmtKjXvoFj3xkoblINSSfum9v3runnJjBm921dkomhFmHdNrcCTsvoGpPAmLjwjbNcs4cl8SoBdWZexhM6k7%2B6N%2FdSUqfS5v%2FwwAINdHnRMQp8WQZ634kl629S9KaocRmoNfn1EXppVNwiRE09Tu6W3Fh73wI7RtwfX%2BCeuda9dGVqLvIWkW0aICaGGNtKyamYOPitkc5sk1lhsfJKOmosPAV40jTSi22NWVMzsM6OpXamzrXJxHa1RJTlLVPgoUqYlkDumdO0ZYyFycSVNaZWu%2FcdrSlf00vSW3zygTMFI5O5K1XT3AVqb7lKYRikVKpRI72bfyhJv2cyvnI760xhskFml7l3OFxE6dagrAiDBruHUyKASRq%2BN7HCSGFnp3dDrUltLFA2uXdH%2FgEFF6yMJqhbdOKO5JJLhUUtoyyJJKZA0NrCM0gdmZ8rsx%2F0HpO7gtIqmukNQlSLRtbIxkkOSxLUKcImWQb%2Bujg4N95%2FY0xGkygaqOUuqOms2ncOrFH47gItpykm0%2FetgQv%2FdkmbKcZ08aqlo7cN9TFkq7ZowohUhVih%2FHlpdFzpRsLk5cSK5xJVOzf81i7WLXyqXYSQJr80SYFbvubK2xJF7dWBYRD3uUX99BYr6hkj7xaAGlNNoPEP5vwx%2Bm3PGNpvSkqSMHJfYMDUlaaW0Q6TdzPR66FrfVm5JaJn2Z5vts3G6mXnTrhOhetwlyaoJQj5A3Ir4Iqce9mXBnY7lxOnqMhc0s25%2Bq0YmrJyWwaulmCPU3z7h8qC%2F4j6WnupP64I%2BxDlDyjJRC9rrkuBrlG8ORFfPS8uUBF45%2BbLudcvY4GeG5CGyNek5NYk%2BTeWy%2BlKN2cPq5N5VmudGJh8r6CibhGge6dSlkIwQjXO%2BkrTO8Wb26TQfQ%2BtjRX3YutMReRLx9hIrsKd29bZlPZbdXpxmKLwxpneXBQsMWdZwU5phlOwWXZAWz9Tk1e3lk2nwoaL6yif31vX6TsDQcv4dStTwUzuOZpmT8k6KfS2qfTGmaZAFJNBUVszZwqxQTcGU64LBQemZuAWoGYD9Kq%2BMjZD5sbPWpWdJVkMYrUIu%2BwwShJPF7flXgdlnb4tbuFLq09LJawuUIsVNrllU0rjPKkypOxyEyLWQ0uGe9%2Fi3TpURmXMDb4hurcRtH65pdU354KJn2b5e86E5qG%2FeVTipgVcqa3Pfb5QuVsf%2F1jlfmeU69oi1tJx%2BCPzZsjSrbILL78zSjA54W%2BM6jqXHxPL3Mjyf9TAMlHG9398RWujnHUsUEMh4A%2Bstpn1K%2BfRZMl8%2B0Mb4eKtrBXzxX3zvvdp78MKtKaRwAtTs6aUt9q6XIGIYjlyanG4NtVu0dUPRiXurSx037bUPznaPu8vdPxz3%2BINkfWrpoEJkml5WN6lAujtMy2htq%2Fuu%2B45N2xuBYkHTscHsxkPLLd0a%2FdH5q1Dlp6ePbD4fx9VkI1xniSZm1%2BpoVVdUsE%2B1SQLpgiiTgr3dtG19pZnV3uIy%2FcPrkzdRT14OM3tu1O%2BV%2BNGzNa51bmY8oUzZRCjv6zT%2Fe0L%2FDJXWNzlOtU0Xauhvf6VZVq6GTVBS8%2BuyxKap7wP7YZ77xjLsqmjyVqWWx0RXllC85TJ3JM75ffb5%2BY8ynFmUyDl2z4FF2ycOZsruGriffN2IZN1fLt9pjXoa630f0CD6yiTbp%2BpeWBzYASWit%2BdJW3BF9TOZvuCS3fI9We2U1%2BuQF1322wKjr3unZ7rZqmdfplMy3QQv1DeppbfQzN1z8EvkveeAfLH5G1Nni%2BT98v6uRmzvoyg1ZqYW6tiyfo7mdmyeyZlM8rCENdpjxSsmi19aRS4RRElqodfqIgt1HlN9TBTudStj%2F7QDds2CfXalLNRTgx1Dqa5szooS2%2FKqV%2BaoNbuyYh0K50WRBrVcuG%2F88ZJwbnTFpPKaI0pOHMqWb28bxFlym1mbgU46oK5P8ZbuzF3qGOIrM2Jcf%2B4xq0Ia7xluSWi9xcmX2TODWPemkKMbQ59v2jxX2ifW1YnszJu9Zd7p%2F93t6KOIYEauX3nqKISa2yd3imc2r5SzgOT7bN56N2fGkW0jGyM9VgE7n2hCbW9kKIstz9Ef%2FqB5bou0n3h4fpCete1S7KPLI2SzLMZozJblFTrInSNbLbfY9fQIHqh46dc511XDL5wuQ%2B8sPCFlaPKctt%2BI%2FNKH%2BFXe6Nfeoxxbj1KC3pb0ILtjxPUrYhZQwtKVkBoj9W%2BA7XXNrqr5BqGXcSXvPBXJgeT9bWQxaxMrUsVeWvt6zgQb6NMrpR9R7R2uxAWyDWr32RElozqZjado8tgJS2RzvA1S%2BkWr1iaZl3lk5BkCZg9iafMdGtOw563x%2BbrEo8fBuu2Ew8fU6DSyHQdW%2BLjRygzE6jSL8z1oSXKRASKB4aFndUTP9btVHvCDGaQZEb%2F0CkN4rKpOzJsyU6MpBaxQdXE4%2ByDRJjpC2bNNPWnF9xGGYYGuqXvmG36rdD6o%2FEoH3qgGw98MmjqjS7CuRgX%2BcCFeGdI9CUGJZ54YJA%2FCRm7Y2RxW2Uy1kPrhNBcc0wlzFKDE3sGgTMWpJc1tHaLDhnyGEyP5s39KeNtV8fXrmFytSseJMBBS0LqTxmkbGIb9lW7wsy9%2BJIR3K72zhM%2BhMqWAfWHJbrN1fQiijG5URV%2BH57elOlm%2BKC7uQD9yQLhO4mwkTMRT2%2F94Ffia%2BY06mFOUtsvUcoK5vphmPZwTlezpNxVT2x0xdRWDpyUmlslRb%2Boe3y7TiP53QMHvXfDCaVTpCNv1g%2Fk5Qmb2Q%2BX4YThmpuzkEaVpYOxQYsjY%2B7kDtSDDezNZrvpNToYY5j0dO0HFzCAKyuKc9jDJyPQXWnVVbyEK0eFvfgqiSqbCYaISTLIbmuUebT3l8mXvZTUtQxedzuaoVTTx%2FB6CJSLJo3ViLOdbHppqItvQ3Ru1osoxs5En6CrmtvotyxY1TsLEmWrt3Eyp9nBnexBCz1rGSoMeWcBWVFmr9hPS2gh0ip1LsToRfeSlYXr2IqBAKeeFVAh2fMUXf2FlC5bxz3BJyLJMjD4ceqQ84q750pRjsz%2BMDgBZuUvxDKi%2FPIx467qDjIKi5%2BFNA7elWaIhZFzvX8Nu%2BfCl2WVvaAF7rgDZI0cS%2F4dhylaIUan3idyUVfZyADOCB%2FO8LpHfnKBVXLRW3pJA22tK%2BykpzL2N2mK0eTJovCx5BN%2FFZBbPaKBHn5UKaMDIoT7Vni0ySVCBAHA1zf0SUEkDX6MmoJftRLdEpJbSs9xqIrqr7BqldKDtcrowaJG%2FKKHmMvWG1hdbpSirmREV%2FY4eWCAuM5MpUwr9V02EIzWomVzjoPUn0G0vriKt7zElzOXj2xmLRIhWmNEiGiHJCYOQiIoBr3%2BgNihUxB%2BvwZDabT5Ea0uPX%2BVlY1e9bJF16C2ltcoN0eWHUEJh4lGnMThFcywc93JYyBtrkuH6lHzFXLys9n%2FrlZj4dLeVve6%2FCBAN2OEM6fWdBVm0BsVqqqhQlxTT0VynzseltNnet6EtjuzJF%2B46EbwawMkbE6Lr5ZIg3AXlA%2FlwVAxWWbh9IKeg%2BzSkyKiIRskZPjLyUbA7C%2FFc91d8aqC%2BKqMeE8gBsC3%2FFir%2FBNlIsjKQqeyMiR2TA6O452JydaOgik%2BQyMN6XeNpxy62v7D8GjVoD2JDq9tUbra4obObO3SfXum9yV68XVEvT%2FYZrgdIHqc3NpIWwFmT2SP8YBH3y9llaZQ7tSxfza6CJDM0Qara73LI4H4PUUdvzHMKBgDVBHqRUly8WvwXXwjQmsierVGqed%2FwOl6dqNLTwR21UN3XQFM77123wVn%2FL51rBYVsTHs6k%2F%2BSJ%2BqaO55HxnEDx9ITyifeREBaq4aodwz2fs%2Bkn3DEKOv5Ns%2BzYQekJKZOEKTLFhMOcMr9uIq0KBvMtDKXm%2BMCMo1Rz0iRE4cD95v9FXGGAaruRmAg80h7491DmG0LzZD%2BR3t%2Fmm3N%2B72YTvbGvRH42Z%2FPPIa%2FK5eDrbVa47wtT2XHCcH3OuOO8NmD%2FfJK7SCn8aALXN%2FkQTeKnS93AlF7neGmP8%2FsyiIXPhJggKQHzEjfOZg54kef4ZPE%2F3oXSx%2BS55yFpNhx4CIAY2v8MGmH73nWfjvuQqMxsNu%2F7C0AgnNbrMC1AXA%2BP7ofdSDPTMXrapf7Xz1xI4KVjOKMMN%2Ff1Ivx52vdtw5QoSVo%2B79VNYb7UFr3CzvjVk0BQ7PORw7v8Lf2aM3P44H7cFde9Dv3O13Drv9u06%2FfTcan%2B7ftY4O7w4ATzt3%2FcEYYk8P796%2Ff%2F%2BY0u3ca%2FyQLZ70uv3OpDU4Pu70x5PjQbtT1oBptESa427Bs2dmOHfon4vrZkRM%2Bcn6PFYQop4cDZujZm%2FybjBsj6ia1viJ3q89WtT2%2Fd6g9fMXajyOw9euDqCIZ%2F%2Fv7AXRdELaonnpxpInOZB8Z2Ygnxxl%2F9z5QO2wu%2FzPaz%2FF%2FfCP3mm%2FDfStNRh2Jt02ZmrRqcvg9ho42R9lVubAbMJFOsGxERT7SW5cf2QCbUTwyyaLHyU5Luu94874aJBvgD6jn%2BJP8vUOLBE0gjWblKg2je41s8cfTjqllCiFbbkbkX%2F86GGd009fP8JaZwLcp0DKl48eP4358ZtHgPHJs%2FMn3s7dzmMA3HnsQn6V2Wsr9ma62MxgewNAuNCVNeZtc9htwga%2BtEFyXd3ZpjtFm6sGZfvZSv1vzU2BLbXn5sFpvzXuDvqTcXfcQ8KkAvrN46ym2PXYx48crwdjwkqylqLkp6jbrAW0%2FtzUJ6D9YKMO97trQMymF9DURzZJhW3Nap8zQJS6N77J0kvxTTbGOYlq1f9xbmUsa0AFJoeLRXCOZGvnI%2BZNP5%2Fw5w5%2F%2Fow%2Fb%2F7zyb%2F%2B42%2BfdmpisMIdNxpboWqOWuGCRbRCBedqhcrFqMYM4b4yR2fFA4NrkdVGPwkADxN8QhefYntI71JvUp%2B%2BufvPuyd3%2F%2F3nu3%2Fd%2Fcfd3%2B7%2B8qxmxyrsslpfQjL%2BL%2Fta8b%2FLaLZZBE%2BDGz5Ufe2FydlCgBHQ74%2FJh%2F%2BfPfNWsKuacJrk2QXsKxe4t3z6W%2FJsEZ49W%2Fir841%2FDlG%2F%2BVc%2BhGIqIOEwsLC%2FjoMJBkMZkwkyXdHqp9EjMdY7W2a880jU%2BIloweMMa7DAWTANl%2F6iHZ6H1Kqdj893f%2Fj0aPI1fR9%2FnVFVhJ7H%2FhSA%2FpeW9kd%2F%2FqeR%2BvfH%2F2sAXwQ3Zrb%2B7ry5eyAzFz67CBivzrDbMmlP%2BZ6ugHGDUWhz%2FQ4WkY8PutFRZY85HAsyXCGBpNcxb%2FgEDLbWqQ70T0nd%2FvcR71VyzX8EQdhDvz%2BmGfL08Zs7FfL4Y9D59LGx%2B%2BlNPt3H%2BcGs%2FekN5fq%2F1ooAVWPaXa9qlTXTy%2BJaPuIgCnn85rFdAa3ZrjyKwQuqopXmaOtRcOPP6g2aVdLzjzfvP2E7Fdr9TnvDpzQIWuAbibxa2OOP65N7jo5AMXUeU1xPscV9fvfxhTHFHn9c9ET%2BO84eqZG33gdGy7K8HXUfwHa8fs2fc5W%2FgyqX1pjfz6yf7cez%2FU8fn7%2FgHnlh565torSCXBuBjGhL5gTAppt4CPW4eRQHT7xkc5YAu7fBuCdA%2BtbpxWOdzIRz7xGFeq9fv%2FZ2XzyWC%2B3OTn7xjQO1FTDzfTR57L3%2Bq7k4qzRV9fF2vRePtcJ%2Bf5xfilTzkMY%2Fwn2V0Qrm4mIsBagobbvIk2P0fmq%2BbWZ89GvinW5az3dRnWVv%2F3t%2F9x%2FN3f%2BZ%2FPmTOxiR9%2Bs8033Y6SP91vM1y2novbDz6M2Pf8F9lg2z869%2F%2FQviePv4JNtFuuAef%2F3Xx292nnjPwI07sr3HuVodN7v9ibbjNhaKneR2Nb2Io1X4j2BmsjE7%2FllCzwFbwes4vPJTa9uAmzArJEmBhk2twHBuBXAdrcB5ZGd2fRHaO5UdPjqZr%2B3EMAcXi9tcraOU1LvsCtEhpRW48pFZdOVrtzoK7QwDWKTtoEViZ3aGr9NbYSk%2BrxrmxEw7Uz%2BdXtjVphdip0Fk9%2BdVtIDK5%2FoKGWF7eOkRe7ub%2FOkl8FBW6CyY%2B5tFDnZztsgNcBrbPZ9ch%2Fn6I48crjZ2QekFHozUHDpn%2BW7sZP7PChQMp12cYBrtLojsZgX%2BIlelW1TasGsUxMswl995lNo5Xl8EK00E%2Fcl9%2FjDp9h2zeLO2Zf3Ql2FSmp0Qc%2BVzo5OH3LjmBguPKkoLkKIoM%2FfpRY5UnEXRIvCtDfXOIrKPD3bmyBjlpoIdcnabQ4DkIj%2FLZ9EGpUZlLSgSVCrxo0FcS6WJZiwK4X50bPws0SUOtmtrJuvX7PcH4ybuKcsEFssg9d0Sv7%2Fl1pV6O9miw5Vnv%2F766NkTO5IEHxD1OB%2BllQAzajHf%2BWRDAFcF5Dy69lZBAjTAe%2FQYNixJOAu8aBN7%2FmoVpaQRY6arf3Zz0hw2j0vlPWs63HR2YL69BW3dQrhbNALEzbQcsvZPdgUSVpwuE3eVSFF%2BAs7KbKy%2FCGH5oDH6LVnvfNqmZUp%2B8uwvv%2F767O4%2FntVDMG4sN%2FKRjRLixMVx7EKxrlMX%2FMshbUm%2FV1SvMEP8w32rn3qbtfe3rxJAVi9Y%2BuEi8dIIT4NJfyO9CJboPwuQI4zOif3y%2FMTjY8LEnXGGdNeNv%2BXnUr5JLgj7nLS0KVUnmLm67fztI3DIwCd%2Fauw4S88H5ma8BfPYKhG6V7XRg5UjSc34QtrErB7tHGAX%2FJEqCY58R2Yo7WQP8U%2Fr5T2L8jxxYXLFKZoCy8%2FuJzVbt7OzU0R5nVFVR%2FUEY1Gf%2FWbr51GvOTqadEat5knnU42mN08GownLJwvb%2FcvpYNwpAco1eokssXNWPuOjdGrdnTrBukOu%2FC64SZE63pFGE136uFsF145VibJJGq4IY7G0oz%2BV9bJjir2AvhfI5ppXL%2BURzVPKJjehfi%2Fv%2FlyBMHOUKnLiwSbLu7hdA9OJ14IU0hd09bNVtNplnjffLck0QnZGtWXLegkUdowmbd6fAhrCHujRs0dv%2FoRbKRgwcxhsCkFtrTWA2yR89hrKf%2F342ZcY9PwZLP%2B9LDzO5L9vIB41S%2F0UdsgPRYfibn8Wk57o%2F3cnRhkly2fHLKCjnJq0WwMt04QQXXGfSbtGBWMUe8lZqjiJr0SIh3356OnTp4%2B%2F8uZxtITRBZLuyMzkN%2FxMokZqamGelRaI8nO2KALR9GinLtnIvIAD%2F4o5kQegJkrNcNOSk7WJs%2FCk8diFMbU0MEQfobzt0ZvXwNpvO9m9PYWY6pDYgYwVLDPlWoavTmatasdida17p4Z%2FJbu1mpXHvwrOupK39rS9bQHLWYe9MGCr2Az5J87hyrKqM9PxL8fcuhnw%2FwNC425k1ul6%2BJbHw8hhf5njYdZDLjgk5siHHxWrQqoOjI3zAt7m%2FHnyCY%2BylMc60XWL3Xd8Y25CnyAvJsrWwEJDIrZjynotUbotM89LzF2CcVtsj6TdTOPQdbFkoTu8CJjZWnLxnAg8LwDPi7kLhNw712FqwtFaZOVlFeeQYNuiaoeg2immJubNqtIMqJ0pc9yBAMOfEw3z0YcZQtyMiRo%2FjbwLuhyYoNQgCTxsPqzbyTqYhv7CiwFPjQQ752bJGJRYlZkFZ5vzc1NkDFh5u5qaIdd%2BaCbMH%2Bo4tsg7yICYw3%2BTgxGbMaum3fSrBCa5P70A%2FiShO3Evn3iAy9MLL0wQ11gVdwbROGnUVo5kgDs%2FagVsEtzTyoBPxrx0i75zQu68JJyF3nrAZiX0%2B43Qvt83%2FN0VMVe3BfVxSMqhMw4gb58at%2FAiukikUwe%2BWmSUcuCarft54frO6HZ5Fi2svmftEuAJVzNvhneLtQTHvjXn2tYhy04%2Fp5uysx%2Bed1c2LuLVJr0mOdHDzjA4B47XRgzo5hsY9Gm0ECYB9Oo149g3JzOpULzcK4j49lU%2BAqr6fT70NCwObi385TqYObN68a0z2FUjzMsFjuEueO5WVxMgBhM5oqAHgYEv7L%2BRRR%2BOfaP%2Fd94BsbZhMMyCg1JgPDdTvGVGOOTbY7S%2Fmc8tLBld%2BLHoREdsM42W4TSxcc%2FHq1RG4E%2BjQd%2Bqi7xeJQ%2BycZeTn0cnQKxCa5YfBiuxyXaGOudZE8mnKwZqMgzmotcNPKdAIxOozI09cKhOEq%2BIwKn7vyZW2TP5XXDWTJJgeba4NQZMhRaQoc5wOBhOHMRopxPHVmd0rvxFPlTU1REzpJuw%2BWB13TUXNboFyneTD0dLN%2FnQ02GXA91Nk8dpk8PeYD9P%2BWGBpKpfmUf8GD4Ol0G0sRfqwI%2BdCSjGlURwro5l0UTuwM4xTA5w6QisQHuFgT1f8v%2Bw9yb8aSPJw%2FBX0TDZDTjGTjKzs7veSTzYxgk7tvECTjJrM0SAAI2FxEjCx0T5f%2Fa3qrp19CXkOLvP%2Bxz8EoyqW31UV1dXd9fhHMv3owwscWFY%2FtF7AWBMD808YYgN83UvZVDDS9HEFo%2B6YMHkwA0DVdT9F4TncM68EkkyoCsClCtxkrcCSSa%2Bdf2pJDtOuX8IUZpD23vuiUIikIj5iFCTVKWD2pxcKBTOq2CyohEi3%2BGYsUFIGKYnofn7MlkXKpMvlwuTOwXmykKCXhXbED1Cu2phR4degPLXwJ5D1jodIm9bnyx7hg4BPqtaYuzFmLLXftzFIx566fL5cCfy3IlTF3TDMjdZAW44KeeOiy6n4BsEhe6sDkVts%2BrE9%2FiRFb74DWm6FTXOVFsxvuV78gKqSR9Us4Fe6w3uw03mQD%2B%2BFs9imCXAj7uva2V1fzg9GfXbJ8ejw5Nuv3P2Bkrf%2FZHvO2HPSbqco70mXmJFW1dXu693tUUMWm8M7dKXpr%2FP3tVlfZ1QtcILu1tbxUdry%2FqJjqOsT0yuO8WxotX%2BMxs3Q270aTa2yWwY%2BErkfIaRY7%2FEF4QjOjcawH7ovrtyfEZ8exntpW%2BrpJcii4iFmkfCZkpXSIGe489h1%2FUso7SpQPV5GT7ajYNAIxLlpVT0UHoXlS9FCNN%2FHZyeWNEiWHtTyw9irqjtgIAexOh1JbRvrY8%2Ffkz1IWycPppiuOIEblv3Nckff6TR4N9sE%2FD69cdty4knO3L%2BvH%2BvcJ7WrCQhoX7hWNvW3L2BXSpsGu8BYOMtN2zZ4B%2B2HfuirXywbbUsvhnEw8VgZgHo3euP5VVvS4f%2BDfVUNB3xHXfuB6FD6K83%2FqFmQ4YggT%2BrAyTW%2F7qmqRGzfSMwP4nz7SlE9rmhKady2%2BUrH%2FHRc2JrqSXTvBUS9yS1XNyR1aWGynVjV5fwcp5th8qp7%2F6K7OjVrq5fX3lEzPU%2F4wRFl1W6ltDrbB7TeD5%2FzCgYWlw%2BPIUHs4EsLTtCw3IzvEp2sQ%2FRSdPongnp2c3kTnp%2BWtvTiGtl%2FTKZ3OwrJjfpG5XNbqQquA4%2BvppZHaS1JM9Jl3%2Fr8m9%2Fp9Pb4ZZaDLOdeqiDBaN%2Fg9xaQmMVUGZgw%2Fvx5RY2WgOIEmOVrEIGz%2BoomM0UqzYUn%2FeXnVYY7CHUdiiD1fDNVZwF%2FkYbFI3Rxd2HoWCTtS%2FYZPl66w6T8UbzBS%2FhxYPeDbpDIkL27l%2FL3oWOnjhze3KvsVmx6tPAiQTpAA8kw2gC%2FMqKHBSmYGsSNZQiF3G8ivZ2d%2BPJd3%2FfcaJdZ7K0X%2F7wcvfbyJk07enUZecNzYh24U2f%2Bf5qchYSbegedumZr7Fkka9QKzscuTjoK%2FK1oMOEK5c4G4ttIjvYTzoxHBM%2B13RctHDH%2BeSFkKFweSlcswFe%2BWmw5dmAqLIeoUQ0GrRPz09aA8VKO236zv4iXnofde0WYVFsh7Fqtc2ySu%2Bn6xWZRNMRt5Rccjer1QPblnPRaIlA%2BeYcxuuELyPQwrulJwh0pavjYb9fAXGTKPo%2FH28TSfulFG9veq3zt%2F%2BqQnTz3%2F8voLl5aK8Wvz%2BA7lK8cRWChzo%2FStGrxawELFeM3oALBROlCvD%2F7B91D1NNgvRcR6d6jacApHa9Vd%2F%2FBn5LCiJavetPMg0YtUJKxl8jmae4rO%2B%2FyjWOtZo%2F%2FxEV76%2BvF619vULtJk3CYt2apS%2F%2FGBfBQhbJg0Z5NpMbi%2FzzH1NRL1OdLCCkcKj3jEiI2VjWm43kiZaGOJ4Eu4qv2jduMhCtyF16HcU537n1QJCIGlYUWLeONbF9CySLqeF1pIPICkIr8zL3ABym54GAikvYPvvDBjr4%2BdIeqsBNKv5CeiFNNWbN2ZSR9Wp9dRk3ZgL3k3pcVSffpL1VmQUTw4ZNNGzKzzQGeZsV3SqotwnippBSFKeEBFleEBKlxVA8A961%2BtfuKtMoQMtGPCO8t2ACWbAnia1gZtkZrZLpkbBsZGrnJLlPn%2B1KE4dtz6U6B%2Fy80SVH%2BLR92ZOb5TjZzgf2x4v1eAfoJdcQ%2B03SFnOjaA2bo%2B9e%2Fu1vUkmE8l77TfvDuezxrDC%2BNLI76SIDAysNdXqj80kqHSa87%2BChbQDockM0Jvr0uWj4RtudgkmR9L4bMy1g4FroPSMOAmAwoXdvje8ZahGaniMLszHXD%2F2kvwn4vMmyzbxXEqcNM%2FgTJkmKDglLhd3rZ5UnsMyts6NRwaddflmWzm1pLNRymBo4FHI2aLEbN7XktNBLCd%2FIvcm2P3JviMIx%2Borr4zChYh9X3xZ4ssSLMx6MS1FDo51r1MvdOAI6M0sR08UuCkcFRR8UJow91HYS0AWv3zghvyEAIvadOZncW14QXI8doM4pYu%2FmxUsdaRpQhKtgwKibLiSg7mVE6nI6MpbQuEF4KRWBHjAFJBor3eWig8JRtzdqfxi0z1Qb5LKzRhoC69AOs5uVG0DqxBPvzh5kV0VFPsgiJBezHvLWLm%2Fxg6oS7IQK9YJ0V9uWrIjI5K%2FQuAbkamzVGnKpqqo%2FN3N6vL2KJstfykv4q1jCjusD43bRJ8IG0UpzmJgRx%2F8aYvgv4nkTbioLaGwu9trH7V777FA5ODHuMTkKGQE6Lq62dWU83qLrb9SimSKb4eZ5Uq6rqzEquMmYRSXRgqLjttVdxwP1Vdx7DpnBaz3%2FvZWAZNXY0pQJEiH3Or5d%2BG0q%2BNPL7c%2BFYp9RsUJF2kqOz6Nt%2FCorVmkzK3xLKlwp%2B1yB4H0sCJqeg7dnEcmhuMvKhD1nqrxycNJ6qwBpxbp1PQ9tt2eePZ%2BnhlQX5%2Bft3uiw1cdNAHMPjgJb7NhC0aKxouKNU8chjD45R5rZiX11UH6MYmzl3IkL5tKT0MGYCag5%2Fc%2B%2B5bnj0A7vWSPUDePOzo7OMyElaJSJ2Me0lVPn1EWf7R0Old2chwFX9lCD2xkxJz81I9JU3xaFyfhCnI2p%2FEA31JdPa0OowKqzGhI7WjYQtlvW5sy751H7uHPW0TneqO7ivIS%2FpupYX3G9pWMO1BPSWbVtXDNgq%2BDfL4N1lGmK%2Fec6Zza%2BK2PfJgqRWlayguSrR2b1IhDzto5GMevO1JkZj2%2BZxCc2L3eK8adSctOxlAcuPTn7R89leKX6DCC7xvmU3fFTC4CQDSpqmcIgEIbTndU9N4obctO447eC9FWr738DEhnm3vktcP06upBGAawmeH4zzrvD1smJjAJhkVU0JPGzq3TZStutECgwtxKlSvbR%2BVsiOLeFkVjiztJe1et3pHn28cmnu8%2FsvBG%2F6x8bsvW6cRqzDuIOyV7AokJeuHE%2B7wqi66b1Re%2B9uOo17HmvCyQ5%2BGXUOjxs903%2Bz3UCt9x6Xd80Ajwa%2FRct7OrDhtRfscO0vTOgcMMer%2BD2A12OBerRurCz5SGevgyPb9qDAUxtWEP79MtA0%2FLODlbzJHJiRZrSLQlGOtrV8df%2FNv%2Bs7lqKn67A1t5Gs0LLWa7ie4sdLMh5C8bNuMMvX9YYZ668B0AeNDppt46QMzAjUFLWqV%2F%2BWm8Mt0y%2F8WeD%2FWxoHpKy%2BADkW58xi1evVd2ojCumulcVqYjeToDTJ96jaQnbphTxSgutk4Ehnd3sa%2FYDlIrHt8GKnd2Wcz9pOBpmYi7Ma8XE8X8pqVcmwA3eulhEM7GNgs8uWHHh%2Bw7%2FLNnTBP5s8uMlDba8%2BWHnNLD7Gd9baJLDWiHyWzJvQccI0rnXtrKjFlGWC0jfIv9%2FMmrBTk86sSu%2FIu%2B%2FbR%2B0zt7UFXaSCm7RwhnbOqdHY%2FLhu8dsyNXkAof%2Fi8Rf5JU83%2BHoLoy%2BhmMk86VOybXOhoud8qudzH%2B8OoEfd%2BVT4dInvfaRGySSkpSqEEDqrMiOY40Ix5sgXBHLrKe2V1NdDlX3dqKw7U0tRgvuG4wgV0uJ3gkVqk0VIrL1pIfj1%2BqBcNHnS0nCVCzROD5hLCUh03mmxMkXGhUlBf7JGRFz%2FqL6lJXxoCSWalvoCQs%2F8l2bJov2Zntz1I4Cim8da2HfOChoUOzx9A4Bb3LoXuHasSIMnwgZ7Um8Rl8K%2FI2FYyhzEoQhBkkdQ4F0EVe3GjBUM1TOxOJfvd6B6bZw4HFCZh5jtO6457MIZoyh3Gg9bhaulTILEC8KsI0hVsc4M%2BuAYseBn0LEksJCqkVPeYCS9JOrkpC8os2z0e2LQUWhuoMb%2FBgPYSrVhJ9iqLxqfoPyzyYNCfbRa4JUaFoBEeiNoLQpgkCMu0WDV5%2F0EwEPl%2F2GfrWGb7ziFD8bHBFl2aqqHQnZNykzsU%2BFq1XxU%2BGmT%2F5o9GXYR%2BM7yJi%2Fop8h7fAQn0qZj4XqM7Y1dTx3ifdLdFSDSzebcrQNyw9%2FJsAES1jL7rZ%2B6MonSOWG5%2BKC%2FkD0q1VEblg%2B6FI2MppMMz61Ed2h521G3RkQnozzKpOLFINQ4xsmkuJt4WahvCmmzGxNnMACMlvjWjdZOJNrWrYCZl9J5rpAEJHjoEGVG%2BOEKrocUMpzI2alSD5G8P7F5mFOKTi5e2PkOrXA36PW1vLWK8aexp4QrtPXHL0OnWliaQtVlde%2F8mL3oIGSu2fMmHN3Y5bNDrnZpzIXkkEb7ho0NywVxOPcrzJQGCk%2BzZ0YI%2BhY0S15DwdGtl6hPKS%2FvkivCCcO37OsVo4d5kIjcMFrR7lOlv0iksstnAnMk5RFHq3wsu2hDlEfK42mcqem3KIkukH2NEiZmkKry51SyNtvUgQ3Nh2DPf6kLT901%2BhC4yEjsCTWanVLs0n6Lb8Nws8jHJByXQ%2Fyx7BTCM6Xry3FA%2FOSE3%2Frs6rkUk6ZKBoQEe%2Fs7KAeMrD428B%2FiozeRf9hjCr5STi5IoMmwXTbQN%2F5wr3D%2Fqmrd%2FXttHQlofZgYU%2Bu91IWEYFoEzvcF9As96eKunrBEqaCG07WS%2BZ3TlbC2LV2eP66ak%2F3JHXE%2Bsq6q9Z9ZpeGhF9yc%2FsIJ6rp6S%2FeftGRL3pmCsLiRfAGd6YvKrkzVS87K7J4vMyTj8zUG0%2FtaU%2BuFicfbUkXKxWRhEdOl%2FWdoXLnrHqbB6pH%2FQnb4pbYFnM%2BiVyZ6VQAIj4%2BqSM1xahm2%2FhI0s7HJzsZSPJtsFkPqdzXJvPXwjM%2FxuPmOIii5sRzdQ43MW0EaY%2F0t1mooszdZu6PBl849FyTNxqiOJN%2Fk8urq9vm8Jm19UpkMOUM%2FeExfxWqKjJh%2FTmj1ET5qmojRYgquGSi8J%2BOYSLP8y8z5EVmvTFiTWmI3d09RNrVVXNHdlZT%2BRa7NXj7hdZ7gJaDOtS%2FuzNspM2Ap1fCEOqjraOS9eOizTSbvErg4LvGGstuiw4CVP086Rgvi25dbzrz7nGKGi%2BIJHLPXVLUUCMPqFkm98wrRY1qssYkU0ymFnlLY0cOPupA%2Bj6elvK%2FMP7NGVM9LIJcfxaQb8FmFKxD4MpTZ%2BUF9%2FwPmv7wLPlzcOOEnn1vOZNFQF%2FN6RKDtHorCzYMVAFI7b9Nx5PmNIRdaMhK%2BG0ZNX9fO2snefmcHuJg5U7wwYuQ%2B0MfVrdTCxgk6tjZ0yZOdXe8jh32yDz1s2CMXmBPrTCAvcg6bq6AIYK05DcZIiIntqLFOp4Gt7CMQGPWPsMTStPUt7WPeaBh5AT%2Bzm4W%2Bi8jGxg%2BY6ciOPP9QV5O2bb7Sy4tSQp9i7anmyyiNl1eiXNCSszYhHJpP3irvccnFviYhZQvNF9hGY0CX7eCAviRiycruNq6CXlNa2ZrAGNycKEagJcvW1mkGdp07SRoKnh1BVJsSCaDWzUuWe41jFz5xc7zF3qmxRkzioYX2uUhFdQuP30GJjjc3hualdhWiIW1%2FeVqTsbQeJoweLpoeRtD46UV0LyQu5reUPIpqxmF%2FNAhLYhr01lFO4aqi4LkOVVSHgj8SdWVQPEv9AX8JSNOeZbnpPElzEZAuK6AwxG7XH6Igac%2BW7lrfoMmKG0G%2B1plyxKeBYPzFfjVGoZbx7AQ%2FkiOxYuuxrIws4lnpXflo7PWaVv0wT9C1K2fP2%2B9aNKvY%2FgM0zTur1BO1nia4jc8MMrkaEac92M7dLRBRNmhtATTBHfVBXGd4PWJDJOdwhu80FuakKSaOLMIUmLugnwvQxT%2F7AbGpg%2Buq8br1Qvwqf9TEai0TxuTV8GyG0mK%2F7LL%2FdRtqwRb2pNQxpx2aH9fB0ocUTXWgX5RUMPgMnf0IuwWT18VmLshKClnZXpCbfXe9KUSkbOdnEjAo%2FZ5dzBCaUpKaJ8ddVpno4PuqZLwToJ0fHnkAPLiBxX23UsV9sP3CgzjEaMvXXXwT7qtI11jT51w7mjyS86RGURpGcCUlgFMadl5r%2FsGRMzRceekLSX9a%2B1OrjUN6OFJ%2BBHI8zr4cRgs%2F%2B0oREhpZ7AhchQOUEwauE7UurVl%2BpKzXMhxsSnDIDBVrOR%2F1%2B71YbFNnstsx7mRgyAYmIUrB8JeupFmFqAVugpduRIgiqdOqAYZnyqMAWCS8239HKXIDRIMV4rvDuUuA%2FTli5fHlYIzG6Yld0GvOOYvpB0ubNjkyogtpMqdT5OOFAupQlIEm01TjYq78EJaJwy5y3lDhlMbNrt3hkTy9m5I6ytsOkvRnLtkiRe%2BW1rsO2fSRU%2Bg5uRYWaZavoIa7l1ccTBvaaJMICziXEv3woE716FYjYtBQC1xAFiLaICreASgtpsYAkQBAflHukYf2iuK35CFilTSw9iJXNsnv7Alie5Eia1%2BqAn%2BfcjjcEtQXahv%2FQzRzIxDNSg4gpb23UiBa8KME0wHX8qC02HgqQgKMCiNghkGPVZWoTRBWYrSBGU9Ilf7Eey1jEMU%2BMx%2FowxfxeHUnc1UJOjiox9G7h%2BOJqsBrJu7h2vdgK81o7M2Dc9aNw5r0wCttR2Rw1Eh7BZbplZ3q%2B0HRhwZKOZAtSMHZBbdrKUE7bylFAOrStPUCazh8EcusCk8Djx1o6VmcwHp8uw7cm%2FcqRo6A1OCJWzGdSnt7rEW7K%2FlxZ2ymSjSDGdBI1zbO7An192ZvCBj7EsJRCxVmUbcDl4HVSaQLkoLgN%2FQ7qSnCAWoZS8Lq10FoAavITAGoXHu5NHrdGGtc2wZh52pZqSJz2aMVZd44vqOMs0opR%2FfK6y14zt3sCDqhrUDa6werjYqfvHybxqgKv6ro0Lhi1SYpjhnrqIUw66E61VsoqmOf2N77rQf22YOaZRufnbudQgADOtkD0Q8C3x1phiL1Nio6BfCk8Ce6uo57ZzKWwwtGzl14kUg8zQG1BarFbw51ISjU92m%2BGywXqlAe%2BlMtQla0V4NFQbALqxMMBw6LHfXcXd26iyDUDs23RsnBGnhVpd2brsqKER2Y9q5nTvhch07U%2BSfOtZ%2B7irLwHkYwAhHxzbs3I1i07l8nA57xyB2NHTT01Nmz749PpJhjj3t%2Bt69GTmQQynIAYYb2n58EkzkYyqV%2BfXQ%2BEUHO9UsOj2uXXaq9qrvzLM4fcdyLEZLCUGGEHcuhdVDYLBUSo5x5Sghgn7srHR0lcFPHHm0cCcy1YR2y5O005KnGdb3PFVd4bVbHwYkRq7t13qsbeB6rC8NXca58ZrOWLQZlKiABIxiZ6mrfmBHMvkgqHwaDNS1EEH6fSrG0VJq1bAZjWimDRLG4e%2BUtfJCXeAutCvchW6Ju9CtcRe6Re5Cs8pd4DEELrwuRndT%2BkvJ%2FL5H1yFKh2lrTIPe6tPUwSFYSznbMe28L0D%2B1EzRdwrHgSbYoUxtMA3aLHanmqCbPdpp845diWtXFAxQCIjTSFSYgpwuB6rnOYXQvcItV67tIF9JCHXIgTjoWEjIIV%2BWqTnUgByUJ8%2BiXlwetY9bFyeKl5ANQbtzc9sfr652SxVZviwuBpmsrfBU35laPJRAioBI9tFpbXEb3DSHVXd25jvW87sXzxtqXnS%2F7MlZg7%2F%2B8Jfvv3upfWEB4i8PdqHUMHOmk7H9t4pv0xkFKlOvAti%2Bqs1dPd%2FGPzsvVy81Jenb8Pes8m3rxfPno%2Bfsv%2BZ9sXZHKgdq3cav2bbFftGTQ8XC36bUuYJt1vj53eXV1XRE2tU7%2FGdjP3l%2BR8q60xSyumw%2BG%2B6joW7CwmEEd%2BiSC8NooJ%2BZ%2FCdkTrDc%2FF2xYLHY%2BqXTnh0Ps8JlZwFV7%2FAP37ZK6bRMyetpfYeMZS%2FvPqwvyM9Yq%2Flvcp7TeFo6Pchl6Xn3ZKOGmzlcBbN%2BrqaSp87rao1rHxl9Rmz2py2E1UD1ZZkRlrXhy1znP8odvjAmxrQCSopZxOv66s698sG83arVaqqCOxtRSMIcpfrvLx6q%2BC3UbayZ6pVKFnpeOrmY7tb%2FruO4IRRDWc9PW4e9rs4NVblXuiwOwEMnzFf3eG4il9q3r2p6Wqm9%2BlZN%2BQoEWtMUyyp8IltMVSBMLvrsoFYTaof8E9VJapoMBW%2FcAmo0ziVwDREAGo8YfCoIsIxIlJyyg4MK6pQS%2Boojb3BPI1pZ1etpAOxkFaJVr3vjMGuoZw30cZXUl%2BsY2TyH7TNLEeYVokRFNDM%2F2v1xb1ccIp3VhF7YFiZ1cWjk0VJ12XiOKnpSSApfSVGqGTorz6QtNcLEr6AylVZSXW%2BqBy%2BoulNlWn%2Bk3dVrn59UZNGlRg7I8HZWYbCU%2FRAVyHH3V2rp6w2LnZJqCDPE6QzN9tAKLUMpSsTujOwiQ8cC%2FNgYS8PCYBpkiIOZ6SGLnEZmk7ZiLUnFe44NTDhy79LgHC65tWF9Qrtj9S22vv6Kjous4acfPmv9F4gWxISYh7krlvdXv3kYiMbBFcoOr0mVfOwFk2vm63YdOdO06Wzkl7a%2Fhs2CTVaPk2toByBkgv2buhM7dqTi0T%2BxFfnuauXAlKLwrjwy7dhBxXR35kINqdcfKw2izdTf3YjtZXfQ3vSeQpmM5QqYd2QiyCZa22IsE2bYRI%2FbUELMu8KMXfOcfFRD5lcFB361Es3QET%2FZvBJJJQ7w3eWOdYovo95%2FuLS5cwOfnPzimSbi7oj3yQmfRlLhDJl7WWgJqgzRucODTLjBbv76zm%2FeLoaHi%2BJdeHGXj1u0g6HeigUX1XDT0a09VK09ZQ6PZ3%2FXQQzzRsP6WMLj2F5WeBnLw0pNIUS3lBCimLty%2BFDMDFt7sdgsQuSWECFSrALEhnavcygKaOUHIgbZLA%2Baecy39ue4s9cEtURXChTuESk4vUPFiw3t%2BqwEFU27%2F6UxRS9nx9Oj4b42MCdO5bvqTdvYsmJdrJV1BmJOq%2FYbcgMK3daVYc5uaEqhNk1f3%2BbHQZsGTaqJ4pBiPzOyY9FUd2gQCsD9lHgLsMbl6vwLR2djxFQpmGcekjWdYo1L72Soj1bKMFKh7CIOhJ7lZWvaromAWtLy56zJGFy1tMUHdNpYvVgW%2BPUFw8gLufSCnFuoSHdqlfPvTJZjbNCkBG86ky7Y13FJH13S38Dyjgzqhk7fyRM8WpGx8A%2FB%2BDc0tUNPLhbsCm5gOUJDfjSNh3V8tR577gRWBtcnUWkSBnhVzMSme5AgIZFUwUHYWS9R3EJFc1j1LeYDAw2kuSyAnuLQpo07w2D64xZT8c4kDwrahFiw0FQPb8nQKHBl%2B8x4jgkXvH5cOV3fxYC39AXDNQPJDKQAkOXYyo3WcdBX26O38LQeWgpLO0hxzCYPmheAODG%2BtwqG8RZ5dbZA%2BvVCZ2LdctcYiHgQ9RxMj1YkbsKmiRnooQ9MKhzWLEQn88Qh7fyzU%2FzawT1guY8aShZFkgeSs04C4JOooOeAuEEsBAQNVIiz3qG3W7x7sbTX6DqDPksyPDJHFh%2B97wzejk5aB%2B3SgwztBjM%2FXxrXydYhSS0UcreCbtRQnG5ngvwXbjIizf1ksT0%2FXV3dlltSl0ck2IgNXQM2OIpD3yU%2FlY7IIyIbs6PianG6CihX7Z1Kz%2Fq%2B4kmxCUul%2BPmiE%2BMHH389rdVqT%2FXHUZhEoRFrw4aapdSzi8HFJ3408Wqr%2BGM5tNH%2FCkauIMbSBL4JcjJsTGGj6nr328j5YQt0a%2FvkMxszcgzy7R9u1ZVSJ0xLDV9%2BihmaDKdP873VU9wrWywaOBaM9lA36AV4BSuFGwNPh8VFLTcdJmLwYot3qg1M7anplFCTkN9kXl1pAkzIk0A%2Bcd6AfjPtGClHTajeRJVmqkVCfjzZCUxTPznFaHo7q3W0qDNCU%2BPEtc7OugM64RuRT%2BROuelxyel5fX9vBgJGkvocSkAy8KYJ94sPy8%2FEQfv9hLwoIIj9mDqI85gfe27tQTHc2%2B0m7%2Bv7pbw779gjbgMq%2BRitvmIa3Xrgp8Sn5mbCSx1R8UNwXMdVLqy6wcaPGutRIi3CbwWy41JMd3DSOSuuYIB%2FvhE3Zm738XKoQqDr2i4Sh%2BQJWR%2FeWrOsqua%2Fgtihzg7evvNWr31GIZWQlkwLWMllgC4U9AbppJhZ2hZry9ERlZGkCqiRBhoWhqkDWwF0L2rHojPr4v7JPPI5sl4CthRg4TX1hZ0UtZcvhsJlkJJ1WFZO9WJeFsspOZL%2FmTZ%2F4hDmZ4AiCmvXykE7gMSQd5sc%2FD%2FgalY3TahONlU084VSdXMGP5qj%2FP9N4rSrwE3BrWV2WNGZgJZryXnUzZyUQwfTrMbGHJsEoGoe1mVHmZDTJNNd1ofJE91t8yYXjBv9Om%2Bgf1ZLHtvhYeujlv4qbA1zp5R1PWVW87y%2BYfKogm%2BhOblHycc4kd60EAkY2f1R766ZLSWaC0L8CGEI6ETIhLGv4vO5qrv5UnEr75TRjTnGuj1Ht6NxyfhWoF2565vIQM8GDXy04HvN7IyddfTy1TY6JyvNFr1348XGTldqMH6UBddYXGXuqyle5MSm7Hp%2F0fjZHBXA5M77gW2usnKkn81rgZrTkEEbLEbqQkFg1%2BWryIAqDcgXbuU1ZMaiHSfZSXMSh7arxM2inCZP9FXkb2q0funsGwMib4x4XLIM1thNQH6CTv0yLMy7l7Bj%2FoSLs2ZTuWnpzb0cpeHIXTRtxttwDVctX2gVYYLfVeSXF9mJf3qvUTjj1%2FmvVYen4GT5%2FzfLX8UwF5XCW%2FwHlsjNnb7c3hvq4sIV%2B375Iyyj241PkE9LaQ9ABBOcMjxU62Y1dpjneiDT0bLIjXpVxguP2q%2FffrO7jsLdsevvOv6NWZuyZEZeXfkb3NOrhy3CJjN%2FqKKPwi44H6%2BMgjgKNLooBH%2BcKkpadCXlO8psuq9FV9XdXN5%2FxRykYiDe4SXK%2FLc7Okdk7K3W2ZuT1NHZj5h5v87qYkpRjf3kVcP0LsYHSd%2FFV4ekOLGvCSHJ8m%2B2dZJ6gsHE%2FnzpzYfxP6pcSga%2BYy1dn9nMrD3PsuE%2FBfPE64UgJC288a3lw3%2FnltT1Jr7lw38vhn%2BONY%2Fhn2M5v0Pa71Z4Z%2FnwfyZfiuUXrTaaReI1sJNZ2UzX3Bery%2B75raW9sla2G1rs4JLCktwtPbpCRZ1VupAd38dOlK6ZLBYO%2BRRzLHIMy1y3ov0pfsfuhFVMWdK7dxbujnk%2BS2%2BmvZnFD1NhvZqsQ5SEJ8zvijV3bxyfVPfE7uWX%2FBN7gip2UNTYjpyRT9cr2WMEiUtbApJ%2BL4fRydsIu5v%2BBN5twTuuN2IOaR0f1f1G2DnUSRtxBXNrAcPlOfzPyEGrQgsj4gE2Mf4Lu58nCkBzpN%2FQnYcdot4BJFzT14h31k7DauSgeRisVwIkdCYM6wCaOngvz37P3DAqZqfnYmaYKMV0fCwm%2ByCFFJLxsZiMkQIKyfiYJgdz%2BB%2Bs6MCO9EFH5NYNlQlW63hEhI4soyB8cLnEYkVE8HfmhE7I%2FrIfK4fZcYVOtPZixHoY3EaowBBOFiPAYPE36RAiwMNSI6iM5%2BC%2FeHq8QBfEIzsOUFeDogeOiHyZgoY9RiUEjODHNDdmOPgwhvwvzkf8CcM6YvF24QebzPCDZgj8pSmO%2BBix4uhnqgqQPmHsEh47iv0ZAWKz0OD4Z0StQ3%2FIowk0bgpDD72xVyNGnkio9MiGEeYdKuTmgGgFnMzB6UszwbKjicNCnNg3QIlzB9U8WFHwJ0ucBsBO1tAljBfzB1TJhpzTNnYeJyPXU3GJbQQWOlm1PBgg8rgC33fI11DJGMYWxpLih8RFRZowQJ8rqUINX6V4xxcYcAJj8ljRChjniI2ZFa2X0Jtrh48haaiiZE56J1wt5RY20NY93n2xbyyq9KaKIoVWufv48ZtmU7r5aDZfy9ceRQmy%2FHaDrRxn3fNeVxcxvNo9Gdni%2BcGKOVqgJU3MaNARzyMSXu6Wva6Ii%2BarjCIiBXFvg2oJYoHicT4CA3kfKGy0KChsrv6oNWidtjfZ75YoudSe5tUWZYGnpaTHZRJ2SSds6SodbBiv1dRcQqQc0aFvrsQnJnJhpt7cR%2F0w343vkzP7rJEq8zU2VKIE8YV6Mtma%2BOTGIlTPxZvKKLkD1KnCGM3ddAZvG%2B4BQUJPRRopOk5JJLxcf%2FLy2ydDDQmpWzHNfrPEaKw40adK9AH8iH6W328ytRhWRkjFC9jaXqpwoBsBER1SjrKmV26a%2FgS7bMzMA9Cs73%2BTTpaGOpoa7JedN2jGPg9mTJrP%2BVej9uUDlRm4N1%2BjwXlDdxRRcn5eWAFkZvplxMLO63TUUjjbYmLLw9aqfCrUEzUKr3wRtDm4mMru66%2BAAl43YAt62Xy2tfunIT0itzQtiBUvwE9wg1vx%2FttTkFej%2FTHbHpfcg6PQC7vECL3noSmkBon5Gam4P652Yf7lBzri7r3sevKhVnJLO7xer8r45qVGpNBO5TLa29jKaqIUfmTjN%2BViWxArtakkbn290zYuhI4i2DaEzmgcwrbf0R1glwyFKJDKRWklU%2FzQwVicn5rnxnzpsZX6TiUiVsZETaykXKHHnIC%2FDcTNPhtvMEuxyz4FHIsyfzUKTxuyic45EiqSM%2Ftoo6bqr%2F3KCbyYh8hcTSalpIkd13P5Wwn%2FuGGSPXaylHoNeKjTgAcdi5uOwmmJ%2BLtWwcTszkBYS0qxWuUEnJrwNQ7AY%2BdOewAO8McegLOiKx6AQ2bTAXiIjgLT4wZ6UBX6zrrvzyhMeq97MkqPoSnvDrMJru%2Fs7Ah8qVbf3ztznGk0cD4ck7lu0mO9P2f2RMkbJ%2B5MO%2F4saEhHGefsPCaCEtp3K6%2BxDz%2FSlw7pmvfYhX5Kb0GmIwfoL3S65NMu4R4f2VOkyZ7aP7Or43XkcEunxPVX6zhhxptKPRjVF0hrf89z8Nw9CbD7ciZsd5%2FU8CFj10%2B6s5mmAb5zm4QOfvMjqMY%2BD7Om5g2dBmR0%2FBs3DHyNQzZC9y3gGIvjGEw4QhoMk1Au7gkb%2B6mV86GpMnNJ6avtsobAPyeZJ3eNfZCNE8CTpu%2FEBxKY8Jo02AjFyWRhrxC%2F8Bytx41Pz7dffo5YeLkUto87pnlorxZyIXhOr7rOw0HDIMD4vvN7ssKxRqm2sR9CO1nFjp%2FMgiBOyM4MxsONdZRme6uFnYyBwyWXb%2BZDG%2FCYXB5Nh44HEEiHyd7Yd1aR60Fr%2F8BslHUQDxf4A5Jj%2FKEp2Q0KJVzbqxW8duJBDeOpnSzXib9OLj%2FcDd3k8nwF35Bt5ab5w4UylyDlsh8N3fmSao3oR2xDIRfrIW8flrRgRcGfyYKVHcGfbjBcwr5WUyja7AKOlki508RzlzBdZvF9ErtLJ0qi32EAPUDxHP57zixOQuRiydKdTj0nQdtMdz7f1zXWC4fA4yDT7%2Fsgd02TS29yM3WH%2B9MgjpIp%2FkkWwEti1wOqHEOniw4Cd5b2ql5HiaphvXpt0X0Q7oX2v%2BF3ej%2FtjYaNWkNzAvodCBpv2h%2BAreHNVs%2BZw4Spy5bfrZylXl0xdjtKIXSwvYfOFm26IgpCyDMalefalipgB8dj4Cmcm9Plm%2FAytA8kSzvmXi%2Fi28BCL%2Bn2BCZLhNmlIsWXl%2FZ9Kg5hLHVANAUwDKNJEErWPjgco1Fjn6Nu%2BOnl9udR%2BoBpWUrj2V76Uzo7IZxl92uwnUclmRQn0FZqFLvbInyx9DyDk2fQo4peQNNUvNUJZpa3bc2xqMk2O4lHZEUmbEklIqqlpj0IX5fefDIc5WgRcbQ1KiJSgybcZlwDDn4fAW9gtRNOfh8VAdJrETrAWLIXI%2BnFaDS6SSF67KUjkxOWEVcaynoQbn6PzKh5pmCjS35GTmwQHr6zKBgUu85jTk3QwwhutSZoiMxC2eM2C69iHApwHuHd2Y0jNgEWeKzWbeybqBUpHm%2FakpmbBGFjT8OdZ8kkSkDiauzdqqmLcXCX3MBXY09eevayOkdrH7eSikfWLMfeUGVp%2FI6fuFoa0lpgbIyv8QCDiZbDvWQ%2B184GSsTE3ElUyiaHz3ZVE3wc6zDwiK0aXv81fX9fdTaVvs7uLvTnTtxBavcCHa8dtnrtQYVGX139%2BumHz9z7BzrzkdsuZv1LnvUvG7J%2Bn2f9fkPW7%2FKs323I%2BjLP%2BnJzVoqL9%2Fx5k%2F7%2BdTbcNZ3Zpa7omJDeb%2F%2Fron12WGrDt8Fw%2FOrK7NTzC0%2FZNipS89o1G44H7kSr1pQu%2FF%2B7%2BPzYXkvNX7u60jOZvC0FJlC2f9ZtlgXfiiNtSPdNlxnGRqY09%2B2zq6vpfqnzVgGbOvexRbd2e9aLYlLlMdEYuJ%2B3DzutE3hjcKiJBlvseari9MC%2BXz7586%2BjYWnfT1tvOoejCs4mjVfUu3%2By9r%2BpD9Bt0Ickdu6Sg85BMnbHDY17Alkl0XD6UuYN06zB8Cdp9ZPqeojyQvtdu%2FfL4C3ezB5cwGi2ewetQedUXi9kxijUVyBqAa5Qm5AqEYVUYmGstsWGSLrwmjh1vdZhe%2FSm1704H511i136pBvUqu4lHs7AmUmwxFB2dnYMOK%2FMRFq9NxekI0A97aekkl50Fcsx4KLsCq%2BEGW5gpCWH7FXaUR078q1oGYELyPq5PVD0c3I6uNTTwVABm5HwcCKphpmvQDX9c6qoewBzUuH7ORJk846qzsgzPBPvkEhUnaRZhq6SHQep5IXW2dFo8LaN%2FgjS3XndDufb%2FNoEt79OQ%2Byd7kJWGBIBN7KJivE6plRsyEvHxsmpaZmFNpeIFEVsa1aMPjpZLqJjEtGu9cEYKV5t4Advk1hZuoMgqVPGmOlFLWsSjNPNnMaQKFcBFusvl%2FiqaTVUGmTDgJSPwEH7Teds1D57VxwEx7%2BpOApG7l3iMiYdInpG1z0W5HxBcQeurkJy1eanMOZf7xNikzcqNcz9rIxi6Tg%2BZCTlsWRhxOVc6s1g9fszhSPUcx4kYr34XqN0JFOuOjpqn3ROO2h9BxJPC31m1clF2hn3vc3V0OhMwTimbWhYHx2gt%2FojopG6zIJysTMrXacwg1o9GK8BB9ZXzGzZQlWWYZNB0QabKnnJE2bGwxGqnSfVWPZGRUAmfMOESCcIAEqov%2Foc13QkE78eRhrV5S2jiFqyKG3c7D7cyr8ClRaQv0vI1%2FuErmgM%2Fngjbg3G5GYqAn7xU0FLQ2gmE%2FUfohOhswSWQWXeg6pRq7yPky%2BaYZNy44RjVdEsipmxi6hmxs5T2ZJM9M1kj0zgELwFmXhpvTEEriEq%2FPJyaksKnLuBtX%2BVWnj3HlSXiCQjR6jLDlHMbRSwa2zvOvRqX9iUGlr41Co0SMwvt0vbrMX9Cg18ZnLbNpZuLpGVVjIk3S%2BpS6wM50Cm5KKZEMpkYL5%2FNBMhWs9m7h1NBHlXl0qEdZpfduwucQFiL2wbVkVd3oY8dIWS0U8cuTVEI%2FNC6eUUbapbX1pDaYCKMQ3OAHSggZ1IAiDDo5ytvgIy4HjNu8uAuHa%2F02C0nGQMfS4rEjoutkucExJaCqOCzAXvpzY06csGiRfeEFpXWfd44Hww6R7XYueuJqkRm7gNUMDXP6YoUyeLM62qx6iTTd2ZTpsMwI9UJmMFV9Mlg7wPCmJyctQ5%2FhrhS2DbFrrjdaxxYUCWfqhUOMWN5J5mS%2FiYSEgPbQRZjT9jDXlEVdxMu6Si5obi9XGLHkPHMPZfgYwdW0vGAH4kGbOCq5Ex5DVpRJIdBTRlt84dzY2G6Q90rr%2FV2N9Vr9dZgFDlmpps7KXLDjLSlWDCyYJ6dkhXE8rBb8R8zmgv24w%2BrzJfV7TL2dtX734qHQ7%2F9QundNpm%2Fea3krveB06qtEZDIK5sQqVDmGtRfGFFekfbhZp29XQlu0WvWl%2FqL99c39UVxv9swv8t%2BL8L%2F%2F8E%2F2H4XyXs%2FzfwH22ufoT%2Ff4Z%2F8Af%2FfXHswc5ZH2bR6KjTP28NDt%2FKhMvbJdEKzTupD2wvXm8ILRFX%2BUjreelFYcSFXaeJbtkUM%2FSKJeaulNd%2BtHBncV3qZ%2FEkqWxJBOZTcUkEvvqtO4XZWG%2FsbSAHPVKpkG%2B1x5s6fBtxruLdjHv8vCC3Tz4GW9A7nLSsl4Yhwo96rIpaa67nsXMja72y7FmMoSAWjsXdBXxsfORG%2F7MwWLIAYv%2Fz%2Ffeagn5bR%2BR5fR7aY6Y7FtquR2XsfeSRyZhmHZbmKmHHSuxbvsxOJ5%2BoRud9GbMvIFWXs5L704edqTHqV6ihnF1llIvaiOzXf4%2BC9%2Fb%2Fm8SrSf5uw0iVxo17oFQG3ORrSGVRpJXKouixUhkVvClmGIqmdBLNhDLx5FnHSzun593eoHU2UEYwnSk6C6T09ukb5jXE9uOS1UHwZ7BX0cvB2%2FaHw%2B5Jt2dsli74ekEHql4vBDL79N32958biQiDEWZwCt9ibv7xxdkh%2BUlLlyelSZv1lgoKSrCraQ6f6dYGsdrWYNDrwM65Peq3T9qHgy5z72DEB3OTE4RN3FyZald0G4zaDUVrfMWIrITN6X1FaHMp7iDEXCXG5of9ftHlxZfRCLVB8I1R%2F1PiLBPnLpkskhB%2B3dwmN4vkZun68GUDeJks0UQjWcXJapKs7pKpM09g9Zsm%2BJ%2FiAUXJMkre%2FpFcw%2F%2FpyoX%2F8NZ0tbpr7KvG7fobTrWvaZCLUsorG%2FdmU5aVMVh9UxKWtX5d8l%2FIX8jyc9B6I%2B3QagKHqNnjcSgCptPQEZ0A1GDtdyeieF%2BzI1jhRMh66gqG8rWx%2BITuw35fB%2BJZQm0cTO9FwDqOxSWoBqLJjR1JIMXiqYbGSyIgkNo4nYqPjic9o0MvsaLpTKxk6t6Iz1IRgn1YzVkKjxQZJHJiCTjX9QbA61BsPlpqibOkhqFBBcDihfj4Unz8Tnz8Xnz8i%2Fj4g%2FhIXtVEEDmoEkHxUsSIKz7NYOsu9spdzsVnNEeUIOKYXI%2FFcSQrNxHizB1fyiQ2ZGmLrL%2BGViUiwPHXAsC3xaFn8epEkNiMYBWrGArUsRYzrNxJLA%2F97%2BKTMo0ieykWwm0HJZgnNzgK1uFEKmplS6%2FFYSAeXdSi9RLwdS%2FBxBbE8plALVYmeyyOEcZ7skNH5FExkr0IWUiPQJkixJVoTGS4tbU4TMAvxWfgbUEmJw0Fvtp%2F90bHVqfOTKTRuUJc0txZ2pFIb1xRR8TpjYT3Wxe2DCJI8Y1VmzkHnkz%2BM%2Bcw8ILw1I5D905JWbKYqIPQ9qOZzGJYeiRzV4T7N4F342gLPXJns3XknPCgxkpqtPLsCXmOOLVXUuqxFwRy89%2FY6yhybf%2FAW8vt6yxB8pZgp06owoJwtQAszO%2BlhO5spnBlp79yJmvPDg09GLieXP5gHY5B0velCYUbczt8A5KHK9kP1xBme9qkKA5EtEzcUF6FHc9zV5HMTmVkeJK%2FHqQ0kYZWgXc%2Fl3kSwJQ3Q5l%2F4IwVp5bUHMxwLtcXKzwGw2S7c7%2BrstQJdJEK0M9HdS7u7Oxkws%2B2AE7nrr6k0%2FZRpzU6brcGF722Ijb5980F2t%2BJMg9AVwE595akIwy92STvrpJE4onnlgzSnNtLac1jcNefOuLEmjo37sRpGmvg6QsHqVaXcutOpdGY0ly8by5lcQkGZeJMm9QUibuFrjg%2FNfWp6HJ9gMT6EmGzHUwWYSAx7iB005DtIhxKmnnBbVPxSpsnpQojAlGrg7Uit6cRa1STXNU6hgx%2BHNpi3MssMXSma0TWMlBXdylLjFyWbO8n99LsigJvrS7bE3lBJn9SMktar9C5sABSxnp31xp0j7p7GPR2atmw7cA1x0qr3S8OiOtraAV2Vzoo5NVQAGbm4GzK7aBT2HpjJ3RgmCKn3hDm4Hm%2FfXGEHnla%2Fb46ByfoG0uZgKQ1UgSOPVuCwJhOrkUT1Bp36CtNkZm99hQYRgWTZkwoYRUgRd0gnFMo%2FkivhRJLJz%2B2IsRXXyNfwiqkSZ5pNfBg1pTd%2FtXQxTWQjeNIbHetSJqzYLKOVEjzxo1cWaBjKej4VRKmF%2BJ2DRAEEAFBi0DsE2YBEB6e4l8lb5OHA9W8kyZJ76jcB%2FZ3Tgi0Kk8ToF6YknMZeGN7Epdz5V65YqfwFFDKgSApj3boCKwbOfQnIS%2FnInWTa291GviBjCyACE3x44XaEsyXwtXcoqSZ5g08Jae%2Bm%2FyFPNHwnraaNEn%2FjgZ3u7tyqvKq8S3dC4Hv3WuGjsC6oWM7PVvaE66pNSrBrZSlBQVkkFdh192MFsGtOMXQD3MTq1aht6Esq%2FPjbbHdocKwQ3mnRedzouhG3tM1IB0bAGEQZRh1ImkgLm4wRBh5bagJdECgfFCqLSftkzaeXSvryUwWBcb25Fph0mMHhVNp7VCeYXWfq0c4yI6Z4yRdgiydzEP0rBM2yYu9tJIq%2B0f0GmQiF3EMadevCBVeEMv4BpnSw1tB3oCKSM7Ov9X1egILbFOVeWHw536Tqy5qUoAQlpEGLltnMjBuIZsYUUDBp%2B2JU8%2F2JwsQ8Xz5BMrGMBAKhjIotJTtf805pg4I0KY0N9Tgv5DOo0AYkmeu56mieZ7OYhuwZq5ldGa5zH1ukuyPoSJMGVRWJaU15cMGOZ3ujw058KxGHbliMlKkLpBjzV6tYGNty%2Ftt494ond6IU93Ux4hTTM5xPVcSzDAdz%2FKknuZgvM6xJwvZRVgxB8a7mKpjWciBm11jmjKPConqrr%2BQCJuoucSZC6la0takN%2B825jChrMkCSphSI%2FcPue1sNjdJ60QS7mG%2Fp3mDgh1oQJoNYjFBh9ViskzZcmKF94H67z1dawtZ1C2VkEWdP2ryppawTBvawjJtbE1pGea3YcUJluaUkh6wdBSFm3hWJm1QxFwk1mzOZu4FSzd2A1rp2fKpW56m7wEOMv43N4tRCqLfnEczywsJTRAt5WNMIV03C4vpkedOSorX3BUI6UaMaQ5ihBQz2ni6YRbmqVVKMI94Ic%2BGPphnYjF9Y2s2zEUh1%2BYWlZdifF%2FZWBbg5h5QqrFOSjXWaCZsdStSTDC3hiUbm8OSje3BcEnyKVqaRLgvn7HpKJbPWWPj5PP9HGzuLyZu4IKYZRMLxDxl7TKjTJeg4ep3TRLNFegUI04xwW4MW1V5Xb4zCMuYMvOkk%2FAU2FSvWDEJiV%2Fu%2FB2IQlMXduSGd9hpswJGR7kKMFrY0%2BBWBbt%2FKCSFPW1qdpsE12wvWYLrKzoWXE%2BgqUkIHd00mXiOLUMkCRMBTeVGiKDoW1CEGq4v6FB9FXjqPkaTzqXvSJNvFQYz%2BVqNpYQOulqUMWs8soeE9VK3I%2BIJuKnSwefSVSQH6xCRwnVYL6Sq06yYqk4nnqpckHG46QUZm6T2pYPhWIRIWpOmQZRWM2qO9tVM6XK0ubgKWXTdpDyOjGkOVTe4eZJyLqc7eeAw0%2FaPKIkW1UnoKHu8NDV0ZPkrTVHgmhMklUMgVHv8FEYyyYm8UbpY0nNVfu8nwgI8HzcdqNB9RXPieJKSFLu1aBr2yKT1pGOMyiyks44AV2UJ%2FZSgzELNNl5ZJWiFgM64kQrWo4WS8AJRhULnNNBoEcpn7wS%2FDWXFBi%2BQxO8ZKjpoOAiDazGhNCyQiBEBTd3YUsLMXrqeDu6Qh2YkVLxZlG%2BAIMe1E%2FrKCGJCqvvcxCuXUF6aKAuehOMlhY4IMH1l0ympmqDwigzatKdo1qBJXAaBxDwKcG31GLNR1qvhCTL3ZuB7P144Ck0JSfpzFSlPtLSBsGFZLy1pUyuatyqDphzcA6QxAaQ0ikseO5r60zz61qWp6Du5aaNiTkmeZfCba04GSZFor6QWf72E1X9izmBGNuVgUpORtLX4y3UfdKQmSwpz7361aBbUFZoLePgDFyFvQ0ZUisDZIWaTNSwQ0FSU4xh0HQdNnRyQpypsI0%2FCwK5qEivOBFd25MU0dY9MqQrGECgz1BSorwATDKXHsDZ58hm2kELI0%2FQ0SzdiMMuhoGoBrA%2BPpw3GM1q1GBh%2Bx6f6Um%2FjhnTPXbox5Yo0OUSYO5Fq5idCBvWZ9DxIJ1SnaVpdFHfpqAfYGHbPxSto9aZLTNLsCk1iI0ZDU7SAYY%2BjzAAGVk95C3CFmIppKj2xVM2hVTHBUKbxmMiNdNsjZCvu7F57F5amqbdhaYpyH6ZbolX9ATYUusMPj6s6aiQS6pa6ZyewhsoLcECGs5ISI93SmoM1B52FRC2vL6Qr8v7SDuX7DwbSkE0xQRljIVEd4zRZPRHhKRqaElJMFRqpiqcrY8zh6rEaT5DPnlJw6CrtVvWWEaRrKYKXrhasbfm1pAEoK0QjoKm52CnAVV5UTNSchxeTNcfhxWT1NFxIVQ%2FDi8k6zTlIVU5fGFSrX01J6kQgsL7bmns%2BgmsnDKWYUKCwY4JqJlYU%2BOG9QcRY2vGiOXVWCiIArF7sMbDCFFCH0HBQUVAvlMGmVcWsvmiqw6DZWJiUuld0ddyZ7n99%2B6Y5ldV7EKhq%2FyJUmewIVGc6QqUjTj%2BQmI%2BPkcok9STSwG7O3FgH1lJSoGrPM1CTKVzoUmB%2FGisX9zxNOYxM4ebKQTJTFBh0u2eVmaBJgC0JU8A3FD7NYZqVMU3RoYEnqWSdpqiEkqova4FajFZQhabjXM0yWKYrnaUp5xhZyp0efK%2BA5aMIhEWTMIDN79hZ2Deupk9SuqF7ci5DR%2BRsasvlHGKDV%2FZ0KktLHKZpmJCiLJViqro0ZumqHJEm6VTbhSRjpUZRIs2gsJc0QWUxaYosTazkNQsBTdM1SCFRc9ZZSNVciKxsF0%2BXlFm9smU7FIJoa0e4rmIgCdQjklXOC3DdgktaeFp5nqWo0jyDK7I8N1VoOjfk309M0jDCTAlHwyKyNMPp9ip0U0U93VkHmRuKTRDLh82ivAoCKFYAGvwTWIN%2BnXKqwuLxPEA%2BVgjX43vNPpPAWsRFE1tizmWciadpeKmQomEKmnRlluryqFNVyqWyCTGDhlnoMmxojJFxiNkU9iEmq8MqpsushKfq2K%2BYZEZ4OTPWZjJ2soQ1SznMSN%2FAqPW5NrbIhHcz95YyGDAf%2BfZKM52KqYqlYjFR2TPwRK3ap5TWtO%2BkI3Y5g3LrxzKMbZ0qVp42XysHVXmiKpJFC3vFzySaGHUvQi1rTQ4dU6AE3IjKSxdL0R%2FBwQIjnbMQpCkdX0ahcCK%2Bu2v9xO94Jk4xm16lhMA6IRntva8dDag5taHVYWjr8lOiRgbmqThcE4lVF5LQB50ubYnqzXQQqks1t14zirE9VjdrZKTeBPE0kOwv0aBIQ%2Fc5uClrlxeSPNmUg6WpCzPBYfs%2FRmJer9RJShlyrZmyNM0QyzmUCSdniK6l8wldhqZ826lkUrY7co544U6ufdnRCOVylrAhk6%2FWhBRTR7N07TIvZjE0EXfcvmYE%2BImrmmA6YGeJuq0cpeinPSVp9IoY3HDnSYlkUqr4AqEkilFq2qBKOcyIU%2FaAGVQ9z8iTNFhOObfGskhaReJgPVk0bfWC3tDZFAqL850hRSOv54maxmKaBiEZWC8iFtJVu5Bios7wo5C%2BCtHTZWx8v8w0grIp92Fr30WfOM2xOxXvY8lQCwZSpnGCa9yG3DAPVs5spqawy0wN77xxnVv9ui%2BkqKu%2BmKzeDInpikzAknO8aTJod0U3AdrLj21POahiKdrxY0kaLQuWsFL8dzC4amOTwmMdGBUWJObJEm7wDlN843YBayhd9xjhep12WELl%2B051VUUflXhHKTcfHQVq7osIrLt6ogSFy6AlI9K4wmPEGS5i%2Bg%2FNwekfAYjr6XM1q8HUmxuatYl26WkoAsm8sGEutuCHOYpMfpixk%2Bh8kFwDskyqY2SpbU9e5K3LgGooNvLb1znutKk3NQz9HYQUVJosSFV%2FtuhoEp2tQeZLcvDdHD7TZDsbtHvno2LuOjrkzwDPrFryUxbNpwjm4XyUInsXJ8yQUHUK%2Fa51ctEepY4TNRkKHuqE4GqVIhWB9HyCzh%2BZo%2BYoi7q9XHuxS75V67YXBZbrU%2BQl6%2Bn%2FPLVg3YBRg4xYvxvhkY9Fwgm6Vg1mVs2JQOZ1prW0VMnF8uboSKn%2Fxv%2FZp9BqiLmdLfa7mLE8tgzDu4wWFgCGKtjOXdw9NKqTEm2dt1mCZeVXbzUQ7c%2FtXygYsuxPuRDUDAOaNeVwZlkgsyLhCzkyx%2FZ7kt8X7g3bKnrDVtt23uq1z%2FopSoW2AR3BqjmliYU%2Bd9kqDr%2F5QmKB2BtDOjkAiSx2qGkt3TvXt2Dd9LatqTPbwRiEFt5pF4suhpKri5TComhhghQNIPcAWZg%2BOmRFe0WMb4tEsCmiZKHsndU6WggRQrgf0ZPOWdvsRrSas9HCDK%2FXnkpRcoqJT2tPxURirjuSP8ptaeBm7h3FzIqtaQCsGKd%2FOt2n8BunO%2FNUGcHYXDvWzl%2BcpbUndPaTfv7W16GXTO3Ybq5Dt6EZwBIny5u5RDr%2BxKqpdH%2BoySPFjBPTxVhVGtyljl6FpMJEEOA5y6kX%2FMNbtZ9%2B2i%2BuBNvWi%2BeNai%2BaV5GauYTcySuy0I%2BXv34cbu1%2FlF5APx50ymb9Zt%2FYzLmOVYexvl2A9AVLOfNMkqq5NqytbE3Y4oy9hALwVGbpTF3b4iq2kVV346vvvn959fL586uX372ILHRqgLwCCW66XnkgQMcAWNBCBHwBJiaui4zfoJ8FGEsQaAU2xJVv4RXZc3qlgB6cUGXkRlt7ck5GagqYrRTVIxZuIrfM37GQ9ok19OeMZ5Esg65OtIUoLoHzLKpsxZjY%2B87gLWG7z0IPF1kbl%2FuEEX5oVOqcIVMlBX6qtui086FzNnpz0eodadcaGRe3C9G%2FDwtv8R4IxhjiouAhuAy3WfitAjoa0iRaRyj2ANVGyCmXSNCpRjjDokj0T1NJ5ClzhF623ubUrw%2BDLAuiJuotJ1I2Ypf%2F%2BDx8bCDxT7lD3%2FqtM75242QZ%2FIEeh4NGc1fxHZ8vTqkDYSnDlwbpKUoMYxLNc28dedwPRBetGkpYwUKEyD1NfMiSuAAbCY99ct%2FVlz%2B%2BeqJZtDZGdtQKOHK2B7ufLwihRtorjoHWNX6K%2FZ%2FqzPt6QutAQhq9TpxkZ%2FVJvYli7PBZs7EPBZGL3CiJ1ityIJ9Mg8kaTY4SlLVpv57grXiC5xpULC5PuvEzDA%2BXFf7x6bOC782yYDqHTJFnN8ubJf60y0YCZka1odCHo%2BGGAtqII4xx0UYOl%2FNJbPH9BUl86OvfCfNGI18jMzA7go3fAkERbvZo94guxoip7Si1EGOEf1sYgAN3B1t8w7lyJu7MnVjkgwUHmm0gYN1fkke0GYXsYAqH0Tb82NlRSwc2U2SvFDgEw4cEM9iVWl4QRNRwLGkSRc0VkmBorX0KeBCjAPIUWPLu7lMLIx9AI7aVKiKgYtzHOBPUmbBeWCmmWXyRie0%2FjSHVjq2%2F%2F51ve2IXcLPX2MDMsnmiE%2B80EogY3%2Bwv0tyWWaeheJEHPGTeqNPmYVNCkDAq078QXECz6SSfUhaNKwyrvRy783WwBvLi4QZQ7NxxdmCskRRQ0qRuIuWTRBnbc3lBB7KAKQB7UqBFTjvRxA7vkZyubfS6jHp8IC%2BTTz2YKnyS7SjlANnjGmfRCQpMmSmQHd%2Fzkn9FOpiNLJQ3cA8cVZq5RjqibdDOt3t%2Fpojnr3VboQILlNOgwfluPMKsDEFP%2F%2FHQSFx64cSwxKL8WLZKPUCOKSPHbMH9CAvu0ye14cdHijqVdvdV9%2FeWIvJKycXNXbbmkqcvtv7JsU8fv50kggiQQ966MHHkrRsF%2BgH2DQzbjnASVaTRXCJDj8TVZDHhICCNIgJVboiLuPnoQ8STUPS2Qr7W8zIkZy%2B7NDDfEorFEiq9Tn3FEmgua0qp2g7Widqfa5oXGGYMAVweIoJnta0iZz0NzIL4Hg25dJ0gDv5jgmg%2BoB17jf1iW9JLjEc2xhiGET9ZKEY1qVTIr7yAaqNy2eGcxGc6TkVpisJHOijoMUYfSX3SBU3SFYySTp6Fx2fLlw68YXFjFsRt7LB7AQOX2HhYsWGXIl0Ale6Uc3b3kRHBk0%2FqpVJOBZ8b8gJRtvIUVgmhMYbW0xj%2BRw%2BMi%2Fs3IUHYTohHmhpkChn0r5nzly5pDzqnKo2xKN4Hw1jA%2FmSEl%2BV0733jlAsDr14%2F3f2xrsgD5tOqSpHaougrRGpzo5UuUhuAHxmpjRVcLX4u5DXd257AmAl3oLiZbzX%2FPcKlq%2FmMgtHj1%2B6Pr17%2F%2BdshT8W4TixDIfGb4ZZ6JXraPuQFY8bk8tfh1j79UrNSU%2Fqd03Og0DxiFl7LYjDUq6tnDXpz%2BqxOyyr7TSm77Dfwg%2Fo0cZJZ4iVRcpS0k%2BPkJOk3KP%2BzpJm%2B39jXVU4BZcv25togz6JIFH968TnxXY8LQWVsj%2FWwrD5dXLEH7ye0SC1dwaruSL%2Btj5ODxuXz5ovhs%2Fou%2BwuYLX0jSLr4xl%2F5G3%2Fd%2FMZd8qFRiKfH3suetG%2BbxIZv65PkkF9fwQqiJzeQG6xnxmTDXoxdXZZtgEo3x3T1B5RAq4Lrg7TuxnV98LptQE7G%2BPw1rM6ak3e%2BoKQl8kdhlar9Q6QrOfreJ4Ekip3RXT2wY1%2FDok3Y2TLd%2BG6VThJ%2Bilc2S9QQQoW99N6fh9lYpkyurL40mriuH0IhD7xiznghlp0WyFmjmo9G%2FQhEiL6pLV94iy7xjJpst4MfzgglKCNBCcimhW4fU5n2WVeV8TW1WFujtm2GuwhOUBK0gPCNvXkcO65dPv041N6gl%2FKSqiyOSiaLJ6u8fCUxPzz%2FlEplLFCbcv1gZNZPcaqlRP1AChi1Bt1TmhwGlErViGLL52191m81eTEC596eFt7YEno71LR245xkp77mmVmGioPu0S9y4RuvojYzH2xzFg1ddHOvkJIgf0iqpvgxErw2WvZGzlnWBd4RJb%2FCP8UMJQFdEb%2BF4S2gCFOMKGIUuq2CiGgFuMJBdNxUw8Q0LIyv2vK%2BT2VqOpYGqFHVSvRdL9uWwb5BJIBM9ACJu29SDajCs0kw6b9tH7TO3tTlk60HLEE6LGlHzDxmmlGruoqV7B4BdV9j93jjoM575IQ3TqjdRxYzPHZHKVVWcW9ZfMu0yzSJiI%2B4%2Bvwkbb0u5%2FEqorjDQ9iE5fvU4Rbb%2F13u0GZ2CJvE%2FT3GpfcbZXsPzPNkRAU%2Bq5XfZ1QT%2F4rnPH2ZyVQ7EaJcb1v9t5uOlrjIX2s28fz4iXQtIOa5%2FHVvuLvL8%2BmZBOvAoDM4ab%2FQblQoKduhbFzDachGW6E7J%2FwWokXTqcJwSx4Y%2BdVLlp3lfiYv2%2Boehdr3skLTJaKSG%2FaM7%2BzFOkp56I1zKBkA6I63ZrYXiQt7QSITSTRTEK49ATLo%2FtxpW09Gxx1UPX8yetMesO%2FRQees1fuFP%2FRa7%2BHXebc%2F4H%2FyZHpi6f12v9%2FpntGv3rt2z8KZTbb8%2BS%2B8lJ3TkTT%2FG1Ha2nfj7AfmQR8CEyf7EZHk8h7anf2I6DB7HtqrBT9%2FHt%2BD4IpfeHM5Bx66oHvbtR%2B7nrWI4xXqNJBSIzCcCYhGeAHMFCBIBTJ0bO9v7MIzItcDC1KCiOJpsI4xbKDtefcWTFdqPyKRvlDlax1CZmbKb409e3Jt%2BS6%2BH7l38J15u4voJyraT50wtNYdP37BviP685J9UwbX5wqW1LgI%2BYSNg40%2FLNu%2FhwbNoGxyqmDNwmBpLd3p1EN96qllx9DOyMEj%2FwkqmLH77HjhQptd7Avl8wBHwH5BRrTEv%2FiHfuPt9wv6QmXM%2BHv6op9O6DuoIgxtdqnJzKGOhRZw1CgLLUEtL4AOsODiztRiRlPYCezn9%2Bwbu4aumOi6mf%2B86J2gEkgc3rP7dxb8F7U4GMZxNIEmgmvo1dj1qT%2BOjTlo2PCiwZ1cs28ruo%2BwPTi83wN9WBgrskNow7HGscVRyUcJXk%2Bpg9wfLazbRQAV4HsDd%2BlY3CWnFS1gfePaBzMgL0TLHN8fj4HOXBt13fE3B1ir0L1B7Vacv1AmNtqdWVP3BldICy2ALG6eMnbjFvyCP2dBjH%2B6BPsASfYSUcr0sy0bXrBY9LFMhCKhn5ExsSPSccFpT6o6%2BFcWy%2FnRJLCEfueDNWifWcfd3ulxG7bWZ52ztvXvdq9rnXXhV%2F%2B8ddiG1Iueddw66bctVIs%2Bsw57J8fWeYfWqJbVPjvqHiNHsdrdY6vdefN2YB133rWZDGW1T88Hv1hY2qB30bZ67cFFD4uw8NKDKu3RKwetw5%2F7J7BagQx4cmL12%2B%2BgYYPWgTV422vDy%2B%2B7OL1wxEnncuYAtn2cx384IeoTwy%2FSGKPpyTgk3UQBpkJvZq1cUvexEV3BjFEQ4IdGHMYUaJTthMnxs4WlIedJmfUkpGlJlZLpsoUeoCOg%2BQU7WCMOYsX22EKzeXj5NoB%2BAVckFtkDmbEFuEAswS6kxXVc6fF9DwRY%2FfNRp6ck09sXp63%2Bz8XsDID5C%2Bn56%2FSs6EFzjXGggxVMCnscWfYkgC%2FPtaMeBnIlnmz7%2FtoFlJA1%2FBGJb%2Bx322e%2FIyTM2GZfLy0bOC6IiPB3jv%2BPYCKgh%2B0fvufvsgf%2BMj5gbG0nRLL37TCtgT2kuYDJs8DV9HMQnK2XMKsmC2eKnCP7xfgtT3ZXsGyjtBjlyxEvJHs%2B53anOYS%2FzJemLD8Qjj9NC1uu0PE3%2FUDbRCY0gASTpkfEOujrGLlkbKE9OM88dWcpZplTbrSrRnB03SfyPTrr90k8hpl9t8L%2FL%2FDrJf16jurwtIwiBcO3t44W7RsGoYB4TCMZ6kyFbtaquROwi%2BBTB0Zq7gVjYN7sT4QRS0%2BdZQDcF9AH%2FIbnQmXL1nRKzS78BhRBkQQRfgyCNLMbndFthNXpdwfBqT2hFYIjkziTh5p6sGoD04J9BQxdG%2BPwHQEF0XPoIeKyx94JsNtDNggccAKrzdvB4PytY0%2BZkUoK7b0twkLvFC0YMIQgFgktPIefuqRCbe%2FgbbZd8VO68%2BDJf2FRAFKGUS%2BY4%2F%2BX%2BAXjgivfMYwJBvCGh1u8ILcngwBQwJS%2BDxdr%2F5r9HOCiuaRQ8qwJIGcs7TtrOf3LkQu7K0hE9Vkf%2FoQwk6C2CGZUa42rOpoc47CimJimpC%2FxFT77ERUXfVEAWJLOJSyerDM%2ByRqH2exhq7v7h0NN9RHCRhT%2BDIIDlLzoF77Bf2XCHz2eZQVazBjfgpnm0xejXPwF0w9kvUh86hyxx34wuXbigtjHR4J0Gg4x2AD7yb4hn%2BOEKQGu2Hp%2BytADzyBLkaL%2BKlj14ynyJPi1Zm5q%2BzB3p3aIUOY%2Bu5D2jvYmMCsBlP9OG2qF8CZIYuzPAYmiINGglyvCG7QFhhf%2B3ByCNBI7H05PBrg4yIBjEOeQdiiBBWvuoQeJqQLoRMckfqhwJH0EIxkzroounhmeFHAHJigsWgr8hKZkpCYwKtGCpxow0YouZXC%2FksvxfWCCvQxTWQJFfhDyIsLzpwFu%2F5V2YQXpM6L1X2sH2BoApuPRxAvSclMINWp8z4m7CJykmMsgbuRzpGUgL8dXBvPTJmWQOO00QZZLNy%2BXOi8%2BkXqoDMHtA4exYQ8z%2BmAw6FOeWwALr6YohafpOOa4wgc3Ehvj3DmTdZwmA9sAWSn9Pc5%2BL4MbZ5YSJH%2F2bOHRZxMhfVyhYMwefy8MDf0mrSX2zLpXHAPmswjEe%2FZI3mwyVL9x4pQAjkDodkLiwpDAKLE7Y7OE8naBOaSZ5WfKQCRTzCEADmDNzIA52dJjJ2rFfVQ1FiBt2ufcXPjuHVIkLIdp62D6t1KLFvk5kgHvbG%2BdQQ8xNPMhc70nwLIJgQDiMUUGg3cDZ6lphZpNm5zOpA%2FY6mw6QUL7BlqETKzQHeJO1BAOOMX1DljxGS5XDHQGFNF3xxh%2BN4VAotSZdOCoLCB4DmYXG%2BkD7rqCdSQW1guCuFBb7%2FxwxHrYc4DKorgAP%2BLmJlEBRoJI4RlI620gvAWQUwc2klMRdk6LEQNx7p%2BVmU8mKX%2FGnyW41IEUnHK3IjjDfQoJQrnEMIgDYEUiVEUHAaMV8B%2BpErYUp33jKxj%2FmeLuHca5BiwfDYhL%2F9tdHTmoMD%2BmvTcHtWkrne3HGRAnYCsEKrnBwki0juxlvtyiRJMeUPBDC3ZKxAWCaGG%2F4BJQtHBwL4b79EwWw%2B0JGZ7YIFSihMygv4dkFiCt%2FGiY0mNNYGJCBKJPdB8xqmAnC6l0iFsejJdAQjCeg%2FCtC%2F7kGxc6j0iPJpbMLAUPMXjL4%2BCEBMU4uFit8C96blmR%2FQrsPfHoI80YgjBvwY6EVwG%2FeA1rehFkVp6CorSf%2FgJeFK8ja712pxZOViezY2Fs4iZF8Q3v0q3tQi9WeATiONdT%2B57lK7TkLvLi1goE1j76EAJ862GZRINpJ4E9lbKLoCy3PZ1a5EmFHyNi4zyLQrsx0Ts3xKEdPB3K0WEe2%2FxkW6p7OlKiBd%2BKGPVyqc3iPsiyXRv%2BoP3nhLiE5Tu3bAuslgnbuPB%2Bhds5z4lzZG5qBkYoolO5qXvjkoG9BeRLJbG4TrA7y83v6bAtwpX4GvVp2Y7kKLj1PcDZICA8MSCQM2w03sbxquewGqN8u3Sxwvzyc%2BFtiuDV4jWEXh8eYINxaPNllmUCKFtQ8%2BfDdRQHS3nvRQW079Bd7Ivnz%2FPcx4PzE1jWxc0bg58ilRYB%2FThY0YFbBmQEnLcJe0QbYLY9g0dn2k6fI%2BbABDdT2ZA76HsiG%2FoVMvIIKJsOVQsnrFAsHammGUMSLVJZPr1AszKUUcgQevMGthx8BaOnFW49AEASuihv0mNRrjgkWVCErO6zjQD%2BZuTEnwr1HBEF5snsWckAbS2y6SxXysP5wtT%2FF7X3TYDUCj86sAKEcaG0U5Dc8srwCQkRlvp8m8KAtAGXYLjey7B06Zbh4nOhBefruOPHQQHSA%2Bo%2FAKoo4q9vkgMhQSNs4fLGTgSylZvEghR3snwAefnyxnMe52th%2BsjIQywqLUdJkGvuK8JGXyNs9JVFvq9d5PvFlRsWWmg%2Brrso5dFhhwJNSY9BL%2Fz00MoxvKfLUSjjkLFv%2FoDUz5f5TEBAHBTFA3T1MIkRwhmdBv4u5bosjXV9jo3I%2BARL6dEkLhTfY9NZ0xcppVB1QThBuQOvSoCFIPajledyy0ILHYyCqDCmZoKYsORGF7BOA59aE%2Bu2mCe5owDbO11DPlxtLfT75QgaXJ%2BraUp8if281nabzoKLF5nQTbrydmeyYrLavA0V6jz2FWosOGAw52QKUU80RmIm1JSgBz%2FseleTQDe8rfNuX1CiNeRTtW0NGdndaYlFWpbzcEMmdqUuw4f%2FufGRKeLZA0Ynv5GuSY6feTPKRs84RAYUPEZHfRNl8tN%2F6%2F%2FR5n%2BXNoGH2ipiS3QKtVqFOSX%2FiCS8Xwe%2BnniTJFVF0mi34qdodq%2BoGeoUDYtaJ6wmVV1IzEWZXisqsxuRVoUSKlFBNQrYOPrqyGcudAQlJlGrKHeH8o8nya%2Bkc5X8%2Bir5c8LMlR%2BqQFfUK%2Fs6qnTMO5ZBjY67znq0Cl1WSZn6HFZe8A9YoPua6CYdfSPAXoOXVMgmx8IR42%2B44uNMcvJLmgtiDqYbIzpllaKvwzZafEfnu1e0262xy3bZ16vofx71XASA6nmVVGDEHvosBpPUcVSaEH0JL%2BQonai7ITbZmdmwzZRcEEuO2W8V37e4Hri%2BFAobD%2BClJrGjBQHkST6A7zHItFy45Cqb25QLpPHPfuaPAoPpOkxnxE4PxywMOi28UJuLNSNIdkg8dcbr%2BVyKMGBH974YwdZGWVfEEboSFzMxA2ORakIp9gSjbQkUowqM1NJO%2FBS3baQagFL63LG%2B20YtnMkCXdPU8IYBvb9MIRknDXp8IU0v5ui44FiuRjpjuUvdjB%2FhvOTax%2FK8xPM7sSO2TLd4mSR6oPbJQYgjju2ZfSY8d3xyInJvaM%2Fgl3NZXRSQcQxl29Q5z2LxzYrcoUsQoZZj3Ww9CALPkaIf9xWDKmSz3HMkSk14Jlys7FQOeXYk%2B30%2BUywZawfuvOPLtIjnrMWWKP4iaz1n3r5byYSBHpMdVN%2FwPH7dVnilpcR8OMZQ5t%2B9NCT88L2aAE39mwq9cM3gQ89erpyptqgXP2jBuhZhWbrsCNflZ2jVdQFS8CVNEmAQZGMj%2FvoSfziV3Fy%2FB2Yt50GYlA9qgfGETfIar5HRm6g8Rgdr1KMRaXFhhxyJmtRWHCzdSSTTnv3OlVaqf%2Fa7Z1Jb8HIqDDzUkaItPu7q1XkE%2B%2FqlK83yN46PFx7SkppBtfOshexTlwIt6TkzjnWBzmeK33pozJ08cB2fxUCHt1G5w5aKgWR5Jr93xq0ocpZj714YsAxqYEPtXq%2FbG2mYUY1uUoSW4j2iCuVt1aT00AO7BpxqrKlJ%2FXvgfHcqHK%2FTVOhFr8OA%2Bq4dXHROBiN0c3DSPVA5PyyQ1PQbKdokwPFsWw6%2BQncb2hcoRfcKl0M1y6JI3I5cohsd49IhRXqO5BWGHGsRc1PBEheuTUnsBozpoYeoK%2BfLcUYcX%2FdSBjW8RP7FpQWTA8sHirlQT7ck%2BfvyQBaKJsItPBfIOQXqPN5nAr3Zf8K7dv%2Bw1zkfjITW5flQMFgJIo%2FFg9YVtkSqsUWhYL1EgnKjI2kCw05FAshHHBhzVIKIYhzJzLYMIqG9YnP1GxsqV%2FbwWmM%2B%2FBRg7EoW3TUvCFZKTyTA%2BF4CqC5l0SusXEwo40Nujxv5Mj7QsezDsZh54pLgskyMb8sDqaIEndvh9mY9X0gp8haH5uJaroJpCMp4diO51UtbxvxotLAj1LRV4BrJneBKPGqCjl1lNEYjin%2FRnZVSW0piFEFCOCLKjGPSLCmX0BCoeHyR6dCn003zZpokvpmrXWcsQPNullbqnP%2BffdEbCzNAejIa1vf3muj6IgMkwlND43uFjnGq2zwVq9aYUPUvDlTbZ8ETw3os007qUevbqg6m8yPmfIjL0EWN4m46vrRtOY51TdyI98d1oP3hvMesrvQmgRsO88rMtzXuYwo%2B%2FekW4Pnl3Qf06YPeVNDIbfiskbAU8pRDP6cJ2b5NG1vM705dl9TYb%2BzXR1uXTntYv2w%2BG7I8LDUp5Lkcoa%2FgLeWItsSFmtFPMzup5xb3u419uczSKwPxET2tpfrQMWnvxwG5SEPDmxkpZaA6GrMOobgYZF4GeSETprgxmizh5eMcBLdi4Z%2Brjpc%2BOsIXGdzvPn36VHVTl1K0IbFwv8EoL7XeGQEHa523h%2FIrGtP8khaVtOe%2F35parWZujyGx9P4nna1SKzXFWIxnmVM4N1PTH9nlkg7%2FH9hdcgtm7DEwjSh5onHluCnQiMI5StxNlMx1xia%2Bylyvoem2oZ%2BQdjl3l8MtXY4NA2weNr0R%2BtcaQGDFhB3ukptpYzCTXjKmQu5LfqLvrF3rJfz%2FjoxFbwPSxYvEw6vNhW5t05km6n1wl%2FVokFnjd1k1smGFNWBpk3XNVCGHIsWBrPDNpbU1ZA4HdpJLugTDeDYNdHrHx6K%2B%2F%2Brq6n1j9xGEJXoFF%2BS2MgpM3%2Fr4UaYHRi0aOJsM1QOjyGv3enzCb8eg%2FDxCjagdo5f0iQCLTlkKopIiRp23eq1TJdRWccoxmyKtCKjzplXuKnR3y3qPeqVoHuzTri6dTmjCChWSZ3ryGs4j4yzsG8dC0%2FV7HkOrWNzKdkPu3BXDasEr6HMVtndQWtpwa0ugGHP0DpmuvtSrrU6SVTIVmsG8iWWnMoXRklzoP8Az3i%2BnB10698hJvv7tq9cJ%2FMMxS16%2FTpr7zdfJN83X6MtDdbmBTopHR%2B3jzlkHXZTKBFLiXYTM%2BjS8cZeICjVnVJQVZqKStouv8O3xxrclVqDxUvLI5ikVCGMivEnBbhXx%2B%2BUeHknEnrOjXEzi53sxOd19OtMSvbjqW6cN%2Fjb6jMcIhZP%2Bt0N06kW14caKhQxFt0fwb8vk%2BahA8%2Bk0kAZI9LyS%2BS7dSp2FM3eqihf3Cn5frHS2SFBa%2BtLoH%2BMgAN4TbuAY1dTJNmt7aaQHxqdluE7Zqzwg12O0huryopkF64C9%2Fqtk71WDPcGOlhaGHRqUDIh%2FD5qvabQ0e078sOU0y6Nm0aoRfZ02f1PS6svm%2Fww%2Fvdh%2B%2BblC65W8%2F9VemPvwzf5DeqHJremHQo%2FSgiVVIK8qMnM2rMBSxzWRYQzR6apMh%2FIoLpWPQobaw8lyNS0m0n0FFS3vZqlTzgLwI9WyWMHV%2FJlBXtNdD9tC8PNUelAEjsLZ7W79ssm8kD3ZGQ0vr65un%2Bw0h1uNXfWc9pfz0sNLVCrSn11eXY1d8oiNe4oIZKJxcV%2BhykPd83avNeiWup1G%2Fxny9XbJAV3alFelFZ%2Bjj%2FiLlk4GE4R0HIa1Epi8QvXbpdV%2FbWfbWbWX0Xq4z05Rfz49edsb7uenqcNnarC8wpvNZ8N9NnZ7lztD7r8cfjvtoTatsb%2F7NbzQnbQO2qVuznUOlStg4lfk0SwS3N6u5nzVs8eOGBvpy9r%2Fn3QlSHM6ldx2%2F7S7nc3nRslI%2FgnHp2yov%2BUZKu970ogKpUwBpevHdfCnih38aUMHxVK%2FqVaq9BJVUfYikBD5DNvbZfw8COe702AS7eIBQ8%2BZ7Szipfct7gKmqGaOCkZRqm%2BklBSMyVbNu0dlSdefo28wd%2B6SfSqL8wUb8DSQHQsKakcLQbdGRNE31Ye4bPNy8u7U6vTEUYXmDrpH3T1unkTe1FKXQ9jg2Jkzh0PMNxjtZPS7G6MfQeoFeW8jD1nM09bUAXILHRbjzEkdDGU2tqkrNM%2F1r51wlD66XMnHsm9s18NJSHfCIXO9h5kD3IikP0bBNLRuHfuavujJXnFfL9bU85gCKf5ia7fFhACL6%2BxaC3c6dXy08sTQhQ6zJQ39ERWZVkwOvOzpiNkbo3MxCtpG3nAwjCAUxlx%2BoTE3tBq%2BwjnZaLsr5jXO9ux7dDN3E6CBqYeucm4tP4L%2FPhCM7%2FpQQPSHZYeTFVJKDFWj2Zjrj9HynBxwzX20hQ7ZIWbEvXowq2QmjVh2tLQwnjrzsWfNJ9Z0PJfwyzpm5y4lxtCpazv10sS6hZ4%2BmHH19B4oy%2BUPBF6FMJx30GmaKSN805pMJtRq%2BDMJvCn8ufvbD6MonuIRFH%2BidPZoh8uRvZpE6U%2F59%2BhmtoLnVXw3mjo3LrrXgZ%2FX6G%2BQgvE53iiYeKOxC5mW0er7756PABrCU7RywxGKYuwXfwWr%2F%2BH7UXQf3fDGwNOt6%2F%2FwPX%2FECcrbhv8AiXPyUYIjTc4MfWA2VgQTD2TRtQ%2BvYmRgPg%2F9gA2CDyhaIbOwxvc3QCY%2B86RgT8kPHf7AsJc82PaCvCIFPPK27d3a9xF%2FCFZxBHRlRdEK%2F4MUS3VN%2F8Bi4JUlRsh24xlqY8G8vwaaJf0B8v%2FnYcPSRxBvs3Da0AjP%2FuMeFSawBt4m7EA0im8Rx5GNg%2F%2BHM0qJIQMsmSOw7JnNBmwcMEh0Rbi%2Bjbn5JRYIDSI3MsHK%2Fh2YAbYfSoe5Fs3hP2SL5sAb4XkNz0i3a3gOIBu2KQB4AHD0thggPJwCrQXWGtLXPh7a25PfR%2BQAc8IssGlqAEuZIFmjPif3d4nKcv56ldrTE91MkbgnMfOsxdxdBTE6NwNEAmJAcI1IDzK%2BJ3ECTYgj5%2FfRBG3Eicvzrq%2BxgDWWAG0Lp%2BTY6G6ymJO3ghl%2BReuxNcOv5dqzZvi1Ri%2BPEX7N8AsIZYkktbRm9GvhWV60QM%2BT%2BMV8QN6hEvpkCX3Ar9XCZaG1mOuHP5AyI%2FyarRhktsKntRsHMyAd9gfSgrVLfyIXkRDD6IcwocKY%2FCmMXZiV0L2MtdATi6QG8sAIGBkOqzUOUw%2Bcrn8TXKO%2FCZoGa58U6mn44ZlcDkBe2DshB17ZaKQcrZd4AeIBE7Ho28Y%2BO8x2P4rRYypwS%2B5VFVvnMOPe1M%2BqS7bn6VO0WM9mIOqR6Sy%2ByF1q8ZeYUwv2CvvNqCJc3lqARRqlGfNiGM6Rsn3vXt4vI%2FnuMZ01a2F7M2vMZhv7ngZr8jaxevHyb4y1rf723FqtJqMcZC%2Fv6O8S%2FmKPSHjl3kpT6YJPkC8x9MUNnyresEijSPzA12vMayWPZxvVdGFzAZbGs3XRNmIGu2YKBOy51w7wqjRor12IzgtzKQ146vpKiellRrp3hiJQIIJ%2FuC3z0uaUnGnC7hb2AU9AlMMVdVsJJKM92cxfhvd2n%2BzKmUpPKPV6E6UX38Zr79IzTe3RVrEl6KpyR9VqzT%2F80H6XXQtO4Z9yC%2Fjw06h0syCBCztuKSU9BJDABhNW2i9KMLad3ijrlhwbgQT%2FFQ6MIk93XhR5jzwuomKrnRZFnlExuH%2BSGmoy5YjR4dtWr%2FSKskRJjawpY59OS4elRx15veV1aWYNr%2Bxp7amqBycDCzPF0NPSHS6%2Bw6iotJW6U5lNR0GidWt5vCdsxmH3rD9onQ1KG6KN%2FVY5NsF5Jxm8747gz3lndPDLCB6So%2Fab0aA76rWOEviPPwGS9P%2FVG7zMfMyb9s682A%2FnI6bGjpet7V6nfXbY7mMURpzGR0kOHNUzYP%2Bif94%2BO2ofNZLO2bvWSeeo%2BHZC9zPtAQxLI%2Fm5%2FcvorDsYHXcvzo6S09bgotcZ%2FDJqfzhst6GABP1JJ5ihznJAIaedwaB9VB%2BdtM6OGvsNSB0VCkfr5Vb%2Bfq896P0yujg%2Fag3aSR8YUutNm1LPkWkRpJ33ZvC21x0M8NfF2c9n3fdnrO%2BNBI17Rq1z7FWCPpkv%2BqP6%2Bdtf%2Bp3DfgKvQOGjyw%2B%2F%2FHuYnL%2BFUe6eJn1o3EH3Q8JiLbzptQ7qo%2B7BP9uHg8Z%2BAphqJ8yjdWPUGozaR2%2FayWEL9ZTeto667%2FtJ92fAxQn6124fjdh9VoIL%2Bui00z%2FF8JfJAaKjz9pXRFD%2F4vy82xsw3AOOz1onPNP7t51BG8OQjI5bnRPMALiABXFUB2qpn7TftA5%2FGSUX%2FXavcQbjkxyf%2FALTLWkNBq3DtxT6NmFaxoCe0y7kO%2BlCM%2FswGpgN8MP6l7Tet35J3rdOfkZwB9DW6WHb8emw1704fIu%2FDi76vyStE8jaH%2FUuzpLWxaB73jnpDhJqYR36fNg%2BAZy9P4P27AO23sB4NRrw8xAa12tBlg7i4Qh9ZOPAH7Sh4KOzdh%2BGpnX25qSdnLTeNBJAy%2BFFPznv9ukapQHdRc%2Fg%2Fbfdk6MEBwd6gxmhYMo56h4f99vQC1jv3rUBR2ed0xFQCnT2HFqBrrmBgpEPnXehH%2F3TbnfwltMA4KcF9bZOgFd1jtp96MvZz6N6D7IkVCYk1CE7lJEAGk6Oeu2zBhBdByYCqw%2FmRr9fxx%2FQCcJO0jmmCQJ0dYSEeYZNaDTyoQDWMuh1oeDj90cJKsslUOFg1NiHIT0eJOQlvZFcnCdAWGdJ%2FfQEkk4OLgYDQAabTnSZDM0kguSj2AfecdAZJF2orQd9GSEeaKEHKgDqOQOqJefko9PWGdAR0kcyaP2M8WipPUCvUPUb4I7Zm5yUoOswPm2MXvtzP6nz%2FJAd2t4YsdFNgFLbSMfEQaDsLszi%2BqD9AZoIaCZK5%2BTGEJEgNzht9X5ODoGIiMQAa%2B3DVg%2BQ0j36BehpkOQteQONx5JgRIjFNHijgFFl9SXotb6XwJQ8T0c2bQA2Hd%2Ftvoc3jnpAGUSnnErrsFJBdUBRaS8SmMadVoM3eVQ%2FPOkAV2iRSJW8RRyP3pIHfOgGUD8VNuocJRmPYaEygPX02q1T6BzgqdsfZFzqqD2AKY19ACTCpB8NOjCBU16UFjJon54DWdEgAOHAmPfa%2Fwb%2BiZMdqPUQJ0ly3gN6h0G5gPFs%2F%2BuiA%2Bwb%2BWqD8yvjzIS%2F%2F%2F431AwMHWZDd3%2BQvAMGcQjMPOmeAm%2FhGHoDHOC8PhrAjIOZDL0BTCdpk6DwLjCtpA9D2B%2B13kGfkC9j2bCa9EbvGY7qOKAjNi7nrcHbY5j3hBPkkED9F2dnOP4DmJMnjRG3jGA9ItgoJykG5Vnqp%2B1THHdEHsww4rd1ZKJAxf8fbW%2Fb3DqSowv%2BlbMdsxHyneiZqeq5%2B2FiJ2plSX6pI9k6lnxOn%2Brp66AlWmKZIlV8sa1a%2FfjFAyQpKYGkXdN3O6LrWHhAMpnMRAJIJEDS8LY%2F34sKglWLXg%2FFjGXm4zO6lY4kDs2c%2B8v99P6cvvIZ9JSbm9HYvST1%2F9c%2BjY6HwQjSmT4ZjcT91ajv5u50NP56PYN8nWOiXN%2FQhCfyze0MEm48%2Fr7%2F2%2Fju7z0SX%2Fdj6pI9xAIJLhIwo%2F7dfvR9tP%2Fb%2Ffjvvf7dZE8S%2FWx%2FdT2lFh1JgofpaLC%2Fuqe%2BlhY8%2FO2HH%2F9O%2FUIjgxn2rmG45IymDsmJSa%2FBmIg1F43Aox%2FQHT%2FsMfpoGelTI%2Bd4IOBv6KiLPhSDn%2FvfmIQm8r%2FUzDn1%2FCV9WhoQ9JIQ3Q%2BA8CpnPJmxJNEQIsXlmm6LqXbXSNubW5BYGBMzLe20GtzeoDCEDObz2zta2jGOMaJlvab7YJ0ikdenZe3ilv%2FgKBf8wvVc3gbr3xADboIkKHLr5gve0XzA17obTcff6frZ9xlPBxo55xcPPdS%2FoEk16tEifQMFgeYUxh0Lkdv7O%2FREf0yTUgQLr2XvsZD%2BQEP%2FAeaX3M%2BxndF47F%2BS9GRJsyeeM0xa3EeuF3l1Sd12RprEXx9IRNPMuD4%2Fp5FKX2YoysG0uYjZz1ipoKX04hai7aE3uxu0s5jmQ%2F8OVX64T9HXfdKLRrx60Dr5gFIRtCrdUTub59HchAKy59WY%2BogExQ03lVb%2FOyzyd1gzuQNlHpKOek1fipRHyALqRTT9DGsjSZxW%2BLp2YA6KZHHPoQ6CJCZdcHw7HMlTe1iO6L9cTQTbm9Tr9EpX1wO06G50Mbpj3fUCGqmb8axyzrDW0upBXULTnlSYKY1JGlkQ%2BpB2PekBPOV%2BTD1By%2B%2FdtVQoh%2FiQ7qcxRIrz8PpuxMiZ67YHoTtFQ8R%2Fz8n%2F0cXF9QCarIih5rvc337vg6YfOxxdjOX2pGObF8vTiHHQ%2F05r%2FxGC%2BXNNf5IOitW36ybn%2FRvocyfw5PqvxywYkei9h6MmkdoxviaFHUoQKT80Sb%2B79tyTmHCv3vvWh8Sh%2F9NcvyFV5UwY5YCtWxnPDjonDcz5iC5Am84adZBej1YWqLVnbg3j9fnh%2FoYUP5kUHM8GdRdzqh26e4xcUQJoQt6Qyt0fYwgO0ME8JHAJqfKD79T5kLl0%2Bxlp%2BFPS4yDH7mjIzu%2FPSSBB4s3ouimEJL0dxhh1Rv9%2BTGL1%2Bo7GHNle931cdXfN4xOTk977uk8LKr0VRh5ZRtSAS4T%2F7L%2Fd3pJ0H5O2up9CM7ge7O%2Fuz8%2BhAP5Eisn1zXc3XOlNWce4n5AovbzCiMFaz9i5yO4hlCO%2B4Tn%2BIurgM9RQWl6wDt3e0Go8h%2Fwes6FEF5JqTRxku0AMkyFzDtUPKy3JZ0xB4bwfDG7J6hBd5tuoD6WZpiqZFoeXx%2BSBuGiUVlKP5%2FKNpbtIteOpd9KnMuPaXhcBI4Nscs0WDdZxWgHOGg0HfQitAFKNoL%2BK9YjRwN%2BRJS6LL1q0zx5IruFL0yItih06%2Bq%2FXNDj2rIWQfopuY6VJVKWDQuWMCRg%2FDyKO6M9fRgdloJFVvByJlGINiw0Cd4VIXv5Q%2FCn3F%2FfjsftY0oEsv0V3xHCmpWrC5usNtKJ9q2j3Bvd3d9C%2Fr%2BhJZw%2F3d2M2p2gBhc1C3fjdLQe%2F3N5OqAuvIXxFBeVVgGb%2Bvvftekgrq5trD9Prv47ozq3J2HMPpQ6EyTATvYivdM04E7Oe1oG%2Fti3DkKaVHDo4CfNrMTfcqDxSB0mafWcdHAtHj5r%2FQBP0klpzsFh73L28SpzZbYVgxxBxasjx7aEnfGc%2FAn2VphEk8G5mFxhXt8PrCyj7U4imr2wT8MvQmgOVEJ3PFaugktDEoB7t38MGRL9yDzcfGx3Pijfb1aSck8o4lE9BmuHlDQ9CGSgyGOjiB1oCmlEtAqtHdve%2Bxy0naS0zZnYwb1hKwjFAExqjQZRoGvLNFc5%2BO4MmQ%2FekpRMWsfQE%2BpJlOZehFjULFueDADwjHti6ktlJdvIcy9rD9J40TmfeSyvdl6O%2BchYjjZD5HakJ%2FJGof6Fpn3wGNnzJksHaAF8LTSxS3thyoQYerJCTkUEvtydDaDYaPYjiTB9aXARQ61jX2LOiMOrfyEyBU4eMstFXEkqkuYrAnUG030%2BcnnE5oomCF3vgy%2B76rImSPkjLMNm6eye2zpxt83D8eVyvX9CgIzF2f%2BM8PIfP0nh%2BnFOJNSxqMFvOTk6duYvwpd1dWUd4aO1Fo%2BNpuZzPpxiR86tbTCj6A%2BOJjSH0g5s0c7J%2FBn12AA3uabxOHmBd8LLVv5z0H2iBHsDawup%2FTmbFQ%2BP0AoFmAlkm0Koh2nqt905GNEuvpjU3t735seOtGWvHLsGDe%2BFIVGKmOlcuzcJrWBds%2F2AgsHFxbB07aTGH3wj3IHn5HV9qfzsdkaEtdvVPMhlFvDHrQ9NyGCD05rdc9MypdmLtibFH3xiaNfR80ahpQOJLNKKeNV5%2Bbxo%2BjXYAhw70T5FYJKRoRRmJZc%2FJPkQAkGCm5539JB%2BdLmOHJR5IY4WGBSx9iIuDsxImC3XZxQPEvrPtSccWP0szkxu3g%2FsmPE9ID%2BwPh2y1fBVl7QZViMFwgmC%2BQR%2BitcZpqzzSruf34hWhpR7e1wkN%2Fuvp%2BJoGzecL9gaw%2BNsPJjDReT1p5SD0siFMhrtvkPOy5LTuscZhhg4%2BWh0he8d90Ym5M6ilNGYGjdg9jJuZ9oPS%2BOZuO2ZqHbdnR06QHre3J0YjZCka%2FfO9iJ0ZzThC2adBEEyO1v6YkyT4dg0v0oM0aO%2Fm1i3GtXsJ%2Bh4s6ahxD7PP19Mp3Y7NCPr8X2%2Bvh3BKssbZ6JB%2F658Phn9vNU1e7EhrhWWDRriH98TY4QZhpkzJVLrHXHTmwsX9L79gVMP3cHlL4npOauYde0B5SYZn%2B4xNVXpB%2BNhGZGiQvgWtgpo6GDWyBp6T1gIg1eHu%2BhdatulPbj1bvdKPNCe%2Bk3QmaUka4LxPWuzM%2Bcym92QPfCXhwnKThhY1%2B3bOogcuZloT6Q3dtUeOmoO%2FvZUveJO9eM3gz6fV4OsEWq%2FAMHyvb9x4kWXEGYGXmNDOJUWf8f6G1gtqODuN3E1ptgzZR%2BYcxWcPzINGzqHa3s3QifKJLmhO7p39R5YzXFTUJ5hFop%2BirveepfzVfDLmXYH9eDyjkTObiQ75Vwb%2BOiEV4nJwA6dKO6aoo8%2FQVvZ2futDqSXlBXMIewDf%2Bt9Z7ZyRZJs3XqLDYCapOhjfs6P26%2B34ntZK57BnLyqNi8aOaGC32vJj2w%2FHbnnpHcgaXkKnNBZ4L41%2BjjCKP7ozxKU9sdyMPnoFPCQPjRT46EWj2wvZfun1aYn9TlN3DDtFnu4G0B61P%2FeyG9f6hcVVx%2B1jnD0GTleDEUjWY7PSi%2BZAq8h3NpBYPtGgGkHbhD7qPD%2FQemhZoIFLY%2F0a8%2FOPvLhzGJ6uT%2FBpD25vSXIKfLjlhwN5sb%2FY7M937i82KWTC51Mfe2na66%2FirLrOUJWjSBAFQwYG1zjZI%2B%2FdLPmd%2FuB0o%2FvP8Y4rEeGPcn8XR8v9%2FRaZG8%2BIwIWn9pdS3kNu1Btyid9yz4nSXJk9ElYcEibpJMvzXY%2B%2B5%2B1rFhdn%2B5%2FLPOv9iEog%2B79dzv4eV3JT%2Fi%2BysNEwTrL9IC%2F38yjb91FIdD%2F7raj20%2Fx1338s9xcR%2FoNCe%2FuLNM%2BL%2FSBO0j2X6tl%2FjRe9SbTa3%2BTFZj%2BkZ1BL8qp3HlevcZztf%2ByN6jQu9hevy%2F04fqro1UgcO2L%2FLS7PfiT2%2Fbd1UtL77Xt31I955lr%2B0yza7WeoGrxH6%2BOs53IB0suinhnM9zgr84IuQynjA5m6iINMe%2Fho6Fi54x6vS69VUrPT%2FWURPaKx9Edeb%2BkR2bOkv6SVLYmZSi%2F4LaH%2F9KTjznr9LNnwoYfbl7gokmW8l%2BKd42STUIcVyWaC6pFcW6Lc0z%2BLOJ3UZbKAWSMfp4faTHs0jGT%2FekdYOaGvXSRRupeaK%2FsZYkDpi6TU1%2F10u472KGpVF9J2NPkipzvv53nxW83fHrVRVNN6ch%2BpHoTLMKiaO%2FXo99lPc46f7bUd10MdmLOfpCCIgHsuL9Tjyzl54dlP15ttnZYx9X7Vo859KhChOskB710tMe5p%2BZpoM3Xcqk4j%2BqbU8%2FkiqXb78zrfRdlit7%2BihxVXXAxY3qufLeXN9kjBV3CJ1b0cFUUHYQptaMw3nYIX38%2FwsXpf6riOk2y1v4uWSV2e0XdeJ4s07nFzepxYD0O2oo5tXuiMPxYNynleL9Y0F9AtdOf9IEK9rN5oF9OkOHO9iE%2FMheDdJx6kyeK5zzEmPIJ68r3k23nMvYuI5sdPTbt5MGF15OfseeCc8Riu3MHY%2FgIVcaY0O6fRjm5Gn3yM%2BGB8Ohkk57uLiN%2BGRESPJuLbfpJkZww5gGt%2FoEjsyxRxiDzEEq6CR6%2B6wS%2BSJNmLejF%2BGZ8o86N3%2BzSj8VVS2zG1eI651h9KE%2B1RkAV1gQ%2FDXsTWNC42k6h85iey5DtzEwXtB7Hct7z0qyfSkSdwCT92VXFi4R5kAg%2FZKd4bj9vfl%2FHyTGakG3wiATCOhomUFd1fTGf0fQrIA5bSrg2oXdejsZowUzs69qgdiOtJ6%2BBWuhufXaTRigb2tyglUTKZny0Q340%2BRfnSvEAtGURu788xMmlMnudv9JVcJeAByqjRx8GSQB%2BpqbjXk9e%2FQYx8VCzHqEa%2Fl77et%2FO7fXE3cHhInPWcaDhj2YaRk%2B5vN%2FEq4pfvlVW02ZIoGEY7GurySfbSitsnmvC0wO3xn8lnsj2pa1aNyOw5WYwvPauzIQeeooeaUewmhsgabsB1hhlL36An77VvpTBPw%2Balm4Fwxn8lJWcEgTyBXEfeDx50MfoJb9yTAqnUuqrYybqF9MXyDXu8ol5nT%2Fm%2BSWPBF53h55JfoV%2Bd9KsTKDI%2BWKxgYbqEoIQ0xYQiOcR%2Fn%2FHnn6bRTqTMLI1YWI7zfCsUeg00swF68yJBYu49pCkN4hgBuGfMuu%2FxM2TtP5vVj3sp%2BHQmKZRJpPe4Ht2eq9OR%2FkuTr9d2KC%2FikzyjPqJm%2Fu4%2BoxPa1JxneslZGsdbCKCUc6xccFQ2NSl6hkDmWOszt47KRFusUQOu%2F0J6SeFm1zyXn715vKE7o404SuKUDe4mVJY6%2B2m0oXnKr8lSHNKHxTW9H63dNBqaRvHbNZ%2BQugcClz8yX3zWDu69LDoycl2ZxN5B%2BTn76WistCrVOdLQn0FiyZ%2F9NMUPYkD3NWpB24v7b1hvSeignnaNIN72STyYDgP4DMoajfQ0RoChjLQrmsL7Sz5jM8hxXAdmaL5MnnYYaoeOl8%2FNA0iG2t51H5oWL%2FfTuly7D4iWtNeVpBclZR9B8Kwb0f9%2F7IG0ZxoJgt6CpnpJcl4oja7VR%2FKztunDgoYejS%2FpeU68zTPix95g9nWPrLcYoNAN97IsugGIaXpYIWXmAVqSZP3pzA1cui8PRYfSlytpUSFRRb1Eay8qMmM%2B9mRs7y8S7gmu83Qm03K0XMW3T9%2FyIl3u%2B8tf67Li%2FvqKor0sK34UwS0TiTHWsajjRugzDFnub36dKfIMyQuciaYLJWgiX2RGNxIV7z6j1d0pdjSLcxJGN1xsm7WWvMZ8YxD6ZEoDNG51SqdIiNCnu9xmPNx6Mk9uM0QKEYF01qRyepMTMEOkTIYukKNsIiuXUZqv9vKqoqnKMLlFRLcbK6IGcKlGJkAJ6KEglizoZ4JjeA7WUZZRa0kVXh6o%2B8Of6PgdvoV8ctdN8%2FycJMH%2F9e%2F7v%2BaF%2B2ucr3o%2F%2FBsNZ%2FlNosiNCXfp2XE%2FfyYpg0LWmDu%2F9yusns0satdAbgirdJO8LkkK5tRjeKdGEJElQB8lPuNI7DPoyE5lhjbRc4UL%2BXty8dszTDRYJZMIFU6rRPJp753%2BijFBg4mUR%2BnPM3z%2BHiYXvVHGA0%2B%2B6QDpnc9k%2BXSaDRSXnmv%2FvqnEesaLHBbuxqBgedG7%2F0o20UK08d7N%2Fpymogwj%2BP97k%2BH%2FRLzTD%2FthvdnylGuEeyNlZvGCVs6zn%2FDC3BZe91nlOuNX37vBRI2rMOxmXPy0WZ74Jmc9UnYK1jDI7KKptROTQrQTspyoFwaoCEhy2KU8j3kJRp3Tp7gYI3trNiSpQ9%2BUOjQjyTTi0weidR7sVVmqUE4eR0WKPQoXtr8GG5qQL6TwkRSRWse02r8kK1Q1zulrYplhxZOUubooSacX4%2FZwu2%2F0keICpd%2BoG53h%2FsfPY87Gn3rySp9kwuBYYqMKeEksD%2BVvvAQOwUMFR6Haf%2BTAgzuEoY8YdKZEOc08g6RxqHLln7QwOE%2Fz0%2Fzrn878K%2F6RUl1HceB%2F6MxHHEhK050VxnOo8Ljcu6OkIX9R8MKHHoq27%2FbxG9l2%2B4qn8EOPU8vtSWjyhjbOUT2c%2FbRoVmGfASWEi33Kboh9L8uJt2Tfw37hfBJErIgaVQ%2B9gv%2BSs6n7DdS1fcyKUtwqMg%2FbI533gYZtgvV1X9TZAx51DO8Xaywhy33EutmeD0xzsSW69wuN8%2BOm7nEK9WHTKGokHKVWwtlDEf%2B%2BL3hReMAd9jijTcSeiLq9CJX9lgzDh5qn6J5LIkvFhQc5%2B2X61XhkvT94Wu%2BagbWR%2FX9kaOlkG%2Fjf6fdP3KLHB8r2cpRi%2F0zfQ0610VtDFUSlyH3hLD7%2ByEoO8Vv9I%2BdoyvR%2FwzGaOrKO0dTRP3iMhm%2F7sWM0dRQ6RoO9ROxLjG%2FpP%2BeIQx4hCTV%2FiL%2F9J%2BcH%2BpvOfD0Y385CV%2F1drvq7vuqYW3lr3Qiw2qNPy1jPD60JLm9elxvZCWM7Q3Qrqf%2F8595P%2FwcyLJl99s%2Bf%2FnRmyfyTe5yOTLpj6HYqI9I772tNuqMTRMcd37mc%2BJX7TibP0cr09w8u8HUUTBO3TesqD2aK817nn0jCYcq740f32EGaDXCAJZAQsM02%2F6ejlAuZn%2BP%2FOEkDDhVzZTSuNg52%2FCd54rwNqHe1yqv8E%2F1OMldZHXknuVA13NhNN6AIwyeusPBJlYHD%2Fw7J7Hv%2BdyCZMiHLviJjhY84S0qI8j98vj89XH56GN18%2FfSALTzkMXFZ%2FenfLH5t%2FuT0mCRgcCaafvGdcTL34aHKRabSnym19uFhtaD%2F4Fz2wwMOZRN3jWtwEJvvQ%2F%2Fd5q8srZBPhP6osw39N%2F4Nt6j4Pp9IxnNReKlytIqKR5xwXbIB9SnGtgeOIz%2FF2Qv%2BPbQnQXrOUo474z%2FMjz9cI136Bk45IKxbfieu8fGpiF5JoqIYW%2FSKpBL0T8n1m%2BX4uzuqXboHl8cPrvImJXnTH3wwv862OC3%2FJk%2FBCW9IEHovMjKrhBMD8JFtrirHR3%2Fr8tNrEW0%2FLVj3%2FkTqQMb5NVDpDe9ab%2BWotRBKVKfOn087YeWIJw2kHzLScHQ75kLN5aEHk%2Bwpx%2B%2Fm7quGmw99r2g9LHZtjyc5Ml3EpVRPphWZzNFPT2ldrj%2BRQZ19olfb1pV0gKQvqEi%2FL%2FAPjfckA0h%2FI0nHli%2BoNlv%2BUBvUCyfLmJMGRIu8%2FLRGwoKUxuD20zb5BEoVZetPGEDLeIUfIK6RMmD9qWC3g%2FunRMLXpwJXLmKaQE%2FYtyJsiTJSn8rfaHTRYHiikYbkBJIx%2BNMT%2FkMN%2BOHfPkXYBUMxR9ybf32ip0OBbLuS043IgXrqFeR5geL2qWBT9BP%2FzS5hvJ%2BraM%2F%2FxFL3%2FROGBob1VtyDPE5pXeZ%2FY%2FmJOm4LaGQQwU%2FJ6hP%2FTe%2BG4eQGGmZZDY%2FhJ0zA1RNyBZAc%2BcR%2FbCRBA9lan5ZkjH5aCQE58ZGY%2BXFXIWk%2Bma7VpxVulMLp%2BKkdMpk73o%2BXzMCIDAQJvk%2F765Obx6UURce7e1rTiRUSOnbfrJuBZJz%2FzcSXf7TONecw%2FIP5Mz9YsuNPPS6o0P%2FzL1xx4ZU1m385%2Bx8%2B%2BT9c5YUD5U%2F6KL7ZJX63WGmUTzrGTqd81CMljPIpMh1XgVyF9kfUXNpe8KrUqszDZvKB9yrl%2Fu8ozPuPZDD4gP71UbXztGf%2FgN71P7tslj%2BaM7KO%2FnGjZRM9x5DvhuXSQP%2BY%2BXL0gA%2FZMA1%2FyJD5%2FyNvXZeV%2Bk8yC0l%2FD2mkTfbVbtn0keob4dRx1I6%2F%2FT%2F%2F5%2F%2F903%2F91%2F%2F6r%2F%2F65%2F%2F6r%2F%2Fx9z%2BSB%2B94Vv03kxn4WT7M1B9BUfyRKhfNh%2F3wW8Fl8cdHwVGP0ndFOtE%2F%2F506tLTLKp2FqhL9v0cKviScwPIvf6AbZYl3WoDLvST%2F%2FBm6FS%2FIuBX%2FBz4NQouyYhK9g%2FyxTAoYH%2FinrJ%2BQb%2ByRrCrWU0iJdyT6yyUj%2BzUnbeg1SZfYRYV2l7JGQjoV%2Fyuq%2BWtUsNJarmNSU%2FIiQcq6pzR6IazRGsj4ySX7EqvGKJf4iSUBK6C%2Bby%2F41QOZUI5H4ylCcqu%2FhHp1MmAjrsq845yCj%2FTmSO9fIUtfIzPKDw%2BZ%2Fmx2fXmDJe0kF%2F7%2F%2Bsj0RnLl%2F%2Fzbf%2FzzT3%2F%2F6T%2FNJPk41dQ1HqHv22OR5vS%2FTK9ub77%2FhzUK%2Fyk4BkO287%2FSsP4XGtl%2FV8nrD2awPDBUQEK%2FnUSjdkoPy5ncviKKeJTIafr%2BGx4NqGYI%2FfEckBO3joT8Ep6LZvPsS%2B8%2FbSKTdqpB%2F2G%2Fxr86kRP%2BMi5RZMz5FJvS1zQn8TN5yuQfssjpb%2FqveDCyJTssuIjIpz83f5TNH7kLOvvksj%2FWmfujSTf5Agnx30nB9aGM%2Bh8QBEYyJo90mLsegHnnkWSwvisWwrpVo4X871CwSHghemJheYeP0H9UzTp%2BTJemhcfPvs%2Fmo8nDoS7I0Vf9U78%2Fm0NTWp1Onj%2F1H2OaPRlv1nuAX3ieKZ857WSpgalkGdXADJFj1NrlPCqfffjFb41%2F57JfrAzSNM39R5V5Wlfqdkwc5AWp6ypztoXbFaobvrqAZcZhvCbDEIlwM9Vgxi5o5EGomuDtltc8E%2BO9XARbmeh8nSyeM69O7AFNAg8kQDV0sYi3FUya%2BbqIy3WeLn0cYXt02UVebHyo5gCEWJGLaLEziZe5V6%2B5T7dHTAuaWDzSY4x%2BdizXKB%2BPloZZJMqkCX0N802HI7sCc8uAhKF1QYOE5LEeGo4L0a88gMJP4oiaK9Li3mGZ5U9V6GEgcaCXQZ%2FEWR0gn%2BdvYcQce8Twoj%2BnXxPXkQZQGJInZGO1muwzSAiWwXZdxf644kjYIl4mxqz0wOBtZ9XOl3qL3SJNFpdFtF1%2FOUWWy9vsKk63CNf1EQ4L9YnzXFNmcVQs1hwB5oMIIfHv8Wu0iDOaEWiODY29ysMHZBKROeI%2FhTHEDq4HZBCox9Ur9Wk5HgyRE2qoHCPmUGEGCJoZNtpLEg6caNVjInEDpzaXVR66YnQIVjple4JadBWlTzPkazWwIB1RBwxOaHFNDQ6JwlGS66k6zaH3p%2F5qVcTooOWIhF21G%2FglnFoOeoNxtPMvT4pFET1V%2Bt2SAqu3RW9EjIWxSOiTnpnp0g%2FAES6KSKPA5bt%2BYpAQ%2BxQb9F%2FiIlfkc32H88Adzo07pKv4sYhIZktcwBcbvVHJDH1sGGe5y87axXajvvApPs3THW7kLz6nXPNCDbOG4Q5aWwekv0IDB666z5LK75VklflhTAfqJCqeVV85jJUFD%2FLfNM1f%2B6SRVe7ciEYH66iiyYz05H6bsV2xHKR5vRwhJ3EbLx7ma1lGqO9WavkhvEMaT2H0Aro1xN0d4nIsDhyBMC5lxZbjNzV2nZFmvkWonYVhx82QngBFCb5u8uQb8xJc45yeSjJ9s4n8j0XonWwIdbVPourGxJgO1vZ7f6V70MMlwM%2BH54WvZuCgzGPsf3EhJotbZPsOYDNlDQBygbAewIUFqvgaJ4ZMCCokH5XRs7BlMCySBnyJr3Zb5GIuE%2F%2FjtBwKSCqymSfYqPW02s1jQpNgDAtMAauaFgDbJGhQvTJnUbqjHvOJVb7ZadkgdK1QCx1mzl%2BGFjJ7TjJDr3EgAUq7zxZrpNoX1cSDlv5vThY%2FjArcZh6rNyQ5%2FrNPSuPzpOQQLwMhcfrsjzsAWstqqOq1if7VvD0OuV1GtT%2FW%2BHiDSVsaI7M5DDEgxTCW8zUdDAhWrxJDF2q42jM7IZjDh7V11jDc2U0H8t6j7ySAIQiGHwrE0Fkb%2BCtpv7kBqS8iRKVIHuimGungkaTC98GMj1JaRN3JDVnCqAMgjv4GIGOFbzHDdssyyAGLNjRY09q%2FdU526k6i3fW7HIGqn08wW0plebbb5OqRvG4hEMMfJlWyRhQs4f6NjhAxOb4ohnK3kaN2YSRwKVrpt3FnLEfZblY%2F6qm50ysdthM0ZfZbHRUxzi2eYtNru%2Fu2W5KW8DMEyPZgbWFjIBGWphc%2FKKIvgpk0WMeLZ4NuWB1M903RrVRIMV4r3WnKXRyZXZDuDLsXZP9xxWKQlwZprWmVQdJs5cIgaba6eGH75xS4G1xNi3yhPGPFQo7E%2BdRZrJ5GJM2WZAYJx%2FC56pDqP4bVXeb%2B%2FGKSzxZ7yoLvCi1Wk%2BhNkVQDV%2FWmOXP7xYRKUyDfXU%2F6dg8m1XoDpbA9WzuJ%2Ffe5C10Lc9YguaNq3k3sWxS%2B%2BwuU1olncA%2FjrfreRJZzmgY9xb6O34sEwKGiqdPIfyEQlYO6ofqKDej%2BZyHSXbys%2Ff4QehnBaDGRtVddwwFaDIGsSPmrpvxlqNZxkE3iWptgs7696%2BDvBJTPlhAsnwcIwvN14%2FLZ6U8%2BOV5%2B0SRjxS6fbXFfPs%2B0llE%2Bw8UC37b91C0tv3cQsiH6RfIW%2By%2BGED9FKktMxkDTGviOT4VYvs6yzBcJHwIz6cYtG%2FoFxyOG0Em0DUF%2Bd7fAnGtJ%2Bag7fFmIL9DXE4ArjQRESzihOpfT%2FWcx4u6M9yOWc7I7VobMASZH8TUdslyv%2BUDYQav8OIIkkjqgAzLMNa4xhgpOUapNQ4BNcgQDKfJfLY0RmOEkackkrZa6l4HGXDVxQeqR2qUCbhqVAH7J8w07KTxoRx8u11%2B5IQ9nefpibeC0HCOEhoex5CVKlfvqwPCGCWgNi4bjkgO%2B%2FQHgoV1tYI9moQVGg4%2FV0nUCdd36liO652w2h1pII%2BAxekxSZXwcc9AiEuqhu3c%2FADOEsNqXyrtsscZw9q2NIwBbwKboOmXxblDlG0XgPADwBvtTjrHaHxZEHSYRfazOC8dchtcmG7MXkPL%2BENGTinyEEJ5EgxwvLYBGtb230Ja2PCXXS3%2F1AaWPaopPOwMwrekjBA%2FP82ff%2FwaOc8TXqxUByEAqRBqAOAlJlJte7SMW0uEeSVIG8Ym%2F0XWEGV3iELc%2BGLfVMpepen%2FVkZU3Qejwkxt0cxkBMsoWuZbBQC6ipcHfOr9n6%2BTJ6D131tz3DwC6XmIsWYPgGqdCQm2XJBImnd%2FpiwWRtCSJbHyHn3PfJAGVZ5VBNowzpuMACNkZ2CczbG5hybdmt47zeqlDJIB031BiCFTkBSAR0KH%2BQyoMcxApW0GIRvdwHgK9eglU%2B9sFTEYJy8AQmdqtUUYKqMbHvYsXJDUtumG1CWBZKYJQ3zwG6NZrzfhG2iHKGNb4gsaFJZAasN34NZQB4aMl1CBXuXXTivSCTYhujCHeGCew8l0JDGKBN9wxLTbjE3Bms5HRx6DufAuwXmF0x0tsfNJ6U6h7OXzW%2BOhCO6Q1TkdWXHI3BOiGHkOShcVnyPvWC1a5vTd3AILBWsQyyLd%2Bj%2BK6NspLb2kQbgr4Kh8hPpremZMs%2BR%2B4aoQv9a8cLlMM8KirNa8hI2KBRJa%2B7XVFgmfxDXGnCsM5Nb1xQsAk0qOM9JFIKeENlTdCdGgZbkVGZtK6D2lsPOZqOOSyVy7WY6Ulb5Ujew4ygD2SNqHfA%2BiUdPhKKzQM8pp2h5DZwuyjL3V%2BlNVE42TRII7NN74Z2ajQQyIXdTaTpdZ6GaRbs%2BlF7utwIMun1XQokqbDrQHtrz6rHzeJ0c1vfucRAameFNFYcIl6y4cFFNlQd98SGTTzdZwXOx%2FzG5GUhuuooZqvT6B1QQe79UZJaRkYRNZvdB497iaIg48L3m0%2B91DP9w4CchBxokkTuUTsRBC9xYDwbLUGw1oFX0b46oaD7Fodq9gy1cUT%2FRPYt2i4XBpBhRmOkgO5457CwIbbLOYRWiqeMo083ylTcbQmqbTbHOBrVPiN8abZeaSamy23UVkanl1AJS3pJlREj1GZ9FOSZhU7eYL%2BfOKFxPG7X4iea5fIpOgbcRAOgFa1ynzpSyD14Jp0vKs4%2Bz1WSxXh43jl%2B0qJSoOPDP4SqWuuNwg1Mz5WQWrwpU8zRABRLflF5Ary%2BooMK2Tp9TzGDWxCZTyM8daKzOaQJquYCBBT3zxsiKajDKA17ctkcYd8YAjm1lb2OVbRRvUPRPkxj1o4z%2BFV6Bg6FfXOON7QB46%2FRS9QNzyGXVzy%2FupbsrHCiiwGQ9q1bEn2zn2OGKz7SP10n%2Fa8oa8ffss43noEnEDzSGq8gSL64VSHijBq6VfncZqeK8p3n%2BKPxTijJi07XiGjjumCnyvOoHaZPJKO8gHGbzHhadrBWWQ5MST%2Byzjy%2Bxe%2BI7UaNmtDDSCtgUmGieFDZbQa%2BySacSJFdaitoNcG7WeLpqJFhf7ZoPkflWnG9Z5HB4TzRMyZju6pok7whsN9X%2BIP3YlDYzs57mLeuCDxsfQxpBW1aHBfYMOC7FmlQ8D3ru7EtIDNdx7%2FnsQF9s396dTStfLmg5ZSdsTTcXnnxaZNd45E0kgJZK3eDTaO2Blhx3m3XL%2BE8Iw%2FiCbuhnHJqeIDqOXmE8jYVhOANYIvBnDnb5odyMrTLNCso2nfkC3Gp7NzvPSpuLsiZtg8LZIcbnPr8dpH8P78cAwcpmwKo4YhgGFV7rg7aT3rfIWU%2BfDqZPYym%2BTOyvM7p6VD%2FeRxgkFjvHrLOGBfhHJqH3E0LlP%2FVVoGSWQcQpWL7gjzR1ALOF%2Fa%2B43jd1xQXwZ7ou0Fj2HL7snYOEFznvxWR0tsyC6Cq0RSZI9RvQmpqQ6eRTVHonZ878qPXSUSp3f1iZdqEFSGp5moN6q%2Fq1t1N%2BWNJNpMP4GdsajBYQJ3KuSYkL%2F65l%2FyymUa4P423l%2FASbKUPBh%2BR6bKhgWF9LerqCiS0tLTHcNNXVVkbnVw2FCmnpc9a00eVGQytuch0ACizB5sR2kK2UBJ1l8uca5GbfIcOGAfhCD81XEpp3OPFsZZ0ANPx%2BVqOLbI53hnGUQtPq1DV87z57jrmfNDbtH3OT52n1my%2BsC9xHOl%2BbAjC1FtHGFjnPPxS%2FwQ1KUQm%2B%2F8Z6JkRNd0zvT%2F3j03v72QyNG65DGi7XI9EOpCEfxcLH86p0%2BthXy%2BDsww%2F1Duee7PCCLoDXBQjd3tlmxYyXlm6BxE9KR9npMwKJ79%2B%2BbqdkSJMG1K5GIjXdpW9Fq2F38DsoXcGeSOy7swfcjSAWRUIzTJeJHWUDZfaYKEt4HrVF%2BBKOnCLcS8hyQyN6G5nwmnAb66LDn%2BVYioDhy0IjBO59gwL8LrbV75sRhCuoqqgFoNz6BoyYsirqgLzRgqzWZ2kjCpKMxj4J3rBPY%2Fi%2BDWHIACsgxeRN8l9Dz%2F%2Fd78343jSm%2FYEqilL9FC382PLgRF8eg1WGhio2DXUF%2Bi4sCIeD30KZOoWCW6UZZkJbvP8DLlbxwmqe5wZ53uOKLro44EWh%2FxDbXOnmPLcVtE%2Fm84n1A6yFchi%2Bizv2Yj6rgmNbi0bUBEQFbrC2SAmi28LX6umeJRkuVKH%2BElMil4WRMupmRQkUdLnLaeuSMv%2Bvr81X80Ueizl7tqbXiXgdLqKM0xrTDiIIN4QCrwyt8HOhery3AkCWC4HI4Aw%2Bfgo6bf4Iip6wbdl9trhmBuW6UDCjb9GDefXj%2BSnDZG5oHu7yowwrWfLDqNEP8Ji%2BfdI%2BnyxspXJ%2BkSVmKSxks7Cwaz0HzQA4vU97jS5%2B7O6xLBrqR2e1Ht5zWSJT2lRpoDgV5hvAdNRmLxPw6T1EQVqv81Gqr9DQCqQDxHlkPS1hVGn4DsAgZ8Q06wty0ppnrZZtAQuEI3hyZDpvAVJMmkwJ%2BBYUs%2BQMZOvQHN8rrwJ4AAWt4e6EgwAh1S6bw7%2F%2FlE0Oc6WqrlSDvFvthggDzPZyopIqOG4kxUPojmsw9Of3EspzYGmW6qPIxMcXwb9S0W%2FmWwdLEdrPXgBlOjrwFUCBABaV6ru4BmpBJwiP6wAIzNmUGUPcbUq%2BYiOAAlNUjGfCZgmaLE0OJZy0MC8wxx8lp6tBCJPji8V%2Fq%2BJ7jhED9mMTS6Flb5m1rkW1Qg9pAzSaG8x9L4pqesof6quMKsekUi0xqfFAvfZ0HYS%2BSPra3%2FW%2Bl%2FREsq%2BFKfOOwfJ0KHFoOvcRC5rGmdUUeNXPyvdfyYIMRXeTQOw06DKgMxpDFZwTg7oV3zQMs8u%2FOnoVDVo5g6MqkXJvXSpP5sUj%2Bb1IlP3SSLdRSn42jzuPRnbhkQMshrqCiowJuoVEyErJ%2F8rU4i5nDFRv6ALv3pRZ9aMTHNyMwyUHFmThvkgywh6xE8me84bYh6i30Q1Yv1ruNugA0rQ4DgBoPAhmtlEJHAM5STwfDC%2Fz2Mt2m%2B86kohWkFmRJkbUOgorP63jELwCiV6mM%2BlioCR8rREvGqtnqAmhETDBwKpGpMbCBLUQIsmUgQ1Wpglq7UAm%2F%2B%2B2NDPFs9RkG6aDca3WXRhk%2F4wL%2Brups4RsukGtYSvqjfvjm13dULjseMz2ScdOZcfbzU6X6wxMKPb3lMxe6UpamnZrBQ8yR0VrdOa5ItVUeYtRB7Ai2N8pQjgHVeaGgTMSwSP8dLS9XaTYMYc6YF9ElXoFckmH5HrtNUQjWtO3h%2BDSbxIYjG0WBOPx2A2FIDEcUtHuouBptoJqulAX9tCzWnVRUaeqLhk2HyNtYDc1r4Pheh5tZk0I9SEVNMNN9lHhmzbo4z1FakVwN%2Bg9fCEEDw9buoZ3UlSsrF4WggYdBfQh0eFZI2Y4Q%2BzP1%2BAzVeNudmFIhoh1jnNXDQJFf7uieIC0sPOcoH8RZHN7GzH6JbLwKwthCtXq4j5KXL8tcstjQIXkXMNUYObamtuYZe5GSwGEcGHA658eivGQJd0RdGQWe97esYxmyKhRHjHY4w8zUa8FvkbYA53Jp7gkwL6HlL%2B%2BsJy128iEkLtENm2sNv3v5QQ68fZePfaPfXuIzNeJg21t6mGqElLWaeeVNoqY41tCx8YDz0pkcsgdMrLZM24VrEPO3VwvpQdeDoARuvdugpQ0610CucBwZftmF6l8Fol7WCC32nXARM51Bj4wLr5eLHXbmOX34IOfFajh%2Ff5bCt4wad2%2BR7n%2BzFBjBFJ7YWsr%2B8M7FJkKKhR19pdETfH9nSQ%2Fy2T5JgTgtgeoAcZowgASCNacUzsSYeyQTNFEAEluVjHknErHFtODyVsIyEyR1KsWZ%2BNicCJR9Tx%2BV5sojFVeR3DxDjQBkBpAI%2B7xBrvtmaqsLaO9c3WBdysCWpdNoWH%2FSc8S0cEjtJsfCnCZPUcGCqUhKYOkky70y90Kd%2BLjFH5trPBjCnxtartYVoc47oNISyyjCIBSqQsyhwR8C3bSieGOnhr%2Bwu%2BNIWhv3gBTRaP3rv2Q6hcDS2Fx%2B8AElZsWf8Ae5NuV3HvpaG7G9qeros2KEVu4WDnoSWI3hu2Wax1Axh3Gki6fi5v6SpkDqmKJnJRDtJAWODPH9OLGB6qL2sQXGGsMPcB0mJWV%2FmxdJ3XZHp%2FTyNfM8HqHN9OPSIPsqwN7P04a0isDw0N0yA0vLm90yyhYFqrJqETGmiqV5pyPYlhjaiQuGYonfomPyaID40q%2FK6cGlM%2FAb7KWmZ4vcMkayKEAx0hKwDV8qg0PioY%2BT7NgVjn4cP1EtXmMCYbwRqQwJUevVMz4gDYAxEAi2%2FH9M526e%2FGe6gchF6VnOy2EC40IdJN11ep5jR8oDAIcSPRGSiBOZq%2BjhfrazNYAZNIdPSwzLNYul6AjR4Y0fwiMPoAAHu78Z6d4yTVNePaeJvughgPKU9k2zkE2YGawATlfRmi6zDI4WuD10z%2FT4r7RuhtIDvxyIVAZaZLewZG0LubhKcRwnkOnaMvL1lJtk7MHSsSw3L3M%2B%2BOZh8%2F2x4JUnA%2BjOXzAVkkSlt53QePz2RnqZExIFupL07Qoc5tNQQqmIhjzDD7ZgnT2lcmX5%2FKbGsaLzNZelu1DV%2Bq1LJ2aaoxTl2bHwFHYCVWscBhoEhANGV5xmInpwN1R4%2BjMaqOpDQTZMCSPheDYIjKmoVOWawTuwzgzLyQeRDXgZdUr1o%2BrTg6th2b3wxSDWp0%2BaTrTQqAhgDi8iSFQT%2FGqetHYeR88ghlXLgHOjKLDmB7GkHjjRR1h3o5Y3SG5ldFfFg8pxEyyTaag9%2FntYbNQ6I1FY9UE0i8HAy3UKt6UNkncNP6EayNgHsDSKGviXLau0DmIWcBTtAHwTo1wH65wB9FqB%2FC9C%2FG%2FRwBRSHh%2BboJjaUMS6CNoyfojqtQlGnwuTHJLZU4%2FSfYNqpx2QYcfoBNVF34aDfloUtX%2B0QaGDLk9ZgEkNi3nsbZYZlCHqVkOmhi4FIfJ6c0TbnXwvPo2KlFhsO7rNoS5OINTb0VTvCBBv0oIQO40VqpeVsODsfYkQDCFIgCOnRP9XUgKPsJSlynWPOwI10s0EuL6GqwWepvo4r9M2Mg3kHcufM46xIhlvmGNFDCJBt6TnwM80GrZu1uZZKKEBW%2BBdz%2BKsG0%2BxEyA50xmcI1oIBVAmftBCyHZJMmZmCBfVagfnFAs3oovuuQEFk6oeukzRhIVTqW5goT7mwdt1wNGZ9%2FFapcnDMpFRqphnKLdOlopeBJFWsh5jpbQWdRO0oMN4ZC1i1DiaduCzzcMYJj88M%2BnEsZLjFr%2FbhYrAUIWK8NEW2a7VOfguwrkiYL0i1JqNCjctsQZbBVZ2mOtTPrPzXUqM02FuOQwl2pfVn2vuMNNscsmi9S4MZPqcWs4%2F%2FML6qZRnQe3tGcm9HMzJkO%2BRcdSWoOvOZA77UiRJYBzeDZb8LrHOqOoDP7vujJFsVtR7dGVcYXMJChENQq7XEgDFgRZyeYvp4gcVgLzUnfO%2FcpusmAMxsMoQaFQVbKo8MQ%2FAQbMpkw1kmtCPdQzVPcF76PsTkCy%2BHccXEd66f5CkyccUf5TMfBe3QNt4YHiOxTLFrlJ3A6sWs4hznndTuFp0wZhUCoZSOhTQjVmhknsEZoA4L8WlOFN9AiU%2F4EbiV0%2BFoHutpXeY4EFCW2qXAO5L6ziAaoSbHiKUnCqyTbjUIds3C11ln%2FRpMdStTee8scMM4TQPuTKBFBBvLL%2BFxDCl3FCA%2Fo%2FdAyngb4oWre6tNmoaeqY5l%2BugtWlSpjd0YiwkDt5lxBXxqXdWJHM9FEqfLgNgB3qQ%2B6LqHqYAzYuW7b%2BJUgwGggoubRR3WaVDtyjGCXIO6GNON932r5rlZKhpoYhUBdYDJjcqJ1pa%2Bj%2FpuBIbzurQCrVoQh0fyF1uZanhU0e8jiCYOiyM12xyD855ak%2BeUI6h8wMIwPY%2BM2OdyujbFBDMtf0EM91HIzGnpyo5gxLzNbB2ZgxnQJs8rVXy8AQ1PBDbm1lGxwdqu6vcIXEKwj%2FPSFm9YQiyaUSa6Qcy6pg6USpjtzNQzEiuWq3eAqprqTMMpi3UyoOVI4474kCOuwPCUtXNYm%2B6NBg5ueFkc5hgXLhpTz9ZnFXQSZclWV14%2FYjBVXAdaKrmDdCUch03hqg59xLLdGrNQvff2ntJAWsfKUmhepO5pYNVwqOU9582OOeqqVFJe9T3cdHkQ11vIenOQrdQT2KVHE%2BxOsKlB5yA5vGahAc3lJU9rO4elgHqmvkY7Nxd%2FCEM%2FhqG%2FeBBCPgJrtxEN0pbnCC%2FOBoelJ56wdT6l7Lqcox2N%2BdmWEZnneWoPxIYltD4p3HjMNo2ywL7gFokG%2FQ%2B%2BNWq%2BEJVERIcDZbsztJztzgymBt2OdyDkQjubtyHn23Y3j3wxQbS8Da%2FxsCK%2BSdJtLmplWHoX2JewNgoA3OBI9KMKbzpkhg%2FRA%2FuULR54x3DGeb9UoqqTCEJAC8EJ%2B0CDAJkWXBm4l98qtSDUab55vLCIlxbxyhcaQvXlhX%2FOmilDPiuuBu8Rorw%2FNZ%2B5aEvL%2BH3KsJYgDdmetox%2BLEpKeO0T%2Fw4MjAzGrrOF7c5l1NLaDkDocD3z3JEyaNyzsLaedNA%2Bk1RXmynmDuQRNYUr%2BAZeuOELwG8Edkiot2sUnS5JNbnLEaJo2RxvRjy5I174ATY4lFZ8RZqEkiS4mpxc%2FKtfLNZKk2XEOjEmgFEQ3SFd8VvC8d4uFnOZMrlFZuweUGeGDvjBCWRxGPHUDjAFvmD5og60Va8GTOYjT5t4mRzdWekBzDlOFnGGDOFVUlkbCMxEKnC0ipfOZ9bZxXbAJkOk55ElGf7krlCFhRxiV40DjcwyQ3YI0kaX2hwWnIuy69rbDu38aDjvl%2BPNLYwUbjvgn%2BH7e3MQW%2BsHzhcXwXWOUM6eUO0uoiSl4RfI7HnEOKsXmMLvMM6M6jeDIvenPigjmBjbXcBcBQcHsKmFxyGWm8BBZlIJYJaN6dUsVgWLB7NLyzRoqF9sst6YnQ8Cb1p7yVxBwHLgE5Xjo37Mk6VBUstnQzVXz3rDxwZM4nuHEpmNcwPKwUcaHNHC2Jv15xhZHX7Gi7pIFWE3zGtSc7lsjAZNMgpi7gZWiJxUDxgqI1nohvtZgEYCBRnI6ozjLAgbKWYI2GkKF%2F%2F29wKbStkXaf5q6chIk2XFee98X8uOhKURggAyS7HQcRgwlIqEfTIlOImeV6iN6pFT4ySRI6qReqCbY5VhSVoRNigCTOYIPpWmw2hVb4I6zTDS5t4QWklUYxM2K9fIyW%2Bq%2BcSGILmLaOHrnEOdz2cYqRJIIPlqI%2BsVEau7agOuwQLB7A3cVpDVaOK%2FO9P6S79dTDaqMzmktIhG%2FLRD7rcolaWQo617hXV8rirSG%2BBMlWzb%2BjllrFtFNFdGGsdTUgufr%2BONfoqt2Z0gX3xI8Vq%2BEJBV2%2BNhnCabRJ1tZcilDNLfOV4ifE1RjWB9JpszKOIIpqyWeHSF8SFudWx92GiV%2FkH6oZW%2FvSGO85VaWxosCMyqeGuCxhbUgaw%2FjZSI3JYamaL6fKG7RR33A9EckjEXjzf7VucNZGqsQtKZrLOkgTxPFs9l4KPq9WnIGiW2JvxXJcWEtO24tKLkh9FLEk78PoxeSxLBHm2ntbuGyEt4ZtxndxWT8q4P8BGSInue3%2BYdR5ooqtqtAw3Xz7naufINDBEYpz7nzvqauztVlWsYnxd18quRy7hBzPTpw%2FixXmmK74WjZc5O%2FUUAWfipRVPh1BL%2B2di0gahRx%2FQZWSLktEtp4Vbln2Yt1tQOjzfBhbYiQd1tTZoyYIfxMn4mfWDkL9xxvOWodhTl1kcCXNizRftxCP%2BxhfwliBzXjtZOoobJrOLnQDs9QQNaaXQbTOftc4g%2BwtMCHftGjmeYL57feZ82odI7XMamnMOsGMQmIB3V%2B4pkGe4xjlK4SjIj8UEb1B64d86ZyLZIJhT7A9wLhzdRO4HSMcoSOciCF%2BOd6SDHdcYpcDubwQWju1kCqYkcCodlELyBXYIaPka6q4Ylfu389ITLe3RzWS4gh1lGQgPxIaDu1%2BfkSNOCJKJWLYUj2CoG6G%2FEMIeagLKN3Q0Ax0c%2BZfdwgdSpkm0QN5b4I0A1Xclgesl4hFz7mVpLAPE4kzhpY%2B9aeORrvMN0F5ectdbWM9u%2B9sgr39MipMBBZgG7i68Jzzh%2BSxbQXBFyYuDOiuhgGyUrsgp1YkABXqzO51dsyxh6oN%2F5aVRnkc6uD2DnWwjQ19SWoZHuTEj95a8kX7ODCPfbyUxZjvQ7JiaVCwLxjcKiU2U6uuGRd0iHR95xWPkMBbI94g7res0DeG5da2buEchQRkCeJKU6Sy%2BIZZEwcOSx%2FhxbrQj5ox1K3ykUbOo4qnz7qqoYCwZbINyx1KZvUaGCGRtzdKl36lsooPM6O9amtlWzQw8sLlC4FqFqNtx9sXpBpOuy98OHcbY0ErIROTcNCM4BuzND2BwWMJUF1Cbsge4FpA1jHIJi36NVVcRIiiAkJTO2lS9ZtqH6CMO4SCSuOEA2vJcH0AomYjRe6vFecphPLgFP%2BmQqMSSrzPD0E0Bq7a7%2FdNgA1t%2FU7%2BOXZBHr1BqO7g5LWNjoDVVzOpB%2BucsW6yLPct%2BqZC5TFDDgZ3k8kL8YdFWg8EA%2Br5%2F0Wt%2BAYwg86%2FlmacMDhIlnHEISBosmOoGF6GqIR3Sr8ZdRXaJKrumeSKKF26IK5epsqluZRFqREV7Io%2BqLyWGNuBNIXeZv3QrpmqeuCfin2oWuTwAJ3VacpWSvzv8pwF1MWn1mAKa1n0Qbv5qVo5mdgfxfR6krfJRPSxW7MTXZ21o4gN9ojfL7sXFukrT2rfgW42TdAQz7SCoJxQFWW3GnEHvu4gCD31%2Bh1O3HSPB5DdjxRGJBPIchaomhLgNhm8NktUrjS8z4YBZux0O2euXy6wa44IdClTmdCJVBXf%2FvQOaiXbVqW1LZaSwF0h5EkP0xgijMKO1nK18jc4jezhomRnxZW9IJef7kJL42%2Fg48HaeTWi7za55gdnzOKVMY9h9LHYmma6o1fQo%2BGDVa%2Bvb9EaDufzizFUb8zyOQeSRYQP16jhqlY1UzxYG%2BKmIbAA1VO4QbxGpsjkQE%2Fql2gpLFmlYeVYiwRUIjuYHNs6THsA4AbtGwPdtwKCdoA4wDZF35oMXsENkWNkJSqH1YQ93JMvG96FhtxyX%2BEBUr5%2BrNQXvakA5Y%2BSa3gwfrpNgGCke3PHZnCmhNBkGuomW0iYpl981pEYfN6NsALUorubhEdJBQwzRO1CZpg3xpQ%2FcuI7XH2jJJ0fJupl20rbP8ZRbsiPCRoQPHW7ipE1SqDoHapDkCfJvGQVx5zkaSBY6dhV9FF%2B5rkMDBpga%2BzxKO9Q7PL%2BELmFsODR2O8nCZEt2jq%2FMU1TuVGzsrNjKYwHxVi2r5KxZ91UHmmWCi%2B5KxfPZjPRzNdOESZGqQ5fMsXuktgaTcquPkDVG1eCtnTbqjX92Wv0Xrw1cdb1WLgY2ypS3SAOotN0fvaED4bvqsjAOsPWBB7MBDB8LLE6LfxU8hqBnzPl4FI4cb0P7ADAUHtktUGiD7lkhLNw9vHvCgG%2F9owusCV8eokYnuGL5IKhWxfIxPI%2BwJSVx8vbEnhGb2R3a11ue4hsmL%2F5sPaCmN8yVZWiTf5clE30vGxBn9X9PLRI8NovrnORyR7IaNLxwF8K2CyUz7ICYza%2Bh7i0W7bRkglz69PirO4C%2FnPho6QdjFqNcDn9lukm3dO%2FAbFxI066sMaZ1bREZJNRnDWBRwmh1NC7%2BOrBCSMc6AqNHzZpfFhr%2FGRSWJfE7x29lh08y7Uv224uTySud9I6IRWZAH8goQoCQJR6GGS80K3nXsRDiG%2BWvWLwpfLWZsHD9VXdgdPmgXw9zfBRMkz1adt3Z49%2B2JqZPhfdBu3f02dNH9tquzMHrgyTM%2FxM6Zkf4DX%2F1BbN%2FfUfWtHWC3%2BTVre1FyQpk49UIH%2Bi5ktanp3cDFXS06wqw7lxFSXCmy%2FpJMszvF2mBuybZ2UESrfrYcFl7Of6K%2FIkEk4j5KhRiOCKJekIir7Auu6N05XMyf6kX0e0KCj7d2PUS1KN%2FmtSVaCMC5%2F%2FxVLUaGccIkqa4TsB%2BYw9jD9wRiDVcIp6SVXamNejpxTPlwqiGYgdmlNgHJgZbSMFZJXfETUoOm8im3u6gXtDB4mosZASQl4yyaMiRasmlLuNpz7YYPjD2%2Fcopjuoxz22YSWMf4O6BJeGJh1Ge1P42OkcDbtGDHOwkP6YPKIDrGrTkouHZ5Heil3lcTMBAzLqBLkWRB99tlFMK%2BUadv%2FVl0AgV66YBa3TQ6%2FUUK%2FFoOqCidizFSHJ51JOBogUCIguuJBGJKRot1rgiBHUZApuADoKvTgTpP1FQeLdJkW8YqXAhy0I%2FRB%2B08rl7jOOtI8A%2BuQYTcuDagjFemN8VUjIJhjKsIQ6FKRq0X81Gcx8Tb%2BRSgtIi%2B91%2BoL751xGScZTGsTmDWAQum6wgZIauzZyCbnaSDMkD9OU90SmMAPAasphhJbFqyDv1iyFevQbwNfGPdX21mEHu8gkNZF6BypeHgNXZT59FqZe0aeJhupKo6yESS4M%2BZ77BkBJ4FLsUbuB9LSx3V3UJIIqVv%2B00Xbj%2BQA21PdDwWiK4au5VrDnBTaTHIYJ4%2FGj09yY4In7nwXRGhOLVQmJrQWXEMSZMDh3epEdEbKq%2Fm6DjSr5WsERKYLzGD%2FAew%2B9Kfs46KDDRqJ3iUQpj6RymZSqJtZFPftiH6tPBjjxrwwqYGKqs1%2BGeTOva27xv6Te5nGGmQaWKSZY9xeRWlT1McGF76%2FSls87W%2Fp3WCGC9NKwInp9ZU%2BnBX88nYBGZxgRgPG%2FsyDmVZPmaxAwSFg6aMMZYayAi6GW2SaqbOc4w223VUkiiY7bIqehuR8eMP9M026a6uTRz%2BrAHFkhWgG956pnMAlDeysg%2Fss1mFk0bZQoU6caVHRVLnLxwttorKOEyFQ478Xs2WSnkhU1AiVqw3WN4%2BGXFATLcedvs09itqMNVwGzpHvq%2Fvj7IVYqED%2BR4ElSVTLe2q%2BixTDoPVfMEKOTzf7M9XKaEbmhsHutYIBMu3fsCWAPYqzpCOmBC6mb1AoMDTpwWZFP72TQOZpzBOQKsTGijUGeLl1B8EaQ5ozbIaz3TrXlDClSUl0H1WhB%2BkLXqXEMGiGSE9wVGoC50Lyf6Yyl3KFFdEQwN3%2BatBnSepLyOYnCsaSQhNTdLksUg8Hz%2FoRbLdpi50VMqWKRbST1QPFE%2F%2B74VP8BbDIiWV79ygDQxaWKQXuV53sDb45mtDNK1WYDdKfoBqyQFeelyMnqkTlgtSx%2B%2BiZVL7AG%2BAxstD3RUbD79uw8HxYFKNN%2FCMYMTYgaMLhGeMnVqGmhQOhWihNhLiFK4XUCIj%2B8j%2BiGybggPGSk0%2FrWCs8ZEmXUYbb2%2BLyUmUWSt%2BzZkitakK%2BnTtDV7xNGhrwqpW1xCXJtUaYA4KZ8Q5eDrUMG8RteN2BLUVK4zctQc2bR60kHkE4wgOCcqWY6I0nCMoS9TAaVFzE%2B4AW7rQAdSGSIuR0vZCCozv1D4w3EVWgJCd1qylsl%2FPg%2Fyoca7YaPQ1UUN3J%2BgqypZ%2BcvJjwD%2BxzJjl0HjhLM4qfJxTXJ%2BnNDo3UWaEljEuTqgvGkDQ7DXpwoY37o03OfT7vi1iX8F9W6T1MhBL0ICGPeoQnWi4QabrXQlDQaqNaV1H2KbKMANdB3geyIaj5Y3Elc%2FuD6E3uBBUaProjfNaGuFLyhLWFV%2BE5Kc1F2rouIygZl5tgehrG1vyhCEDuPGhW%2FrIALDCKG3sbcsyO7z8vW2bzV51zxZIfCQpGnGmHqfP2zdEW3VzYNJlZB54LqJN4uV8P0LfyfR0xDnJX1D11ag1eMQ0zV%2B5UGV3q6ZW%2Fp4GRJCVAgrdP0WFM2GuIp%2BxDjDL%2BQ7ZAf2TaIJpW43J1lrIgGUuBnwOLVmvfy1kOD07jcIWVCnGDpDKE0fQPJ8Xid%2FsCj7eYO2qBr8c%2BHerJLhcU5sz%2B4FRBI4JpzwynqQz9Denjs9rLCMmhJIbJsCJgxo9jb0Y%2BqsJp60oOTD4IsegIaOE4Rpnebi6twlbCkIDWaaBw2bylTuunlmFhVuQpCbNXVVo2cOxU6%2FSMXk8%2Ft6vB3e1UDj8cr0ebCSEajhgd9sHTRoOS6Ybm0tCsxJJOsjwGAoQTkEJBpoH3IKgGERoAmfYV1Qlktp0FzZVr%2FWA7uJFvsr8OUUIVgNJ2Kfu5y%2BoQmpKzhmQnzGupf5okye5UsQ97J2lqOXmNcaAeO01EeWAEvLstzoqODChEwxcjeNUVjcy3bgm8fuL829aNMMeckjHkGL8i0dMS%2F8BRbwzj19f9O%2BuJ33LGHcjxjSWHWZNr1NItfcE9ceeB9rDoTPzpEO15dMAcaS2wxwk2YECN2xB75iCg3WhVAeIQHDnsxf6UPcxW%2BiVRh87SHMRx0vUopKgICUFHDrTsWGnkCFaHK6iDy5GH9p5uIgrPnD3Wq2VNXGRPOZZtFgkmmqIGmT4ObgP7OHRZAGyqcbbAZpE5bPnImG6UlDUNgMIWFiVRsDArjJCFoBYGUsvpFa1vo3YcV8MuqWWATECag%2FkgJP9wKCfZNn7QvdykYAYCiM2jbuGqJMPtEjY19my%2BLF6DaDt8wZBPIYJ2OxGUe4W2qaJ7mog8%2BjZftl5Lh2tV4vETSNFNUeiyzsd6ZcXRGVtOEDKmACEAyOqUs0xgJy1O40qwZCkSCmHZLUhuu86PIUsZVg45nlRa7rWn4xyjo5miQAG7FMoshkRtpkE15ExFwiZh%2BZ17h%2BZbxFDGjaInV2jxe3jhgSrJy3trD2MFCu%2FtF1DVnMjW7o0Pfo2gzT5rVbtJHJdqgQrDBhFZZiOb6%2FqHTGCQC5FtVJMMD2oK3lge7DGusdLou0pIG2Ymx5dDfiiBIVDan9aCx0BYy6BC17feOZv4gTmurj5k8bdxoLdT57V6wcugEXHTDNVr3Ug6pfA7KtTNZRRQXwZQcMnq13nlQbHe6o%2Fs%2BRmuK3D6AMWyYKWUxie2sA5ZgrN76wtS8q14a2xyQzXZb7Ji%2B06KQN3oAFVaf8W4Cv44qo8C36kIwZzClwlSxofcjiX8%2BDoNnK08tyvb8jIYYBxRJ6vn52yyFEdm8kyBRhgC%2BymTlPj7AFzUN9ZE63t08WsflwpzxhYPpPM1T36OSB2iF4%2FaurUr4AOqitIYdChQZM1Lenl9UOMdZtToHCiKR0EK%2BibynVxRLdkg4OQCt7CtLeDgbhcI6ffotKdbeXbOKIj4tZ%2BmMOtNiZZoB2uuC591tJMjA0mc6hP4%2BhZtx0Z0WrD0c8YH3IISuXjvegOmY%2BKcpsom%2Be1%2FnrvX91UgQiJmDuaXkojJ7Kf%2FAXExlAPysSAMkzAOi%2BQx8ns2AY035AM3CxjJUjphQS6udklAY9qoIQiPMAGAVUjM0upnDlA1yTB13mq1RgJ5I1R%2F9fsSJFawTHQwNba7DBjdAvy3vqs%2BiuhKWgcZ7ngU2p9hHsjCIBL8WnbEDzvg4bqWCiZRJSB7%2FNl6jTiKs84GdOhLYHR2rC5SMrFOi64HRfJjz92gX%2FpAv9dR5ESBzFckUFRrJp1u6OJYOYMEeq4tWC%2FdFzr81f%2BhiWRJJCksNJzEso1xP34lIvkLV7qvX4msyQKkPWagryGkvddPTv1ZwARrNKzoFexvphofX0HomrXN4B5vjU24S%2F4QJ0eiWmy%2FZrEPm%2FuL4q00gSKkFwoAUAE3T9EnEZJYRJN7m9rpdE2VIufGngXLzn9jzfn%2FTzSIBjLPp9GVJuwTFZLBBG1b4SI1vENzlfd1j81Lwv5eHII0NjaHAOknQwgqmpBTMW6nlS1YacTOsfZaesJfOTRvsY4U3GherRQk5RJ2gORFwscGy75WDuprfoy5SBjkmHI25maD2RsR5v%2BPOYwjuMBUP4PoZmOD4Ksas6g2yoCATSR89relQVsbNSBPPW3%2BJlY5JUIISOTMxh0PRRnEWrZIHQj5R8hFS3xxsQoXv1Ko46GOMYQxqmDB0W8lPAEv0Prwt%2BhdbRBHj89JQuVHrCFy%2Fc5jHimAxjQEAUfDuYBshEPfACNwMEGnNk3nHVcE0ZC6q%2Bgjdba%2BYbhvpkl2TtdSxydl3c%2B%2BB0wWZm3frtSBCN%2F34Xb6YrS8yJ%2FhQ0%2FySWqz9hVa3mHAXqT1fQmT8q4%2BxZTP0dNAynpcqCbEsbB6rgE1y7QFOP2m6DbFthSk0gq%2By4GkPWRWCanRidseNX%2BmizjXEOTqFj58cEM3Cn%2Ftl294VC2IUA2LmFVNKxykiax7kjbp0%2FKEyWLER9Z0H%2F1eT2CecrtZohqhBMtFDhPnCXRBhbxwiJeWsSZR0yWXnzVBWqrZEldGueDW0znRCBo038sURUmVom8AbZhPep8GaMHsWGs3sxAi0BWx8sLc0uaOPS2myMasV8MIeeoftBw4ndRvjEO7oD8cw0r0HzumPea7C7ckMoMV0db21wx3EWvbE8Y197lGxIrHEfpD498M0OJJcSldt38PkverC%2FkC2xQcJTL5WKwo%2BUaLg4CltgH9URhMHJrN5ilyDioKS%2FRCdofmFk44adWiR06z599w%2BoY6Wozq4QDFAiyYVFbNQY3vWFmNNAlGSwdsGlJNOBsC2%2Bdc6J1s5iBqweuunhCmNN2G9OcVc7Tho3dQL5HsPaVdCKgSJIiBmqDANIKJBHNJB8AjraqJT2nfXIErObaRnTjnCbIswQi%2BcnrblMdd8Q%2BLeg7%2F3RJA54nvxopbhvUFfHqwoxgWpPDDpw1WU33ucVozbGWj0WznxP%2FCH6J39SodahUHzNcMw3O1TBxf2NXp%2BHRmfwayIhsb6DrrOtz8KH7rXX%2BoOEw3CwOmcRFsyNi43mWY59IT2XHIIe6bShXq6NDdAKEBpmpcMUWyMQ3FuxaXaqhRerC7r%2ByjLGFRP%2FdBepOX0aPZsJzphumC9OtAgE4PmYpiaBP11FpapCXURq97ZRZS%2BQ0LnbK66XPgHWfMGC09Tl6WvNltJ3GJCO8737ZvxtcWWYC8rsvm00sI6aV8LVJ8nJAkj2yiiGzuyK9WyatFQsEtfn9G7Aq7q%2B4R5B9c%2BNgEdOtwHMGzPuw0WWOLIHcJqe6HYPmyBPotqjW%2BVFZiI6vLxfMdohwoy5afPAC1HQlQfxBbsOT68f7X9KLZo9RTQq3R8%2BU7uhoGK6yb8oucd%2B97jb6OY%2B3ePU%2FxzvlvW242rTopQkv%2ByQnrKSRpwxm2EDLok5onCA8QgJPb5JunlNH%2ButawxQoZtPCXXUTWib3HLsVAWdMi7vjZTQqVjQ8aj9Za8MnsWVdzbiaz6ekLZPSV9oMM8gY6vOahEeGPI3o9NCbz46%2Bv8UQCgVps6M29YCCDFxVqdiN42zlbYK2LKLrKZcu496662gfqkR%2BibNt%2BnChkA2f52Wc96nDtr5RC3oR%2BzfJWS3T0jHOAwe6gYDo62gNHZlNPUdOA%2FljxVENXdfDgg%2BsHxEorJIqE4SUQr7IJWpS%2BHEyoErOVRUjTVCobBZBNPbpC6a5qsLWYGbtjwa0Dvk3GKowhW4aSK%2FITS0rl53IuNJQL%2BgSsyoGA97pbKFtzVqughlK1YGuNsIIo3X7xT6TDdA6xBpKrNjQra%2FEAJvGFroqIuSP48XFagaOxbSdFCiA7tj00dxjwNANBDX3wh2m9edjYBotjYWCcSzd1lxvsNDnAm6EWjHi52khYqCG9gkSmrp2lToC3Fk3dYFOm4kYPkNHI6olpHOzvHsoDpDoab7iOl9s%2BViDgxqUxRUnyLRHj2iK6jJeqKBLFNZjBX7f5X%2F5biBDyzGJow7EUk4bHO6JjRWn0HLMFnGmPouD%2FKO3RwgWPiOt%2BCGq0o%2B80PGWHY065fnL0FiQgoyWRybA%2F8Hbhm%2Bq4zyIaB0mIvJtAVd0UGCq2CzQaK1Y6T4KiZyGPrq5D0F%2F%2Ff6Lgor8V3sROSBWg03h1iXYRBUIinK4XlNzEsxoFsd%2BbmrQ48IP3AJ1k%2BfVOiiepNCg1QA3qANkFl8BHTTn%2BAW9qtqiWKjGRxLAapogxsf7KqUVbA3sBAzJcVTvSLzsH0T%2BJceOg19R8JLGNSn11rmfU8jP9OEfEL7kKlaVH5ZM5FCaFoLMk0JExwL9SF%2F1%2Bchvaxw4u0weH8OV7S7TiGPDPGL%2BGKXuzAIH8dpb0cLHGcyMgn%2BCzoy9jks%2FrvYyT2n51AXqhK6rHl2SzUHL0O%2BT6DleR%2BHaRJd5vlhboWAELDdR9rmoy2dsMivPlMa1aM8rv1V1EdVL83mFd44bBN2fjmgtbS3EgXZ%2B1esGPpK29k3oRQp9bskBxsImgN7e0XkbmOIdCGUaqQzwXRopjwWuqzaO1lDX%2BDCCYRS5QwpbI6Wq1DdXspupYhcZQCL%2BAwux1WdXRJ0LQ5Fy6o%2B8psa61lePEctTBrxNyqmhNnl%2FB2So7Yx7hwFsq8QRrU%2FJZKU%2BHCOmxuAY9E5Kg%2BDMaOqHW7Rg4HnvPE1v3h0h9cb4XAxhRNnPc1i4A44ZulvGfO%2Fc5t2bGDXJG9Ae%2FATAUgoCoQYFZmWDhDvkAHe9CXN13uIjNzDnCoHtnAiPhzt%2FNXJ0bNmEbhuYYbzZVVp6JVB1zJapvBlhWYQtGKIHGiHRjgY9yZ5HbiFfGBMRJiOMXwtS2llDtcSEzk0h5CJHsVYT4ISl4XVcJwlkkpHYUejxItmStmOKenXKhKmBvvRrbzFRHQthqrkIqOfvDPWSlDi99DBNJyg9BsZKmzsC52vfehYQ%2B%2FHB23Y0JfQwjogO3jDUCp0zlYD42foKsVI9iGKbJFq6kVSz1xZL3DGNc9IYOgWDIeeyoGaBOIfp4EEHXONouvJjH2FGlzBoi0SGnOTS2AC9nwQy7LPXMH6K6rSyMtUDdnRuU%2Bj59psG4xABWtqk6Zrs8EvCB6iiH2lpiB%2BzuKBBkPi3okVD4qxUKihZdPypi1NILuH%2F72qKENhs6Bb5BoXagwy2H%2BOIwRd0B8R4BYfMc%2FuZgTp6zZJpUCf0%2BRMpV4QzfCqxKjPB1R8b8VFH4DVp2svYGgxgKR79kEFH948KMRmR%2BOcwdcVs1ww0nlEpYVZFj0ng83wMG6z9ABhmmOeruGoOa2md4IjjhsxE1Lyw%2BV4HdRWoiX5Z06tvcO7Ql5g1F3swzDkERYazH15FkRnr0dRwNmwP1EFQYc8gSnrjjkelTzh3qi%2FUYS%2BgVvT%2Blpl8dPDbWPKvpKyXaVU5zNjOd66ZZsEoO8HP8U4xPMfp1Q8W8UeDaHYqADvknrBsmidkIVuRCEBNMln7EX2SKpeTk1c3Ci92WqYSfbnIizjoDCKGDaKplOP9GDAGYgMbUboqJ84VDoZbCUkYsAcF6tHpUfk7vY6pBlzFnrMFBJ51npwHPS7sBV%2BwwHovYFcFY%2BHQK5jQLZrSARxZrXSgqxtUF2ltHIIHQoK4lh1dG7%2Btq6c0f7VBaNgd17oABiOdP1AkysHqUxeHIBbNxBMjLqbDUSsZg0zmc5CdZBmPo83jMrIxr%2FpLS9d1Xa7iVIT3lf8YHKUs%2FJalm3WeVr93tD3dYk%2BspLGgQx6OUDOX9hFuKmzAEWYXhAv%2FJYpNgnCcUMyGY7gyiP6q1FJF4nmSmiRLnJEsWHU9iwOwPFqdnWuKPhkN8kBTbMahptiMl5piM841xWJ8owm8SGjhbI9sKAYjJuJA9i2UE8RSvyUxCqwGiy4JU0zBz7iLVvcQu1RoSzeWmQbSW98tpBzYR65LFR4NbBuVpbXyoGZ2Nks24gS6mnloSmOw0qm3HGDekBFrGTe31lqq5wdp6WGdqeFQQSYtwgu15bJuOQJahYLDQdgSINYRMXCVVBNSUAJPup7PAlXQrn4lBWUdfv0clQR9r8EVdpqgAQwDZLULc%2BUfjwfBPxftaGYiV2BBQCeSYKrqBj5oj4NK%2FkumOFuj7oCzYgOUbll627tXCJnjwJ3cc8MBUQeSr%2BjL%2FZ4jpVSAbLS0gTj2N4DNFkWepqahSkxk3Bn3LStrhaNlTdLJSSbZjuGwC58FRL00VVMXkZhc%2F8UMx5Q4TclXYAC%2F1eqrHOh6CoSCPq98ZaTecDITK7knYVzWG%2F8qQPvPruriNal%2BH8fFYu3XPHHYL0p5QaaQRxpe4eAaZlnUj0Z5eobiD6TVZ8YnM%2F%2Fxaa6Sf7v4oRsNRfefMv7QeZsfPnqbHztv8%2BNHb9PdLS3b9OJLN%2Fqxp91rjKbTs001Uia3WKfnj7m22oDfbdexEZp5RDe1kN02%2F%2BA4yqt1XCbl3Jp116e%2FFkY8Doi%2B2eRo1llIQHqPm6ilpYdJRJ%2B3qjVEQ0G4fvJ%2BumNfp5%2F3epWRCa4yEQl5mEQLnCHytmQFvC7zKvczKws0hQlq1FsWdLYlGTxYx4tnC0Q%2Bz3yxRuRj5a05zIEgoCzS55OuN95Pf3FiiqcWOVog%2BMqhs1SlsmSkv1jUSJhRGc%2FxSyc64q%2B1J%2BaFrtLOC1nFRRzIXMfY%2F5SMliihokNUHFjGG9%2BBKki92jSRGvo0ErMchaVbvaGPzB7IZCYnRlsH0VYdbDgGTE%2BGYyjNNlhpUAVJk61BJa3CHCbsSda%2BQodpz40DqAOTzMsF3ULKw9ogL%2BrMvUPyhZnk0KHQe8wb0iX2oGQIagM%2BIyvz1vV%2BumamalHHVLKmQ80fxhuSY96BDUHsCBaHbSRrttGy48h5G9Z%2BWEZQiVlVFROESzEbdFouSnYTbR59T5%2BEILrU8kilZKAkZgOzlxN5azuvxVRW6Aaxr8gXdRluJIpkVhwwZ7r4G6ZNxGvwt2TpBb82DEja0xEwzGxm8A4jtqXKkBmlLohLZ2pMps8xLdT24DXCFoSOM3NLE3ixL1CeUiZbG4YN4MeoH9GtC%2BIIAywwlpU%2FQqiyFWb01u3Tk5%2BwhenTyBC7VmCwA6wUuQKxMR74igTyqkNL8nujxLThBCnilyR%2BDcv86Y4ebi0jDghMOGMAcXh0YL1CmRZ%2FF9EBT6kpK4yoX0cvlS7o6FaEdYMp%2F7oAeWWKdKEbnTJDWvFsYdWqFRzR3NZ1pvxRmwEt1dDxWyzQxYCaXV1zboDhLno1ABqeC2NizOpHXetEUi77Wf6F%2Bs4onReJMczVkUSm6i2AA7kZ7cY7Six5uSANWgUzMQO2StFEE4XrKVal2a%2BR1WKRVL6OK1RznG5V8nk52m%2BQOgu7CYudn0Iw2wJiyDLaBDG8rwQU%2BQs3IZCF4Np7SbEW1PQxjQhH1Ltc19kiQZUYw1HRQspz2iKWeZZxKcl%2BkWMULlCIoLQYUL%2BF3rHSISOOwS6C6cBDMhYbdr49NQgEDtcxcQxtOAfq0Jq3uNqRIUuLrwleZ08ug6oJT%2BIqCtUrcSyqEqejB%2Bp3OvSOFeQlB5OYDE3%2BjJmT1J1MqC1l4bJVjoxM6vJChzPBouNvFVs7WNec4dggURtu4lcElJlBVsI0id7M7FqH5MlI%2BqMGr5%2BYXjepybx8WjV1F%2BLDockurNX%2BQ0xt%2BnvdlAobgJme5UeIncCaTenGHWWKIsvWBg3dMo9Wq9gIGGOGANk%2FlnOdxfC36o6jtzXLIQpiJ%2B4iLFR%2F9wTy31HG3kWtLXIHqUCcY4C6Nq9X%2FrsKPo3UyHKA8vA5xO%2BHJyU7n2TryPKoNJiRDzUsTFq6NnRPMRXTeZ0hNZvSwYQ6w%2FruA%2FkGAjHO69KF2gQDYExmkw9b3%2BmhIrVLs2AxWcdQTyGVfEPDhye9w%2FgtKtQZ%2FFMuSyswGMwXdhyGCtbgJnkWx9oAyiBDOa17XPRpWkkMjv%2FYI6ZWjFs8hls3y3w9HBTrcGkLWF7gbBv5ecqJVhuUfppoNxkDZVlvTEEHsFPNAwcXXwuQ%2FRCBE8QWrmDwt%2B%2BYagYtMoLjh8bRQsGsyBVGQldMSYk0GmXuTAjCh1dNutlcoYceP88Rjs35nQ2G0k9cLaQkUGGvRVmmmHMLDO1ZTf%2FtAJIRStaZRvSNKn3W5kC2vzah5iXhC3RmBCtnuKPhMLIyi5wrSYJGncwwnNyZ%2Bf10%2BVJHM9KMOsRMwugwI6lCU6DHj0x2dBXmdUQ3NXtG%2FZWfiXcxQhfNp5g3CXWIn2bKEZWW4qhwy8MiLhJL4SZRalpiLX1ecBCmzk%2FDPAgRmr3CL6CWYEIhxiwyIu6MN0MprnR3HqUYL8twsNhR%2FEogJdIJR6CUQjgK5gTRQegnsOXIP8HJxEsMNREsRWxU7TmF9Gz1UHvaHjN1dFChDrm2dLPeIaMI3ajINNW5Dxgu6q0xTkANiHR3Ri5cRvBwjC5b6YllHrBj4MX64C%2BoEPjOVabb%2BBSzXBSOIbZUf8FmaWIOJoL0eTFCvE3EzJIfTDunbx0KIWhYkMgJ6ejGEasXdgiXz%2FxLJ9tgeGGS18k7AT4NY5vi1B1N6Hxas8XUyTRKU2RAW9zkG9%2F57BiKpwB5YdGtgginULBywSlbdw0AjzeUsf%2BUrZvHnvYnmD%2FEGezOw3nM9M6Ia7Iqvnuv0FkXh3cdmWhZrFMBDgzvXwj%2Bc7TIHxMvz%2BMpdtOBzcLYcNCBddxz2HHPm4573nS8w03HPWcd95x13HNmvsNHBMyEAwE7WUJl7Rx8Fy07gM47G%2FUsGgR14OAz7Jj2SPZdFcZmnINr0oFJoHfNv7Z18dLaFxCmj4jEbzH2cKqClsypiScl9LZ30p865rCslxw6NhUbf4mRfKxlMFyw0%2F5yWSg3SlGgfgguOWhsnggvSTXUQcnXpdP07GW%2FraNpnCLTRTYVjjAr%2FUgyd%2FzoCr8GBQjBgCDClG4nNFOjI6jrgJF5bNg%2BL3xd5ZYTiyb0IipQBLhMNgknr975DDTj%2B9izQspUA%2FOktylWTXlqClJTgpqi05SZQhxtyyTNrXbdWDe%2BsRp7Y914atBm1i1n1i1n1gvMdptHr4yVACqy15H9m2TPkuHw5x9CwI8h4C8h4N89gLR%2FUjaLqD%2BeqC2Ln%2FN1Vubh5V4lvAChvyhyfygS2dMohKSPbhzR%2Fdl0ClmTChzK9%2FVzXiyjLGx7Ci7ZEsNMdgUTJs%2FgbSFLaOHn2WrQ6yqWxP26ymXDonalW0Bbo59Pf0WrRJvyn6OkjItznNNKjSOmAptASnrbqKySjSoMIZgRAPE5KtZ1FmfjPH7pOH1GbDuVWuNzVP0eOGHyeZAXcSDU6nNwTH6WuuRZxhZo6PITJmMV%2BRzH29FbwtFeVomSz3H6kmTncWJSC4P62eT9rHizZZSm86gOkNUclQJI9C5Pyao26kMIblVoEcRcfQSaJFy3JNzVzGU4RQXwujz2eXb%2Bb4SPsmcl0KZdICEYIUM%2FytLRkK3Bp%2FN3Lf3vvdMVqYgY9CwQNonUIy1XQRNeBy%2B38lWqA%2BlEkDKoiupHkTjauepGFaNDNO2MICLv8xhvIbE2xnmnz%2BskW%2FgJGj4naWrpH5%2BTYrFe509Pete2hYw4js9pnGSkakruyZ9PsSzalqhTpEJkP2c4XIhiz8bTslyfPiDiK9cS8D5WvljrRelznm7yVV7kL7NNUmT5i56FBUmZxXNcDOPUf1IDvbPEtHxWHqUWNHSKz3WyjQvdpHoTkRnxGm3CiZc%2B10WV%2B3Ewn%2BvXCAdaLUnflJZ%2BR7x6bIaAHffPdXoRXQ%2BPKZ7q4GiG642RkAe5AZVWzYBWq5nMyUYTtTSNo1WNQnVjj%2Fqs7Qo5tx7oKIDUVd98YjzQFH0CGeRRsooz7B7H%2FQ7sXGEzTTEfkGS6sOk4yha%2F56WhPhCyjOrgcCN4VfsHBBrigJSrlb%2FJ3oBWGxgwI54b0NIRnS%2Bjo40dvg4BfbuopRozpsU6iq60PNPhSAU%2FjaNCdVjhb6GN%2FZCQcVRpo64hjvNsZaJVsrB6mulGKdBxRPNsbZCs9Z83CJ0oUNquD3rHiiQbHs3bwMRGPrxQLMp4cGUImsHk9LedooPIT1pnJ%2BrWSo0M%2Bvc48pZ%2FohZhC4rReNmNIye5b3kcA6HgX%2BIpK%2FHbh4FgGc1x%2FOS%2F31PVLwp%2FyjdUP5V1C9xhabYvxIHZeRwbGaUb9F3IemzHExkK3HQe%2B33MNPtG4WbPMTT8VMfHgNXkBtMnhYHebzv64n4bbsv99h3AakvgktAFOAoSKIEooL9%2BM9GeygwZaoCjq8SXAljHSFpEbfwdI8aUB1jEU5PqT22hqkB2IyhBSN%2FWfuVC8wC4ysUIgjUyHNVK69iCKkUjEDtLJJDQvcw2BZJDAjIfq9NCSv1XO4GKwyCA%2FUcHisYK4H8lPyEnKJkO0CVyMkAW62geZ6WaAC9hNXocvyWLfCUntsKIDjw4gZWF52pOYkXWQ0wwexadYqHKkR4bJ1voYgiusKds49w7JOXh91ka4AhdaV6xoG8Uc4CBeAQMN4RmKi38emhQYShY0Q3j5Klqi09rXUnQzo2eMVagcz%2FCUqgor6LJg50%2FlThjj%2F%2BxJFvPzqL6OVaZ7AfsNESdp5%2BRCSnUmXpfAm4LFTfC9KmfyECodbG1bn%2FnrxKcLYjLFvtfgIDvceoXGRgnz2TfrfPcv88m8YcFUcrmLJHuBQ%2Fl5Ph%2BE5BWsEMe%2BPvWIOjYvpZq2ilcX9CyFgRw5w%2BiNFgMx2cMDUdwHZUmUJn7Tjl0IgDBk9%2FRVycHwYzpAU4dKthRS1EgOY8ZEHbM0N0JU9nd3div1tQN9ZUXBrWv6YgebJH1qTs%2BNCc%2FVVSOKJWQfEt4ucu087%2B9dhZvEhy%2FzL7F9oTPgmlXxxyYrewmomoHG6jGgZoDOXReRjgkAFIO7vNc0uahzcdnLhWjaGWKbFUEHx%2BO%2BSj6N3pNhISqXuc0LOr4GwBU3TOo4gUL0ePlFw2xDqbI1gqdPV%2Bkdam%2Bx3NoZD4jk5Mi2nF%2BQCwbn8jq%2BD%2BI5hJM5K1afUA0Z8KzczsbQJFX%2BcJzfQK4i6jD7B0khv1soQ3xyo%2B6b4Cd%2FiC6OVZgNOjfcHbFphoPzOsXErhWbkt19hEElawZxH6GvTpND5WP9DDf1SKoTkIhgJULgxH4zFHsy3xcIK%2BFQHYlSw8zWqkGVWlVyRXyB%2BL1wBgOIAb6cWklvJ2A8ULjfOVWK%2FNCQvNVCDLp02ThJ1E4kPUKdYQE8uKe8NgzGMUMlQ5qVDhsiEY%2FyPGtEJYG%2BseftGXFeYa6RzqzdA8zZjnUMLM4qnhrNknOtXSN8EDZtlPIeqSk8gyg0tqu5zqOowQwf4At%2BMSOewSuCwSojZNKld52tBnND7UeMaJN5FzSQiNHl52%2BFzU20%2F4y2uJYxHmSceSr5tB5F4T8bgE1ZjNPnDJCDwudJ29w%2B5AHo9Zqe6AbFzQpDt85t8O8s%2FpRmU1M19uPTJ%2BrraOG%2Bkvu20KusOnotxpRleZZ6YbHBnwlSGg4aGcpToIqcdeSTTkmqBQmU9qhgFP%2FsO0RPfA0B3U80QgeJeTZt41zv0WrH%2F7Np%2FzoE86x1VBe%2BmRdHa8hhu1bqUE7ettG%2FgqRr8wTTbiirDqyKzYMs2S1yRN1U0k4pa1DLJm22R9eTHkhfbc15qKar3ivJesul0Bs7xRUCNwcqqwx5FcS3txxt2xlOGGJqu%2FFNJKGG6SKFH3ofQ4778opa%2F1Yvn%2B%2FA1PnLSeRn5bGAexBjZfBlqvgv8BWJ1EDu1kOCe0gEdwBSbB5XGwm8SYvdpZsVSl0ibR99LOegYh4JCtwgiAtkeDRtww%2BVOpCcj%2F%2FHq84OWl3AEHBV3zFERVsVLlTIl2wEdtjcqimBXKBj7%2B0YYmXkdrt%2BXIpZ1fU4vDltq62ddWi1rVd4D10YQxc7J3rDq4XUTn2SYskn0WbJBT0cR8OAhrXpISMFmmy9T0J918Nd8wu2tZZ%2FmL4qHY0tTjgd3yqjE8iBHD5Pm9HVUdmG7qR%2FMJB9mnICXwqVV6uZztSkTZIbD2LK2%2FkWw5lomXJk3X6QBD%2FZZLUHTzglJjWVYkZ%2Bwj6BarPFoqsov5BvIsXMemIhTnLhEGUqyCDobgKGdWeLR%2BRQu27GnsUBGR6SICKfJrDXUZjc8FKrX%2Fdr7k6JYAavDpFKaiBhCmAdLqGSZTR5166HZ3DpWog2mz%2B2MtIGXgs8ioYe33CYqayPOHoCNE%2B4bMCPE8Y1LJO6IoGWmX4eAhaR1Ul5%2Bms9iVbnQ63JefqhTNaGZFjFfn8Lfc7WL6tkyqLd0rLmCDTUFlG5ll7An3twg8bpd9%2BVn6QVA5BEP2bb62MQJO%2BFVRKzMg65Ln0JphacfacIzVOXQQVJfDVG%2F%2FrFcskcjk%2Fl0a%2FAG7iJAPw7Dl%2BzbC9bcArMivDiuBJzQ5XJ9M%2FyTaJymd%2FxScaSsQu2O8p49YqwAM2u3IQkGuU79nEsC%2BbOuo2Y7CEEMBwjSCg4co%2BLYqkc8EKO6wKSlWwwDEm5mBzE8uX%2F3GPMb9bCVPsscp53xCt2lWMhfMNEbyOOR3d4fSgMStbppvcOB0JPInrgUls4ibYnOm%2Fz3L%2BPktAAginjhF1iNQW%2FOGHDuzHMPZjF%2FaXDuzfLWxmEu2mT8bKZhDyPH5TXVCoxOWiwlKXGVTrxiDbGgIg364X6ju2pDAZ6w6TValeR3%2BvJK%2BlmwsNRqpBnnfc6s3%2Ffe7v0BEN6a1cFl8FQfMNLJJv6lAWaHGl1ak3d94yXg7WSUpao2rm0DpAQ%2FTRG0nZc1rmX5HS2R8BArcCWMEut%2FWxGzXAoi%2FVZhBRUXLq3BeCb9j%2FVh2ha0UJUd5TITpYgohizN6X%2FgJNiBwQssJ9Cb19Qb6YrbnzSzBGrHG6DYhJ5V16Q9t8m%2FG%2BWNfwg4c%2B1Axg6lkgqtBAotN6lXDULZZLdZW1xr290rDuahvqul76ytRiHNUomCX1H%2BnnKezXbwSh%2F8hpkGP4ArTjgTn0hg7I77uxwTWMV0XcHJlDkNzOYHlJjOlj15QEmb0b9rQm9AYxC4%2FYx1j5hwYBB4tnAZytkyf9DkwNtEWioZeh3lv6Mf9CCr3y0g70BwC3uFUOBZhXjHwSJ7%2FGxaVFM6LxCXnL4g7llxM0mHu7XbkbTIuHJUL%2FhQxQtSUtGGfZxWTxhcYp6n8jgNfZfenfMlvFhcrhTuRaEQKByIDggyQZ7h88BOT2aHyTihDtDSCi2pwH0Ug3BzKiOnGIVMsGgOrUEaio%2BegR%2FTMgTDkUfigVGDoFNcFxxgx%2BG9KGbFXP4vC%2Fv%2FoU5RrrN8dh%2BO77FtSmtUPa6oAmytahiehA8QYx6ge0kKVjOOyLkTa2wfw%2BFipZBduA06fhML4xIUeSVEdUCQetDJxnVz%2FZTvcDBF8twXamhtzLXea%2BgUOYTv3FVOxOStXz0Bv%2Bf8y9C5fcRo4u%2BFfyauS13e22LfnOnDM9O3e2JJWk6laVSpUlq9tuT14mycyki0nSfNRD7d7fvviACJIZQKQ8Z3bPWR1VMogvSAaD8QAQCMBYsJrIutWYQhToViV1oaWho70gaSzklAUxOibTtWJT6MYaqkeMNToHmR2dETN7Z3rQhC%2FuUe4Kr4u76SYsr9vlDmy9MYUoD71Csl%2Fmnuai6nXSW0HEz3OaA02gyHg38yHx7PwUy%2B%2FXtVjg6M8QWBeeYyKK8vSFdrQAmsHTF3CXXuqKKMzZt6gszlmoEZeCDl0iKoTo1rAMqbMoXhHEYY8FcNs9%2BTk2OTsfcsbFN%2FVdd1O8Q7hC%2BnIYzcIcBqteVErUwlIlu4U2GA5gXUhitmqZN9aGAYIjTHhRWS%2FxKca8qAb1%2FKG7LDXVmD2hDwoHEqE9y3fJbRHO5YKhFqxuMqGG6lrAdxbR8Og5ImpEEyC6u36OLx8qCZ0X5Oj7BOuTmzJvTwPoPs%2B8jKPtVhk2VhOZzksrapGUIcQHD5uUJ5ve6RlWfuk%2F5UniPPwedRZ2xNDglDviZQuOGtMd7LwQ1DTs83WGlUaLZjlfdJClqwdiZA7bap2vi6E7DxjTuqR%2Boy4Xoo5W5xE7AJpHX7RBSBcPjIY1IdfmcO3owiMGI%2BIQS1k6QvcY6qYV%2Fr4dUuX1fsxdZ2oVz0F6knaA2Vk8pvReMyCwOBshp%2FwyQfslEcZoq2JRenT%2B1gaX63IZg1it5wUmQUoLHVULYlqTCeSCh0Q5f870dsPBDoqwdVdZEtYHdeJwEK1litTzuwP0DrdziHoksLIeI0BooNqFgTKZaq2Mn9ct8SImSwJ3b8RNsE2SacV3mAPS4c7SMc1zRdbuD%2FKc0ke1diEeZLL61AxGILC9ctp7kCUilyNUD%2Fh5PbGHFv7naJJJYSw91EOXn1SVuezAWESaPsTC%2BBsMPxv6XvGcAOpb9bJE5e9BtVmrps2g2SBuC%2B2tANRqe0LPUMIDI2rdUqiGgqd%2BOKZ0hxkYDXwdwjOR6KT7MTKkdTnsjQtzxH%2FR%2FAEgw2Mh00veh2GFf2BYNr6KD8MuBkceifgK9oghtm6aKZ7oxyvoE3Zy3m8BrD1uc2Ps8LhiMlzgvmWRhbwakC5tiybmAV9y5KVlUAGIHQ%2F1%2BW8MCj2%2FxAUU%2BU1546slhz4AL5KbZJvsi3h2teapVzqZAuElNEudA1ZdXYTmnRcn7TaUMZgWyHcXz2i%2BroeyLJ4F9Dqjr8ZRftWbHGKqZ19oM2wiNUNfH87yFy%2FY703HlkcWwh5xghd9oe1lHE3P2hc5%2FGb0Fs3sRg6z9UgO9MruV0dBNZW4DNd1QF1TJeoKzPOszPdJ9WGounS3tJfTkSss4jZR8QQ88dmnBgKf8cWRaFw%2Bjxk7wYPlw9sWSxN5ZszdPtNvGZp8XvbhWiXqgzg0jyHYVXkstpj%2FXLBJNj7CBFrfU7Wrjv1nsU8GyzWDZDAdNAi05MFQS7VA7QIo7g5E5bgRRO3OYqQaN%2BnBMYQDSt7rAIeeqBdiCHlWZBxkz%2B19lnB5YabnuyQckXLehRZOMUwmhjJ8i145FCTaaWXeYArepIRUoPcSBsNQNQqqAm0S%2BWUJkUe9ASwWY6%2F86uQiChmfOeoviSEz2hMjKn7OSF3usIDGHy5sab1yFEs04sRiBR6tvKIZYtF%2BgSkNHRHRLmM3u0yK9pSYeI7iG80UOudwNL8tXmFtbjX2q7wKpVymsmVAhKwC1hA0q2wFQVdptzblGfKCnVTob8NEF7fIvtV7aj6ler27ur0R9bgVi%2F4gAyTqVq0F2FleDErLdpARYcPDRw2IP2BN3rzj9noH%2FXsUeRFFLqLIMkDuxqUYzXdfnN7Di7jV%2B%2B7Dqr7vVQA5EJWKHERt4wTqErF8aALIEFVU7dS6yB%2BoqpZp3fdRQ7aLyYtEUDWvqRWEhp9MfFm04QwA8pWa4YqUJN0OcQB1kHAHKiXPBRYLX9M8bESzurCjJ12YJjIXptnGhanTvzAV0Rc1fCSW2heBA%2BwdfBd1dULCQloYnJU36ywRAybOxYzZPh2cZcr7kpme35BxCX1w1R%2BRU2Bzupd4Drd2KHXOItF21dtnPjTpuBPRVnNchNsHQbhu1UfgKIERHyIjemwZB5lgKApjEGv7CeE2IzzRbfZ1wiMM5yyD5jm9Nkw%2F1dNjT%2FV49KljBuOp4bu35VBlz0Ji%2BKkg7RukI20IsBmX8BObVD0c1oqjZhGys%2FI5HVI4j40Y3kt2k7NnxN5qBSwChK0R6t0tNeGQayBgaJ4HCiqivqgHGkDgU5f1l0lYFcbysidqA%2FwRIcF5mahmJSAcUXVjNGv7BtrbyYiI9trcmzLm0Tt1PUSSYkLDSQTTzLqHjpbW7XqJ7FnxuUzt%2BgTSFzsx7C58BoT3VosYExhygw54lduvagSOH6EY7z7iLpCfxbu5PLzh2C7qkauULxcPwPeHDbShtcCIDDZdeWzxgF3r0Ua8NJV8482U%2BZhHzEB5HtT%2BXQg5NZzSg8zuF5XLQyDsgj6kmvL9SNY7fCfMduc44cfvrDUHIxRx8DhlMF9vp0fz%2FvWwZyemOFqY%2BZBxK2BsZI36Ww0wY9A87nWVM%2BhqsR1xOiD6FWJ%2BNR0Ue1C88m1fmgR8Wl%2Fk88QejA2deahWn9HN8ngwXmKfwyy1i6Ma6Ua8Gzn2kQ9A4ysf4GbJhCfgrenq0XPs6MUNyh%2B9XFD7BvZzjzxxSFOtop3oRy%2BKfx%2Bfw%2Fw%2B0fc79mbmnZgYzx7tQYyad4yzRXfBObY%2BynLHIUAC7zoxnPxfWIEYPPFlAl4j%2BApXdR2O6sa6wrSsEOYN7L9BgDeBIBsxryTLECdDDJi5UCIZaBpl7z0aDsV1IoiqJXxQWS51dRH1g5FXrYILidfRQz6REb8J3sQQC9qgGx5HBOCQ6BxoNloSzvKCFwchmIfjzJTnJbZCYiDiGK7hB53yeUcnz5LQTmuWCWLBVQ6mEzfUhrmzrLYDg3kGNK%2B3GxTqIZZnWWyrRGveJIOS2EZyYtWG6cRMIFgkWi8yuaI3wMsk0wo%2FQZRJqeVyQGjOONGsJry9VSzDTI8AS9PrqS%2FyivU3ZgaMN3q5eoSUI2eHGOraGaDedUSUZysH2kyRYOHdekRzNyJ2XFgD0cMvQ4HVIVMlJ6BqF28Pz1iEsCItvaWZrb114%2B0rhHANDC8OMhhORDxeHgk1NuVhRU9QgjRP9Kj5Nu2TXZ614Z2ywD%2Fn280mPA9nxrdvTvXtg9teJLK36%2B1FkC0Ybt9WLsRJ0OUtd6aOZjaLAIO6MuwRSrYDwVizAzlo%2BkIKzQtGqmVbIKDa6gLy5HCcY23Cb5ayuEc%2B6wWU8AgiArwW4inZKgYEvhr%2BJhSipT1ZH7JosPnVNgd%2BPYmDquZh0XpYTr4s6zvdXhrR2plEi1EWbKwyU%2Fkied4ZNCtfZ1a7Q7RFpkBaQT6j6wYyh8ySBO1MuxrX4zBTojpH50LqnSaq5uSIwYYBT9ZKSUbKUKYaqa7STOdVb3mrj7GK8LaF%2FWRRvd%2BVebXO0xtreeZt2%2B%2FqrejSw8s9Yukz3wYaGDoPXwkU7I3YhtXoAWvMZI9LUDBiC%2FCd7kOMe4vtIyN9kM8ezTmTYm0msu5aDJlaZ4HgAOA0K%2FqIslAyQdFndRAGsTLcGXTvJciAsIFC7%2BlwGPsCPQRCK0oQQhkItBfhPE20Teg7H8TXic5YJsHeaCE%2BWDTVuUey2bEF%2Fb7I8loBYsAXIVvPOWrxhwxadATVCHQztthrRNkKynBHc0VAqQz%2BCc0itD4FjQ1N1d4TIPQXWjULiXek5OuhKNVFQL3K%2ByQ7CqvAGgF%2Ble%2FrW1XeeQ4jBIfP0aktwIKcVhFAacInMgrSW9fENN4e7cDexhHDnangF%2FldKGUIYOjA54B1yTIc5yZy9G4AsVeyCwfeCVZty9HfV%2B3xC983WcipOFA7cRWAJMtoTZp3y7I8U0OvJeY5mp4zHaC2jxEdFuZtDW8XVVh1mQpORrQrtYMYfuc4wMHJWrdvBz3Lw8FwhIywCMBekhguwnH4aTym6a85wJx9jWAW3XyhI%2F7uAV%2Fv8r1%2B1Q9wXBJSId7qDlW03s07Ya8UmGc0y%2BiYEwK9pvbIkTYMbLmnutkdy3Gt%2FGcJ%2FQeDXsKi3Vz6dJhakHJ0XvcxueNLiETEzIQG1crRr%2BXh94hrX0BhjyKKdYfy2C3ycNSsclniqsMuNQHWQ2aY%2FawGocF1e2kTGjWK9PkDqokYCwXz3gUjEMiIWbE2AJZlXmrlyIjcF9oCyIPOcZuJvahNct4UjapLgcz1Xw9a4WUmzL7Gco3jsXAriqdrC2yPWB1HEEtV7TFz8vOQfbtrY%2Bp2SKs%2Fkt6%2FNFLtSPIj%2FKl9oWNG24rKwS01Spgc3EejAE0ZTeXIBFsbARSqZdwpi9lQJ%2Bg73WsEvEr2jTU7jrj2s0Ag9TTdw0FVJoOObPgZFcS2nhDsNNvm2tVGgMUqdp5HG0JOGeKONGZ5jl0P7Mj1BpsCMjZZ675LgDJgF3JkymnzPm5VJzACZyRVFnfjTdlulLCqjH9BMHe4AyiwcXGcvGO1gWyqHfYFcXknaUrjoyjArZIgjw3Yz2EWok2qwdhoMmboLiP0cBpue7OH9G83yybPUzVfwZS1N0xACPqYV4Yy%2FDLp0iPmagR3bATUvQjj9E3Q%2B3BQ79R0QhQoR94NVLqIDxDORF0brfaMrRf11iHJw9ssA7qauvud3gMwUsNq1qo9R7OCwzmIFxt1fcUVXg4zOLuhLAxdEOjW5l%2Bid%2BGdiZIpM%2BfLFy8Pz4nBN1yKELmqOZpRSG67uhpNbXW5XYap98WyxJsXNR%2FiSvO4P9HLvE3NoSxvN%2FQixtLnAfJOQZCp6csol0D2rmRQ66xIvbNY2%2BeszxUPpiQ5DGZmohvcYI6yKtaSqOLtWNWUp7Oi7yhouTgL80RvH7oTO4T0ZYNY%2FT9%2FSBU3E6K6RA62X8mBRvDhOaqmtUMs%2BkyrT87ROBSK0BOkdfczULsunYMWvzvB1oaaGRyt9%2BXQKKNLgdW96io5J4HxxjAVJxSLZkWqXI8cIM%2BKzhDeaCbg4GZp7oPgxHA9xHnM1F4FoKoDh1rKoRE0ON%2BcxzTFE5xexbcOXGJk6fLKmJPgD8KK5s2AdlJ2ueOoG9qn2OXuoeOleF6R08UrgtMg%2FgYHOctOraDBgNQ%2Bv8uzF%2FoZRKMB7ZaNPqxWcvbiJUl6NAbfJW0WQtdDKNQWeZrfFeFk56mGZQxhhp7GEUNBhKb2pND7qGZ0PZ8h4Ktqg2HQ38uiT3e2%2B5TL4rZWQUkvi3tI9bb7SAaNRjiS7bAylxgMMk3a6QgQM7rBbE6gOcKU4VY6uN5KWh1QWegv6QZ6PGbI6BoT%2FZ0C0ht4ZHJ7Je4UnDNDo1soOwajiRxOVyKoSTapD4qAsDa2po1AozMr0dkQmEGypiKivyhudSQSANh9qj5%2F3RsiraeGxQX5oR508STYrM4u%2Fic13di6DrJdGUx9XhaNWqc8QPlDdYZs7DOZCnmAhk6ByPadDL1yObR6xVm5bwNBu3q7rNPdLtnvwx5WZ7xJK8ycGQpJZTPGFB1meyKb6k6g5iXHLmAvT%2FEJLuabeA7Y0jkyvCy2cCSlx26ARnhjoevFgpkYEdHDzXK8LHo9ws%2FwURV30nXDPlYvYeZ3Oote6mEqGDCEH4hXiwzwapAQryuYMYYjovsnfLM4PBqGwuNRyczhcchSNyCY6UkYWmekvm2LbTifALPt8uzIqEy9JpZFZc5%2FIB7WHKbq8iE5yWGvdKS6ygcdN9CyE3E0q1dOgN3NGE9KS6oVzJhXBYg86%2FiTYv52HRw3NnQZXlOdavsdB7Iw3OXG5jGXwb7SMK6ZyPbrC2bVwIjEKkEyHKsHyaFn%2Fwk6WkuS51WuJ4PyIYx9MTlkjUWBmucg4STLs1fPX0RyaJXJCMUvevP8PIKE%2FionJFZEKPuUnwgNX%2BX7hFfXIvkMv%2B9z8PjFutKFvhz2bzei1%2Bo0P1rXpb1yXzdQnQSb6EaqboETYDdAwpU5KFPNodNsYkLUDsM98gZGPeoFBVvuscBlgqEy0BGPuTQ6ujvbg0ddGh3fvx3fvO2RT7kponxdsZZ5QCH9JmSwibbUZlmGkoZdU8cnjjtzFwfTda8SotEmEaRS88wgw9YXthE2%2B0UZuvl2DN0KcQuJaFWkEafQbi%2BbUmmPZD3aWJvq4jvqPrGdLr6Xzo7GOFK1nreFEb3hnto51rVoUK%2FVIZshUG3HRxzRqBWXzxD162PmsLRcbZ4Tc%2BoWfkLIR0vQKyQTZgushIcdoo149rY8%2FziaMYgKEDhwA1U4ScSaUa67LtF8W%2Fg8DgOCeuRsH3FhTxluizqcfh1RLxo7QPmauUQkrDF8i93TWxI42oeonkV5qmHKxaBpb%2Ff5NtHkUIfHtFqb84FukMIqQKjyvE8uFZkH0%2BgE7zMYXWKG6BGsLaq0aKJ%2BZkfcUHapDfVMgXXEyfL52ZkqoHdaoOnGOEVUjgTUhFEIPWS3KsGceVo4LDuURLzW57KY%2BjHbQ5mfVrcFsYpG50Jc2UGphUYyN9lcTUoty2324EiQvQOEoE7VT7dXnI0jRmrmljoPetYRePIgdyTTy7rqj8FUXf1pZcZ6cFnUUpWQJ98O0SsxYIaAvWl2Rj8yNIx5tMA6w8JvOCIsLJmXRuLEO7k8EkjXoRETGKdAiTZIhlVnOaZ1ETA%2BGTJsTm6%2FURNzXAkjKKvZXtR7pbKeYDVNMAKVv32dXpET2rGGAFyJfm29bbmGEC7LqL5DVPdHncFu25KP%2BEGJ0RSiP9ttJYw9QyT6CsZYWtcb%2Bys2yZYq%2F2StdolEIsCaDus90ZhbBLCmjppfVb%2BTIyv20GKjmBbq00E1PIxftoPapnfZ5UNWW%2BEXLruHdNc6n8tjiEp1z2FdFqkazEDtdnkbRJS%2BHMouMayZwKjKmDua4AQZ2iZUr4QLAIPl0vTyAZtaTZpqqSPZap%2FvnlnOt9%2BJ5wFF1uq4d4c%2BrC9fHo4D76ANhf%2BGsDm8i%2Bjm39lav3dXcaXPuyHJsDUyPWtbJ8a%2BszNETTclykjwJTxRzQFmTBJP1EYlHomOUD6D6t0esGOneFS9LFNVeBQPeCvXo%2BDzpKorrG1%2F8jYvvI%2B97mg22V%2B8Cffsh9n8knqsimEdqB7U4ivZURI9al%2FjQ2oHYN6Gz5UISS72RR2%2BgqCjPywTNcZoD5n29QQONNZtvQtSQ%2Bfvs0SxyED%2FbijysCREOU13dUgNsxnqxeNKRV4xto3rBfKubS2zv8McLG4aOLWSyE4V4HDaEgyIE9kaEIHWhsHjjB7ugJxDxrMmKPI8%2FaSYo8qrZJ9Uw89JdZ0MUeBNFGEXslH0hxBpAkKV1WFxQIq40Rbw%2Ba4u0vCzMaD0Cp6%2BpykxrEUgSkEg5FM9UAhgqokEGnsyM6hmhtrU%2FjpUGU4I3WqiTK8MD5AeYtWtgcwsxixULUzP6CSCbLC8G79Yr6FNiLEe5EClThE61MMGeZnsQ%2BbGAXnA2E1kPQQAUQZAjhy6ixfy9xL9wkA%2BJKU5kjq0blWx9OfcWmZWTGcHEN6XXAjfIAKaatWgFmHeNm9jgu9VorZiCilQVXiiHo5Guj0WAdYcjNDtmx29VbgKL1S1OO9XH0xibGXO43aYUo%2FGHmXkDkl3VkXc0fvmKqfi%2FIlmxFq%2BSh5K7LeMcoJXQWGdwfuzpNTDxyEW%2BJrw6OWLUzj3CrFMEZ49kKyo35eQN%2BHONyEG8iCIttQGxHCNpAcNIpysO0V7VtbpzYsi4XV6xSIjBzvy0heagYf1UhYoyzA6HhGD2U%2F2x08b5gMUrm7WbXxHjDNOFLPicFfNDERIgm4Xer1Hhkqiv8HYOYyMLI7VDNIb5QFU6KN7KwX22gHiSFUDwAwwxwCPayujQygcvQSE%2BfJV3uTs9cbyRsNxQnlBxRqSR1DvMxQMPv%2B55RiNKqxMtSB%2BlW90dbjlHfQYbd82wpY9TACaV%2Bt%2BuHG%2BZw1bxQmMcJL5ptXNiGlXavLUJnxCMuPgOcht3zgCWS854mH1ADADfzvIdHY9YirOoSBTbHMTNHaVeMjJvCbW%2Fax5Mw8ZbOABFBk7kGWMHnLs6Xod19HbOnKFE7xiHyNUcjtqvJgGDyz0mXGSAVsB0z2iVnHmwJGiGJEvBbCCax0gR26q5diRrIYxBgyVtRW4XGhXeqeoAC6QlonYF3j7gqON%2FH1lv6XhlcJ7EPGxhtx6kprKeNyOeDVyqKWCc1D5IGKD4mcYNQWX%2FCwc2s72hoE1yMbHO9tbTd9yUXLl9txJLPB1GFTUw4ZwmJe5kRu013qmL4tPLW0hT76xOhroxjvC383J0O9qX%2FOIcqcZMmR7hhi8f6rXvG5wBDf0WYcZwsofsfOkMZwFzDIwym0nth4WZrZQaxf6AWIr5SSL6aJBoJehmljIZxU8gSlNo4DioCH6NBoibosst93pSZarIWwCjmqKs%2FC0hFV%2Ft3PSQPUr3OYnZbNLiB%2BrQk8iDu4eKiycVPXQIcaPlWXIitrwIybosyS92baY3A3QPfcNbwFTw%2F0sB7xWp9QtNAeFTNatSXagC5TiWED%2BblJkw22W5Jn7R4tmMpfPBDoIjWTg7zv7ZdhvmVmdiO9lryQLZjRSqGbDGEpCjdhbEJjfJaXdwKqb2mLqm6RoDekEPLz6NEJUjqI9YIqMAl3Dt7IFReUEvY3K0XSNCNm8wescAqB%2BaWA8GuvFUIca4rIddc3T7S1oDo1VKAe5zQ1NbP7LABdHweJKuC5AvAemXl21nnxSbmkG6Xd6q%2BOUx%2BwfnbI7Fxr29kWkky6PeAth6FiP6uDjw6qErshUfTItdFAjTJh5C%2BW3xdHgPzK%2F709o8g7NNJBjaKlNpfwVTMyqUAYijKiA5oQikOnubQKNGUCgJfG%2Fadh9HTROy0eea07HDuJdss80IzSHldGkhw3PcB763lhe9j4wDdFe9cQOJmMsntwq2QkcmKHRQszC0GEcqKa3zqu8H9qweCA959AZ3UV%2Bp4wiJcMpy0w8RVnoyGNHHypcCdVBNEcUuMrTvGhikhByXCMWoHW5trlwNMs%2FsYOeFfXoRXaJkSS3HHEcieHhIepk0MQp1avAFnPOgHKnPqM%2FC0cgRt43R55Vl8y2Y%2BEzAlkC46tnxqpYkWJFQXuMIiDu0%2BqqyOyFigKxmasri7gs8m1eGmuEc%2FgHC%2FpLEVA3m3C8VxsHmXLStsGei4msVllHBH4ZI1c%2Bj9iIOLDjeKezOAk6E7zuXOe54bV1hD%2BNmWW%2FDlerHDHyKkcKYcapORqk5hMRahh%2B3xx7uffNkQK9bz6FmAWKXRS7pCnzhz8btKsEmx8tNWXR3ZyQqEs9ds8mBDBB0yo4ysUqXjbjiOSp10PXf8ID3FWNXTjXSVWQdAZXXZ0d%2FvyqLkt2WfDX5I432HVR2FLt1tTnJIZE8BVD83AQYv5NgflJL3x83b%2Bp08Ew2SAEoStlG5eCXNSQdwqw9Ocqig0oihMjml7lrfWiPZP0XntHD%2F24CtkYk2pZbzdM2T2klP4T3RSi6qhjGw9FOGAtJ4NyBi5bNRcCsIcjyYohhO7Cc2JRt5Xe%2B3KFAdfL5xpSb30njmNVTr1nmIjnRWX4mSXAbBh3xmYlojq%2FnsHNjXkx4j7xaqBKggPAoq1DgPpAIS6YrgK7miEcZYlgu6QC8iIvSWrIFF2zoYNhVwhiq6MB8d4c3QtCjVBEFzRUR4SlAeuN9bDdhWQa4EgIFt4i%2FJ6Cmq196DriZK%2BSI2PfMqE7d4r0TlGUowBPjJi1Ob2xmANxlCYDfpE3gYDhLlui3ZvM7jyDkuMFVCtmSycNi7OxQ%2Bjk6uz8xPpUhMSApTnjL%2BmxZVn0Wnxcws%2FBxiuS2Y%2FEEdybJ4UV5vKU6uMQ958l4We9DQt3m6uFVxDhldCIsAoosnUCkNsGq5ocYUX%2F8ebhVU09zxhll8ldD5fQH1T5lE6CKZkmeZcvnZH7vB663LQUY9zwriDbSgxnKQywIZHxIDEwUgsVLsKObQLjQKtSjuleCAxLHBs%2FDhBMmrdhU5lniO1FiWXSrXqe0VBCHOBhXeyGNm5CvkwLMU9O1Ug9QRd%2BwjZNNJZp3ebtq8Ikass5QV5b2V%2Bb2Wn8r2z7DMGO7miTTdXQvUCyXu6KTR%2FWDzIYLw%2FyG2KfS4NO07pafBREbycVOrJP0dtUDuJ714lJjuioBbT7H2uyTrKfiW3X9cEgb%2BG32pFHCzUmMsIW4oZ%2BWlDRDpm3TcPznSJEJfolTIAydmZIw2QelUGWMoCakWeWLFdpxf2MHqgkBLGGMQkAZfhaX8K4Js%2Bw3oiOI%2BaQ4UaaWKawuikX23e3Lkpv0NjyPDPMksWg3iDp%2BYjJke2xAuaZdorrEdNPs4AvizZkFcxI0SP1pMIuPqt4bPkS6AcPENEjHs%2Fj4p0bU8g8l7ifPpbpE496ka%2BHLQnB10nYKFwGc2VVoZ96zHmovx6R2FZwyQCzBlbVG99686auG5tqVQgE6iI14qcfQuYw4TKw79o2N2y84VYjKbf5uk3gdt41zwifNnPBcWRUqLLzpAirk4jEbIZ2BKYvZU8c5Ucb7VG3BZyghKsnPstztUIyIppPdchLNdvOAM2Uj2A4nTlAWV14wI358cK%2FSTrDP7hHz%2BtjaGSacqDhCyPAIo4vfC5rlXPCjhXMKbTjGaCQD4vWKvmLSc%2FrfEMjtdomJKhm6ZgME2XlNoSg2yI17TgchDi7cfT0nmYPNdAwZE7OjGCpVMmdHjLCqjnMWPZaytJMHFGbGpZ5mK8%2FSWkCTNJw7uyjphrAbLGdELjKVMTnZT1k9lIrUJrd9IfuLT3HMrZiu0SYrghfmrPNjNrZ4%2BgSNDgm7%2Bemp4KJbKxNERhz5g3I9N3AgGHbQfTfyOr0n%2BAX%2BiVxXnlE%2B%2BBRc9smULYPiYwtvayqsrsCG4pUYbhuJKRQI%2B%2BogXJwpMburSfEXpvAWA6XiVaGgbSW6AV1Za0WOmXfh6K80cqkXajBBgU%2ByNRsQvQwaO1yl3NmS7Z2UES43kE%2FphcqiF7RxEjTu3lLktfy7BXxAdQKP8ZFBOTzK%2F%2F2JL5T3AooWPfRq1AM6XoT4jmM70wES%2Fh2U0YGe%2B2OociKIGMYLF%2FWJAyE7TIA9QSDDO8b87aaAN2UZS7usWUDdnuXB568Rxh8YtiMa17df9Yao5HD9LqFR4iNNm5X1p1IJSfU9TVMnf2k63QzBmSxvg4gSdoAhrar22suvKr5OwkuTZ2Di3SW6g8%2BZTEuP6ugWFuXsfgkyDPGyTMg5ypM%2FN%2FprdfIExG6gKBhuOAnGpRYzkfKJXz9sQwPVZ%2Fcmy2CrkSYTp5EDehDmzTP3JqOGlthJ5onpWYeIov3jj7c5A96DKQO0xRVd1PoWCQTpuz51GYpEKATDu%2BwrVg8NwZfgeKbIpCBBX6w3Fr7RKipQSW68Sy%2FDGEopQpo77VNyIz%2BzgCcFXoMkv2zFhp%2BSywSbIImEOpZiioNCdvdOb19UibxmaDgdf7R45MBvuFZ%2BqxPytAwdo4bkm8hO7N4ge2IRnWeTc%2Bpc1Stgx2gqmzhp6p2vIc6XAwnIEK%2F%2F5MRfmJ5A%2FYhfAlHjMzlhJbJPv4RLO8SIF6ArY27kV7S4GDU%2B01xuCNxWYp01NPMZxgTMez8U0bhaBGAihWGfa1SrzDpqZXvqdqFPKObLCLD9kXHLsGoq0M9M6Rcvi5Vm4NPepNl2of7QJjyvGjT8Auxb9egXkj42x3pJQLTPAAlD30stZ%2BGc3wg%2BQiBiZaRJVUOeuq%2BtR379Fhc1AALPzajsoMh3l44U9Qj%2FTLmBWhZFU0TckVC64xPWQ3riIOCZY35GluuE80C1przYpKpWmBEtiFEgfAjM2QpFQRQ0gOTsS%2Fa1L6NaGBJI0Bn0D4kRR9ask%2FIRX4fFmvT75N7Q99T3yTlssqJgz%2BygA9v76dpWTShLgSASJUvc%2BYHjE%2FBnuJD3qWmPqodjTPZbxZFdHFt08FZrKcQlVoc9GF7iUhpGGxwtpfFPfHScfw8T0nApCky6rX%2FMNuSI8ocz6DmBGSw9gRq4xamnJR3SbhSArqplRmNYcILQhFHG7qClGcmMWplocyWmHJSZcxNKVYD4EUYjZ2p39floNoJzL3fhMF%2FhGx5OliGIl6jZARQ7MA1DGnpANRWkZRhEhErRZhWI3XmUZTw5lwqx8u23usY4x55VoeGLQ5Q1m8AYKZ1TZ%2FjRjMoDXQQ93phF3RrwZfo1RFRiOBxK2qIwCRc%2BZyY0d%2BFAIKKPito1BZf5tY34yxj7MC2tcQ%2FyeUcZ6rXmWExlbtkOu6b2GX6k0XkicrMflEXnSXyCPp2Dc%2FLLvqcMV5IrqN1I4FQjBVSgWU5Fa1CS1KSY2SGk8g6j8%2BWxwyqGhLnNSVvWacUvlGegPOxxUgPBo7LWHq3Fhucgx4aufRqg%2FPojo5hXti3Buc00a12nKdWSFoJI2usgjF9XBRUtQrUDnEmGBQORqBhVlmxt%2BVIXwhhLay5LC%2FEL3uiV36MDGojj89ksu%2FNLg%2B1B0xSQoCnxu9iBDlggF2%2BwYmu6pEH4F9t8DV8NZWvnxxFn8bQdg9nipFbWwKWxyxNscdYlayhusho%2BCq2eXWr2aUxA6KVwXAsUQb4U57LZRQwDJRG9F3ssndHLxNnfkcLtDSq3wHH7rw0vosDrMvK0F%2BdkLIjAz2HTmatrAG8yLeh7a4Af65CE3i38cmwrDZWYEEJebOmvoElmDY5aGojdtfyl5AH%2FKVVUcoczexwehuAkLLTIYXYnUS0e5zpJdXKO4MedRQisBVlRJCje4Bd5Jkrg4gd5aF8OAO0MbpHIdFGLhQodqn2uiF0baS6jFj%2B9s501wpjGoKGLqkXz62xBt0n4QIHKM9yZQQGsjhsDNkoIDlEM1b%2BaRWf4HHsrNoV67DJ99jhsMeynnoa%2BL3spN%2FXHc8Cegp3WWw3sQo1ts75PFokcICaeSd6ZgJvU%2FQQs6TruPcPRDhQhOflgEU%2F62Y20VB6YxvsUScPnMO7f1ka7l188IVlnzdaUAD4dqPcyTm6NWoBMQ3iARwxSwY8NIYsCuBDvo6UvY85M2YMcXRhQfEqMTpc75xE2M74OYNtPwKEZUpjjX7E4KLOtOoac0Q01MADfp2qX%2FvsWooNGolMx5qdy%2BKW2sW8Iv7gg8zxbEOnVzGZHHHqi7Z1TuyUrmPq9jW1iT3e4MEMq7zsi7zsf8477WCcoIaGMdPqoC9adpH1xCYH7EVfN5%2FoRTXHWpUYVrpv1s2xlt3SBd4UJHw5ePSr6tsi3dmdpk2GriNuNIOZeTTKpMt3DM8Tcd9ri3cad%2FsNjGyzBQoDtTzlOXsX%2BwKLl3b2MVoqOGI4w5CV3dg1InRjjoXngLMqBw%2BgnW2Ywx1IvNht0R96y0BSlqG1MCn0uuoxWr0zMfte1tYcAdq6McinVWbeP%2BIBzIM9lEUGYsyunpzE8ie9VQCDv2T6GY3BId%2FLAGQig%2Fwmr7ahLNs74x%2BlrmDgMsm00s0jeteph8xCgWw2UB5B7LZLkFUs4Y9tQFuOzhGtEpijkZJbfiAcov0DOMDerjsHY9Vnr98KpGUnoYMbMNvudXJjFQ%2FkSC9AbKdS6RIFqm3fuh41HDw5iIRTRW60%2F2Emv620mxAGeGR6W13C87JGYWvS8LKqvinJklZvHNKb3tg0ykiPYN2RHfQ%2BQ56ZdTHHXudJpr6LyxCx6CH8Nn9t0N4EtGEdEhCZ4voI36NH9gftC9cTY7sbARuTPaixnY0AjQ9A1NfGZEbkP%2Bck8uk47owhKCq6sQlesDuxpKy3pgu6MY9B1oHimLzc5XmvdYDDOivg6i6kbsxwMwRstZgyrHWgdyKqkPBEa72jHiN87W%2FJHM%2BjkE6HLR2pqq3MAFOv4vFQboQ%2BQkwU9AWhIoJJBmMgdD35x3QdTD8PvGEL1Z5%2FGHpn0MxphhFVRC3jUj6aB7l7yhKzglnnYn%2BFCbI%2BxQEa%2BR70bOyuTGstHTiQbSQjgxNl0eyOI2KJzgRg6qfKYa3kDmlKoqlNtD6oIJGwrx7WYV8ZCWWBId1d70KmYghfaC82tVttXDPso8tIWMJ7CEmRJle1RchpDJXuEg0Erm0YboPp1phCZBKnDIMSIMZ4E2uAR1rfp5uepWSMqxeBGJ2nDQcSS401sAktgo0lrZ69HapkdaFrv1UOMCqP6bY5wNDeFrfHTONcBlvwdKChSZkjoUfr5dAhvJq1W2T4ONwURwoDmA2cKXkI3UE2eJNvw7hty7tC2c0bxohMwowbkkuY9Bg7HewV9k%2B4gB5xfgcbUrtZPGDq4T8R03rER29LJhwqp0ayxTkGoGHkO%2BV4wXGQ2SDI3vE7ZcXe8N%2BcOSoITWqgM7B4ES3elIu9HKoZhqqyegjVEWxebpB0v2Zy1PkCo5aMy4DVKxgIP7xfez4vOJ60NU%2FxtP28zTkSnGoZh6AeNoIMul0q%2FPjjl8RwmhsBOZ9ww4ZIxejpfZo3RlUCe6WqC9TXedlodpih%2BJcJ0EidnBmuyqPbviZ6OAlOyOk9O7Wxqo%2FxiAp5yhANsD7L4%2BLG0liwLPaDFp1nOZWqb4Ydja46yzhzqx7LEi3qpwro8SXrMkm%2BiT%2FDZY1%2FTG0rGt%2BlJw5TXVhh%2B3Z24GDBZoGKu1hLEcDtDiotdfUsm7GfJURHZ3RmbY4ZlfQ8hyNLNLMspnZxhvuVHNP%2Bd5bPCCJwAEs%2FML925zpCGxr3zlD25RFF0UGoystPFdJvu%2F5ErvkK1qcyi%2BG%2FxDO4zbmYVi1oXQqTlZnWdbIOz61ojzpMD1Mi%2FuoY0968hFw4UybjEjU9MhUKJ6X2YMTycMKA2lIwUkMufw7Y3hPmOSJe8udZUNrwk8zxM3yccHxWGZRea57DGnAIN01diW5VRqQqjj5A7XcTkrIQFnLkHlsoixUbSEC4wV5IltU0EKN%2Btu%2BVUKlUxaaSGMQ3CQ0GqmuM9MCUh5FQ7Q6i7DI5Ahg3%2BrAL4wFcU94wXxWeh12LytnDQiIN7wXA9kEmmKGxEUA7O2RPYir2CKiWP4eIIzCQDSfnQu5Cs3LtLQwUJxYqOnZUBMShR7j2wFr5mqYx1l5aa6h%2BuQAOsR9spNV9wUFH6GaPcLDpeWcE7dU6D59tTLJV9Q4y91KNYMjSzYGjV76vcvcamYl%2Fn7drmrX2JgjvPwqoW0Pa8ICPV9Trj0RwG6GarhquiWupW2alQt5EoAhjIyB9nyRsjAxY4aUECZsjaDCjtsjaDasATsYN37OSPeFV19SdddmHPNuG9HZfVPhskU2p1zAqah9MgzCHgf68bis19dGgd%2FZCkUQmiJDNlgsw4rvtmmohMfadzei6W84hu2f%2BRbMj%2BV%2BUK83rcAMXCDq460i1n8XRKSzmg5BnunERMbIHXTBN04sNTA2tlJlYFs26Ttrs%2BqHR72q6KQBg9NP73rL2BN2o2vv%2BVVvoF%2F3T0PV24F6gymAtEvdAyG2il6wYsRTXAGyTfiBGLI6JbLZugKi6cH2IEW1w4siysGogigEiKnd7IzAiMOsuRHte123Gnd9U26pclrUQMiE%2Bc%2FBeMPXc1OFjibqvs4cq2RepbjKM7rHB4lUyhMMUtkRpitokdR0GxwOhUoXeFZ3arXa9q%2FdJ3LoKcNM5%2F43XwdfftWHoXiGFkyETYbqiVlUA5db%2Bd9upqeUdGrSA2d8N%2BXkd2noQdb%2BuQp9zRG27cGHnukCEX2t7ChAWw9%2B2hcRsiGXwHUx9BJ%2Bh02TWemq6v5VGDIrRTYpML3vo9TSm6CUcJr8cyjICWTfaww9AxztPw6Ywx3oFxSp9nxsGVyCrfVMgYtOCnrThI9yYSEfyO0WXtXn9AUPDA6aEYg7RDKd0E%2Flku23zreJ%2FR5xeOE%2BTUK4aYcNqbA7CY1Bh6BenPOES%2BgFi9ewJV8q5AAtXtCbYxeWKvbMVmWtC2Z1UBDta4A9FlYVDBEBDChzJltcloO%2FDTTUg6o3goH5I4LFGdrLB1DrTUsSUy9yYAvyHOpzuHTFWQmBvNxulGNBB6q6LKmwdPdzMGJ56CZF4BNeH5Fpbal3X49ZbuH4KMbUwC1rVF9UA42Qqv9G8auWQ77pWYzZ8%2FKfYqBi7iewRD4iIUtd%2FNJycUf6IDFrDFaBaDL2ut3m%2FC6e3ehtulRHSy6QMpyemW5crN3eeHPK8I9lkuGuEC4y%2Bkx8yyjw2cmErl8Hy1PRI3XDrN7Amfx4GV7uu97XyfHZdXwwcObnIw%2Bm%2Brp8V25AEd90WTdeHJ9v1waheJHCAMY%2FWdWXZ41%2BHyrW6eZ1Edhhc15dwOTExl2GhGqhueDulYqdrbElMQyswkO%2BYfVONx1A61u1gUPTmm%2Bt63NcZL6vFwtd9OCGDYkRbYbrBEILMCovItifO8KHIQtVJPaQ7W6gB0rFPehhD%2FlDX4ScZcbewdOn9dAT53sM01WjTQ6t9w1wHpW5DSzOmaPcJQjZ4INChi79LAuMZRoyVBybzsrGmE3Nh34c3O1bhJwSifQAwmWYag2iUXXy2W3fWJptMVnEf2KKN%2FYvvEH3C4MPYLWAm0oQBzSJTKPCBmlQd951FWTLnVEIVVVy1JKUW8GeYe66P2RDL9ylcr9Fdg5PmaK9OTfGCpkC1aZlzwUTfLVCzz8gGo4bqwUHOWI0dZIqusIcZ7YVxn8tvRXreFj0i1dgPldCbflOSzjJT2cTqgkbmfNwN9BzTl2qXB1ksdWeQxdgpHmYxmJIgB00Ouk0f5IhMK0GuH%2FK2tu7jTTe0o5xDPPbRjSzHbmOxVT7DkQ3sszwGTzCBpr5igg1nBYxyV4pImhM%2BtGZHdPDpZqMkSQfe8tZ76g3GrDpmGQ3OIpmUfcdMz2VyMxN8pIUgNlNr3rnhQAsxusG029p2TzXmdXpPDh8bGkoBsM2UCbmFfYW9eB6AWsHhMlhi1QGkVzUZNgJHC6DchalQaCAYymdQd0WZtXn4nrmxkw5U46Xy3LBHEbLmAHIfmTbKw01ZtNPfEIwMCoeZDLZ5yqF3yofgp56hzQgOsU9ef7R4vMMleoeI6MSQsYhGdBUmQoiqa%2BbmWJFbHl9BtnQ%2FRKZOVw8GOU82dvMCou9O1FujmVj8X54rLZLQTvTD3g59qVYuiK4VdSCajLzaQAlKzNaVMS0AEdVgLImoPVAx2WpvPA60nc2N5VVmNTLDaYYnYmO5uo2DWFWq1lMdOuO6TFy57xAAK8hH5l6Xpc%2BVo2XCQr6t2JqsUWF58pnIxpBbqG0QoFkLwURm3UxI3dOUj2CwFp0FSj0N1A1L2lSivTHUhio9IoTNj8YKrCEfqU2XI%2BIm9JoaUVl07%2Bh12KK7OLLXwOd9hd3whbiysTNqi7dhnSvCs%2FxjQeIsfA0qzYmCTZ4Duawrj2R3vomiDz3E7dvker0G7sTfJPt1FndBzXksTfCAoCX68w%2FK5PiaWEKLXxtk83W6U8Pb0Pd5ZOvB9V39QXYHHJIfmlC%2FTJQXeUp91uBHCbPNaAh4raRqIr7dKJLzQhf0vvdgFt4FJLgNVt5CQR4Xe5wZdWgS8b7iiFDBq4GqlJtM3IRRNZha2neob819TgEWNjcNW62Nc8VufuTGv%2BGmeRLzSks487V5dhrarUyQbogBFn68rI6UpXZ6E9uNx3vxGGHRruuQatpCva8KiCPRnunw494rXabIOOrQ5XD0KcbGBO35iilxh7IMq712RP1lCL8USKbbF1gZJu2DtWMJkG5QRW8t9oAeMdICFHIuoHH88nB2AGD6%2FmegzxtN1CtnIJtcDoDvtRJmImtZkaO2x9%2BM3TiI7b3uOYzicgO6V6Lb%2B6qE0JJnSoZ7X%2B2TKtlaS8bvq6ate01tXaQb75HKjczqxTsVXhq023gHDJfymCJRmAJ6X4TNuz%2Fat4NPa4SlcTQ1SgvZDtQjCjqD9EJsYKROw6LoDLONaEZeVlXfhiMTQ5dJSjLysgjFXac5nIKtBmjsdU5%2FGYqyWLdFsJN4XBB4p8l2YCGGIoGFGJtYdNV%2FD2FDt2bmCItmLMC%2Fb0JLdKZYhujvm%2Buwo4BivUw4OzTGHrz3V2%2FC82dU1VlIRMSCYCkZ1KJrsK81HD4IoQ9Z1om%2Bj6MbUfAI5f306imWnTeTldxD1Jd5uJ3WE%2Bc%2BuMIMl0lorEREjuprvzhDdmmvQjMIpomnNz38Xb1Rxp2Odqy4ElmrUmSjUrv8dL%2FOswyuFdfKQplgv%2B%2BaA4qHYPtCuEZri%2FH7LlxFYMpLKnJ%2FGn6Yni1hTNXO90%2FDHZLUTmGpcUptun1N31gZ%2F7kM1qYhgopMPAjoLawTGPY37hrhvO%2BJFtsm0W7sKZIxpWWS0DZt3ojSPLYWxtneaZLxCK1z%2FT4BZ7uHqYsxPNlzkCmaeyIG3lupbcW2jHmOukb3udjDXpQ5PMgVtYX0ucyisNftaBEY1es%2FwgHpUBOOrrddOaCDo%2B8rNCUDjbvCM3DLuFWyxVzhOXQWzuI3Zgkc4UmmV%2BUDcf2qIQnGUZfbOKJNEh1Lqb7cSI5dYrn2mwIORcjmGxmu%2FQR4Z9D0sCd063rt62%2Bi258Q2kvzTkpB%2BX0enhv7VkAMl3yINpqq634B8CHmbEXQF%2FRLvG%2B4LOTAYkuiUmkHdJMsMMY6hh%2BJai0ZjKDuYZ1xtrocjHGYMbz4SdcNe2ukljBDWK3MndMLlaHP70%2BysKOD%2BjzBBsdeVQ0gmpyxypqK8ZSVA%2F3cepYdN8Zjsglb7RofYb3U4SG%2FxqTV7mEOG23bXJYwI3GlfD6avPJPZAmXOzydGmLYDQFgADpeOsNrugfUcpwDEIf5WClP0xQuZYvIBz6rjn2nGao1QT5LtNBa%2BBH6n5I0TdrsaLF5mU%2BPNyNk1V5kadCB4WqAkCUqnXW3t0N%2FrGrmcKxuKE%2B0cqwGcgXXK22UaXJ5tD8xQfS654x%2B5I5q9cmRIxWpdq5YlTfZIBhaQsnyQVvrzQFTv4gMWEwxiaH2wNM1k%2BoAvRPGI8u8gSa8tm9oRAL0kN6noI32mEJjrp5KGKj361DFz4A1BIBu%2BmcT5N75WlNODBlmuu4WIxSuujLyCnHgdM0AMhaMHV1UKEYRlPNZppoPJqJdVmwksI2JGbZCpjpgCLkMJoeWukx9p0nYwhYYNzq60UEBLMX6M%2FbhtcNWIfe1URuG%2B9QZ3agGriICQ8WBgHEvfh6vOqUHmCC230mNalPOXOEHwRBEiGqsT4NsSXhEZvbXpsp7EPtpOfWUXKqVErGtfzZfP78zuGeiGtpmIVsjVNH2AyJn1UOjpRCJBm3R1C7S72tM96ZXVYK2fVz0rMs0qWrjKhVv7vu6Oi86krvj94LCRkdItuIxMu2YX3gzVCOIWs38IbnJj0SI%2BABHEFUxdK8fGggCtfcCF82Pmfavw5GQIJ%2FeW3NsXw3HL%2B12CLRoulIjvKur9xIERUk1hPYIm1hvk%2F7j8VUrp7h6BjcYSVeET2FQbNyf1%2FkGocCMsnAutvBVoqgDzV3qDqNBmLm9QJE7oujEsWsvd4VJ7kyylk9ngA5W5iMxmBs9AUYjXH7Ik5vywUkq8Y94mIs%2F1H8h6zuVYwwiEfLFHxCg1HBG5eh%2BJ5%2BBr0%2BGrKiNjdUEPccAUIVUt6BoLEsRmLenKr%2BhvSYyNyeTaBfmLFzvI9ol5T4nuTrmMI6yXAWrAhzrxLq%2Fi4Biv5YDw2%2B2FmsO85pw3ZwolbYbIX52PZRxkxvCaZwgVq3rTp9EkadR5Lso0ifx%2B%2FVJ%2FI59Er3n66TcXMJqPgsrysjyIfr4WZ5oMWZ5osU5q25ZXdq%2Fit5myvLpu0Tf6TIK6GBqM3RZbPdhbxzBH3LVU0XwOcl%2BJgaSGCotV6osBn%2Fk8xgjQVSwsqKvfcjLdGfYMn3Y5XlpFG2XV6e3ahTdFWE%2FVG6ZiBKOHaBwUFBLQ86o5gCZ3KlgtxN53DGq8J4DcdrkDwG5Fr6MmTk4LgxvV4BkbCkTwHyfYkvIC4O2zPc0WyPmenz0KG6w3KP9NXvAGgoJasyo4SNiXlXedB8MkuZdqNGMRvPGM9jBilafOQDWN1v1lmiGz8vCyykGalrBCPSyrLWHWQe14R7bGf3ILa0YdA6pb5UfJDeJGHpWQS6hv0WQdTEPt24r7x0yWAKFGhxHtgNNCci7sC16XZfrpLVKoPdDgo44rMZYQ4hboDGgrmYPwsqQdoLMBbsPRYetcTLmHekRqpT97nlJzwrcPYP%2Bpg5cn3yoyw0i25bNLokCaqf4HHw3JHoP%2BDyD%2BFuy4OdlPWSm4OoyvIHVBXFEulJDXQQIPiK0AiIjIRCUQFN1X%2FXUsJit0RZAHON9KOhlK77PdDFHxLylUgeBGPOYAswa05jsFB%2BmjlRyOHWgflnTNyQDipclYsyPEGE3vH8xTwu19wPRaoxF2g%2BtmjVBUY6bmGpsov5AEnl3Ewbk%2Fsv5G8u1FJENDpioZgigv1SBZuQv4flff9C7vf5Ks2rAavw1h6lbyFA7mb2z1w9%2ByNuquMmvQmJtu4sHoiYwEHm009t%2FFdcGAvIfEs8u4ZZCtdsfimYTHbiwadxQg4FsbHT4QZfa3pT3mD1LBhPHY%2Bz%2BlpjqzMkEruRmcLhmOoNgPHPl7BHV%2FbPsbdUJF1C34S3wpVE5YivXGai3b8Q27GraFmZlle3kgbHL45MO6mizTz%2BOLaM%2BPqqresxytBhLteGFgMRYyoTYqbq4EbVgiaNp4s%2BSLo9UIyCxQoxV9DNYrmmH7kKXhwZASRNiukuK6lnoguDxs5r97Ifle%2BjFW3I4wDx%2BnqS7%2FEjxZUt02HDcB9ePHyctc8VDw0E5eWY7SVNMWsqviqDGM0EeVTZxTLUwAalXFH13cpvQQBWyhJIl4hjSgeNmwEjJZEzG2xieq%2BZZ3l%2B9UU4HBYexduz7MDfCfg4iz8cAEI4cI%2FD%2BvQk5U4U4YpgaCO54oNOKGO%2F8WOZ6v0%2BqTM2EAJrC7V9mT7wWjAZ0W9AQoCZBylCJi4TXoSYR0KbYIlTbnzEWlWHjg6eAe327XhxUqm28HlPREx477yE8COeOVQxz1DfhUpgjcviHAICRk4hpCnlo%2BnorppOnZVnQgJnypikdFe0x0bGHWzn%2B84AeTB0QCUz8GLPD6KaxU1gejZD5mFjNhPjrcNiNZ5oPvmaul3XYEjxg2YF6EIpODi0ava%2FZVBxGgklidLs5Kpeb%2BDmNOOvA0tNjF3l%2FR%2Fwmz5qbUFviM%2BmG54G2vjfizXgYDqj7nKcXttTlLxvtUAcXHXkdM4xJkJPtAB9Mos0EjHwYlPvc28JXkn0CsSH6NN3VAQVWyOD7Zi%2FcGVky9rGft8ZsLzuC%2BP1ChMamwMvO46lokfkryGDw8LMs0c%2BEjaNtL30tLJVj0874y2CDH%2BaZSCa8FgmvupgvqbmG0%2BvLoiL%2BwEXFWdZDG7ZU9MqX9IFKNdhJSfWEZ3dXTzWHIWfvkGdgJ7nb6YbwKnde34xXJyx6kQeehyLMAQh%2BJZyZZ7gtM85zWHX3mto%2BzfeG%2Bfjj1%2FU%2BxrC9vj5%2FI23BGABeX19fmlMPgCsI8oG48vhsS3Jifvr2ZUDGApF8QkxuWuskOa7yzhlLajAy7B5AXYhF2%2FgZtqTy7tuiNJUzj12cq0i1HYmCFWD2OGTw70wyPQQK5CKJs3cRdTe26w6kyccuoFKEFzhAY2%2Fp5pPoMDIayZqDxBl7jcGehiLc4PFYpgathXJAyGd6LVlIpWlgFym92ziip7031FSqDn45ijZSOS6LKoWQ7WhEHsUsEPKvHhrWzdFr9QCnWV4wZOHICtpyaBpDK%2FCmhl9lNKzwkTY7wuSYiOB2q59kWWu8hENf1HB%2FewSyLzttOpoO7evCD%2BHIuqs4IDKEOlTX8nly7xgLmu0tXzvIwcZ30TvfH28cU4Z4I6A8%2FsUMGYjQCPmyyNP8rugM50EMR4vMkqI2Z318ToWjzsZqpPB%2BAilNrQfoYdovnwfDexXVsfctTFGQyBzTKad3jeCxF67X1Asud6FjXALgEM66mWOsI%2BqCkO3uTNh99hC7c3Wi6IZT88cIHLSmmfisgi8Dx3QZo6rPF5ak1p6GH8v7Yv9KkDt0zfj4bcPjeLU19m8%2FtlROQjM0SwJgccsovAPj8xyCFehWdJnYYqrQXXcMB5DLpOvusB4RrlwTwhFPb%2FUcpGcSUEigyG3j4seX1CzAfWCDWOhvHKCTpcL3mQDugHoUHpcWU4PxnoFGgYsmj8wTsOW63uXhgHpZhx39MpTTZhtUIlMx5TjGMdljBlHVptTHnM9oWEx%2Fw27qwnoGUg%2F9dy%2FohrdFfhf28VgLETK2vSkeZcT0TOLi2MRsmx6zQ8tkr2eu454uH18O67Lodlo5d5VUWb0fjbg5QJ6VwwKwg6mz%2BbNpEUB4a%2FZoEXa9KRO0g%2FqdjgzTTnzIW8dLRNCoTlLn0MrJMY9TM34Kt%2B7QsaglA5%2FubIe47m9HVLHeD2mm9WhLdgIT1XkK7IUC1VJ4XxpJt0O%2FgwCf%2BiUfdsTdhXlZY3Fcq22rNZxsHdYYSVOxAVk8T0SWfQS0t%2Fo%2BXmKp1FQHzRFbJySyslGa5evDKgrgYd3DnsJeG%2FKovTzE0eDbh2c17w%2BLzHYYhtHwRe6jwQLREMMbTUtXMZWVRDHm7eZhF7Nma6d2O77u8ht0cy5kb%2FjxJUJsvtetXSJt7kLzdweYAQscxoYBhlZjHpIvqDe%2FhK075BjbLNIrRxyTWmCF9xjLs7aEbscZeozXyt6G3BGHg6jC9mBXgacaMQgeX9dN7C0sD9uPLRfbQqR6gjrPQmj6N7yKO7C1PI4%2Fjnj6efwee3mDt8bAfXRdmTNs2UuoaAC6CG45UptQ%2FclG6Ch3O%2BayRtoRNBfAgB5ZKvXw8dVedmZRpwPrnY%2Fkqcz3s98azlLUTGa%2BwpEVObeBzRr%2Bpj1sGhp3uwSAm4E%2F9aqRiXw%2Bf3v6T%2F%2FmUxs3Lyz2MKvnvc%2FJF7vy5%2B7Lxd%2Bnu7AzukWbb%2FP7xb8vAH%2FNJ%2F8WZnl2sjxdXZ1Spm%2B%2B%2BPHpH%2F71p19%2FfPKHpz%2F97W%2FZrz9%2B99OP3%2F7hn3%2F68m9%2F%2B0%2F6%2F4197YuzV2fXS3%2BLv%2F3t7nd%2F%2B9vXdPj9r%2FiR9O84%2FaW%2Bw8X782enV9PFmVyc4eJMLs5%2Bx2njYn78%2FA78hl%2FnBbYbfCEnlJPmwy%2FcW34VFPnLr6YSfKnuf%2FL8%2Bfurk%2Bd%2FdcX73%2F%2F7x9%2F%2F4af%2F%2BK%2BW8vLq9PnZ8uzthb%2FNF7%2FhNl%2F%2Bh77RyeXl1du%2FnJ2fXB9561mZvzp4tH695fOz04vrs5dnz1cXb69Prqci%2Fu1vVLL%2F5GKiNLooVIbXp%2FRz9vzEKIqr8%2BmiRfCpvppDck3diGf%2FL8y3%2FPLYFfZ7fDldoV9dbrykEv99fuMUUgFGmT8uHlVqlMCDy%2FwW8u8fF98eAGuSHKo%2F2tUy5fuH%2FgR%2FPX%2F29o2r9R%2BTP3w8%2BcMPj39yiW%2F%2F8K%2BPf%2FqdrvzlX5fXp%2BcruXa5Wp5e09VVfrcgZvWLQ9D46ALgzRd%2BT8EfFz%2FOX%2BagSg4rZT0UJc0tf%2BiUUmdWC%2BNLBfA33yxIilw0kxphQYLsot4sNnnS4njQkr%2F%2B%2BuvzaYT7Onixw1s%2Fqqs%2F8tMf%2FXHxxR4qj68WrXP39OXi3%2F9X%2BE6LRbFZfPE%2FdE1%2BvUs6ucGP3%2F705ZfjTb4ueCnoHMgX81rl7zo%2F%2FcdXv7Eu7TqMNjFdvQdPnU5%2BMtrZxcn56YvV89cnNDRcn14dbfd0yP6QWva3YxFogMC%2FH398LC31J5%2BgJvsTDWQ%2FfXOs0b%2B9PL06uX57vPvVjd7F%2FekO%2BM2P9PQ%2F%2FO6br%2F7t6z%2F%2BX%2F%2F3v%2F%2Bv%2F%2FP%2F%2BHX1vz%2F%2Fz%2F%2F4H5%2F99PujZbo8uaZ6uThapEazlb%2BhRF%2FY3frL%2F1j9PgodLeryzdvro%2BXsgm2Mv6GQ%2F2SX5Nd%2F%2Bv2P%2BKTHC%2FSMGtXp0RKtw7A%2Fv%2BVL%2Fkjt6Isv%2F%2F6P443p%2FHS5PHl1%2FPF7UU3%2FIeQqP12Kg%2Fns0R%2F%2F%2BOirqft9aRerzfuhrQ4LU0k5ZsPZYTESMbAKxmEa1vb7JBwgHt2Vj%2BaUn74yX%2FvE3zIYgfhToDGDi9QSOP65dk6Z%2BkAfiH9oXTGIRzQCb41I21z2cHA5ljeYa%2FzssypUgQ8%2FMHqASDfxYZm%2BaI%2BVO1XjzCg%2Ff3t%2BThzFFzTMEZdGo4njiL6k1N%2Fn1z7q8nLziAbcL4MS%2BeEkIHPXDWi%2BAYdZZU4KqME4%2FpVR%2BHfv3xLntLy%2BOrt4tTp%2F%2ByKchR3rE1DHMTmgS98%2BaG9Wsx%2Bnnz2vPX2dsw1GR51yJqS43Jz3HzKH4o%2FYgopkq5Vc2n2zK7a7Epv9vv65%2B6Ys1t%2BUXlT%2Bhu5TJmui4zpqOAtsvyDRaiUAPW61Suv9vq7%2BtPzCNfxH%2F%2BWbP%2FrCFf8r9zozwWoufFHumNx1fXVysbx86yWrR198%2FismzK8%2F%2F%2FL3j9QQNmYOx7Do6DRrgn%2F3Q9XBI%2F9hfqVPDU70Qodd6yZ%2FwKqSHkUcQJcl7VZEXBpZ8uRmkdKoQz%2FEJslYlOUbLm5RDfkiLzv5Ie4rrzL6o2vFaGGR3%2FJdwCGOlbwt63VSglfbywLaogZriLVhGqVax026fWmLpgXT0Bd559%2Bza%2FbZorsrUJq%2BfVjchTs78c%2BPKhg3CrqmoILRz26R4DTh84QJad3hL8MPwThN%2BDxhQp9U%2BMvwQzBOEz7H71P%2B3S26PMVfhh88gk4TPk%2BYkHYp%2FjL84BF0mvB5woS07vGHEvRcgp5%2FuARE2D00RKHWi7%2F9k0VZb%2FH3pOHfb%2FH7dNHUd0%2BpgpKSEnxELhy7X9p%2BwT9Vv2trulOV3%2FecPVnTq8IrygK%2B78v8Ht%2F050WxT%2BTSxVDdtUmzKDo%2BS5vyvkkK%2BpLF%2FWJT1vSd0rwoF7xHCJ2KLtpTJW%2Bphgr6LmtYD5Q%2Fu6M%2F37lj4Y43dOwT%2FimqlI8ltRvY%2Ff4shxtqXe0Gfyn%2F3OO3qG5RHQW1kC38Wsov7sAJukXTFYuSZvoqa%2BkF27rrFhm9%2FYa3tNA7NdhBveDfbrGlj1Gm%2BwU1W%2Fx1aIH7blGlu7ru8ht3VYFaSNr%2BadfsJNHUJVV9%2BRQn1DB3kth1t0%2Fb7XpBf08pvfiIiGWLuqIH5Q85VVOz5%2BdQteGnWpRFxVuF8S0lsaFBUFJUvN22LdAa0mGftG3yQJX8kfKyvnlRZQVKSn2uXGT0WvRq%2Bb7pH3CEP0h%2FvIMAhkSVVB06M8Qg%2BOiiq%2BiDr8sbPtIkW%2BJnoE9cNGXLhyHjAz2Jvnb%2Fr99SE0B%2FGtZPcaS%2Fp5RerLt76uRUIC4uanDo80XhEx1CHOMW2FrMJ9QuhzynVyk6xEZO8FluWaW2QBnzpuN2uE%2Fu5Ug9tykWxa%2Ff0iM3NMRVlF9%2BcV50vNcvX%2FxMGe52D9yqCd3CQwu1x12SJVR%2FGSWqG6osGjbWdKNbPsJEL6XhB%2BVYoLHk7aJ3AXRJpIaDtMVdUd5gpyjmifsFSkMPRxIHOtvniZBwBCtFYwbxQCh7Jqk7bIqTZEdzUVvfdZxYiBH%2FoiE2jH%2B%2BW1BBwLD543fU18oS1SttesExUWl06em99zm0Ghgq03agYbNbwOcI2sRTXLU4wjMVVDdUQX9cfP7FN9%2F8%2BujXf%2FqVxcDf8czW%2FZ5P7n7%2F5ee%2FjdFSAvmcYd8YS19usMZk9%2BdxWjqSk96c8McaiBYJ%2F5iFen%2Fxgjik52%2BvTlfXZ9dvTi02ynyH8D1gRnG4mDP9iyhfPnH3sQ7o7qjwL%2BybTxWATF8%2BsvP8I3Ltb3ryj7%2FlyT%2FFnmyRf9JElS%2FIE77B0VYVEx8mmbNvh%2FzXDWJSf6PyHFHMkOTT02DezZiw%2F2IxfcX%2B6PUpclxB%2BP7do8XvD7i7o0X7b9SPpfGcFU5Eo4gS9%2F%2FzGjpQcKjFq8Na%2FDw2GhiAxUo%2F%2BvzzRwcs9G8q4aQb%2B4mGxH%2F8yvLi%2F1%2Fr6PNHn9t1ZAFWHX3%2B6NHnVEf%2F3Xc4kLcf%2FSdPJb%2F7DIe%2FS5oG8MUB%2FR%2BeHsrch7f6DNdRpv%2Be6EoS0f8bUus9Mcqm1Argvyu1upv%2FRqkVuWNS659P%2F%2Frh7dUL6NIekcwFa5IDkQ3yFkkGA3HHIkoR20%2FFI8akz4mZJGaeuA3KU9W9lnLfnF2fXp3wysMjjLMLHmfpDjdVfVcxm7Zn3ozuASnhs3zxWbH4rMHfjn6YWde3ffb%2B7M312cXq5fuL51j54fuTvELiVCNiy7oD608HbMbIV2APVz0Y%2BlGAm0lSM5kLSd5HTjmzLCX2nQ4ruNQaEx1Sezj7SCVNbBqDt%2Bwndkw62HlEWvEVQH%2BuUWl8oMdvFsk2E4EIP6ukkOPaHTNPyEApt91Dh8OK%2BUdWIdJvCcENiWaXQM%2FWSJIF7SKlsz3M8cRscfEZS6dVNRT9w2pzOyYbJHsIEvgtNpvFCSVeUEIMIxdJ04CzlMMGLYGSJLjx7xM5PJXDGqckmaOu2y1%2Bin51UApQdiTgE1fNyW7YL0R44V93ZySpfdSS2ick63GqIy5ZcnRpUUwS9Ux%2BR%2FIGXPCWWF9KiuDZdXUqvysv%2FK2akPALCAMaCx9Wudsotlo%2FUFuqsaucoAeSHki%2Bn2R%2BL%2B1T46m6Yk%2B37Wt6qR5WT3SvYZvW%2BcY3g2ELBUqercpkS0LeltjCleg7Fgl9CGpA1NNXGRu2L9ZJegOnuUi1Hf%2BwKOATlE%2BCrqFm0Qv%2B5X%2B6AyGwYcDZDn6M0CbXrKjhX8SDWazTp4t1dptAui5JMl7nVb6h70WdhB5Bb84%2FJMY%2BcIL6fVGtqPrb%2Bn5GyDkmzIzgLoAQ7w4rL9SvvNS%2FuvGJzgXh8ucPk9xP3JsoIKhTBuerLduMlvDNo7A297GEgH3EsuN6M3aW9WaDN96sIKuuWPOBExqO6MXXDyU9e7P7yGXYwE%2BTOzR0hOqAf7%2Blg2QpUm9ej1Hd%2BVkksrj2oISEQaQEiQd9IR8KTg3kV1oF3RsTwJamXUlRH6bRck0jFJoOJe7xJ59ejodfnpVx62FLr45ZgbVc2Qod6Ncn38rZL44ooZDohD5viiEzTdjcF0dqv1BfwI82QscgvWV9RsJ0EiDRWhuxEvZ6v2RId%2BMol0rtptlmhQZRD2VZuDOqLU74GsGJXCzJXfFUEqI%2FrIduNUiEOyZnBb0vvu6cCOUXjhv%2BFYUPp6R1rETwH691mHPFKmdgg6UwuwNHrUwqE3aeLOka9sIeqLFCvHevUZGojP3vhy9X1RX7uqdyjC83o3X9ABPFVe%2BA8W5wX9zXkqyLDnoFpGmwuFlhtJSThxI%2B8vgEIxy1P2SQ84M734m%2FR0qLpSkr54hbXPiC7GuMSHTKWiE5yAL4IqWK3WTQ81E9b1xPT6mOqPWhJrYSkqSZUv7CHbwUQ9nskuCEKFV3W0eDRg0HqC7c8SknSqrlhUxm%2FIvRJN1lBa7P1w%2FdLr%2FFm43pAen0JituJbFCvAP6cNSyYVMHBTWc5HU3uE2LjaYbJCSOBPWRDPrN8VzEokWKORr6KBpIqCbZ6wBx3HnSMiuASiUGzVFasG0uLbzAiiPsgbQm1mK1pakDXcif%2Brt1XeMOvtrKunO%2FPM%2Bmvi3CUe5iNo2kMMSHYrjEH9425wSNRD1rKFN2pFo3LiEqQ5e%2BSzzZKdVSdvIu87OkRfX7tBkK0Za1QpBCiV8Kf1yNRHHU5F%2FPj8Z%2B5MtDYH567yp%2B1SxmwygnO3qCN7te8OJsJYee1dLDFjxbig2ePby%2B3C7MEdkRJwYtdbeDp%2BR%2BTDSSKvoh91SZxTEqPcWLcMqBfpyCUpbPwedwHWLXBr1MWUs%2BLICOCeEq5cx9RUTEWK8wX6cS85KO1Gbot3ngH1%2FJlPLV1jxIT6HE2Chav2oxLh4ggSq5fYIf5u7omHNxEDVykbbp0%2F%2FJwwr3YH97OZEnyCoFlivyfqAa6jhe8SLtaRDCI8ExQENHHGrae59PLtlwgx7W442HdU0XSjjTkVaVUFCnVNAH6g80XjuAz3yaHpq1cGa%2ByIgR%2FO5fvl1k6xL9NMtH3j3joMHjcTX7gp6UjQHERtIGfunQdmk0%2FARMs08%2FIb%2FQJOnTvXOmRkyHJyHzSr4o7nhAn24iYwmfE29Jh03KeREFzh1WSdmv%2FPjtSH4pXc5RCxs2ZUICIxKOEkcdKfethK9cdeLIDnlK%2FOVcdTjgwSVN1Vm%2Br%2FmnuOXqpHmNfiEAoKDUzRyHymluJsKQrEEi4esWRwxFcJtAoLBS2RZxvFeJT6wpkee3%2BN3v8ftLu8Ghu5XfTNYg8OPaOJKrWdozUJTmEMwLbuIZQijJHELfk%2BS7lYjL%2FqzY%2BzP51lOKJdx5GxiTq6ST%2FiABh92hJvltZE14HKAzlvTcsUcRqEK4daKV44c%2FMB25o3BiEMKfZKYYPzWWo%2FhbUkIG9kzchNDxtshyPnR1C%2FotenF2M%2BxJ%2BFtNKRLgoUCgrDS%2BpIc9L6t7z81RkmWXjAe5rE3u%2BOdpxofv5JBt%2BCCjEafcfdwyDQlieYnlXcyRKVzqgdFwZ1OMpYWI09TuqW5JuFqRrFyTmMsE7q0OlPmJT3Y0lOWFiBiUQAAPHBAydZHzBJjNpP2RMlSekD%2FFdMCJRsKTCxVzHB33%2FJPje7HWDgP5ihes8rLY8w%2F1wnJNwgTSHGpmSq2Gjt8U65KsQhH3RKt5Mp2lhym9mZI3sywNlcq1c162czXN6QbaO57A2D2fz4Y0RFDq59j7Qp1BWDr%2BbXAoblep7IU7WDo9kKawiEo%2FrbD3OQJCyu%2B%2B20qCLqY2SdTbBYJfr0T7yGv6DX6pS%2BS3zhnGlKKWlN%2FSSIr%2Bmd%2BLFOIWr8FVyuGu7afUSlZX88yv6MqBBh5hqQ%2FPD0%2Fzw7Mnh6dB3kkInZPLw1xd8MCOT0tEsuIEJjqMMpXsO8JKbC4O03BEHigr8vve1YDwAphJwVT%2BItZZHQP04en%2Bw5rm20X%2BEWvQn20WGyyv0uBFnRz1Aj7NL1rLYQbKkrSkIP5KyqMd%2FXY0MTn%2B37V7R8WSMw%2FfOOt5EXwjIdsbSrQVCdKEbbA0ucZfX0Nhtyk21D8xLIDnX%2B0hSPEpTTXwcipp1l1RqhSFDwTwLF9McviYWkEwnc6kEU7nLc1am6LtemdygJXQio6y8C1TDf8SU9k4kwT6vaPRsKuS9oZOhm4nv0%2BEaeR0JofKHVc1b%2BpezHUDNGJv6atssEpLA%2FUGG%2FTqjo%2BuISOJvueOKx4%2B%2BKTq%2FdFfgqCJhdyFB19JCAFvQtyTqAywQ4RYaY5r3cMIIIchNRbqmRVDqsqpE4wpuj%2BJNCulhiTWIN15Hn1DciHPaWj6ONmTZOCOJSdg88AFc2lqkz2fUNOUi6rUNRebh9K8Eyj5BgdW69GRbn%2B72H672D6Z22yswF%2FcuPRMExQSDgYvBc51QcxzLDwL4jkQPtIsuGZjD%2FojeZB%2BZXrdplBn8C862pYyTE8jKQ8yS7%2B6AxVZcIRib6AWm%2BPE1TrmOWLtSHA%2BVIYyYdLIzk8bPsUHmVQSY2rFpgR0ii6N9kh%2FqTiwm9gSoh0Iq1uwd7dMLgc3tnZ8Ku0c43ie7P1wDqAp7qmrcQo6J9mEwecQcvPJs45FW2XiLY2xA7l466tzGpe2281iW6DRixmYsLfYlr%2FY0hOrgQsg8rE%2FoyEJAtZ0ivFydobFqfHcndWLV3XXUPeUwxKPbmlq2rbf4SdB08Qed5J39kXWL7ij%2FIvXprqzvDo4E9bSnTnWks94iKVnuROvzZDTObMjFAxRLim6ZklTMYtmh1nVnTuOTc7Y5EeS1L%2FwdSC6rdod5HgaZwqD7TvIYghkYHumZIWKqdfU7FdrxPPBWf9x1GPs4POsp2tZWptOmwQ2as6khg%2BrJz7xlBIImUxt2iekSe%2BS28UuT%2B7q2hdgBxmCuv0OW7aRY7sBRwDjHGpS6B8u6Ue4XQFTtx0UPfiQU%2BpAZbqrIYTv6pZeaxFo%2FopvF8WTxWcky3SLIn1Cf0%2Fpb%2BVF8yLdtU%2F4F%2BS6O6y7WJ1TRbe3PI8uCmjn5BeLbJwAVyyLLwVMoYqMmHei5L9UVBAi%2Bu5a8EyAI%2F3JYFV4fZwTwxdU%2F2ysl%2FMv8%2FNeH818DjgWn1jx9Mfay4nG3aqQAEorx1H6RQQ6DimRaSpwL1a5daJmSqL3oecTgb4I9NCj9AqN7CoZbwoBeTxZVRip1vyeJC20vqUXlbxEBQIdOM0LPI1PrEb1erdwLBpszCZjKJ%2FCxy9cCEC%2BuoaSlRMYhwofe%2BXJlHyKJK5ege%2FxaZFZVmmmKJWidCElSxVFXZWpqyp1VaWeXqmrOnVVp67q3NPd6%2FUQyvxS5UQpB5xgoXpRtDDKo%2F%2Br2RKInDp1H04OEK%2FVoSRPS8XYNbogQcPfLPeOujMhJObS1AnnrwsvT4%2Bkbo8c1L4qthWEVasYp65g9kg1MC9HD70FHd2UNBUDe%2FFXYxtefPbz4udvFz8%2FWTjpVA40BE1ffvri05eevvD0ZacvOn3J6QtOX86lmsX06aZPNn2qP71c%2FEw3hZbhZ1EY%2FDyURSK%2FK8yCLkUZPrtZ3GQ5Ccs3oti5Ifabf1Jx7re4qbv%2BhugYqlwWSubEaLbjVDMqFUadwg0xqDUmA5%2BYrffMSLjbeOYXR0YKL4tMZ3rhZ8TU6s%2BIQIQcTzZTUjjJ6TSyIjTL4If%2FiSRrQ%2BN5ME2MdL9KNBH8UtGc4lZ4RpJeNJqgYOXIAqZFnhl6%2BAS3kDSdu9WkkTCuIo0U465%2B%2FUhYN%2F7tFm7xOl%2BMzC544SxZTCyxrxU58jK3TNAlCZaLcr3Z0m3SpzfEZJWiqivTVcnW1pQYFqXTa5asNSv9%2FDFbvZ%2Bt25ejasgJgcT840%2BWZuCjAFJMmd9SF4UKigrqhKhyS%2BMBdQdqyuWO%2Fgr6n%2FNEDN1Ov3hDEx7dGaVkUd0deAqBlbcT4BtxjeRP23zrXKUzxY0wo2wNmUtkYKSo5Y9RwLuFl8cYkSpbccjsXDAaO2gEliYjlHqDGdQlb2EogCS9LmyQ2Tqal%2Fvxw4q7El4S%2BbfP50948FsIxiULSruOVNbgqsoaIsZHog349pCoU7a9KXmCnkTEkni0AR%2Bfir0nkWZRdhxXkvorvd0eQRYMkjMu4BMLzu%2B5UB7Yd7Nc9EdME5YzLSqeRrN7OX3rYQXjCpinlwO9w2IUiRaf7Rf7JG1rJ8%2FP0k8WEFlX8uWQxMI8jiz7ISGVxbnkk3OyhEc2EqbYeTiTWJGMBIcq6CQbhAM3CoJBnNPY6e5E2bJ1F5207B4Lwk2fO8p2ffAkzAYMiFhH89sk6h0AB0KgINNiDpw55eWaGP9ZciX3bvDHJi9QG8iL9enOL8XwCdhASuDtMk5AhzBUbANBDLhQZp4u9uXIMAKrpAw8fMhBHiu6f9eEWRKCl142mMFlU2r%2BKNzinkTJ4pch56RbykCSRTC2m6ObrcqGieCEsfKBgVFe%2BX7FbwUxeZ88rOna7J%2FRvliGwc9sNnSnNORIyo%2F2fMbDu6T07Mf0jMYsURbIaTgRMhWTICc2cnDNkJORic%2BBfjKTU5nwOB1MdkzzQ7qc%2BEnOn7nph0%2F15CbkYGILidP045Dpjm4yk7SbyPhknMT4LLiDn7z2CCJXucNBnfJyP%2FbSLORNpacnuGa7ebLqdskT3tIBHaBvKLB64jWNoWczxlHjSic0VJUIGSdp34qQHqif0r0rdLbe3YeGmz2km%2FRm5ceskSBTBR7mOFVesT0g4Pk3MI3YV%2Fldj%2FepeccVDMhc78PJKGGe09m560Z1vi4GelpdPe3S3dAiVS%2F8zDLX4e1JlCsC%2By6m%2BT66opYI7Q9b7AnCKyqc9N9%2FSq%2FEnEEy1u2aZllOs54GBXYQVmaQguoMR7ZG3T%2BkBXEgN4UbYInjf6AfGu%2BchnFB86P7UFXKmvdq1LyMzdKPkJPACZca9Oe5YkpmOR%2F8c%2FI7VrW6igYwrsBi59xK9o1V1IIgu2O2RtqLzfTVsSerxkBYIZ4uppBZy3dGOBXbMbSQwhmuYH%2FtJF06lWU2TmLvGDVUx8VUdS9rPTToVOAeqqan%2B9CsXzW3i0os3ypZQZTDbN8fhik8DmpdthOpaCgTewwS9NcStY1fiGmNO676elWTUNUzgLZAHzjt55I4G6LeoljD3s2uyHqQA%2BNmxcZ0%2FFvIoV3IrfEQZ5MzEeoiW9RZthKFIaUa%2Bsmf4mfFNkBI0ddaUMZZKWvKRuN4Ir8YmtB2cNLK75x0J78zEnuowC2ExYEyFP178Rm9lbRi%2FqXnYE5nHdss2Uia15fHFIj9rt7Cs81qMqERKk%2F9LRwizs6dLpcma6z7NUjMtCZ0Vm9Yn9EkGe%2BaTdZ1Cc0QW0%2FQN8uY6Ab1KbnqBvYCDNIWP05LSqnOcwjuBGtCiJK1YJYPP0%2FRaTi1oQl3MRk6jimeNnHG%2ByJpfh%2FFez6Zkrx6NKmwRxJbko1nvI7UHNgYNt7GsJnbGDaTjWHjbQwb28awsWwMG2dj2LCNYTPaGDZHbAybAxvDZrIxbLSNYTOzMWzmNobNgY1hY9oYNoaNYROzMWwmG8NmsjFsZjaGzdzGsJnbGDaBjWFzYGPYzGwMG5J9Onzum%2FyuQkvHHs%2BEuVnZ7ekOMvnO0sjJCjqvjKHTtr5d0Dh9k0hDkxF75Raz3SkSOYb3fkwcqHlFJbTKOcwJt2GarsD4YzfllrdUPs1kZ6Ucsg0f8l%2Fo4Cfkpk53uwSKD0piyQ6HjmVEJHiOQQLSKo7olzg25SBZWfjkBI8cSMnKKqdo3sBe4aSVX2l4SGHtO%2B0ljWHs%2FmHBY0CSZZJYU8teoz214fkqxY7SlqtAJIiSPgvxAUm5GMUM%2Fix0gsUNLiDRnY3Pyp16A4fi8GoWxFZujcxRWFjyabnxCitqXl4RgiwkHJzIJz0k%2BZ2rc5osiLuCcWFWB1rdGR3JjnmC48iTOWRfoDJDQcEJx%2BBNV4D5EkS4GflcMDR5SuyQPym4%2BSKb9MeV%2F%2BCegDnl8FTsjph2WH7eoSAWTIK20Fkwg8NdgmldPmT1wccS4Tw7%2FBpMnN4%2B%2FpBuNb2Jowxr0RfgrK9lf7Xkx6t2Pbiepu7FMgI%2BCfCJubbu8P2YuXBpeHbIOX%2Bb365mm%2FEbvyefDlVaNG7GdPadDS%2Bv8%2B%2FGHaDq4JQfUpCWyZFTLc3k2Bud8aTlNJ0ztxJIsjYFZv9u0m96rAj4JeUFOFT6E8siJPg703G0MKITN58hyXVMCZI2YFhArNkvOP4iujRYE1JXyLhztjRT8skvyXZMFGOqGVOdT92lY2ozpuoxJflaBJzDvIUz%2BhxUXp%2BYzaYzEk2p05mfekaKm1ync0xC05meZkdMzbUjggl3PNlMSZl6p9PI%2FDvL4KfZiSQz8XgeTMcj3c%2FJE8FPzHOKm09Hkp6iJyiYpy1gmlJn6OET3LQ9nbu5eySMc%2FZIMe7qZ2tMb5LHT9e%2FDAXyVfxb94hdvKDekexWt%2B54R8cMJth0gPgoCih3mLWgkUDtx6d9rYznh4bhjuyalD9Dbfm0bk4O8dzkeBq0LUdHy3LJjU9Iq%2FInkTY1wr6leML8qXzyZDyTpubOgobmqL6Z%2BVPfyKZz1wAcQTewEeBoHeNp0No0eWoVIzZ%2FkGtn%2FmzGs3mSa3judGx2%2Flysbg7rRz0TNvIVGweNFEjtLu1bqYyNzHg6Lyy8J4qOYpWMBFgxPvJOFSz9CjvCvpGdol4ms2RKYABv2UaMpsDWGYu1kNS81dOozm6xma9Fa%2B%2BdAAbfHfzjtMGcFFnRoPD8PSc4XSZI2FvICXCvkmmXdLt8fmfWPDA03Wl2C%2Fr%2BHW8p9GBdla4A982efaSsvCkAGMlp3wR7BgKrgIRoCSjlnpv24gUIKelGLoGWuSo2q3H7BAAspJf8BvI5mMeQLJ0%2FE7MWah3clPgw1y8oyopZaLgPgk0kS7CccgXcQ%2F9OB0y%2FnSQqOWDzBCVgVi0H4WwojYUhOtS3uTvM9wg4ykz35Si8ZcOlI5ZuBioGbw6YW1A5kts4TGfuG%2BzZ2JuOUHnRwZeKxV85iO212Drxr1fC4UFY7GCwLm%2BxnW%2BWxBYCRCfLn8yJ02r9jJgVOfFE5QHtBitsivDdnMIsVNGvpOwjGZWQEOczp90WecufktsrTEWkFbEfL%2BL7IGjgQPygHHt3eMq%2Bk3g9ZdHu6JWLNKXJxi0ytaPJBiWxYwVD4h760bby%2B5raGpLFlo4YO9Dix9UucViFXd30R5wr3PBgr1TrFrPYmJyK3A2osM%2B6RZdQK6IfCJZeNYcjtGZ%2B42tw%2Fm1IeCIEb99DJxXkR%2Bfehy1xZukD4baj0ZyeD%2BWtcKCd2xfV8b6hLuVBrJsMj7qsvqvYZ5tzTMYeyrAk41xCdfPNf2hb830ndJ5Nm8K55WEHgLPy65gytzek87zc3%2FNRhHZnNMpSHHLP9IBdYGPI5%2FStGr7P4TpXZ9gfGrTR%2FhDblrgn8v6lVTL0NS%2BI4ho6z7CSJQbgLpqGFOfAZLFjj3WoL5h6kyDVbRZYG4CyhI5P%2F%2FlfJIXgRF0vxm%2FjmVQIfXRPvuMfGbaQ8vNLV2ALZdXdFOh%2B0xm3COxjxw%2BeQ2IeRJD%2BYVqiwyuQQCxfsH9YeJt21ufwCRebEuNOOTphK2bnCW%2BHH0SpxxFvL02luEehPYvoEzNeb0Yibm8680zKSGFmZDrT7NyIKQ5uRMDDjSebKSl83HQa4eRmGTwzNpGEZRvPA6ZtpHu2bSJ4xm1OcRzVSNLM2wQF%2FJoFTNzTDD18guPapnPHpI2EkU0bKcZdPd%2FVOUuKjs206bcsj1uVHmQxrEo7LL12WEujn072qnVVfceNuxrWq9k2QT63nsFrYvwL1fiUWoE37CBx0w8Eenaf1rHKejTf9afOfnc8FQNef%2BoseBGWFDqFDra3vO1wTK1GbwaK9DAjibHrE0V5ekBxdrATiTV9HxfYZYlGBldzi27cCdCJpqP7ZdMuRh%2BO9A0xlXaOsXFH2SLR%2BYm0c1sxOqkajKXEXDmdpBzcFZivpe%2FDoyUcAnw8SK%2B89SD1iy07AZJ5yiUOJyn3mD7D3xP8zIcOPsOo0WezjkEn0hH6zBwmiKxHCCLy4EDHDf%2B6IQGp2GjA2NjBcebGAEqG3b%2FPpp6P9Njp5cT3xj6zujqoYS8%2FpM26IgPj3Xy3RtL36D6bdWY6Obx47MI9Ygnxlyla3vPvE0%2FGFMoBDTT%2FlnJoF27FRw7YQSQp1C51xu1c84Y9pvSqO58o4f8RJjZy6P1x5ZdC6dzJLmhzshHMbXbyKl7XJvHrbH85jaqA08ZSTidACjus4WVADrjHHn8jd9cNHJIM3YtHjqGRJj40fs1XfE83OO7nnA6dchMAgipd9DCOgV%2BDiorCJ5PVqPMLCwexvONWDrwyLsnGHUeeI%2BdMCIvZL%2Fq09LuO%2BrHkxEaVDNKRWTqfSDbYXQC1KkkRPfMnzG%2BIo0mfwmw6vgxTnWKZmARhVuCwR3auB%2Bf60nGFiM%2BYJxlTfn2ICX7%2FxuHZioXvhZT3%2Fgl%2BRv4SQju992d4i11BAhzWp%2B8WvH1zXHREopXflVSqtxPsxV6vx8JwWt%2FzZuDRU2fP8ePosOKd5iyrUv%2FFcMujIQFsIOCOzvair0mKc0oFTvu9Xb3TjfV%2BTVMsjfjXtW1OO262W4xsmve%2FMu4Wn1Ii2U275qEM4d12SDid%2FWI0YEOiQqNghTTnmmumMTI7JQiSreTcjncpttKSSKZJ5VfKIolsPhdPRGNCnkC9FWLC2BYhwFZ3SQtbGLBiVDh6Hv30ozZw8Jt7B7fljjj5NpkmY%2Bwia8sHGNO4C2RrqWyCoV9Yd4HtP9hIDEKzEGmAd%2BezMzOknCuMoRIdxVChkQ%2BV73uU4pY3VPKph6bxto%2BDCKGDl0IHdq8gvmFpbs%2B8jSWcgOLvCX5mc6Cc0RzICT9j4ISnCU7oORBkNQeCiDkQxw3%2FyhzIqcgcKJif5fhM5kAkgzkQJD8HctrPge7EzVo403MgU4M5MKBN05gA493cHMhJNwciPc6BODm82M%2BB7rvKYVqDcg0CfYBYmTXEUnaHMZpaub3r4%2Fls97qjOSMjfwaTXox37jxP%2BaXEkmfaanB4Eaw3ZhSeHn2CFXW8pWpOYQnys7vFXf5QLu52ObGc0vzvCnxf58%2FmDqNxu%2FruZ5%2F6lzH1r0j1O6qtDPM6ex72WkkaYROhsFJSsInI49Md9WHIp9Xi3g0m92yX9dnD4oecd2JhORrWSbzfnFPY5YSj6wdTslmw4c9HdgLxcce%2F4qzgY4Vl7pX4RKaTlPjkgqZcel9naQ6iDy3BjXDc0vgR1Tz5nqBTQVwX8HkO9rV8ZBNGHLB4656brLt1fc96WfYwkjtOAe79kgafroEPwSzjNVdKEB%2BVcEdMym2%2BbhM4uaOUBIfnJFswuwggC%2BdPAGKTc7%2BwYp02I3XqHObRXP%2BwF8d%2Ba%2FGbByNDwagxj%2ByJ85AHn3cYA5wPO3bFNyZpbs8zd%2B58NiTC9rDTOnZHgy9DDGJyjxLeF93qu0yO67pnx3ZIl%2Fmml1TLyh5O0rS6SD4W%2B6Hfseu6rWjUpqT0q4WzvBYvc6L7OnQoJ3vURKQa%2Fcv1yQo%2BBcF9oCd4F38M%2BEwbYaPoyBMbtesM%2FMdiLaP6TLMsOmTnWY0%2FMXtRG5rFZ%2BkiTZqGXWTxWhR7x1nLOkS6pi%2FQLdzGztTvOU9lg%2FamTOgiMeJzJ%2FzC%2FLtaJ7PUSu6DUxTCuWaCyyNZa7k98L4v%2FoLApI5N0DkZGp0NsVKUnf%2F8P9R9CWPbNrLwX2Hd9Iudw47T3e5udltHluVEG9nySnLSfY6rpSRKZk2RKg8fifp%2B%2BzcHwAMDynKcvvd9biMCAxDEORgM5ggXPn8byMoFWv%2FBZ0oP5R4Bg2SRS5vucRgbwvas3oyZPkAywFGaxfCFlGxdDRfsy9zRUmUO4ggiX1hQa%2BKNshkJcgK9AL1KtjEUN06WMvHYqg2LWI%2FxIoCVEkcwIlcc5tkCqxpxFtl94SmvrL3MqyZbkgW1QhGWLydoBK8kqooC4XQthLdByp4KGgsl8dpJBAtufoOyAZMI7xzwcUMiLRjIU27wSgHFESbQ%2F0q2cRIlY50BQ3R7ASv7Rah4sRjWgV0dYNuUEKCLCNZYgVhu6CVCwjjVuVl5FNHFWGXNzbDkSigEyq92CmMsNrsshbQeRUm0jrm4%2FgS3Gi%2FvztwsCgBpcGG80PYDPNILROOwFPzQ80ibQHUzWWFAMyUXuDdOvkdLr3zhppAiSkd78ZQ%2FEE9RpxtvNUJ13Vg1PMIi%2Fip4O09UkOr8nadERRGNo1kSskdCP3gL5F3xJ644MiRBrpKpEb5LVPY9coskEEHan8x60C%2BF06JLIKKVEWmQ2D6CO9a2IMgkx1DfPeA0IWsQbK8DS8hlx4fFK7gUh3SFNx1p4xv6mTjFMqOQUttQNlpLJjeGZMKpDKCjTxnABoJxdZShdMVRgWTob6kw4VEqiKKVYgI11Sg4wTWZ3lIEjgF4D4cmO7ySoVz0H8E9gVPl5QgND5OhDFS2wOGekkd5mvUYJAlleA0dUI%2FpQbI8GM6txLEVCNWh7PcDen02IUMJIZNIaJIBMC6g9jdvDpuHR42fMdA%2Bhv%2Fbg38rKwR8DMytD7BT8yKexVcoYIEeYQ0gOdgugBr3IVEiipkAuW1PoS4mO7oVCA2%2BhiAJSYSZBqA8prW0xfz7UgSVEKy5IqBj56NygagQVAEk9leTq5oyEZhHrnzvmhvFMsZIFZcoR7bBkJANAvoh4wxohOACzt901E3QRMBkyMdeCo7IHw7dj%2FN%2BTGHCCxd8GVU9yJho5jufKuSj7VwHTnOo3k9K%2F6h45cVKHf%2BG9PGZ%2F%2BrD0vSnmHGKGacz%2FOejer5S0dfGWli8D2A%2BKepfE26lCe9fopL5JaqXo5cREjP3SVcBH3rbRM4SYjNUpQ%2FJSkDIb4fTCNlqqO6NautzrAv8orI6HETc4DbxE60dr590nzwpFORhZXtkUieJpjkUqYD8Zt8GHObdomQrsCRe9T7thbja%2FAVbz1JPGGXUGdcyGAppDhH18jaK4qrq8s1PY6XArATU4VPfXe7Cv5fOpect2MDPpXeL%2F4jAvSwufi%2FTsqbqkG4z6YaQ44Br81HPdVlxA%2FaZ5iK91GFIGpkKmygQDcOQVCqB9v01Qy1HdrmCeqYuqZtWCBt4E6ZFAP9fwET3U6ArfFQQnSsVybI6KTOcOEYzAAMBolQMIJYiNVKa0RjizZlgeZDvQtgLSR5HJguqgy5Yi5b0Tn3Kn6RK8EHpi9IU59icCWK8JB1qoXuK8dyHHRbtM%2BEjHpO%2B6EhpjZJiD%2FmfUsgXeQKkwkIejEgHN5rd0M%2BQr55dVjvlnyrsE6uPOvPdBVLf44uSLmbCmoLov8lBKg2pWcA5qABK%2B97cXbDVqLnLW4TWElTWrkiI2gDhyc%2BEFew4GHkyPc6HPh1T6IW3wCHy2yd%2BjOOmILDA4gISkodu2GuG3d4BArBk0kcEagiVJ5gMKeI48hxT3cgRvA3iCBDyfLRBFTayJpaopaiMigOlBsf7mZKknecqMmxUa1GClMPEnCMAkQMcuEB7U%2BhAiFwOIMenMncJmiVal4vu0q%2B8IuqTVO38VvNEWXPLm2lCF4KwI%2Be0VVXhSp%2BhOYadi1gBFa%2BAqPdirVxUaFyhFLEDmBFQohNGhELDSK14OKBp7lRAylQaTeYqVqRHRT%2B0bjAAr0Fg4Ttw5objqxPS5RcTs%2FQ71LM0om0kmpCSEtKbEWAERN3RoiReXNEjUjLPqms81AAq8BSEZ6jMVFIKQkGZZKjtmJDiD%2Fc2BGjtKhzEQtAuoCalsKMOgKTQQmlTj0l1B0h5ktBhs33fLXhLRK0KyOVfRQrtD5MbFUU1WIwQXaLKKCQ4EkeZYVKnECQ4%2BIu5NsVQK9felPQq0CIaCcD7mgBk4BDNXXgTlcAaQJGfBKQ8oTRYWLEBUBBMNly8rLVk6jHwekGwmjUVLQM3mEXkoqAKpiOtku7XKpJFQbS6kINm%2F44aMCaOCln%2BHNnVvZZGi0Isn08EsPJxRuXXwSQ1T3OUODv4w3iPZea1WeVoqsh6JedOG7%2FSZVKHRvWkkx1K3kR4I4E7LZ6rAIPwrqtkcoorIugH4hQpcfpEK4IkSlANqDkti6kEhid81YxrPC5vvbCHQufnQp25sW4t6ak0GJBu0cYeMKwQAwTRVFtZynN%2BQ%2BKchP1jROtKSoylO%2BlQl2jRTl4WuXynEvW8pXKu0%2BAqYM%2BH%2BKOEK8lEKixbVjgsLR1teawk2IYyvbiTxWpn%2FS5GNUgW12R5NNxQVdDPgSgroYIpSrAqaTUaIorkjc9CoqvRLxzSnje3%2BvmJhNTQqhk%2BS1JmiOT4oVmxJIfGv0MW1uKm6QB7GYAY4lKUWhqWOAt5PCkl0SotokypUBwIQ3oq4SoI0jUfwcos%2BAqEsEEZUJSfHycppgXQSPxN37JO9MVqLhil1kJCEK0AgmGWmAo1H432N1aSipBtS%2FGcS0mxvGMxgoq0RHfxxsjy8hTGLYNTSM%2BWJU5Y9MNjyY5Zoaum2Msk36E3RZxZtNppiiH3hQLMf0FRi2TIOxLfiausaASaeAd0VlUX8kOiXzQ3HWDwIvcYFMBLFkIkfjLl%2B3PWEFXP4QUuRjzy0TovuNCpO1I33Fx%2Fddtd0IQKQHiujK4TnaLvDUt6RonDRsLIepFi7QdOLoxJdUgc6obSSuRr4onHYrR0Jqdr4txJLN3SXvKdqzZrX0jUFZe2sJ5K17RoJlXx2pk8dGO6DMYwVB3vNikZLUYjFQJxYjznJi646%2FH2lQ%2F0aQq7Cnu1ThhKeHeM5iKIpBhqVjCm6ULGdG%2BgZByL%2B15iOhZRPl2lREKQ0E6ibn%2Fx5j4GlEpX4NxhmKTmDwS0gjNt00EUUc0Sb%2B4XPcUCmUM6Nagb3eHInVTrWCShB4k4j82JKMtjiNR0BC93yX7BpAJCu%2BeTQu0%2Bpctb6LxoOqUL5CEbz%2FXw0njmwH79HV0A87Sj6978HhhnKt3YOrgTlocUKfaC54GxXH5UWWvEQobsORbvDvFwUMFZNXeIBae1jM%2FKqAxRuKOvxdUVH%2BHMa6CSoms6hnGQ5%2FI1KpTlqtsYI9aDc4O3MfyrqsTh4nTFcfooB%2Fk7N4yP%2BVHOrtgqN3wJwo9yOl1m0O%2BQv03BOCJ53XLEfKk%2BrgrKmI1wM7yK0BbpjXKFcHOLqr34HPK%2BdUvZb0ttvjXafFu0%2BbbU5ltu863Z5lvV5ltu863Z5ltq823R5ttym2%2Ftbb412nxra%2FPtFbf5VrX59kaJzXyi5E%2BlNn4q2vSp1CYyDkG%2FI%2F5FZ0541Yoe1j5xg%2Fmh6%2FtJtfYT0hyfQiJoydYyS9WUIQsUG0gsTt%2BUF3v0yTZ0hkPnu%2BUL5zv42VjXJzmemNf0Sf5oQTLx5Eaz8fy%2F3Oefht%2Bdn714%2Frc88sR0h5i7Mdee74z0gFhQwavceV2t63Dhhs7IyTeqr3SH1HvZ%2FTKHuchehQ2n3iUmu%2Bqt84tJiTsrnWNuJF4w3bjDJya5YPzXaXfQGvYHvfbxG5vn3C%2FyQbrSb%2BZKV7pWZ7Y7O8omuDIkcr2TG2qvyX4xnz9z2s51RLeb%2FhRwMZyskaZMI2TOBhlsVuSdPi%2FJgfPfJewVe7Yiy650R5v4O3m65Af%2BblN4W8I5uHXW8s7Pnj893yuSRhZfuzYPv3Udkh%2FouE%2F%2BiErvj2SlrV6ES8O9%2B%2BJhzTLGGW%2BL7xjqg8hLwseoJIKCnRGqskWzkC6e%2BO7y%2BsJHoWk60qHkjPN4%2B%2FF63VXfN19jBAvWPrn8czKUUXS%2B%2F%2BHe7VQF6ZYiR%2Ft%2B7YQmvihQ7zk3b3uvtpF3uXmueHG1eyXfeb1zX%2FeuuLl8BfeuXmDz7Qr76cMcu1Kx63l19QLp0nXVttrq1O2pG%2BSSgJaMkqFW0nJKUMufskdYLTWC00wfONgl7CQiP7G%2B9kGoBBU9dX9Krud15dwRLkfy0jqZNFI4faknSV%2B0Jj58%2BRj6660XLDDp4BZagGJNk8mxd92%2FgC1pAGdLiJ6c0C%2FQf0ETiJcZmgpCADFRBxHuLhAnlAIxOBQcwEHHQ0%2FyjjudkiHgYy9VYaiOP2%2BS6IVLnln9OPevCr9c0YCciOJvM71RAbzo5WBfUeBw2HkPJPwhEExwesAzbYeFo%2Bimkn73vfTa80KS4WqiXA8FsCjuAIofKIloDGOB6KqVyTS%2B5u%2FTYDXYa%2BpCsdqjkNuNR0us9AnriFJ8wA5Uxx0vPKDvkigRA4DqO8j9IAEowNph0Uf4MahQnH4PfQ1dQ02PUyy8FKSk93SKKUH7l35ovjSIUMwsTvfRESUlHnlhhpDDIPMnpXJPMjjVqXDfQ692eSQtl3oKp7MinuChtqnunjnWRmuXB94VatIwBPsT19ghC16gjFuauuMLNZwU5hd45AmQDzBWEQnvfuADZfAGHe4SaA7kqD%2FySaaeIWTBQ2dowY7UJbY4t1iAdMZD3wsmlUj1S8fulT%2BjwTa%2BwKONc%2BgD%2BsHNV9UNXRHn8Tb51NWxvDIU%2B1eGPgZQOxIWCh8kMXISsP%2FZS68Z%2BAsK0HD1L1yyqISAEzzausFbZNhCGQjqEfczoXDfn2ds3pa2KjrH6kDrhj3S9jyitXK%2FsVf69wT5GSMfugk39eQC6wBnYJxgDpzQw8lLfkB94BRUBNV6KgCELzg%2BuI5odNF%2F3OTATd0BnqBGsB470B04WZSkIEkIHkRBQLMRwv8VRXMKZqgXwZOGHKvuR9ElkoDUpwTRvaggKZoN5McRLOyF09x%2FAyh1fOEdkm8%2FHWpqB4wacETOdPLogFhWYyg4dtWDcMTYDZvktY9Lh%2BiVi95d6eYZ9nlGGrnXVvj9V%2BZ7KbkDVU46%2B9lo4l81tW6PQkMdGotyjh4r8CsNmH0UX9SSuEXoyF0UkW6W4mWeGpNCbveTV%2Fj2HF9ySRx4Q%2F4%2FIXzAGw7PjzcsloMuPXGU0ENn4GlHnbBgAlTvhyPGfMH%2BOPm3iX0HQewW%2BNG1yINNFnAcABrEscWEPryBO3AlopvB7w7gQLyPt2fKYydPBgpqfAEHhYQ6ZT7BoesyAxpi%2FTGs3YAWeOvGG2cqUwncI0%2B%2BCgx7Hzr6RG5xyEPAWBFGocNOIFEnhF1P5vKmjfSEhNwootuM4Tb7PM2DBYoZF7htn2aqAVTRbB523FvczZWkTwvGQ4c7ynsohk8icmUJ2HGcvoWNtc%2F6U7n2WF6rOV9ohbM2XmlG7AUUegUtqQJee4%2FfJBnYia89bFJ06sewW7oo86dE9Gldq7DCkTqqCQoV%2FafqHZbsj0LCjWNNCBSh99oBKDPSIafGc%2BrE7MX52fmITKXeprm8ri5U1wPZfYdxNO8Gkw5eXCca2J5OB9FJMtFxohzm5KmV4v0IRmBwo6MDwpOB9tlKsFO024Oq%2F0wZYOgw8G6ogxe3SP3gExHnB3XJRd5CFzzUEFDrZNEM4Gzbx5W0aBYza1EikihyRfkG0RFazx0vDqOYHKsu3nhYW6gRj8WCES88%2BfIbqrHo%2BTN%2FkpcNa4Nm%2BqKPpqfxQTODQ5WiOJIHEG3jF4myGC9OF6gjRrU6fZ8oJ6Yai2Fva1DsXtNCp5iehBShbN4EBoKxMmPUKKVawrJUEE2Q6ii5bqUg46ny16o4k9jG9Hui%2FWinN40RLZT0psl%2BqyhneoM1O6Ki0xtA%2B6zGq6Sxqf4F3iqHS0k8JRgx4W8DqGT96pXXfJ8HWydFkHGijrZzHyoUPYoqmbs58UvR%2FiVeFnJqSjMONViadI9YkhafnSDTfMIeWwm903RHXNbUG4FKKCge5fgUt%2Bu%2BF5OsNgHe%2B3GauYGi8iYkz0CJM9L1dCdVD6c0kzioSJg3cZQtkkY4OULTaHTbpNPVmYOjp20dCLPEm%2BzHWXJBwuoBmqdIqNiClORwiZRkgO6uCSWouccRXieTGeGMyQy2RXQvO6NrksmM9c8m%2FvzDBXppJZty0MPY1xyhe28%2BcAAAUQc8WB7fT9hTrJ%2BUsWQRZVQI8UtGASwsPyYRKMBKqBmp5Ocb6vyk40QN5xFUuJqUqIbu9ABN%2BuZAPKHpcO%2FNfuXl%2FjyCdRuy%2F1WG4H1mESHyRcd0Lyqtq9KppgTSzl2j%2FSBD6fwA26GJuQkgIxhgT29Ck4jE6k9yf6gZdBnE8Lph3we0F%2BQfjVG5AH4aitKnz0J85pWi0SKaTjuoxYOFZ3xK84qQmiU6mhd%2BG6oxuNU0PgZbyn8thbRrCYhpggiCdBDSjcEoXokHhA0wSl1%2FG%2Fa8oDVRM03F9Bu4OXbQMIoHIGxbB3n%2FCUXLWFR%2F04QrCp3gJTTYmKCwJMlgGinlgkrgcjmktICPAaqyk5w9zUCE48UE%2FuDeAWcJGC6FA9i%2Bg5ox%2BXkZQ8kH5GyhGzzSTnMDqlUeHEBns2NU8nrKWgSIWqbo42RCEaJ1yBqMQ9pcH6IYqX%2BUFAtniLi8GyT7%2FCuP1mKOz7wbcv9JxB5slS0Y5O7oV8SrHh%2FSlDNUPbhFkEcIkSMqNKAxzglPHg7rmYOXn8iXVhIpU3aWNyVPkcrh5cxL2V%2FkjAzGsb4A%2FeyjsSMvVrQUQkrBVm4AFGOEnjBAkoEk2p9yfaa8j%2FOjDGop3QaK9NNs4kdttrKBTj0bQZBvMuw0EoGaL8LR%2FEiKETxRtZGQxEjPI6fbSNY0Fbk95X2GrFmc0OV8F%2FrAT%2FeV5%2FIpU0XE%2BWr9xk%2Fe3YsgkroUY5p831X5mRAuh1%2BWIwXZXAKqqPJCis5FgfjBRc5didGWmscUeY%2FXfjotuTgNkc2G9lJRK0KPC5onR%2BbbXJHiSgRvyvJO1Fk6hYzVoaV4mHdzdUiCKF4lk5vQYxLAOkHV0ilpeuZ%2BOMlhJkvN35bIP5g%2BjYLv9J7dmzeSQ2IlYiJuL%2FBs4mVPblYJIeo0R3snxpHKoiMMhjUXCCMlzk2PLmABduTeuoS6mO5DSDQhCwoUYaxGAUZ9uqyTIJv5gOsS9NbqlRxhLlDHIFCsBx1QCJE5mP2UWJ8zNlcziwAjzKI02vfxcJOQ58URb2OouIAsP420jfgxcxxIUStnKFBMMbjUxkEgOuOrDKRynGtDqCFFdcoF%2FzISSfZvif33dtpgpiqxtwZRo48g4nxRkHhvLbQRhedzFT%2FM8OgMPVrE23OSYH87beJeGjQOexhWxEN%2FEL09xDjRt%2FnXAHLAJBZ%2BCbuRAice2bRWmRHSI%2FM0%2BXt4HiI490SDWG6AbUuAWMlXvZ2ehnlrLtx44oV0yGVkg4Br9HqhAzygPC9QJSQ5XWjeqooesdgNRIMF%2FdDxNXc6iTJOF8jWwwceulLnIkoRncMDNRD4wQTuRXJFFOds5FxkE3WqgpBCGXlIp1z3vKk6xeNgYJwmog7QXkyKK2%2FYFSYGVWMwiOSrh0H01giU3ADmjypbR%2FPdRwN6MCkjIxPB8DCm3SMqOGM%2BWp05CMWMxx0SIPAv3wJSh%2F1DB3DC6rDq5j7JZviX6twGAcLA5fyKJ6ADhPb8y%2BmlKuGIxdgBaWWIfZhbg7uC9nA55dWNui5oGyId5PJbbMzsn8qJYR6mz1JUkc8qEkZqGhVxvbX6oVLu1wEip3WE1F54%2F9CBN%2ByZstg7MMLTIA%2BpPHCKjeBkoRVS37tx2W3lIm6RVqXjJ%2FmOCOFmyaHhAZ0T%2FCTf6fykD6hAERd%2BMogzfOW9C19lIGEKBVG0kYqd%2BiqN1HN4%2BZFjRHVEL4KEzYqomroFgDiq7ECSfvXe%2FKseAgpUpglBNAMWVtUA8X5Imj689%2BtAzobTAD5cG2y8auJB%2BcBkJGl0XAW3y3OkmoSHYGsCNcSeQn1Zk2SH57uABvOBiPSV9HYRqO5SzwM6%2FarSAjdDdQR%2BEEJXWxupTCgkEDDDg3BJTPw6BcHlnsWeBuGuww9FgAT6xF6EdPE6zriKojBel6SvVKb0lPITHE3GvvaVRzJ9KBndICsHtNAoivMNA01iebPOUjNn3nE8P23DBsI%2B7RGq2XUYLpEVjRvlUa8E404RYAYg2dngmziubJIi44eJkUC3V91Iand9RJ76VyrW91SdcizF0dMwofkBCxqjORGCSldEFlEo5zphhNFeKdhRt8mazkk4Dc59ikRgx3%2FouZwqylgc3aIR%2ByqIpqlyABjOEAt08TvR5QCte5ADPQihEIxCBRAnbbQEkBcSZmk0x4vjGbmOa2uPUxjpkBoQXROhbiKOKMZ6ETrZoushvBnVuBYhg2zkdUPlYo9czvkLXHN61ucAPqHiZCdQV6meUKRHV6aVVxhkvERrtpKNIOVcsXJSRypoN%2Bg1DOfTHC928AcQvKLLMKaGbq4PKTowiHjwMI7MVfWkg7mS%2FiXiQ3kbI9lboLIhjKdR3sZQSjYw8BzB9EcxzMtuHmWotRZdtdEt2FUXa4fGAfGn%2FS6NDt9RUOEKDPIlbgPH%2F0BzlFh9y8oGmcNB1snZDCRuoC9fMcwbIoaUUykdoh0%2B9K6pmtgxSe5UC2rfRO%2BgGGgDyaFwFEZznI8RdbcdqtUHAT%2FB37DDSpVsOah0YCk8a4RZPEr2oyhAG2kUaUaL29P3OCIcRZMXFMI%2BPX3P4ROSNqWg2hU5TC5iOKwYZaXwDCpAw6tgzAmuxor0Uh3wQi8fgvfM7ohGv6rb3IiWc5NNkHCE%2Bc0cph4pgrA8oxHs50CXn6A0RgTUS3hMbYo9lDjmpkXTaaLP8aVwwd9lYB6D0%2BebTsEYwDgdz7A5UXHVHVWuuDmGJE7JYRZOP1Z3Kw1YpIZbzWsd5amNhjrgLOTp05%2BzINYXi3NoAh9g8T5e9mr9N9rJFm6oj8ULKot%2Bm3iTNMu9vyBIbxqkT1tiL%2Bq49oiCUc3lU4oA%2FCg1ZqHXiA6ogdTRdk5IagiTU7RSyu60YGdApjrq5DZyI0ALFxf6gtk9aJVMuVsihgCUqpHiYnqD1hsvUVnLH19%2BcINL7UYJnjdegAhVeUzqx1OHBay5L5XXpLwojJMf3wVsPbQ1Y4D2kQVtRlz1yrn7NPUDVt8rd01%2BejOBzMmmILssxLs1jneV8I2K6DlJ0ZNCMy7weOlUSg5uG2wqowgewss0CwsQo0IGoAxEHP1a8jLUQK2emXes%2FGkVkNJr%2B3RrTiGchMwj4KiSOeAYYKIu%2BwPahymNJNqMvfQQg%2BgoCn2tosiHTA7BVkfepyAc%2BItRBOddFYNJsF%2BoEOKpzl0kpVIVgNqsIVFcrRSBDlT1KQJn%2BFLbWAQmfx%2Bt1%2BvSQx1AnMpBtGTglYK6p5khUKpIEc%2BzIC7mQKqfeZq%2BTioiZBnQGKsD3BtV4yFcfA4ipSYdaD58A8eKqMoqPC9E7QpFkG%2FnKY4KIuQaDyPMji3e43hRAQUoVeKQJBJUfoyo79DNqgq%2F8aI%2BmZDkhr%2F1Ap9f5hVHgQRtDTSKPmCEpwqgSzZ9Ad%2Bkm%2BPct9ORu9A9DUE9AyDY965LQUYUGEXRlLzGeUwPEQGKBhfRSgZVLwqXOuOIyJ5DXtgQxXvH%2FEsQKZWrY7okiJeCpTJLK5aD1Xl9rKkE9Tagu9OrRAcZ82GYxTgweOIvuEYnhDaNucc7qwqlaOaZbvEZAoiYA9pnl44lcxWqlnULG41691%2BZqwNebCCUHhvlw6AiVIqggQhNYBnZFFJ3RQynewHBnS%2FVH0oHEY5AqX9hmuTD1VeG8JHDnBdA130chJNHkZeVIfOgZUn3ySR2HspLxEipHIj1tAI4xUoj3ccWo03%2B8PR9CV0ySeaXVm0OKaZbTsdxJM54VvCJThU00MZYVQ8xbUch1Eij0AdUilXzG3n58JstiGgiexPob30Re3iG63nT1iR3cRaRa3lkKunwB9IJw%2BivyMd9z5rAC%2B41tVVyRLNUFnmP5nRNDmH5MVb0Vmd9VO4GYot6moJYYjJpsgBYTpoDCOeI4hyQAAWC%2BOoSQpWEjJjwi2to2G16QU6sYDKrriVHVLFL1pon3oyUx0mpu%2BBelsJIWsYGE5Pi%2BqKoAp8veEvDSsWsmY7OJWDZH6JAyhgZ4Xyh77Lrp5mnefp4kUKytLFHIn7ctyqiyRCUrI%2F5HoOD6lYy9iYodq%2FNKechEnXJYyyFGZNkg03UC3X8UN5GPRst8pqDLAPjliP20I2QwzOIuD%2FK7QyfJDlM8kqa%2FFSwqlx1xfmMahQGzVohDI4asaec9JSk9YgsjAuKNi6uevVYFhDmYlYgUYK38mOUDCiBT8NFOSvP2lgx%2FDXJzPF%2FsUuMUj1gNaakZMnRwUU2H4VwtmUJIgXlZaVOIGVQ9caGU6jR2r8RPQ%2BUJEqi1QQwQB6XIUhbOHN26CxL4wjPk%2BkNnx2ZzcVAEm8q9JpVO1KX7CIr8%2F56KlKkmIpXZMEsno1wJV0kVw4qAk%2F2o8kthxRjHtnU9INLHOvYncIDDRHwIlA8r3Zu8Ik6Fy%2B9m8ooVE%2BZd4ium2UBQYjrUBYSx0KxCCCaLRzuB56daKCgEQRITiG7jKKFHDtGub8wVLzRBnzq4z0deYYBAGFQDJQ5XzrOIebDYAh7Np8LJQMIdD%2B5T6ZN2esJ84gKo%2FeKZ6S300TxffMA9iP551HTh8Kn7Z6Xy9UAaH7hsKMEzo0hzk7LhAH%2FjEYqRMPOwQEx0VRYsZU4pnh71RhxBJJCtlSF1cAk4ywgNzto6w%2B3aBYfTDwPXeQEeAtVdBGTFEllAagYS5SpGPVFmeWdR8oM%2BxxOUm4cJA6CDvpoi0WXxM1QfFLsDV0f3sYUJxhgRJpgp6ubaPVEkfscPSrYkbL0qqLHgKiPqX5FtmKYe0jD5I448svsshgZgbW2Cd9aIERJnioRfW63Zpcn5ZtvjETjjDwQtbXJt6RyHV6qct63GKL7ew7mH9ZhOoMmKAU%2FIKzxgb0h4VpRXU%2FTy9Z8zeI%2BJPsTnhKoUKHimt2CuxJx844QpjMwCGt2DocMNhHJ8TjN8itZhrC%2FJ1yngwhDp%2B1cEghiPyOKZdSfIGs94aEozwY1OEqIoecRilNQ4jFUQcfsSlGfajWUOgn7r0iARae2Lwrr1aRkBktRveiQClaMdTRTQnpOFPAnEy%2BkIDWFa6O3GUK7A9L3J2BpstGkVpMIkhQZqBxFsZET7dtpViPLxjZV4Gf%2FNsX1VJKiwfCJYiclRK3zHsNhRUnm5RCQLm%2BS0F28TKOXFCA8AE%2BeZRAYRDD9gK6nRkIcKo42VKb8A9n0kzKQpxoyIp2ozYboMD2dkJ2smW%2B5FZULIuqSRaRYSHlI8zvZuw%2FScmX5Pza%2Fon3qIFs3b1tcoLrUHV8OYvYBg%2FpI2k8KmtYi2bKEBEYaIZK96HGLuQMMzQssx07Y9BWgmPF8ofTwCAMjCRbSPC%2FBlJx5FZaFaRnAF5eNlOX8Kwnq7i2Ky%2BCe8hpkQiwlcELOFElkWossnJfAsD%2BVncnoqNpkIMyNXrD23iGJI82pNnhCToAENjhwCGoi%2B37AXjxuGaIYWxSxcXMQrng3GKxjg2CaYoOooGZ4cBQGrvJdZlNQcBDRUVyF6TKAgupgePo%2BGUQs25nwKYcfikHGkQMhDMtecFK8bCmCSCflXm8UTKO4ikucis0ezTjSUbrzJfo9ucaGqY%2FzAiGdT0VokD0DjewokguWJLfJIRsAUq5xNOZTjnBmVVY4rKJO%2BapaLyz4YdxXipcu%2FFRUMdtK0OolH%2FxUbvMwXiFVcoDJksCEeTZBblQpL2BU3HlUBgKlSvwEg4zX81BxGM1BOsJbVFoVqsGopt5SPhofKMFr5hwpIGrOMP9YAU40DVmqKsLVBoCGGt0JowUMM4ppxGNqB9HgjEYxTINNsuU%2FO2lUkgRMoxm5laFHAw2PcJA%2F8t5PtL4j%2BdYhnzMqwI2LYKaxAyCo%2BjU5zcnnEAZLZ3KMHsTRYoH2fiD81k00vw2jWm9EN49YLmlELlhKnncu%2BZcaqZZcrl1c8sCjN%2FAcoKSctYEn7GZ0iFV1jXOYy2zmIBoWhmRkK4gf9P0sHmUBe026jsrdn%2Fk9NE%2Fk50RMFkpN1QwFPvGHzgFZyNJ%2B2skLuefOwpIMQBayp15AbeinBkgF0l4hPIoOa6A1QCzgEGZ0voXDJto1ovpcdVAyI7vq6734CuWAXKX8QEWwUjgZK4Lt8%2BVELwmMKVKPggEgcZq3V0oJGp9vYSp2Qwp2ouiywVBeD%2Br2ccxvIIfsyk%2FQgBKpe1GFryLi2V27Pi48TFT2kZxrb6SElktBPuNdX7hpO1GmktSDjhVoIol%2B9MJBUo%2Bvp68BYV4G%2BTPPgOKwxPK5Gc1RwgLXBk3wGxyMDbt5go1%2FGPZVag29kBGV5vD49Gi%2F1bMZUKEMjZNuf4WRlYdbYuH9ot6izH%2FqjMlYEkptpYrtN5rv%2Bp1G%2F%2B2w1W82Tlp3mJUR9dzZcTyXrG%2Bx3a%2BkppI7Z4%2B%2Be32%2B%2BfHjLx8%2FXn%2F8OFp%2BC8%2BnyzOIJhD6fL78%2BPEzgj5%2B%2FH2Jz62d1TVRY9NpH7eGze7RUet4UNv7zeF%2Bp9t8V8lXsWNxT3MVXvA1bFXE4yy%2BtdqroJSH2qzQxa9pt4KyS9sVbDxKG2WCOn22WKuAqcZFk702FWRPnXmM7fLoKMzPIoV4RCgjgs5VRiXQJ9IoKAcStoiiBD%2BRYJrnlnjJxipZqiNXBmR3C0XWlKVHxw1vlYcdCFAW9IPozX10PTAhiZUQHyRUQ1omoRfBZjaFExlew4%2FHQ5UDQpwJv0ErtRBCveYbktidsfnWOdYZdUHIoQlviCiO5Y%2BdKB6SBQ898GxHEE2SKYOnCj4hRiKHdX3zyUL10DFVv7zAsZFeNEFDimZqiGpuFXUA7eq%2BcjarawtmO7ezCt7wQ7YNjW6AKESOKNBlqzobspU4NFypfDlpGRgS3kLBtgVbumZRK7TsjqJT2rZkSj5YPPSxy%2B4LCMYK6XmcZwR1%2F7DQIRrCaGVoZhE1w2FjH5INFB1Bu4Z5hLzQ6ghNJh2pzmwN5VU2JHvwVVgRZYvht2wdUq%2Fza3TGgU2pQJlOHCbuFHsyHZbjUMTIq0B0SxckL6IiOFcIQJ08QTvQQz9iQUP2lQfDgEYc%2BcnWNMh7U6SceaORywVMbzSWqSqm7LryuOVVJ2%2BQ0Nyxx45lsZFzFAC6HVLxRc4KFLMV2ncYC8nnhoYoIzDDAHl2pHyoh51TqgmhBMMcTC5cOm5l4WUYXYd5XD0rNpC2KpO%2BsCm3Qc6LYXhwKNDyTopqnrR4UxTgxjUDPxy%2FLZtxGAKy0UhmSHl1hLMXMSgBJhYMF2fjsKPHcMO2RWn0rPY1wM683XF0c%2BO7jWfOxqONLfECUDRN2ANNdH6X%2BTdNcLx4TLayli%2FORtENGfZzn08bzw%2FPn6ysZmPQPdJ1VPoAm3YKyvlcMTPn%2FC6bwNmtxUlia%2B3yhodHg1W9Qqd3e6d8VH9n7mgaxunVOXWRht6Ue%2Blj6W%2F53dnzp986T7Yh%2FfzJ2cSPbn7OxnA%2Bas3eLM6rnyq3wd7R3IptTeVBUwzIdoKOqze36t%2FZXmTJxWbRHbKr2kcnnXazgcYVV%2FWVXj7VNtRaCPyc9%2BQ%2Ffvxp427Ks8i92kbhPQlaXSzU4SHFVs094p%2BlSWLu7GwYBtZWLae3rcbBcL978G%2Bga4%2F%2Fqaxd%2FiED8uo5zdTnz%2B8zLvcbljVavcqMGu9N1S8qR46iXRtzs2ZAvUaVfeC8xiab1Thp7fGxtE6MD1qHzsijsPi65xkjn8Lwtrfrj7OIoA0Q44E1ToH52DqjKMIrirqD4Kvnd5zsHlT6x4%2Fbj8zyH3TUo4n1FY57%2FiJxk7ntuMcpDzzu5cWvd9zj7PczVdg%2B6TuNBAiSUWCsNLQ9OETFPLwtBNLrFVFFNYtxAz%2B%2BUbfC6i0Js93KDecpz%2BL2Ac78njmFrQcVmkJvjk%2FxiIgEv2BSbGy%2FJLtA23%2FiB5sU3HaTse%2Fz45OzPVJQzkLHg23yv7tNhOA2yi3jD5CH%2BJjTbwy%2Fv2XwE2Poxk8RTKdBZ1uZYdy%2BIG3%2FbXzPn6I3CHiE%2FFTWbLf9eOFso%2B6Hs01%2BlZxtaEmKv78521phaxtFMbaTSx%2FyMt9sm9hk21x%2BkEbxzDFsfm4Z%2FVeieR%2B9cB7tOo9eOo%2B%2Bdx79yXn0Z%2BfRD86jvziP%2Fuo8%2BhskYTKkw9uPdiHHLmTZhTy7kGkXcu1Ctl3I9xLyvcRyIN9LyPcS8r2EfC8h30vI9xLyvYR830O%2B73fJIjYcRZyrF87VruO%2BcFz4fem43zvunxz3z477g%2BP%2BxUlfOOmuk7500u%2Bd9E9O%2Bmcn%2FcFJAf5XJ%2F2bk7xwkl0neekk3zvJn5zkz07yg5P8xUn%2B6ly%2BcC53ndnCQSeJKJjmPJrCh6dQwelL9Q8qOIUKTqGCU6jgFCo4%2FRvmoYyYE9s8xUZPsdVTbPYU2z3Fhk%2Bx5VNs%2BhTbPn1JZVPh%2BAa2f4odMMUemGIXTLEPptgJU%2ByFKXSDZnH2SPzNacFp7bYTvdCBIsMJrP8jN7l0PqC9eU5%2F6ztvP%2FRaoevsu5P3jQnMQr5w0Oz1fs9po6JnAKG%2BeqCWc5O0FVonTeek14bC9vHui%2FUv1GNXPV%2Bq5%2FdOp0MfOCAfPAf47kGr33jfcoj93oJ532o2nRZexGHiwJ11IgclYuEBEagrRuDxAc9LAKQnxFE1HetGT6i8MXNhSTejBYueRTEQ9VrUrrK6v4ZJb4Wd6hmwbG0XXU3vZXtLGDF%2FbwnxYAse3m8B%2FM68TxSncPoJH4HHj7RICT34HQdn0afz5cS%2FgrJghJdQ3%2BWvXNqvbhCz9eKLEUbLkWAE%2BYML%2FAmWQeYvg%2BuzID7fW86hYgCdTy98%2BAmi5Ty6CvHnE%2F54S3R5h%2BkppqeYngX4LwVgGC3gX7yMYmhSHKXx1d4yGS2T8TLxzkYX58vkYpkEAUKDlFqfxC7GYoJRwYmqxw0Vcp2MLpbuKKGKnyWT8yVUrxQJwqvtRbIcjXfPpuk59gclbiZ702UWLrM977flWZSdByk%2FvCVersBXAB6ceek5xPGxVZS5iVYUl2TjY0licUu6JVI5guvzIut4Ot5djq9SgqhqBcn1eQ4LGDYpwxbcmCQHqMZNglImhi3OgqyAXet8CY23Lvp8GUxu9qAiQXaDv9cUmVf6aY4VheE7m4bpJzbjza%2FiaJaypRf0bhYUOUJvVooUxXI0fx2jVF38p9q5RGXgBUWm83QZ76FARpE94WpXikioDQm3gewQL8la5nKy5wG1sTybeOf%2B0rsYYZNeQIXhh5Smluh27QZm3eTiGsZtspgtYvjCaLRYJgnOy%2BQ2HMOESm5RrC9Ypt5vEEtnHk3DNBhtLpbx8vrMj8%2B3IMqzMw09nIOuny6vYyxxa5Uh%2FsRAOSalCiiInPrhK3TrhTImf3cAG33roCDW45R8UgW3jvIKAEQZYKyRCxQUmW99PvFSFH9A7o%2BNzteMnLO%2Ff3u%2BufcN1enJoy3F1vnCo8EffyH1uK5T8bqH%2F84teR5wai%2FXju5YVyPr5apRtyQWd4eYIfzDql7nc%2BGL3CpceDe2lJyJp1lS508f6q6AtWzXclXwXHkcWMv0%2FB%2FVzSwl85W6Gc8VdDYCfJS6K7v8F17AZ%2BgDhTAk%2Fjw6xzgMRRn09NUDx4SHAy0WELeffWuuUzdkQ36lr5e%2FXdKt2ERl1WsXjnvP8GaEQlurqsZ1OhtNz7%2F6rKln%2BqC%2FCq6ck8DUQVuSNM2jFO8B0FV0OXfh%2B%2BDjx537ej%2Fgw%2FjX4DF8cmMrhwHgD%2BUvcNFrchcg8%2F14C%2FhGrSMEL7zyY%2FTMBdNphKak0XyHtvSRFMZ%2F0QYVWR31OYEPBNpxdXrhRTHaM0iA%2Bph7%2BYUnmyKhuUbuNYoSKgXk5qLJICBNZLpMpotkeIci8OS7Z%2F4WbvbRFH1POykZ%2BU%2FQfR9fHqUXGbpKD8k2IPlpIPNVwYQb5LOuSh5MMvSJd%2BGivwK0ZIRFo%2BbbxIEPuAlZioNGwP9k9h3tX7jQaA%2BNiSV0U46d5k%2BnqOlE%2BkvKQCt05DXN6ojs6cd4KU6X6Em2WCildWLwkEw61h1dl5PRZHfiK6FP6lFSh4lZVpVM57KbbrqHG1eM8I%2BjC4ULlGfCW%2ByaWw7FaHfrxifLan5cjo21XSUqMgv93zJPlz5nH7v00sSbLyIeIj%2B8Ir0cdR2o9egwX60MUJX0evVKUVv35RzilH74mobet%2Fk0QfDDVrQqeK0FjXnrRENi8pqtruEoIi4qStIjlX11A46B1VHYcMd4g2wC0Q%2BqCQsnJiR1w5cGDH0RSBBObxMKvWXWhQ4rBgxPGiaBtkFG8gUMviJgsAokzAK6DgVMfgA1wUwgEjkCBqvYBrNUmheYhJLbGAEWX4pvxdhNRnNbBQCMarUmlJ1ICiiKhphAX0AiE5CJ3vbg5GmCAlE5APlTExZOZrHw64bgC7yPsCWEnh0OSCiN7CnXVjBhVZkQiTpeuYEJuvHGAoTmTSRQlH9j9t50HKbmB6YoSC1ggReaozFFW1YmLDJnIErKyDECqOXVuWtWGYF4IDfAMy81OwFAtuEk8Mw3G0RgIFUkGAd%2FdOtOJmZD8jSkcOxp1s8H0cy8oEUwzKW6z1CS%2FSvWGYiWVT0vtr%2BxmMXmqCNUqfrZUmAu131eJ1oOtXmyvX6WdUBg6xgsrjPbiOGqqasZp%2BG%2BZ0%2Bzfj6BCVxTHKREAvXNkOowYUE0MkFzFPA3gdA1Jij2xNCYn4QjvwERiAzNsohMorl%2BNBZLHS1AGiAg0k1Mgk6gDRDaIjJB5oIMxmQQ2oSSBywT6IcmNiCzfGbl6PRpg1n6G5adCUEJOBNmAkyPqAAwx2hOJlJN4KXcfOfJTPY5AGF%2BSWA8vpLARBA7c3PJCtwYejdm8QJ1h4LOiASRYNnNESSbKVC%2BuFnZiDIzz8IVeweCgJA1of5CgASBtRCUC1nvsMHM1UM4CyUgTXiWmNP0t%2BULE%2FKbCcjgmII31ib82gSYKzaW9C8Kg1pAcgQQatklFdjsZwRbehVOduYMRBMaAmR2INuiEEA61QhoIqY%2B8xAEkOwqCCjqlliab8OA8VxmTFxz9eBFg8mn2Eg8z%2BwzBFnKI902AZzLVQ9AueoBKGZy4olpkNgpm6SO5khqyITESgwktcRAUruhJ%2FYNPanbapO6DTW58KcSZuu%2FC1v%2FXcwtSwSgpEUkwFk6kcewROyASeCJbRlrLz9PQLR7KBIEFYKeEMaiSmglScBsSAov5UyQBWFYNjiS%2BhawbCIGOzOpGFZrNYG3cwtGURd2EmrZQwBqG7TbxLbqSMlVAm3jm3qiAgiSizYV50yAmPWxEBQIMncZ0T9aWdEAZyZxlFmJo2zuJmYfZCg3JGAW5kYWWkYmCy0bbRba1h2qMop6A8zs1Uzg5czSW2iaT3TXlTi64r2tBbQQ5P%2B1G6bkJlXAxeZxfSEmHXnPNWGWSXQjdvgbQd3cQp4CcC54Y73Wm9bPeAHbPmy3esgi2zmbZG5wM0%2F8RTiLzz%2B%2FeLb78vcd8eJJq9cZ1ullFWJzO2cfP15vnz%2FdqVQr19vSBWwjcb%2B54WyULmKkxHH%2FdL%2F%2FpeLxZ49ekxTB52pyce36%2B4atismraktXVe%2BoNXjbPTDrpyVDn%2F8EH9%2BRH9%2BBT1ckRnd2cm6w4pFP0IJ7%2BXLTptsw6JlfTsaA0V4hZ9Jc%2BWStmj6dPH2F126o8bjJgc3tJ3sfP25t7VmvkfT33jdqP6dVMaufvFvMG2rz6OPHyc7aIt7E7UW9AcBhQuLS0Sqfe99sbJl6n5uvXpGO55OlofXJCU%2B2nmztPLOUuOOE3oy04Mn6%2BXMXHYWgRjjqkEeOexX5E%2B5csi3IiyBR9yZ8e2ct9QTZ6S7d7DmBf%2Bk5j3y0kf7omfOaAq%2BfOV463pbv%2Fgead6Zcq29h%2BPWj7863%2FmNmNK4315F47obBrfPoR7yOcR3UnUMTe1RPPb50E0SuNl2UNEHlNWzj6x%2FxKue7H0Vtq5q4OCy59u2P59D7j36Uff5FV6eluxRcFiuVGFgY%2Fb6KSLWTGToO%2BgFVBtUddPJKZNBCtSm600QBR1bZdPWtNduLYWEelzzPbXqzbWf7b1vPsMtFeVhO4LG%2F5Rd7PAkTZ%2B7fIAATafOm0UrwQk%2FNUBg658X2Dd%2BtmUtSI4gXeyhHhfff%2BDM8h4UykgvUaJSeLcpqCqAv1TJqx9Wft7%2F%2F61bdB6H8q73NF8uz3fybTzZVHeDzW3uVlK266oRR%2BHz1QFQ%2B%2BQLK%2BwsW%2BpchakdZyqxmL2tTFcH13h3BC7v41m6ev34q361xVdEea3aPB432sbjpsqraVz5EW2sFAhj%2BbsLhoNVpH4nP7XxTXckklGBClgKyZ0AeG%2FENI77D5ijQbzbMvyme4tEcFU70a8%2BPKytl51tzj133Xdn0k0a71zoYHnRP9zutYQ%2FVGDcXZKDoGZm6f8Z%2BngFMhMXuxpbz408GgqGC5v4EXST9qPP%2FmL%2Fh7CmYscsRkL9S1ovLhRtWbImVpI3NPbxX1rXe2BLSfNQQY13BSyQjtNRydDvnW0%2F2TKzNrfqyd7l9VZhBopYTy30gF4Uap9oBksPy%2F1Avft2eQBL2oHXYOO0MapEELPjK9whpvEV8USvMWRFVMJr5y4%2Bws5ut2vlxnKUm8HPufJPNB7L6ThUtVjuWKe0K6LPZfXeJixZUgoE8jXwrhPIs4mf6uPHb2W%2FXNzELRiekcLtpVgD%2FiuOHRRC4gv7%2FbKZKebh7VedsdXXO%2F4er83l1dX7%2FH66ORQb3DhHdP6w6%2F6ivikVF%2BGtWg9QDkqe%2F1VfAmvTVKmAR0dYftibd07bQ%2FWrzeONxXW0g6UHttJhJWmFB6Q9u505xIrYdgesPZPdsNAti43dwktu03e%2F4WBVQaXO1InzEW7VZkILvDF0sq641Bcl1pUndiTTqd5a5JmgP9RgavQHsyEhrPHU2liRqvkkc8yXTFEvilC%2FVVdESL9NJ%2F2e0xR1gNr8kfkrFaNKE7fyrYhx5J1%2FttNotT2xla2z2NQNa3mm5F21DuVK0nUaApJoL5gkLFsJpOkALfIZWXV4dPTImSb65kSzTeHkL1BlTbJ6PdmU3t7e3ywcXNMwxdhdoHlETHVtbVklzriKcDkh4Fq9RSNw2mPtfXLENRRXo%2Fb%2Fuw2uXdaYD5w8v67MO%2FI5lyaKklHtl5r38ItzwVaaSVSdAcVWzYIJCyq7Wh0JB5jlayMnlUp0kciYRCSSPUWW1tjA30e2tyaPx6eZ8%2BVu8RWhjx4ZRjZ4TiM7ee6oWfPRAJh17T3MD5hvtUPftrDMFcOzhSEK13INR53ryY9Va%2BArLFT%2BN3%2F2CVUoV3L27gqpe5QUb3rdu8KVN7pGt2g%2Bufv2MXz%2F%2Fwtc%2F8%2Bu%2F79iX4pdvjSsOTVr42lyBVM93pd0pGzk2GSNNwWyWTkB0s0B3C2d%2F%2FyxOGN4NsRBb%2BJqw31AlK%2Bv3NdrHBu0BIDW2vGRwgO%2FRAxZhZtl8ayalbPg%2F2sZnis5Zv605JUaEGBEjq2iJe5f7y3B40Bg0hsNH9v6B9NbxgSUZppR2V0uWHX%2BNAn%2FsR5no5xX0zArK85fXr7cFvVVUS1SHvlSeF7x3CF2wlcuuiJT5icR1LVvLsjJqSi8w4%2BM%2Bb6zQesLbnGpja00WLYS24sZivpbJosrtac01jbUNRdZ11F1QReQraLAVc82mx1akPlCbrfKZ9XTailfup9lWt3qqi%2Bxmbgzwl1mqkLKE%2BFdCCJuw4peIFbZw3VczWq5xyj2OIoN3VMXQJf3u8%2B6zl7%2F%2F%2BPkF%2FMpa1a72as%2FgxLpfRUeoabBmTf%2BxTh0xdff37yxHZEtVZRm85ezzFy2bjtyVjOZWlvn9lmWpX77G6gwBr1gXJiY8dE2qwtdcjpi7Tiftyy6Vaw%2Fua1jIOyMtbryEJF1laSbPtLx255jqthyeHjcRN7eP2zb7fivqpi49xda8s6m7ccmEo0XWgiRTJJhacXp80Or1m91ea6iNcBk776obVSWlYqzI3XozO99rkw7bOUlcs7NbDKN2Gv3%2B1%2B49mkfL3Aw12ujB%2B5Nlbo46%2Bf%2BlQ5l4Xrs390%2FbQB9Ybq42yPhTR%2BhQELifCrFlMgZlwE4sIviNppDUR5D5aqMvxHIRJLINXJFtIHVGCWZ7V8CE9qqEND0hEdkMXKGXaIWJtlua3hJKeodo5siAyZE5ck0JeAtE9KqEnESmqkJ%2FZuaxQEQ5luHqSylmOYCWYel7Qj73pG0A3jY6hwI4%2BNAFmP2gwAug0x60eo2OnP%2B4aRulkXlnAxZmQbDyA7Wa0otsBNu4Udwi9q%2Bk9PBCOWQxwDVavFbFT5SaM6vumQOdmvZWN8jgtVmYi%2FwpszChUOSi9LgrtCPI6L8Bs6pRoBCVAZqw%2Fz%2FZDVLLzKIoxrYZRXWksqvUwBAqd6kUMbZrHXs2tWMBs4ony2rE3sITAv42EW3Uub0SCppSN1doJKJDOTFNhDqZVWWHKTuz40KLWhJZljczzqXqJtGx6MWZTZA%2BI8kitFbh5XZbAmSMulUzOBZDAqLhyYVUMBHae9GkZmWvPBwiFWsc%2FO62pVprLVWIdZvMs9y4Z76VGzlUF73KUV2FOKhkrpi8%2BfjxSZW4ucOnjrau8W2MGhvOxrc4f%2B0GzazSLY71Ctp2mjQtv1fTzU8a1LaRapKTRvLKo7mW2t3WR57ac%2FoO3V16wXSZZIDJScaymvVexq5W8gSQLH3yraRLaw%2FnpblX8v7iT9kZAuMwh43geuq2bsPs9DurX0d7o1QTVtgqG45SRuNUdpbtrkzTzM5L3UH3rqPJiCbWXS0HQSaY%2FOTSIaBgLd%2FhjWktS3586CzD7s1DQCz1NdgHsPeS52MrC0EnPpSNUPrImqwE%2FcYXez%2BSfnGOiuboFVPNs6GdiODGhNaf%2FNChjd0hP%2FS0ZZSXFBmjcTQRpxxAsgZA7LCGF8qxh7z0HXUmdQiDKDtsvGs62icNGozKktUeUPLtYEO5OcEahSYFUbIZPXzjDN%2FDPMazNtQD6FCoM7kSnLnxCB0HT8jPLblXip2Zl0698AqfuAqV9ye8LEwcdKFHP5QfA8pvpvK7g6SGw1kXqE%2BoRTPcazJ6hQHywO5eJ4W%2Fo8JHNn84KX84jZScfBqpT5GvG9aKc274K%2BMojrKU7WehxWM%2FQnR14URQDVZJd%2FTLpIRjW2t6Yv2znx%2F4UVhZKZI8GpJMex55svE1FbF2vl2hBlVDZqyjfNX6%2BaTX6uPA26XftYcW2xa%2FwsPeZ6WOIWgd435zB%2B%2FOzRwrtFdWSbfi5bVWmch1i4CWZmWOCO%2B1yYEQmgXEpAXSz%2BjOE9YoemJ3%2FBTFE1wl1FQu%2Bt5Ssl8k%2FWpK7pf6y570x0q0bdTXxpq04loR%2F%2B5WptB%2FtExkwh9zYW%2F3rlJcNbweDoXzgrU%2FlBeysgi7qwyH5C9iFkxpRtOp5%2FVpa7rv1yvfRTk7bcz37kqhe7yPH5ndXPms%2Fcwk7mVL2EVgHiKXrI6gynf0Oa%2B%2BjHQtfqBOuvAZlMk6afQaR32FmjeV%2FASJTzDG2SJZiv2z5z%2Be%2FyQxNL%2B9CkXDkLjzxIqjWTKN1RM2hQ8opA3qbpN2njgfcGskL4cRCvPkIpUTOnUSoUD2HVOWsrpwr2A3hvP%2FLbwG06UyPLi9ooFJdBpA%2Fn5Reots4E3yBjhPKgT3%2BheXxRFks%2BYAQhI%2FK44gNcfcSiWQXzTdONcqI6WJZCpl3kki33GWj0JeVnVX%2BuhlKKx1fGJty7pn7FKrdENXHrufP7ebEF95kKyTSGJbuSrxlfP8J%2BfHn2rGWt8MI8Ior0OFS5InPxbpciHWHK54BVo2%2F1ULxZglcpMg3GHZVbg24oj5JadH1s7ffPbqx3P7qZZEXqPwdk5uSPWBhQiiVaTO%2FRpqlddcb9xLLVljtPBv5YhxO%2B4aNaNB%2FD2xpdsMQ99zjO6URVtTGm0FN6VY32evfoQlANPh%2FFzOg%2FuPn1kxdR6097lN%2B8uacc3qGlWmlWQbIMuLlPdrDpy0NoV%2FqLWNp7OaZWmgpld1I2pJuHv%2Bco46CcT1Ve6tljpWcXE0R%2BLhnJxw9zebUWIEP4x7owpei2%2BDedfg2FTv0aTdITdIxd2HG7rB7SfzJsJicjg0r8BsRmdMtiAAzJs8mncCll574uJo5IeuuHgDQj%2FwxN2ozX7xKLOYpsKTizCTLC%2F3RNdZLt3G0tSjspsu7uGCQN5dKl6R2GxI5lNcVN7TXHEMK8v2SXn3NcaDvLhPRC6R5ZoRwNJOHUHTSNi0U0Y6JJTt0Au4zfIxnG%2BuLEaSxaRCUOyPpOXkBPpHdJs0nxwLuQ2r%2BWRbxW3Xm2L10KFD3D1b7H8r8TgB9caZ6J0a68aLwBULbOrJ62qbna1pgHZkxNs228XCaBtyWU2QlZzamMWuNDobR5mw%2BZr4BgROcIJxZLH7OgvldPTR2I24hRUAW%2FcD1Dpn7fZlp2KNWS97fVjQMiOykQUQdVzk4ge4OY99czbY7dhKiLBsCyD0qmiCQ2kn0Gbx1hM21AKBNgCSyrG0DBJp%2BZiwxJxqFmu07mIhP0D3bQKlzNHmlQ%2Fn108yyYuF6dU5IF2zy5D6svUZchpMkJAJsdqNjka%2FylGPplOJgsUKYw0tE2gxRys%2FmskNzLJtLFxphRRgqW%2F57gJIVCmcB2Bh7ngRma6KNtCNqdxFFrE%2Fl7RBnZCQf%2BUDMW8RHhp7k0yWbZM%2Fil1TMAO9nZmTMIbyxASoMQNrNe6KQDlnY%2B8qEssiRrLShEVC0ARAwUhaOkzc1E%2BmvjBESO5NTBu9NdZcA2GM05ubCFvO1eRCyLgkkegfOvhLWIob%2BlhU2nKdYDeRaRFPEkg0hd0pcW37FnxmNhNLoc6yZSgXVxbKQtm3iwDaUG0WWpBJFso%2BzhYTS4UWls3FYrMykdVOZPeSSSP5EbJuaYOZq99uBtM3p96VL4TxrFYsPbGMraJjvkA5CBJ75LV0woDmLgvAHyQvae4yCXb88s8rP1wvqUwHtKE7M4dOwRcLSadyErNV65KI11GTmAkaiVNqCHFO9KeWxnOS1Sg%2BJ82FEK%2BCi9FkOEvLieWnElGCsKY3Fpm92oAmxJ6iUjx0NluTZJFUzJMCST7oNJvZb06zGFVWCZnwJHRlzgXbkMmelX0qy57RQdJCC0r60J%2BqqV0Hj2LLjLBOE%2FWCOAJgVnkumAJ1LksV3ASCRbHMDGALEBkaU%2FExnG8W8Bg1tmCSQvUs3osgSZqWRjQ7dCcT%2B1t5as2LE386XfEmJde8igTdilcpueZV2hRXvMvplpczdkE3TCNLqrU8yIa5rWkMXFUYpmXCZ06R9ikKvaGFgIPt2f5JTLCYB%2BdK6ubZU2U9VEJdJSbeGLmNvyaiRC9cnQLTxRdcv0UU1KBcZAb98CcrcMgF2tO4gmbnSi8QmXRrY3OYJtREXGmlHn2jWUCm6stYaqvI4iceYDVBpUg%2BjHn0DKR%2FFhPXTS26KwuTel5E14IYQ1eErtiA0ea9YL%2BQA3BzRvlCRcVi6V%2Fqo8hepSVswPjIap9DKo3OyfYkknCzJxG3ZFUGKz1ZeXlVDsCfNVUSm79KsO7xKi0Lr2PBjmABqToCSqVa2B8qpYZ8Ual22qHmW%2BjycyzqZ%2Fc%2FZJmAARyDzJlWWzsLtWOva2wp1eoGwuZ8weIGe8NSXgYkr2C5JbZ7DICmYjn5if3ywU%2Bs7Bs%2FsTJwgGCxHVctjnbSyFY1gMqqpZG9alrMU4CtVdOyoPfX7jje%2FVenWtgauh33FJ8pXfHSLY7DVxcOcWEdvj9wkJPvKB64Q7zY5e4Lh%2FmqDrHyHMVR0uKxfFZ2%2BHQMmavNwD%2BWz%2Fn7Kukcy8X0XQoq%2BCdUUCx5LIosZiZ5u%2FwwKYg6n%2Ff5UNRZRVxpMvELRC%2Fv4Yn7nvW3m1gsjCz%2B79a%2Fxmd7qf4bVmuNK005frX63ynIXMq03%2Bk231Xs%2FJlZ19H7uKuce2p54HX6V5AMIBHC1Lux6XgUiQ%2BUEih%2FZD1ZgfyNWpMRrf6gJXyH2BWRWAlpc%2B%2FHjx%2F7Qj4ROotEKtOIXFTkTuTJx0DuowJPFWE0Ryv9yIhG3ddLWJ5GUWe%2FvDI9twD0lU1YbOdRRQrTcMhQrCNjnb1U7kn8kbhKZUMBC%2BzCzL2f2YWDdhPV4xq9fw8Bhx%2F9P9irT%2BDHEaJLO2fO%2BZNXNqiAbT%2F5H%2BhwI%2FnPBRpfeyhYL%2Bw%2BIyCa%2BtMf3iEr2vynL2hzp90fWCfel5j7qFE43HlugVn6xdIzZM%2Fj2cMrYCn1SwdglAXiMvq%2Bfb%2BKEib06wyEcnhJODpMDdHo1RrEFTl%2FaTe3XuJWY5lvLZLl0lSTsQ%2Bb8tL5TDPgvOoMIG8xBtBAlQ%2FZwPM97its49ABN7YdHOEP3LxV0evt25i5bsumY77W%2B6CIwAQWL1k2nezqpFzbU9ZTm6uZSpbcknd9xopDix30krbzrNYs0NZaWgp3XL5JGYipyZC%2FFTwh4RR43Su8SAj5kH02iwDbKBN3H%2BHU4otYusa0uPXzLCaGxrHknNhu8W2CkxaJnoUXz91QSkDF3gTWiij18rfME10G8983W%2B0BGSMkPiRoZ%2BJd7RC8AMubUGXV0VwFd4p81x7jy64F3eefhuefXz5D321YHfjFCpmI9R5GJWrVGHLR8w3TVP3qfeIuk%2BorhcfrzswrOQnrqidW%2FDup4RPZVtrarpf8r9OsLNQuZdrap%2FKVSqaFmqnlC6K9xvYqif70wk%2Bc5JpsSSdQdIo63Ke9Tsnd38RLUWQ4nGlHYw6LL9wxzrlLAZzF50%2B3Xu3UMLlYM8maeLfWxB32hitTCSbEQzQd6gy2%2F38wWbmL8eeXVRwcykW%2BHT4v%2F27PaChXrDfLC%2FcTaCgBCY%2FE2fzvZ85%2FP9m6Zzv%2BGyvHRraTp%2F9LTXkCNKGLpgiBqJhb6l%2Fp9Cek2LqNawADz2EhWIxXqpKTbJSX%2FWRVyZul8qj8LXo8EVZW1kEB7ZN7LAIbZx%2F%2Fym0e4c%2Fk8%2B6z73%2Bnyq0b3Xylw3%2F%2BnZV%2FR3cbps1CPzW9O36dBjw9u3w3P5q9mSQXk%2Bvb8z2rAfGV6kRGXmON318F9phOB4BvpiZNUz7nYSbMc6%2Fj3r23cfN2JFskaJ5hni%2Fx2iuNpbCPUa2eoqhy7fRVNyDo8JO1Yi0VuLfJoQppYlOTyRtuHCvqjhPOU5UPeWrkS3eT7JRiD2yZZ937TKW63db82oqKqW1X1oIR6N%2BXykvKvba7O28ZallzlWbUVdv6jrZfoubNOmTRfXq%2BsmRrSGa2JEAbLCG1z%2BdWszQreAu4aL8CW8Gf25gK%2FvyBLAUqdj2Ggj%2BvYycM%2Fn3SkodlaZQWIH%2BVoN0fJOx7U74GYEJgKJNfyCyfyGzfyGwfyWxfmQaRkDkgmHidoFKsSSohjC9ci0CXvMQfW6GLiFR4pNSQLHNuVhzJfgPkZkJkXSpn1gqnmvyQhRfa4DBp3XgmRO283wRE6kBGsl8yG9DSq%2BPECryQIq5jOZfGFpE2qo3t47ZZMp5EmWCRcRH2lMxW28xaXcvc516xVY6nkW1cUMWC9CDGX2Zc151MpAawmGFSzM4UOBn54i3ida3BXlpTlRa2c6keaTNpW6sEG155sVx3E08q6E38ZOwKBaU67VH%2FyoSY69GTssfrqYmGQqy6RktUGoVlA8KBOWEsupt2PU0DNPNCLxZqULALxRPBz5SC1hajtesrWypj8yZciLElUo%2BOuG%2BpaLLUPpy749gcNZtrqQ3ybW%2FCRC5hJ9Cm4xeloqQaFT8TYFHSM%2FeYOBIms4WYXOz6YhLGnvk1q2paAohOjPs6xoIVsqoCUw8O1lJ5SJrZTrOFFOyTknJ2BSWzKlbFobWVhGSf34hxuSWj2asQc722TpJOpBxuOpGfBaAXi6H1EjQAvurT99dQspe26lRsilx%2BsfnmuyTjcBK8YjrWSLlDXq56fPuarofgcNDAq33Awc4idmdz18xRcXu7XW8IbNvqELd0MNq975l0HU5%2FbqfJff6p8fy%2Fzj9%2BvH5i4azXGjMs9WVxNbixseP8%2FhBW71213SxXd2tvY6O%2ByhvmVcAX2RheWVuJm8p1%2FfhxdKaq%2BhSNN68a4oeMcB1jbaXhrNUc7YrB7hdnNz%2BT3VZ2A3R%2BNizCT7Y2H%2B%2Bd%2Be3s9Hzzr8vdH5bfv1z%2B8KetrT15L2wpOIJS%2F0Ll%2FaVU0vTwS8raHC33t85e7GJxuw8t7ePHydkQfu4oxyxmHeFGwe8r57mvYIQ%2F%2FxqsC6s8hP9QaQh%2FfVkI%2FyGSEHfasDYm%2BAZbbzbXi4Vkt9C6FsKWQCSyI%2BAWySNB3dFuPhYwqbquaZXKfKnkyHdRs8Vyy3esMg2OcORifqLYbk0Jux0njYB6u%2FICziSc4W64I3FKwDMjnA8RkXVlT%2BtyRAIZCrLyuktJfbKaLzP4seVTZDHnjWUIKeHIi8cZGgyxJw%2FQALgpxZAnxp6l7%2BFQNugedeRMshyl6PBzLJRhHYsVFDwHoLbNRRQIcwQ00VCLqZGmploV0pnoOGDStn%2Ff4qoEoVFfytCtlNwhGo3J4cpaVV4LaiwNKwFC05GzWNfW%2BSV0vRh2EF91s3SRpQekCu6FY2EdgzOSR68mEDtCxM%2BxGF1zLNw5hJH2fW0pMCDHUk9Opby3KLLdsW78tGEyGxjclXMCoD9bcJKFlbNqRY7d1D6tpOIlMWvmqJPz3osTvJK2pOPlTkfau8rTjiwzn1N4SiZ904FPwSN66yYXMi2LUdihbzEjUqQOfGlyETCOt%2BibnNI%2FBEkJVpTDVsqswIYFl1kx%2Fv806sOUTLoT3Zj60l5hDu5HmTBBRonh5FCc6R2ybHbp9bzpQKMomUEo5CIU8GYg1JkIXf%2Bz3z1eH49r2qYhuOoOMdtwbtvgyIRrBlEi7BRRMq0xG7wOs0BSK5STBsCH2EEyAc2y7Uv8deEm1k8DvO7TkHRhHRpMqBkUvDlde0vUdtLseMdP6uD74sKHwIfyhoDhNTaCIalt8vgJah3amg3cT06EWSwC13QQktcKa1qITanRS%2BAkGVyYqqKYAPUcRPZeshEWAKvLLKwNIjSTzQVC39pegNe1ShoBcZQ5MtjBjy0mcDnxUK1%2FW6rNapljM1CmgC2L4cU7CS13cuDb4dZFoRMGFo7CSrJNqVerXe9%2BVJ2430OYNaPUzNbQunEjE6G2LqAE6yxg3k%2FHPo2TTEgAKeVw2zpJXQvVUUfEWgckjawIP42sVU%2Frtpk0%2BtmyO6D6luWTCIX%2BHEWWXdp6hEvj29aVZWtGvpSFfsjCxJ3CoNDtl0H9Spxfyc3Nq8P1nPUN708npl0NxybGDsBPPiOUD%2BJUuw24ZnNztOX8%2BJPzn%2Fw0iTJrjz6Pfv%2BPIcBTwymVpw8SZmkftlu9Ya%2F1pvVzyTPR8FwFXjz%2F2%2FDxc5tnok63%2B%2B70ZHjSGLytO77YNHnV4SX0rp2eN2vdLDb%2F849Hn82q%2FL65YwFuPfnpP1Zj2IUvjsHb4Um71Sx7WcImYGexgOLz86c2Hx4PbsRmLkO4veTf%2F97a29l89Lmo0%2B9be9isMgD1k85IZOfv51ur29Y9afUag25v%2BKE9eNs9HQyP2sen%2FXzkVp4GN340%2FNKZfuo28g56akswYP8w3%2F4H5lqaQCP%2Bk%2FmWId6%2F8dwE7OyYACP%2BjVnkN5baL22VI5j5PQTuWWBPDNj%2F%2BT%2FlyyHpWUYPVd2UQre98p62cqxX8nyrBv2Zs7O5983zrZ3a5b9y9bMCe10VbUx0y6x%2F9Lns7r7X%2Bp1q9J8vqxG3ra7z6pW1qtG7uhn%2FRh66wj3i9qAgpNUjx%2BDCc6A9P205fuJkiTch72AhHkZYXWESeUn4mB3f%2BROP%2FS6h67DHz3967OjPy48zY%2F05lX1fh5%2Fqbcstxcpx%2BY8Ur7Srtjo0q0S9bLKKVJW%2B1Sk9%2Fu2uuIthZdR8gMzkL3LRae2UlQvof6NH6iflPfukQiF80XprDAY9wXqsLo3NX5akuLAlVZNVn1dnndzHFZli2cuVHyDo2x8lxljlW6P2Im%2F9%2B2yNIlzLKb4G0d2naWTbgFpntsys%2F%2FbLVcO6En93e0eNjlLkORgedDsdqQOr24mSetsekK7mcWqe40D8KyuaW%2BjFY2wpfOsrffPx47u%2B2ICOpRvpWuKs3vslq%2BX%2BEf4v89af7ndaK6u3Rhc8XtkB%2BltKDuRBwwsLDfpka3vlB%2B1WJPLutpzq1t%2BXc%2BNJFgNJynKSJWWlmH%2FNlLTg1nwqWdIsI7oilxoLsRt82Z5ls7ZUa4ZpZV9YEcIX9sSabVwbWaG3dbR%2BMLR7S9Tzy%2BYpcT1kzOj2lUa8d5ylVriwZZKpUoM19JJq7TRZclnd3Cu3f6inh8t0R9rFodQdEyx3tmzUUUIHKKvlxpcTYUod%2F9ZUNKnuXvq%2BsgK0mMAo8QYqcAEw5kUljciTCqR6QKgkaWDpXFYa9XzKr%2BtptNc66Zgzw%2BhqPWdRHG57EUdzU065wL6%2FhP7Nc%2BRM%2FkTzMxGDWyvcttJZa7kG5qfFCUdYl9L75CulFw2E3l6Vxq1x2bpSAtKwnV1WB%2FRvouR%2BTjFXur3EIbqnZzSowleQD4J8NJg2KSEsA9MeKCtU%2BsR6EkPwQg%2FyS7GhVYOFvmGxFzdqOv2%2BQqE1q8Cpd%2BytPHCT4xgnQcOUaESdjtC0AhexN%2FVv2IM9Al2SMHXQqrK1KDqVw%2F8LOKIHt2g7DCrpuaEXO28HRx0nIiavfJXpQmf5yHb6W1H7FQ4f6c0KLv7VvXLZL58421lUA6VQ3poiir8gkjlzzpePtu4S7fuFOJb4f%2FmVB2%2F6KxagmqdfYRUmfmJbgAB%2B4NrjgtdbdpD3AZJ6ncbxm9PGmxYQDMf9AexRUji9cQB73qDb7fQNFmTj5OSgMWgY0ObB%2FmnveNjotUTK0UGnfdwyoUCLdI8P251WX6gHltKEkmApTaR037UF9KDVfzfonpjQbvMUSSEzd%2Bvn1kG7J4H4PQlFmsKAHjbed3tAwZoFH3blx962%2B0A2%2FNuEfjg%2BAJIEKmckAPEzkJWDMWr1jluDYbPRfGvWUQ%2BzCe42Gx37MB6d9ttNAwalv%2B12Dwxo99RSm5N2c3DaE60%2F6Zy%2Bgepb8gP9Ziv8pNe1dDlA3wCtZp805UQxa8qJRtK%2FTtvNd50GUIPmWPZaTTkK0Ljuaa%2FZ6g%2BpF9v%2F1TLrnucw4P3W8cGgawKPVNVE7iNYl73BqTlzCQpT99SE%2F9vSvYPWkfk%2BgjoNOUHfw7mmawI%2FwCEXCrUTYyUf9MPjxpFFr7nRa75tvzdHEQdhiBR2e%2F90AKF1MvEBc3We7uGhBc8YmQA9HXSPO%2BaiM3JBZ0I%2Frc6DHdntNeT6fdc0hwFA5nC9fXdgzpu3QIgOm51Gvw%2BTq9ftmjOP0097iBoQbx%2B236zKcdpvyXpA%2BsG%2Fj4eWhU9pNKWHR4BJZEdSBjjqHOJQHDdbtYXghwWqe9cxu%2FPtuxPZA2Y3tQ8a%2B92ewIQHTayBOR%2FaB%2B03MFHMircPjs1V1z7ovhOgXmsgBrN98G%2BxUo72h1Qpym%2F9IuQ4aB3CLBl0j3dXpJkorJz2%2FYo0E7tBWhsmROtnmD1HDTzU2jO0j2nw6jP867TVr0%2Fty30UUkRPEsw6QJBCnVab2H7z1hxrBA86uGzhpC%2FT%2Bq0BtKn1ptc9PTanEyRDjY%2B6fUuZOEmxTTIFBlzMFyv6seObGgTTf9sc%2FCxgrU4HV%2FKg9bNZRcZAywLJrMLBQBOdAHLqDQ87jTdW1XOl8TsxpYAwbRFkQJNbkkhSeir1NG1aGxtjaWtxKn2vTrzAUqA3vpCK3DatbancbbHAaPfZS0ra0kzBzEsnQXBlE53CtDQY2dMsLq4mQqHXn5K2c21CaEuxAWv0tXEYrPrUdTCp%2BD53L9FRhKniDafiywthsCDx3Hh8YfNAyil2ByN2f5DefGGZCZml9VkILU1rxu%2FKJqRFQk717jT0oilOPpXztc146za9I5wnW82r4s3SMyEUI09cWyv5xIDsAbmIysE59dFnXlrJ73fV2lpZrB8aXzr7%2BPGbjx%2Bvt1%2BR%2FbTfV17NvG%2F02o39jr06%2BmvJQ6pzDdW5%2Fvhx%2B9y46s3tC0G%2BzY8ft0iDd3VldU9bK7upj9tDvlBKth5S602s9S%2Fbr76hPtxaWS0ilFtwWLPVC3kGbjhx6BbCQ3HqumrZ7ikq07CYciXSfOVU09uHpV7foH4ILNN4OA3cWW2lFDP17sVRTocPfCO50dUmVHe2ylitvmWhy6Rh823D2t2PPn4Mn%2BFvTL8p%2FD6qa1vtBWdpKtB9%2FFkYp%2BdLvOdcPQ%2F4LGypFW7Er14Z2noVJWf0trRt9%2B1e1Ob66atX%2BPsFl6136X%2Ff%2B8J11RVjFb7upaXNxY32ffOFJVqctmhvLkaJ5WiNHTQYgLA6q2u52uVJatQg3yQMuNoVDGiOng14jgkr9V41LWrNFzWkRt9GYzLZR%2Fd3ME3ac1dYvYLkvtywG2hltxdF6YEft3FPFTanKUf%2F0l%2BgNLhJmDSyNEKtHO8DkKzCn%2FX%2Bm8NIWHvaf%2FMGXfdJG9q68tJlACQhPDqMZXFNWWMEYVsOOuYZoena%2FME3L9BI2GlbgL3x5b6fCpWPjWYA9BWpP5r90YzQUmrqTSyNwLQIbYdb0xa3tv5t9ppUDRNMHr8OyOR4JIzFcKql6zmhj2a5msKcygE5DrMC28ftvqmJXUoS9nU4qefN3nlm3fKk9xYH2QceqiecxNJEGKck%2B1maRqGl%2F6Ar7ND3wvoNAr3Yn5o1a4VIXljncSvM5tbWqARbW1o3puoPgEQnIqh%2F4YkpnMM%2FuMJ%2BPaZZwQtYP63wyqrxsiF1OQi0n00tWAFTaFlb4DTvLZ2Nad2FsCyE4J7QXsvB%2B7dizumk08Hh7g%2BC6axTPwgCh5I%2BxH7q1b%2FZ9zxzLeVv1cFrqkhp1lqEE3vfoUZmLMy2IfzY1p3hxDoZD4MsuYBlZ4DfeLCmCYVLTSmViIq6sAvEXmJODkg%2FCGZteS7EhE7HqspUTetEY1PdBjPQZOmg7QOZRlpdQm%2B4nFJT6GEWBKhsJJXcOFUpmNa1lLYGn%2FG3TH0XRtfhISmvSYUmzNBxR15QW%2FgADtJYfXvdYEDfC6N7byJhx%2FKtP7FjovZYDEN7aiMG2lPr%2FtSe0hK26O1BUs8bASFwCCcLmZQG%2Bv5apBGeAjyrdKAaAplBFviowOnt0E9PiNmVCHW4DUWL1CJ8ld6MAksjOa22UEiwYnNMPomjGY4s9oKtXMvi0mAafWtFMbVfk5r%2B8Kfm3CQwNFjw3xF%2BKIyjAthahr0E6%2Ftdy%2BsnaWwtluGWkiFBlpNYJzLOJptm4EbHH3th4u1f0tDaEw9c4ThbpRxG8Ri6OrBZytZ57vq0ZZg6kTtphBMYQxtljal6dVi2WcBil%2FY%2BiGZ9YZARgJYKHLmhP%2FUAb520G9euqQKfJ3eicIZYa1WeI1erFA%2FIe1RNtn62QKkHbyJuIY9geUBL96MbM8FPxrULFhHi8oUJjMzp0s1SSxeeyE5HEBL66PTPXKgnLcDPPS%2BxmEaAtANAGxdu7I5TIAOT1B%2FL13ukV1xbQj8bJbeJxOQnojknmWlRY%2BNfmSDdkJ5hws2SYKWwMQFw2AGeDu1JtncQvQvgTB6Tel4ot6%2Be91sG86JF7Hzc8S27OvSYF1%2FZFkHPZkyzdyRxdJ9Y15att89r%2Bg1ZaBC4uUjVCLc%2Bh4XgLRItU1clts3qK3h%2FZY36d9aov6pG9m2j74UTtQxFSpqfyWXSKv5AH41lzBcWsqaUIjByJe3AH9ubkjZT%2B1bdX0W1QiJierKn3IWD%2B9xa9AEeaV3hgh5T%2BNBoO08Wqe99z8TL%2FRV0q06zNARnfUP7ErClywM5QAHhWSd72r3y4mvLuQSSagk1SpvZm2SQaZYMNiKtfxFdE8HMvWVJPaX7oPp069bH37IznDjtNKxJDTzTgNFGH6VGcZmI79soGAYKAR%2BALkyKEIAdcaIF7G%2FnI0FPoDyqhN5By%2BY5aovlZAvxn6etqhTnqP2wZXM9Da37gmSmvG%2FDTqvICUlQv2%2FjmrCfHt%2B3gdSeZGO7nYwNnjWWFtOx27onUgrUe1%2BYD9Yptu1SpzH7pL7UoyxI%2FfrkY%2BnzUCfVvJQPjCAjfj7pp7dBndnhO4wYu5O5aL9cRRbfCaNIYCEApcJG%2BuiTvzAlZcaI2wUpOdYMT3NZKqNhAprIr01qeJw2v5PTSBJrF75YkCjy6wk2jD%2Bd%2BMInpj8NvWsxPnz%2FLZm16C8SlcNNsCd3p8CbmhUI%2BPQhoNApobBmH3yamyeg0EPRiAuBai3eOMMongvGShil0omFdBMqPYlKnt%2FCsuPGKGRtwCy1TWybEAODyNzuknkkJy1ubpYeSwVtbjH3LQ2vZ%2BF27TTGNNucBXjdtIWkutkDSfYpwAIXTXSxFYtPJWJ2AubcNc9ZAPuLBJn%2BZpA7hU41DPCnwB%2BtxEW56hZdh7UxuKbzcc2rs6i4STWlqljHJrqY29N%2Bc3NnueVXqleCiVUZf7fuupw9sxtXvOUMK92R6ytAuu5H51Y%2FOjvKCM05CimgYEX9S%2FfuR9iY1%2BrCnc29Vx8%2F7rzpdPcbHcyAPVjNYtb8K3eoTV6CvY7nAh5rdPIqXaZ%2B2yDt0M%2FKEKWzwsRP%2FSvvPp5v722ev1L5ajUe5OxuPbXSlYqlsJQtbidtGkufKzqhph6QacbAMm2NHBYEYeT4LJz3adTgIHnaunHUeVg%2F36A9RkdnaoUTnQBB6czS6ptdC7MY4C%2B80zfghXiRmcDyJrZhUzZaHmr6PPGTh2tVsUMWWC1ji25VkfgwDavKR9bSsyreqNO2apy0WWp%2FlTCN3Zpyxd%2FmZuP9stlYNg%2BXzTfLZnvZ7CybR8vm8bI5WB69Wx6dLI8G8Bh0lsf9ZR%2Fg%2FXfL0%2Fbyw7vlz80tLOH6qdXhntXkGm0P7L%2Fh9bkKoLEy2y6xrs86q2Mv6aYrg%2FkyC6VLGyvQ4tDL4rbL6iPsGr89FG7v4Mgs62Rx9mZxRrff7ZoHVH8iWMxDsmq6inx590F2p80fjtXZFLpaE36K0MqgFJy1%2BexKYCsSfo%2BkqyroJkF3X0WBm8paWv0MzbNUyk5KoWnhv8vqAmkm7ytt%2Frrk%2BczmBA2IdU98QbpZs%2FhKgw520dWPWeMZkLA2J4NAXAvGOw6UhdWdXPvCcGudezU%2FDKRcPRottZxBAAHBsrLktfH5Ei8wx%2Bd1chuOL%2BIohEknfI%2BZAGybmJlwGHThwCImSHu%2Fm6XSO1h7v2G7SINZK1f9tcXDXSQ4atLzlxBE8kMJG91ayhrdSqddcFC7Fs4Ch0NrjYdDS52HQ5v%2FvuEQOSZIFbkWF1uvF2S13BxBAEfop16M1esFIEgxBq%2Fl6RNLWHhxKuBSc%2BC1xYjrxuuxtEC88druIO910UJvIbEtzr30wrO4lnw9uYU1JJuT0DWswGWvI2JTCv7Da0VdiIZ5oYWr%2BhpVIiTj8rXV495rwBXmcfs1mdpP%2FZEPNPztkMxTyKkQ%2BxPxDQ0eprEbJtKJYp4eI09c7qJGukgdR0qu15ISwjfrUi%2BRZWquh%2BFxFEpL0QAGmGVLIPgQaIKFN%2FanvqXuOS0%2FFEknvdZg8O9VOXJXyyINlXtETyY2oLXX2M4uVLymz0NrL4T2TghX9wElxx5WzvIykZkCo6GyytizeOw77sOhqN9%2Bc9xA21V0OCItZlNXFPKdHjfeN9odPIXIxF7rX6ftXqs%2F7J%2Be2F6GoTntwbN9fAwU50mX9NRltvaxRYcO4Cu%2BfNCCcW9i9WVaC440Eto9welhXsBAQv9D%2B3Cwup1A2J8eoQLy8fFppzPcb8Fh6s5cLaGLSD2C57yD4WG3xx%2Buqw8yQmrTuoO3ve4HS6%2Bc9qSCJMDfNo4POraehzrWpr1vdE5bPIKWxC7pymLaKiq39sLAxkm3sEYP4V2zGwa9UxMkHYBKjV2pzwmD9IXeIid%2BssA9bohucsXxIk%2F9LfOyFclIV9WluasS8avrOiCunEYLVTZ9HN6weKe6MDUBESlmQBGscET1CGqGNPWr6hGzkqdga32ociJWu5u0uJSspJecURZgi4ITHs%2BHdT1zr%2FqbPfa6xmsubfgSM2siLRpbPF8gLRF4cy9MXcH8rdHaWMGX7GrOxXPDnkdhGMv4%2Fly6r4lGv0qHaAB8XgN9%2BtQGV%2FXA1PppdIdBrlzBZuMfhinuWj5nzpkxqqRYm7jxfD0O6LDETLNluMu7JWVqnHT7X%2BoBs85f52rbTRJU6G69tihv4V%2BtjUj8K8YJeVIW639U72LIqN37jea7fgc50qwTdS5fuq%2BHxztNhsmaaRW6b9GeI1umszoLZZNdFoNdJa5%2BgTE2%2FKmDvAkHfZM7pMTusAKvQ9rOjlJWdkiX3cHDvfJi65BOucMq4Y5WArcY1lppm3PVECvbu%2BI6jP%2Fq7TTaOhz%2FaDCVC8bNmmkPfWOZts7vNivh1rqvM%2BnLbfzH9pO9n%2BwtrB1J%2FDNn8j264G7kUsoqEczXnOrWTahgPW9uOE%2BN%2FXFbTd3tXyM%2F3NxYbmxBlg1iMQvHL7oLN9FU9yNhXBKSb2jWtjCXuAXDv2LNVGuxapJTx50eH7R6%2FWa31xoO2oNOi3ruCy3h0ghvY1eYRet7XlGdNY2Y3vMupbhu%2BAo3KmN3brMUSfAH3qOoote7QsHM9zIP2W3CG3VEywYk1VEOxvgWlN3GGXmWoWuSJ9%2FsmdO4QNaohO8mDps4gUfMU4SXFJOTMczC1JlE8D%2BgajRxi74ZCMPDyzDhPeI3OcxpdgOyBQm9UfQIBQDoI1bXiN1RePMbHYCnn%2Fpk9AK2BaxY4H66dQIvdQLcKJIA%2FsHzBiJ0Te%2FAtnYRTb5Z7r5QQRwVNTKOYsmTNWOeZk40RU8R4Tf060Axiq0IYzN2En%2Fm8G0B2r8M0QFFGt8SyQ00RfAN%2FjhXfkxmMa8xB91hsCcKshESYxbpK6kg6sV98c4TTn0O3YIfSpwnwvXBhhvH7q2D9zPO6BZtduKFDvR2uPyzQ3dQDo4P%2FPv%2BJf7%2B8CcHZZqo84Yp5AldXGCQAmHeP2Ajpu4eQklh6AVorDMPI8u3Wgdzp8rPMHSMdfh8W85SRUNlVXH8f%2FnTT2sqjK9E9KoW9aiebBRsFm5ptvbwcU4RAm%2FJd9f3i75aDiD%2FxhP5DfZzU1OBz%2BXe4CuK87vkA0Q3wbRS05aPwJZZVSEqLG6Xyh35OPdUtbn3zeMtcqJ0%2Ffj8iaAQ8LsXnjOL3fkcpqgPeGU%2B8mdZlCUOoIGL6Np57D4eOclFlAUTKN%2Bh0%2BQiRoVuWAkp4HpafY42wyFqfucOB3VYRMHtPIoXF%2F5Ynwbu6AHJNyy3%2Fz%2FY%2FvO6Zq9TI4WS0EYuYdSM0OFD6kTUiVGvB8xmW6UB3bPDHcTcEzilI682hq0PBwq5wcGtQ9cfsFkF5RyMEh9b2qdrX96dHn%2BVBkhKXJwtv%2Bw4uaIK5jpc8zSQ40Pkc8tSVtayzslPVbLixdnNzyjlMG08PyQph6dnnSA831u%2BOIu652cvnv%2BlDBrtA2i3gED63zATSkdsEmzJ%2FlcUbGtv88xrnZ89f3q%2Bx6CnW3vw31edf7nnpp%2FEJAKSMC8Yt0W8jf6KFClSb1%2BBGAUKIxm7Exs9qpIeSJIWH1iPKlX568R6%2BietZrvRGb63WBBa1%2FQRTb9Hm9MzN4FJky6vFmdxOjlfjoFQmsReuLVSYKfEQK%2F9unXT118nQmSJNMnypL1k02qrPsgcrJXfs623ylrDn8nTwiPhBNbCpvd8T4err6IJ9skkcXa9Pz%2BDn%2BdVDwTrOpPKbRl9IcKRJpp6rZNed1U%2FSAZSDe9H0fZZIhg3uttUliVkcQy%2FhWyF6KeVg2b3arKmxTCmy2wftZBjtWSpRXJEOzMxj%2FFWucjyUjOSbFKuKw0YwRgTA9%2FiXExttU%2B%2B%2Bfa782pt151o%2BqJ5ZXevMM9VkjZVFJA9M%2FNUflwKJ1K1Q2DxYeIIXkbBJlmjO1cdzwF19puNg9oTOuLVdc%2FoxVrJUbPqm9LaoSN07mYc8gynfHymYzfO1e%2FM%2BVccyggNEvPJOWk7FguT5SPpxtiPx%2FDx5LfMjT0inWdQJdTxcJIFYBagxTMg1Me3gQ8lxZTjwpvEmAnFMwI6P0cpPqAfAjxMowyLM%2FeJvzvPghRO67F%2Fo0jJaDpN4Eh%2Fgbho7oeX0XVy6TskgOeghhB8Ejf2cusdd5Tg%2BTyEnxCKSZzUBSAGUFrIcSkKPy%2FxQAzfiCNotjP2%2FMAJQieIZlDta2hjnMK5eeGgkm6CH3fmLlYLFR4gV3SZLfCEDAfs2GELn46yhqqfQ9gQHNTuccZxlCR47geyV%2B3XDtp1dVhARj2Gk5upA%2F%2BGyOZ24yF0a4xjbES5%2F%2FJoktENm7OIo19VD8Qe9b7eSalMrgKGJv6c%2BCRK%2Fq3%2BLL5aRv7r3RHZsSHvMw9EkTnGM%2BA5snoI8aeIpK9A%2F93czrzQs5F%2FnPJA6i8vfj3ij7PX0X7dn%2F%2F9pgUDf%2FeN8Q6QOXtkbNF%2BXbzhol90d5wineMQc5G4V8RiHMO%2FBfLhkNs4HwUIvg3HiuNIwqsOyQY6o1tSKim4kLhAua4oplg5RWuxUViR%2F5e6d%2BFPI1fSh7%2BKlsnZmCS2M3Nuu5lLDgZscwYbH8BxMomHtKExPQGa6YbYnmH%2Bn%2F2tpyT1RVI32M7Z3de%2FhFZLal1LpapSqQrG14RSW6UnqB6OoJpHMERBo0GBz1KWyWJMpVknfI%2FWupRpzhbLOynZlO5noXoraO4Iqwr%2FM612JfKkR7Bkoec8zos%2FGf%2ByDqDQVnyTQCSUcqBgA6NSVhpGN140kr53MkLTJaq%2FnoZXVNA1X8eY0DhCiJo7N09fYw4GfizFrCP%2FVstW%2FZGQerQiOb9HiLDVXJ%2BXQlzDewgGFUchAlNBH%2BIBoSEhyIUUvOLNFrhit5TuheZs94Qlr3NCwRDq0P9gfCe0QhiLYqcjIRkTWSf%2FA5ILV0sREsKN4OgX1BzRr1NpKpYxLoTEYhHM51SHluASqhz6IwyY1ugUiXKokNqg4teVH91x7ZEXxNioiAnTmsSQAVP19KBx4YvTyAArJfRYEGTpBYz9DfAV8XVQ%2BFKiTW8kpDImHmP6oarm7GeJYiZT%2Bk8byqcAuwuUx%2BnhUzgcL2kj%2B%2BRn5M0rXwqdVzSjUoYnN0YW2EodPHosaVCJSoCnZEwFsIsWTHPPYqF11yGojvyspJo1oQVk6HeBTzPg3XhU9AzGz0e0VBY0DB7GLF6OhpDrDEf%2BEIOPvV1o5W8W%2F3Ay5mka0jgSfoo8avqCKh5jg4x8vZVDk5RLjAIaIZ6MmEgIYejDCq3PKqQysYDysMhoHJaRqvXzbvud3pE0a%2BQSz%2B5bRKbtpLT4epaDd4Lrmm0qLpQJF8qDc834ekM7HmbgtsDIrDYwW0Q7%2FJ5%2B%2BJT4vFIOBeZeB49r3c5Xip0uv%2FGjKQAnK5ThRRIUm91GaJfQwRSXSCTnGpv3r769LGKInRXgkCqtA29JNen51dq8WFxOr%2BVY%2F5TbAc%2BvHRYa92vvKW50XyYtZafTISo44UjHySQ77qfn4aQb8ZcBODNxw3F5DomYtGt2nW%2FNnveaJ616p23DZOKGFTOz8myeWDu0%2FDaPmjaz7mWMrCQDDRC7z%2B3d0ilL5ExPdyp8yvbk%2FdHuT9e7v8kzN1a%2Bebb%2Bbn%2F9%2FQ%2Fr3R%2BqT7eD9K0n5WFab%2B6bqykIuUotVn3TKMisRIPBY3gTOXmPZ03kWfWfHayJSnkca5IWvxVrorIXsSZy9nvnB19say8%2FX61ut5LOZKvzKynvg%2FLWVOnILt37MOWqp5Wfv6q8wG1y57FT0Uk0jcDPRMZaI%2BMeHR4hG6PmyBAHxs10wJwvS7PxvmfZW6sxVn7%2Bx87rVwe1XnN9Tv9Zu2qtbkJUHXfwCx0B31PhjHfY4lb9Qx5v4oedZnz48F7G%2FPytjGPK75LtRhSkVV9T6t4z6sQjmul275FpKfw6EJi8lo5JdvdesZuU1%2Fc9f994VpSv8udMdY%2BpapuD0Z%2B%2FwnGlPBa9fL5hMG0t50fgboXkvgDuHrvQ9viRGHu8NbIeF%2BHpk1q9%2FARpo3sZCQijr%2F5xqUID0zfOtscWfdxsenhbvnO6hZdnFD8UOBkp3SqI%2ByXmJJiCcR7CytB14UkCTQVy3F%2Fhj60b4DD%2Bux8IzVgOyMtV0FjmJlXqFhC44SSg4vGUxxXIklSzdv5afcHqORExMshlbQXPxNS%2FDYYs4IqDWTAlMF2Gi90pLD1qrz%2Fxnv2drfZmtYrFDDT9E2Kf%2FkqBZRAvwnAM7glylqVl28beXbIHlSxmwtEALSKqCDL2UTjzWHLmL%2FnnbyxDCqVgjqX6OHoIcbyw9KH1Et7shgta4SOim6Pl7kJOtXqDd7A7%2FYJSWOAnBXnBcLbYZfkOQn%2BTwSkMn4twLiX%2FV568OQvBVEDDN9pFE6VO4yIKQsFXrqg5OA25xv9rfwSxUETd9BfUaO8aQkEWMVKmURQuhDemlmDEroK5t1ThNBSNoiR9OfPiTwLSmeUuxFYxH5vQQPDhyi41kIZK2u%2FdnXjxRMm2dnmcRqsFusxDsKtHDAF5YCKuqKibYLScJOJafRrz65TAZilhksqaBkMaQ%2F9qdQ3B6TWUxQIIKydhvAwgdUJmmsVUrBlKQ6aeOjZRsmaCWaBBf7mbS7%2Fy4mAoYMENQw6rYamczt9VbYvVq2oNfe4DdrQ8esUnVWKBE6IYkk6JQPlA7G5Oxd7eyQK0viZkdsF494oPqebhLgvBF5R0w7A8DReLOz2yEKZ%2F0kLgiPVavdvdOBruArvHyRtXkL5S2%2Ba5l124e0%2BldWP4OCAmNFpdUauQcRbzidjucgmB7e6I15Wc8V3T9EH2tBFCQG9%2Bh2%2FksmAJ6CpajHfHXgDJqM%2F23qma1fwTbP8%2F%2BHhqKxNOj7yWxPuYEcf7yWN2%2F%2FEX2Piv419dyu0c%2F8jtXxW9HQWAzIXMWmZuTEatsrur2Bdrvz4%2F5VlpyMsH9GFFWegZaFM9A9rZnlw%2Bq1ifNjrtdla8qDSQku9fr11FXT7j2x1P7PLatYNmG%2BV89x1yxM9wR8Jo33NZS%2Fzshx%2FsAnr%2Fag9%2BvKAS8pzpvpgsl4v41f7%2Bzc3N3oKQFxYFDXsYXe%2BPwmG8%2F%2FXX%2BxKB7lP0rt7xd6VT0uB2b7KcTR9VZLL5OkqiViebs9ihjyJGUtyEnMW%2FCnsCFrV2v9kVtdNa%2B91PTcF3xEW91m6L%2BnGz%2FiNffgf6qLc7vSb9nveQXXPweLbwOHsn6t1mrd8UjSZ93KnLIHFuXTzbTby2evVat0ETLRrdzplonjZE822zfk5pzbdn7RrVfNjs14%2FFUbdGhbfgP5Yep70mPdotqvlUtDu1hsCRtTjpvGmK006%2FdfiOT6NREzWhBwMBaHG3edht9o7p2TptNN%2FSs02pyNNr9un3TedHeiGgww0%2B0au9aXJnRY9a1G3131Gg3azjnf4fdy4Euy8X%2Fe75Kffu%2FFQ2CXWdwx99U7yp1c%2FPTxDBt9B7onZ01G0eIakO6GaJdr1z%2BqbZ7VEQGeGJGowuTKnVztt96krrTavdhA%2FIRucEY0IL4uiIBr35lmrDdwJug6mX4qJbOztrdlGOJJQTsTmcCp8lBtco0KXfzsE%2F0aETak9XWk5oiDet5oXoUCG1fqcr7zGJw9pJq02D2mm36vQ4P6Ant52HtUP1dM%2Fpp0cQclKj8fnXefO0Tu%2FNLnUMw9SngWnVe6J3ftCrd1vMuAvpFlg2tHdWq2NM4Aj8vCvHpdHipte67yALpMKE9vfOt6QF3B5T28%2FOgB7UhDdErV5vUpNPmv3jToMAt0cQ3aMhq5324DBahmpyUDoXp%2FRFv0MgRT89%2Bg6xtXP6tNv6SbZCwspZt1NvNs4JouDSvMspWBO8TGiyagS6tdN3otbt1ui3V6f%2F72hJ0FTVMUgHnf4xGtOUq0jNPkPB%2BQmDgHJ13n7Hiwsu87o1QB9tWdQdAoYmFY0ppfYfATqojgaGlSZYNNs9LJl686wPWBAE6M2fmijpsNs5ISigph7X3mCgWu0WgXkLHWNzGTSvbNZCsFGLHuCh1aN%2FMCsg%2FkkLQKCh3VpbtKXfasEFtFtY56e1%2FjmSaNXhP3%2FDP53DQywTjPEp1UBN6nQbVEnnHNiCFmq3XTvrCZrNupy91gnmuYtuAnZ6QlplQGKPqiJ4Fb3OCcGUHlUFNzWCCIKH4yaWRY06Rx%2Bcn2J66JfgkKAEUWyBsCHngio%2FAO66wEf0Q5N6QbNMC%2FqiRbN08E7VTaNwSu1Fm7HmO4f4uHXIUmUaJTVhmCuaBKoJ0NQVjOoYuAD7BJN9aYsUZdNgHjT7F02qV94N5iXcJRiiqoB%2BusqAYldcdLo%2FUjtgPkMo7ICaTpv1fiaoBoEXhkj8a2d0%2B%2FRa7CnLd3KJ9oSUnQEi67UGo0DZqVqD4LhxQg1tviXg6gFvtRryF%2FBKDQIMEuBJWGyeARVgYGrti9o7mlHgWxpwCdh47wPjHkoEyIPSbTEYtU5OziWS6snHmw4QYht7DvCZqB0CVpo1wv9dmhy9BGmwCJfRkAPZC2X2Q7cQgHamuk4vQHWdVqOHBmICMJWtU5pygt1G84w2nB7vbYQFWqdnlEgw%2FiNVJOe63iHkQVX3qKKLWgtQUOtSa85pwts0FPXuuzMiHZAV3cahCaMwGhLeImmj6tOa0TX2%2BOiBUA%2B9SHR4QbFNAFKP2l1r9zqMK5u8k%2FaOsX%2FRmqYdtvUGKxanHbQwO2rboLFv1vpqGmoNtfVSe4B3GZtzGoFCkgDYbAtpwJbpggStYb2hHaipd0pL87jT572QNo36%2BUETu1xP9ZUwTvucgOaQkjsXCvlSMXLpHcB5PdUl0RRvOz2Kzo0WYX4CKqDjGuaBcQnN4TF1gx5MkGF4O1zkYYsJEsIo%2BKLeHMh0GSakM2CEo14RxLT1xMH54SFUZ%2FtUOJDI%2BQljGAW5gzO4r%2B792JK7B%2BAfe3n9XZ2GDKdgXdjkUUY0aOuX%2BBcxhH4aLSyFdvMNkZPtDm3FDez9MtA5BCI8RqGnnVM1gTRYtT4tsANQNuc9QKUCYexMtCzYPgxhU2BlNvL6TmQ4KZuqxp47QJE9BzXKGi9LYqJ91s4h3hsUZxQS%2BedNoRJzl6P62OYR76WnnTQsibfGAUUmQRng%2FV7H8oteUacdHaLBIBRy2pFPhSUYak872beDd1g43TZWWBou7fpZ%2B%2BwoIcQrBOaEzRSRqvzMJmSmpCexKcr1AqQuqIMAPKZcaq0eZpu%2BaNWOqPeSRukT%2BSfhFGgI6KfdAXXa7hHyJ7TYp02jxasOiJnWC3UHG%2FLB%2BRE6jinsMB1KsRc1uYdJqgF01amwGQttlfThfMXIo%2BfdwrcYgMpB6whkBP3%2FL0FhiRsUikBMH3vjO7VH4hWWQZsEiXjSz1uaJMJiKe7iEDLzs95q4KeLdcM7RKNzDrQDlNCStClR6FQ3P6gZTW5L80hSHPj%2FF0l6EAYX%2F%2BzRB%2Fg5EIztaFUcYSKIc6edqauf%2F0W0%2FmnzHTRRmyAFaMLxn2iIttxwJOFO9Oq7I555iuf6%2FyJ6lKetKv5GvsmxYLzEoW%2FSYBr6C9PUtF0DoTTFT1jbCPV%2F4gQKEdxgE9YhldCj%2Fbf7Tgbf0I7dkcT521ZjoPEs8wvnhBDfnrRBUYHmpQAPL4aHMalEvP3%2FSl6o70m438sE%2Bz8lLw2m3NQLkafEv%2FDeQkFFqJ6%2BOwWFrcKwOIanxN11xXnz7KBJNKXY4s6OBo1Gm4U1IHthQovw34%2B0RxLRc1YD0UUbvtrVmIBBDmJ7sNtIRuwo2XjUe0dxLSpYU%2BNEr%2FKsT4axTlQQiEcF2Sk8%2BAf9BXMR6iVlIhBRill4FUp7whzcW0bBbKe6Fy%2BmwXKnIirVvZm32NHikp3P3rSaF9qrkwJK0B%2BtK9X3L7OGrf6opqYonAKGgxbwmiIuBwxs2RcJZTpGomr1Qji1RviHKRcVxSuSd30uKAnlS9Fjqd8lkShhn1kiWY%2Fk%2BxzoS6Nk2fRDEADiFFxkm5irIzYBx6B5NADJrYK8fapw50wFiCVvNdJw5st%2BYlY%2FF5E2lSvqHvVUmIJvVJAqkiIL%2FkoCRueC4JfoOOz8xGQPOrJaAm2Q87TMJfhgx2jSSv1XmwkzRdVyMzI8mnzHsqAZAOgk7aSRxm4%2FkIgj6YIiw5Pvkk1q0Gj2iYlRTUmjj5XQJReZaWnxnCTZXftLYt8h3rjVKK8zer%2Fxowh2RUtkWJVk0ChAtBPvuL1z5s6JHwX6IM5NskZqk2y8owFp1QdqTojn0qYXmfAC2dDqD34iooNArU8kXIMJRLZSyOzFgElJbQ0SBST2NFMxCtOMLFCiUvOxUgbUUHpDPJ2DbuvomJaeFPKwWCIx2Tg4bIL%2FBTXEefFEmyQGH5R2B3OTEPtc%2BTtqrRqUZobVS2cwG9noEKrCV8ymZVMOCX7QJqqg3m4xkmCebdDvDJrMabV6x4DoDDeJqWJZDbUPEiHqWpKV29c5NL7ISFHQP1oWHNTbAKH3focWy%2BBNS7MrSmhFRdfMfqlh5P4QBQohHzNkzNMNslVJmQV%2FxHx2p5spRn%2BgU%2FieyaEmNXUqz3ynm38fyE0nm49J7HwRGSoxU62iFwfZVCmEokjFdHKf3zS1AUuWBHF3JbKEFJTAtk10f2bEGPzSeniXHiQStAGtqU43Jcu4uBZmg7rS77S6kh4Dth8ctprtxgC8N1FBF9SPN0yaDQ7e8WoSXBQ%2BlsJSphGkgGKQlq85W0jEWnKEkxI1AWfWpAeTsPE5AxLshdIeVSMm4fjEnQzmupmu24I8x2rFl%2Bc761xQy8vzXLQaVNrBOU1i386a9l%2FVR1%2BwUFFnSAdZsrM63hw%2FM6FDkVbuRHR6KnmZBgEGNl8swMIC0%2FlI%2FGbIxiY5iuKJPjrHEUvzLaE0KfxMwV%2FtkAALZtBhfpCa4s6ht1EW%2B5k5M5K6ZOidiVKkkSZhWEFp09rqQVQokWW%2BD0Wjc0JLMVm%2FA96VT1pE7%2BM4IbNjYNXgfOKCME4u2jWsmuFQmbCwqWpJLeupGyjpAQCdhw0ruNkwdpV28%2FSIoC5pUemOgzUv0%2BWap%2FCJCp5j4ektr67PyniLVFWkAKwSmRFCYcwkOfAniApMBc5FTvt5rHjQAiltph7UqPLO2Tta%2Fu1kIVDTgLnbUkaVmRke8tMBcTu0jdXz0FAYycSOFXdi5WPGgkWQMLBKg6iXM7GcOMQZZMi2FNVq%2BWcmSkuWMlHqlAUK0plYKWfORLCEP%2FOuZHiEb9O4BL0wlyQpAeeOJ1PU9gGiIXt%2BcUDh%2BnEuf60NYeA7teGIY6BjVUlq5RrOqRJBoqTEqfLaGQ0eEURUodrA%2BLCXUZ5dk%2FGBUVzRR6CQnH0p%2BgC9GeAMweq8oqEJScplk1JTJ623mP88OVFYM3WEiSZJ5%2BdTaLMGdstNiGKJgJykOFlOmkHQgbJPSR5uIK0AQhQOIMgdOBWQLYmAWYqtUUdKu%2BIwCDRBpwurOC0Y7WayMM0rT%2FryqS5w09hEUYUDJabMEmvaQL06qW0AV0qyNu2%2FvMgLqRKPC3cf03GG4vuS8O4ct4iKb5ojV%2BvjHANZuvK8qagEYwnxiOvjFEe7gUBo1esC82X9DzTXahpOfOQkO3CwZp5ShqFgz1IwNjAobmw33UNHLDPDg5Kv9LG3q1FJmhtGlQBCTkXyUYbVzXEN%2BqA9T9%2BXounkYCPP6SSTkfKUCSfSoFnhC%2B3EWTNnI3rvCBDeyv1zQP8UqsMJdraqTC4c5JwfUndbuWVHZPsppqLeaXbr6qgj3aTlkWL6ntJcfM6SGbbMtpLE8XCxE8F%2Bh7byjjyjAI%2Bm0hJRQ0JC4KA6IQYSUUSqZ1CUM1VEuOhSPQpVMMWUnoQM1PEeznak5X91cp1GJKRzGtVXJ1D6PSWk0jilg9A4l6cCTV1wJkJKEtOIVEUiiUoqT6O0RkAGK6WJSlUhjZBNTd%2FlwUL6rppZOzloHZ13znu6mWlE0oQ0Ku1vGicLTpaMFCgl595mQsaZpYHvHCl6XFxpLjejyd5ijZQrl1rIjpS%2B6XdTJyhQyqSAHx5IAkme0%2Ba2w8wqg1DhvIuDa6L9fxywBoOit0%2BaJ53uO4GFcVI7ZVShxBK9vAaJSYATtiNu%2F8Smy3WvUaTEIW%2BzxcuT7CRCszA9pT%2BjOW8aRiaxei3WQgTdpjK0WIIKfNHXVEAXh8gnTQkirL8k0bp23pGo4Awkb41zSBojPk0gREuggkNrPqof9I7P%2Bw0gu3oXWpTpq8ZPPD5U%2FoVIQYQotzPGhlDC0Tiqk7AVyapu5ZYFv%2BqDCx4vCHnlqEvqXxbAHZLvUo%2FgsHGhkhDKyFEzYhCkaKGZwbIOTuVcIUsCygnLlRbcOsXGwWpY%2FQxZNMCZHLgSpmA4nyK99LGs4iqzaVlhryuelVFzKbztM%2BJ0xmbptHyOtKFSgJI6b8jlk%2BKjXJRaRVJLyZFgtV5xkoo7BNHNB%2BUqwpVV8XPZFMV0M02i3OFwerJGZEtlL%2FPLFjFEMWpFFM6QNtWABpwVv8t2W1MTuVxKsJ6LS4We8qBakat6%2Fq1krslISsWlGclnIlhnmOMj5AyppCTBqiHJcLASiTwDTsgWfaymSpIsQqfbPT%2BT1C1NaOa99OQqa8vr4WfI%2BmAr3vWuKRfsq9hSfSmFrB0didqbIxwfgwHjJ%2FUBR8byHQFIJ%2FmMBefk7%2FhYlz%2Fk890kpDeJNCUTcVJ7K6CMxErHChwR3zs%2FwWkpghgi%2BnlTg7TvTIUgT%2BJTQkKoR2%2BT0DsZ0ic%2FRwq5stocv3a%2Fkc9em9CvCr59qwPq8967d9SWRqP5Rj24YhXkmlnbDLu5blXSpjPUJiWcYEiy79CG5YMphViILP6RyNdTgi8OqqzyBRISfNEX%2FLGgoWD9PHHY6va0iKxdS4KJwBQiLO3aqSdfOFQ7oM3zACowzVabf%2FhEhvrb5D34DTRyITsCcj9lPQeaFBghYxkrtbZBXe5Br4Xmv1evYZ%2BASmrvX1pHVmQlreheo3MCxbpek9U2Oz3%2BoWCPZhw%2FFOzXTvlHBr%2BRv9hwsNX3EMDhR59qpG%2F4E3zR1zCpkBpf%2Bc6EpTxMRbS5%2FSyO1VFSPxEKr71WXgJHPYGEEhI4cQ5VW%2Bh6tlrigGPqx11W5az11WNw0VPqvX39HLBGpn7pd6C4AOhmfacma2XWa2c0mYfQRpMtPIOKM9dw0virVIZV%2Buo4sJSnPIm%2BlLwFwck4cpOvyvZgGoFZB55Tx%2BQ0uQPJHGRfWC2MX4EeoaGrXntED6DxA6k6YMZqrTSW5qafSnUZFm%2BKLvrU5T7Jz6ApiSVOY66GW6B8Hl0KHIMkU%2FLEZn62jigIxRV%2BvsOBo4ro6QigeWhT9DvyRJyeapGhscl5OPSy6ky5JHFai0I2j0MSlls9pmmb4p%2FnPWicU8HEHumXY6Jd07dEveWk9mNTtoBDOl5quPzYlKf9SShpQD5GKpacSv1zTbhms7Nk6pDak2Otc1mg6DFgVCGDwBQyJIXZxA3UBLANNFJbioc5bvLMEZqC6n8DqohQZzplAqAnzuSNgDOOBDo478kVL5WIgBcGCClloUS%2FR2vsSF2d2sEBAYo46HZqDT5nOe6oH6IWfhT4aaPSpnynJ2vKYqp1Gh%2B2Q9FICjqV8jpHnDSh9q61iHAk%2B3cAitzUAAtKR4dhKVG76A0kgQt0eYpFylcTODvT4%2BLsmAjvZibionkgdUUHmUj%2BJfzBAHohBxNY5UxkMmUbwdujGXGQi%2BnDhSCfGFNIaUpSCJqUPMA4csZ%2BoZ6DeoODTal5qiodyPYnGkrpwk5i5H0GLTcqitdMMW3NWjbPQcaIFNL6RxSE0KPHIdpC6Lfb6cgskl2AKL%2FVG1w02yxKPmk2HFHpSYEjTR8YvGXw4t9BWrjEUBRIlId6Sj%2BD%2Bg49rOyLEhZko1jsnCbJYVSfZl8c6canip1X3%2Bbe9H0KSfOqHLk3Vw6j%2FITjU98b7%2B5cRhkgtTSjBEZ4wHp66nmQLh%2BOBgmjwwzBcHfXUAAlIdiMURFKxpLNk4nKJ2cTZP1qN1DUpRk1YEVOmZgEOSSVc9KU9J3gpQ9aYcAgpHKYUZpc%2FbEJ%2FJ8lYJMYkIDnbcllsAadzOaKNSNxicKZWyeonqqV1ct1PxdpxGV7XZTCTGvnUKOd9AXzm%2BtK%2Fj19TZtvRTF3eaaoT5nHEZN8ry59qbFgX7msr4ZtFbsXnqfU8Des3MqPeoeI0B4O06nE1qE4Yk6vx0r%2BPY30cV8K1CW%2FAE3J0GmjddJT4UyQMGxb5GBLvTANKcMJ0Zh%2F1UVA2JbW2G3yrTX9IimlZD0pmlO%2BS3IzoyqiGaIEW58Tk4pznR5OJN5JwhYSEUmpckjHHSZxh1JTX22NWuA7gKid1nr6rvVOelnlQimG1RFyB7O1CPMxPanKymoCTLmyZm82Qt3ywwYutZLSHCqCcwDR6Lt5%2BrxTyiqkDIZBTuqPqjAOhzNBeaFLvkPclgnyTRL5mikr2SzUO2u%2F4%2FhEC3D43s%2FBP3PvvWMzhrV%2F9fWh7MugdahUcHCyk01I7mTkNIcHb0E85GPAMptRLVUn1H4O5JGmUSBRkufpzNIC6vOlCVZJY9LnoIuP%2BBJF6yeI4y4G6kqjkSIJSI6kPhvRRxRbh3b5AGuA5VDgYXFK2%2BVDGJqS0wbEpJKw6CUUR7vDjNNAKqPTG9%2FW6Qygvd9WUpwkAE3XAa5jEuVDIXVvlELEpcgQ35ihxcBkkD65kbcFt5O0SD3h5PV%2FUle4zB6JFPD0%2FtXe0k2qlghZnk5TUVGJm1P2phv7y84YRh5%2FnT7C%2BFyRJXV11eN59t7H88z9l0JjKEoh%2BXlWO%2Fm5Qy222GDB%2Fr44DKOrYCTicAZT6creYyxthoTLifRlJq%2Faw3ZIMFtEMCoL46cjHwZq90RrLsbecGkUzLfgL19VYJiXDeuJHU%2Fav4X1XGlXOZ4GQ78qXfJwyVfeFUFLtqTU%2Fdar72Fi%2FwJX19kS6bP1zs8UEVdhfceTZvp%2Bh2NDWTHyPVmzXwv8W%2Fc7r9aNzqstLfRTB9i%2FOzV74s1HU9wnp2bzMPF8voBVWjgPkiZ1%2FeizP5L3ktiuCEaTyvZvl%2FE9zEAVWpwq9wqbsUN0BdIGXZfMGRyiOv1e5r7ZUZdT1%2BqcFk8a4Pj5aaf6uooAEXrbFYVDjTZxQfho55xY88PmWqseNRtrvFe3K0ldbuSCmBtda%2F0CDuAG3hp3xbcsjqU9XBgO2tZ8a5WK6kHpetsmMd0my4BgYQ2qbMtPWSkBnypsv%2BXEqLvf606Xp0GRT1t%2BjN2EwL4qh1CeDK57fdqU8Ns537btO3xRc51c1OQC2aTYdp9D0LdmmZhsCt%2BQRqj6Grevt%2B0NzCSsQUvKUkAKrwlwO911Ohvr2gFragPocOb6pglYviCKcg1NDAS27PSZUkbgYe9c9Lb7Stl7wEc0U6dbfqXPxmHylQeo3VgT%2BbHtQvmxdYbPINZrNrb7RtMD%2BA7y6S3nQOpGrsGpnILmp%2BElmq9D6%2Bm0w0Xxi5wfyedj%2BLcFM5ycr5U6OZdxTAOx3bf4StYqr3s31nwRiEvhs3gE5CHclutVXmrlMvvEJqgOdvrHzW5vyw5JSl0WAWB9e9Jeg7tbv6udtLed3KYsYEcp5WX6VX3NxPp25bQk3jrt9OWnSnlo20ZIFoShDCZmtsXgUO9ud07lML7jUVQDyZT1lmOQTK78tPoabNm2WEPtaDSOPGjbf6pHXt85S9W1tp1%2FCdCHCnd3Eq72YTOmJYHbfU2wlgV5Kkh%2Fv1Ziw62RP0QWa40OuSsXx8RTMJe45b7J87YjxfS0ab%2Fl2V%2Bf8Fn71mCQGJpAYQcMjDvy6ic4rDXMa21ZklyUOC7A8ycG0O2wJl%2Bp0vVvh9qh3MhtlddksW1tO%2FRE%2Ftdoz8ONufoxj3xmDLbEQHW9g%2FHiheKyxPl6RW%2FVEGkPAYSIxIsUUkheysB72dWxVmZ9emttW2DNR%2F20%2FFM7OWtF3q1r7W1RYU0uiPQCz1pfmFuzDmoPtElCbCKM4541g4iqwqxhg0F1YgISjQHmP9nZtOboXohxCBuK8P16J57uPN1A6BtoibaGtTy4WSvrJ1XF2rhcRmb91aUc4FOtuCIPgFQ5T82OOvqlLVzsiL29PVFNPK4M2Ga%2BzyYBKU7JGiwTcuXdU4Xr7pTY0K%2BorBus2bKluaVIrMAp0xvBWJt%2FGKPRA2Kl4H1sB5Ffv3z5J2LBoohYVOXz1fdnsYi9ZRCDXQ2ju6rRpdzCRQ1sSjV%2BtqNM2qwT2x9rJUdav9%2BFQbbn1aoNwNToURCzwcuk4Ww7cZ4aK1Pjm9jM2k9UVfe17HG%2Fw7fduvsstFb2WWjS9iG1s2qEzyKq4Ky9v7iG%2BRNpAAJzzFaCSjq8oy10sZGftTZEtU6NV61THSFGJtAxXKfX3PXKW4OoX0t7VmvcmVmz5RFajTRsuntrNkazVjbYEmwAw0saf6wTsylrffK%2FlqdvGWwjm7eWcldeQN87Z%2BLsaBDPlpNvBW0TA7DnqZLzBrimjzMs%2BlO9%2BJ5aUJ1jqI8GcDP1GrvS4D0b8Hue1sjY6DEWvfliMzuq2n5RqmOdwkUpLQRj0yC2saCBkMo1kc8Sc%2BGvUNSlmpzBW6ox9iAKdhtEiAFH8%2BewZlODaRo24QT7VY3OO9E869ASgAICDugRS493tDDESQu2xJoEHo0evbTbzdPT1vkJB1tp%2FCmM1JwQGXQs%2FnVOoAkLbpzIigWJ4Qu%2Bl8fVJG%2FqW0IGPwrUaPkQ34x5b2dTX%2Fq7eoHwIhC7iagJBP09dpH0vHnNp8x6A8EDRZVh3o1TlD%2FMPmu55io1SIzqHjYYbFychyL2o4C9jN1vCBjTYAD03Ylmdhxsuvexo8L1iWx95UOTHOGrBjxgmHrKI1e8Jy584cHlCpuohq1f%2BPG6W7JTsyt%2FeeP7tGsTudgkDEu7C%2FfcorixTdg7rO%2BxYWxJ1aC8%2BWpGUzKUBwPefEm1B8sJjAezLy44xPokbtg7HFFGYhqyaFdLMeOKVQXtTE%2B9z5EXz55mJMgBe%2ByMl7RLbTPzGVdI3FGRdFTojgrd0QLnPnnr%2BF3Tiu59UF3l4J3Y3IyNM5yVfWTs72Qk5tr%2B0T3Eyche5r3AIXIxmaItCEml%2BRWymQ12GuhPR%2FeRem9spq5DiRFq3TUj7zXtDWvg57VEy2uJxKssuu5LnlNmdGSqvt6qe2exvxqFbOA81hJ%2FRfSzsJ8mSB1WbTE3Fl8oORptslTbTlgrGfE6d5NtDc1tnUPqTtdO0k96SdhNXZTiuBRZqXbZ05FszGZrU1ut2daKTGuF2VqRae0DsOGPMMOd4cx25VTcwA3hg1gy6Qt9B8aSc6efz0WlKm0lS09hW%2FNlqbb65t70AVr3aOcetzOx5KTbeOVq3SKSLj9TxongFfP4gviguxfiaRiMnjJWXlzzitxDRHmTtxhEq3EQXECGh2bafnx4X9Aaaw%2BEW5TvAlpcDwgX%2FniF%2FXIeCpjKvwlXU3Y1IPUypR%2BDtAXWNoQ%2FCfzSaBbcAnhDf4crFTALXqneE4ofjg%2FLhtmEARclwX4K4xfghu9pgTu%2Bmy%2B9213lIYPvTXxFLOauvEe6q20T9u7RU5fXxGxfnxY553MkbOXf8d5zsamFO%2F66uV795%2Fr8P6uPbuwH9beHNj%2BGPWTyhthtqR1MHChbj9wpWrk5K%2FTuPpRnKXV06Fi2UlKhqVgiIG%2BIuIRnlhk2V%2B2gmGDrWzEN2BcvTtmlvU%2BmPNkRg%2BFHOC6qh2hTaIU%2Bl6YXf1nFLDGC6obri5wXNEd38FdhNwIudCNT%2FagkkWh101liJnk5LP7U4R9KpUxXDsdiKu0X73Nx4mKyKK5udXVXmHjlxZPCxHhIU%2BlAYSrZci2XbW0czq2dDH%2F2gsAfAWcMnuSM%2FbJIYt3Ot1HuazrawZY0ogIDomWlIPTXVbjcdpt%2BWrEZQl5FrgQXJnhaqTzdiLbAsbHXMKNVtucv%2B0PIH%2BFw2%2FnlAd8PKXFUUpIEilmLHmnrGI%2Bt5D91OxfYuF6IP8nHk%2Fk90LHbhV65dkwBXlDV6%2Fa4cmnE%2FKcdylR9jWxuwC3BzfhzHm0UNMscjnxL2O%2BH9CbsWCX3qecrgoFFMIW%2Fcmbcymr9mR0Y37j7Lvc407kfN2fTsrOB57vv2IuUH%2F%2Fww3026bvZVejAKar9fGR9r%2F00%2B3pfbznYGr6Aw5zJwuUuZ7J4pLMcLnY7VzmTRZGjnMi%2F9m%2B1hxx%2BsbRIlWWY9qDZr1PO%2FZ3X%2FwExuPTydlnF65PL6r71HR8ZSs1TLhiO24beMn%2FlV%2FvC%2BfDh9u%2FjXfodj7V%2FHPiQy0YbPviyzUrjXW7Rcb9zwEYMWb1aXt3e0C52j%2F4a%2FbzU%2FuyybXm%2BTtOf77z%2BvjBjtfr71y%2F%2BeFjLz8%2Bk5cUtmisb8rBq%2BP6vw0%2Bhdgzt9lGovEJLNPYcPIyeb9ciSyYDttjY5lmnW1SfvTEUbgrpqdd3NBsE5vsvTE%2F1NmK6CsNY%2BaK7%2BhyEq1icHZ%2BVles%2BhqLlGevKlvC5Js563d2vlWSJePKYTzSXIbOn8SSE7z3v2iQ8cjXlm%2F9y72ubw8lInl7%2FYJ2D4zSJiGQgF6prI%2B5LTDnjCmvRfBAZHS%2FvPSG8ud08t4euRJT2O31UfJr1hyni2757xOm0lSuGhkZ2OZf1tbNOL%2BeLjXqSqCvPV8TJ%2FGEvHGk8vqxY28dbvvu5KnIdT2lJd0F7OoNGBzyFGdmFo71wHtPo1M15TgDwu%2B%2Feiw8flpfPdl6%2F2sHkVdcV%2BYRMYu7yQqo%2F4FyWsPKBnciVUQnnr7iFlVdiZ4b1ES%2Bq4vsfTDhC%2FB4E63sDzn7C7jq%2FF7P3X1%2BK9Zqe32RvK5gkC6qhLm2oJBiLHXdF%2F%2FG9rKoqGxJcz8PI56Sdar7aMkA97VzICdqG7bfn7amch6fbTlYptKSaYewHT1D611TwpcPTnPZ550YfDrFLIf7ILSkDE%2BRWsZGmQNuIlcO5NZpQt%2BwL%2BuHy67wZD35kYd7L91cHl%2B9ffg1a4dWAA1UWRF99dG0tB8Hci%2B7Ezb5YzUfEFQ4JlnB9BYTehnrCDtWz%2B3ddEUJlNXWGS28aP6im27eX7CJ8pN1Yc425mLKaj4ns3KJaytnwh8GssJUvpBgpPbJSzmZjlhbFw0Dy%2FkMBOnkOCfoO0cjxajwObs0zyqSLygf6lWTP0DEZqj7bkXJ7mZ5PqlZfM1V4wFlULGV47zcv3z%2FfvXytol5%2FNLau3OBs61pa2ciAEZ0c7FXGNFQGrVbB9mJEQbySYfQurQp%2BvLDKpsk48a4zp8jxKyP5u5wcmjiUub%2Fcn3nzlTfd9%2BcJ97KXFLC3iPyRPw7m%2Fgj5c6xiZaAI9oHR9sGg0eo6YtmElyNam%2BCyk2A%2FjT7qDo5rqUFoOxusEziipds%2BR0Jy9dKRBmUnqw7c3tLc2nLiwZFw%2BElMg09%2BcmdLDjqudIkwcsUa32nuz5yiNlwDh%2BPkNEZ%2BN%2FPumFxV7Knyjjzx4yBHsFZGgQlb%2FnASmlG3gUEwVoL5cLoamd%2Bq2AE8TRtJ7F3ZiFONc8c6CsGRHHXBZ5kzeucYteTWY5U1CwnXS%2F%2FEc3YvrhxJTO92%2FVt%2FuGKlv4StBoIZevQcDsELZPILKcaQnsCNFj2FtMajmpXaF5c3uPaXAy%2B6zr3E8o02HvmGaDg090cDFplwhJwoFfFUPDdq6%2FC9v%2BTk7X7LVV%2BGs1bmPVY6H7fz7%2B4vq%2Btr3L6zFzpfITSm1SOuA%2BNjRs9HZoxxH7RyxdunGRmaYiWO8r25GRv53icjDqNus8AVHDxYUUTymXGYGyuONiMzDkBpxxHQrcysI58KtVaC8hJuxprLcxSu7L749q6BqGBsRs4WS3Nsibx0N4gSiM92RvqeNU5wzWJVNx%2FFtMG78hKjbfeCFosZ9dkzJ55WHso1YmkTsnJy3NTsL%2FtON%2BOsfro7idu4RpT0qW5Ghktz3qzBSU7NzK4EvLsO%2FdD6ghJ8b%2BSItxH20r826d1K4tzejI9j3yoBjtltQMMxoBHFsqT1SzM2uPXNtT73b6yYz1Yrw6tffAtxWPNDO8xnQvVWbAhFNqvmBa2ZYGhtPTSWcws%2BKNqcTqlZZES6WKOKE9yXkyg0e07Y0dpmlxbeW83tmVlZS50YGTMmDMwhcC24W2tY76AzVkpZwlgOzMy66Msewe3Ii0aQyREdcxURJr%2FnrkVo%2FROsFNjbTDOKwsiCsxo7hWoBWpdWb2rR9QorrB6u5kv%2B3spA7MfMXwZDdyptbIVFU1rHBao1Wk0RSAxXkQfeSJOKdcJNTe0Vy8524i8n4agsU53wE0FgQQPx5ZU3%2FHQYTClDUSZ59uRqKY%2BZAwM0AtzkCKOigWkEn4OYGntw95Mfha6SG%2BHMC%2BZFvWpiiyoom0sr%2FLAgngbAj%2B8Ic84KSi0doSNC7wVJrTltMIQnC5Np7wpGGgaLmqe%2FLiil7c%2Bvl5Oij9vBLFgWfRkSs1f04QlRGgHtPwXfnoZd%2FyYoXFed1bIzPiAAGcVFFXCWLtGRfkmOwlHv0LZA%2B%2FRN0bdSzaDg4zMosrsAr7Q5XeIQojj47Jet%2BiRT%2BdrLZNtiESa5Ny2tJON2xW2bvilfFwdXmzL1I7%2B4wpLvCckEs8JJ6fn%2BJ%2BCggq97i2kD5PBdO5h%2F8kdtmzihHFj%2FtFRNekylOFE4pxH9UnNwNpR27HsLO%2FbEuy1ICObuBFl3j%2FpFvJYrmRk4R6fPoiCknevuXyvfYi4ouSCaduehyRshelUwBH3iFgqHCNqyrjV2Dhlf2dI9n%2Fu3C6bR3njTVeHMn8%2FZ3Is%2FYjG8oyYiJbra3EtC2D6YR05LsAkPhoIaiwmsbXpIYNe02Zb6NIxXFkN1GFgy6MqRP3fvHgWbioquabPZ1oKRV3ccG7fUOHUk9EGeuuIjj6AvdqSc07bn6PUF8d5df%2BxHvi0RQtqJuQiyc8h89sMnUH1uz16CVI0GDQZEpA5acwh0pv7SH9QdjL6Uz5iRk8WAiPBoMGY0bHIA%2FtTkz6TurhU5kjWWEdsj6mbdi30YWydKYxbb51paEySmHR0kef6cjD%2FaI2a2SRvWDpdRcP5Gn%2B8tVvFE5vk2n46jM8TvLcN2eONHaNMOFfT990IWaZ0LmyXSl%2BdEqqsvzfL%2FEBBXbFVKpn6rlOzrH%2FlUdTlEFpg1fGaLzpvv4P2qZx4lJTruP17kTYFNmVeevkpma0eL9%2FOHoem1hISHKmvHPIxmfAtP37MqAQLVOznbsAZXMtNJzkR%2Ffv%2FDhzUON57sswr9t4XDaDdSXgA%2BZwO99Vq7jUErOlgzWqJ0UCxNwf25f%2BO685rRnklPN6nBzyum1igjjmWY3LrggadNQllTu%2FIhCKaixrSK2ZIAC39ZBpuIlsNIQG5Y2ozKzuv%2FqLywJ2onmV9tVY%2FPo9bUUHVtoOpoc6GqUz6jqX%2BrTjitpfN1mRmzv%2BB2Q7Cc%2BhJvmtcVcgCQwU9FAFBj1SHtV8hQddKaRbrvfJf%2Fw4edqsMrOSxUsUFg6ZiyR9%2FCn4c6WK532p3TLwBhhZpYCnhevbLhT3%2BFIxpv4nujHajS8ehhPvetiyf2BNtDtd3Mim8yelzJ4VvFmKYXD1lqrp7uc6f2H9I2fW7wJdpWuBzKUcP%2F%2Fel0LdTsWrQq%2BrNz%2BsuW7P%2FqeFdevbL7cP%2Fx3hL%2BzNH7Hx2Jx6%2BfxwFDst4ejr%2FRtdRLdZH6jLdcGnSuGrwCTG9OduUV9j4XCLx6RZOf1XxzqAB3ayfSP6zZvKy6RZ7USrQSd1y6VB8%2BGMYH0suNmvrLJRfeq8qPnjFZWjXXiN5ijzO%2B2PY%2BiPNWmNSLMiJNsi2bWqpllWhjwKXoj9tPiHut7TtuSOdJt0TPoYRyS470eeGY5K5Br43nkhbTHynKzEXFEZ3voN%2FceR9A8SWrpaTFOUL3mVWEY0F9D8oqj04NQ8oac%2F45QTV6LPaC%2BefwE3bvIujPrMUCMMnkSBVEmX8zQMcm%2FlIHecqBrnXEVLLc7ruqtltTjhXlWE%2FFq8nm6DPOLdyavCW76%2F5XHz6817fgX5sLR37oB9AZsbbl7fe0%2FL2FfGoOrKo2xu0VXgKQePfSQsbFXxTeN0%2FYbc1lG11I%2BHRrY7cPoDlW6q8Y%2B3UxFVG4GZToxr8vUoy%2FvKeBiE2dLx%2BA4kEoHAhrMOwBKR0ULtiWicm%2Fvb09e9Gb2TZcVnOW8WLDzBTfVsHfBiPfai8rvprktqCoPjPuBW28m7fF1uyy0m9bxGfV0i9C9aQ4zEWowP5nGZUiMa9M36ns78NuwxNra8vlspbsPjDgM8da5vh9O%2BH3B9yN10AyCodLz2F6AH%2F6ItU%2F1KW6S%2Bd1UGuOzSiz91Z7VD37g8HEmy4H%2Bs4o29aqfltq2dH4xO4H8ZPR0o1u9BCoe8quMUjtOLFld%2FhGPcYVEcfWsgFNFExD2nm%2BNOWchk0rOmlqXH5B3TFXLvRXjpGy1%2BS2RUQ2S2f1IR2FJ8tJEG%2B2mlTAfxh02KO5kyJYdczwPtNArimkXsWuePtaovyzrRAUcdQbJKHbiVc2zrlJAm4775r0thtWyErhz7S%2FNk7NMNklqftD3%2F7uIDb8W9bhLjawllxyq7x%2F8idg1%2FeXdg3luNVqLTTYnJskoxHYde326p0uHFH2Cegce4hzTJOBoSq%2B%2F8GNBIi7PA0JQqNPq8ULaYPES4da3i4ltOr4cjPy2PrWv558NvHrkPFkOyINXjmzyAv%2FyFAtyCAn90AW5ZzeTLZiGMDfBlpB%2F21A8CW0IP4KCQv9V4DS9N%2F9kZf%2B21bEov8KDPDIP8kiutKsreT%2BxhkKUUmBwPD%2BNjnM5WqrZeu%2F1CfQ%2B50nlUvLXvY91oRZqTyOS9QyhENf1tGKV0XN2Lx%2FlOJbLTb8%2FQEY9J7IUam3i4x6%2BD1x5T0Bii%2FVLyd80R2XYmBfPV5gzOMlDS3HV8LpiF7vpoS4I9i2EDufYzGDEuEub%2FdVu0x%2FyEbAIaFLi0SIr92oy0O4kPiRq73R9bENKujeW0Uqc72QD14BInxvKaWAwTIWMET1LJiPgs8BzuGfuaSBbg49M%2FhJQ%2B%2B5H0tU%2FK39VQY295469t8McNgX0N07IcGMXvL5g4%2FqfTGHa1%2F%2BQv0uBXrc7Oo0Oq9EXvwoCKQyPdoScaRk8dWOF6%2BZgEuku24TnPjTQ6gJw%2B1QV9LyIZsuBBSmDcbNvnyP%2Fo2rtkTWn427r9GcyULlepzJnN2lT%2BiLlqfbds5AJz%2FaiE62om2t6fTVJ7ZVnTJ3h8dnQteVB%2FecoTrbptr9xYWwJbJD7Vx%2FX7WEvOlW5GKF801x2pTbtDAvfDEK50%2BXiSlANkcynIYxjl6W3rV4%2FQMQMGIkcsfIXE1DWKCe%2BA6QZ7OicTDC7nKHu6t8ZpPYtuZP82p%2FBeOTGaNCAVAyQoWSIB6nT8Hi0VS8thF35TAmlzTDZWnuS7egcuUwbJm0wGX18iEt2MrsSil5ZplJ0X8ZE2LFeRK4LcxS2iNbf8PVpU0mX%2F6P9WnTnvG4nUDjyS%2BwI0y9gH1wurYDnfbIvSBTxXYbgf7gftsAvhL4LL%2BqCr3e2lkRebsscXWrnNXUErv8JgBsNX%2B6e19g9sL5nWviKPqRcyYL3m66KG%2BRGbyNGrsVdjMkvNEo8uMYXm%2FnzDcQ%2FcYXxhPlTxaRD3zcNkjeaBgjbGDScMZKOZTFtW4x8qeshE9TRv1ZwjlAKDWZ5e1r4c%2BuiEOBUS9ZJuyWUZegTx2MR%2F5YunvSPG5AnEw8h6GD2dXIE1N%2FKalbMfdv2AKCvBoLOnMR4eZX8Bk%2Bb4fhZx%2FTsiB%2BSMNuYlXCn0vWmX7vpIVt3LiRXB1mk%2FbsyBd8OVTaYrHuhEKi%2FgqXhEN4kGYSYEk1XIW3VJkhykmOJysQUcsjJ2EYK7GVSuDYTtsGyiJfcz432YNOrbYau67ais3oAsuTdgO%2FXMuc7XpaRDDyngR%2Fqb02DtWavXrtrEjxwjaWNqgf17qPaa5JOjjpiY3NLRry0hGHiVc%2BIy1rum2fPWebfaAsQLLN1EuDWNy2IfDI3Gw4m6Iq414n5jKfWwO0bU0ZQ8FlnXZZskqMoO%2B%2Bru5kLDxJU07sGG1tmLJa72RtJGkzSK93UvNHz5RFpMQYEptC2n2emkKq3rejpe7k58YNnYeeTiegY%2By6RVjGyLYp3b3CrCPABGqcLHrxubi0VrTx%2BNwhqX4MsUeD%2FyXohBs%2Fiif%2BdOqkFnTiY2mGTCVbUg76iyL6gf03WKa4nPYdhhPL1sLVnXULzzbIMQ2tohw2bUbSWJp5U4yaYV3Bc5qBaRAt0g9Mi%2B%2B2TMJpsmfixRPXhX%2B2JZHG2Cptb2rtVmPwptk9wCBWaqPRuj71vWiNW5D%2Buh4u7tZNEDnr5m2wXB8G89H6EBqUy%2FWRv1wfByN%2F%2Fc8wmK%2Fb4fDT%2BoSomfWpf7PuLPw5%2FSyJ0PnNX5%2BFi%2FXZKp6su%2F4opJ8ZsnV9YI817hAu8YuMPap5OKHHlEgletD%2FSXiz7hEjte4tiEBZ95Y%2BBdlQx%2Fp8TqWdzyGDWF%2BwIRPc6Vwt1vWJP%2Fy0oFYt1zCS4EU%2BP0E%2FUmBOFNdSPw%2BjcKbD%2FXDdCOIZbCesmyOqrHm7IGITD4LT9VEUUtmtGb%2B05kTBsRrpmu%2Fxr0%2F86NqnAcDHndWS%2Bns1DbjLRFtSA3oe9bl3Nx9Sixcq7Xwxoklf1xaLCCMijU%2BsD1bBdMQNxtVGNG4cRLN1w5%2Ff0c9iGt6hmZhsmhl%2BtHDuPZ3SEyqgVOU1HD5EFPh1RdVzG7yIn0QC0xjipbekWemtrtD43iqGJQ5qWqCKOp9HupQLokCp4qvVNXXSw9XY9RlBNZW28AJUEodTan0fNfUjooXR5DkmkJo5VMGu743oZ%2BgHGAbUdUGMu78%2B4Nk7ijwatjNpAIaycTfO5yxewniphHOCyEN5HXLdwyz0fX99ASLYNo0J%2B3K1bqvXOR3A92et3%2BkyhO9iRne9eL17xaEros3pN4zo5xa%2FUL5KNK%2FoVe9VFPR%2FpZ9rRF7TN8MpQrD4hgcipDWd3eEcMVRu5lN6UzkppPOlyeo2H4ViBvNdVOXfEuuz3h3TvwB1oWZUHKQfBsgXICHgFGQLZEUBmhSoqmiB0n%2FE5poVJM0K0mYFSWMCZIl5gALVLihIr3dRjfwOlajvUDznzVVBL%2FgiqSitB4PNeq94qBrjyRQ%2FlKLqu6G1MPQimijwNtYsF3GPTxbekmAXEtldUJK%2FMSm0e%2FncOlNI%2BUywfGB5lPUoTfAQVyg5LMl7KeaQqTZmCYlDW7BfOTG6I4wWDFkzgPlGyZ%2ByBSEhYxPuU5m3Ag8pzQ4JmO4T8lYy83sE9Gzcju2aiUkwGvlgDXEbWST%2Bha0r2dIoYEYrYsKsMj71%2BfDtJX487AvsPHBXSilYL38aDImiYEZSbvbUtXk8jIJF3slFeheWeHNixecLNFIMR6J%2B2BPDySggBnxKLDc2Evqd3NFPQP8hi6YOTT%2BL4TxmB77AzfRcUA5KXFCmxQKm%2FKZi%2BHlBI3q1AJ9OLPqY2HMqdoTvfIpFN9cvBaEgmpLFMP5Mv0iKcOHaXyJ4Sz%2FjoRhPbsV4KsY0uDfimrJf0%2BfXQ%2Fp3Rf8D%2Bj%2Bj%2F7G4HkXimjh9cU3tvaZ4mprrXygPfUE5ZqG4pu8WlHHxWVxjLxDXVMM1un9N9V8vfxPXK3FNoZtZIDBlwPw0xVRB4N%2BKgMoNAhGgyQE3OVhQqQHaTQheBNTyAJ8GN5H4hNNUGjAar5k3F7MRsfKMewVl4C1KYBcVs4WYfRYwvzqn9s8DMaci54s4HgoM1fyzCKlF4YQoqcVIUOuhzk%2BBm5Eg%2Bo5GIhpSH6Mh5Y0oagSij4KBiBA9o38Y9ogKjajwiPoa0T%2FkRr%2BjFXJ9pn80WRHaHnsUE1NzYm8BP9HUy5hqoebENN4xb%2BwMivGEhiWmDyjr1PcpC3U1JqQuYgovUMoCJSxQAjYs%2Bv1NxKgQMahr6UM%2BQcWwaOTmmkpVEhHKdIPtpWKsDnn%2B95Rt%2B9DOK233P8WZNg5NwugT1qPmXUpZXD76S%2F0D7BOXSrzqDfFWl892dnar%2BuV59ZntnwFsdr9FLIDksgt408pH5n5j%2FPQuH8aXvqlZVpWz%2FKjbwcC2NuYPtjAxn62tUI8vUypETxtUI3Ot0OOsnoNXl8%2F272GfXmnil42REos5mXa0YAfy%2FzXkZGsWmZn2vUsFUvcV7hRPTdGYVopOISubhrmoxH8UFvlz5R%2BlngK2kwEYq8OoiyD6PjDnhvBsdwBERCC49Cul7uXPnFrWr7LZzhy0%2Ffsn%2B2lRJ54%2BeLILi%2Fz5aflklwrmeoPjZvusXzuyKLfsoLiU9wsHZf8ZXFMyZeSBhiIKhl1xxOKZ0c4sAtnbie%2Fm4SImUnfkS1onCOdrIr3Bfq0D4tWW8TpcLfk5h%2F%2By9TSYf1qDeGGr5usopIxaYkE7y%2FKu6nBb8oy9ZiaE29bNS75YE7F5Q5QwPqT9kHY75p8zsUSE%2BddEcawj4rCXPqKi1ZxVotbQTIuodYhkH8W0pzy%2FD6akKVMCK9PfRraI3M0PPhjl49H8Aa4BbCVKjjRqUoBC3Mbc1x7XrBFzHrHrQfzKpUMkQfiJVY59eE5NkKpyD2%2FBdyVN%2BOoHuw35CFPbMXujM11G%2BTtv6Yt9U7N%2B0mg3%2B6XrThP4hSsvdbe5U9HXHTOSpBeiUn0uiSDelpkQqlRz3vjcEIarWGUtc%2BjJupVPbb1XrXsTP3tvKtOXqoEW6tCZhyepOtimbupbHGU9dV8J0CCV3oCOn7svyeOi6e%2FrJ%2FfqKPjdIoXzbYZhuz3lofcmXKTkPXe13AEUtP0KyYIcgV%2FazgdurJZ1A%2FwVWDgwm15096B8%2BNJ5IhqqTNuEWSWFJu6zP5z3HESO7u8KiNy6KKTx8D0AsRDesnS10fsMEfZFGZYd7tUa1utmV9M7EAUzSBXlgcY60Uheg0OtPoZc0vfme2UmlOA4tKfP8WP2vbCgwVzeic9%2BdAWdvzgUwfIpJYnrMBzBP6vH8qDh0E%2BcB4urYJnzz2KMUXaEpNMGU%2BtAOLYHlzz2ReJyO6cNVWr4ZSNrlpmdXbgA%2FOYPxRvumm76itfxBrsrfEu21zo6Ld2rpLAjjHYtGjYhrsFDP%2Bxku6dcoJS2oHwP%2BfDh%2FR5tEpe8JeKU%2Ffl7cfn6dYHZlXut0S%2BwWdxnHWbAzKaztIh4T5WytwylNc2damJEz%2F5K3Wq8dir2VdYOlXOXkqLbo7wrr3lD7RFbjq0Zmb%2BAYFZl6CKWYqIjQkHt5kntlNBps%2B%2ByIt%2BvEe9OwGkZ2khB1oxW%2FEIuukwIwH0qOosv3AWK9gBGmoPT5sWgc%2FDPZr0%2FYJfG2RxqK8zFmWIIJUjKxaVoIoNOXEsZNRbtm5b9CU0juGnYohX5aBL30r3CnFcC81CyJUVEi1g8l8f5ygzPmliG57SGHIrwG5kVs1uPIRQtTaXs%2FLznkyUp63VZvixsQva1wIZWumRSczzE0E%2BC8XJHgU2WvyvV0Lnxox4OdbZUfV3c2K7pKwuL5qSor0u0YW1DFhbsba0plAcqNzRqFtLU6ElZLjuFqVY7OiG47CTT07lz9soUdrROyxdQ25GHhHDt5FDbSRIfqbaTrWQ7tZ3ki0d4vy50VlIZ4TTauzv20V5Tt0amXQSjpenKZRauYv%2BdK%2FKtK%2FIM%2BiK2NxrnBwtn2QTbdkw9tJyxLYJbf2o5RQqHK7v6MaSB7N7DldC1jYpPXIN04xgdKOCYClN8S%2FMo8haTYGj5%2BgICbESe6RxHftSbeCbWrExDb%2BSKP3NFepFpdJsWTLCw%2FOdALGcOZ2jrcP268syhjGzD%2BEuwVba%2B1pX%2FW2DZCpeRDZ%2FQk%2BXejJPOHM2QKX34srDShqvoszUDiHPWwSmuKjihpIY%2B4GFu28OPHZPAcSc2wPLc1wk1hyt7WGBLzFGW7PobP1r6t652OVOI2HFXA%2FNjjkowzRFUJJylfXZWIcHK0ct52JuFobVQADeO3LErb7yMwk9%2B3XIgIeOhOOdMuHAtWkYx9WkAtwWuJFqL19fuJOjlORPcOI6TukS6eAVpFxPfNwGSUJu7tDSBQgWlUgqcUljI1uGKkuOm1rh51tpB1CGworlD2NqTNnzNAgILc4nMgvnKQrC0p9rT7tMWZnbmzrfVT73hJ6iSWHlZdcaMC6dh5AC8cWC5mJ2Hh67IHgOXE%2BJM7DtdTDyzsVPLMclVVIBMuK1G3HXk%2B%2Ba0Tawip360qDu%2BjizgiD0idz2H%2BxGiS%2FypvaVTpL35U%2BRPZrlDNNT8XsaaBchYswRvdhXY2NefBTG87Vg4NpgHLny88IerqQUF3siCFd5wWzPbD41E07QCInMuh65IIFtX%2FDhaxUvLYQjRgJb72QURtvAPY%2FeSV62zdE45i0LcjrLnEh6KbP%2BOBbTOPKy7sjuc4k7D0ETJ87BtRy7CRY8tZxjRq3jiiicgtQmiQqeoDg%2Botjq6Q2nd5QRzYu1rNuaMTTvQldXc2bjV3C7uF3uvmjk8rnJczcY9pluV%2Bdgk7%2BZja0bG9pqYWlPJcX1CYXMzN1FzJtB67HHQIjUj7w6a7hYSA4tpAdPCdoQLg8eRRZrGE1ojFsqDjpujC5bTnXh1ZfuPvArNeYkXrP%2FsinTTjRJbQK%2FBmQJFbYvWBeV%2BQLBpjjDi%2F9nrnLp8bek0pwcqZgVYCusqsu9yXkrxb0%2FaJhJaWOO7gAc5OyeoAVe5Ukp%2FGE7tXssk11AxYu3aK52jae83ZdVqbDusRuJMYm14B5FrV4JIVxVnwKOyGPTVNV2IL5ouneacLiT2YLPHXE8qwTGPSHHMAg%2BpcxwI1Z54VJQJ4Lw%2FuFMICzsT4FjK%2FUkULu1tQ0aaG76MNTd8GWuTDJ4NWBMi4SwqApFmmaxmbdsm0WRE2ynliHylb%2BRKZkHOoTedhmMT8XKStegQ2XMTHLQvuj6RZtStOQzc7Y0XoTM%2BcFAtHOegc4EBXFTOPOy7Hdb78dKVf2nnxl172%2BWbinU0RaVcRBZjRwjGJubtrcXpfezaQvfo8plLOOTwLMx3iZyZuU0FA0pMtI34zmQsLyNnhtgVKRHZYei4P%2BeNHNG2dQWOKshZIxg1UT3i27Rf2Vf9kFIwbz1bzoVol8CQ642HNimPhIbvSvGuLFbIt%2FdgdlTlWQTVyPaBSeSGTf1ZFC6YJmvQzTGZmcfQFGN%2BNfNMjDmzWomVb617c5dyMbXxr1aERQp5w9AcQC%2B2muAtLdIZUd9Y42yWNfLBhZqxEYGQZ5GPdrV2rfMwsMg%2BjnPSXpzS8y1OlvD%2FyPJNLyOPvBUxjVa9MpGLSuPts0W%2B2a6l7Pqau5ULZyPJJfn7uefKOTzIOTHY29tL%2FWo43MdIDbWd%2Fap5Fu4828tmKVUPKVGBcjU5n0M6NYGjkTBaB%2BM13%2Fty6GLxSFqxxV3M5yzrcN4EXb7bmYl2WSBoXrjVJwu8t8z9G1t5UHUtG2Uc6KVtNQa%2BxFDzN1orc0%2Fq3BX0ymW%2FAapC%2FXeP91Sz94h%2BcvsXEVSdlneV8hY7Z6DkPk2hczfph8qCsX3XnBUBZEHmfWWl9H6l5yMvHbdyvmRfrNq%2BMEim%2FnOclnf%2FWvzl3%2FNfakUbf7Q9WLtNFjxGIuQStzqNDLhER1sZPGBZRulew6Dv6NfBagyvwiOnYOHsDavImbEOGvDMRcqfFZxNHnvgDC2v3S6jEC5e%2BBCj1AgsNpjzOhyVc35HfGvuKqU1d%2BUt4ssLeXK383PuoqNSmeCo1yUT4biuRdOBnS%2BDgH%2FW3tQGmRvZeTggyphoXqthHhs9MKEeF6dNGPcsSmvoEEByU%2Bw4vnVtEYNjbzW1KO6pVY99maDC97ddcVOL1bPAOzB58oBtSljLEs4Mhn5ocfD26px7DpG75SuosvCGn%2BxFtIiCz7bwoSiWLTE4DuoK4mHpwpT0OiOl8pKJddzOtyOCb0taLK%2FRm5F38%2BEkCufE85lN42v5rjhbjEy8geM8Z2nJzdnaihk1pS5YK4wpy4LFVKbGlejV5MtL1bgqC2J68xtkoU%2Bq1NcUEeu5xWveOUpNw5190xBnf26I41r7cHDWEvTvX%2Be1br%2FZxVu%2Fdi76Fx0Ece1LqpfyrVhzG%2BUtlJWkl6uFsE9NFNV0JTOtFjCKMDEPZLOmCCyyI8uAWEQGJar9yqA0zGbewdA0b9i57T1PgRQpNbt00RI63YhPmDAjXtPARvRjDU658lk2YR15NlnYUhVmtHNzlJuLLCrRlEvA%2FYtoysGKiltNDimP1pFTxW%2BrIIfs9zNferecpJ8am0ohDNoTYhLu5trQ%2Brjvvd3fars%2FDaQRvpF%2Be8525fJxv3%2F94s9%2FmGtT2xx0eBQ2tZHz6dveoarszOHmPV4vw%2BUymPnr4WqGp0NhWLbkiZ2Q8bUlCxO6sK9fClUeghjyuaVLImfMaYjyXh1J4IKbcI%2Fmm3cQcxNd6idjU1u%2FGEYo1a12XXvPDkyBB52M9xzHoGzhOmej448tFbfvj9AASF8Em03DAp1fSng0LpOFb4vKKHeRnm%2Bt3zkputoABHOpfO%2B93P3vweWzh12G2mDkJL6bXZnW%2BrYwcSLtj0oMp1pXYopkkO9HmcBi6ztetS7t1s1G8c2Q7fxjb1tfu9WzfIhvcQulvMiUPCm91u1yUajr%2FtMW19FMPHh23K31au0BU7Ob72Qnt40eZqhDt%2FSjq6Ufy1t6LwvBbLK0%2FgCjwIRaXj71hL8c7rka%2FvIp2459ut6rls4ne7N%2BUAPSmtim0b7VOBg6KlsM3WZj0Dkzq6VPSx3A6Wpf7Zb2K5jPicEwJBZAXbk%2BmHe%2B9ALNR8qG5uKwsoyIdF3kEraj17fYdzdv3wbM59ISOMvFprPvarOT5M%2FytXq4krtMNOA88Jk8GKmy9HLe2DrzTBcbF6RPfTbdPd0EVfjL2GgxzYjkcf99bwdxN74IhYADi8CP3VSCSnw0pZBWsi21oL4oohguei9hp%2FO9AKJY4md8%2Bcy2%2FHjR%2B9rK9tzO1vzXOW0DjWa7BTIEZT%2Bnj159f4nLhvTqKDeT%2B2srWafJ24rZ0p%2FjWjAXmkZUnRYr%2BfP3P39Qf6%2B%2Bz%2FQBP%2FPLtU7bqzr6xMWzq8Q3tfa5hYoJSOB5RGaz9iOOLaQPcgkFvoWp%2FM%2FedEXZofVITCkumCnjmPMRnASxqZwd75qW3gux9D4hQzCXdgbYdCH03mPaMSZ%2BbByObmYOnPt%2F6cFviduk33OcRvbP5bjPnXtesUz2ZF8LjoJKMNleukjynS9wLpJHeZuvXKZ%2B7T586BVSJ%2Fku5R1%2FM%2BzGz97%2Fx1eXbg%2FgBCPEWTsg5GYSLJU7wRA7Lv28Ejv3gxEqHL0EpHmoZpfBUcAa8QbEXm61AH8b3Mer%2Bccizq9%2Bt9v4XPYEMWzh0PL%2BDs%2BzC8dbmpre%2Bi9tkDN5Cz%2B5m9uu0YaBpow90gaYZE7nwp8tlneY2g3zubnTxgww%2Bn9img3K7df33q7VUv0iW%2FYyvFqN3Rs2Jz16u9YVbLtZc%2F4tfPfkz%2FrcB03OY65w4bj1ISOtAzY1Grb2%2FYK9iRrRbKPXLHiO8zQ3fVp2OH%2Bfw%2FQ%2Fm2poFPe3vxhxK1fGlStn7MoZu3KOg1t%2FZGXlWLtUd%2BbYndvh7sDpYeGKlc7LhpePPggPHrZOWy4TaAUaPDszP44JotY4il3HfvQ5GPpVlwJJTtUtt7DztI3T4%2FwGJaasxsjjtniYug%2BH4VRI7Qhjn88e5yHjvQ%2F0Ctx8Z06zig74rO2mwh6gLLxakad6ZXTPPQiLrU6V%2Fn3eV4x8JozeR6BdbNvOtFMYLYZ2JmVy9vdvXeZoN8msP%2BUKV%2BAX39dGHm1Y0nEZlpoguJjFYiehri23hZT9oF07pnW8t7f3rbPTMBbL5KI8P9p5%2FT3evgcHNL98%2Fu2T%2BxtGK92Pecv6ArvxarHwnU4POeGRO7EufLt9mHMX7cJn52dnzf5goyM9Q9l1%2F5nQ7Ukgx7JrWoGzPSbMlLJM4iEvGCsPcYF0hMd7O8EMa8PFPMrsUxkaAKs53OWt5lP4M5jBCWPsL5e4NCSeyH1E5KA0z00kuMnuANzbJQZyXa0HIhXeahQQP%2BHDsYOYhtcEyv6UWhgu9JzC%2BS6M%2F8IntHcNd%2BR%2BRH1he%2FvS1D9uCjPyXr8UwwmsK8SM0%2BD7ksqFA8D5cCqm9JHAfYfBwltORDif3tH4wL1LMGI%2Ff7wkRRSGsIAf3gzYswHw8mAIpzVU6UB5OhTBIglGvjeV3telgUHK9jmIwjnbosXtdWofrqYLvowuf0fencBl3ID9%2FkVsHd%2F3PyFa3tSgDtwQu34tjRvDHyDVNdFPNJ1mDyKiZXQ3kDb6VzMv%2FsScGQ0JNzheSacWaMgQh6V6NK7nPNrB%2FBNNOScsVtQIuDxcRXHynMJ5jlB22OAfIJivbgfy64GCuRjxEcacA%2BGUn2z0n54rogZETGOA70OazSEtUT%2Fiy9a0PlSS8jygLf8PhrNR%2BqKq59HEpamb0YrKBkMRXNGoDmZwBRnFk2ABnxmT7Dv3dhoO4VciGInAG%2FDsy7UsVEYR38WER2mm4uVAbe4ChaEufzSgRTL%2FNPhMyzEWGSvUFAaZM4A7DGrR1L%2BleR96i3g15WvvwoemPaBxDnhmHTAuBfPuj%2BBncj6Eu4lY1jRgsOMeSCO5HORxRIh6H8CE9IBH9NMgHA%2Fm1AOUH8S0CUQrHnge1oFcIvGEmEWCIW5urNorxjGX6bNzIjggiaT%2FISFvrYXs3AQ%2BdqgxV%2FwAmNB4X6F97PRHlaQfq9mC2HteCOz7IhaLcDr1owFWK7xhKvKQnZfwyvNGs2DOah2y67RcliuaJH4bjqJwJrS5bPZ9ElwjcyzGU%2B8zoS3lBmmge6aV8YTibAYJAoOXXQKCGTUtXlBWnyuF4toqJpRnFvSZdngqX%2BLCgYQLOeAqakVQJC9l87oiaEebqCIaR1UqYYBgTEMqlJMboceXwGgOZKr9ZYSLLDjTFMdERCyC6I5hlREblRvS2mQUK1tIe0EWwOmVa6ROc85MEmYE20YSGMy82wGmIY0I5jJCHnxnC1ZRMQLsGZXxwyCOJwOuE%2Bs8mx%2Fv8CgyXSrvNDxStJTYWwytLLl0FNiN1FN1UtFOtGUFU3hcpQ1jEtIQLK4l2qUAVSomy%2BViMPSGEymNkt%2Bo5%2BLTNQYHHmfguhVbD7z%2BDHhE5TuD8SyAt9hpgPmJgpB2Q%2Fblw1526Hl7J38H6ejxK2CAUTwho3CQNCz%2B80B3CELdQTAerObeZ%2BoGL644nlJzfcw2habQUsy%2FoVf0Ql0OxnfScYyhqp7fbFOFOnu3HQKjjz04CbJ3WsJDAfqILdNbXftejCvxwFKZBR2Lq9CLRgROK5RDeSMZQ2MwWg3Zor2MoNGgjUv6yxTDMboxmgwXA7B%2BwKijkOkIf%2FjNgH8wfOyECeXKPKibIYwXGW3L9I0Y%2FzqaM%2FQT5hrdEPYKYi8JszkQxtLckGBEm33i4RcYO92aVWiQBv%2BWCSKai5HtD%2BIE%2F3yiWfb1Y%2Bb9ohsqIyJpHUe9bZM2ja9wa3BILec2q%2FfsLqKiqM8qpEuiV2qBGRPQ1mvE6eDMG%2BoRSIMDhMP4dgDQGel2qbjsvOaj3BkRS7sLNYuQpPODATdQ5ECIsAThcSJbfBWELTMx95dMrszkc4AI%2BPgZCGm1GOhb7svGO9Wue2ykJNHx2JsFRCAR8bkMJN7kbWcxobqJGFCai0QcsCw7eRV2QjI%2B7JwJhL4emmh1RaXReoUHJgrreEUlJdSS3L8GTKIacbRNBsO7NHYVQbhrZHVF%2BnOmbEZJhCwpbUJmecaLAeGYySj2JLYhxJWGIxW68RZEvER3iyUKpTeeLgR4skAh%2FgYPGcrNdfDryieIXS2YdJSPAdGusQ6D6k1epL0lesWeoJeapKduseHO%2BDj5tzGtQ9UB1DX3fH5SyiIMpzotjx3dop3Ex2DWIUZyPPKVOhRx38eUHqMqO0pjaHC5fvVKev69Qchx1sn2e023Gw7LvorbTmr5w27Bm1q3VTtol%2BpvuH3mZI%2B%2BnuCg0xayORRGHqRPUy4sMjVmDIGG7mGx7O%2F%2Fgl%2Bd7d0ybRSGlAsaGaMUixcXhmyxWJfdoa2SDrYRvZ2pfafnjjJlz9%2FX39rJ6Wnm9w6vCWXnaLx4HOdgqqtmguky4b7dI27WslWZ9G%2BfenfP5m88BoxdFrVyrTMcoH%2BxM8GHLQrLGTufMrO%2B%2Be8uvetNZ7l6YHtfemAL7dEXdcaZMauxsPeNY1hdR8olNbpBKDsQf7iTU7mxIUrc2GxnhtKxxZ8TO%2Bg%2FN54p7X9mDNJLC8%2BlisL3P7hnSfZkEwTpP4mCysra2OnS1nMJWx3gG%2F0tPO3K%2F1krVP9duhNcoFfagWzjJVVY3Pzk9gb7Rnj5%2FuXu32m6qmv1fksR%2F%2B3tjmu7h5no91%2Fv%2Fvfle6ldvSNvoPDL8%2Brr6vr9y8GldLRQMtdF%2Bvyb%2BuyiJ%2FSfY%2Fi2UJD4N90t4J3%2BS5x7RP6VR1yM8%2BhDpT329COtYssDEPVB0RmIRCnW2Qd8OxyAUBV8Q%2F6V%2BOrly%2F96eXgodmq%2FQVDRZcMvxqnWlqrMT3f%2BX%2FV15amt8f3UiEwIlIrUFivnKE57%2Fdqp7Z7N7sl%2Ff%2FOXg79%2FI3bq3nxOQ3QWzD9VjS8EcSK0j3pi6kNQKFjwOCIuhyU5z1U0jfwouMahTS49pgw7WhGjamrNbLpgoRf5VwlCZgbnGXMPrwvGoJSOjfyDWq9VLyJlDXnUwsIFFBWUuCpIN0FT8OWAob%2FRn9g5gNZZb0kcJPxUHITTkfWlJv%2FEGBJnbzoVmgENxyLpk%2Fjr3suXxMvCkSOOUY2Gs%2BkrUZuPBBsIELVYHLBn8ToV2PCvVtfXNLl1CCbq4WyBy4G5l4Y6utPvzWkmES%2Btcfo6H%2BXfevLgJImBcDN5y2Q18l14EYui69rheQPCOfz0JFUquOHyt80Hcg2fgIrgUj3rSaDRbutwJngij1h05xpMXYtGMKP%2FUk2yd6KDySCp9%2BYtLG4GS8FDoYagOddfyVDykXxNv6GJoP%2FZvuA11yqKaNI%2BqITqQo4qfuUxKUJaroiXE28YhRxIPuer3iMgqXQSECI6RQpZsy%2Fnc1XLBZy352tOwgfyVKEprb%2BIQ%2B%2BT35UL7pCmlP434fUeT4JRcTQNr7ypOArj1RX9LkNBPVDNl4%2B6aEnJuCpYvR3i%2FEOFzyATS3sK8xNC9pV%2Fm2xL1R%2BxPwOKWgjV%2F1P%2FhvPSE7GnOGU9DZeiE4l0XJJQPRMEgCRvuRfV1zNtqYBDIYubklBddH1AEGyV0A%2FUyugBN%2B60V8jvu9BjndG6l1PSkydgPTZUQA9%2FIdIpMuand0N96U8iGEIZiX4ozueSJ5RDcs4KsvKXHmy2nUfjPAldQMH6ArYDBM%2F02%2ByYv%2B1EJYL9QgIVvv4kzd0TaxvV1ehP7JwBa3lzcQRz14YOSF729a2UfUEclaVzxB%2BmirBL8eSs26k3G%2BfdZk%2Bk6jc9M%2BM99G3Upnu1k4DBWi3U6k59DWhZ0%2F%2Fq6wLqMRU9uC6hbr5Duom%2FuD8bmh2kVP%2FSMW%2FbbVH2gG7D21Y2Daf76%2FJb3%2FjbmuXNDUO32T%2FvnrJem%2Bg1%2B31IHB0jgj%2BMiDf8ZGkxmaPg9vmUHQLmQSRN43AGxy2U1KB46ijH1VFeR%2BenjWa3V%2B90m4NUtmvnzfWfTfdtAwL3lNMootrUjtMk6qN4FUXPfwF2ha0iuHgVaS7hcYyKLnw7LoVzP8LjUeZ4AH7FFr%2B%2FbTUGPRzm%2FwH6Wb5riuqPZ%2FsrqwTCnM3um2ZjUGCDybZ9blvbdNhj8mBHx4y78Sxb7NvabbIFvSU2mqwYUxXZn1oWlVxGnG6H%2FsLymrSlySaQ76Z6ORNIDzTtZEZYBpm92dXI9JTgsrdPrB9rH62%2FfmmlWKr2Zq8W9jREnm3Q1GmaybZ%2BJG0aGXGBZVT3LvCn5VZLix1%2FDQZyPAcDExgts7ue5YPAm5st9uJhEJggbE2OQ%2Fmd4dzlZgoK8J7DituVwxo7bH04jK8NJ5Z1PywXqbFiLRrmthyxU8uBA60bW6xYGdmm4kaBnenzzKrbV5yFtc4%2BW6vCv%2FVN7OE0gO26UAHdKjsyCn%2Fz57YR7Gt%2F6eijXKnm8E%2B82JGXYk2AnfhT8xqJw9uGOTyBw22ADS9BrDXLrATiu1x40uEmYGr5QJjadv4YS1gOjbYxAM0aFZ8Dy5qcwzK0bdE7dFkpDO0Y24%2BD7eHAtjLt9g%2BlLLWaiG1uXUiK%2FIXtZog9eVhXjFzmrC3wi53gF7uce8AziFUgM5HOhW67boktk4RsJc3E0lAbNeMs2hYn%2FiZo%2FBYsSpG0cnjrwtEjCE4sFN1kP2vWTndoW4ernIaWTz%2Fi%2FlvAatDRtQaujysqZY11X%2BqqWRtC3Y2S6yHN%2F9J2NOiws%2BmwsNl2eSmvHPlzP7JsG3bcF9968GZgI4meBYF9x3z37flmeUTpiBXdJniidE6VgRxY8CEW6Pl6MMBjMMifMCZ3D%2FJ0aS5PqnHoNteXqP9riMulOg30OS1Jn5yVmqCB%2FqZThL3%2F884PP%2FywZm4P%2F6qi3ETK%2BYFtRicnLV9dmSBSeIBbcHC7wWduqhHx1QbrPDygg4Nurf5js8T2z%2B9Ww7a1KfRo%2FR%2B3jZxc7vur8%2By8X51frt9fHdBP1JUhGaAfvFRfP31arPPjSiqV5GyjtoQ%2FCaVm%2FKPMuD1mDCqVYi0lV9L%2FD8dgfJjpNL2s8VP9X5x8R4KxTB05GOdYQ%2FaFB%2BV%2FERr%2BLwwKrxYakGqJLuC%2Fc6Gi6hKlwX9T1YweLMzw5dUhi2raXk3y0Wv%2BHtP6RUD7%2F8qyvgdM%2FR%2Fu98PNlWbzlBrfYyUJKPyz3amXu%2F99uTN4zU%2BXzjZLh1igQdk%2FSiWmnSe%2FJ4X8UZWnTnv5yLUjI2f7aNWQeJpBBfzZ%2BsnveUJ7D147dyrrSvUP%2B3t5n76MNnNpchWq%2FxWSYTgJuV1A316Ox4vM2Fg5cQMrfrW%2FPwqH8Z4Sv4fR9f6f9%2F57P%2FLhSIKq3p%2F6t7hlMfCIVbojnnJvspxNv%2BISiZjc5fJ3FeMQW3VopZbpnYCvOT69%2FqINSUotbgPxszSC81BMpf8yQdNHa3Xo4TYjdyQWQ9zk5Kt8EKMKT4z8IRU9leNnFYl7wTe%2BGIXzp%2FQFTYVYhmIWxBNKmPrC37veEx%2FH8529v1Y%2FvrC%2BpqbAJdlUt2WMyyopDOumBUtuFs6hv1yjXu7tTfzbnerHb9nIO25Gr6YjqlPE3ti3ytRtuQqpASfnxG4pxGS2hmuPQ7R4jpulPl%2F1pE9l462ClxNf3vcK0HkMvDRHFIxwN3YcmFYAi5Ctc7mv6TUdUFr%2B7%2F3m5fvnu5ev8%2Fne%2F%2FJPinr9%2FZPfkwX%2BR%2FXjw7D%2BR6NOLntDWTQOGEQahms%2FeoG7qEk4HC6TME2YCn%2FZpSPL3GrxSk8YsD6gTKN%2Fs3VTvtn7%2B9ZNISDaRU27G9uWjpsgKP5fRzOFUCGhk1Vq0y1s%2FfI5vbysPqu%2Bn7a%2FJAwqNV8i57iyry%2Brz6mGL15%2B2FGd%2Bfu%2FqYLbt3q0pHbyA6uhScfEqbtzO8nK38Vd5pFt6u5%2FEUIsvLSpq1vTUtr6DutsPNAwtOVv7yspDdzPaxo57UVukKAVEroupaUFzgxos%2FmU0%2FVkNQxsph%2FRqI8FA520eSPMqJHgjUvudN7SY%2B01naLuqcP2StKWLZmDr4qYAIKCDx8OnKkxNNCKLwZtDwtntW7txBI0Z6GATbwYBwdl5GZT3faX32GD0DoaMY9fuFqqtA3jk22ErQ6UMcQuXT06XEXi0v5jfFzYVt6zk%2BOo8Es4P9iwOnhkylhBuPke2%2BNVIs6RvIiLFyy6K8TM3DE4zawlr01c4xZAydxn1gZ1roOO9jjabgoxt3XvxNg9P3DFGu535ghXru8WVlwgt4wSzffVPID5gC7QqQMgtj5s2Pnuw4d94l9fV9ff%2F7ClWVknQDiBwYV5YVxWSOUuVAEsTGvcWoLS1F9yrXlP63fZEKqsDwLtAYTpcV8xE5hdYpegCCTNf4DfUTauiBNZTiiReKgb5oe84ZBZC6YRryx9SCpr6l35sP0BK1aExXZlSU5ckblpamoh4a%2Fk0pHZp%2BwwhBEG4UUyiFo9tEBZ0IjMbvMuYYy1fjcNb5GPUem5d%2BSPXTccCxyNCscNdvnnsGnrNBeJvxKTkfhLHY06nfriz9YFzSwXuTneV%2BhXbsXYjiobWPxhcAu8uCYZ3EOMv9JbsPLbZyUF75Slb1M29klXsuv2nqOc%2F7Xx2rbN%2FyPgW3A5X4i%2FbeUQ19HQjVBcfjyPv%2BSI%2Fv2HD0tx%2BewfRaQSMS5fVdeW0fgNdEwhVSJXZSG58mgqpERzmnfzL6U2vQvLd4W602wX70soUOtq7qFF3aUvtvOOl7VmcUfTua1Bi43gBjP8M1NjGH8FfhHwB4mnkObtYx8sBswsQqzYbZ61wSmOg1vJHyIS9os8GC8bOe5CsDwyiCFJgro8UQgQyQ7hI9qPxHH%2FpC2k5Ub7UwnzwgXvpa0vcTTHX66u2mpmwZTZdKX8s%2FCRjVS3s7K%2F%2F%2FMPP%2FxAK%2Fe9uFw%2Fqdret4zMiYZO9pN%2F%2B1IEoD5%2BOf7qWIS%2FPm7p%2Fbrtgvt1C%2FPuRTpgOx9fV7Oez54ztehgH2D%2FJBSsIi6ULc4RPZa%2BuLoTqwXMcApbyT71O%2FvySnxtXNBKFccqc%2F9aQMLPTmcVtR35wwDWtjwYUAyxdHx5uhEHEL5hQMTtFY33LRzm4aSA8vi4AhnjhANWAhUFP5utxDT%2BVQTzz2I2%2BquY8gXAa%2F6VZrzGQRTDuGgEi5ViRgT7MPwMe3l85deb34mIjyJWM5g7HMViBtZy5t3GsFA3heXM6ZJofL6oSaT%2B52uKCmAZnKVLAoq1KOKTUPqpgnDeEOcS9IsQB2YwxjqTLZpRGdRY%2BvaWv5tRjfTj3YpbLjEKlxhyNgxHcKCs3N7Q1o3jp2Ah7XDBcheuI8J4rHSyAf1WMVwtYcGX5g13Rahhv7HJLoIlPj0R8qqFGEZhHIv4s%2FgcA3ewSUR%2Fzg%2FcgXzJv1%2BLCZR%2FxWQ4DalfE7bAF9%2FNKEJaSJNTIg21TWlqZyLiX%2F6B%2FdRIwPJBJOI4ElBTFktweTGHYaSXhveWf9ms5C36hHdxi4G75ZEbSyuXhPTF9Bfh4d9LEfwiFhSKw7FY%2FSJubsQN%2Ff7ytRgTxN7K8VrN5dP%2FRcTeZ58t%2F4qIgxGHYeNXDGkIaC%2BA3WQaRMEzQROBGbrhH8xbHICHpc0Ch36mbq%2FUcqx8lGdxH6U3Agy2%2BAgoJJQ%2BW6jggr7%2FiOXE4PlR%2FuIKg48EeVVffBxOCFY%2F4lYCxU1wp%2FcjjjjER1gaFh%2BlGWEuhl4CNi38URpZEx%2BvV8Ho%2Fhf4%2F7WlWOOTJcH4NLra6t7%2B%2FSS597EZ%2Fz%2Fq9PjXL7CbzFxEHcU%2BckeZbU3EUdZH3IPbaMq8ErABBSCcMZNFcmNRt7kYEc8JESTNoa1HgSZctEsb5nyHB0aACb3oSxhUJp9qsx%2F4vN3zZXSnDqfZz7zQ99V4bdJ3ajejH8E3nFRX5FgJ6cF8pC0KQJyDK3WCL9EJ1yWxdOtLnajL%2FW2lbo2PxKl3KlpzCgfmdYfM3sg4J4gPkYtwRoyPGBsdMjLhYGuO7Rh06Hm3lYZgzIH1NmB3WiUmoUwibZhstFEFOnznQxzq0T9Q2EfajmhSe2SIDQPM9VsXFzRUUB9rydfeMly0tIFi0bujFX0rU6DaLkPUIBk4ledqJ7A80AD%2B6klyoOtfN28XyoIGd%2F3P32Re%2FvYX%2BUJt%2BvpvSVBnoeB%2FydB5kGY4D9IcCGey%2FFd9SijZHymDHfiVnj7YBMYb7FL%2F7HUwe0uiD6LrFU5w4sQcvTIfDhCCtfObYD4ieByFQ85HQ8BYvOdLowkXBMgI44n3M7YyTIPIZNaBP%2FE%2Bg4zBJiCPpegXNl7nTAHwj9xQ%2FIzhiDHBN%2B374TCIiOdACLa7aY7kSzzBTAdsuzsGuUGjfPuX278AntBEqX%2Fx68rDFLMxU2wsKEKwvU9FpMF2s2IGxGe2Df7NSAX%2BrAN%2FYVMNsyDnbsQ%2BRvrXSXuQta%2BZui9PfPiyItXA5U3wrNs5a3b778pOoZxikpyVAX31yGFNoIDr2tLdXWXn1fr79bfrF%2Bv9%2FfU%2Bin9G7I2ZVaI45%2FX6Ag81Skm%2FdXRaaz%2Bu6yCqvem%2FoeNsfGH97%2Bx%2Bq0FwU9b7xBFASf%2BDkbQ39%2BpL9j4L0sWd5a1h696izFqfSJmD87519K66lFtK2g6j2bVy6xYPE7sUjHRB09yyPndrOflLOX0vVIjcNPCdg38260UXbaQ%2Bg3JRm%2BunFmP%2F7lRtcFzOKZuZQgVO89bNZkPDOTj5o3p%2F67RUQBFbUPl1aUryLM%2BWDPn%2FHr2Oe8ie2bXR08olVBJ3sJqHy7UXz6qI23B8%2BHCt5S3OIYlhhnMKvdeW9dCNg1IU99GxmHitORK%2BiJK4Uzi54Rad2Wg2NVdgPDbtATL8sY0UcxsF9C%2Fng6wUIIssbG4nVlUWkVgjD%2Bp4z6suX7euD8LOJevXbfwizxADOVij%2BZgDagewV1g8VdHQV%2BivW%2Fpt5vZ1saBq3X6z21P7nFK%2BB6JZS6y1Zk6QNfCvqnJjsYc963dN4rqUf3zI%2BtgMRZmsGyEpydttHjXfnhVlca446FL95a3YJ2blbclS2%2F%2BuzO7wD4wgq99%2B%2BHDp8GqHv40mhfMnD7ez6VYL9hEgJkliI1IzCfdZqtv7AyzOWWIgfCNJsxnaNm%2Fz%2Bqb3kwFb4E1enu3bVt2cA2IOikufLzcsRXpv2dFw6L5lRmSTVeeNA7dx8JIB3G65ZrLbS9aV%2FWEn%2FVnf3u%2FXf3qA%2BtLEG356pZVacTKxVEYuw3Gq4uqNIecfhcvYCdbaPlqCawtJ9u2XJLNpRlyOmXGkSXq7mHbfdFO%2BREo7%2BwKnfpFDShs9TkYbbSuhjb6QnbKd16%2Fon5KxXMJMwvu9gXqrJkFcMXiGy217O6%2F%2F48OHUXW%2F4Doaq4r1ZNmSIfIDeLnLGeWlIe4pz4bYY1%2Bxn0XcSPH09R%2FlQW2B4yF5kUpfERpHntQEzhXI2v0Z1f7nysC4en32fnEm7%2BpQ258Hr%2FOoh5pznKlbUmepprGuUZ4xqkshuRaWNwXDm62%2B%2Bvp9O7i029DI159LpTLwKT%2F2KPSs%2BlpatKDiUL6%2BipQtPy3AdiODjbDW73R72lrd9%2F%2Fx3Q%2BvLr%2BnQvFv%2FZ%2F%2FH3vvwt62kSyI%2FhWESY4k25RiJzNn1plYoSXK5gklakjKTlZWZJAESUQgQAOgHjazv32rqhsg0FUNUpYzc%2B93rxJLQFUD6Gd1dT3%2Fa%2Fn8%2BfP95T%2Fry3%2FCv%2FqLF%2FAPMS%2BW5%2FXHcJTd2%2F%2FqGyjzz59e%2FPz7%2F8FpA7BHfFKcnp0c9M8aGAZ03Zw4394x2Iu9809%2FmiCgivC%2FWe6c8yYkZjJATyx9UnHC7ZZ3OWvq5pVO3UIqV7qPfAmrzKtKj6E0xCpiLak3cq2Iuc2uFAsnZ%2B22c9Jw%2Bt2zpnPUaPeaqE0grcJJ41J7Ml0un36Htyi%2Fza5Re0hp1nKAijh2yaLQVSSUU6mDEUuaT9LA8O2k1m72kUPPYpWr3Ka77mCgr1TqLN%2FpO0eYTdLBnGH0a5rr3uEftLIRTxw32R0SFP5mbaAbVX%2B81KJwuCrmWHWRT1KeXXAZRBN0tsFL1MjsZjoiup9hWB%2B8jN0b%2BIO%2BGvALaoOaXfw1VUr0XNaVUBZD%2BBoMZXSDqSCHDtUyM1hQyToPovAP0hBT2%2BAXNHq4IJU%2B%2FsFOXMwwnxj%2BRY3yyJ%2B4gIa%2FeD3DjkocbzZP7%2FBbsEXgv1jl89QmEpTzqxGOMA6So56eDHeVuQMFUcMnWzOl5keqdo06gGs%2F8UkfnexS7Du6SKMZdIOvO9wvdri%2F6nA%2F73C%2F3OF4u6od3I0z%2FdXuav7joKzgK9e73MKbrlE%2F4a8GDS6VtgKvQlf9nnnqL72UtGz%2BaizhUoUxw6u568fZK3GE8Q%2BlsqW%2BSHZhrCeqOVrXHrgf79qROzp8OfZQcQh9OEnhj%2BpeehUaoOA4kmUA5q2FQT%2BGgVRDBvvEBH5%2FJJ19FIwOaDpEIXSQj4qWZDeNsO8ot5waLJoGHxYRdIzKm9ulvJJIqGJKdDvLaBYFNnMS78OlSwYAeAU1xL%2FYoWQsQ7%2BA2OBcpqkMv2DyJR8oySjsam480uGsKJFy6qdoMEBWDUpZilOfZj78gifzSsAwqG7ADLhDB%2F5R2xZhXgJjX6tcnbfpOJ4Z576St9yGCeeB6nSj27uJF2aeUwbRKcWzZjTrayEehOldhj%2BfPi%2B482vlF%2F3%2BZ2AocIkk73NDQszHjL7MKGfENYVdTXHBUosFIb1wQfHE0dqQtoj3P7%2BvU4prmOmY8eEmxOS7Hr55gPY%2Bc6RidT8RTzArZzecoTkXCje7Th9141gPNFjUlXe6BHmCng%2Bhl6SeGH0aHWejYYo5bpXjd%2Fju%2Bx%2BevXv23Xfvnn3%2FlNy2U0pYTW4QyWI43XV6nq2974GgpnszN75azPfivVgN9W56m76nPRGd11XtdqU3ZH4OqkbyETVzj8jHSD6JVhpa6nOs6cNoZW%2BMVqL%2FvY%2B%2B6RGWxP7LJrP1oXfvwt%2B%2F3kJZzPb%2BTz9nDPtjyzFafwc7TE0QsosIo40%2BAzz%2B11uyzT2sWUlkoDtkTaIxMZHRfWKG56uLJBDvcdbns5jWSJ5MnmgvTBhMnywIz%2FX76Bj82fMoOyqr2lQIqSX6gj9r5ROWqcd9ouSP40%2BlTDn%2FTrYmVtog6wuLDkbv6UACB5Hl%2Be%2Fkc3yx8%2Fi9YLWb%2FXB5R%2FazyeSx5MF6iBvIvchFvuaElXHvL1bG6V85cMFhp%2BqrTKBkgszF%2BnluW1mlbXqm%2BwX8w5%2FKaUnvaJ4cXvYax83LRu%2FyZfNV62Rb7M9cxhl3L2rb9Uc76wWPWMqMP0W9KVG2B9ZlXUa%2Ff2ddzqvrcvFvqcvW5mNkRiP7q%2BqyyRj9u%2BqyyRhtXJeqj5pZzkpfsiGrs%2FDdN%2BFlbatKsWtBrqkCI4hlgBCY4RhpLfLDmdzPBwZp5CuGPWcgnDmeWhduQRCIlnYRlueBZNCI4OoOz1lDD8MnhR4wv8CsIKPouIpVKQgwKAgYhirSdYCi7JVemGBKIjoIZFnpyWdCjHP0JAvcpEMnLRIehin0Ji5JALBW9YEHnYAcOroEoHwVmPSIDGuxcvAmT%2BfPQkmtYsPgEMNeCsdZJUwAPhNFpCpoA1RvO%2BuwZaEnd57oxuyyF%2FU7hx3kr%2BcBOmMp7lWq8M0UDoLutetT4Gf2mpUSbHv%2Fn1%2BtTAl3Ly927is0lmbPvd6%2FLcqB7%2FvabZIEC3JgUQpsLgm2ICuVt%2Fd3RLa7quIPuqtmE8HGsz5bWUiIR4gqjsnC4xbF3ZavGuqLv4jR%2FH9Wt%2Bx9e%2F77txePvrUdIf%2FjfVIgFf%2FGbikrLf6zfVNs3%2BeN8fnvReqx%2FN3q0r5XtZ1EsQ5liK4S2o79i3bM%2FTfuTrYD7xX3ZtoPYJe824LdEhs08tFqPd%2FLYSMe3Ek6Nlmb3s2oI5rfJymJoHAPnuGNDl0Ce6Y%2FUWJvzHbC5An5WH5fXObCaNpHsiJMgjUUwd4%2F6%2FZoGvfsbuuJ0E61HrCvZB1R0lLKBmvZSTmjZA9PZp%2B1rJL2VDZO16lMRu5ZC7TcIm%2BckTV65YPNOz8VjHWAiYC%2B%2B4Le1fEXMK%2Fw3CQKRV%2B4DPVAY4vVBzazudDlbaYXWQKMSzlfiZhYSkhOJeWagsOCAfJuw%2BXfDJiUgElIWoRuTxz29x82yELkfry7TNl3Q%2BLL4R0ME7P8b5IMqbYI%2FdSSz6RKOU%2FjUWGDHnuGDfoG%2Bvs95LYxXd%2FNo6%2F2TQKaa%2FEZ2eK5%2BRRUMJMDoEAvxcx9hKBVKsAtIV1qNBljlw08IUeRCDRz42jwTZhK5Xl6PgUWu8BLYAFJcPIyF8kr4JRroYBiyf0UVPyE3SZTocRXSdG3WMo%2FDSQjRBFDRpkixk99mKIfJQNwWF9iF%2BKyk8Bm%2FiAFFVsVJFJnBuJMDG7FV7Acchl0ISkgarNFKqsmaqGZi0xBozA288wRQspBphDSSPFUZAostWge%2BxJ0IaQSrsl1A85PglLiaAlB%2BnQBATylVGtx9bHUjQoqprytsWx%2BCurHGLpGwNzIFRFNkRydILIMNYX9PEGU2h%2BNYrld0zl5TGMaavIPqpWYkjLjVAhe%2BLy%2BfI7ma9%2B8e%2FcJ%2Fjz%2ByVCMbu46lDGAgZT3C39W2pnzbWUvh6kA0AhuWzRr3txG9l5OKNrCAaqxh7Z35GWGlnl7aPq96pnft79%2BQkX2dgR7b854PlKhQzLNovOInRVybRAZyFT1z5a2PL%2B8ILPRrZ1z2Fbh7wV%2FKX4XzlWTGO1JSLjpzgb%2BZBEt0FbGwTgcW%2B7WoBBbnoyY5sAe4JFukdJhjwSrKqlmzGq%2Bnul%2B5Myj4G4WxfOpP8wdm%2B09IK%2B5XDuKrb%2BwNXmT2mg%2FcvL4DhVRiXi7Nq3Pu3cDo0YPmKpSdVWWAOWivjq1AEuNw4OpAOAUrgI2kE3ZqoSS724JLcvqvmLKcFb9JQ1Yf6RddWTyWK98JDVQHRQdX6Ao9tG5WoTZPeaBVlc6uJUyov2v%2F1r%2B9NNP%2Bzvy2f2eBKPkAcK8Ee%2Bvza34vKhOLn2fezoWqRGZ5q0nQlkNP9NRrjDhlQxeCeBVhKvzdhBKUnfhUe0vd7%2BHlFfefZ6hAP7nVLtH2%2FTUclurIgCys68E%2B%2FXHF%2FsK9HhnXwyNdp%2BBLN7e92SvT8Ff4IDvD6SzvT944LGeXrvZid4fbBalMD9xhiMvPnZDp9t6aTMNrzXi4RTOw11vCACnAR3Wxpr2okU89JxGOouSOUXqamQ2xKsrcnxa3TbDkfPSTWA7VIiXQTQY3DkvyezzIPDnc1ROZhen0Amec0AEmH73lIEbGh8D4e3HbpigiBLvsVwWRaSnwnMRAK4L5eJo%2FlZFLzlYxNf4prvAxz5wDuHwNu2MjyhYzqEHzFWg%2F1AkGOfQT67wFynwSDiqbu4cbBMFe1HmXLHThIEi7WbzVidvOaKs0c4RWnM1kjmw%2F12UxCmA6gm6xFeR6aobnMLOPYEhfeVFMw8VsI35PI5u%2FZmSC2vwnfPax9q%2Fhp0yBu4Fwwm1aCNK75xWECxmKqxKa%2BaiLXIryyZTHMBj98o7WAy8I2hYs2DzjPC2m7ajcGKCe1MX%2BxAv%2B3C2xbYeo8DBOY6wdqpF6hqbdLI4pW1SReJRWHWNWHXV0jGPnM7cHWLtVe5ZpxP7GJKark%2Fd2NWNVC%2Bk38deAlew7WK%2Foj711L%2F1giPK6K2us2lDN2%2BI2MKHTjEmTKL%2FlHs9gxZu1WicxtHQGy2gJF7%2BoV3R%2FrUA6o1hZLqeO9KrBUXtJEbSc6mrIuUVm9NVQe96QzfA37HnhXpyYv%2FC%2FKfhAhZORxpSwC49M12gfMfpYcw9p3flwTNR4I9U39Ildm1PrcveYjDy0Sw%2BCqmzeot4jGpoPXarhZM4%2FSgGDnW1YvIr9eb8Ft%2Be3%2BiepHty8e%2FH%2FowWmPM2igNdK7psmgKBfC%2Bt%2FXOvttkRZyOjLx4ETSrw16Roq9hs%2FMEX2GeiQYSZo6TNRqMeuOOsPrDZtqPL2wTJpO5pHbUovVsWCal%2BeXH%2BO0rqw09oqoBxET4rDlJ1OJy91dcMzjSzQUoePTcQVb64FitqpZ%2F4kccAsupVKoxlBQ1qscFVRrIrDchuseFmQc7DrflmhXlnwUM68yaUIpwb%2FF1ZCiItomrGRc84m6i8%2FLEaHMPnTExVy8LsJRXxHHmUl4qMFDUpcl6V5wduuRi7lLuA2lOw1H4f01PozLxaWLLGjOfqNipMr7pnUAhL3AH8%2BbwsKE9Yv%2BTMwH27RsXEyAYWtftfpJvI%2Bl4FgB1O3TD0giQP0ljHzEeru4T29EINeO8WneJ794wBX5XL5q8elVWIxfsOy%2BcPwn96Jh7YfbIq335fvkDTsy%2FBHMBWGEeJyBwo1EOZg%2FwDGzIHqryNOej1G%2F0m9iFqmFEdRhGW8%2BjcaKGCUVUpSD3mrvHmyqM4CusehdjUsbJRXuqHnId41e68bLRpoBonFMS1ppxHnYCicQ88eOPIw5PcfJGiP2QWQ3XuD6%2FIGZKcGDHC9BhNNIt%2BodAyPGEFjqqKd%2BsN8firwivHXhIF1%2BjMpvxQ04hiXqZ4foFfc%2Fr1d%2FiN8b%2FTKEnRUha%2FxRuBte%2BclBrhjkbwhVl0jYEySbQ98hP6izXFENnzGF0mdchXb%2BTr%2BseLUIV%2B1ZX2wzF0thuHKD1jX9b5kemThdCvdyqxGzp8kbGxH5AwjD%2BvYl7ox93x2B%2FWxwEccbKbCR28UA48hjl6Q56Ew6mHswmG1nUxKxESXvwKNBldcOvkpapvcNOfhI4L08YZwFS48UfptJ54MQZMH4xHzmAydwaxP4Iz%2FDDwyT0RBv6KrJ1QT39HWVj9Cf4J9YEui3Q6XCQpnLPjPOzuaDqc1%2FVr6Fp%2FCLp%2BGFH%2BpxGcFr36DI98HjrDhTRt6CwKDZxBP3vOZJ44xJJgo1TI7qkbjwg39dwgnTrTKE3mOKOzw7w%2Fmc3rcwql6odQd3w032VId0BHOphV%2FhzIM%2Fy%2B%2Frvjxx%2Bc4FmaVzMYjpxgNMdJPcEXzNxhhsLLGz8cRLdwST7D8GdB8cFplgAZdOAUjf6%2FqQOzKPSAPAxw3XkpbJNXOBU8J0znTpTMx%2FSrfv29E13Pw%2BwTc3SBnnt45c8ckvTA4dYfYtiJCHPkwjSdz%2Bf4L%2FKyXp7PV9XXCSugF8ZIGjC%2BaZRgdl3qlg8Lb4EOxiN%2FkdDaI%2BlGDD0C%2FzACPxIi%2Bk1h9%2Bm8jX%2F8OW1oixi6ua7fnTj6k%2FjHJ0aE%2FtZV%2BGQvxXeggygMGfyZDeAf%2FA1VkPwknM3hVxRRHHiYbIBKVs3Q0eNTIgaxO7zC%2BpCWajGHaTHCv%2BEcjdxjmEghSW7wJqHfznWAMdk9qH%2FqXMfxHNZuOpyOgE7deIM6LBdcFTc%2Bnj3gAvtP9aiDz93APyB1Xvzf2NQ0wsjzgYeRpROffGRj94Yv4jeNysTc8onEKtUuGmp9o5Qfo69%2F1nqckQrkZIrUi4%2FAUXF79xFqG%2F7c20D0m0e8LJzjq1oj6RGyr9ekM2RtQ9XsJtEGoafXaRM2OwuW%2But%2BORvXur8ZXNPGI1CQtnzuAGxJA7AlRkuqPEAe%2B1dx1PevnC6xJ52epgRW26sZPpD6V2ujgFacD%2B1GWs%2F3cfbXTRlFwYwg24cNfG7BVWCjHsOh5zmy3CvYbjKHN23XnNrO7h%2BRH25jiZ1VSYNJkouXjuyfaY2A6YbV8QfIIEZONwvc30UDXlmvVzmCr5aCsiyQymTLgSwOeIH7eHX3UjfcuDp7VdX55oE1oaxMGMmgqhr%2FXFOJFxs56lYccnc3iTqbmX%2FUfv8aTWW%2BqZlK1SL1NlAFsrKWmqKXfCYw%2FImCdK6fsC%2FQfAPOHi5layBNp6d1%2FD%2B9wJhHKuqBtvWwhaDb0yv8p20Ueyaf%2FsQoT9s7L8SYB5UG2dUBlfHn%2FrE%2BNgx7XWrP7z89zHc8e9FP1unHkjqLBdfG61wbmKBicmU%2F9kmW%2FfDJVtl6qlih1632WdlPOfwtUu1sT%2BDkeqmIu4oUK3oS2XyJKmqLQd3oyEd%2BIXAM0AFy0OhlpBIyJbvOieeNlHuoFqSXIrOgSE6VxOgpmS2dGLOi0Oa97dr577WLR7VlYe3gwrG0TAbvPbp%2Fg1un1z9kR02sM6XNGsCZR6Sp%2BFMY0y1l8CE7H%2BPPZtEsdCe0ThuHh93Lm5et%2FnGj98vjre0nW48ZcOfR1p9PoOZP%2F9ez3ad%2F%2F8fud7vf7T374cnT3We739Plph96vFXPXg8vzDtk9d6n9dX195u%2FdVXrVWWLb31SeOsP%2Bc2zH0qYp7bvCb5Y%2BPM5c%2F24cWCM%2FOHrg1M0TsBzaevwi8yAFTMw2H76HI1jKKTtkVsfX3x6%2BuTZn%2BfP6xc7n%2F72ZxGxQxiW2259c7lBGv58Af81adt83fxVL%2FWqE4zNJmrVMY%2BKPsf3tTrkRNMQpdlp5%2FY5aRPOKefHxfKCZfj463fijD7KmwL08VYmZpVn2KoTbzaLt3LP3t2srhvGgad%2B3lW%2BW8s9Cn6e7GzTmGkhon2sftxXxR9bIsFXdw4aMq4PBf4Z%2Fbf2ZFylEVBi8y%2BgEUhEl7Pkod5myeaOZslaHzPBvWxgeo1hGE0TNBsgNTahseeaoMScmTUMfslAmS0bQ4gscW3oBsMFmryEyBGZrm8YMZOBgiCMfNPfCJ2fZnMTFgkgNHxjQLNbRt4k9pjX3QhN3AzYoRf712Y5fzxesBpibk5cCeYLFibAfF1BX8J8%2Fsz2oQwbmMsb17Q1qCkZOqp%2FuJOgadxcU%2FypCYSdPPTMAfHDIcnYTc9ACovJPAhhJSi5somJTBdAOiYy2K0JYbOSeSXVpOmippv%2FkcHTzCbLQETzeZT4bP5GgsdabT6NmEfjXKrFPLoxIahyMl0k5ymG7DObhYJ6qCuDhiMz7S56XQbMZQqhGHGGQdGcE3VaJgJtTA1Y4qXCIgPorQy%2Bk8EfJTCZSJpAf2J2NqdLySyK0qkw09HAEYiNOdkz8CAeMefUOfa8CfxgmqjUhI9x4pgqa0EZKnQ4BU3lMHF6XtsQ0kBIo6CGYAUqutyqnUZ2YlaxdzlJEYgsc0SsUVZBcWWazaPMgZXVKyQZLddQcFXjTqPMy5M5xupcMCYFZp6vNQrgzQg1yqn5XkQpRyubddBu9HqXh82j1kkLQweYcn85RsTedqJMVJejgsX1kujv8joKFjNv6ZNJM5OdifEjSkkfSkxZqaAcweWp3f4NI2CkfgqMm3JeLmI%2Fw6htZY3fM5zArTqEXP4vJhiTvBXNEiqZM62OUvVLxT7XSvfLZaDaPPPxJja9VYbBlaecyuRrta85SlmGfmPI4MxDirlMNjrWFrL1%2BCtT%2F%2BwS7QImLkqmbZWiXJZmxUqrQ5rCFUeW5Es40WCB7FY6txTxDzzBGJ%2Fa7CxTfOhezjYd2A8xCDW%2BwMnyR913mddettrty9Nmt9U5dOiakoZll51ToB2XzaMjOC633uiMYiZIFfqfs26rByvusIl3ndODjrppnfQPG4eHeR6b5d8y0Jvj3it9R8u1c1q%2BO2no%2B4N2p5c9d9A5O%2BkXr1EpedbDT2XQbhPVlI3eLyXAYeM3BjtqHPQ7XQZ%2B3Tg5bJdf13nT7HaB4ktvyXAMsaoaQ%2FU7Z6rTNfSw2W7mfXPYOsWH9V3z19NON7t5BaW63U630N4MdNzs9RqvMmir1%2FzXWaOt7%2F6n0zrRl%2B1O47Bw2cAgPO2Ds34Bdoh1L9y%2FbvWK6Da%2FNZ9AWPOk2X31mwE0XtVttnFoDqDHT5rtAqJ3WrzpN14B9S1AzjrH5TuzAgAyPgWD1ANKqCGd02Z2CeNxeNTq5oXx%2FqT56%2Br2oDjnoMbNRj4bu83TduMgv%2Bu02403rwp3p81GNu69g0a70c3nON5mz%2FWafXN5AAiafQqrrXXQOm3knwe42opW928a7bOmcatmXgZ83Trq08rtt47zksedTv91drOaYL3T1i%2FNwuzrnb2El%2BobmLWrq3JPAKBYkbPTQ70AslpkWJgszTeFOd%2F8tTBIzV%2FVfCyBypOz%2Bas51sYbxDnVa7xRXzp%2BoxeAumgcHPRLN9nLVxA9jxSgjC6h2uZNuWxx9h85R52ug5PMOeycNJ0e9MRB32meHDowLdpO4yUMCGzizUbX0e1wFK1y8DU6iJyTER54vu%2B8bTZ%2FcWDZq3kEM%2F0EqW8T0968fd08cfr4C4a82X3bwlQ4TXiJc9DDoThon0FR%2BNoboN3wvq6D3eWo8XFOOjR08JED4rjfNronVOBSDTKUAwJ03DqBWeq0Gy%2BhrrAssAHd5hv4ClSicfAaPuMcdTvHTr%2FTb7SxVd1XTYcovQPk1oGmQWUuj1ptqAO8VW0ejbNfW%2B1Wo%2FvbJdJQKHbWwjHB9Qi7jFPYvC51H76GidlDGLBiJ%2F3XNPiXRB%2FVTtWDOds5uewdvG4enrWblyeNY%2FiMeqXu4ka32%2Fjt7BTe8RKgakjg2W7z8LTbOXCA3jYOOwfQwbpDAKDv8BK6BL5w1j1o4h3SYOWpBDdnPajqofO60VM9imOp2oJXUDn8ozsVL1Up%2BGg336ug1foeB%2F1l6%2BS0AY1EavES2tvCEm%2F%2FdYnUjToHCAV1iKMGCl8DY3AE87FPd0gQEKKNqDJQv1MEdLLyv%2BG%2Fw9bREf6ljjt8mT1CHe%2FALMC826rr6TcVpytVEbqkZ7vYuVQvjAWN0xfeCnxr%2Fzec9jDbOtD3Gqz%2B4qsIib8Qin%2BhpqiDOe3BdH6ddyheHTd%2BVX9h6um%2FJ%2F%2BbrlTHAv6k2zh5RVf6oqUh%2BMbWL28adFH428Xe%2BuVfv7wlQPvIaRFn4xy1G6%2Bc9tEzQNDv1%2FhOuDntvG12s6GDjQU69dkZbtMObBRqLmLJ7Ao7p%2F3bcRPXhoLptXd2rIsgRcIXEXGhu37jZbuJFAaqdHLUegU4fQVTztEsisrMrW706oQF1WoftIEQwPWvpy%2FbvxwfHqu6wW3xGkpfqhvVEjiCEfuXzeneafMAJ%2FkhTeIc2%2Bq97rRbOE7dsxM1ZZFqwPylVQ6TVtWEsnI6%2BKLmry0gZI0%2BUMfskX7HoQZCUzvQ3h6MJSww9esZzPE%2BUoWDZgtICuDhX%2FMA6RBcvIZffRxMuD1svcGzHv7tNo%2BxTdCUlz0Ytg4MzBGc2oA4NU%2BP8fevpydOu%2FMK%2Fz39DgeHJgpODUfNICh9hAOrZrD6%2FUyNE10DyXF0NbC68A9W6L%2B6sN86WHP499qhJfVMr7LizckBdCDO6XbzCOgCrOM2wI%2Fh0%2FCl1qvXQPfoXj%2BaP9TvtHGqOchYnuJfLAQkHrq%2FRzPvUi01xUqZR7jVsb5WcK7snCJ96zm%2FHrcvgbriUZquYZALoMsO0APgwDoHanrpG5yRNM6rW3hI3%2BFEKCBhHlH3qDuYwKctvMYdDFCK0uS3KFoo3KqOX90fvG61Dw%2F6BQgxdwQuAHutl22icAqiqk6FspZqTJE5Mz%2Bji1q%2BZrxo9VGOyL9wIEJbEvDlb0bHKEBZaPSfk618ibzvD5OtWC2gPssmFKOqJ07gX3nO1%2FX15pi1r0mD%2FFhWtX9GpoDVi7UnrrN7gepps%2BiX1BkXZRNfQhSTpKIEJkkfKnihF28ob0nSB%2BSG7TbeXpbcz%2Fe246939nlqT9gHYGM8AK7xspBPViXAUlrX7fK7nqjPCs%2Fx%2FKT3eqP9NUcYghfj77ZO3nR%2BaVbZ0CupdNaLu354HV0Zwiar2aSeuKWaMiE7sz3a297%2FKvDS5TiKl6SzWPrjJeoXliTjx4z15iOWMNBmFjJy0kcnhpIF%2Bo60Nozsvb2zo6PWr%2Bh7tn2%2B8C%2B2%2F7F8%2Bvfl98%2BWf%2F9h%2BfTZP5aJ%2F9HbWY63CbKzs88dX6xaGXeAMUmZ9tGMjwqAu3Bowm5cM5ZmbeDBamKqmMjUTEnKGaqpTTdjgDFx3zpF0ehuAy2RFy5MVZ2oJFIxD01VPguFWhuzB9eruNBhiWnzmR6fafajyFQeztxhbPaCqL9nunl0vzRBC%2FOL6BgY%2B2ZgVdSVm6YSLFSnEHBY1ONxr%2FBaj4PQN903Z6MU3LOWLOam3gB1t2zaqtCWBsgMCs3D%2BNWUh60BXITcFmERYqA9DoSVa44FN1kRw4JiSFCmxZaUrHcYCqpSuVnwjT1f1y3SQujxJX%2FCQhfXOuaCb8bVqmTS9AkmVbD1ZxtCySSzNoqjuVP%2BCGX9gfEuFzyI5ubg9liU5FpPGJweJ4OHMVuIR%2BbwH4XHbDkdhR1uhtSPOjfcxuQg4N15iK7PBuzUjTGKcfODDO8wayRWkhdpJF22dhsJb06LxaSuHcXMBOZQOSCbz6ZSbMcaxh1jo4LfsZQ%2FpJzHzXDkjaxvhL0Ox9WC7wX%2B0FNR2eDjbGx6gkcfzDCiu%2BUZpqKGf8V2UYReeh9MxMBPx4E7SRgcg86bwOF4wkBRwEHYChl6SaZi7MXkTX8pV72IExrghdcMREZUQWjC527oD00gOiszGFm%2FydBLzN5sonTg70ux1zIk7BMmCo2LGAyDKlxiTJTLK%2B%2FOxCo%2B%2F3LuplMTpUzRLoUOof4QgbyTYCP0hqyw8ij1x6w%2BsFmZINiF0BEaj4veiCMpPAW63Jqoa48Nzk0MJ1oRyCtOa0Fpty2zn%2Fd1aW4humpXkO2f%2FH%2BYw%2F307yaEZ1dguRV8YKdNUMLNExdmoQX72oJ9bcG%2BtuBfWwhfG7NXjdmrYGaYK53nphCyWrxkrHlHMqXsegmn2hI1rL3xhp%2BRMWJhcv7FbBHJ%2FbNFlA6gaFn%2F1X75%2FSV7IQOzzhZpnS%2BzYasEHEwR%2F%2B81SMrcUSmXzCN0SaUL%2BFY5lbrivC8%2BN5Rw%2BZmVT8Jgv8YdEkphh8vI9TGISw72lkjnZhZFlcmx7PmKPnzvt97bKr6lhV2XF6ssfxgHeP8rloF74wjWtsDOm%2FmVQF%2FG218%2F2qltY7DqcOfRPgzlU8wJvmMJZsxBxYHZqnKWtiAfnhkbqdKuRymUeEdkP8U8y9tb0Nqb5S38%2BvTsz%2BUC%2F%2F7w5%2FIM%2F%2F7jz3t5Tv4V%2FmGbuIBt6DdErl3fDbZVmOod9Bcqi3%2BqxbPq8Whbh8b%2BzOdvt8%2BVc54Oaf1ZbyEPqBG5nWEYFOUQlQfJXiXEXMXNFj7DRoZ99wFB5XV1hfHYG4f29GwCQpCbrq95YdYIK6bCUBd%2FvmdiUeYY%2FecDZvEay9CvyEPtnJdY2WJecOTD3AdthLNQMTN4TalWNuRaciaGjfl3kZaKORp46b0m6d72%2FvPZIkX0DkuehT%2F%2FmVlcgf6hGBTontMbT%2BQLlQfSg17EUHwOnoX2MAYfnkwc9HSLP7%2F74T0PpRH3Gj0%2F5Ikhv%2FxoVMXj%2FVvh8YcSm4qORZ78%2FzXUl7tKfOHegEVLssslKimWSr69JOHyEqczaqiEkCv%2FX%2Bgtdrx7%2Fpx%2F3XpMLCCfS%2FoF%2FSl2ihMKWZxOPqdpxQ2vMslpthXXX6xxxjDUrEXkvRXySfpwPXziStFcAfowLbx67UZKeCj6AB18r9G7tCpSmfqRqfl4LjlZIcn0QWHK3K8lPY87YDG7xdymygecCZpN8ZEbMJ9vF1aTBDOFUUM3RcEOFz1LulwUsaIAlnl5Z3Dz7SNg%2B7n21wt8U9dAMJTVmHCV8MSEsse5XgdDOTHVOEWfFcTZAkjolXEUpRhyVJRyG8BJxFQsTFHsh8K30atVeJ8fzpka58pjLrSBO2Du5oHnMo2xxdd8ILQaBtbUBkppbaMkHXIX%2BpkXmw5HtZmfJFwYCZTAH5sDrQT05ihGi5R3RsQgc%2BbrVOOPxZ7Kbs7Agpo9liZF7JGzKIPiaYUDRTU6%2F3zCTAiSK5%2F5ZlNeCDbHk5StBdrWTVI1H3HDDLQS4W8UtdeUNcYA3i6%2FMytzB7VMzPnjjsx5wpK21tyAUwNWs6GbDF1m5TCcekNmsRJ7gh2KTJ4wLOdAikXhh2ykBMqDhxjudD%2FmClYKw2zApu41XxuYLsqU%2FWMAULaH%2BFyxy2YhsFNsOZt2WrBuk4QvH3GNzpKJYG0BdNKELNguxXQXjDgD38dmwTz2Zy6z%2BIi9McxSSq1hIvhqAhjmt%2BLLbqO1KCTlRRXeB7ZfimvsGrZKCeybKX31uluBuIItYxs3CmUzGrH15LNudGMh4k28YSSbNGZ2ZwAzyw34Yh8QuTRNkwZBMvXHzGyNT60BmzeDWHyUZWUmrb1JKlhMCzGozi3fBIe8DUPYGNkHwogTkmEUBHxWYIiJAfs2JsXgkUUQjJHjGFiAmFv%2FkD%2B2iCM2h4Ysbo87HI5MBlUBzWzZBJaBd2ZTEAqrjEH5fBVWEoL%2BWPAPpd7cZRQTwZT%2FwASzD0kjOfLmvPUI4%2B20QTeG8U6yAIWOk4EfFpyZHU1njLvngT78CcadZVDGlgshWkbcinPEE44jTDqYEJi%2FADZ31hGwMQvM%2BigR3urFZgsBYpIyacFL0aTmc34uHEuTZzxkKv6xyJGMPW4XSjC%2BQMdSLccTtoXhwUMsajn5YDZoZlo2FoZ3zEng2J%2BLryQo6wF%2FTumMTLAUcUsio2PxgMbn11ieX2Nxfo2lqDsAZL3PzxdjYWoCDNlnBg14LRMee2zx8aMJIvsek7l0Z3wopGULk0MMyQXwa5dt6Apqlp0OhP2IU5IpHBKnXsB43mjBDK8HGAKVm1pLfDDAzFoS0GSnpCM0wfjTAOSHdYHZZscMgIW8hmnM2scgf4gthn1M2OGuFnEaJb7ZvYFrHhwCaVwCjzFGsjhAmi02GcGAkwceoA4gT80TIsBMkykAzRkPhsCZAEyEkjeYIsGACoHwRuwo4zGmVoiW54c8KKNkph%2ByHp0JhGjGJYFmkdBL5%2BZKDlGKYsKkOGACPQzZ24R6qfys5tvQilIYfz5cc88z1waCzKXGh1QitQBLEh4zkLkXwdEwGgyYUlyBwxlrDICHU1%2BAskoBDFaDAJ3ezfn5NBowrwUEht7EZMIIzEPQIZi9gQu4OOkSCNcHZm4o8X2xGw64wMoNh64ZbBOAnO0BIO8fBArfMecFgEK2uQMQRp0DU3YaQmAslIQTuQn05h4TrOqMaQxKqZMZVNi3Y1R1mDAp8KMk2UmGjOJwgpZ4cNpnr9sorqMfmjQoufJuQn5KTLDGbHNN5t6IbTNiMEdWvXTksT0uSZG9Y0CBoCigOdTJYsCNZxPGriV3M87xJneJCJwlbEzuElh%2FrEF3CWOGVFYtAyhEsXTZKAhHTgQJB9SUc3GpxPimET%2Bzpll2bAF%2Bw2T1sIqkHR%2FArIkAYo2MF8zdBpagEF9zMRe25wWbkdfMJhog45nZbjSFCEWwpAtBMNvqkKHlUxChbGpdS1o6BTTXDkAFuSiQFS5CvRZVPhpqDlMGZt9TcNY4DbYUN5nkDGwpzsDAI0g9osFCcbmpGZw1NkdYX8UanCOsj7BG5wjrIwwhzi4C8qISd62hrLA0ExHGCkqTC2FmwRtguzhpuPPY8rq7Mz3MPvpzgWB%2FFM%2FzH%2BXz%2FMfsPL%2BCcjH2ceOg27m0C7MHEscSxiJ4SEJQk%2BMRoSgwTbhjGWqzoSNNqKyJNuUfG5kJeNeMsVb5YU2goERmHsnimVhSFt%2BN%2BBFNVBdveDwU3JyHrAm2w5jg%2Fcz7yTLEYSxDOW%2FAu0GeCR%2BERn%2BQq%2F5BYNk%2BiIzJB2APxnxT%2FCBsqFJ7Poj7pMQwCiyRyCfNvdhc4VBFwXoEoDhFGR8K4FtPYIKEVtrYrYAPyb34rZg%2FLxjrsGUj9PkilHpdsuARB0LcyCVbH60pr6J%2FVqduQWcqW09cwiBeMtgijWbofs8w6NrhDlMvZhhlk8LAIYcAsefAhVAN4KKgr3glMLMsA954g2iRXt7fL63X6JXf9ZA0mZunwCzYmRWLPCBX5aE2NFjlMKOE5LBEhs4%2F8feLJw5uUU8wq%2FYT58PCZzGGivaJVovPzBofs5s92qbX5%2BlwHy%2FxC0v4wBLfvwOI5MeL%2BzpTYUIrJPROZq5cmZVpfV7Z%2F8ocvf6r7On17t3u%2FmcmaZJsealDRGPd3M7txyUZ0%2F1oM%2BDffYRuX7KFOL3%2BR%2FzFc23e16T32XqTXu2QYSK%2FoO3zt7hzL7%2BlPf1%2Brg6W8fwiFvRVeaz%2BArccmOsv8Yt1P1QxBjab9PZaZqbD36K%2FlQpP5PkYWn17d3fXYJh37l%2FZM8z0DQwhZknRFRYDdZgVNrrNula%2FNZ0yL2Fs2dBuUtN%2B57ADtHvqJ5gTdRbBfokGS8Gd44aUlz5G%2Bz0nSws5JFNs4T1ZV0Nr75zQw2ajt0m4QLc0ofw0TefJ8729CfT6YrALh4WVZfMfhpUz7MkLL9l79rdnLEvgxv5a5hivRhet5rf3fyIXy501huTVTrif49W6SaS%2BvBxzOGZLubr6ZU%2Fo3BH6R5ab1xpnsFjsnqbzifsFUp8hP%2B1KtvMIf6D1vH71ZvbzWPgBFvSNk5NOvyHlT6me0Rnd%2BvkcFj0s%2FYvHNWkUckP9s5e9fmVmdjzLlD9hna5l39ZvdA2U5yrP0mf1hKf89Z%2Fs%2Bev%2FNKnY2jmXt%2FazEtHb22tpwVatVuPZGan6hPq8vX%2FL%2Fk6OWAVLwKEQNooCTyy6bn6mCyYFA4DR%2FouqaiF7ZuUF8kgT%2FZ7U8LOIudER1TOhqq1U40pX7qemL%2FfGC4EC9FbFkmTCzZLXOq7si%2BLyflQuLLubCzEbMTruupCWYj32zn%2BHD8N0efcudWpb2ztPdt9%2F%2BvPdO8wS%2FfzHC8wZbUE9XlY%2B%2BtPF3mc1hdL5VLVFefXxthRS%2BlARJxr8gQwV%2BTM6fCAUFTx%2F%2FtMnqnL4o1FhnYK7icXYifvfFV54bfYij%2BKVJc6Nbwo2jU5nc3zzXeTcvoVcCCjVb1WZfSu71qg3T0tfScZwQdqYuvXDUihazZHhz0OI3tyNXdOsDH9Wnb5t73TBA%2Ff%2F73T1g4RwY%2BJ93Oy%2F7hxW0Rr5fGiuQaaPoIFioXg1qdlWtGbHRk%2BwCZXVbv7ab570BIZWlm3IciA4CbQSZ%2BzH8MI0uvJCB3htOLI5KBcqF1U0JhGOySQRgRPd%2Bfn2hRkWByNmRkEQ3cABdQBnXDjtei58LAo9J5m7Q4%2FSwr8%2Ff%2B9EsfN%2BuxQV6YJ3d0%2FnFyyJimyJAnU%2FnbCx%2FYt6aA8GfKNkinvbeV9iUGdT2geffJ8XeI9iAvxeFAZ3cNiPr7wY7t1U92uCcoP38OX3CjpE86MUmghXc8wrqvodYHAQpxgUuxv2cblSFbK5HywhGiqHpXVCBAEXN1MUfCrEYdr1Q%2BrpdwMz1pRRwRXNHKhHSMaQMCp5Vcj5R%2BVsdeaKjbMeygFOG93G8SUwKGc9xm1ZZhbQccvc6sy9kAKCbcMKGDuuQ1uCl8JYwYJw48kCwyg66KJqPLtAvYk43bb3v4LdQViJPVxwiYPzo7go3%2B%2F8BcvusNXV6fJUuop7HhJXo9l7vFf1HTUm%2Bdc2G5Da3t4LkYqx%2FrT3sgAsVfUeawsFvDq%2FglmrimA1f8sOFqX5KzC33%2BzZNpnyC40h22ADrVJgocCmXOX1%2BikK%2B%2BxQoGeHKwuLsTOw4Q7Fl3YC9%2BOdk0UId2AXJi7YuXYDFDU4iecGMM%2BzcPMOBg3HLJ%2FqQKBPB%2F4YaWyIqikMKU0qKtJ%2BOqMIMHF041DMdSDB8zhK4RF4ZcZ0%2BzMUX6kCWZeg4YRDsead0LsBWgz0zCGdtZr6pM%2BDxT68wiScIxWbGOp0p0TDRP%2BcLG6BqgF9KPCHUGslMHMwOosz8a%2Bh4mQbB7QDp5B9PliH3lhF8jHlS51mlNjIAArMo2LMDCAdDOUP25Om5LySCT8xX7%2B7u1vcmZ5I3VTcAIwCKzHj2tVTIbjFpfMlRLdTbyYlgFWIhwpv9cs3lN5iaZv4FjPTHZeShtRQ4ECbJmxkFPWNorvhr0%2F4689372pPtt7%2F%2BPXyXeEnuXjM80%2Fol%2Fdax6eY%2B05NEfWR7To9%2FniHAsuNHm%2Bf7%2B5dqEspk4V%2BE2VBa%2F5aepXtI4%2BhJY%2FxjfUL1HtVFPMrM2eU6OUq1qzRceXtZpXfCklNPXBng5HroHnM3nCoiZDSmNXVjXfrp%2FUpsOMBEKkxkVZN2XQQVvgLJTQmhCpgfnHg59NHdSC2C%2BAs4LpwuecNnZl%2F6wPLPE%2BzCuSEWtNR%2FHtN94sBEDdHRaXI5mr2tw4EuZ7cAfW6dUp%2F6kRH9TXFQ3EWUMu9xJ%2FABUziBOg40EfcErIX4ImDdmPqjTqhhosYaWddk1zSuhXQZIJWR1uSAlAF7sigUA20a9d9mnWt%2FuTIC9w73EtGd9A8f1hHMxq1SWDLMCI27kG6j6DvqFupP%2FUb4DKG%2FlR%2FMuDMnSObqJtPoa%2BdLecRTKgnzpOfnTqSM2fP%2BdH5p%2FPPn2Ae%2FfTCgf9%2Bct7jdui4wwhPDxOovnLzxD%2BoiASeB34l0RB%2Ff8Bf1w56yDsYxtlzw31oLtCToTuK79dHGVTPkSG%2BZDQa6T%2F4Nvzn%2BQGyxGjVU3%2BBE22CuybeucF86g681B%2FuK8DQ%2F%2BdPq8v8agV7UbjUV6PoJlTDhXfIBcc0izRa2%2FfoO%2FR3vNPXynAqu56XHwNuIfXoRKsAWb10pfRdVh1dF%2FiNnrS662itKYDuNgWJMJr67T6RBQfHLJusxcc0qPjgyAsjSmkOU0TbezpeNK4rnmff8T7gv4Ub4J9r%2BIUskwfcBFxitgLsfLpQtwid4z9gddB%2FFWcuZkgfIp1wJ3W09nf0E%2FUX6kF9u%2B%2Bsqrrv6CGtv8AuyO4UGDk0WHl1L7z24yhUZ5%2FhzFEmm3QMol%2F1F%2BrQoG%2BuoT1QIbqJgQGkC%2BB0Arrad4LIBT4xmsCCmQB1WAC5mblXHtQngBrQJWrdcXfLAfoDdK3fP8Ml52GoXfzzAX9dA4UL1c4X5aGf95Hnw6MlHbWQkS01CAFQhGL25g1RtwRW%2BSGcaDTad9CVrbiy6L64qAoDvg%2F8pA%2BvQM%2B0OvWthkbKZGyfrK680SKGSxj3xCeTQWf128fqxUT8cFZkV%2F5HJMTQhfhLvRmuAjXieAVFvZmLtruIIV8jh5yG9M4PvYtVKfVC4qVf4S9YRLG%2BGOEFdCe65Di6X9Sf%2Bgsa%2BuxGdVZ%2Bq6JxZ7ealuk7RSFWN4XrIvxF6WZ1Hc3vsmvo7uCr7EZPSH2Hc05fqmbR9erD%2BVdzyOp7%2BcfgLxm6UqupRfnkULf7DtJg4vSHsQ9bajQel24RucAsG56jKayeuOqP7kR9o5qjb3Rz9B02R19Sc4rkPY5mauIVyXsaaRh6bqvfapp89OJov1Jjrk0Sq%2BQDYlbDTIG2%2FXW6%2FHq8%2FDpjAgt8VjFM46rA7k5lfXSi6YrqSMG2763TtrCCldL4apn3mi8xtvUhn1oFZR6cf1d%2FevF4e0%2F9Bb65qnSEIcJ16f9eW%2FoWo3S79bF%2BQF3SMxvL9nMLBdmch6sdC6dWJpYsWfMYAqUfTVFF7RsT8qnUw%2BVGlNUAZbMhmrnLLIHC8utawT6Oyyhp0lukYFXnhU0Vs9SHh5fiZ9ZlSMhGdktYpFXffNk5%2FM38Fkpe3gIJOiWZh6DLumeDKMu88Y31ljl7WzwDwmoGvzen6mbCGNtKpvHf5trCVfzznXtaewhZ79SPpsqS4YckvMEfRVgEBI2wAC%2FOJBN775Sum5pAcFevdUk8qxbNSqLJreaFra5x%2FPKwYVmbe%2BrsZxgfrJ%2FkKG206XutY4%2B9tG77wG9bv4s%2F988pXKnW1t%2FUqm2OvXeiEdFiofgV0wOAvsJmYtWKoknx2XP1fiTnAUTh8xiH2gbpFqqavtlUVItC0N8bINwDNuhZLLabfczcwCWqJpAtgcRxGlakXhICB%2FdJ%2BeNFg7mLLC1wieMoJiyu1K3goao8MoW0VclwZuStym0CUUm1oTaImJDe6%2BbLxsmrbdNeWST24tZg7Sd7T5l9Ze0taQpUidWx176EXN0P3IEoV0fEQ%2BXq%2BuUbytWxtE2ujp3VOQHO%2F6TfEJKZrtGaGGRhva2mJhvvt5a19waKSIaEqOBONrNEXTFbW1ssNXyJMls0%2B5XLDHu3Ypn5908Pt%2Fft%2Frt3N0x5vFJsUix1rTlU4sbAI1lrSSE4ikh47I%2BVDBn6N58TKPtA9WUOUL7YKF6euwsUzKgWx16ymHmOChKrNY8oKOc%2Bn0UF7bdj59sj59vU%2BbbvfDv3nW%2B9eeJ864cADt0QbuHG%2Bfaj8y2zalspJLbNQUTTBLV2pm6i%2FFjSKbzt2Xfffbfy49l1%2FmehxX9kEEO%2BM2qhMR%2BfGsm3UaJNMm4SaKPwBGXLznDkDKcjP1Zdq7sHo4hq4eoM%2FXdRgD8msamj1AroK0y%2FYPY7FGwwUQLRO8%2BZeDC8t7lclDJrjh0KlueMKSAPiUgdP0H1tJ94s3l6B3%2FRPTXBfvOTTITpJqn6XibyJNGlHypjqVwAiuKWxKEIZPj7mZZu3ipxZKJrMCNpskOButDkKkFtAQa9gol07cE8m0ek0abC1Or5zciJseNQrJfJ8PxwquRyKAicJDhBsy9kojqYn%2FRnBtNBy6wWM0dFlEGx1VTJrlBrj79Ix3PjxmT7gkIiUnnH%2Fq3BUZRcwSz5C7e2a8uvlyrNICn0ksd0c%2FN4Z2uzra7SRnONc1jBANBeUrFMTCKwiS1%2BIXNKv9VvN22mkyIrvImtad4SOy%2B5aoLET%2BLPfVNOwYpPPG%2BWYGrEgee4Dmx%2FMazWCXZG6pxTluCLLZyu%2BnqXvWDuxVN3Tq%2BYo9A5TB2VYGKRwkRHQaWDmY0nOMWArGTEeX9D7lf2%2BCNF9O7WxeNKK%2BvPFNVtwHFn339U%2Ff2KiWZwBdU1NVJ5YvJOmMalVVnizQovvjd3hhvAl%2BDOEjHXC4Afypkl67K94AczyaFmyn56URxtidloHZ92uv3GSZ9xDVnmSsnPMpsxXykVvVtp9lOyyHm%2BoZ3O6%2BavB512p2utlpx0Mjt9f729rWW2jfrRxafvn%2Fzw586yDIMRVvAdtO60Vz%2FPJnTY6p02%2BgevWZU28UHOPV1gZ6hfPCbr0O2dis82%2BnCeeXmGEuNmu3nQ7ygm2dofipOK4jpSIdvXBaGE1Yli5cnFdo51fPNaB9dN3Fsv7H1z0OsVDw6fN0eoDiUrmO1vl95s6d0uh9NlDFfXN8vr6fIaeBr45QJ4tpzNlnA3T5fz4XJ%2Buxx5k%2BUkdkdL%2FIeLa5ksZ8ny9cflFfwbzX34B0%2BN5vPbHZaI2UaxeVvfNLqtxss2b2hx5lWNe72u%2Fbsui45edcOFXLSoXV0hfXndP25f9huvjONcrUQhgP0dxGXAaGQG06%2B5ceoPy8x%2BDVjlkQFZjPxS%2FJnaoHwXRMMrFnumNojK8WhhXaZpmTeqDd3wupwEpYZG675ZzAgHXRtGRh3LCVgwEYpxj7YA5Q%2BNxuWPjPzr8r3xipJlbq0cJrFGNlFGZg0ATqTWAHhRzj9DmZjKq6RmBhqsTZ%2BWb5%2BVb78v3%2F5Qvv1b%2Bfbv5Vs4pRhfn7JcLrVpWg44W%2FPLd%2BPYkKzX%2FNmkfG%2BG8cKkL6X7q0F5HFk8rxoQRCOuVi0oV2RmJCqqoctEGeCFpSCwtdAtD72yjymDytWI5invIR52vFYuMPeHqTn0H8p3bBkl7qz8ksRjZwwh0QsGQI2HxqvmrvFYGkdlMQ5GHzWT0WCkrdI9yxdTS9liL0c%2BrOHh2IUTZRmI074MmRq3RrB5Fme0Via4tXKaDDPmZg3tDKOcT7oo0dXem1cSWYXzenmOTtjkMtbOzEgQVdOyn3KfXhv9fuMbSREEBWpt7L0MzOk%2F9g6iIIqP1enZxABzGMLBqI9GImOTxCh8YlJXhIfXKLQQX3roj8eLxGsjl2xIAQmbUAIxNPE5ducG9iiIIrP6r9xFkvhu%2BDJYmPVrzYykTQA7NlOwISyK51PohcmdgeiMx4wqe725N0QzL0sL%2Bob8C0GLeACcfmgsKLTwcuNXwHn4hudGDWFuIKLMhGawvcXmLuwFgT9PTHJqdgY5LxkzrTyHULwzMWkSwNiTZs44WrHlpWVUBwucmt9LGY3R2cM6nKQOoYn0Ank98rW4u7ubMz9PSuBs7cpvOm4ethqXR81G%2F6xrGnXU3PCuPkWb5DLPA1CK3G7CE5g7aZ3s4gyOJCgH3lSQ%2BsSdGXuegrMwl0Borv2hV7d%2BQeOnnhmfO8Pc%2BCNjNLTNZ31msktkuDmqU1UM6hb75fUpfI93l0%2FCRPmNcNiOhtM4Mgh3FOPCYHlma%2FjucRDd1ImtlFHaba88qflgzSmHWqIqVU%2BYzqxQIExjtxyWJUfG3miBnTWL%2BO5uFFn54AzvjNWVRMGCb9tDc0MmOz6TJPG0azU21nlgqTHalbtw7MA9x8k%2Bu18cED8U5gqcriQolBVmABbW4HzJ7aJYeHtnV5t%2Fbu%2BU1uBpr3l22Lkk5x2%2BBodoncoWoJmpE04aRrR9lRrRK89YbQltLBHyrzJhGC3MWDGx0asA2d4plUiQ%2FTEeM7Im1ki%2BX4aE%2FDFyKuaQ%2BnDqB0LJejSum%2FErauNFEMC08TyD7C4YpzmOhouEQ%2BrXfuKbDJ3CoIWnwUxPy8c1jCvmJqUOwqQ4ZhFU1EQx%2FWVlafUZm41%2BJkMZz3DqM0J%2FWbJ0N7bMsM6SNiCxwpSFZZjZKr%2FcKJQCGiUQZJQRh47A0siZMXpZZloVgJgvAyNhIMlGy30UokOLWRMsl8F56TKnmZWNAlZSbqZ%2BYIW0PCd%2BJkPJzwh9t7dnYtmj1qekB9C1Xhg6AktDp056rnEmXFBt%2BISbs60FGWTgV%2BHUXU%2Bm0U15iZGNPX6aQ1lirJoWb5frzVJ41GLzpEXyuTLr5sZGhGMNksgAxrqtSwtJgPh4wCjDzEygMA8ItBqUzbaTZruJsmu2n4xNVmDgDq8YkR54yJwaewe7h919wkU4SI4D2mMlhMmdTGJMRBHXWb5u6fxoJs0oTpfyGNKpnzEVQZSa%2FQ08ZYAuVboCG3ZyLv%2Fm%2B%2FVQucqZPC8M%2FiRUVNvYgBUGJsIsEeCmFaoC4xGyPnABafanEeIbuIXhFFg807YT4P6Ms5g5tD7U5197CfLbs%2BEo03bFs4u46uPof8FZ8xWeTC50NRdmd%2Bal7G2uE%2B%2FPsg8WCnBSZeDqprDBxFPObksJlNXwkSuiyalG0JnX0IPHxWxNpmzacjbKljf2qbT00U9V8Tl%2B4BuMGeInLMFRAYzqHHc4NYMzFEsMUCrDx7JQAg%2B7VhxbRwUkP%2FUXkHCImhiUuYAVp7aAr9%2BuLWHrsjrPQVXEor2IgVOruc7SGSs1gvAES5mtQcIBsYiQerWINme2idzgeZj9d4FU20IRfqQqFeHrh6PX1UQVWlMXVWhtbSrfYX8adpxyNvgypqIFCo%2BscB1lZcYBpVyK2Jr1xeytUHhrMyhltSl1W%2BHkFuAg4z97tdRMwe63lxFWeQGBXnamGLOEl1ZhEZ8E%2FrDi9YKuoIS39pggiClh7N2m8ZZVuMJu8gb7iBfKrGmDfSUW8Wtrs2Ytlkqtr1H1W6zPs4NlAW5vAWGt3ySs9Yv2ic2PIkWEvTYKba2OQlvrg7aSphQtQ1HfV6%2FYbBSr16y1cqZ8fwW2txeRa6ggFllHArFMVb3sXSYhBKp%2BWyfWnEFH3jDS3CqZLvMCIrOMmHFgSMIzYJ2rWBFFGSsYVOd3tTyjpM0MjOGXGDCZupjghoH9j2xKYUvrwmmT4MLxUiH8kNlYaDuBuoCIPWmZkOWyATE4TATUmUaIoBgopAy1qC9IqI5BErhNBsdr7jsRys3jaGyq1RQm9jBogNmzVpE9IBYz6USkEXiokuATQxWpwVJHZHCp1wtYvsyKWL6cNJYpyDTc9oDZm2T2JcFwLGKcWsO6hZXmBQXRPi%2BUbUfrX7dBEamZVMYze1pD%2BQF3hWJyOUnyoGG24x%2FNJNpUh7HHzngZNvZM%2FivDMLggQeIUAqGi%2BClOzClXpo2GYkmmqkJuv9qIIsHYBCqkr6gPvcAwklJai7rljExWTxJhZKuQZB0R7spG9xOCrULhGM92CdohoDF%2BwsFytxAKFYgcCo0ToMk0NmXvBL%2BJTcOGIDLYb3QEkZhXBRd7glUsMiYjAurS2BJi7M78QILDyWARezhRUbNoaoCgxJVHbhgckdk%2B17OYXbwISsJRSSFNAsTPXZKScgSjFTm07o7%2BWJh6MULOosggHgW4%2BPkkhe1zKD3DqLcC34Xp1GNzqoSS5SpGmWSGsa5gW69807pa1G84gaYS2kvYigAuDU2O3NQTvp%2BVkWuXYTFKc91Fw5yKMrPoD9%2BOBk6R5l7FV3SwLXsBe2dTCcU1Wae22H8r2wdpqpmcwiS4m0%2FrBXOF%2BhRuPuImFKwpiEYR%2FtAsZlpYIKDOjOMUdJFGdYkPWGEZ2VihMGQoR6nX2eDsRF7E8TMyYVmPIdAkqBlQ%2FgAiLG9PYW8yc36XMdR5QktzvLUH8xKsq6ZA%2BlA8PUfx9IKzv5JZDAy%2FF7o68hGlo7TgA3%2Fmp1QqEUqUYf7Q%2BLKWCFnMZzJ5kMRUZzjRFsWfeVyAjfEefVRBc01XGSWcCm1sI6awZFbAcMZhK0CBuZS3AGeTqYjj80lhBaFVEWF5p1VM5CfS8QjJij%2B%2BE3VhGY5rwzIM04dJWzS3H1BDIQk%2FAm3qKHAk1Cx%2BZiewMMsLcOgMb24gE2lrXYEFQWcBKdL6Ap7x%2BzM3NvUfCiRMmyKCjXEJycc4Q3OJiMYIc6qEsX3QOqs0no2xhnOxmkaYsqcMbOQLlu2WESTVFMEzXwSLNb8yLABNg2gE1AXFTgHOaVERKcjDi2hBHF5Ec2l4CcuF4UW0ZDkHWCZ9UVDRvppQfCEQWG62oOcjuLhgCGPrAkaOCSosrCQK4zsLizFz02l95M1ZR2CIXabYU2BGFNCG0CKoKJgXmmDbrmI3X7R9w2LZWFiU0iPSN25t%2Bt%2FQvaZgswzIrX8RyhY7AvlKR6gh4gwjg%2FiEUTwzzZPIArs%2B9lMJLM6kiFvPK1BdGVxIGDifpkxxr3FMGJnB7R8HzowZMEinZ05M0CXANZgpoBuMTmuYsDNmGKkbNIpP6wzDJ0pmviwCxR7dwBSaxLnCNlhlK53jmBwjx9zK4DsGNkURCEuGcQSH34E3da99oU0G3tI8s5SlIWYxXnOzRLnCc3c0MrklDRMqVsKwrbKM5Vtjjud8RIaSTNtLKOtHraxEVoCRlwzBSUyGMbmJublnIaBuU4MUkIKss4AVFCJz10fpElvVFMGGQ8SvI1z6MEwJtCMyTc4LcGnDJSs8kZ9XGM7NKzjj5bWrQp0iVhhPSIQwN8IRSESOs0i3KUiLXdZB7oblKpTfD4dFcxcEUMoAQv8TWOh%2ByTiVkXiUB5hihXgxuBPOmQQWOw7TaBgekBWUSeMEWlrCCERBwLNVKpXhS9UoxclEuYBALKQCaypjJRzlYox8lNF8WMt4k5RorER%2Byyh7h1cTY7GQtZEVpNkoYe%2F0NYRaLrW2RrZ%2Bt1Nvo4Cl55PQnQvLqYhlnopFJDszaKRo9mng6u6tIWI3CzCtnyowcCVTrBVusmCCqhWSs2TJ1J1rmUQ9nQLFQitroYREFAiBB1Fz61IYWQQHG4whZyFI3RBfJnFJIr635%2FysdTxDr1hMNikhsMQko7%2F3lSeA6iMXah3HrlSekAIPrLE4XEODVBdQf0RmxyncDM2bSRAqYe21F0YxdQf8sEZO6nVgTyPD%2FxIdioR5vwLXTevyAiowXTkUjm%2FMBIfj%2FwAn82LOFykVWFnNVOGEITZLsAVnFkiuDPmEVKBuajtZIXbcMUukU394FZqBRqiUN4MDmalaK2FsDc3x4jZfLmKpIp64Q2EEtMSVI2wCdoWUjnKEkZc9oQS7IgW36DwJSS6lLBYIoRb4JdsB1Shh7zh2BsyhXJ6xQgm9nFFuwbPI2EXSaDGc1l2uoLc0NoPC5nxrwQj8%2BgopVBZxQofkYJlFLOC5X0gRKTl%2BFPDzGLooTq3PV7lGUDGmD1uEPsbEqQ%2F8UVkfS45aMJDmHCe4EDZEZ%2F3wxmOOUcpMgXZe%2B96NvO%2BXMHzXL6O5ZqiMZzyBQq%2F6TSggnoquI%2FSXH7gBE1QpjDh%2BCiVYWSjEnMXvUHDuY5PBUwmMBgsG8VSIa9Rhlp%2BgjFOk7rHCZZt22EJNfSffVW%2FQMmc4ZdXHGIqCvojAkuqJEIzKoCcjznFGY8orvNzTHwXB6ccI2PXsvsKhrRAyOUlsAZOxNhglkGL4qUIsaLvhevjNUyhvwGzPaO%2F34iMaxJ5o9FXE7NZRi5LR1H7GKJR1KcFhg2L3UUF01Kth8NYopsxT5EUqZwjJ8iyq2Jb1LMilDkrGH8oCoFXlViCLjIEZPThP1IORK7%2FBzB%2FFvDyU3dGIsbw%2Bc0dV0OaDXq%2F8OoyifInEJVRpsIR0BqtIe%2Bc%2F7S23LowXVIZI%2F3J5UYHPTyNo2zCahBhp98q7o6hazg%2Fffet46RBjMw%2BnjhtT1i88eFAcZNpxMXl0tIjZC%2FOIqCojFE3xciGa9LtGQD%2BjZpUBcvO4h2UVYXn0vy5Fvfuy0VPFyhDQXh8Ko%2Frl6qQ60RIx8rPqn7oswHq59oNtXEsY9mYXD1nbtWVtx7ai8AedrF1KJR97TxwlmYO%2FixSm1d3%2BXz0csActRpG9Rc%2BpNSahNFp230QWn1mT5zv7xdqsSP39qpORzHW1xFDGVKd6VkeVBJ4FNa9Mn7JKncJQBfolLvY1sZpXz2zaIjMoJhGgTWbzyuVcnNNrht944Soj5%2FLG9dPlTV2Js5c64skyZ2nxYLO6wyBxE2BYgNguKc0nbiDqqh5HMzfU15SMdJkfspaFFNxLOPMs0SZ1SQfiJX1AHegQgRdK0rhMB%2FU4WCpphQrEqFxYNEhFhtSgJG8BJRJfYhqGYbpEF2%2BoavJhAd9eJlHgj5Yr%2B9Nl4uFsSgHj5Y%2BTTGyZZPdxGixR5J7d%2BqMJ%2Fp5M06UyJNB%2F6nfZxS1cBJTrcgmnmQkyrUut2FiSXhA7RG9SS2WusYwGgf9h4S3DCNlB%2BINSFUy%2FOloqffUS9djLMK9HGGk7BrxC%2F%2B5l6N1AD2Pbw7wxYXYxgw8vZ%2F5oBEM780b%2BYrYM0ngZAC0dLCnNKw2kSviqBlJdq4EMogixaG6EupwlNYEOHph9fTGZqhsP%2B4bsqaAWKJxdXnkeSlKDpRYmLP0UzkjDpVLzIP%2BrL%2FOJtVQaryWdeJZKEqz%2FKEH1Umdchr8qONIyf1Yx9oV7NePIXrgA1Ya1BYhq5cp4dTmFrvLC5dQL5ktM%2B7yEWYZdOPZvYUhUCDp4Z97Ro2iBq2ZE8SWWqOhXC7twqStXACijtCIEJyb5cCFwuMwCKi11jCb4O%2FRxMqDYEcAwVZNk6vrxMjvL4EVWJxU7b4m2lEsMSgGfgklPAwBYpV6kEdBKShglvfDgzxR%2BYVQN%2BrNUHY8n6NzefTnwYIYsM5eJJZrDLN3gxr1LltgMvY7cAZlUemrN6pWLzhSabG0c%2F33vuY2un%2F%2F45ycWH3rjkO9CbgFF1EssKXuBdQtbvSALEm4tUM1X4o8cidpWcG1g6%2BzDeVh1awkWVtwsuD6HwQyzsmB%2BAVx%2FnoOslUM0LXEWlJgAjvMuZSuZqbQmgX%2BFCVhUmmHoG%2FZGlcM7iTAPc3xHbg0YzO3G80Ji9j%2F9iclGkvwdWN7Jo9ZDaV5JdWrwMRE61OUG826EKaWIQR08ZUkRtAv4Y81T8PM2PrrMHxPyDlpz4eDPKh9O6aArDNUqMc7PVNuVIoRlofhzDXtgbQyvvEq4cP7pxwvpUFCVcu8eTd%2FTR3opSV3e7OLpXiiXc1fPjTCXmn9yyrkapH5ZQyiqUuytG7wyJ6jbJGUPEZ6tTO2ne257%2F6fnAr9rfnjFgm726Qqq9xcRq%2FuS0XtSqg3onZhOrypbR5J8gVwdwHsEUrIOhD8wW4d%2B9WZp1LAwFwpWSZmohj1ge1m%2Bn1WGsPIgoCcq8AnsHFSjryf6VaUx2UwKVXn8wtwhu8Ciz%2BapKBJ46zlDN0RhoTsaOe%2FeJc428XDQE77acbKdBvoxVpV0IhQi3Piw4%2FmwofjQEwMPdrvIGcSYrQp3FEwmtRh6ziKE5%2BBQ640o4ViQ7gqVOIK9CPP%2BICfzJPvuOMKNFPc%2F79adzQPEwNeiRTBS%2B65T84bTyNlDs9K9NNqbRjPPeVHDXD%2Buo5r8XPiY9JCTwtz2zMIZtfkduuXTd0%2B%2B%2F%2FN87%2F%2B8e3fz7t3o%2FN27i%2B2dn%2BsXj85ffPvN1xfnzsU%2Bp0Nk2yHvApqr%2B51y%2BlAqkuTRNyIpSxaDtp7VmNwEmOK1G99D1jXOxS%2BwsIGB96WFjfAHLmz96s0WNha2SfsJiYLhNL6EmXY5j%2F3IzJGIeTPK6wbl6wZkWA7RryATDgpMEFbDgBlpKBBCxy4DyDyOATaJUkOsVfPHJiA0nwoiM5NjDQ%2FSJmhhVj70zMfgcG5CIrNjjNilDtppG4C4nFuDIEiHDWAyNWuUTM1XJUbCCQQtDNFoDU%2F3ZsUX%2FF23hcCJUt714mzC6WuZTkaMTQTxSjJTHEeHOjZgmI2QSdaY970Geea0xfmy9%2FTvEvT7Z%2Ba84fXOCDYDXxtGRgjkbYTV76ds8DEiC6towj%2BOcrbE22BAMl6cjYTSG3tsPdDD8WLI6wbH%2FBT9OlnfGpFgsXrkwZ2WHZuxebCUOTD2r102irCBpbRvmq8maZ8BHJDIjlUCky9a%2BqiKt8GO21ADVi1yF9PE5vvqVm2LoWhflBCb6yNKKevM19S%2B5tWR8jJ%2BKn3Q3GHNbMiVvZAde9g3qvOnl4TZySPSV0Hv0N1KWXvxiEuXxBrhT%2FbG34FdUS%2FUL5KyCeKPvdPx597fpbo%2FL6VT%2FGLfLX%2BElAllAmDqbu6dsrJykG1J5%2B43yoVql9kSQRuSfMbA3%2Bsj29v15d5OYao93nmsPrxuzJ5%2BscnC6prvrOsr%2B%2BgBlf2SU2ONIrp9%2Fvv2j8%2FfvQsvHv34IK34KnHp9fzinPqg9rCzAPb7lzkLBKkbXFnOA4R7%2BJkg%2B8TG5wJ6wHY2eNPoXpp2MkUbGclE5uB1o1tlHiNth8XZ%2Fs3up6d%2F1qQxyr7Q%2B%2B34Zadd%2BQ2WNKpggoGLycwpnDVS%2FuwaLoG60Cb9gPZa06ObohHTSUoBUcnJoKEfMBhKYRlw7AYJh6ZTPznQGSdKa2MzfqfEXCCfgsyKyQ5sIvurJBmmb4X6KWm30XSlmElyXULgexIw%2Fa3SMgA6%2B%2FwhH9FmUHZtkJreBhBX1braYvYbGFcniKIrnT8eXe%2BB1XZR8ES55EPPG%2BF15LjXkT9ylHG%2BC2y%2B7wbCC4GKBBFJu0jD77z5x67TSh1lGetfe8GdM%2FPgCOG8X%2BIe%2FxR%2FPcNkVM7yvYMpE4R3riwSHHf0h4sKS6zQe3hi4KGkK0sswYRkxbFfIvuGa9kcnW1APJYQO48yjm%2F5OfqMzLRkyeVTueEcoHuVlier%2FWk7b8TOPqvtn%2FfdanPqZsldXsxbfj%2FNx6YifGGG5o9XTXf8UVN%2BHbvxwE2cyPSX2MhFWf3soZL62eZy%2Btk9pfTHbWe7l7rhCJPLH7d3rHvVLLDuVcaMW%2BnviCm4vMCpdfPoK5ZcOFfhsUPo3iPHHQ4pYu0E1%2F8hZqIiE3a04izU1%2Flf%2F%2B045QzB%2BEOSCNgiSNCOhYMkQqk3mrc4Izd1CTmKHA92QFwAjveBQN7t0CMK44xD7FXVs5iZCd4SeI4%2FRuG7Hw6DxQjuwrF%2Fq37HTuClDuUjgulCcLQ3ncP%2FHlQ6pg%2FFLmoEYm%2FooDMZti3x6V9IUeAcJVbRfxCQTlGpjRW7hvcizaRfBKF8MEgwA1NrZ%2B622dFL7mjC1n31naTc7xQ90oHZGLvxndjPKIdzBlEUOGhhAv2HvQMd4WNCK9WT5KMOrYYWxN7YUUweSu31lfKogE2ElBdM%2FWm2JqC0H2iJjKTYISbGOemcNJ1e57jptJu9ntP811mj7bzqNhv9ZtdBhqj4jjLFLBJo%2FH%2F54sXeZqxOJYeiq2llUjDPOdD5Jfy%2Fs%2F%2Fu3QVcbIu2iV9KrkPUH38JfBAhH1m2gE%2FFHlCM6MW95T0w0fQ8VhbwwmRax6UXOq%2B2lecK397%2FamvnnEjMFmz60nennqPzC6GNhwtczWQRLRIH5uY0unG23K0BLEhSmw1wUWPEZqCZwAuh7S9q%2FvAVyC%2FBWotZzdduwFAHTCk6w4Ar%2FjCTd6zpgWoO973ibi3N3qRGag9BP4iCPPdBdSpw3Xm9viTHDZUeReFW6pATpOOjv6I%2F9r04UUbaiTtGnnNImk%2FY04slFO3cEtqXywQKW9XWph1LK05bIm7L3NDnCYArukk8S5XqwK0vYA3nZC5cQNewt1TWMlzMBvygaZonf3d%2B%2BytKAMaN%2BhEduB6ft4PwYn%2F53XnUQXnLfxdBg5cAerqCkDzmXB3Utgm23FYSWAXb2d8%2B95oX5%2FXHF%2FsK9HhnH%2F77Kw51e%2Bf1ny5esKmCxmfZu3HPS4BQfEk%2B9EuolT%2BMJQ70w%2FiBHCi9djMO9MO4QmT0MA8p2DMHl48zkTyu1D2pj7PvZeY8Vd9L%2FdT2sew7JXH85TgcXhYhjyuroBZh775CL6tI3DZj76Up%2Bmxrtq2a8Db8WaOOWHd62%2FQEu2U7vAqIz25kbUt42xdo5FrSkM2ZX5q%2Fve10D3tMIct8SjPYW7%2FsmprBO0ynTOC%2BaQSBxyIGMrx1leI39UNTkJiDhVoIWYXJXsPU0jM5ZM279c3HECR8Y8zU0ABpuqz24zgyzSaY8Qed3zZSPic3pjszaZ4905wDT3AbmFMwu5Q0Ns0b0EPnDHrarJ86ARowP51Wqv7bLTgYNdp8igUL3p9D%2F9oPjDDnatzH%2FuRkwWwpKFt4FAgYHZtfxMAJs4thMkYC1nOZGRAsfGbDweXZtUk8F96HXtJzj0W8cFT03pfCOsOZgfub8DImb8eQkUK5aM67dm6YEVA8MdFqRGU%2BF16LfjINONNAW9r%2BmD0G2KaZazuDh95Mgh9hZI9RIKHa0YSZViD8LLwKjTieOInd5Eqoceq5s2MPWUoJyTQVtRsMqFY1m1%2Betdr9y9YJNyYaGHpFzMza92fmF9xhxAuaAQ5yYOtQLvyLd2dHNG%2BtqBaGV7I%2FiXzCGmxDMIdSRU5cobGIOCUHSgGFxK4xgpOWDTmqxEKdJIzXR0arSboB%2BdOj0feHzZODKAx5ZpIVvokxAV%2BTMI5ZH6kSbfdOQjUsL33pDq%2FMLFdlzIEbT0zybKJfBdGA7RyFQla8H0ZDNB5upcyoD9AH7qw3dZmxGGIwAkcUy0ORo%2BF5L3YbRuD4UpHmyCd3rA6FubW%2FCssBn1r5rlP0bxRegc9GsfqCgK0c0qMoZrQwA7%2FyQo8%2B3O0f8iKvoskk4CsHEOgr2hpKswGrMVmE8mi89tzRxMgqpjByeYRaJk%2BOsk0MLHAamSKwDNOP7NNW4c9C34wTVES%2F8diGCrg2rNNe6kpDeOxO3I9G8JoypgFnS0trsyKboG0dkhVah5c7LcNWtKy%2FiGNuegp4L1zIUHnUj31yAaie1cena%2FCLxB9WF4nCI1%2Bc3p2b0INaSGN1GiBx7AGXJT14Gvsz4MLeeu48siyBUzLPfKMP6dUV7LopO9gS3FMR5IUaUM0s4J4RRlCjgGVEZVBlrXvErGONYVkIQ9zPGRIBF3W9GR4kD6JAxR6QysQfGNcCcOsiPEu8WG1I1V34xpv6Q8bdE0Jav2%2FdO3IxFzDUOza4ZV0WkLZVp4pUY%2BUxUTh5tSqcbUEqLJ4EG3ne8aSyCVJZS51npoUiGqTzHp2YkYkB2HjV7keNXtssC%2BzmqJH24aO8NT4QebYO%2FPiQIvHcwbZ67Ql7W15AxMEJC6gZHDJTJtoidBSnwlpqtHpHfugnU9jlWLcEPvN3cIOA%2BDE4kaY%2BX8tB0DDZPqkMsS%2BtcMyGDnCqqsJTB%2Bp8KWEUHyJiUmIMBdQhbOsy9Jid3RGxOqlKL0NsbyEzU4imA7CAaYbX3x%2F2MINgT6aOQUB8iwBvd%2FiBJAiO3fkxpSCRcNJWiGDauiysYBBYEdHN94fHEafPiDmIvZtW2ALuYMAFFaqEGjU6W7YmIdD6hpmvKit66JpZQQoYG8qDXSK%2B9jkbiUjcRDtzT8WzE795FHiesJEh6pWXtoQpEt1UfLBHIcc5Ru3NQg16Pvr2Wfu%2B56fSWCrqKSBwC7SBzxpvBEwiVitjAhhKySL63ox6dcE3dJgKAqgTnt4FfI9ivmRuCFwKk8dp6Et%2BDFaIw4hv3Aojf5VQPZbpJsfpozVrfIY8nXKZao5U760uYkZ8RyTGxIT%2BlM%2FP87nH%2B2o%2BZ2IcN55F8Z18VEMxQgv134lwUkvY1gibHex4r8wdT4H7bCNMYCLxt6L5S0Pev4u4lhnYsFgggrUfjjgHpfGHMexENuSrRRhakTIPQkhNtUScN7K3B3CV1fVGFdX11OHVhrM3xaODHxtwjZOZkwwJ3LEFZeFPy9guc%2Bk2S8jVkvhGQlgrBLNOMQ0mNmXCawSZLnxuahJ5mMQiS0e8pDeSJRolJGuaxjIdjEJUvFF%2B4qpJCYjZwr%2FhUqOBLDIYVIi5cpyUgrqAl%2BZWhrMdvTN8D619j9hC0vGFFxweAhsPjA2Df%2FS9uGVLx44lMlmbDS62IkNaBCAD5NiAO3gZmcSpgOlyljrDHlBIJhMZw%2BglhzruE0P6aA05ESS7aMqHL21y5VmG4seNwSIYRR%2B9%2BFLNpG7kjoCJNVdCXqqV6Bm3rmAb8CfeDRazfjL2AkAj%2B3XsmkRtsEjTKBTFtgrV81IRO3RHXipwo0M3wJGEHd9lSsQVjriwN3lY5Jd3Fm3I0OV6L2Tjb1M8mgmVmmmyLyPYgOXw0xjD07FpkOO5AyyhwiRdUO9AN4kMA5bC2Eu8m2aHHqYS4C1GYXKTBb42UGp6vD4zT6aqDC1QLrxQyI7QawB%2B4zO%2FeUDMXdyESQd5xA8WUOBUzS4rQuo33dkv3dCkLyvkoc8UpAUcOyivkEdASYRRyLFmXIMSrmvGmS4V4Mt6het6QRVa3PsBDfNG7gZAiF1AcKn5gLA0nTBCsxXc0mSc0FJ7AG5rKqBszbTB4dRz8uYVg4cNFu5CASvF8sUislCwWEIQ7g1RI6xPgn03ucIVir45EqEJD715EN2JIj%2FAHvnsRAbQYx7RAqC9ALaMtrSIQjLCF8CLRDiHAKIf%2B5OJFx%2Fehe7MH0JLFuImDSXPQlydLVjbswEL4QF4zTRK%2FMrQnZtZy1bQkwXr9MEBxozghGAAE8aC8pi2H0PAh14gM2LA67lpYsUNrxqtI086JRPyjRie39EuswIHAP3ixiiXa8hBZVcFWiFKniNmZkIFGkFAzNBRHM1sUxrLValIeQFR5ErFSJuXcGkmIXN1HVvYiLUp2cpI%2B6ctijbCVemteAH7Nyp0U4Tv8DyRGarrjnzx03bJvYm218sqgx8GKMJBRRKj80GUwC7nBhEL36MwJN%2BUUJZG6pCl6uDTjz1uXUZqF5yyr%2F1EmrCqgC9JyhHnIzeW8dKC%2FdiQyMxLy3FDYSVuUnFzjThFy%2Br4TiKrqsjBlFMxiwRAw%2B3vOqKQXxZc71hGvPJSbgmocUDfBQWnRkqbgsKI01KheimLaZRhFnMVIO3as7dQ3o8V7q1olDibSTFqkDW2TTngHVOMby0d%2BFZY28FVO4LI0CMh1o1G9ciCS8AF6Gsijt4c1k0fHbFNDHK9B7gHCLWzccSEeA2HZDceTnmnkDGfsKMQomNaSirwqcrTw%2FU%2FCq3knKTkafucpymUgQVWjbU9HwNvFyZRbJk2ZEzU9%2BIZDgvwXky%2BnRWJUGIvrEelaaIt6CCNBUtHTKNCjIzluD6M5ne4jR4E%2FnwQuWaYG8L3oypsptXlfcwhC2ElAEyy9COE7XCLOEFJSPA%2B8wJScNkGcEhnTGXaNZOybJXKkDqR1YbQDUEPqzCiDEWh5J0qQ8V3bZ%2BfcFZYpeWz47Wez1JA3AkJ9wr23oqaSSJejVnAFPFGp4KSXxV47SZTLkop4XAySvaCqlBb27mKSKVPrEC1BftpjRc2GYXgMrUMkeid29qPx6cHWg5QVaqoP6sogMcqC5pz0Qqx0taKeOsbBQG2RqhDkogTTFcUQhbCl3Cog63CW8aNPZM2lBUcryJiupwzSQ8CbjAH0EXc89gH00M3NY0LhynsqPqbXSMnV44GhKVWCmwxGFihBbKZdj2M8qhK8CcVVqxRrEwfBMkaoirtHalEOOGDSXDSSSIrynsuQ2eaR2sp3k4ALtKoR4H6D82kfaxE17vx%2BfG%2BVKQ39%2FguCCXwLIhpOoAjNrNY6hKWIzdibOddxIni0xwhyEcRJ4o%2BAQFd4IkIdYa3IqSPHLl8B0UwTMfXnpnwNEfGXnUvve4ft9ui%2FBKQrcMDEcpORgCFzQBnjSDRWiHl9btC2%2Fpe4w8jTt0VFkhAIjYP7VaihTovyuhTCxehsD0zqXkRBefLsB%2B9jeLA0mYlXKx4PT3bj9SrpCKWlUfwQz9uhKMztj9neGvdsUMq6nVKGU6siIMiGyuVsr9Z0blGEBSplkTzVME1tM3WPkU43mD%2BNendWtNz7dmWBBawkE1EraVvpUJWElcqZaNyJDZfR%2Bjs4kWFzM4SFc%2Bv62kvtVAfmzQ%2BQ4nzSGNeP63CvaxAmrr2Eq7qwe%2BrcFUP%2FlCFq3rwb1W4qgfNQMElXNWDtr2ghK%2Fse1WiqpNViareVCWquk2VqOofVaKqI6hEbrVtL3hagaroy7VvXre79pTuWCLhGaqCimdFrIQO8dW0HHcg%2F9YLTmNv6EuaZF2m%2Bg0a%2B7oa%2FbYa%2FWs1%2BjcZXdH29XS%2Bx3KAF3BZXKSRJBNTZaoxFYOeo9fMICy3UZFAdGPLikRRkPqWGaSRVBtuVyIUwk6z9HixWEXfqFLH7u1bM83xqtBZ17SDWiG0pFWSk2MZ66BOrWCx48w85RpuaVjViCPOSnfXjfG6AUa8rSPtIy%2FJ1QAsd%2FvaPn%2BjUjjyg2t0Yz0OE046CyO%2FIh%2FZkVmRTu0AV0dntAM2s7FnJeB7VWiiEwwhQiu8IYdFV8gqnODayPAHnh9wW%2FCsWOQxMfkmTpbDdR6WvIA0V1Qh69mpwkVT47rexMeYNjbbRV1MzXzOuipsJq0%2BiLjAHo1pQ1Ll5Rb3cpEDpVK3IGU7KoW0mOkZ2EMvdbkeXyojGgAbJSvLLD5%2B5KtQ4ciA3ExOv0Kf%2BgHLBaJRkmRxhRHGjVAYd0KSYSj0G2I2JGqi8BbnsgwrWpsUcRVvtrt76RL%2F24sjcdklFrdihZKVQoskjWaSUpYQomaTMFkH2DivBZ24BE3rIoU6cmA3MSMpAFDYykaSz8uI00wE9aMTIVYXoO6EqAcjr2F12h95mZ2pVCNvsJhwhSWB20ypMfKG7t0rzLAqMn4jliZnRCK4Cu8yVYDJMhVY1AZplDYVYGOn0BVu6qqAJD8pYN5OvVCKtaGKtCganQVpUbsopKh2KaIk8b3CSyZ0GmPxwlVYQeehEambMtmBQglaDYWQFRQlnKCgUHgL1Rl5KY%2FwA0DamCTvtpHvTi5VJAqtWIL5W1FIKeurCvzraIMyvaoyucNdlWyNiqIFG5x7jmIuAWf4fiQo%2F4uleujTZn0TUOlTL0YLRSEIDRWBgUldiZwQMnZvZpzSK9xiNj%2FAYMsx7Hn9SKAUWSnVa40k8WYDppzOS%2FW9OHb9sIephMQypq1hk3ENVM6TJPsFjPwQhcJT9sd2fFZFZklKZcbMmzMDczdkhcFhC83tiVATL%2F%2BYN0GLmM54nLDNj4pSkL8T70Yw7NR4IekawpHM%2BB%2Fl%2FuDK7AxcOd%2BAsZ54VituKhKTFl6xB21%2Fxr0XdSlorbAn5bhk6s5lspAMI8ZNKwR%2BUPWViEb%2FG5rMEjb1h1e2VZJSaBKOETsxtzNo3sLA8BaM%2FqdlCssUULLfG%2FnjsT9cBHwfyhGyPovhubXdqkhnLm1mfixvvhkc9hY0dv2o16pcCyzbY0J8nSO90ZLhL8mhRsYdZDaCUvy6rMjKzEcucZizS1L8FF3o2J23whGmXOAu6rrIyZtXzQ8Lfy6YtOkSqGeBbZiMniwv6XmYsUH3o1yk31rzmbPGGx2KyRUNkLNiCfpc8dx1OtBbtbZbFzqY%2Bkwbl6G4yZXGiBovjdtIZ1Uqu76S1RoXXegs9D8sPEFNneHnEtsOPEAUXIvskxwKLgM%2F4wtQIXofhAoqe3CYEXjM5%2FMiIqtxcX1GVUauo0gGSoaqAOYEOhLNU0eRYHw6iqJY8poeRYLRKQAr7U1HkXg8HEWSlSmyNY2Yx21EeBPox5zXCTBCjKkM%2FD0bO0C0oWls5BDOBRoZWH4Pt2ojsOWQAajTKLibiJgukgBBt4q4PkaplVCC%2F%2FIo5iNk8meHlvluKycI3ASeT9xHzGI9SgUpF8Z8yCYIjoq4YDQDn3tbmFQGy4kHSo%2FOmtVUJc%2BkY3MYp4C0KfLrvsTDeHgWzaQVrGahuGFmYNkpRWP9mU05pQuQZ7KMWoz8qPLlqGHHtNBnc85hrIrA1JvZ8JaoeRlykQBrJneHLHfUuAo%2BISsxF0R2ClfNIOgywBq2vQl3n8rQEp8kF13jZWUppRaBWBaOTqLFaoadYAS4bJuwlLn24ygUWA6FP4IqTJhkX%2BFeLUJixOV%2Bw%2FhBpy6MG1kYh7YPtLpEX%2BV3HMPBwjIpYHklFvGkKiCJDDVG8kDVKFivKiaViO656QmewYNOKAqrs1LXXCyqUSgGC7l8R2OrZ8YKLToP6UKpi2b1FhxuvGK0HlUAuZ2eFENZo2MXzxIibh1rmpeyGc6rAhVuhKUCitUWSyjBNRrryJIKWMl4xsZFL5mLAVrvHwyBy4l5Qytw0ko6oUT6CHka3XhCOEyN7c5Fokk4FcROQosyWG%2B1nC275qrAmyhYMJ7Yyw4gFscJ9HBFg9cRkB7lnCGcpvNCiGt7Y7ZAr10dtaoRTxYS7YH33llcHAlnC32BmcUFkJIhi64%2BiOb8L0LfcKDJKwGEZJt2x18lcIJj%2FzGsPCGgsHe32kE4irtNj7lcYywGRR67owrijliKZinAJcKJcDKsl%2BBzz%2BNx3YE4ysto7MOuI8lMMNm7Wrvk4So4QI65BSCCGqG5xBF6EHF2F%2BGyUwJiKjQNhC4ybuvwXc8dSd9omawxAk88F6MvSP5AY4r%2Bp3uyxZ0NKAMbmxH8XIUgS7hDQCWpZbGNAxZKBEGNqoBaWEASciFc8F5CMGqzOOsJmDRl9HksBn4bBzyU2Di4a4WiOUkBw%2BMIjdEO0xsJUo4xY7QAgsZrQx4JHzBigI9xpJzv5IADCpsrMzndpwIHGEvl0CYzpCIj7m9EcC5sJ%2FCRfRAITXKDLueaxmsCPhPeUpUuqtmZRRGhJDNeQkCvDbkeg1BvWU5fDSeSIogaMmw69WI8YjCeSGesEGPQlnCSE1ypgCBFAvzEEv%2BC1DwyUKA8Gdy2jeQF2pIzTo5VFRVmq17oFrqX4QXbB4UTFNWIkCsD7JgtVA%2Fi2lHEPgI7haLbJmLBTozjRRAIKk0MHt46PKBI2YKdFaJ7cIBchxcMrmC7J9WeEDWQjzpAVsI%2ByyNVMSQ0WrSoynB5GH9znHUB0dGzhGuZK1xjX8W%2BuWA1hmJEyHZvugSFgLUYFWRFkBeufIkp87GUsthhabTFiAqwDTiJhhNBtIW4YpxYbcYnyLbzkhuVe%2B2nyipMPK6pMnlMcfkVFENTiuOr0BtVA%2F0b4djH1XuItsSWRxR6MNkFUroEkXlLnwq%2BsATWwowGD1daRKPMASYBivLQOE%2BqfFa02W8IWDg6poftA0vnZSEjCyFy15YSPEWxEAnlxG0AsSiXU2o7dVoTGlIV7QXRwC7hWVfFS%2BeMExZZxIiQTDgBe3DvIGz0UBYizLYtUSFLBFHEkb1QZ3wMh3gBS5FQLESygBTNrrBIHk6C1ogtpgSVJJLpjXiQAgMrj29%2BUD12bwXNPpWIuZ4C4fHCTzy9PgV0wcxOZDSpDFrINdAhUFpjCm2QgQ2LyTthKsd7RkSV5RrhVSolcaLwwGYKCHNxwcRgExXwLLbMDljUtLiTs0SuaAn%2F8k7QG6pSQn8DlJ4SRCKAVWyKbX9WWMEcM8epse4JKgUsQkoHDBMuGZhgAZInKULTPT3mrPr%2FZe9dvNw2jrzRfwWZeDcj25yRZDsPJ44yetna6LWakf3tSgoDEiCJDF4CQHLGpvZv%2F%2BpX3QCBrmpwZHvvOfeeq6NBN6sKQKOf1dX1YBq5iqlUh2l65yf6HKoLloFI4pR2Lzm1LJ84vFSbiX1TRf5tS0eibSWA5KlLgZ8%2F%2B14NdslI4ik906xfk5KRemibPso3hr1%2Btgj3HYcFEwH0GKN0AQJ6ZtuW2fDxGj53XkuriqMuKy1GaIQCx5bS1Ns97MmYjy9GQ8FSsyLpkFJ01qHOkx%2BVbzQ4RYWfcdoqZFlOVdvMRXsW19adhjqdWOQB9rhP5Ucr3lWX1irO0wIjBnFAQ3jIHEGkz3a%2BpXdU7tvhWfukErKfDk8V5kM9fqEs1AalbV4M5hmtFVDPUSrQLrFVcaXwOe2cLG3rOqSdn7xP1nucwRkGSj1%2BB02JI1N9yXhRPVSjfPZRD6SzXKCvrpdxPsIumpO313Uc6d2WLSTMMjfC%2FPWo%2FL2sR%2FSqaDTxx5DIx0e%2FTF6OV%2BXLdIRbNIyvfgrdobW%2BNRLYqcO%2B9t%2F4ffFcPaNZaq5WDVBKMzu4j1kyWNfm1CJEuIAOPvK4EZTm46GH8d55gEt%2Fxea%2FKlytqYG6nueki8nKMKk8axBU9dO13iVfsatUbVqlblxUrPiocmB9t2lKuS16BTcpGpotOv29%2FHxVNEZFT7vZ41UWqEPsnkNAVaPOPB5eTD%2ByNgjVsJBRcZgZJq4255DaJ61nHEnc7KBVAquLpjWiVdzWJVsWqZ4uuGh1UFoKvZfoeyRAX4VSfNkuMf5naWavQCXMdcaNWnsXNOOm41sa6PuYDYfam0e0wzvs2CKGLfXjKqbVKvVwKaBAny2EqqJFsuxKQ414Mwa%2B9u1bgHn2%2BKHeQhbp6bP%2BjcWI1sMey62l1KPf52yHPN9qwrQfIBl7gTFklla1DZnIfx4FipfKHJtiBpKcP%2ButKFZ%2BBqGdPC%2FVeKHLQsTmXipmYAzTXgc4dk7PaW8jRne74zLSYK3Fuj2ZRyTNeFFVgGoHo4xQv10LLcbAVlCthY3qEWgyKS0azXItj%2BNXoZjCV%2Fs4rJKaUR5DX4tVzVGBq%2BV%2BdRXWK20cEZyjFSiKEITq8YISqb9%2BfuaJ4baaM1jdmK%2Fm6gHWat5puXseafCayeJq7jl9aBG%2Bm3yIVbG9L7yEGXiuIPQwuqskiu8XQpUBYFVRYo9QddSA9vloWEmDQoDcjR7DcACuwM%2BTVG4qV5mo0aJudOWUVZOlCg%2F03euHUHzHjvVpvInFNnG1zpJInpwlijQlyaAQ5OsgBqtwb8LyLMkVlwQGqJ2dJPk8LMN5AqFopIlGk3yRSlGnhbr1kbS6nT54p%2FOpa6FJOlERLYVEfEsFev1kXEk7yVe0n29qRToGhZkzEw3vabKQH6wr3Scwp1ENMRjjZY4Zy7IUgWAr4BcLn35ukiuB2QxwRFEp8cSJS2qcb6rAZ2u4PkmVAO0G%2F7KKNzLWS1KfQSO0uF%2BxBoXEzo1WQb7W10iiULQmCNo7NfR0nvrMxI8cjWFJVNowqKGm%2Fh1Uw4Qip8HlRVYIU2qDsgrwXks7Q9XIOCEGwcyywkIRVokLltTtyZ1EmPM6AWd3nBLaasizPFb5aqsg76tsIxO2VS6xMZvOaZinD842YZIq%2FFNSP9J1aQnxfk18oDitsggRba2FSxlaD3MmxFx9pFAe7CPVLtShVdYgqWEy%2BxLmSgj65alVzSM9QakFV6mnnQjZaI4MCMMnHYoCFKNGtH%2BSGpPpY6PwpuJehjoKi5dxyhr5HCwkxNVFkZDhJsS%2FHQjeDZKa3YoV1eNkSVtbXzVa6wGltv4eXxvvlBKT5JHwnJ%2FUvgf5hs1Tj911UpvDK0XjDKjqMo4ewyuRx%2BkF0ViJfVVAVbZzR6M6lyXqkdm7hzsvUjl2ngsDBoLRTOAbgy1OGYbP18ogUwWqSW0WLk%2FnMEhtlqS5U3JmCbH8L32946VeLQj8p8gzgIBY8NFVPF9rM9oQLe27k1q1%2FCBwT6r3wMRHUB6vxjogMPHr9NAvHmqHgIT2%2B1EnJEc19s3dVu7mqz0WselsskVaX2f%2BB1SdkC69fv1kjK41S%2FHRKPIWAhZrnmS%2FrRTV9ARhYvM4klaswFD3y30RoJK6b8yirF57tHbvEzCDWnGtyq%2BvOUaEQB3yVRiF2iQ1sIrxfRUWCK17WoMZjk%2Bm3cboV8TWSKTnXDhRJAQMg5WeT47%2Fr0JscgA60%2BjOanWrB5Qf0VTy6y9nZ1EE1c2ZVGQf4HSZPJNcEAPl6n9dzr4Lax1B048YqoBCMKDfcRGLyfVy9kNI040QTV%2FG10%2BUXSeBFUUWgooPyostcfZSnppK524ACREfgKr8nxDLtSxZimVXPbdLZ9IHejrTXJ8TVFEFsNBXioSeUJrjxHSmKPESUHM%2Bn86e1B6BTTp7mcwVnZQOrhfJJxdJOe6d%2BoEtwvdA3T8kY9QvZS%2B3etH3KG9R%2BnjPoZqg81bhns77cX38oULtiW5Qsj3xWPEMzvviHtr7BWOPV1a8Du59oO7HlFGaMJUQUheGgDJYtwHed3n8Fqw%2FXP0Ef%2Fl9hVcfrm1nDJAjNj2MFWOpHv5b9nPqzn49gvHbX8Xv17Qg4hH2EPJGtKpMdIz0jDmb19IBRe%2Bm2t71usSZFmsbfBTx3%2BO4vC%2BFFr2bNHkhoTceH3JpMqvC6vpBBXcKomIMkkbhPA2JCRcnWmmyUC0meFt85o%2FHzviH8TgeVroaPFeUxFOcW2pH1ikxL2Fl3Q8p8zWhn7RiOPnQPpIKOk5wvuaDjnEixfUBEXD4dwGWzUwg3bEsMGbLo%2FM%2BwA%2F4TkEgaibHkq4JVQzmAbRd9JtkFCOCq7xArjMD%2BQg3kFt2QH2JtlDmlifwFdhg1cd9y0s23VV71J6IxrMG56P8Q%2B5lE%2FJxPqFF2zLpaH%2F9eHiJfISZyA9xE4LAX%2FCbMBNewoOP9RNoa1s%2Buj7nIwt07l2hc3WJztU1Ovcs0vnYKp2ry3TuX6dzfUGWshmAzmaiQxHUY20MlKpNC4TiiBDgb%2BW2hlU7dL%2BuQHnOqIHSQ5PySql5WAVCt%2BMFRgkY3vpq1MA%2Bv9Op9Q%2Flmy4KpRphDcT6kO7G3KDkhh3wh5qDKCDkgGLgyCuA1F8SRyOv8UW%2FNljV1wtQ3rYm1MgTvc%2F7QQxPYfdNEI9GNmGex822qGSrtAgb%2BVRyOEVxKffTDJTzcjaiIZ95JCwd%2FCy1LtT9FNK%2BboAbfS0IHkuBcIdXfec4WM8U4VDpo88hUgZiR6F2gmzgQl6tCk%2BMtswfny0bic2WeeOyEcaawuWqWgvhoaDomRyysLo8w1lTUq%2Fi6EXOUluFJq7O0nIlnw3M%2FWpdu%2Bylwega0ZnXNsNgpKJuZg020utUTsuZx5rDwNUYJh1KHApmPvsPg1AWwsxnFZKFTZVc2RMWd3oxyIsqzGsEixZY1wQnU40DM9UkP4vztaqIwAjZIwmqRzVjjNZRAbcB4BWUwuwxWBOSAaFGaNwjtFI9uiqltBGI7xSfLoDrfCYwNkidWlltvDcd5flOL1drkecrYrXmQnxqsVoPMxgZUMYiNGaLUSMvsijf25T%2BD7DkKAH2PEQvr17YSkh9pSftDK7qtAPbzET9YH5dsLYZjqfSWJUfD3DKBNI3z1KYy6yNdOxxs2Lx0qGKRSjy9h5GDVDcw2ucYKYfDOtUrKyio75XxRaZCPYOj%2FGpHpezj1KNNiTBocd48KqORVbAGRI7CpHtUuhuibKiklZamXRnC5DXkQaQT3KpM2LgKlNkMB5foQarssQG9a2mrmtQOutCKGtXVihdE1g5ZeDgSZ6Hm%2FMoFQi1Pdb9ULGPieeSKBgMquZMuRwoAEXUz8u4Uljs3Iwf8XWQynm48tx42Lq%2FTlJFpcpiPZ54Hazn0S0awriH69nM%2BxbNX4dFqXLLAc5zozUm8dMcxGj%2ByoCGyoV2GyxnUr2edWlhHseR6ngTCKg%2BJGImyxXl%2FJxNIxVtkzze6rv3nNYvqCFCHKqZPwM%2F5gUqb28WXyScyuas7%2FJi8cj6dRRKLIbgongoN3%2BFsXs1vkLcVxmkz2ChaJ1AyHNvQqmSiyK%2Fb90xaMrje%2BzzQnpP3mNfpqE7WPZIry%2FRop0NYfRjqlx8Uf6wWMN3b5oI9oyW3HC%2B0kJXFHlnLK%2Ff2KHRUx4pAYkckqc44xAk3z34dm9hAQ7C8wmIW53AEbdeGGtV6tEjafE4J%2FGTVLGRjJn9nQ%2FPrICChmbRcxo22qxT5P72K%2BPc9lOfJQZIHj59oLhuAObbl%2BcKVHqJA5R3rGelhvqvYt2sZ%2FH3SRS7q5TYehYVrb3f0tgR%2FZWaWfHe14I9zv0KxYqnBKOiwdzxQ8BatzVmjFHo0g5JGK2w44BjrHoYQkI3OKSp%2F5O4MMkvla2f8s6FiEtAvdfoACkuOUulg5QIlKuYTXbw%2B5I763DPi9dPNHt6JnAD5zLQNV2GwiN7O06LRldBbCk06ykOkKHtGPeI50LioOpfGqD1cqjwV1YxU3rENAh%2F0b81buUUjK6txxjJ6LZg%2FXM077AccoPd9MQeH8lMobBmHVxERugwr12n94rkpNTFXC24lUhrWwmiMe6evWgGXxSqU%2BiyfMRu%2F8%2Bif63FbNAiVdHeECmn4Q4POwrxvRYJ%2F8JVIUauxaoSliHS91bWHH%2BSPxeRsEqP57bSLCnq5sji1PXE4tS%2BYVAXbKktQjL2sTI2I2HLqpjHda3s4IdIuBA0Q0oM%2BSrJwupaNQ8c4DQucEDgOVoimqJSZl5TuIcIJqUEByF0tJ43%2Bm693AsB%2FBh1NdijNWkwoZfQxh3zkN7SeITOLdofDr0k3o42g7o59BBpnLmNkqh60%2BW6Xt2Xxwct2MQEEsjGu84RdXXN7e9Dtm3vw3sfXYktUQVbYCtdlxLdPladNfoEihF7H220TkcIztkBYHqeLN1GdKiehjNxFMAk%2BgTEKFUcgI2sApqJVQpQVTpU0d5CmP0R0O0MAInNFAIgi617ZcLtrFMhLK%2FiZXz1WPolZ%2FgzJWYRI17FtOyJoVl1kZ61eMEtVvG0W2n7agP01D6r9ei%2BBavOysGLUBwHVQPbCM3KvYo7yVrnhtZLMmLauSd6qjBdBqsycFVrmu2%2BQNa0JTxTfeXu0dbBp7YsdET3k7yA%2F8xqlKpzE%2BmnGAmm7hLtI6MfouwFL%2FeS3qiqvvO7BuhoDiPHzAM6yhuEZ93TvrwZGZjdG1F6Xe52FC8PcQwd5XlMW%2FvoZrRQATXd8UbFtHEUVLTnZH2IVDVVLUm%2FR6sUh%2Fuq6KhjVOikmMV0IaYgtf1ZJWNe6xWHLvXjbWBPnUAPILdHgpHTi3hwToN874BlpCH8VvWJUu1dS3hL2BumOl73AmGQ3ruAQOFHe1ZLpKtsDGkUjY09gf7dHtZ7iBzp1ePTzrNRfZEhzRiJFSXrSDmv6XQvD5O485lK1c1lKlbMYyqVMofpdCzVUnkXRrOgsZXJqCSQR6qhGAx6rFvpk6dK6u156u6wjzKq6XARoh0D9ikP4Ud6qSHw9DC4DukrbAuC9%2BuEmEt9Q8nRmD0x%2BhhHsyJ7FvL5dCQiqVdQeeLZV0YqptsP4EQrrMb8JVfxJlZqCEC1P0NR3wON2DnHf7lIqK6KCsRZWCewF0ejxErHfjfWVRdZLo48C1mPQnl4i%2FRw9B1evVXfJwIhToMB1eVNBqMExwPiUe5TQgP2aZwvhZECEFol1KO1YAOpaze%2BzrfKTswgFMFTBV%2BMxnmCclZnsGpsNs3cuFpzeCY1xlgdLuL%2FLvLYFV%2B3cFeC3cGl9nSL%2Bj8%2BuP8Wt4%2FXodlG%2BXRkgVe0qwH2aNwC9R%2FFNSJ5Ch4IOI9nA4VSP8oF5gY3qyeeQHwvGJuaDfb1IVUr778W0Z0JJmTafJyiiOZqxTaLYcohQM2St3olDpnrESm2mXwUNVKDUIu0Vs276uG6Po7VuDKHxMOe1XyIqgJhkvYyVYyfDHqEU6%2BtdUffTZL%2BkBFHSnV7vMs9zYf0THkd%2Fntm4mnJPMuj1%2B4hpqFSHbMY1DOhKGrhQkJm4M8L1eOFQY6gXmkCsz7qB%2FZjKkcIk3h6yB6lsit1nEdnr21URAVnGEarKaDgFVayBavm50C%2BfvjS%2B0ITltUzE7CE2VeWHs7n8GhAZIRkXiptkHYIdcrzheGUcSDq8RBSLlp2e1%2Bsp%2FpgrKe6F%2BvJg%2FLHeGopEGhH0cWubxQCykPl%2BUh2jT9eHK%2F%2F9no0mlQNleS53l60S1mHaescaKM4iQZRUpVpSBvNFfEojVY6UNBmQFtWVHuG2h%2FMyaJe5OyDW0GOxHECGip88rC6h3kuXMsBWWXEkLzU4gTXHDTJ23ZeH26Eux%2BvaL2nDckI6pwYXyH%2Frw%2FHUQIJ3HornGTdxkNidRm5wextvB7GC%2FVIo0cygqd97kWiYUpFr7oeDbJUs0loz3Gchofv5JE6NQSKa%2BfaRmCq6xf1PEnVkNdMk2%2BK6%2FMYWjQeipEYSXXcCCnjgzhJ1aZrKdU%2BLGWL%2Bpi3dG2A6weF2tJYDAmp2s7s8ery1iLbN2gE%2FohP5y26DToiDRy6J4x7fO%2FIDF%2Bg9ng1lEztixDFCG3GHo0bxXgbykKREjDaF5iZkbAOexaWNLbzSHGuDZq9wNhTgB4fqhuG1FoAKwNUBSlA6VJmxtBIfqGFc2FkUfIcsxHCEWCv8zBL5vso8p5AAWOk%2BgDxxq6qD8euAolVkMkjnZe2BPThPjX6uo1vpW7Xa0Sb0j4T0LANZayhtRBVQMQh2lmfBR4fio9sabQzUovS121%2FsCsghYlqbSNgjUTnNSTezx%2BJ7WrRar9WQ2sx3BOqtR4Lu1WbsFs61MOw%2BM5A6kPxtvoEtdf9%2B4DKyyEyicYom3sjVcrboj2d41vFT3tt4oDROixlX7UWCaz2RgKrD0QCA76okh9N7dG6faXPB4fcZYNE95hdQ71dly0RxuccGziPR2pCeTbYJj6Z9QTtwyL%2B%2BNozPpjifsXuY2KNgXrqc0y1x%2BWxvuww%2BmF47WG9GEzzQRU%2FC6%2F80%2FieTDH5a%2FE%2BO6oO%2F8qD0HzmtDjiRPm9HrRR%2FNEsdEEBbwg%2FJLlu%2BlXvg8N5zbPrNpqbZtU8RPLLfBSa6fMQOXq7p%2Bl7yNHb1cm1Q43e6rGlFvgDD1Hr3qJGb1XNsh3soQdoXaOHHL9d7e573OjNOp%2B3x43frPIEe5z3Zm0C0WPGApFkQjm7trH%2BPNawLlpv3ZGgf7UN%2BmeYMR%2FSf75KJKpoq3nuMeer3WCBSoGH0fsO4X1Lrj%2FEXz0W4q92QvwdQI%2B%2FfSQ%2BXT0SJQk43YQFGJ2LGI%2FwRwQvrcXIg6SSp7N9vOJwvodWPGD3sL7ZvcV7hNI3CS84pPJEDhwS%2BcYMk3hWYXie9gyG8YCDTCBVQ%2BuxOIQGea2zoy8PmJp0JL6QgrVnQlBDCnbwuz6EOND0RBOsvSritTdcYG3DAephv1ps%2FVLXuSc8R1p6Viv9%2FpVUPbZQqX3MCPTQp8Kbl0EpW6ZXXjXieizYYD0eNrA%2BEPivHgv8B6S629wr7Jyl2%2FDav8%2FZExqZkC5W2lP5VSRcMr%2FkZk%2FmG7c9CnVFZtGGNftVQ%2BcyjcZFnF8mQvu59odPrG10RN9McV7G1KpKf4BQXZsiWNiurwR6IMU94ny%2BirWh74uzWI9FSATyum7i7MVCs6MjtGmbM20biYYxTJEar9xSeA7yGKcfWo8EbazHgzbWqnMWQGk6tW5%2BEq2dekEUNWSTxr6mvyi2qtE2UFUItyMPfTuzFu8d8ZbgW2FUu8dprk0ZmyyXRl9ONQftkUgt2z3SL4e0BNyAHrbOkngaxCKpXdT5v8Wr434kJGV9MCQlKNSnvs4hCpon6qkTRsfZLFFMby1y7JykHwLT12%2F9QTAtUl3aLYLmQGWlAlJfwxgTz4skheyHupEuPvHF3qwPxN6sTRBNo62pt78%2FAmc9GoGz9kbgBKZV1BhB6TocFq9jWL1Rl1D0kA81IVqLx0moF%2BthFyxWGDftUU%2Bl28g90s%2BT9cNQ%2BLHxPMbZ9Yjv4D4xhHq0Uzn8UqHg6n%2BqGit1j6Z%2BoO9Fv4%2FTYq4O1BbDegHnqhpGR8OO3xZ%2Byfr41sByWk8WFzTuW0dsSkv%2BEOZwYfvymcoS%2FhButOPx9uhw5Nh2f37pn5Z6NHAEhNCwxFVrs19LOcr2tUR8YHGDoo2cWrQk342LMlqyp0XSQBTYJM167EMN3aGPNFT6GtHS6B2vxR4usa5h2sPry3qHHll2Wxrv0toRjH6hd6vQRpJJjXGxvlE1RP8dV4Uqm%2FhBPeUAVJ28geBepaPOG%2F2eJd%2FDQh99dCkxj%2BtVsdWjNAGjRCFmcJLHWXif%2FZNoaHPgSQWC6YhOUCpCGGBalQYfwbci%2Biig370Wn0vQp%2FFSOdMjhPTaAmjeBbXE69cKawwiT5Xk%2FiLnBz%2FqebwdU%2BrEM%2FTvzvUPV9zSMPil3OgBrEVxZgRHWlAPExlrA9WrBXt99v1jZUgD9UNIGxrJfhmUImBaYcehPclX7tFij5XaX2h%2FmX1F9qm79FCiCIpMI2FvU%2BIpBFa%2FvhMgyGe3WhEebVHgH6TFOvJs3zr8i%2Fk8XWtba1AQgwwa9e1WcHF%2BnYtTACnBUqQYBBIREGtNrgGYFqqSEKU2fadxLIZLSjVc%2BdY1Rr5S3K4ZzLlfQNjiR29WF0OD1DFGhgPLbrBnDQfLdqmKNEpol%2BExGKyLTOX4pXfVGnIhXRwLOa6AqYIilhJ5HqJ8oU94VNL2VA2QVr%2BX5X6%2FDj2HsypLC2OuMX8idVOITkMgq9Ejl1%2FClfLL5Eq%2Bzl9UzwrZc9YlNhKKZ4zaCrseyx2XicPypP4hVBYzg3wOplQMFIPznBBZpMJNbZPsCULySTWvgaWkaADGqu4PDEpXlGOU7lbK4NQTEMYojqVqmpZWVZEjOKrH%2BqJHYcU1YyTeWX5PY98jvaVIGtXnSY%2FMFshP4FuPWBqqLTFjYlLGaVNph3h98cDBNcLtYsP74b%2FnxZbWIzEdNupu2ULPlssqXkphqkX%2F51qGJm8OnAoA%2F2CVpFElxjqjPN5jm7EzhGb06KAZPTEA9jvZYM24EBpoZbMGsCq2bXwS68Yjrm7004nGZ%2BgMhFagWE7Ejc954x6hMy%2FAq2XSQ1Y0RqL%2BxBN13kXLs0RBodIISV%2FDehjuWmWhRjrg4gSxHHPNmKifWV1pLsvgx2Gk%2BFVudI9mje7KjMGKULMpNF%2BQTfE4uZKtVzwttrLkBnr2%2FNx1sYeY9sqa3xSvaYWVj2Go9pjBkYEs1YEThRYvmabGe9DQYqylsG5IPiBSN4QDitGHCJVoncxz7NEcOPNovAcezdhpxxBprQM8NMqgrhJXv6IxxyOKkpLBaBolBqP4bWg2cjluNlrICYLqASf2iDOxOQFuLT93o8Y8bTbamrJRo1Y0GzUARQvWSuKNBdtsdKOADq6F2Go2vliwwKgqpQahf%2Fm5GsyC4b7C7VHel90g2qug81bSns5XHwejvepENyjZwWivTOyP9tpD67dqo5rhaiw4RmnnV4SQe0gD1LqkP%2BTbAKfdqhbYV1r1Dcpkc62axAMsRBEmvrpi07VOfEaw6%2BRckT2s85B9tFmxoQerOK1pURfSQ2aL0leLNaxTtsomca36p7HQzv2bjtbs6y3KJ4VYs4NLTMqemxvVOxcjkswjc3GwauAP0Hj8QK3HzrqBfFJTyytwKWtf8ym0DFmwvsHp9FrZhjHsfpwWW%2FWQHWjVin2deyKtEqKYX57NV0lsDCEEfsSf47qMqAd5jMAM0uNJyiCt2mkVi0qmdfTJixLCq%2FLFrG6qtT1nF9qjTHnexDHYQ2zYilz5CCJaR0kB%2FuMxDMDkkSOREE9UrhvPRLzB7OHetOETdck8GPgD0RssvCrq%2BqVxmqsSIJSPB%2BEOvA6u9vEWq4q7hsjz955HF81YUWErJbzfGNTT8ejDhoimhVw70XSwvtI980f%2BkQQjVeQJj2aQRl4G%2BY6KFgoVLXjkfdaFN5fuIIHnOdqsvulpW%2Bj75pZCSn8s5hnH7BEix02nUCFOIDY31qbY3EyVYnNTPQpL6AHryhMbXXNic0htgnpxsriGf%2BFQ4UQ3cmYCyLdeAqetd4D7VsqNXxljY6Rb%2BmmjRcrTRIuQB4cW4WudIVaKQSyB90jO4rVTtK2iDLK1UsyhU7IDRDrTM6S6wYPGH%2BNTANkeUkzZ3kwrZXtQJWV7E32U7QFllO0NNFG2N1FD2R7WQdkeUkDZ%2BrVPtuOqJ1uP8H07po%2FS3WRnS8nXdbevhGr9dkSTZXtIjWU7qsPiYHWJydav5bIdVXHZGkeQc3j1LyoZHUvgNfW9rddHpMH4jF4M9kmOkGnuXt%2FgWAooa%2FSgUs5WdSZsocqa1mKUibiP8n%2BiJiy3d6pc%2BNbjhuKHx7BtUHazipvArapBBKh87lbVHNrCHtbnTXALxkMbfIArhgZbPyezPcTDbAeBTPaod3%2Fe56Gl1AQvXz16%2BerFg0fn5y9eBd8EP%2FUfM4dxF0r8NUJ4uuKjGe1e8q%2BD09%2B%2BfVt%2F%2Biac%2FPjus7dvZ6cDmjiPiOKTIfAyvqbyRTU9NYJfjzjAlnkRJAtz5R9xWse4PSFIPk9pSiTMsABzwwLQc970wcHwI%2FpFfcv%2F8mFx8K%2BKEfmIlv%2Bvg9tD3AeHdpX%2Bqz5J8hXxLM3x%2BcWrJ8%2B%2FPf88%2BGlQV7WRqAcfbn1%2Bw4L95c0%2FqFx%2FfffpX2XZ1DrEP6hXLcOUXshfdXSDgj%2BYPn3y%2FNH0wYtnzx49v5g%2Be%2FHwkU52%2F%2BmLB38f0PXJ3u1%2FfOj1KBqW6yoffmVuquT8Px87jRfW8ZQaj%2FVjiLn9OqCtaOzpJ069WcTXwd8f%2FdcPL149PHe%2BYbZO0maKir3%2F%2BsnTi%2BmT5w5BiiUSNff0ycWjV2dP%2B9gPN%2Btjv7Q6Nbrnr5%2Fdf%2FRKQ39%2F9urJ2f2nLvjx6%2BcPLp68cD%2Bv7ZZDaH%2BkDxpzQNd1Kud7T08%2FCZI6KPL0OqAdexIF21WcB8TXUC5pVsF38VVgghvWwXF8sjwJPnn8%2BJbzkLdvP3nzj3CyOJs8vj350zu3TxN%2BSyQK%2BJ6AnV7QGIx%2FVwd5EdyjOSKgLuaQ%2FG30pr%2FpN50G96t1E08WmMYni%2BSKhnLQrGLuVVEQV1VRnQTncRysmqasvz49XdLnr2cn8yI7XdEqlGIl%2Ble9z5%2FQj3Kdpqdf3PnTF79N6nodEy04l8kfv%2Fzi9h%2F%2F%2BIe7f3IKEbx9uwtk6YOTrg244ukDbJU7lJiOzyb%2FPX339u2JUptfv337jQJ%2BQ5jTg%2BP8Q5vJimidxifxFTaTNS0e9fuFpWKaD7f4F%2F6o6DktVlNzi1M3aTI7TWEUGS4JVb9PCYibNmEVWI%2FVU4LSC6ZTVFyR%2F8f5sZ0Sjj7usUfHtrSf29Lf2s8ti3XOTBV9RnqM8XirP%2B%2BY1ZJDt1BBeLjyD7Gg9gd5S2lhx0eTydHnwdEnR7fEbWbMuiswu5HdryiDJtvAkoW435svf7%2FzLS4Kojfx%2FRRk2FCC7nenwYd3Q9IPBztM%2B4n%2F%2BfrFxaOH0ycPqSqePH7ySPAbbTmPNCbCAarlOzoalk%2BWwU745%2FTqQa0dYfVxmKhFmLqnkdSPnxdNUK8rYkcamkdoJw5ePGgKWtHSNHj%2B%2BunTdnn5PAjzCIwBjdWagJdx8OQ8ePP8xcU7S1cUlwE1LdQXaYoJm4A2FyfO%2B45yGel2nV%2Fm0EocY%2ByevX568WSK5XF68V8vH8kvjji%2BauAL85ZCLhQU6k4e8z00JX6UboaBo23VHj1WRr1gs2QpNXVmSR4KLaRZWsxcUFGksVCOmq%2FEgTNA4Vye0szlMyO5F4lEbCSCLGgD5ZabwInUCdQo5TcTJJZqaImuX5Ar35grH2PUo%2BTt64xYWhnwSfrYl3bw9H2polula9fUTZgJsVhYKaUn6LWY9WhE0MydLJK4Co67Ngws7S33AbbbjHXC5y%2BeT189On%2F06nuanJidFD0yFOcQoVDemRe6F8soFqQLRZ16kVRCzplKlx4QVY5%2BzaEvEb7hw7k4TJGxvQiC4OZue4apHD9SayLM3XEr3UKFioITw6bh0tVNMvAsvJrOwypCXUqhs4hlFXY7DYEQ%2BvJhfU3sWSOHgxizodTDDJtCeuYJ1zQrVsmPWgcJN%2B4H8jqowaYLJea1wXCIX%2BXps7jZSn3r%2F4UpdlYIReWZ%2B7C57FkACYGUv11p2zgPI%2BUGoTek%2BMOZx4l4veoO1rNcTFMthoV3IWnhvtticTzOQgSe2w4vSgSS31yExAaLQwwzNWlQubbPYUcglk8trO3c463TBiuXUHA6ste1jJwEb2Kh60LssOgRxIEpoLguC7aaEzj5JuHhba5olc0LWk6mpbBTMPBaLmpzLeDKHCfULmw9E2S0Gk%2BjRPZgVVptoTQdNmEqVGJbrMLFdCjjQnfatFbLU47z46EupefZFoUAOF6Uyze0mBo%2BSVx5dYtUuIg%2BSuMmflk5nTqYUnaqKDO15NBukKhaaBrNr%2BVpl8ZXilUwij2Lr8qCKrymnzFV3DPaniCh0pVgpClORrTKxlMl0moUV8LFQcSnb6LzR7HRNU8QRcbFIVC9Nr9gsCS5BPMmxwVWYhRHRrfXgcYy0BF9tKLLE4ud4lGclWL1kga0BFEXdcB9SzrhJrEMzhq%2FX4fCzyrVsHSjiLBXomhX81ic4WlvMfFdBTSRbmnjK7eW4ytqWcn7EhgrpcsRy%2B330SKWJ9uLROFCmZ2ebhTFRG0sEEwM2IUGiWUQZG49ZXZbSN2rRSW82S3k5r6VQwmwskmXjq%2BWmovBpWJuq83wDJNrJoPd1l1x3CQXWAhtoZU8Nk90%2F76C501oAZ8rWps0NTTS12OSS22QJJcHwL1DBwUjWI6P2pYrBjAdXLaeZydPYPdQNHFr%2F1%2BFqK1%2F1UU%2B1fZRe4TcSzFOHb2MUcU%2FPYznge8VizFGaEore8S0rOCVSTYMk2iDOQ3d97cSXwGuFJhnigCzXIlmoT2P27cBkoMgjRdiJ5%2BIiIoATVmELBC1Uq%2BpkM8pFhoMUzimDq6xS5JjJMid2wImrYoyRc%2BIYdNc819pUFU8L5a5PO5mrNCXyET8q0yzi8ti2by0g18VbotlYtgQRK5nmbzRCJ1E%2BfgUQQBzwXlm0IOUFoY%2BaRw04X6%2BiE%2FE08ndCSWXktu8VcYUcFHoZqWOG5rURV0o0muA3LN8j%2FyxoP1zo%2B%2Bfi7lhwedxrQ6jwn1DoVl4yvWqkDtdMXHLysOZnAsqhdhFrGSa0xe5YhWK%2B5Rio4JgKKWC3dKVHo%2BFPqaTNlPg3VyovD%2Bu5pI%2FtlBtY2BR1HOmEAX4sWD9JTYRIxXne0r5ddW2Fqx2oVKZ83BcEkdiHvCdohC8lLus0gRWFtCCHi01YMvG7cqV4vBCqdqKlicZdleJmosdq1x15YaNILEZch6EXAypXqtpuFm6ddvCRYRZwDX5CyOYY1I2KoysXGfEDK1TGXHGIK7UMtXCA7gBX0swLf9KTGHF%2FNsoxqhAWZObQkZfVgxSEJZppkRaJ7Dg6%2BXuhCD6Ik0IUaR1rjkJDzex6gNBi%2FAzR7FcYIxTHwGEWFEAY%2BmpUI0aqvP1tfFeq8lqFMezUhu1Jq5Ucdis%2BNnJxfdcSt%2FQ%2BnEZnMa4oJImlYV082%2FBilSqfi9q%2BX1qtvaKO5D3aa250H2fbsNKa3HFDwwcu0iYlNvUTRTFG0V8ahGK%2FLRezzxME2F0oOq9poWrU3y9ns%2FjWLpYWgu3854jIeOkQwVqskuLUXqitjViGKpGwUgPF6LzNSvpfOPmh7LtCf5U2cF3OJV7FttXCP6VYxYWtSonEx1cbbIWqxngx9Lpg%2BrKRbN7J5C6fVY0QwiUKxLZtSptW%2BeqGeV78dRWq8OF5optXqnIjteKxwalo61r2RIaN6%2Fb5QE4Fby1fjTiORjZH8sL%2BE21AI6s5ZtEbGWfByiW7PIWqoAuLIlobzNbzy%2BlhnmSy4A20HZRQGJlsFoxDvQabhD2kJHD%2FFbR8%2Bce6PtO0pWzb%2BVEWxxQ%2F6KzVd8ZpXKM9%2F%2FYUZ3nuO2jTjM8JwOaEFyTdo8JrMW%2B8f%2BX9RmIT4CniOpuKlX7%2BcIwIamSsiaxWf1YUYqQm%2Fxv7ax%2Fpe2yuiv9%2F%2ByO0LeputlWQWOvfw7X%2FLPYYMEO3YjB%2FJkMnMqm3Zgh83BEkvn5NZiVAUcwtla%2FfHF%2B%2FuT%2B00fTH55cfPfi9cX05dmrR8qC%2Ff8KZY1xlYxfrCExtiH%2FGVunEV0R34nIIR0S58RkrOEfvHh2%2F4XSzqz%2BE2iroDlnDJRzPisYhIWTywWYw2cFkxdNoEjZWTdTfX0YRYFXHas9Ag5q6RSgyAMIk4khEao8nSKu3JhDFQsq8iij%2B0T6IvouFcWwQFOLNRhFOTaCs1T1lhlEoR1urDX7nLZkvwV5a4HmNv%2FJyclQE%2FdzByu1jnulOjE6DcfH1tLtVvDNX4emEtbU7jeyiCfWXLLubu4V%2BoM0PGlNy3ymJxs1YEprcfE3WBrBlMum03ef9iyIpP3Fi5ePXp1dSFPT9m10Vfw0tW97M%2Fns09Nv%2Fu0f%2F%2FNu9%2B%2F%2Ffm%2F39i3%2B39v95pt7u78c3%2Fv6m79SuvvrrXu7v7756zfvHJsx3cZTFrGtyemDs6dP3XLakvCydkL0NIsfn7LZq4XFCdxyH1MLdy1y63MYV9Wfvn17fHrLW6QBomf62LNm3PfND%2FoHdCZMl9t62hRm9T0G63tL7T6Dz%2Bjj2Rxs5loFuV%2BIB59kYUn9dCu7aO89l9uTKi7TcB6jsurPqLbYZrX%2BbGAJZXqoazTLJemDBh3abb2e2UtvbKp9zVay2tUGFWhmeH%2FTHWiMKo7W8%2FiVveGa2%2BPzYZE6EW09eAkkF72H40M%2BOC1pvhqqX8ni%2BnFOJLjpz%2FrDCdv7sdsFb979WekW%2B3ZNaMXVWjZZBIw74epCo9JIjD775PQWnrp%2Fx34y4ifd8vYQoN2eYGzA8aru8w495p%2Bf%2FASKD7vb%2F9Sf9jHv7%2F%2F84Ol0oybPjvuWG5g8n54GURHDPLXpzN5%2F%2BhAUVfDdxbOntJov6%2BCffzn9Z%2F%2BezmL39M1PH97t%2FvL27anP3t75%2Bk%2FsoS5bxs%2FesPHtybvP3GHfmVu7Hbkzv6ZZCr3u6%2BD4invL1Yk5sg%2F%2BEnwhreBd62vXUBm85NfGNszB7KdCD7c9aLLPnXFyQ2cB7fQgWVr80%2BYH19TOsXp2LfGVKcqhGCxBDs5jCm7sRx2gsLh08NY63W93flPz9RFUu%2BL3oR9tV5z%2BCnbFtH%2FVDIsJ%2FAsti82Db2ZaTLS%2FwLaY20FuNdrHK8pJwnVIJN3Adqog7v007UJPU2o9dTtAYYizjHMwcAQfY7LPL84uHqHDKN%2BiaHu6ACl5Fcfw25WUn2ETICxuaFpIciF%2Bswf2Y9%2Bg266qB0hreX43Z%2F9UrmREbscUdQ3jxk5%2F3lRFspaRaCojy9vEUx1tot%2B4JYQbTP0lEH6NFs1LQFNqlbgvau%2FSkauCBuXl9XQR4nlTHB7shJRWUm0UIrrVvkRDbry4TZGMd%2FJfemajHHbQzn0aJUIOHqbLeFaF07pI5THXEDnN420jTRDLEgYHqhGmQc2FI16LkKolqkGlFHeqppNh7kpsQ0XsOIvrOk6n5sjkUjpysnijS6IS8PHjNC2W9CfssWapjIw5n0lbNOXEi3rc3STf%2BDpiBMcfpWK3tyo0Yz7x%2BEJISYy5Xj2NimZaqt5E%2BxRUK%2B7c2Y6zer5aV%2F4C6lRT%2BTKdzo1bRw3jxkS44WnfZkrL7BThh1wULOtQBS68rqb6kVsPIwvYw4nm7OGEIKxuZxMjWvRMiURF3KM5XtRnuLUJMkDTs5TNR6E0G6O2EP2lNaSSxh%2BYRPQXA6MoJPMN1JTNNNMduhoCYqi8%2BGWYCZFylAj%2FcJHuiNPfwT0dO04Qr9DTn4fIaX3tVjETqBoQPYz3Pm5z%2FUaD0u6sxBdUC2l9JU%2BTS3fKJFB2xxUfs87Z0i6F0nhmEYnzl4WwYiCI%2By7Vcko080Ieji7k6ehCHo9yn5kKMyWGvldZT%2FYmTFtEKIi4rb6MafOYieUTYIXPWslD5FWWTVdJRON2yppz6JGu8j1osrBaKj4eVtel0KVvbaH00Zjk8%2BlMeN4zFkhgs6d33CLuUdI56gA3DSMZNGhIMYvcLjnEV5dffiUJqGqEF365JhJkOqcFWB6BAaN0fb1JLXRal7IiNlPZhS3U7cYAe%2Bt6A0ZBGAUA%2FnKVKFDlINeA11ITPKnpvaKW62kumKM0xMEyrThCGaFFiEGfKp%2BTqrxGGsmZJdUmbJpEOPaCzizusegH4xTe7cCeREdnark8y46uz%2BFOdQybKlXAcF8PAFa7o9SfNPUvx4xNFgvPjYcmb9CMFHKP45dIAvWmTExGDDVmUNH0EA8O4iqpDxW7LhaNXBwYs9ZaJAvnqyTHxKvbW2RhCQsz94MsS6Y9r0X4GBdLoSm3KCo%2FUbKhGX0KE0BlThqg6bFTeZLakrDK%2F8gjDN7zDOmdRdVFullLuoT%2BbVVbg1PWj%2BLCgTEzCgMKF5Yj6CBYXJoCYdMrT7ZFtBSA3GkOMHdCz4kpDHVlnBwdK1U9R%2FuWxQ6uMNkGB3vcBtjpvNEo5FJqoZ4nzi8rdwvagj13KItxC9buYL1ufY5ucb45vMV7Z%2FCWwIesfY%2Btx95Zj77Qs9Oijkh7X3c6kOs2QaZhSeycVGqTlh%2Bd5MzTb0sxIstKivaUvSqB3G2xCM%2Fxvpr%2BpwS9kiBFDdlCtQcwXDyFttlTJWZRB9ekUXuk3OQYibKQhqpagjhrUja%2FVayoqVZxqXYbwFXGGghvdwLSg9B40APLXIUYzwKmGGQJuysCjQh2OrSy%2Ba3nYdpKFsYWt1qaWi0VJWZVf3G5ppExVffImnajEoNcXfsRJXsq3esxWPGlx3B2FIFpZRyt3a7HtpYxkBkYTT3SCWXLU69nitQUUMWDojQ32oiW2UTT1wrMjarQGir9GE%2Fhb2S%2FFjt0TSjElzfT%2BeR4MS7QJ31rNGa9KcxglbvXDnNXwehnJoRQfE8W%2BrDHka1v1BNOh1cyZA3Dpss4n%2FqmSEPhx6riMLYrcmA2yttUP48xToBF%2BX6MqT3UGdFgfMuswfaqaI%2BVBxwPn%2BDQ%2Bf5r%2FZCDGK%2B8gMa684oOrm5XHOx0mbpVp%2BxpAZrOkrzI5OzLOOqYulW47yYLVosIw68lTfTS%2FUYPc%2BhO7%2BfNw%2FV8JXzcEXeiTktRQk9bpWI8QqO%2Fihu2XRGW4sYnFpYFjugmP58XjCKa5lo4e%2F9tC9p4raRDIqWfL8N1XVO%2FnUZpNi3EadgSbLsQnmU0l1EFirG%2Bui7h%2FaNQzTNZzOSrPSC14gG%2BTeqVtG3tYabtqY5Dkl7%2Ba6oYM7Vg723FUvN3ZiRkHozaPrzST5dio2vBvvczXh0MPYzaq82TR8piUKMvbmmwrVfxNYIi5ftKFyz9kOwA1lcW2pD65pE%2Baip2mwPkVAqdJIEy9NUqtBWTRMoN9uB%2B6ukhLnrkCZBji4aF4wqpoc5A1vcX1VAWSV0rNkMMVWqlh1HKRqtTiqg%2BGmvLEn7%2FwK4v4%2B304DTHVGql141n8tsjlM%2FxdT497uuGPjxLaiVCVDKT2vzbJJbezfQ5SsxPY2v4QLPLDVfQf%2Bzp27f0%2F9OhbiAgQt3QUajz6jiP6OQpWnl7vbyogC3i0eeSolNKPzb6OzvWbLp16lJ%2BGAIGAQ16OKkr%2F%2BT5g6evH3pV5UdiJFllzpsFSLq5rmKnGI%2FwS7hMTqZSgVPEkRiibxopqE81GmTh1dnzb3Hrc%2BIPz55oWl6aAaVmwaX6bLJ7WXhJ1rv2mFKu2OOEaRLSKKS6hueKHLp09dEwJs4NFGi5zljPcvrK1YBskialdxvlPRfn1XXttG73ynIOhWIYMOjJN%2BtTNwxkZLu%2B1lW%2BOzv%2FbuzWwRzz%2BYEe3fbU9uPkOG%2F7%2FNu39XGZ7OId9vB3dzQf8%2BXO7VvH9755%2B%2Fb41i8J8%2BUbaUPDjzd%2F%2BfwdLDsU6w8xBlorkG9OXX3ofgcTt31kMUdtG4a1NzM7ea4sGKd89o07Ux582%2Blp0CnG1hwk6XcXv0NUoos3n78LaNEzsYow6IJWYTaACKWiNY4uNFt4yicWBHrZ%2F5iqlhi37gcbU1nb9Kjje19TD3n79pbSSQLTThddxbyRK8g73wyrrFt3R3tzEHzZa64DK9VHNkhX02zuwQFmaL0x4brYiVCYcoi9fCma4fAw3PfZQXULOrsEuhZTW23QOA1H7TRNy2ixm6Zrk5QZXeectVdO3i9u2dZ6Q816Qm12692t0wNq%2BB9VeeECxo3%2F4%2Fk4tbd6e5a%2FC9vqOVwtBz92rIsGX%2FQb9hf2MZjjBsY%2FePS%2FWGfUYT5TvlohPzq%2B95uTTzG%2FHR8Fnx3oYkRwdItIb4mRN1J9GNC8pp90rpr%2F9yrxYwarUyjfUOTR94tG1s9clLTjWPzT1lalH5wGD4osrgOItYO%2FvVrnD2PEFi9xYBGEHFKXqu%2FOndO7fzq9e%2FvunSBs1KcocfteVkmd%2Fcf5aYn0FDFPTudffRFGd%2BPffzX7w50%2FfRHOvlzc%2FiK884c%2F%2FeGr278Pv%2FpyNpt98UX0VXj3lJUIscOsze0TaxDy26df%2FV59PztNC4pFMEuWQY7PLRH3PGDT62C7SuYr9b47JwEitXdRFnlCp81vMLvG2pvVcbqJRefgW%2B%2BeyLtqeKaEqQbun6q3feG7zd51otzFS%2BsM1oCUmyK99SnDTvjaB9%2B6dwtGvPcJ5yDUeeCUaiic1dSdEuznF8kcdnLsCGyE2p4adB%2FCAyrRC%2F4mfvTuzWeTd%2Ffccib3aFahYSM5Acle%2FAImcyzcH%2F55AuThXxskz3njwT3biNUVdeNfxeyqCXW7qyb8xYZX%2FOibWl41oTS9Gt8qutv5%2FV5xWM1HUeE21lFIsEHtD7djHxP%2B9iix8ZCJs4YfiHC%2BYuaa%2FjZ8Cc01tcm6TeMuU2O4zq6R4Eg0uEoCaoe4Ie6c0qCdgsIZYveFc%2Fo%2F%2FQNdyqpMi6bLABb9a01bfPo6%2FMG7CFLjj47qp1yFQQj9I1r%2Bc%2Fpf4G%2FDl9Bcp3Cp0dg8FOJqk0fQ55DlkUFY0n%2F%2Bi%2FmSm2sUwEEcX6ZRZVL7MGRLTtIMs9SSLwxa0vPhVcNczY3ItHciT3REVWdGDLrPtUTd73TR%2B5EtrqbTKF32QHgQnkRthUtlrvSEjanHTVuLnKnblCCzOcSRt4PZsogWVUyNRV2NLjk%2BZpaUt%2FFuSvEYSkr7s%2BrSkhMuP%2F1RwW2SIC229JOF98Eso5Ui%2BZFWjQKPogu83phMU4W93PSPlL%2BaF9PUpqVJr2wy%2FX2bIUT76ipgMzu6IkLfrCrwt%2BVLba705gqYiuuWZugZfz%2B7uZxubSZuU0a950qw9HRlINI%2FIuVCmxITfD1DVEuTcG3NQ%2FpvW3KOtp6Hth7nYcYwWoPNlZ5nUyZDrr0PecD4ryr%2BZQI68MAxo8eOoW4ozXHbnP5DGGsTKt98TqMtCuY08Av6cPbPElhHXMF8EYCOLlGCazy%2FpP61IFRtfqE9M17xbC0xdJWWPZp6nSGTUknpVQn9pSY6ubkSX4nfMV6TApnUfKEypgX%2BlnxBv%2BK05CQx12m9NZnGJi0Z932TMWnaktoH5vGG31izIzYcPdMPmkniqk2nNG0gsGrdAeqmKLsfTRXHgx9oLPOTWzGL%2BE15hb%2BYL0tzRck4RYnymuG0xMwQfZVDo5X1l20mRqaoIGKc5rP%2Bjy1zEuCAkFIxwVrkC74k5lrZJENa0bQFcaiViRqHO63fnc7%2Fzt4RT88lT9BapXIGdkYBAp%2FxhfU%2BOVcX62oOEjy1mnMoWr7chY0v56bQtjK5y6wwmTozpLG5pjYJ27TpMoaCuCh8zxp%2FOV9AcRWYcY8rqrW4moVceVer8Eck3Np2%2BdivHnOUk9ZcvqzNtbIJPRxKJMEc%2F%2BdVgoFl0im3bE1fQiDatBJBU%2BMhNE9NvzIJqrhpCiTrrC7NFW%2BEIRVdeVTgyjCMgWh3O0BN1cSF2zTvMuE%2B1%2FSy636%2BGvyI8StuiK2PZvQ%2FpiaICBbP8VfwJTJXQBdERj0dGkl8qcw1scmsTUFruMEgWpiHLpYp3YjAQdg00h3JlJAJ8jylsugCf4iiiLTkyxQjizMmSc01tMl10EbQCmhpj4oYfxFfEnMFouH2tCnVZGSn%2FagKtzgXCxBaK4joDfXUVHLdRFhsonWZIpYPyrBm969BtOWpNbqOroKY2oLehnfxm2gnmAdxssFYjTOwBvidz%2FFX8CUy1ziI3wdxhb4XMzHGOc1JsRn3sR32SFfUY2w6XVoSm5%2FWq%2F3PsssmPapkSJUwFT%2BQOkVs%2BnFs%2B3FcVRwn3gSLD2JebrEi0990vmAXnDYPXtNkqXoueTHAL2JoETsaWYRU4kzTYdd5BzRZmsjMOsXX1kOc%2FUV9PrPZzTyeskSW%2BQK7mFCTULeNaJHm3kuXLCIKahRiEumPnmNLwwmtJgtiEKHtyJfCXCub2AXT%2Fii7DK28FTZr1MoWZH7aX5jCF3Ara66s67UGln%2FRHFQSyxuFGDMmmbdp1WWSfW7Wy8bI1%2BHGJvxzTf1lscKkgYUzQKgOk4OfMJPj%2BJomi4vxyIVsCi48yaMpLbtTi8%2BjLpM0NqHhscAPqi9aZxdYZxe8zhJP%2FtX0NnPy5hclPK5wSsyX0FwJQgtNlKCmaRWY3vnqS5MhJtxk5qtLm6EZmTNRVNoM3seZjUlRbKTZ2mZKS1m%2Bt6kl3C7t%2B64KTjEWkZoy2gy%2BDtmCehNnKrRsxR5mTbrKTVqapMnb9C5nGvCHC%2Bp43Amagi%2FoeZRsDRCOHlOb8MuXNE0sw6wdwW22bHPJHpgwkGrSGAtGd23GgjEpcAazwpKm0FV8BcNXztdlQZxWsIwDfDrsCvlSmWtok6ZNGQsVZqQ03yHZYA8EcU1Dj6JMSv%2FDCJsbm1L9LdMkm6a377SZu23mizbzZZv5qs38vs10t%2F%2BxzfzJZu7cbjPtk%2B%2B0T16YNFubNN%2FeaTN324x9d2mSjSXYWPzGoje2ZBtbsI0t1wbFyvA3%2FT1fS76istOMuwjxg%2Fib8SU0V1QO85Qmmf6xzdDdZi%2B5zGlXweVHZmkTWvtthghpwmACSmN%2BITKVxdAe7Mcuw01O%2Ba4b7fOY4rufZZdNelTJkAr9rFxF6JzlCtMIEmj7U6aKFzUSWiJRDrtW2hRfSb2hohqDawpi75Aat5TIEheBazuHIZ9UnNBa26ZTdqt2bX7Sykspr582RbTwoiSOAL%2BvzI5hn71r8hCdIGdLXU3fs%2FdPpmTnzsjwvMgpr1ica9%2FMkyrSuLHJ%2FgFm0aLMOie2AmmNn5jO%2BYqvj2chPozto9t0%2Bocuh3pCL5hddxlga557k3xRtHmcpSPPD24RvBotWeax3BbENqxoDlmFUZJtCkrRmVa0HGQ0Wlf0HVWwigPsojBjIOUpw2RyTrmXcaayGLQnZdKAN10r5kOoa5i9ucmUJmW6hjfnNN9Ea9p3rxK4w6IEMLrQpyEpmO1emWGxStfBygyEVdHgRbjCJDBY2U614peakCpBMo%2F%2BxJcpsZlIyyCh1SAxS2qScQGSnDn21ssY1Rf%2BEr6k5srQ5IquJf7WfMGdNf5Wccz5ki%2Bxuc5twt5NqUi45rhW5gcG6x%2FaTMmZ5d1pmppcP3M3SGB7gwLz9p86f1It8De1rlUpm9GFikzNvLm2CRj9pE4iuhjWM9mgjqZ30Bo23%2BWo5toMSsP8Jl%2Bni6Jo8gJv2TT7u5v25sbe29hb%2FxXOLy%2FzZBFzzmT6CU2HNvNHynCnhMkY9enLMA1prb9DmRJ%2F0y9wzWIsj5QpQ1yxJF9GLCy87jJUkZdxTDfVGf6SCpK2yyZcB5dbWIzWQUp9nTj8NJzhj2YRvvJSSjn%2BSb2Jr7wbtktUinOV2ibEEiJT4eg%2BBUODC30x8TTUA4lPQxLjcsn9it%2BL3pxS522n2F4ek2f3s%2ByySY8qGVIlhoqFD5yppxZi38Lajfsc5vcUuxE0lcngTtbbw51Gga9NO%2BqurL0fXIzud7nPJ33CxCFEgXMjzksLjhBpqryY4y%2FkC72fNrUsWTGfhAd2n9JqbJaBmQHMcmhY63ZpNLKVGikzH5CxbGlGTqklIR1GugbZFrIKk1CXSVuWMq3Y%2FwWlKBddgKxMGxI9RNPmCjinV0FqSmBmdZMA28AIgb5mQ%2F%2Bru%2BZjbYbQGfVCYsQy2jXQX8WXgq6X8ZxegXk1M%2FLhrC8gtj9Km%2BFyURbTXxZWl3xJck4gs0ZqZWIZ3w0P22XJGSNVRo6mr2llspXFhnyZGokYZ7s11%2FzCuso5ugxRdOG1r%2F2Btc3k46ygddPkU9qNmFyxp7brKOf5xI%2BzZjziOBSx4JDhkURpS81FpCnPWLfYZMrzspFFo0wEo%2FqZz%2FFHpNHtKV3u8CWKZ%2Bslcnf50v2s8dfWfIQBRleWZi2Ro77FaWbQNPeXEC4Quw7GnZNFgBgaMaBgfc1ylVFX4x%2BmPqzkOYtz%2Bsr4PT0DNYa2iaslX%2FATTbKgAizo%2B3hJzVZFhBLSfAlbOspcQa057TJTjrKXBdmllbdnl2CWsksu72Vd8hSV0Q0p8Yx0oQ1UjXS2Wq04Q9skTrCec8Z0B8oQT0QJV5TJLJgyvm2u09liWdssx3i3%2BQhfgFzCyR1z3VPf4Xfb7P7GO92Nd821h6N7b9tM1WXMg2er2%2B9tZmVRq5amskWYtxl6w22bqbqMeU7U0ZhSxu3vZZuhacok%2B09Bvv0Wyu8LTD%2Far6FFw6bmnrx9Xl7ZMlTRep%2FZP9z8ah%2Ff%2FXq%2F%2F7l%2FH%2F9s38g%2F8qp70FXERN26Tvll%2FD7nRqYJNLptMyW%2FadW%2BcmUQLHChFOa%2BJt0gwRxOSRZecZLyTGQztNIjCx%2BMyOQzfhCx40i4jDxRUmq4bMpU0bLi11B%2FLrhkNCY5mcNNOjLg8JBp4vmKg0jhhxUIZTh4xssWNKRT6vsz5oY4azJcXKw5mVlXTNKvFLu4UAb7hiw1923iOWfyFHMJisblIX6D%2FihjeaneMdn%2BRCzjluAEc9DGykCzjRXgZcx18dVOQDktGGafZ3Z39E0mQ89t93smpXUdsSCYlNZxWgDja3OldcekJdI6oBknTwFMp3%2FiCxCpvTAcrAxfGQi%2FSjZhLDJhm7aQL2zCv2lH%2BIVN2t9f2oR%2Fc9fJwaV8YRMGU%2BZLm%2FBv%2BM2IOGVy2x4mgw2SyfFpSM5reZAX9N%2BcuuVFgr%2BaLyZLzLxJrgNuYlxqc%2BUFIy%2FpWTSp5uvMLD%2FIYNUpotk8oG41xa6ooG17ge5TcPcpWn6sMOUs2nIW9ggIoQJoygVLwpcwsNxJUcIqNs9MhtgPSuGVBCkGFSU4JylK%2Fiv4MjNXfh93K5vgfbbn2RSAhsbMFU6GEuqZZumn3d8KZaeEBVbFOsBIpb8FXxJzTW0SI635sjLX2CZdSjdvmCUpiasp%2BbS8DFPs7QKzqvEVQrg6yegHWIOSWD%2FIQf%2FI11bsXnaHkyWfTu4lpchmDOcjxLI9QqRMwhfO49SnnPPxYYljRBqmsIfD9tGmIIurDHs%2Fm6IIcVXDzxtlmgKC0PKyOwKjLJ%2FElJdQ1tggvQozLKFdDs%2B8rFdhCRhLmE0COD2TegtPbmW6XhKTVvLZAF9BQN1xSfwCm%2F9gTJsMta4xCEIlGMugNm0rCMc7uBjZLHLcWsjwaQMsCCrcRlVShTQM%2BEpTqE3v2gy9wDLBNqXZAUd6cbUBLeQg6Hvc9UyHs91soBbQzXBg1tjdH%2BdsvGXOVzifrHvZ%2Fa0tgG%2FHZ6DM1ElxMdkqtEmGlOmsFStlTeerzAl%2FuTXdYBsF79mvfvCedpbvoe%2FxHp3lveks7%2B3%2B7n0ngnzPDfPeNsz799xoJsFvzKu4TOcmKU1CLfV%2BDZ%2FzEeTPrU%2BHLoM71%2FiJV%2FHSxlaouPLhdIUD7KAyvbpqe3U1py5BW5KQXSHPsZ9EihUCxaC%2FL%2FhChaAk2uJa8SU21ylN2JypbWIo%2BaTWprb28SvZMDoLcYWP%2FjzkSxZY1pySEsIPWopjvofjFwS8MuOn6fyQ3RdcgoZ1iYxCURdfgZ6WgROlnsLKT8Wc5zyb4qtt7o%2FILTAYkFJPM4mBL7G4U8qtY1NzL%2B3AbMK%2FjUyospNy1c3KFd9HfDVPLIGdXkyCGabiGjYtXNE3rHP8cRerNgvzWpPiNZvSQkoLqUP6v4jRtnYLhoTWH5y68J4Hl8iERq75B76ontP%2FEH8pX0yWqomShmPJzLMpTzvE%2FuCPZS%2BclpzwCsSZBkkVGDaJr1zELjflfQRsomNztWibs%2BiIv9gkVHjoOrI8rdWURCa2maqC1NKmqAM4BmkC%2B9cewdHHLqjbzxP6NnoOrSM1BIW48HXLY6DN4DHJMhdKHgDyFh8ZU8YEp9p85ZvYWWjcZajb1EYaU6eQENWmQ9TWCdjdNkeYjFg%2FKllOE39JO7WaKhoViT5eU8evsD2vy%2BTS1libw1tNHkBsr6ZXnKGfPG3UdsKoMTJqHhq1GRu1HRw12p9wtFHn62purpFNIFKp%2BbSfr%2FU1Z5iHqdknSlYgwzVOyarYcko1xul6luBJIe3n%2BFScJkSbonYaFn7SSpLwBZ%2FT4AyNr3aaMPlF1WWw5TT50qbof8hcZm1qntTev642NonblAlwjoloVriU24SLwnJjXtHwFrB61A%2FwcggKKclQPxnqpFyZxrAZfmK5Mu1tMwbGaxKUSpo2Ybh5kZ3JkTF1iCLVTGB%2Fm%2BbkrUPdNDRTmQQwRGWlBMaqQU1Nu%2BaX44raxQ3gCXAJzbWySdKmP3YZKts6X7BJYAAFoCWuG1N3dOGnYfasOXAbJZiyIPClP2ajTIZvpAyXxKT4GJMzd9COz6btNgI%2F4Oizy6AMnGWJf0dhpPz2Zye%2B5h%2Bbfb4nt2t%2FNjaf9X%2F03170EUXHU%2BBXy%2F3YX31Uu6CZX9TZ29R%2B8pW5tr8MHfc6TtBIm2vuY5SYvRbl2nMOm2X%2Bh%2FJWfN%2FlzFNZUM%2BZjcWmc74W9tPspLO5bmV0%2B6x5PwuKkGJjYVNzR1eiwqKKDlW0pWpZf842%2FGWosDY1hWwZSWQ7cuTaTNmmht7wJsiY93ft1HISOGEwnQjT%2FB%2FaDH8PVmOTGERju2JDCy2NaRprWxBujW4apZhwtmbcb5OUJqot9yCb0r3bosuUFcq8NZ%2B4bT9maybbbWN%2FmgFpXABdcybB1cwXJkXZrvMmpHdf151AE3nMNtc1tir1j1URm%2FhxCCGHvzu43MVlWnBcuYgvibnWNimRJibsHK4suLMpvZhyPBYpXfMlNdfQJk2b0s34n7FiI2eYKUMGUwGYaq5dXIh5R8ISQGRwBN%2FE0JtbwdlKgFlwSrWDlG5FWakHocYCU23tIY5JqZ3MoT1fE5v82KZUiMJqZJl27YJddjnUD7JgLjnYJRYOzmD%2BMhlqNQS45AtP%2BU2Vw2EUDPWQ47HRVGZrRCs2uwYyz6GMeQ4yeE5t1aN53m5q87iaZZ4mgU5GU1vWFRmuw7qyJOY2ywrQdJ%2BjxU31GlaIdlesaoJ0G6LG1sbVWdBQZW1D1uenTIE%2F7PJNMp0uSjCxljfqgFYnH%2F6TOmB36DmAJiX7VXQeYKC1C%2B7OxfpPSJUCYLuDk%2BU%2BXTlPXLL3yq2WNRW03QrWf%2BhlnXV01zD1ZnNvvtBeZ727HXBV40Lz3YYz8ywKrDb9mg3D8GcEM2g0LIHZJWuiIqx8YJZERFQPa%2BrqlDFaVJRZ8q6Lb8HBqUmmCP5os3Mj7Wx%2FmUPV9pcZwfZXN0u0v5Oqy2IKtXmjh2d%2FDB5eDH7ZHZb9heqx2e6lLIBCmplv5m0qpXXB31h3hCY33fbzd%2FFjCzzt1zbxHH%2FTRbyJOJNdlrQjRq40V9wcz%2FtVQLtPfq9JDd6UwKQGwhw5BKO2MNQroOgLD4F8Scy1sAm1VRJv%2BWI1dzcJtco2rYNtqzm6jWddVVO%2BjuNLpOgFmNj5EBqZu22ml97mTHuI2cuDj%2B79DAc%2FBsiyyya9RyTDRyT9RyTOIxLziDUmUePIZGohNCXZdDrvcnWbwyHsdoUgYilbwBkrOFxTvtD3J%2BkckwzS4opqc5vwX8SXwly3SOIravIt75NmbUpLj8m9D66M3OGqlTtcseiEr%2FiV0P%2Fp74OrLMXm1SQxUjTCFZzYBlf0wVfYy13xZu7K7Oau6OtpablCTFkkIbhFJAWV8aqZJTn%2FZgV7kwxyxBjs8zTf73%2BUYXcjC4dj8xOxfZFy6RtW%2Bb7ifcVVw%2Bp1jO0U7a5oQxGb6zRm2YrN83Js8jiRTTDJmJ9lm7bkaW2ujIHSjE3AMVLOvHHVhMT44RloNbraklgess3w59osf23HU1N2U07v2JRRG3Mnr1YmwYJGOeaNbMpP7Da4bXZhvsPy2GHvh61HPkJs0646zC%2FgaSlexCalMYHUFMay8KElwo8qtm8r5%2BglnJjfBfeIlhftcqagHZcfdsQ1R1hvn1ZxAS3H12b4c23WPMbk7WeVtSl2WZtiUwoxV5vhuyteOyid88XmVysk7cvNx%2BLrZrHNLNpMltqMLbmpA5PhXlTFtjSY4um6mPI44ZS4iiveWV41YDCvmNO4jdR%2BZtN9ZcueUQ5cVXB9Rf8xj06nMywVl7HRibNA4kbCAQACmv5v%2BEwd%2FKYljDtVH9gxKX1gElbwjTgA8dpcD2DWQ1QfVM7lreV8pgHnYUmcugO0fIcLLd2Pr8TXV%2B7nAzB8fEWvFAC3DBXxpnk8b%2BAEtQ8WNVdpZa1kURVIx0Qx9McQtgo%2FJvmML9RpFiZTcqbEnwWWU%2FOLMRAoTb9Cupq3aWQytC20qc3Uq8JmspIzkAtxBuIdpNgtI42NwumPLKDhDFhIpEnFCcQ0nEF5MV9QkRr%2B45x5CvaKnFKPM5l1xinkKpyBZIUzvK47Lr1v7hmKbb2eG0tWasqZ64m2b078T3iOOpv8N8dv%2Fux3H2ve33%2BVHi26%2F7K3bz95%2B%2Fane4NXvn374d6v6q1n8PUeY2rjOrXRvI8FCLtsyvu7fx69%2Bcfbt9Xbt%2Fm7T%2B8dvX37u9%2BJ1w9v6OiP3n169DvXM4Tjbuwjv8XvjqX3NV1ROMby7Jj23DtEk9shDNsOAdX4cpevqx3imO0sd7GjncVsB1obr2kXX5U7DvKzS%2FJNS0VZXkR3aU7%2FYcFhE94UUt7cC1L2yLTLwqtdRi%2FPimhHzRolix27xd5Bor1DseDEaUeDYYficblaH7k73ujuYPxEG7zdfetGcQd%2FilVmE%2Fo9XyV3%2BQLPxruI76WN1D43yF91%2BV6O8o93j%2FGWx%2FwQhuOnIdglKAS%2BvvXlyJWC99qU76L8Y760v9q78033gLy9K%2B%2Bo8j0S32VT846GifK2DszdOZfUPsDezbfa%2B0zCNJSLdnlp7msAMk%2B0rgl3ZgO6A09Mr4viK3PNC2pYjuS743l5B02%2FbMf%2BOnZluq7oLZCdEQYBlHbswSMzSWWSemedpu8qvteMRiT0YE74wci0ePN4yhQLfmoNMUjNiXkX5dqHItve16bsSG6HAwAYVJoMLOmRA4DpDBGDcWG7xt10HsKqbheuaTouong3u25iViGgqilKGiUJXYih38W7uKyNh0nkaISEzY4deFDNYfdKCe%2B%2Fd4k5xNzZOJI0EvBQpPZ2ypnbKUNcMBKo29F4wZAxxNjcGOIkt8RJzsT0NkNcwyX7DrXOrzPq%2BTvrCJFqj4%2FWdtEOe026XO9ou0R%2F17tVmC6uY8Jl0TUN0JwaGz41G1QPbUB3jMN9SYqbFhEuK1wyXN7jgict6FHdw4h0BVLqLJzgsQR7v3uPn%2Fb5BCC%2Bf9fAJQelW34fAbegud7Z51yvdtfZ7pph73fX213r2HIHRZI1z1dQU95xFNAobnYISsCX27RL2sU0jgm4QgCPkJr7CQYU%2FmhZ3OFcyV6N%2F%2BDdf6Cl2uqEUqcdIpmdt3LarhKY5q8tvxwm7fTymspe7ugxeDg7%2F95t4jn%2BUBDjRAdO6Y6CDwcWgIELzqN%2FvAkIfefdp7j905NPPzn6PFiEaR27jkdu6MfPG9H5l3kKacJfw1VIXN69o%2FoKAeKXOguxD7%2BhtxBQ%2ByI1n188enn3zrR190gFO3pDvMz03RvL0ZzQyq8EPea72pDfrhPRvS9J5%2FGaUxDpgeS7R2cPH70SXkgePX94%2FuiBAD88uzg7OtjiTsnPL85eXbjF7nMnXv%2BnR0%2FOX0zu3P7i9heTu3f%2BPCTpcXl3bt%2BgFA%2BevjgXHlhvVgqqjMkvK8mYuxgqXvASoqW7d27oNaZ0KdVIEgwsf5kvGRqFXD4aRbCeN4Y%2F3Q3wK9OsaKG7%2FhzZEh4HkjncuUB3MJ9g0MG%2FFft%2Foq1h0pgwiydKz6y%2Fdjv6zTYw%2FT72uYrihv%2BVJ73RqfeUp1y%2B%2FIZmXeamPz098ky8z18%2Fu%2F%2FolfepSb6Kq6ThKeXk7OWL8yn80D3%2F1txA2wfaVcbLMP06wAITfFDfMnjIf75%2BcfHoI5%2FyszZK7fD5nUSx1ylC%2FJLtmWdzOr49k6B9OX%2Bredlsy4pGjD7TKbrKY6ofhE9A4Y9TbuZ%2B0SqKNefXWEav03WtLqNA%2FNJl1D58bBnFS9EhscbZNfSbvx7yuvXk2csXry7Onl8IJ6p%2B99r7Nv9NkqE0CK3YJxj2xMH4%2F%2FqGs8J3j%2F7PgxdPX7zyFkv3ath5%2Fj4%2BfkMsQThZnE0ev%2Fvpi8%2B%2F%2FHBrN4RROxs4PFGe%2BovfenmePnxy%2FvLs4sF3okg3ERW0BXvz9u128u6z1ley%2F7VnF8ZhJs01j54%2BenDxwkxy3vqoaRmFJGBC%2FIy3Wt6%2BfeMKfIwHu7dv37mI%2FbD8xH3ciAd5faJVqcRMOqR656%2BbB%2Bfn%2FYn%2F5%2FURLoN9CnGTnwVHx%2F%2B2i7Md7cJpH1xRbrPdbVa7DSQoG4hS5rQdgYRgVza7cr4rr2jbs9zBimWHP7vly%2Brddz%2FuLukvKhP6o7uisry6dc8th0%2FQJr%2F1%2B7NXT87uP5Uf2u95Y%2B0%2BmYBHDic%2FGmaZMuCXJ%2B8%2BHXZAdebscphfvrt49nR6cfat41v%2BaDBDHEGuMQREUEOth7CKuJ2hyPIorJPIgayjZODl72g2%2FJUW88v366IZ3jYroushYN00Q%2BesR%2FMw34S1AypdH65H88R59twJ8XwURcOfwyA6iAdPm%2Fjhi6LF8CVRshn%2Bdh4xcMZ%2FFA%2BiWhwtEtojOw77CbjUvobA62HgjiOYIQ1HyZEbOONodWf48%2B7w5xfDn18Of341%2FPn74U%2FW%2FhuCWKIzBDXZsEaS4a9FRYNgCMqWw98w1nQgwza5nA3bkY%2BYhhA4SHKIhgXJwuHUfwTNuyEgztcDQB4Om76YuZEWj4aM2lFRNrKGCtnWQ4IymTdu078f%2FhLDCJrQQ0AsnBzblWcIYlWLIagMnduaqhjyvUdGNfXagQ1L0LjnHEeNGOzNsI2a%2BKrBAd0QiG4%2FhKycn04k%2BiNosg0Bw367HjbTZhjB9AgBhPfOSd8N5tXz77%2FVptUoXgz76FJ0LmfsZGE97G9WvjGs041T79ukmQ%2B%2FXu4Pjhbx%2FdTt%2Fov4AXz1PRNR%2FxhjPTRf4Px44U4xBl%2B7syvg%2BaZIN7H60IfJYrGu46fgk51tE2NrthfBvvlZWDrYx2lRuMX%2F1sZEu5%2Bu3fI9ycKlW7ZnMJZ2YUVVrqAxeu0gXogwKgQ8L%2BM5Qnh6vuDCCdMK0LqaEafvhBtEwPY4rL4lziNxorMdARamKgrOHZ3lrXJXYTg5KWt3OnUrA%2B93e9qwD8Hob%2BnOSQQTd7qhw3nEDoeWUxwQvHTf14g5Bl6%2BkmX%2BQk6pOFPgB%2BjjUY7Fk5OTjvn5fABux67%2BpGePHj45mz5%2BdHbx%2BtUjwTbl15MVLNeGPA9BWdfShbOLlwkrSzscSTqMn2kgk2WYOWuegfMpk8OjbJJ5PPG%2BweJXiAzWaJhtEjmtYS0tJ5nLLlGjzONowkVxZrcqGY5P5X2yupKcII3%2BRNpuF%2FNVVTgTd1FhYIRiKcOzoQsxYbZSR%2BGgye35SmPBDVVc1aZQE%2BOayUMAZ6N1oyJNPOaIKlGu7g6JCfdO61w%2Bv3ZGV12ka7lsz90Fmb1%2BulOS0YodgERbn54GFy8evviaXfAFIW07jCGZfe29foMkudJXaHelQYlW6QEgtuBuyJ3AdOr41ok9oDy%2BNRiDL88fvX74Yvrg6dn5uRyDcwhjxQCE%2Bt0AOEudcNlHxjfwsMdaV2LOEGGrNBeGsBPOiKmcWiXI8a0BRQ32x7mtcqb0OCuHwdGP4lzetoDfUgmZzFdJqlBOisUEKtRDzDpN2ZzPmXbXgtNcFPN1LSGTTVInLkNnMOZ4cjj2h9s1BJUI60EFrYrhN4EE5stFxamg5dHnLDb2nhbl3CNnnwgmG9RX3WFCvVfEgcVkFabOLJe4X5UMPwpyQIcCIIdGbToGay2Xxoth44v%2Bzu6S5DDIC7eyCDIoSt6sZElA18Il9ZDTbGmLVFDqn2lv2CM996mvaVH6PUrdnZ66WHGr9y7tBriGVZqOwVrTmZ1e6OwJ11wa2eFKsbSAQYbjkpiWpVWxHQ4xeByc4NUSuq1cXt2KuIflrsSEXbk7LZbPDVk3Ed7cgrRpAHF7JtpAUiAJNhhD2Ba%2BAo8G%2FYBB%2B0a52XLy6KmJD%2BiuJwuXFZiF80sxSc9iMKfO2iF%2B0%2Bq%2BlCIcTMfs9aLSEC53AvMe2ilO2C2ys5KK%2FWPpRDbtd5dhG%2FKuXzAVadG49U08JVvI2wLcsJI7%2Bbdcr%2BG3fyJ5Xmr8ZW5mbWcBNhjqCFmtwOlLFhKMLeQEaqmiPsNhmFjiFmDxNsldCVSYW3tyHTqZ2%2F2vnyKK02Gs%2BD4OGk5j966rsZdDnVay5ns8VVbVFnPtVmdH5f%2FmCfP%2BUFHxEcipysFNXGGDi%2BeITh4KyGpky%2FXR6JFa0K4jmPWFcB%2FgyqY9e6N2eE%2BMs2qBW9AAMnwOnI5eC%2FySdTI9YBznhPNV5nbpHsUMUhnZlj0KbHa9ODGOeki56%2B8haRO1dGbmHlbt2gp%2BcnWQwldlE%2BMkxIeF0zsHZ0YzLXuJw%2F3wfk%2B5g7UQFZCyQewjtFrto92e7SJvcP8EZ8JaaXskcks1IJHjR6IPlcQQHSiLITpYmtFn%2BO%2BmFafI%2FJiRLzB4sMITyMqcDcqQitmaw2T%2BrzB472e0bqA8OP0L0Mj48xfL9BRUv59GGeU9xAS%2Bt2K1nxi8Ngr7%2BDpN5iOPV84KBnhvjSmCmAHGX20W7xmFe%2BxNnuBv8R7NgW%2Fwj8Q%2B%2FmBpDozFAdXhEo0%2FxXu%2F2Fj24P4vYKz3nYz1vtHfseVWpI%2Fwl8agvcUxaG956jKcu1K0FsV1Pz5i21YcH7Pewrny%2FT3Y%2F71AHpgFQXJoCgTNWLn8VaYhlFn9asKsuYDCt6XlVtkhoyRQmWVgFqkjCW%2BBE3nEChQ6v%2FvxV8QKRQntyD33GGmzAFM3kSWtV2FUbCU4%2BVF0KXzpRNltMlzZXhpEkgsdC6snMFEQVawNE3bT60AcDhOAiTgRYmi1dnqI7%2FiChersjV7oZEi85b5rhc56%2BlMwcMEZu%2BqXR16RPSHWmbYjsghsqjT40jmKtGCtIlq4Vus9rBxmfawcThYrDsgs3HeDW5us9qXB0BZwxJDMJx5WWhIqon1J1C5Hhx93AxLtM5kmdmvaQuUGd48ScjlN8mBhvu0f9yReVOdVLPZ4LZY9hakYAVckSHKGAFQVP1W12%2BWGc6NzsKTPqvbcbwgrIB%2F3CVT4vGIyj1NHScqcWkw8e2TWetImRjEKWdZRYFV2qp8RYhQq23ixSvAKAecvtQTr1cIoHCBKKH2cAq1XlSt7Z%2Fi2chUbYJnmQgqNeTVwtSZEwQqnMwIw0dqWEYswS1INHnOQPnRUnCy6J0BEcRlXuWhBIFrt5wmOXCp3aWISSMJxSKF1AuCtb2CJEHNFB52YSLsKkv00%2BeDq6%2BHjz9WrsQh39jbg67xZxaJPDVC6XMWhqbOQOja8CYxSHSjFZCsnaKawNgJeBHFpUDlC8Ag%2FjV66FhvjdCWEYs4ITVb8K%2FGjiVPkvjfylnyd0eo%2F9xP4K5spDNfk7dpq%2Fe11H7Su5nIKy%2FS6XE166goTOFf7EYtQeoAQShEYHUMyV8MCgIlQjjPQdVNMND5gjxXTxh4FA02JMo%2FzwcWOvI%2BTe2TGihoD0J1QW6D%2BAiA8T4fnu9SVYQ8wXHnKl3Z4bw12FKKqVjT1QTxdQjy9luyvphZDzR%2Fn%2FL5VCEsyV6e2w6dJljRMVSsUQ1gyd95sJUIe9ZlWHqQx1S1O1UVJslgKsOG5P8ERtDzpGqKUXaGPbYT5ndACpj2OGAEGLKW8PbjoTH2c7E8Gqwit%2BgjPM71ioqTWtkeYVpLFtXoW1uLkaViLEedh2hIt9QdMU2jCj9SqOiocCX%2BW3LMzWOnlPfjENdk8gv2%2FsqjtwYqgs4dU5%2FoeXvD7WVi55x8GpHSbPkK08QAp27hFS4mIxSh9aoDxvdDbqyxetLGFS7GaRbiypxZcJaLcUm8ZIK2kAGeJClZLfuloALoK0QBMlIOdHlzORX2kIg%2FvoxVxeB8tpeEDrBSG99Ga5hxhhfTFQFX9akbJgcBg%2FbOVcz6GqwOGMb4qENMxQ5WBVRd5de1hMbKwWU2iuBQVQWB5sGfAYlKADqFHUNFTL3TBvlXFr77oe4dHs7E3KLVbtHdc%2Bc5%2F83AziVz1HgCl9i%2BgYrADKEc6oI6IMy%2Bcycd4wBmAjFHLZJE0GljtSYXUnjegiVG40DAIpi4O7i1OCCNbuP%2FlExOrYYhRds9yMoFJQOgwUzRviHnawpSVscVo1WBRslu3GNlRWvVlFajW6A1UoVmcqyyDY7rSHU7IMTrMlQ6%2BFmBXFAFYPUdAjsksXoWbRPkmB%2B%2F5PJfK8yEumSy5SzEscBlGkcstWZhSsAFGLJVDrFwaO7zkI1qUpto%2BQHlf6mUlWgIxvbQIOcW0GJebKN01C4CJ7xikh1RknT2sciBShgmkS2JUc0ApCVHfDrj2YuoS0CNyVc57cG3BZS08lZ83GMnNG7jg5a2pwiTewLWIg1Imwk4JR5kiOpxHus0hnfyyDjY3HBZh%2BHzaLLqrIAL%2FCIBS%2FwxWql9TThVTPOQBrlihWs%2BulX0mg9WKg%2BcvxwJyZGayOGUuHWCUSUHBi1Gq0cih6lDJaWJIoEwWGsGBwngnjiGZmD6GaNmsQ7w7lVisNv0OUf4KH5%2BMVSLvR45MzQ6Fv9IPTNQ61cES%2BerdP3s7BJ6aR%2BQjZTj1scJSsY8UewaLVNU%2BHdwkvHJE7C6BOPUzBLNQU8Xa45ZrIajaIyVLxqHMrJJTs0Jos8IxATAU2qTACGxE3aXLYHQRHCJLXUrIxBFf1tVAIn56GvzNnvHM4z6ZrlLCYI1Jhr33ZayAJlFIpa6qUKNnpMIDWyyaa%2B5M1T0UnANruAzqzSwI1bD%2B0iut2IQzuVljI%2FUJsaeFY38JgyKl3%2B%2FBE1e7vIdKXVMOg5MLM8PhUxadeV3KQcoEe62ZMZzSxC6FGHAuQX3pyCc0gol72imIxHbHpWhWyfwydx2NMFWc0YbMPVobYHwf2uHVZX5I4ikidty50gJW4ioRPgG7QWpbOcbow55Ril6RgXvOPBnJJqXCFwij1niTb4PqUPgrTuwBO6iUZ%2BxRSi23M7diWeSsIk2xnq8moTyg93xsC6XF%2BcqDUfj1PVIpLHBKhXRgnUXs4aVdSB%2BpGX708Mabb%2BO9f8w0ogu6NICu8wQ%2BcSazJBqex7KhFjWk28cZrrgN2RgPVvFiITHmMFOZO%2BHDXl%2F3Bxi56g%2FR8mRoiBc8gUHv600hUHdFmwL28rMwFYIqg1Hbz6AULQuDKIX%2FDgOXNjYtvNHAHJSwVhAbnGEO79iuaA3l4x4vXNdppyXUPe%2BUq%2BoWmjnzlSg%2BfF0q50UM1o6eGCFmGVgyoo%2BLOWY4woc1%2FaMiOP2xIHa9%2FT1i0NbzcAtHfj4PtygPPAWyFz9DJPyxnrGzvCePnzx6Bcu4ozCPYN2cF03AZpvihtZ52JjzVj1%2BQN%2Bf%2FSdHwWfGZVrrIHdPKZ3GUiF7DncHTuKO%2BOR5ONQAHfa7ABbys7XjFvOIlgBnYxN0CkjzWMAdf2hHxluhC8zn6Tpyb76Mr9mnlFuqLI6S0IUlV67DPyGsQq8LK5eKgyz1TFHfiZp8%2BuLF38%2FgZRguRqaPnj9Emx%2Ff%2B%2BbNCUecxiV%2F8%2FXnx%2B9uyZZ%2F8vTpo2%2FPnooWwE2ON7qjYw5a8Io9RHL21pCAdgFZkVOtKHc9yqOPvSX23rKZGT8Uyk1RvPDcBB98aTy45c%2BCKAy2cGEeIChjsQg675qD237L1So%2FJKwucZgi6vHTj6D%2F5ptvPvLpO6eV%2Fu3IubPkaNN6BxrzmszT0PDhe3%2FJR5iljg55O2Z36AOavS%2Fio2QRxIQOaAwG7tjYO5Y8xqRie%2BkJ9mrHR7ujW3DF6DSx1%2BEkVYHxn1sP4R5XvQrRAV%2BV9ILWD7Ny86%2FnAxlOJ%2BKrwLiwGaJ4VThpHaIq5cNEHjThcogRznr70%2FmJDQTzrhcQZvLuU7SHmHE%2Bdx808CPcuh1l4AGPxHBtEX1ESX%2F7q5cyiQ4XkcpXf0RVzrgXwwGU24V%2FfjGpCIfLWdbrOCqC9qZDZVZfRMzZOiqORKnaD%2Fz3e1%2Fz5w096NzkQ8eL%2F%2BuV7utb9%2FolbJ0y%2FPIimmHnccP7MZ9jp0XvZ5z%2BjZkKGYmJpbO1cPqKf8Zr75uf%2FvxB%2BO3Fv%2F1MrLrs3gc9OMXImrz7THtIL%2BxBn%2BlUKeF8NpmtG%2FreocMz2w7UBPI2LaBTb6Y3DeD4%2Bn3n3vLh4Dj5W1cdv2KjHf3t%2BHhyXOyy4kd4%2FN3Gs8ukuTWxnbHH%2Fzod8RZPGYcHd8uRO2VumXl5Q0Qb1RwBT7Ve7FSivLvdoNQCE0x4XxEsqiIzHw9dQGagEBjys4A3fLzf%2B4jq1aQLw%2Fr9hz73cziXE05uyZv3rMUb5ozfSRLDFd03bxERG7icfu%2FWHhf4%2FS9rkkaLw9b%2FNO4CnqXtZqPkYCnKkDYv9WgxTqki9WHfugS%2FpaNH6wf%2FRhmW9p%2BnJ7f%2FbuZHvP%2B%2B8T4%2BeO4Bz%2BPmn5hpbhCHQGHOiDXzjOV9sf2juptXf8WBae7N1rRDXCHK7p4u4IP0IGk%2BYiR3JfQP5T2XtHfq40yLZlb8mBWQ58h0HQedRZ5vlfzz7hOtIx%2FoxjfoxKNd%2BOYd%2BEZ7lX6hbtLTb7rv6D%2B3iwUxQiOiIUjSd8rt3cRM08qJ1hr%2BqJMHl%2FgbFOyjY4Jge%2FwrxARZz9Z50mhBQQzmF0YF6R5%2Fs%2BhahtwnfHz46OLsyVMRIOtQqJr%2BIKdFNz%2FO1mmTwI2YG%2FFgHwnmHcJ0ak3SluXiybNReeWhgkQ%2FfflhYjJ39xmWItWf3Wp%2Ffy0yJyZOzX%2BPFu7lqxffEmd7%2Fv3Z09c%2Fu5Rcls92k1s2Ms7YC32xyw7yq4PQWgOMN8zPPorpP44RG3qHC4eOXM%2FncV236WKd7hZhkq6reMd%2B3XY4w91dLTi%2B5ZWlunX89b1bptb5adQl5FZw%2F8ayKpY4gcBdbWPdOy6Lcleu69WBm7Ft%2F3qcglhkUBycGcZlZ%2BvZ6zxxpMg3CAbmXW%2FswHPKjSHggAYdz8G1feSXzHpmfvgVpr1tslAnPcB%2F4ZRnH32zCY%2BNKY6reDDbJYvg%2BDeA2TZGyK4%2FD9HQLiI%2BqoqDb775phvH3R1VLHtKFZ%2BY18mK7sqTFsVliKgCbpHsM6iHzMPmGOL9o88J%2BDkEF7dGHmhvODk5CaulNqeDyYojqnLgT7KwPD6%2B4qhQtmqubt2yjNjRLflN5u6R96NiyhfsPKR%2BTGzoGb3l2FOUouROBuwbLo2JcEuc6J13evWbO9AANiRG8O%2F%2FzsATfmK1hoyICYx%2F91vD4covQcBv%2Bk7nhZ8Hd%2Fqf230wHt6DfzAy7J8Uyp%2F6k8UHfw3FSbOKq5EWstXir0mxGnRtasTnx6ZGwhK2zsG94OgooEnq3tfMWB9s9k4%2BdvPWx4i2q80PFXwlVv%2BXvHdhaxtJGoX%2FiuIwG5sAzm0uy84MY8Ak7BDgAJmZXcI4si0bTWTJI8lcJs7727%2Bq6pYsdVXLIrD7nud8PMaX7lZfq6urquuC8cZ0CrWiwXJRYxsjbBUQli68VipxvdLewDNiUdWWetAhqnE7D1VU9hM6jNKftXjHcBR6HEcYT9j0%2BavdOs%2FcoFD2DPUJlxS7oJksD73cl8wz7661T35oqpyhgnb9FnQedtesuhOW76tPSzVLtRg1LO5S4MgMomsHL%2BHhqzMCcPPDNMJolQAdYwxf4XzIKvkAhN0YOU66zHQo%2FHSpUqoGjnWgCzHOJSqGqmnS9919D%2FnWQey5KTQEzaBnero5Si8j2H95b9OoVK97FflDXKcR7HHYRegp2Ilwvzno06PAMTcoRnppdtzybNngAgisaOBjx5jGqZvchmXXAe61W17dtpu8f7%2FVLreD2jcudKdU7NHSQg3m%2B1wo04%2BAFLv2mbtwcWxcjQKpGCPB1CtR1zylFMBKhnKIrUVVtGb3MNEPTYc2UXjlhb4ZDMVex7TWMls89BvKvEOPbd%2BhPzwt6zJYm%2FATLSgxvPcbgTZugcz0TQVcsUbPNdYGT6tyQjgra7OR%2FkTCHFq4QZBextFsXI7qgE6zprF%2FBeD%2F%2Fn0z8VJDJNgoFChX6BvuyW1DGJkOambGlhrXm1ygDmPDbr5s9sI1P9Bxv28GnrHV74ejciQiS8E2Aoi55TGttL%2BhOkMvuE1GOTBp8jxnuUb%2Fyz9roAflLaAMgLYhh1F4l%2BKB%2B1etnRYwy%2BlBXN4BkxkqvtbDEdDJOxRvw5SE4gzb6scH6vQjm%2BvSQCQ%2F%2FdYKBB9HtrLoN5CZwkVJWg9EMW7MwBsiBuXeCjGmTD1Ar8QLEk6YStTYdNaHs9tSCeWV6hDsyqUQBLaRA2F7yXytKGrXoMlqIYUkqnfqoRN0YyCKeyknzbTik5E6NS1KeKw2YVSUVOpcGt%2FWokWgXA1iJI3N3S4VApKJtIpKRWdhdA2MBS66O%2FLqbcTCQ7Ow%2FmMN%2FVidVTKj9V0bxJHtORVNovTkpelsEilgJBOW1FYm0gNywR%2BYZD6pXZVqD33DYiSeeRbC39j7FiYFKDwdAMEgeBUt7F%2BZKs0osPHis0vDWxf3ERNdC8WY%2F4C4HNupNAIV0vcU%2Bmfp%2FGNSoTpQk1eq9rHgfOrxMImgP0NjwR4zUopSDKLisQckhJnEgmw8Zr5HKWV%2Fl6eJvcYMFurusaie%2F9jsDRmXibUCU8UrZRr0jzNVHCOVxAgH0YArqj9GLVc8juXlo%2FDY%2ByGDuL4ZmMMMsXFrgqJnhn6gJOjOnpJKG5R7fzY%2BRnPkcvLMCG86clM36LIlBCr0F%2FfAN0xk%2FORnRC%2FvQv%2FPmRfcniC%2FgFvLdFVTVhmfGHSb9kG3w8L0oKH2tZ94b40KFhmmjThs7igcCjbchQxpdqZsYjDezwGP0oinbzfgjkoTOIRZfEpkd0zjxGvTVA%2FFub1Z2I9uUOp1ij9%2FwVvdX4GXPzM5bjK2YNGXGWOuTohtP2VzqnJ2YdEGZhYKD7qkXe7ByEcei%2FWKBd7R829nZN53LAT9WxSy5QpwhMnAD3TQ1VsQ3HaTgTs17Rj%2B8qeWHZWdu29gyWBXaYFj4aQ5b%2F%2Fw%2Fv3600erX33%2F49%2Fmv%2F%2FPVkljDAPSz5496zxfV5%2Ffirl%2FVx%2FbYuaO%2BuhKmdvP1MdzMfMb9bGtPvboY%2Fdb%2BtgTOvLi2fNv1tWnmPvimcp9Iea%2B1LkvhY6%2BePbqucr9%2BqWU%2B%2FXXOld69vnfVc0v9%2FaE3K%2Bfqdxvv%2F1ayP32768od1t8tquf7X4r5L589oz6DJ9CnyH1O5X74pmU%2BxJSs0RTiKkAaifzIyhBVRHq2MK%2BVN1%2B9vIbodvPd3co9%2FmuOORnu3qZpNw9PSHwKea%2B0Lkv9i4Kge3z6JRnl6iQHgQkIXNyP4mJ48aeA2RVBG9IogzX4JxKM2mnd%2BP4SfgkdYAWRyGCN3RuvXSjVD%2B1%2F6n77PmzZ3jdTF%2B7e58v2rPqOYap1cLy0oTyNVhzGquNch0%2B2pT6I9%2Br2PpKt6wnbtvv1EdHfeyqD7UHt18obLD9tfr4Vv%2FsiLt4R%2Bd26UOtLuxjtbl3v1M%2F99TPveynsH44e5T7Yo%2B68fJbBSjffLtHH98RuD%2F%2F7tmu%2BthTYLQtAZkGlOd7MpA921ZARlUBwuhoxNFVGGJP%2FXz1TG36V%2FTxjQZMCahfPPtW5%2B7sEUrQG%2Ff5d%2FTzlX72FQ0MUIFCY9%2F%2BXUI2O%2FrZXVW4%2B536KY4EdtorjQO%2BVZtdo4QXe2qX658v1c9XVNXut%2BLe%2BrveW7svd%2Bnjlf5JI9rb3dN76zn97L7UP1%2B9kjbiq29V7h5O6N6ernlvb9fYl6dw8AVDvGMoP0gl1S689pSWWho53g1ZajlQ7155%2F33pzvaoRK3NDUuabW6Eqt3P%2BO0FJlLaizzt5aLgyzzx1SLxFSUCalgTWvl6Ue7r%2FOFv8la%2BydO%2BXRT8Nk%2F8bpH4XVUrf1%2BU%2B3v%2BcCdvpZOnbS8KbueJO4vEnapWdhfldvOHu3kr3exZGUUu0FvlQVTGgsVuvH8%2F5CimcDQZZ5Fx%2BFjPE1svF6jc6JI0EgGdIxm7L9TWPkct4XbdavRlWSfXGzU5LQonZ%2FAo6GhxEESJwRhkPVCXLsg9kMpwtgiKem9AJ7STHKcxaLTWlOZwq8Rn%2BUDTxkOkmk%2FoHlC68tiBLWraoGZ5bz3k%2Bg%2Bi6KMhsPQkYnkUex76AWS%2BfUZx9JcRqvj1z8CNouMt1vT%2Bdodz2Pvbux4KR4TS9nqOZqkp9t7fPvXGM09ogTzzsEomZtyNMAqj%2Fh9lqeLhaWeK%2Bg7Elb81nzg83Ymmt%2BaUHJ6%2BdUN3XAaIbOGxBbXkC%2BCT1pf1BBPUmhkuxrTvAX23LUlyk14ChI837GVle3h%2FYspsEYi2Zz6LSnoKDBybPNQqYInv9qsmaxZKwb1n4cfQ9Kg5o4jcyL3uc99MKAwB9vZPYOxw8oY9l9TiLKycewXMuatcBtj0B45Oy9ByVFzzrni9N3EHxlOUUue5HZSH3CbsyiZLX1rHNV4gG63rtKXPplfGg5iw9CmFlPgEL5SWsIBNCfbXN%2Ftn3dPjzg5T7Jxgr0kTJTGspWTVZa7GWdLFhuqVirb62SxW2GiTZXGj1IqyNm6XEz8VtQqVLslFUb%2BRaw%2Fp9phZfi1z1tIIFhncan33KDeAssyjaccrqIUvdKcKOj5rDvwW9GxK5mWG6fJCTfaT86KgK1ucKavWbe%2F1uw4fBRA5O0rvwdnQ1SGFOo3Jr6KTazAiOaoRmY%2FEZjh0Jl56GcHGdpNcs2VDmKAMB9PEFOYie6bV%2BiIgPD7o7B8WnTPkfVBhb5rNj9ekxKWV8D5el3UgN3S%2Fzhu9%2BbPGBQewk%2B7r7m93a%2BCR1EBR06lVqRdlLBgulU2%2F2bAjqWHwp1djMf%2Fl8dUCxwKYXdxBvXthpcmoXr1l%2Bu%2FfXzPTTQDNTEdLtntsP6bH2FPqakV8qAxruVloGZiyleNXNOXH9cXWZn7DVWcXkksUE2kV0EyphdLWlXKqcNf2u%2F2Dsx6Ma%2BnGp8sMIE%2FuuPPvstuz%2B5Iv3O3ZWKosB7JRlCGf9asv9wvIwebWD0AkAklYpydsDcvTvSZlVa3W0XH3pINW2bbVOtYLs%2F5jZimHK1NaJheXJ5e5ScvTXv%2Fxy878rHtVCyApj5RbKGVUmG7o3ubSxaVW92g3HGEcLfXAprIozH4mTnrppsoIT2lXulhcC1VInoKgP0s8TMYTTai%2FIIxBwCGE%2BT28rwI4pYPWhnNKeqVQJSptOvTNh8GpppRQB9rpQ7dCDz0dTYA7qG6Hej1xb5XkR%2Fv3oS5umA%2FqGftAPjHI5GRjvvKJiV8%2Ft55%2BKD9ax4ikDAIM8suguyZlVUH%2B0Bv4Ezh0%2FLFPKuSN5vmz9b9f9FZbT7kroEvvxijoro8663uW4sq6sApoFZK%2FL8gi%2FKlhOBTFjoIe4c3Zuj4bnCbqxQC2TbKCWU7LAvwflLXpyqfS%2FHxW9kQbPL211Tz3uhfnT9cvtqRcqu6DZNoLc%2BrW7n2hcL0RPLuB3uTLVuh%2FIQ37Pj3%2Bkr5Hg3TREUs%2FEOk%2FixBYviUwIV18oa6%2BH7rxbZ3K%2BlDZ80JdtfdQ93Snc9zd7e286Zx0ds4INJuxe73rkRNXkpc1GkRWNq0gi2thmG0tx6WLA%2FD9ezgBi23C0Xf%2BDNPTMG48uWi3BNuzWrXM3r%2F%2FVNiSn56vfff5%2FfvPWKFthjj1m03RYfdXZOIeaILqzQJMgXOx2tzahG8xul2Yq88yTcD7vH8IS3l8dNBBw90H6nHg9j10AJEFBy7nalvA6vGgyKtMby08IlSO5%2B27g7N9YqGVIXfdIZV7ZfSm0WhIvcmGgNnlEZQLW80O2Z5q2itxTPCqLFta1nLJ%2BvB8CvN30O09%2BGxWzuV%2FYyYfZnayGbmT8bEV3ZmA2zQ7zQo0HjdqlKlXiJfii896JBQR%2BiSWqlvsccO6IrLY47i3cwSraxOvbXd2fj496Jy%2B6SmIKYvyyj1aOGk5Z3IxjYyY5ycr%2FVWCXbErJUcmRXkFZ%2BQ6J92eHu3BPoAyOZiUNiB0sX3%2B%2B%2Fv3yQX6q%2Fy9jQfDKqQZbmWy4bTblt1mTG0lnfAbFNmFrcg6WN5oiDQ%2BGa3B49TxxdUbOxba7bLZqHoKBlC4rqOBlLGIZGoqLTdfZ%2FsqmoxMJplazNOaWYRxf45D7rI30U5qYir1GYv54XFz69HG6son6NXn1gehoFrHlbaZY3jvKEPaP5bvKRO6sj7TBf60JoKzAIaMfSoK36EsKyrsnNrohdzD7PbI9y65YSMpp0GdfTAv6j4gCcmprrfHB%2Fs7%2B2e9Yziu3nbPqhk92TXwgqpfQfcV7aq%2BH58gO3v2r96vJ51j%2BNaDhH92dzTN92UNE4%2B0svJJuBT%2FXGTVhdHnU8iQNJvkUst82krZFaOsQqedXzr7B%2BhEqJf7RrLdPDV%2Fmj9uzsLWVktfFAZeGWVmO0MUZeeulOxYhCGISk9hFV7CFu4HpStNVrzSExMgtlyCImAdJakQMtQxbqabDrtKG7DefZB1nSqn39iqP0l3OguljdZawVmELqdWQV9AtlqV0tZ3pwCAu909oGdqdHjipe7S3i52WmXLCw9f5u4SIF0U2su58oiqdtbZv45tW2kxtyiWUAo2dgF7PSZAkq3ukJsTB%2B%2BsPYfcicMyf0zWyLg9b8LpR1GSsk1R9CloqLiLi9Ts%2FDLf6cx39uY7r%2Bc7%2B%2FOdg%2FnO2%2FnO4XznbP725%2Fnb4%2FnbM%2Fg4O5gfns5PIf305%2Fm7%2FfmvP89%2F22lZ9Yuemo4768iU8dKuUN8XD62sE8VK2X2G1enkkb61o1YsHWifbz2SnKPer%2BVf8GQb%2BgOHvDR6KZ%2BhxfG6oV4P3YXMN4aTBQlmjkMF2U%2Fy9G9K%2B6GwgcpL1DJpnsp%2B1qZ%2BXncPuyf7O73Oyet3mfaCyHF8L7EWxtXN4nDKL3FrbXDA05nyxBrLKV1T8uwFVjTyKu4AHMJgNeYIi21k3d5AT1lNNmFcgnD27hhQsXaX3DvscIdr5fU3NMCS1c22eCuM3t9RNeCLrsuoU3Z2silzji373dyDrHzDjKJJs87mjy%2B7BV4UD3BnIMqvUHmWjUISqSNFGfFKCpTxHSC4JpCWN3JOQj%2FQTta2aY7pEuOLtvOdRpS7ncyHJO4lPSxRkWOBTCu2molYlz70lGttqoqK9UhS7s2au6k%2BJVTLr3bhnqiHt0N3PNPqOD%2FWTdgIk%2FrnEV90KxzXRVpfipss8FcbFy1HOw%2BCWyrRh4RZS2thTmByjFYbqeBkceFn9hyv5GotIrr07%2BycHNXUVGyiJumc%2FJYw1lfQDs31GJl0YYMaKO%2FSTPOgpjpjuaHn9v31MvNMvpEbjhcLfK4HbBx9ry2DRrPEQsHWPsJ8EbmSKBOGt78qYYrKbbt%2FuH%2FWO323fbpzsn98Vlsxtd%2Fc2sy9c8xRGx25gi1x8VdR1P1986LVrreApTX7v3UZcN7nX1VuppyO3e3uHECjknDPMsEZyNfaS9zLyMNuj%2FKuqBrx8Ul3pwt7eaf7%2BuToHZNSa%2FxvDtZwwFFrzGUW678zchsgIrout7o4uDiBZXE3wo8HrgkqYH0AxM%2BVQEjRaXoI%2FF8AhjR7hp9K65K0EYvWLqxlTO76X70L%2FQXDPeBlWL8CT2jx3N3W0pL19RL8v3xaf%2Bl8yea%2B26xeufF%2FcEpqDxiBvGqslr3dVF6d5pmnqzkNfp773JujO745uaKsRzj4NtEXnTQV00QdPP2SuVIwwmN5fbbs%2BbsRq0sPriXUqPWCYtN%2BPfGp6npC7H7lEMRu4F8mTC%2FM4IYfAuHnGx70Fn%2BilJMXlALAmBNlluAxGO4nh0OBdVPtDn3HioFGFLW%2Fkd26Gg6YVfFMD4tMtmAn6cILgdXID4fNJrqCpWt5%2FLJBSlzK8CTX4ypfo5eqzY1ioP5sSYWLeiDisgir%2FKz6v0f4UlqOikFnMygOJxtr3R101yu%2Byg0iCsyMjjGIrQLKoprA4muVk35lmvwQSMvOOzMO0sgv8xtGpkysiIWMo1fgoCuyJcrcKGKQsrVA5ueF7E2Kqot%2FmUJIFewUJvdOKOv%2FdYnqUpGIhKYrQjvgdtDl7hHYIXXHYy9WjLAQ36GYfb8wD0ZDtaI9FJ%2BxmfceHh0xTq0oORT1oBYociWMomldiZ5dPlqoETjrZuuCq9X%2Fd%2FB0nZ7gX9lLvQCDJeijPJsM%2BXnl%2FU%2BGUe8c6aawRue9PKLexdPMNq2q0XsHSG9%2FVWhz8%2BJptahEKVz2Trv%2F5x2i3N67w%2F0dQE%2BVury3k75Fk51WbnauTAdwyJ9eVTPJRvP3aVbFWExXvlpDyJEbrTijz2jDOqfM620F1OIGtpzCRrIlOJsx%2FOrcbG3ugXmLWOn%2BCPjWnQQC4sXk%2ByFcXXEtRItlbQhW6zXidQj5oVVRwp1bILrDiELtcGOzdyf7C9V5epIA6%2FrxP9pbmz%2F97YenK2sb%2F7P6pNmi5IsLwV4NzvkqQMYYhTUVRTGuxHCIBoexO%2FjowRpqz1BkwYseXnw3IGPDLMOG3KG316s%2FXagPZ7PZQjWO9YvVTRQRO%2B%2FfpxfzlVYNzE82mjPAPc6fswgdVAECTJx1ZZCZ97Je7xb7t2HrXqPcv2q6S%2Bps4ofjB%2B7sE1tnn1R2dum2zQU%2B3bfHB52zbh6IszLUWupNpugXf10%2BFOw2ZcJk%2FeGHf7hOVmPidMLEhxrtp%2F8nUaKREQBkNnb3JTuZ9W8d%2F%2Fl3TAUoP%2BCqW%2F3iidd2F8Xgl3e1abHeT%2BfAI1FrT%2BrSauaYs2vqJ0%2F4fOTa9ADSG%2BSZSlBtewh9qAeeqfoQm2MPGzA0lkFfAZRPn5omoPXWZLktjSPs6NqTi%2FYTnf3D7skCIKlFLcxramavtpMRCxxaILGSYhcEj3ntAjzeKapq2S5jrcaAGBBIIGDUtDgd0TBo7dPnczrR24aPFK6utouLedIl6kCTuc11%2BkZvrU%2FP1l585oQBRlHUjzXPz1KHzHUvFs9tNTeLlQBZtsUr2UPSBOU8uiKyxKYnVqXi%2Fz46XLSpW2ytNv89P19%2Fam16S6oJe3961nlbybNKlvilyMsYJS6bvqf5jDwtDetp3uun2VPVLNPBu24v3ylm91Sk17WGiXgTdOtt1d3Q7j27%2BDDLXEjvMhLTituqOn60jTYZdmWdTzJr%2F9l6XBgzYblBpykNv0wnsnNy0mHUbSnqLpvnLMyulan6z%2Fda9NcDZHoVYilCNbdJWAz69%2FV1iumbrK6YRSyShiUYDUggilqsIqers5OV2EYnl0nZG8ocHZL8WPJS4jqhd431mBWwCvdDvPRR9yLRCG8nlB%2F9lLqRqAjtfY%2B81SYwK6X4d7qOPsU%2FT%2FyhF0PzGHUZq8InyCenfX4lAmExw8RpzX%2B8aJ4%2FR0yFDiZaW%2BcO3lhjiGfnaev8d%2BcCcbg26sRUfH%2BRpT2lj63WasU1Il8FJETbJ64fJI4X9%2BW%2Bff%2FV%2BVc%2FrF9smX1XcH%2F%2BFWR99aOZCZN7oJld1BaFZtjjCvtsq1YY%2FlmCnuxH7bIhozBkiGKCxL5YkpFENh2PiFd%2B%2BgixfJmTtvcCnZek6TTZbCvGP4rHbeTH2s83XtCXjct0Ejz2hy%2B%2B%2Fe7Vs29eVY%2FgCpYKoHhyn0F8z7uPJ9GPd4KeaexP3Pj2Pv24yyzyDiQUZ%2BOeXbhnH0axO0YZtuMPnb%2FF3ujLUOzfsBNE9r473IUe7ByddJXqoqYRVu60Mnmn4ixIirP6xX1TzjEftH9uHLu3gHYp1Lm9V%2F1ZYDjy1c%2Br%2BAKxN4muPGe%2B4ly6g4%2FO9aUX5u7LlSs4UtteJ71tWeaRjXGd5Boo1Kg44SrwDE3NG2SPrM48Jar%2B52oqq0iGfVr48cuFfp%2FtHcpJWRMRKfJVe2oPb4GpCgByd9aT9DbwMp%2BE6NHLeC7xAcR1gELl2U2FfmW%2BCyuIDIl0ztdAe0RVF34lyviLVkRRnqUkouxKKYI8pJxvGLVyq0dF2eXU18bGBn0vFiwU2ZhG02bLloeWRCY3zAvnJYoKCYV66l0G%2FKvz9sAgV93E60FtqDyV%2BleecOpScDmPfN%2FeToKGTX5gaMjUEdvjsfgQ96VT8Zp0et%2Fb0Wn9S9EpF9VX3cl4yHGEt%2BklOkaUImjXWphq2U01XspoikTTxaMonrhK%2FJ5GqRs47iSaKf0jdOyNvTGOWiYmWXayVIjAqL4F53HWOc77RgTv8GlrxVTcZk89J4nBwsegfsh8xrxQ5dOCu0Si7K2COuCUBAWMBYu4sXhjvJRJNeOeuJM8k%2Fc%2FWzCN1%2B%2BwbDKqXhyY%2BWo4jfq9wMicM3UdMfTUHR2zg63slXRDin91wSn6uBR2wghA%2FWMNaCn%2BvPMl5fQBkN1AupqE1Hsiu0Hti0koaruXVHGctCSXfnBh286BoiCh2CJy0nl%2Bsd%2B7WG2zh77MUaYVPJRoe%2F%2Bwc%2FKvjPAQ8GOZMnlb54LacGLBJDMNd5SavWygn%2B1wyBODWzMNyWczbZZGPe8GOKKPUo6kNKZygshlbWL65KMfDr2biqxeFIhPqvALYgdjLzEJ%2BkZ%2FzIJ4Yip5uTQTYyNKLKQN3NQ0Qm0MzH4NjCComKSCqJhpiWemkb0nTwTWZWaWHQ5Zij8wnwV2LDJDpWByNDJThGkB3B%2BYSbDoLMlnrd5MzbpGdLKZ2tKNEQxu5I%2BN4DQqY2quiBlsVSeRD2ghHckeMzkAutdMY%2BOGFG5s3FC0ipE49tLETAqivpDEpvLSx2Ao5hhRdmMk%2BeZa%2BeHA7LIfjiKWhArFRuIfkekMvBEoVDB%2F%2FoxlUKxgIYN2pJiOcVqlDNOTZwOY7XCcXgplOYoIYjgxPKGosgyXMwJ3ID%2BCJJ6Uk3huPJA6BFhESo2kkQKEXOKZJSRH5lpMvAlf%2F0ky5hgAITmZugMTnM0Q9o4YQJ5SBSw%2B9c2Jnn4cb24OAPhTVsHHMWDifQFJo3IDbg1L8uZmcukFJuxP48icoumM7aTptdlBjF3LkkYCwpUcyGEiACKbckgGYpivZSxhEB5SHlUo3ZFZLhmwPiWeZ54B%2FIBKEEvyRIzJbCZOA4Z4Jcm%2F5EhXiDSPMXgGQQ8wwdHoV6aDSXlozXHg92N%2BVmIuXZ4cjQ69m9TyvC6BXvv9aJZYSqGQZxvP3o5AtpQKbHuIqXkJ5AF4KhBmJoClHDLN2MCYZMJ2GvOtKISPolQBnc1Cvuyz6ZBvutkU2C%2FP7OFsaoSzd2wqrI2ra5eBiIpgv0i6qCfDORsY%2FSjIZ9KPhnjmS80xSlGTGv%2FILthXH2P8uRXmdLFc%2FPdlxZcaO3CshH%2F67gnr%2FnQhZFdfHX2JuVnpOoHsdwU2snChp8ZNl3L4Fl88bW5utrZyPqdZ%2FEncTmtVrlKPlVVoLV1962%2BbI17mrvKSSs5d3g34V493p8Mji3gjjQdV0SWVHEc%2FmgUNarY3TU9K2V%2FOkYq5DVgxec6XPGfcyao%2F7ryehlsFU%2BSCk0D%2BfqCEVXyWCxT2heJ2L%2F7DYCFfi9fwn1wFRiX1MfpRFPArDh8gK9e7QDVp53NryTjUhBTT7ir1GTyEiPsy9keiMRBl3FP2k1VeT%2FxDpW0SILSq4mKPfmSK7xr9W3bI%2Bs%2B%2FMVNevjBTvnllstqktV2H%2BtKyBfnAXSK4sdH99JhJlNxOvaFnsorKbJ0JBWYmSQN825XP2gG87U3NKKZIV0SMdYhC75pxGJzOETjBicvpdAIz1oTGql9AvBD0lKsr3HaW914eAc1iQI4TvalAzsjJL00L5hFf4orHgkaEQkvliNUxH%2FNipeCPUrlKxKpcCjAsaZJXChYdhD5Hw5tjgTD8qzDyL3qvCe9oF8cR9tn%2B2UE3w9Ticd%2BmS%2F9Nx6M4QA6KEPQtGolWSSdr5MewlYlck%2BrIXTRLmXcgpeoQU8K5iYEm7nuWlhRPmygVwd08h%2F3bUhp73%2FNFLOoUqI0jLMnGxoa0nfCPoxCdzhGJzkB0wkYqEECKPmHKZCXo0VFXjXm6z7FMiOgBTmbx7vm%2BV8%2F1b56Fi2d9Eh%2Fvs0B9dRWaSR9RqV6XC7RX0cAs8FyUZDt%2FeXGUOGUXKbV9kB4fdLa7LKhFTcPIxqbSgEQztepWdjtnnbvHZcyaaXZO5sfz486%2FDo46u%2FPjk%2FnJ%2FBTe4P9g%2B2D%2By8n8Xefg7fxt9%2FS087o7f3d2dHQwf7eHblfmqIpzot57R790T%2FYOjn6d%2F%2FNoH7F657fe6XG3uzs%2F6Z6%2Be9tFJ%2Fav57v7nde9k%2B5O6wu1jct7Q%2FamCjDBkmgdlu6kAlgxF353mc%2F9eecIhjrfPZrvzU%2F25ydH6B773dH89f789dH8dH9%2BevTfnYFaZzwAPjpnmQK8J57aem7q9KM0jSbGDrj7nFqpzs720cmZQXt1dnbMlN1%2FvjtlxQ53zZTj3oGZtn3S7fxspO10Dg7MpEOz%2Bp0jVubocHcfDR14%2Bt7%2BayNxt2MmbJsJ%2B7%2BYKd2z7o7Zj%2B7BaddMYiOHlL2jEzPx5ATvdnnqEQWVMHuMLvHNJFbn62MzAf1NG2n7h%2BYC7u8ZCf98a1aE1GPnZIE5zGwgGo0kAGKWcrh%2Fxvp8tLd32jWn9Wg04hwDfxTQ2sn%2Brjkvx513bFGOT7rmjB6fvTFSTs44hJ68MwHqtHvA4eD0531zyk4%2F%2BiY7c2aC3ZkJdmdHLOHooCfO0RkwtT1xot6Z6%2FnOfFadEQL80REipR8KS%2FxrZ9%2Bs%2BDfj97%2BM3%2F82qzAXxZx%2Bc1LPTg66bEXebUM63zC7PPUXcSqF%2FYZ%2BW0z4Nds9Pjqt5OYLZvJlvMqQFPSK8cI3vWTqMdb3ABs1ditP6h6iNSRDaadC6ulZh%2BH407MjthBdnDZ5tFX8tlHPF%2FPaTA25mF2Tm1bUGD%2BRTY9OlSyu1bV1RmO0m0ROIQDN3x7OYXHmcAC0THM73m%2FJansVGAU%2FceCFxz9pQcJUfPScNTwm2cl%2Fx642sZI5oDjoJRKGB0ev93eQtHzo3sIB%2FvzZM9SVj5Wl09AbubMgBVL%2BxqOwvxEQ9swzgLMK1A76%2BU7VU3pASkv0Mtcbv%2BcsKC4W6Jo5dHOOaHuu0Or8%2BPQYaGQ8FeZEvcwLOLf1JbMTOaQ3lKvDUwxrNXZlQOCSZjsQdjNlYUICTw%2BmaZQuGeYy1UmlOAnM%2BmA%2BobdJGz8Gk%2FbED%2Bd%2BOLikL0Nv3FbZkAa5Orwwr7e%2BRmj5cq7dxju583%2BsXCy5xXtUs9z6ujferLgWXEZaf9FNQTarTyzSKsioMykV6n9feK9VurYpuqF9anZoKXtQIbx4CEXSa38siS4g%2BZ7CC1VxPfEFlL2HMmnuGhCd8Qvalv0kCmap15vF5vUDLCXgF1PPhFJ7WvPczMvChpm3CpJCIfbOZapweDDGURB4MWt5gMr28W0PlR7%2BikLP1I8YJPGol0YfmZbR4HbAbj8EBYbhbGISw6ga6CXCSFFZiHUQE3tcT1Ulo8ai2WPKufQCs1lKJ8%2BjUkbMFUZUenQtJZMsV8q49odjRpejuWWPtjGbX8C%2FKMo1U5PeOIZ1ZFRgEI2jWdqbuqmpuaNzOMQBQWmmMAXAKcmcWWJ6yZYDejWMzKsjUs4z0zz0Y3rlSX2FxoZMr0cl9rzENzJE1afMp04PbcN64rUbTAV0v4pO39s%2FOBMCReL%2BNTdhvx%2F3hEsOlTHx0svIXKq%2BpCjsTv3UDfy%2F%2BHVeMJuwLRaFgBLSnkWDN9u6goraYBajGWZ1niTmxC3sAhCZayDtbJx9wLBc9VrTeOa2FzzmkJJuD2%2BAYtNHnMoK%2FNDEcZSeQRfP4wpjdC0j7FWmY6kSe248lnCKzum5SS%2F1bizPZpMr5wqzWMgR9M50rqT1vMhRW8DeJ4lAzPKENglZoda9G38ccn22y9nEDTkAwzrd4lP4NMtChwe9Ads7gibyH0kUKng3G0BPYybK00e%2FBOWwVdnFM6kbM7Q5cAO5huiazRq%2FqLbMUpZsmZKJFzOEGQYv%2BmZ7aul6IrTGrnkyxd5wxhCl1oNmqaQDbaYi92Fi34ArBSTBjGmYcnMPUlsAms1cNpvW6hSt6k00r8kSaYEEvTjUywxZHZg2uIz4OKBR8yibsRNvNp0yOICjRYZSNKLrCTQPpesn5BMp8FLnrPPaRlFKZjmzNBKRqkgZuoNLhsE9jODhcipjaBoSeACGZiEKfDBkmFLEwHVtLgCNXXocC8aM4uAGEZLBkUxcUWwnE%2F6ArOlHJqEk6Gan0fRaONitcNfTh2EPqCaXoTs7aM7Y5sz8cBjJ6KrGAlJFcMq%2FZ0qNiwRAas1mSt75P8CKrnxKP39ocRddsle6zCmeRIHd3fGc4OUsc6NWTq%2FtULm%2BK7viz8pbM9koMJsI6bRdBL9bFksdI2fcO9jcEl83lerKVhmq6AS9ppKiyTbLI1zoCZXZ6w2kE5oNp2ELSPpJC50NrrwMI3UCHarprx4CsQy2GO7v38%2FRs0cWDejpphlGrBi6pTFFacTM5bpPDxCUMY9wXOhLVagUzQp96Z6Ao%2FuQPB394DThO2ktotLrIgr2Z0Iwn8rD5NcHldFtVHyb3EErNNRgQ8IwN0QsVCOMwhQv%2BjifOy%2BMcrDFsuWqaleOGURq4p%2B%2B4vOuIvywZKU6vggcn82kobdlaiMrNPAV82NXCqFqnj2VOnIKGlj%2F8v3LckTsIOEH0xPlP6qgaufd6dnR294Z6adkdtsAytxQG4oob9wEhYvDrQSDm84LyffkopViFeelxi%2BMip6XK6q6CLv2DWgpmM0MYneUDiaJ6dtkuQuOsu%2BGG5PDqGdfg9D5uL3mtB8j7JhCdBi5kbKYkmXH7x0cKuPfnRwgs9wvC1ZjgfEqKLfCuQzpD%2BvEAeDoAYTvt1PPHuAjz7ynIL7YSJU4HhvPvXqh61d1WK30SAcw%2F7G6cJ2KT8haSw23RH%2BjV7IodnTbhWJlPNgoW8EbfIXJpGjLuVIJP3SDMmvWMIzzGqF3XX4mi9FXTCzzXIKRKVO5b3hBmUng%2Fgq4twIYP94QDAzzf8VGFBPSS0P03UCsVO4yl%2FM1DNtawcpUdGZAtgtGl4aAbsvysobhnq1x63tlnxDcLoKrpgNo%2FPPUuQSOD%2BAYb1kTL3P4mXmtj2dFFW54oGEI9THJ4A6hv%2F0ZRoMoJbrJbdkUvOGaFpkN9FPjlwtxdpZxwQ0F20YS48nRE2n6JHHInwEQaNDY2HNerjkAy4NLvLIHWFOBcTAuAm4aaDzwJpnz0sZmoYEZuv%2FPSauL0r6UtV7IEKI8ENeEWwocUUyYQV9gZ5VlDo1Dt6Q%2B09gPRxiu99bSH8EkCCZjDy%2FYaXCBE%2FX%2F8AYl7HBEKaVW9qTduh1FgVc2726cMnl60f8dOiHCGACFB94aNyONXUM%2B3DhkzGRj2x%2FvhyYsovC32BPGjDdOvHG3bA2vXdTewKIP8G6QBlnsXsd0GNDYCyI3ffnCkvHNK54BXf2Op77z7ck7gTuZekOxquffiMlSj7AuqTimS%2BXVtEpDgBx8SMiCGQSe1Tp%2FpwZ%2BeFsWHjd%2BBWRtlsE0oxy0ckpmMzP0AYz3M%2BYabc9GIwNKTi%2FdWE%2BikNtJo4k%2FSEzYc3%2FxjZPqn6dljTXoy466S3bcfoJG8Mq9MdtHx4CsfGOXv%2FZCFd1ZThX3WQfRp5SD3oS9kZ71EpxTYqkS6MyNuXD76BoldJU5mf%2BXa1QD2eZO%2FtXrd5LEm%2FSD29KC5akWNKQ0ewVk1OiaDnca3Ss34Km6r0LOCV68CsmZG1aedXoLmO%2BGp5%2FB%2BctT353sq0R5aFmAvd7rg6NtjvnhgKSuGz6EMP3Mn3jRzDyoPTcWH6Ac6RFNuQrHYhm4TTdGDT%2FZw6PDMxLNE2bqxolHyI0nG1gYjn%2BU7sOMyak7ERzpoXHLrpwzsYfyVMtDTOgPB6ZOXLJQxQg4JeI5Hs%2FwUCxPGyr1lVduZtyFEL0VGTTxtR8ODdpxGA1mZug9dfd2Clvf8FYDAELqIVKW4iFKSdq1UmmzHmKY2T%2BS6tmgSbjgVv4mWBcaM43UCps7S1zIBXJtoz%2FcK7c6cmENnaNLN9kJIqS%2FzlzUlGqSiA%2FlEsoCURCw5bI5ZK6%2Bb6NTZXro%2FNnFBt3rNZ%2BXw%2B6qB9DY5AdVcsMPp7N0g7w9HY1QtLemmis%2Fp%2BUf%2BOCjH35w1p9XinUylm%2FlOTST%2FeCS1pPO67fKX58kDW98bxjuKfW779s%2FVhpm%2Ffb2oHfaPdjr7Rwcnar7jPb3C3U5cpXZ21xHB%2FfJ6vv37R%2B5rAmrUMIiUUov1ibL7dtS0R%2Fn1GzpgfbqavGns%2Br8hNqxE%2BeTouve4lrRaf9ZrZul9A7wqn138PHESwCvJN5nWDn1rfxA6W7ET86AH7o9mnqhAr7NHPaypznoZZNFwELdI2IzgyuEQHUfn8GkgrF%2FSHWEQN3uYByxElCeG1VfGM%2F6I4d57gDM8Obs7YGTXEazYEjat%2FqOEAh05WA6dq%2BdD99%2FgHQMuwA8IcC8UA3gW%2FRMjWzrlpD94XtaDf2umIAff%2Fyw5njpYMMsvxgfRsT%2BvoFyaCTqLz1nzRn7V8ClAtN4q5SGM0Vr7DuORWz8bM3pOJoZRCFwNHIg6ZcfP1Q3vWYIzVtcsJet%2BIY%2FDqPYo%2Blvtv7BiyFCMJI%2F8wUqt%2F9jQ2gRiz0qIT8D820yIPvcEuqp3ffPlb3Ge%2FqJCKaLXhjYk7xvIUfWNDpqto1DncDDi2IbVE%2BzjeGUVn9oS%2BN64BWxt%2F9UAxR%2BFXtCj6t9TOv57D6rYOlx9fIUftitHenYKXVsZeqmSGJv5qdRCftWm6gwA5VSbmaWuunI0ahzje6NTH7a2BTItapxAYnpT9xg1x%2F7JClWEbSavS0VeqogPc2eGAHjBgU%2FKJfVK59KNXxufbA1gcQ5xnSFR5%2FNyVZ70cr8GXz59mL1%2FLvMgptX88DudAHV7aqOHag1KGfnzpw%2BNJWlRz5QPY7PrSak4WR8bs1pLlpb8zylde51LzA0zhafIarvgz383Qdbgyo9b4N%2B8qYt1S%2FGq6QVWOWSkav22GK1QnsTh1G4W%2Bp1dRPKiubZ%2Bc1vtOwqUnHWlP7VWg21NYl9yrJ6%2BttYz3Ndw%2FM7PRsdXRAQqme%2FrXoWBnrgjd3B7dEgNUfqNIeRl5SoAxRIxskA8FVmmBTF5rVsIexOOnj59w0vaXuDifvimxftx4k3WHeHQ1%2FJG9YT4sLXAdq92B%2BsaxRi%2Brk3h4dDeroYUbG0NSB3pS8Esp%2Bs9ITA%2FUZy92ASGS44%2FeIeAVeelwoUrvFK92YYIVdJgx28RoyrRoQUUS%2BLDmnjHDa2UCXzg9TvcprFY4sqajyfnVekVkMibiO74payTshLR61WOdHUBOC3wrVPx53T0xoTN0iS%2F%2FfnDTWVa8%2Fb65PO8Zv%2FUwfoxn%2F%2B%2FwDmxrE7vfzzDnCXh3L9sqi32fSKM2sk3ivkLJuJSn2of57uHu1k3rQyuU6mdlFCbsDsv3%2B%2FCq%2Fm1iP4buiLqWhY7fI4PpkwYNEW%2B8Jgs43m1g8%2FacnExVMWoWpJk0uatTRNTxWWehgNRO2uckcXvRRcXnKdr9qtSwHczLaFo2%2Fxt9TzZQ2nsaVi9riF2V9VLOB7TYZda6c0IQWh3lMCIeUQrLneEqKcFeYpqeHv7MvGBnSD56YOmSEkThPJOR27M2k5SYSx2wZu6KBLa8vjpMiCMUCzOUjuMIeZPBAVQn%2FHmJlA1ieyy9gaI%2BSJzFdqZcTnxQ9BAS5HU1bUqxQE0pqMWQn7GSOu627Q5r2wNgomhA1MNDDlh4IvDqq%2Fc3x0arUQr2FEXiI3SzlFcqqUYdILpUzjMCzLgNsOuijINQoo%2FmB66d1SbL0sNqybwyopIJaOjYKa8gqpohsbh%2BuwYexDLW%2FEWBKhYl82zW55Xs75AH98OetvALwsNMT%2BMLTF%2FCSZAXP08sV33xk10ZSfdF93fzs2Frso3aWVLYajM5Y6u9H5ZNQOGz70UGgbwXT5sTObOp8%2BZ4LeaBZTjN6UsmOKKGI876cqEiFgLfRCl0YRIJg4uMW4wDS15A5Sy5FLu%2FGuEajvwiuVt41Sdyxtkmw6jFkqcK%2BCUqwq3DnczTZf%2BbIs29vGWvB6lEp9FkXwNF%2BsYs1ZpefGfCP2jr3BLE78K4JwL0Q4xGVyFkbkVdEgcxyMR1GL2U9YLShqrIDkJbI808UhlkQFBdC4sM1YFTKmyxzD2gimS5sLqxsCAOLQG5ONLEUl7XsAnUOcvSulNFpzivAUjBR004UEtD1JSF1OAuMHNES5wxYwYKySywUC%2F7R3dNLr%2FnbWPdxl01wla6QlcHbcOL9ZuYJJHZjOXm2mGAIp3KYqJZqgTUJ2IWNBZt3lqbbu8Z2aKvnAL7QL1F1jrZwLdWy01wqda62RI3rucJa1k1gsPZSth9WHjzL0IBPQDYvzYcf5urqGb8s1ZC6BvSHjJsw7By5MzIHjfwcY%2FovzvGxuahNoai%2BedPe6J93DHSY4sfKYegpLxjJsPd64MerloUpr7mDaoN5hWvuo4GbOLCqJFhQd15yjWXrGH0Xek%2BIHXjxtLr6vzoGyajHbHlScOz3dcwcY72ut8N1W8acXa58L1T6laksNiY3sHSdr%2BFZVLeuzqnzVqJzVfcxS8D42QCdVeHumYjyTQ6uM2POG7JHtg84blkgn1rUfBHAaOaPAHY9h2Vyo0Hl3fNw96e10TikQ8elZB9gU1GD33FLVZdMVFjxFwhBWh3Q9yYwLg78j%2FZik2MuxlxasxgaxN0TSEPjEf546gYqO5Gh3L2ZNVkfXkCEoE6k%2FGyvH99S7U8U77DBujjzfbJJhMblLMUMCVAfRLZo%2BlXdjRj%2FQDfX5k8YFNOA0VQtzN5m0MK3S6DU329zt7u0fkivX2sfyXfBrpo71gOctiTlQT6jZYj7alof7BVYhvJ1EsyTXFPvPDW6VulqjmyX0bYMQo2cVJ8ji9MitXkrAvCbBKBbdYJEsuKFuKXsREeCrSnCTUModj54F%2BseIOHil%2BhRS2tb9lN%2Fx5%2F655A7mCoMAGN7RqIke7ltm10jTrkR9NZpb6DMPS2tb6XmDCLBGkbv4bE5Evu%2FIo6Rs0VwRB6nNhuxk%2FWYACsitQqlS%2FXHlUp2ubWEMlKjcFtwotwUrn24%2BK3kjvjc%2FtExbRus2VgNEDsm9hEOl2db7uV0iXZedL5JFV%2F1r2OOTIwDJs3%2F1Ojs73VOb%2Bb9EcJu9l8YmEPCAtx4VLeyaFy1jvOUBE3tnmcIlPN7HUmy1NOKi9RJnGwORGqe3XzaPr7tnZ%2Bj0%2FqR3St8sMG1ydnCazxMvZdSUdCRY4agt4df%2FNv6s7x5AS1eAtXfRrNDxJtP01lGCBbNswf0EcvjVx5rCzLV5AMRBvYNuZxcxgzICJWWd5vnvzdbFqu07fm2pry3hxxw1nUmW%2BO5wt3tyunN00u3lhqZPATMqZPHDj1w3KseKme5VTSiip%2BeA6efBvWFJ8g7Q%2FkFMbZKBIclumH8HJDEwF8W3WeSkauxnLEfLDsyFfc1MHP9XQb02AFbY7P%2FTvXJPSV%2B%2F3MeC5f4fCXqe%2FSO5wY%2BJ%2BjX4wzTkXyrEMpkfJacB7qd%2F66BJjupFGd%2BSeQt6PTHkXmuMoy5P2YJAeoz4f6XXAU7PkNhVX5Gfvuludw5fNxk6yQi35NLru6LbXAqBtqlsyHl2AcN%2FbeAX8yRfcDjShVHlhU5Nv8D2S52Ka50lFzvVVzuOI9%2BV3fvKp8alT3btY3aoDEpGLgOAzPsROqvly6u7ULoiNlFPY5N5cb6Lr2mGtpf1GC24r9xg5jUyoPdiBrWZQkR%2Bnpzg%2BnVO0FWOPkrmSsUSjePnCqXMyXReKXHqg4ZPSQF%2FakRETzmmkT2fB5ZZqW0hAxb%2BmXdtQhHxZrtIr8l0b2GKrz3l3hwdoKO70uwOAW9y6F7ho%2Bcks5hkKy46QwqCW%2F3EpRjWjO454tgbpMpXOl65NZ0WLBUGgqbqf%2FhxA7YbeZwfkJlHH607bjOn8dHIUm8y668XrpVyC5AgibCP5BxRYWY1AGbHgX8aZIyDVJwete7LNDsWqiREr4hllujbWFUUll8rFf8qI%2BcubQn%2F9OTYKDNry%2Fi3TENC%2FcmaIDW6VpgI9EZQ2ZUSQYzcIrs9LP8lgMPtgfru2fGlV5zlP%2BuFp1GsrtpRqfgyZSb1V%2BNqtfxX46bP%2FBP0ZdSfEGHYWl6KRlwXSxKeypCPg%2BozrjP0An%2BC90skqsGjW205YsMWwp8BIMEK1NJes8WdrtogtTu%2BIBdkgeiDNURuWH6TcpYimlwzPrMR3aDfawq680T4Zd1XOV3EDEKtT9hASvdFm4XqrtgKqzNxAAfIaIZn3eDSG3ykYytS9pVkrgsAkXgeGlT5KW6oossBVp%2BfKCtF8jGC9y%2Bu0gVGc1xyH2Z7thGFm9TbxqL3zNjTOhKa6%2BwxT9ahs20ssdIlLs2yvy8%2F7O60UObwrAUX2N1aZFk80eyvNhYyk5bcNQg3LDXIY60EpRhUUnwaeylFv02uAUVF14DIZlOkh%2BTri%2ByKcOBpnmU69dx4QTRShCB2nWyGDCaXW7gTlCcpHUdnVPBJIY9ZGtG9qNGM7hTqLVKiS2hPC5UpVFqf7izHM9p6lE1wa5kY7P6StoXQXdCFRiEjoCTVa87SLKN%2Bq2%2BD8K8SFShawcb42MM%2Fc4XmtSqJ%2F92jKiNpQEC8sbGBesiA4q%2Bj8Akieh%2F9hymo1JJwckUGXYLttgS%2BFwf3hnpJ%2FkXrstPGlQQfgYqGrVFEAqRNqqOTAohnBB7p6kUT2Ap%2BPJhNlN85Uwmj7Wzo8k1uT7eSBf76wbmpN3xll4aAX3FzW38erFewePtFIl%2F0zBTFxYtgfroVxaHKha0JQ1WgzbwSSx0tXeaZIjN%2B4ylKexZqcaZoy7hYqTlJKHI6b25csDtnWNmF%2BkQ%2FihL0X4L6E66jLbEd5XwSsbLSqYCJ%2BLDSRGiiqOutD0TtfFjZyJMM3wZ38LW5iAqVO668h5%2BWNMmoGChnen5hpev5QiGdkBc8KkBoxgQwfUQ6skl1o8%2F91zmygVUjYi7xsFKMH2E%2BLcWT6fuATM2nZ%2BHHEGNmLBJ5bB5y33vc4XphsqvlNjlKRlOPWncvtH7ZdJcgZY21JfuirnWRwTXmKrV3SDd7zzbmn4vOnGGTjFhYj4y5N5XM6%2BnZGgPMvR4sWnPEmA9FJwcKUEsDtt0vLPZJ5uV2wxA6V94c2jWdHlSTSSkyLdVhOjvF8Mg7%2B3v7Oz1rVG1%2B941C6BxwjU1iWePGdNYP%2FIGZGPtXPLgQ3rjD3mWhO3IHn2bIiqEHkxeb1WSu%2Fozk2HOHUcjCkniAcEwUAsgi9lkgjsRN%2FWTke0klIng4tx156Athscp3D3f26ZFXTfBfruwBXHzsdoF275wdVfrO4LCe20mW6aGqloC1m76Nhh45GIPPNUWGo6oJxRFCqLE5GvPDITl4Qt9r2UbfQPM6cnbTbE7owckG1UgeYuhb2fcLOpFRFZEjMeZCRl2ThN61Q54Jmw204UOpBzZEbSPRkEU9KtddognK3cSgRAOPWl5znpeH%2Bw95wpSv2A1YAH8cNgvoLEOpawXYLVYiYD5DsLkxnSWXzXzVOdmAQYb3t9%2BddXtv9l%2B%2FOYB%2FRIOFikvz32wOaOoHG3RPp5wt0VUdr%2FnoGMnIzgHuDKT4Oiev32nrwPKAi3P5qYzlhd6V8j%2BJ6mVFhsuilrW1iY6HLMaMdae1hJSXn0Imwlaa%2FnHmYpPo1lzjmQR4SqhAgl0kKO8yM8hZZXUVKwKQKhazLZJRVWeYuXTO1D8WfKVaRYTvUu8LmNgytwW7OwneJFuuHJBLY80pvFJqTgOt%2Fa8OOMODhX29VtBvKOtDtJY%2FWVS7LtAufP9lzMguHcXkl7ZyZ3OkuhCYFGsX6t1YMGE%2FOM9qYLY1OcJFrqdi05YpY%2FCGSXZQ0g1LmwjlBmmZnC6SiEJAjkXXOdfHIyzk3J8ufI84C1du4AoRFjD5frEVdMW1ghxjWc7IVug9%2FQIP1LSSyIkrycfiL6hXwZGfWkH09jdT76FPn0DpOjN8CyJAnzN6Ty5hdM5MfaBfcIccejvkvtshf9z0zHf0DhkzlTNTWSM04HGG0Qy1YpDZdZSkxkHq1FF8rkOaj9ee%2BxF6AuwoYA71rpTmEPZdfA6d8%2Bfurp0FM5RRtc6VH6OsGO%2F30OSSpNVKbD2MCBmhaoI7uHQwYMNCjg3fKWCDo%2BMo5ECL1iMkIFSkvqOJeycn51UnsHfkj5%2BoIZLSo2FKAv%2BalkthAugDBXHpELqLd2umk0crM9fY3Z4lzusDv%2B%2Fs7CBh9drzNG5wXqcfneMo8dm2zUln5eefGE66Un8QvdWSTwLZ7M%2FkldV5vVg2C7%2BFfxb%2BmbKW3XDn2nWN89%2FXNlEKST7WEnLudlEpuzZF9Atx9BKhn81HglxsqcuFytmWZEP5dG86TxqNxhN5QuWsCpU%2FqfsPodin50Hpu915Ajh7VRh%2B4%2FfHFnBqrJgXVbbzq8YRhRj9AQ6nfuhJ8X8o%2FZ7Hk6663vmEhe8had15A%2BT9jqDoX9NpVLvRbDTm57%2B3w4tWYwfNWao443v5pzLjUGYxKEuJCwVdQB419XKla0597P05g%2BPCUX7hLWDbbnx5GMy3b3u7u71%2FwR%2F60H7%2Ffvjp%2BdqLz%2BTOqvT11WfuQhuf6lEF2bOvPq9nz%2BVfhDBv%2B2%2B7vecv3uBTTSg2f34OJS5azU1UbW19egZPOavNztv58duW5fEXr94UO0yP0reWpdFdwatbcdn1iVfTN460YI9xPtbfvl3f3X3sNPdPj9YxEkwLPQ89ftvebWM2ZLw7VemWxSwbCD12VnMDIW0kvZj1tcLqtdactrP6uG1UW%2Bc%2B%2FfGbzcnkfDNJLqB3L15dOhij4S7dyxbkHl24PM%2F6cOF0oBvPX3xhNwCsvrwbQ6LPAiCXMGJ1nabNMlANdYan11pDoTqnwquDrm0x8Gwl5JpgUsxkc5Jq440vcwJs1YC%2B00Yju34bLoQDAFDBOfz3LlabgF421PenzS65Ada%2FWlutuZHSOj%2FZ2%2F3p0eOLrbuGKdaRaPDWv9lHjuD5Mxvgmv17t3V%2Bun9w0Zqff%2FW3i9YDtPyNteW%2FvcFWO%2Bt7OBkP3vB39naP0Oftf6TRF%2FZGt%2BFMqdNmbYg%2F6Gx3mYFt6QRB2Y1MN%2Fz%2B%2Fv31081KwqTC02T7yZMnGN9zpY2KLRYiwpis5W4Y80gXcMIzozNF2fxYmqyiwyMxAqvce1LEzjpv2ee5uk77iWnZYowLfZkd7R5tOu9g%2BSfAb%2FvrijVEDj3wXFLgUs4C5eE2YROkzsX899ZJ961S%2BGjdaZi7%2ByfdnbP9X7qV3p04n1HZc3S3ryP1ORGK8twr1w%2FwukkCJzWE1cdNZa449BMsOUfBBL35o7kXqqRwOMfrXhQzJNEsHnhzyITTAxXLmOm3WvUVmxezT4XbZO1RXrWsRCKqZUe1TDpj5ZZRoKJaRpk405cpwLUGnbub%2FP3iJyjC2XYTf%2BBsHHbPrJZ%2FV%2F27R%2BvN17eT1fNpYTOn1CaMMdW4lneHQxXEMlbdc9zxOFYCKBe6Qg5USJLl6gBljjtLI22Kh%2BqE%2FdvYG8E7cJWkdK5kUkr0pAAM%2BEDU3tPwO9CBO53BLEmjiaNvi3P5VS7%2FGvoTXGAoPEAhnKOEX3%2FCBCfGgg%2BVQA7oZ0zFCz1HKZ16Nz6%2B4a2cT3d7pItJwrTYx%2BdIITVnJVHwpeJAOeMIBjmOo9k0j%2FGJetT5lbej%2FAmQdprWAiyKh%2BAbquSpmHQOulPAKaewH8Dqoi%2B1qTOBbegPNWcLOxJHShXR91wuOLmlo2ZyqyYzFzzBNxjpdSa5wxgoeIOp61CGfFFWDf2MRvCC%2FxC1xFXP1AXH4p4DYAIVTOEhoHGGiVN6XPcoUddJLro1IvNBny5IvMSL0cHeQsyobkwW8kYtiIxdP%2FHU%2BmSX%2Fw46v5nA%2BwQaycARapzBHOntlngYkY%2FkksklPHWd4CcGM0TV6UzAmqQefo%2BmWlKLarjqwoT8%2FSEgBxGqyqOSLsa7JFSgr4NhyVBqigLliLz1p34mGyWbyWvSyFUy2WuYCFK0p5iv%2BKZ1GK%2FR9xeNiYWVJRSay0UlkfeRXpck94QJZ2eyMfEHcZREo5Q8Yg6jNPTS9hXhmvU%2B4ppcdrKe3yi2szXmwnPY8qg4jEafsAXgn5SEKaIsbDjUToYtnJKe9u3Uw8%2BbSbCAO%2FLkqcSyfkLhDRISz6IiNkIzgShUTlAJ2QhmsaekuLdUswrT69xAzoDE6oP%2BLYDMgOT4A%2BKCBsM%2BJANucAYo0x8EMNWDqP%2BHM0hUWSXTHySYDu0DNqFyMyqoJP5LRNTYC3kZMIqldtt7%2F3XAWJvr8i2G1p9z1Ihw8DR2He4jk8D4muSkGw2lR%2BeoSVBzoP1n6euIWVZc3YDUmomFtJ0WUq0teiAthumlY1CWNDXabTJg%2FUTvn%2FHUh1N%2BHMGWm2uKa36NpMDvpFfr1HSonkvmjO6Kts%2B73FhaNEkmMtp81upnWE5dkGBLqfcKKSzKLR9CDGuNxJ5l3VcYWysKe0Eee2%2Fl11ytKdNH5lpwATdxbsD4yqGQldYUV5ij8OVx7F2ZGqVkgmHql3kphZg06wC0KCq1xuM%2BLxmbhgeyluy1530cureIQM1aWb8QVQAml%2BZAeD4sh9Kk502duwmQZUz7DyhsM2Ix3r8i6jK7KEwekFqopDOLEReySsjVLBmwmDkJmxqUiClLe3N5oBqz2VvPZXrFgnKk22cNB2LDQNr4pmy2MfJvzMcDz1SGdhNTyRKIH3STY869m14yPUqM9C217KZmM9hJc8R%2BIsLnCAgQVlYDntABac4HsKCssSHXHKVtJtQJp4O5HRSgYCYOhemIKj08s0kz4jsWRSRmLv2YrYoA0omOo2QuaWQCBJImRtKld2MWujQHHkjIZZKM%2B5H57EzAbWMLFhpEDISFhSD6ypwpQECmii0yKubQIrbWEYMpRLEC0hFaAIBAdpBrKZs9BtYA6GgJgJEzmfpE25vtMVsEBVai8cKE2Tig9ibrB%2B9awuYIZxwZIbOj0vj%2FNPshwDvwYP4V07c2w0%2FrhsURA%2B0%2FYJEWMKg1m%2FjpLOUQGHgj81lAZOYJAjBuJtF5bjYy4FgAOMlKde2cAjja%2FieQWvz8J2bTrDULCsmS%2F5x5ZgQy9JmETGAInE8Wthrt6FARuO%2BRJAN4S2TsUPulbFXWUBSOF479kJ1HhSxk9ob6iKsoBuduFNco5v6xKFZr8iSXjNItUuk2p%2BhlMae%2F0BFkwTWi4WSnZIn1DJoYuGj1kAWZdQek0UqueEt6Ncj%2FB2WrdOsNTVEMyFXnC5RipW1MponPrSpidsoRG2SSUfzEyfgkA8DpjK9aJauBB4IeI0uYkpKSgJr4gOGbYcSwZ2TuT5KbMVThDTgxqFN1rHQzjyFPtK82CrkDk0JHwZX5nOgQqOGbRAOJcY0G%2BJqxekhCaBaaCg1mkkPWYxPtWQ1nBD%2BUgFzNCscsRTTPid1wGE38vzh%2B4%2Bsee%2BzkIQGaCUR85RPWGZSnmUkzk8khsRijKhnBgwjVnGVWKDWBVkl6Gf1nrqG5qDcsxWVtwfaVNhtgFx8Fm3y2VTaQ0IC2%2BZprKTaDBCUdZaevSZOYJUisztIkbtIzl0iJT01Ii2BuZaxUda2xvcSPIfD8d7%2FOWH45IUZKliynMjLBKMgMsIrZdllWeZhW8VTpmDVa5t4BuFph%2BS71U0EH8onz%2BYL7LLRG%2F8O%2F9hOupmHepOHfp9IJa%2FoAkZss6joW8%2B8s8HowvXhd0zpGYK0QfPUw%2F2GkX1lTdxKBvYFn7qY6rzca3iqhA8kyJC5xbVNfuy9TN%2F3%2BqwYDEKVu%2BpXgI67cfDbGh9RLLUzbAwAJ7D1g3iXwUDn3BIy8%2BnogoYrfQyhaoBct9qvoKQG1ia4vnjbRaQJ9MwN85MjVtKdxBxjgpMfdMDYI0Qup1%2B6tLRnntW%2FLM4U%2Fi5wAb415pnloEzsKB2oqJfumtEcls7MQk2dpNMF7Q5ajHEEKyWPzzMZUX%2BggJPLJwcSIj75vkpiYhkYdPHU2mj%2BTUv2RJfk5T2ayIJEQ1IncogpT%2F%2BKpnsm1kISA7nKFdG%2Fwkbvpl40xGnRlK5gNNAYTU%2Fql%2BKKRL5Tl7FKWGrtMyKOyUsaa6HTUXxAymEQiSyVFAjlrGomNx5EwEUPPAt8i1anS6a5eyJDrUfo0UrpQecSSvOGYP8xZMonoV2kiGGK6BWAwS4QZyrCADebJQAI5Nme0mDf2QrxTF3soLzEFeRQ9MKhMdWBIOVN38NGVZhOyYnQA6ZvsRJYZjaUVV1kCP6rykqk38EdyForPQrn%2FqQgulJFw7MWdOmDiFRNUZqnkOo1n3UwZI6uSI%2BFEsDgbaSjdMJZMOkJCapykvYl4OjEhh0oT5ksb8InpEuqAdD6HmMjF9I7di3Ijg9r511LWlXlThsmCfAeSkRr6ix8zlMyPGZNfpyQpDcO98ORxCLPSE09RzatZMi1eSXQW%2BgkR0iXI8cPB0OeTA8lowyekk8BASI9mUuVTMTVhDk5UMnk9EzKkOkj%2FQ0yPAe%2BF0uaxIynKSaRnRCjExB7zKJVliEsduLGA55iUDNP8fiCdRDpaGk%2FHGzM5VT4WgUIXiEFUpJFmeuLCMW3B4IQrBFibeENfQIJQiwiDltpDiSQOYdml8zdUelxC%2BrWQdpPyCynMkEitUEB9YZRcRtcDBFe8QRHy%2BShRbVGgXymZIxahUdhh0naynaGYLnSNYMJjl%2BOYI41%2BGiXifNuPZ8iJYl84gG2HtvXEtvhkwpxZEPCpxFQ%2Bk5g6RBdqUoZAzUBy4iXpbeABm6icNVaXkc%2F2Kbu5dZRwW0zk%2B5FSJUIRM6zUSixyC3gDJSaKu4AJXimN05Gxh%2FfWEi%2BN0jex697Uc%2FlUxZ4UZdHJwj3wZHGfxiL8xsD4CDVgqrQbdQaHoqRnEQUkvQoqLulZcU3SI9VbW3qP3yFgJiB1VAfmGTaAIM1ICa9ThggY1agNWSopecIu9DA1Mq%2FYKTEQ0IaNNsd0%2BRxT2tBCsmR9j8mRNZkDgkoX4IA0rnmyFJAPU6fBrVA5pQuV34aDnl1ERdn2XSezKSmFiBWSBdYF77KFRGD6xpcSfScCNiZOY1hMftOvc2ehIAoS96ltm9p2KSy9lCZV4ItPS%2Fg5xQNNSpWQokiEYKLglbkBEyFMEaT%2BKUheVDIfyiy0bEkZv1RgF8jCjvJ0AZXPrn3hfJP4rCsPvf4K1WpfMDydOWaFRNTbFxN7ZM0hZAkreS1JGzGRzyqmcggR7n8x1Q%2FgqObOTRviHIlTj4kCo3EtAN6NRJDeGE7ey%2FeU%2BRXhudLtMDy35jeNprR8ZQT8XsJ7u8IvyzGVK0dQHW4qLPKKoJ%2BAydduHEroe8UPR1wUt2IlYlbkVCBOQzqPE65miPl9P00QWqUeqzz7ubnip9KILLtzBY1E5Eak%2BbaOUanCWWYmslSXjcFWIE4jjkhXrJhmRV1UCLhM53z0BeJA503hw%2F7kyPUDey6w2lfuYBbNKmqIBHmMzkIpd2yqeBs9sz9NXbNnZx2TSvjJLOyrYAXC6rgo3REyRtLtwwpeP0gn%2FAp0P%2B2NBwFHeVSTJUtXZ8mNfTTEsWRSrPlbW714DwB8as866XkJpilUyk1cgXpcSby0lxcZ9ntcUZe6HwlHGfRbpJxoAuU6rBOAFdnmfIbKvLZMoJ7tE0trYs8e%2Bsk0MFW9zRntTVx%2By7UoMfEk%2BdTKuDCtPBeVlIuzLmAoUWdaIRMloOgNAYmFgn0ENcBUdFWzXKYD58MgJpGoMMggGr8QqhFQBpR8zomBFabuS6v9pyDLWplKnRsFkXQ0DDyBQFthqtdqoYTpYargqiTQcTJaj0LvUpBMETpSbubrnt7WY7pqNQWzBUxG0bo0C6ZSmkKt0uS44uy44vRgqgAMl7dTaWagOaFv0JyQChULqa5chSvX4cqV0JrC6lnXVIJZmcCy0FGkdSmiFkAAl34v%2BXPGvJ3nBbw4EELZZpk3U%2BhjKF4bqBIhkjC2zGnky%2FQB5QpLRunALCFhxHP%2FtOo8qlxlnS3leDeCDGKF3AaswOytCOY2iwLh0hJRvKQGe4FlXVjagyUdWNb%2Bnz1moqeSR0yRnDBkQlS4SDhlI4HzTLhEKU5mZQnoa3UN9gLLurC0B0s6sLx9IKPknSgf8jpDOHx1joBPdI6ACFDu1RdpJEwXGlEZIo%2BIGUIT5DxAZFiGE09QqMpyhDaoKjmLTPpW0M%2BYG48FvDmcTaZXbmzJERHODK9WJxKPi1mkHVeRZauSMi310viEGaF023wIUz6JQpk51RlCEzpHaETn2FZWXkMc6UgSnqjplpgkzJCEyqouWFgJsPPZttVIudZqKddS9wjoSIl9GFm35si%2BN0f2zTmy786RbXuOrPtzZN2gI%2BsOTSxbNLHBY2IDyMQGkaNk4IbCEo1ws0vFPU9im2xL5QkKiCsjjBsqJFtGO7KNdmQb7cg6WusGHNl34Mi%2BBUf2PZjYBEI6Q5oX4PL4PQpwaHI6FpeESpYVjb1rSXV0ZZSK4oyRoluLyZUe4xYGCjpeG7c16%2FX29g%2B6vV65MUgmb9C9SgO2kiOycrWkJ9vLDDyMyvH2bOiNuOmk1mLsiQoLee7QG7i3PdFqVhVQ1w8YJ8ELx8zayNIyIBXU%2BgZWHb3Z%2BP0Zj3dUKDR1hXrzXH6JU8z9yzNhUzJagyRm8OSFQ9ucokqjbVrJG4uR5o%2FYpQtqYgmJkrZTI%2BCthMCHae0ilFzETP%2BhMY3d8cRwSocX3F7KDR4tcujGsjZmwhAoDTrslrzH1zV9Unr75SqtMSmu2KZNpKTLigsJbjhFdqilMjz2ebkKmyFIXRfud%2FEIv8xdOjM%2BSVQgPNE%2Fq9F7amC7s%2FPz6UHn9E2ve7rTOe7ywJiVkb4%2FFT2foj%2FW4dMnzfP%2BZTTcfnO0e9FqnT9b%2F%2FvNX7%2F9210fKd%2BkLdMFJK9ou9n8wkp4kvL8q1w%2BSbmF7mMrF%2FjWuxB9%2FC6Nqm4mLYsxu%2BrkOlEU2zhTREyc1XbNZc7ClvGFrrdsjcdkcd7cepR3pbXxlMIGSxFPLVNcDG68gW%2FXT3mHHn4Cl87KBh2lLhfNOmJwq%2FYH0xt30Vo%2FP%2BZbd%2FU9nXWrMjrB8p4sKIIW9wCtnXvOyaF7W30IUKxwsT1CxgL3yV647mmCptD9A1ifXQ5Fy0RIvqfdmaq4ntEZlLVZnGGErNfdE4zh%2FYPaF8Nmj%2Fy3DVurDUbsdX87PjrUMb%2Bh%2FLnXvThff3qxRTEB86o4jdjd2X%2FbOehpA1z1dKHpp06D4oRvlOvB9NZWExOLDVMq79t257S72%2BMDgj1uKVvRncfYKKux1E8pt7X1uG53tTXtop%2F95qLWQs%2Fg8TlmCHOINfOKrR4luJ8r1KRiHiXcEXcMJdj%2BNTi5xs3q3Xhw6aOCKPfSIzlfksz5RKs9ndiD3RAD2vRYdqqpdyNdsNxr9NFAyEyLhmbf%2BrPRiIc%2BnjG2hrtSQE9HJOBn6Wh9NFPx03iecCDI1miSyRnaaola%2Fg3U9GWeFWR%2FBfUZEpaSMv1m0TOI68chh0AuBhN8iAjGNTaPIbLBlkpm7jUEC64GghnTROCOSPwJ12nm3h2AB4n5XY9kIMJ9WwjO3WWzB%2BTNuNK7HF5EcgYzcVlKxHxmCG40mE8Uwa8LU88SvG8IHnZMgRX36MKlV9wZSIRUCnMZwmZetBmwmQY0uNEGmgWkuOvNGZrG0cAbcjChdLYTLL5jbLGYBfCLUVmFcdsDFmkcFdj9hA9NadOyREF9XXA2E3vCzMjK7HmyFadLuu4NpifT4E59RJc3sj44JCPtxyZc%2BZg2Eymon5loRj2EFFYmZmViVkbQxkZ%2FO4JITPB%2FxBA86gMnwmII1c1CF046AbpQoGUCqKBCy7VhLdxf48pn6OIKhWNmGu4CM02QrnEN2MY1nxrRQxF3R8SVSA0VUrvDNUEQqjw8m8QDdzMIYOYO%2BCYUjflkl4EoYAwkiWfowvZh4ApoSjBSkt3SQn97SldZOK97iHx7H5kgu5CJ5giMXkrSYU%2Bwt1uky03Kmpai7UU2%2B3JFemrlTOzEzNa7WWX3AJ2hFQcUk3s6s2YsHrU8KCajsqrcFwSTLKcKfG1O8YDdzbAiQNaVFxgkHCcSBS96cMKzTSdpSIle2VCPlJ1s6LkRaAs%2FMske1htOgXDzWkABw%2FTyCwTDb3YN9zz%2FXZdXD%2BHrigcpvbfoGOP2wsysv3j27DuHGCwM%2F4HKh7DiG1Kd2qFVY329seY0VhqiD6o7S5mXRQKjSVVyrZwfZwXswsClErU7BD1tPGm%2Bm%2F82fzZ%2FPv%2F3%2FNf5wfzNfL31hBdfKhi%2FTxdV%2BBh7F8876%2F921%2F%2B6aPa29FeURbdW79%2FN4s%2B7Susuhw%2FhKMqfSJI6f3JPQR1VW09O50%2Fu5iYM%2BiZ55LOil4KPqPNHj38ix1Cm6LUyFjcMAkOGONr9LAYy9qbppvPI%2BZuz6nwPM%2FWj8%2BiR89j5yfnpJ%2FP5xuH8mXMM%2FwDkjov%2FfXhhNOzIcQPHnThuiKkxeuJ18W2Ibx59I%2Fe8Y3wLyFEvuZGF9xmkzUKnDw%2F2D52%2BC6%2Bh0x%2Bi714MYd8fAfZx%2BhOnD2Uipz91%2BjEFylbRsvXHUH1AwRjKzEZDeh%2FhbUcfK792BlD%2F4BBeI8Dv8IJuD9zhsI%2Fv9A3TMeZR6gwgEXIHGLfEGXjwunEGkD3yY2cw9tI%2BvUP62FGWBAl8QslLjP3hDT5ilBPclPAfOYMJvNwp1DeB7BBeHnQmhOrCCP9xJPSB2ZCCQVQifC6a4P%2BAgi7hXsR%2FeAroMGcACVP4%2FqczgB4lGDfFGczgFbr4hjVdY%2FgljMnUx%2F8ZTDz8HuDbyBn69D8a03tE71P1PqOPhN7J6%2B%2FQx1LOkMKZw9sf8NXHIE7DCJ1uuc4QnoydIZRMpo4Hkwzj8Qbwuow8er%2Bk9wm9A7wFKtqT40FKiHcJ0AF8xzeMxz68hjd48gZe%2BAElb2bOCCpGMjShd4oARVGg8M13cGFG%2Fo0zwvjqwXBA70P1HqlfOvL6zBljNCh4eVPXASAcXzmXrnPpBTCf%2BD6m99S59OE1dMjxsQsvABcMG%2FUHnLkObFqflhTIMscP8TaNltHXy4jxa8hh8tTxZ%2FCCbvq0Kn%2FAKP6YOR%2Fh46OHHYB3%2BvaHExzCa%2BQEkBUAQAYEmgGBJQASICP4T50A0gbwuoT%2FAP4TJ%2FAcNCBwVUQqmDVY3wDnIyBADQhQgzG8MIlGHcDT8DBWC0sZTNyP8IafMKIApj5ACA0A1gJoNHKHkB3Ba4D%2FH6%2FgHR5GKAymDs5aABVDP6D1Gbxc%2FB%2FiG%2BRAYcCIutVrZwKDm7gONgiNOdTgxI0%2FJnhFRlG0vHCGXyABimD6R5jDCTQK%2F76KSTT5C14jJ4QFCfvwSlR4ogm8sD6c5jCEl1qKECAUFigEKFRrlKfH8MQMXiH%2BQwqMKoL%2BAaBGVFGEaRhDL8J%2FeigCuIhm8KLy184UygNjOxrSO77h%2F2Saxg5UMMVAWR684gC%2BQFYEu2s6xQBb%2BH%2FlTBMHKpymh%2FAPT6d%2FwH8A%2FyH8QzGsBQ5HfAiaun0J%2FynsIPx8OcQ3eOYWXvh95MBZB0DwpwunzQCDcFEgLnyL6c29Rh%2FdYwzFhecRnUnwdu3EUAiPvb4Tz%2Bgf6sP3EbyH%2BNWJr5zk0EkAAhMXXgH8Q0ofXpAK6DoBDJ0Aik4ARyeApBNA0QngaHIB6Wi%2F5%2FCZAA%2BCUb9G%2BDbGN3gGfiCwJpdOArsK2CL4h2R8Qc2QgoCS0IIkMOkJVA%2F7PYFFgf%2BY3nBlEvwOaVNUncEP9dVXH7H6mKmPa%2FiAFyRSSDEMOIb%2FMfYJP2L6oNhj8DysSoL%2B5AFO4H9Cb%2FDYDJJgFqCuW4xFlvoUkcyBtUzdPr0N8A3QDrx7%2BDaiNxgr2k%2Fh2wTfEHbxA9%2Bo7BTfqFCCbw7Gr3LH8B3qG8DY4A1qghrh%2FdKB3sEsplBVSEHP4OmYQp9Bl2GBZwCgsIrRH%2FQeOIiJZuEl%2FON32NU4IhoQcLLObApUARIGfXxLkZhx8u175cNr5uAuvIJkWpErePAqxH94qYW4AsoCSlGdqBIXOdfQh%2BtD59p1rjG8GqYO8G3qXIfONbz%2FCS%2FITJzrmXN95dxA%2BRvXuaEWbibw8pyb0LnRDcBZcEO130K5v%2BD%2Ff5xDjP52jOr2jjudYjBAtw%2FUwJVPoQ%2F7g8BDgqQfAd8LmNLByIYuYhogVqhO%2FBbDFCPNMiSCBSMXpkS1wCZKiW5RwQSReEGnQ3mkASBiBr5PkRQHkyESMxRp0MUuQr2KBgG6BrvYx5b72ERfN9D3Lt0rInOia9qFTp8clAHFg9HV%2BoDv%2FJEPm7lPQQH7UapLIf7wIwDCvtI8VNSPpoiG%2BucQqSeiinysLI6uYQP2cd2RwLr2px4GRFAUDNBF2AJQRxgTb6AmkKgkmj2ilNRY8CsSkYpmUqUpViSFicwKkRqxg5Er8JcqrwqrARIZpcviEUUF4IsqczlESgtJKdTP00QVHrYDGsqAZkc3gQiCCCzVUZr2AU0XUlpYf6gqpcXGwnQQ6AHmEAB01S0SXhg1EemvOIFWiSSbTDC4HpJiqgVA8H5ApbLwl3gJGE%2BINAMqLV%2BbwVQ1jKgZCDW1UINEUXCAY8ZEq2GPYF%2Fq%2Fmi4GdDeIRrOozhygToniZTTBF3secNboup0F5G2yxgRpN9mUxWEDik9L1W03khRflNaLUXxqRwKmYLUXuxOL5HsI%2FVs3QGk%2B2ZAhQ5p%2BhXlh%2BCuacAg0OWQFIzgLfHw1hgpQqyU9hCkBD7MGlKBijiM1Y%2FLQNGHybgcC5TmgTQeFZEYOwWfjkQsAppDcpGiOHqISHVQgyxY6CwB9o3oRUU0YgjEEa5BHj6ULP8dBZFAP%2BKGQVpREZEEXoqEpIXV1CQmqxIqNQ85Wgo3ClNBeBP24njmA5UJuPTSjYcEZkhhKpITe0NUJz5AhCfi%2BpwXRRLUQxo0jWCwKJECtOxrWPGzzenT2vi0NkiXKuJUZdEs%2Bhno%2BwXQ93PQ99FWGahVtWi%2BWjRfgaafg6avQZNCoGKLiaJhgfDDTwWfRMtSXkD4JFD4hLoWZIgjWCCTIMMhtKMzlhtJXczMCgEXFiicEKhVCfQuInxO5C9idyR%2FsXpVoVrVYIFnggzPBBmeIXpYU8WwUEG%2BEoHqjur2BIPLIHWsSGSa14AQTKAQTKAQTJDNMtHM3m32Fa9IiHRWU0RENFahcE1AUBTkSCNQSCPQ6CJANBGotUDCOiLKmkroo3lBYuMQNN5A%2Bz4irR3qfd5vUkUjMlvR2nilhJONNDfuFqS4vZt4gIQ3pCBcIwmOnB9S4BPKoQHhJQ8Q4hpLAkWOfQKinNYn7GOMXKDNgZzS8WxxAGHeDwVKYTZjYQ6LYY5b8jzAEBo0C9BbeADtKh0lGSRSHp%2FRsApTrJhGmmSk6xVxT32IVBEM8BpljUV5vSqMSELEPmZkNV6HSO65Nw7Z9yny3wvoE2dA0f%2B0rzUr4E0hV03LlDAhMgSKKyCegPgCeKevi9i7GhymeuiIGJBVwLnE%2BhG2gWPAjQ9Mg0u%2FQpW5eDbVQARshIq5i8h%2Bek3MAzYOLAT1mfgK5CQwjZLoyCKWAlb%2BT3xDkxXkLVBPBTmKiBiMjLnIeAy6HnKye2j8hibOyG0AKavlYLpTipJRvAfSP8R1KAYkUhwIdgSZEPwZ0vEfAwiibS96sE9SP0Vkn9CcAHsy7Ec3TpITZmj%2FhKyK5wKprlFAogixhCixRNNaiSK2kgW1lShyK1mQWUlGZyl2hkLoZqxNOIhUrHiNlCiwscIwdOQgt6POhiwAJfI8WJdu%2FxK3V4JawxgCdhwiC0QjCDyMgax6N3HHGBU5h96EwDFRHQ3hAEdeSBfKoDnJoTmh8LIqeLpikhBy6Ns4ioaaW6KZJYYJ8XqguSZcAMU44XW2o46HZDE12cyoWM2u5qLGOtSf5qmKP%2FQ5RgxW9pUgOcngFJgsOvkStfkSvfmA6yLyPiEMlFy7U1wIR29IYsPUzwE6cnfUbkF%2BTH%2BqXYgMGe5DYsewmKsBARkzV30S%2FiT2TD1JWAK5s2zUyKSpceOIgSkj7iwi9gzhNoU1QmJLb1UdlppGqbZrSiNSexYmgk6yxdbNdm42IameAVoM4ujwFCamDs%2Bo7JAmjkfPHdD5Xkpcnjpv1FTm9WgY0zTilYbQTCqMTCDOFfKBPkJsdtgUzhoVLhm5QqKzaE2QL1TMIQHpFTV2hbTZVQaUVzlQXilQulI9u9JdI%2FMy4BhxYq4RCrMw3SGhEmQfJ0NiICNgGWn%2BrvN5uyZcdZ0QE3tNs3Wd4QwkCm8w%2BybvH35DBhOavcn6d5P370Z17EZ37NYNPy4Jv1wdE5xyMSAI0oxMtA5gu79LB7JD7hscUvtRJzYgNaDIh70cp6DDBWcEDACcswmF34YiV8SbIB3eI47JIerTS9Vc3eDXP0cEL3niLSIxD1EYCqxhSrS3W4einjnK5TYWhznH%2BZ78hbELnbEb92HN4akslDvKltDTh4MOQ4ih6F0G%2B7sOeUdOvAHKnMbqfwRn3wS%2FTP0hEebXWZT75NIfpXSLC8O%2BwXDYSI6qQOZIANMUOcp4XNWMGkdRTFCB18Y0cxowiUChQjRk3LzQZSgYwqGFbokciuY7pvlEiKApu3QRxQIJj0Q3Huwwr%2F7whvgG2tjJpfvi62%2BQxUCxUArMPgxHzxB1AfABNaijeENONqdwCIUoV4pHhKegK2qskK6rgzwFAbq3kKPqyhcAXTfA%2BtJprDwM6FMlW1cshCFGsSvwuBrvCOjQ9AV8gT2v%2B0rDpnUa4S1yjHQlra1WXQCavY%2BMPT6dcUNDBAbycJ4QS4VEOkwYmrLR4AgZp%2FELag6%2FYXOJ7gw2C4CMItyEaHJESjCrHiw00TjYczoL0V5s6hF2U8xb3j4%2BqUFYTw2mpTFWTLOHY0SXewjP5I%2FGUb4uqDJYbS%2BbQGIErjGuE5Eh0DmYcvitLg4DJWyYxShX1GuBEwHdJS4ED3Eqgh5OnPFiATS1hg5O1M5VM0Yzo9q4ItFirPlrBQBqS%2FcTpMhoDRLan1g0jYA08rCrwRCxEEE1OfBRZ3IyGwPVrqYDeA2cjlu0rBt4Lka9RPQYRiGca%2BFHR0XafAE9Rcyf4QpsbDF2xUK7Klo9kouIbyPqUQbGuIWpx4UNjlIsvYouTFAUa7yCpx6tfpIPHjcWIqYhEDfEDcNsYMjVbGWmngeYC6ZNYRpsjE71WV8xLxphwYrTmQAtK36E8CTUO%2FmIS6RKoQ45VRGFRLNlQJ0tcaKzs5MlRIgk2ecUOq5YR7WTblPvhRoIog4SEihHvw6BvQZZ2PuK30D0DJWr5aWF6rtDvJRFTZIQbz2miNMxdhHAzRS3ASzJZZSobiZ6H8OhTAIwPTUYXmCc4y6aAkKJNEzqB5Gwt1rI1NPa43igIzYCNAZjVFhItwgn4%2BLQwNkLAT6o3nwxsSO0yEPfxf6Sz4lEzbcSOQA2TgAYFjiMmlLyRlwL2Gu4niPc%2Bjgc8syHTC%2FM5wucWUSyeM8JVL4%2BmhBQcPS091H7B2PgBalG2U5hItDFkOqMlpUBQkKZJqGChAIFwIQg0I29bH8OPaDXfAxajhOCZwiSFNPZBE4OH0GfaJAc95DGFNZL%2Bx5HRKcubn1qGKEo6ye1FCLSCIEGnEyznT8ArguHijMzXqA%2FrPIj7FMNP%2BRlWUXaibNFT4jipa1L0617rEjgWzQxgGNreku7BemgfLvjGaEEkHqx8Qcm0u5WYt%2BQVsekauooHP3jLupGhbBzD6puw7NU0DMhYxEWEA11QjPYman8tGo%2Bj38dZxjN%2BsQeR3j9j1diyNA4ynDOcbNDH%2Bkxhfe0ytSGc0o5eMngSVV76CbRUcGqgFtAgebQiUZZNcAZuyHpvZe7QJJpN8ymX6yZQGuon1un5xJ6EPXb17Ns1QzeFiSGcpc4E0ESrUElt0Z3Uuo7rU9IE5GPAKMHZ7MBpxXAsTgPwyh8ApuItgDU5ZKEBYUlt1nlE5TbpJu8cRVyA0%2FKQKqZZA9QAVKOQN9la7XhvMHGsLN%2BoTGsJdMgwrITWGYvluoFRA67c0PKWmpaewdgbyuztcYcgBe%2FzM9%2FB0gOUXGrXQ3LJeW8J40nom5eZdfslr9Z58771%2Bk4gMP4YhOD1b1%2FP%2BxdPF3SL1swQ8GGmCy%2BtzYzWfs8%2B%2FKoJRlPQ%2BmEKUXlM7G%2Fq4z6zGxujV6YAsEU%2BTlMjNa04vPiOC83UW03hUkz87ips0JaK7waawxt6p4N5eKfaDtdXFOyg2EeTtRf0ca6KRdRXVbG2zz%2F3tbVd9BobH%2BPELd%2B8fRHE97uo4%2FoT%2B6vjngNvKSgj4jJ91NI1BXX0kjEslwlsSI6ZUkxOAtkmaEP2FpNOPnh%2BIeFb7cKD5ce28hgc2M6Sy6baL4zarRYU0W3FKylf1A7K23%2B2M%2B%2FCoax4S0O2TQbkOxCmQFo3GNmgJAm%2BMsVA7pDUg8ILBJSmKYcrmmE3xhyOxjY46bRlWS1yS00hTBpDWESlGhvg4cm1xk8TDjRucIDKt1Wnpt7oWNdMcI8ZgghncRwZaKNJh%2B4VJ1kFAlENTO0VIkbwFGYtkw6h%2FtpFeM5NSbMCDFkPYhGIz6DQvCPhmJ56ljQWazjLJOfWCafSFnT8ELYBLDO4vOSDZtkmkah86jeRQY3Zdl7d7hztn90CCf1Xveke7jTNcPlyuRCW9MJc9yY89LuZMSCSChg7N3z3yGnZVAwhncfK3FQQRjkRMFGbuZc4rWkQyqbkM7J63caUX6ydMRCqC38zlAk4TJlxhs67sB0s%2BDE2olJu6lcuPyjBYRoq2XMXonAwBHOBMN42RaD90MxjVXDlcxBrCQTCuCjGLY4am%2FE0QQ1xpLJmnN2tHu0qW%2B1UB%2BKuIPMo400A%2BdP1y%2B2FEGKrja2Nntb5GqDfm%2BUklpb8J08bKhnSlnzZzewHEPlaOiCcgq%2Fs%2FqsRXYvsvqnx2L9LegjLFLfD0f6W%2BiGUGCzol1VKRSthJCzfx2z3QjTC%2Bj247p7qUTTJMpInFmiJnsc9fvEZM2mTjQdAKEjzm3Tf%2Fli7n%2Fzaj6Cz9E3r1oAajAJLTuYEYqp6uzbztmb3tFx96SD6ITBdbEucdc%2BGNwgyOhhzfUwW2qN4d3tJ3N3OJwDLzrHe5T5IPhrTgPAdxRJ9s6T2cX7920fSsPT8PAcxad4YTwfpH%2FNhyQuggJY%2F9C%2FwoXFRwDQvD%2F%2Fgje6y8lrwY6ggHw%2B9golx2nhR1DMQeky%2FITXd%2FPn38xfvmjlOcVnJu7NfOKH88ksmIeei5Iq%2BBxvzaGlKSx8mM5RL0L3FDoRexSXEgAmhZTzkX%2BxGF%2FsTajeeRyl50F8MU8uA%2FiPVSLd%2FBT6szXHu6d5MuvPScia9QobyuuEUtexO8UZgGm6ieJWaxm0H%2B3tnXbPep2D%2FdeHFqwonEHqmJ%2B7QMKH4sHDPCa1f%2FhPHDcoz3BTw9mk5aCpMFT61et3ksSb9M0AcLUsleDU2aiwUwKCvtS7epLFIvdg1FxiRoy84nIaWdkRaySrA9FI5PTJl1g7IiY1kgx8ZeSqQ%2FEenC3ygw%2FA2sZeKLG2kHxP1lZVXI%2B1hbI2p1jE22Y8pczoZoIgKNU%2Bd9f%2F6qz%2FG3DF9Wr7Du6YTFN4EqCaHCIPa66j1bMge5aQ9BI%2FKHrT8Vgo%2BJrcE%2FdwY%2FZYZjyE6IQ8Ppr211BF7dsM1yU7dMlcnXzNVDbQOXz9rvO62%2FulcyK0wmIC6mCHVVXuHJ0A%2FjnonJ4KfnO3I%2BbVZEeAgz2fEbCNPXOWD1ik5MZb5tvnkHvbOTTDEzeO%2BoInmBPBvcyp7FrlVPIpcaqc%2BVdNlUJnR8LMrxuV%2FY9BfDHPgo2vWIkN9WpL6SzROIUa339v9ODHH82EH4yE71mC%2BQTr4u9GPx79YCawjvb9BCmTcs0%2FmE3%2F7W9mAmsbKP85q52nbG2abdXiz02KyMp%2FiV4wiY161PRHc8IRc8Bhc0R2c9p%2BSJoB7ZRj6jWkrH5A2um8%2Bemi1S5fYpS4AhuTzcm7%2FCDf7e7tH%2B5LY5K6Xj6WS%2F4zy1nOvYbMvW%2BarjrzvWW4CjWfzKYO%2BPfz31sXT4F9Vz8%2FtUp0Z%2B1JLZUj4RESgXZ6zXbfgzJlflujnIyilJll3f3io%2FIehbqv3aZW3YpoKLDdH9W49SiRbdXSHjpXKkDS6nL3k4UnAQCgtZTvxvIdxh7C8v6Sp8rpF%2Fx65159YrWXprEMhWoZDRh4kcOuQIo5zqty9gYqhaH%2Bx7DMMlm4now2rFrMbIt%2BGa6Utrp1jwrsniC%2FOdk%2FPsjYkiqBiHQnnd9HNxrlNVM7FpOr2j4%2BwVGc%2FauqWdllnui8mI54nYbyJxI%2FNXPs2eI9FEHduyHn%2BNuqCebtp67Icm%2B%2Fe7B77xOxZ8X%2FzBX3chRiFZ8v6xa5KUee6CkyRxdPm8UfLYMqyzpm3Wb%2FX3FfouU2ciQ4b3fe7m%2FA5dZrVXdTXWSVDsuelktHuzXW0VaVvLYlTQ1IgCRUIAAigeTR9H77xpEXDlJZUs9OvWIekRmZkYk8IiIvR00QXD1s8s4HB0KjBVb3FjlbiTpxQa6%2F7GqM%2B8eePSPePs2MV7SeiWx%2FNnr2PaD06R%2FOhp%2BYilt6n1bYPTvLNYa3gy1J3RL19PWTi%2FY6bYuLRIa9w7Mz8Psm8Cacgm6Sf%2BTW150rdPuL8kkVzj6xuYuXo%2FdOxt0F54u3jy866y46SzqK1D9E3uo0iD1czd6a4Nbeor%2FVsfcoptpgHJraqjA1nzSq4lBD6J8xTE0cmi165wrPWqD6b%2FMU%2B5oA7v28w7vaunzcJ14qsEMf%2F9Et6u%2BOTm6F43ialZX8sO9FCRdzjQ874NrKL6N%2F%2BsSvTfwzr%2FhvTfwHGP9GXGf%2F16UKbm3a4G%2Fd7QznL15c9ezAAPak98Y7gDd0L53AziV3XVkT8J6fP35x4ynsgMCmrmt%2F9Jt2G1HFu4MHrG4f7Tob5RjxuI2mNYhXpELEVblHv%2FmwI2HOjbifcfOa0s8v4aM8fnvZt%2Fq2%2F%2BUH0zN492UzcL8g0W5XB7bn%2FfY3j3o34qkL5q6Ae0Dh8%2Fbx953G2kGjbC56Zz5VUuTnccu7x846l%2B3o3KvYE%2F%2BgaAlZ947HKky30k8X0c4ChyeqX%2FcT%2FP%2Bue%2FVMyI135R1ehyrbm0w%2B%2ByZO%2B3SLXn44ehjsH6tudDHn3nZkenAr7d6GxUNwC9gQ3tqcgcOotYJu8hKUx%2B2gh3mQtvaiXS7i0%2FfwLfvR9nA2movxYHi08NkC9%2FXcmy6rQbv88mW19YN7%2FXtGOeDLltZM4l6Laxz7RpdZPs%2FwphhADPqXir%2FkWl27mnz07s4tfq2msZ279UlN5z%2Bim2vx6DKe10Jji0ZGzmwbrEPe479WF%2BIH4wzvnkAzDEP4ob2AnwjCaEJHavHsRFgWaTAen1zRs3fgGmoXnUoaiyn8SvitwiIYA7iawA8A0Fr4viS8kjJa4g%2BvNZoEeLnXJE3gh1Hw3ke89nFRiDGZEZlLMldorifzmbbPoM6V88FYu4b3wFnUSYQmnxhFB5%2BvnizzAM8kwS8OIihoFOLtQpMgSmQQLfBqi3ixEAFf4AStMJiO1othMMVjilOsBTSKYDrG63JAAgLnZA5BE7yDcDpZ5HKsrJhtZWVjbWuAtmu20coXZCRsFmQpkyzIB2ilTKNEJGhKMgggSzbBQ2WYxnhF5BRPf5IJ8IRKkFBGCSeeUBoJoydYqmRRp3jmkzPCJ9XBFGwUZLJVj9nEc7YR%2FoZoTFZoxplEKx3FbFVkzUZkZWQVCZrbYErZgQGJZlyNGZcuowJkTEGWYziduASrwmzAonzAhraBlzuFGVhlvGAT6CkIVEKCeBCsxL0zwZQTodcZA9ytUkB8Olgu8NAnVBwd5p4K%2BmFGKh8qPudFhQejILNkEzwVItVUvzV%2FyVp9ypqru1Yfcw2dawrNFYwKL84Pppt0tGazGEIfr4IEO00yiSET%2Bkj0XYBMvEguobse8OzPGI0IjRVfwJlVJ0M0yTg5RfOUd2klmcSIspgkZOOtn2yFQYIn1dGIyFySuQo%2BTtbb4GNMZkkmFAJ%2BeFfRHK%2FoLIM0wts48SLOkO4iAt8U11DBAucswsuIwJGgI0VjIVZ0QRAOB8oeQUdO8wgKg2ZE5pJMjJoXZMRkZsrakgWmgFQEXsRZBgvOWD2gi7cB4S9CY4kGpI8mAQRD6M4gsWaTArbggYpe4JsMQRbPAmx5WV7h6Tbc8AY%2FSAfNiMxVgC%2BuCBFpx2pMjpodeJ8pmhGZgj0iWbHNVq3AtfKjiQfVwMjArPEOHahcjCRnFBnGunip7UjZK7Jn1VjZkbIBjo%2FCJgCfjuDTF9NwMkETiZoSKtuzWNkV2HgVAZjQygrqosW0nBRsJtC4lGOEDrFUEOo4BfWOgjtGkYzwntBFOJmXWOgFFo8AM%2FTVqQKjYxVqx4QdHJCiJWfxdox2ylbGFpp8l1BIRkTmCs0pGQSYLslEcIl7NKd4itg4ACzw%2Bkw0l2QipMS0BN7xAyaFlhRaUmg9HpMZkSnYQ18VbbZqBa6VH8w6KybXc%2BuCiVC5sE7IlZrQ1ISmFCrmZIRsMgTJA2vKJsOwtGhBEN6QUU5S%2BIEdiTmaC4FmATNtGVVCmYW%2BHXWKRhaUOSDlFD0oBTAApcC%2BWwr04mln7P18KSrM4QJPTkONwJAq2IzIXJK5CgT3S4GDgZin%2BIMIc7z%2FtAQHDg2UvLimsV7AuCloLiYTD50LHDRgMIYf3nyAF5TmmBWYdAUPZgUmxinxzHwgJBAtJKUqkWBgSGAYEhtBbAjYPMWjA29IARtroMJLBeroBH5D%2BI3GaOAvDGocTiRe3wcGTAE0PqzGNKiuSizNqsS6XWO3WuPYTazKOg2hQ6JJ95UwS4DmNlBsAFnsCwPNI5BPhY0D5ivIo4AqSsYYM%2FakDJypsJQsNjMFVFEyxpiwh62cPWwJ9rBVsKlQlS%2BHeSH4CDMCFOEj0P8xBAvI%2Bhiifxx8hH%2Bk9iPCgM6PM7Ag%2B48z9KfBR%2FhHqj4iDOj5OAELfpAu0PBRgAU%2FzAZy%2FAiZfyzwggC6JWCLBl%2BvkJE7JOeYICHDx2RO6NYNcjJ8ou6p4rhZaG7lRdrQzfBUXdQLToZwaEZRBTnJzMlJJt95VfAtBgQukG8ukIOOBJ09zgqyCqxWGHW1LchO40LZyl8pf8X%2BTCNkGiPTKJnGyTRSprFAGii0gyF1ZmDkZCgD0A38ClqygrG7YIcYAbcGDpGMOEiIkSCIDVMw5EbxHk2Jc3K0WE8EXr%2B3LvDSgDXAoEcXZKIb2nhB1pytVNsKquyFuGZHVrHNuDV66pRNAOUlOGFWYhMANB8VyhZ4zUo9Ba%2BCamDFRCI3J%2BiGNRHUqhJ4bC6UA3NaUybTtWIl2b53Bi7mKskC%2FxpvO5DBWigLA00Y2niptnYgjBM06enJKYOmrd3ViXUOrXMENSuuNY%2BTAe%2BGbAIzCzAH4C0SYEGFlzT%2FrgVbOEcviG1Ei3xU02Oee2uctMIIZyOsthXxDmhmzDwUbMP0jjFgdI00GRFITZN0muKERQRFirBEfUJis6JlGKjIZI0o0nKEkx70lyVRUaON2UdszRU1qZqzeUImqx6buXRpJ050Yh%2BMqA9G3AfJKiLVB5XNkiZ0KGUrf6X8FfszjZBpjEyjZBon00iZxsL%2Bph0M4T5onQwtIu59EfYnqJLCOLgbRlg77OA%2Bhw7TVSPVVVUcoSAiUl0VHUL34kj34oh7sU7RZmKTUklgz46oZ0fUo8lEd4JVuiAxhHp0xD064p4c6R4ccZ%2BNqM%2BSiRx0WUTcLyPul2zhrA79kUxw16paVH%2BMdH%2BMqD%2Fyx6XoyiGCOX%2F1OQ%2FAcw6dc1ga6VYX1QUNJ3PtSNExSWfIYIAhF8QtyIW%2B1w31RGClIdhzdOCd0nKhoxUVsopkAx8hF6R9QAuffEVHnYFJg4FcsEZCLtZ4YR5aGd3CU6AMJyXeElaExFqGxFGGWBEFHawAJnbOYsKcJYu5kiXmzGbOmTOdK14UeW7lQu5aqE6E3CkkpqwVWxFeflYu1aW7quPyh81wtEy3E7zIIo2pB7Et2JYaQBMANuYIh%2BKYBdxCqDT1SE4DgB5iSF7CAnECY%2BVYKclmycPYmK2ILQDOF3SdW63GtzFbEVtLHu3GbEU86CmLBz2hhsCIh0BlrWgkFOuxcUTasVSOlYasNCRix1ZjbTXWVmNtNdZWY23XaphTFkoZxIDSFT9Qf2wLtoXyYx8uJ6cjrhpcfDauBbkSA0sMbFaRCDThm4ZEPGH5TWqhjQRlYInCGPjiibLowkZwon6MLQ1JFgS5jjezOAuFQPWQVLjSQZYKWzroUuHLbgLUZSV3WckDtmTeSZoeLk0XlzyKS2aopBrapWKzpG6jUjdSaVqpNM1UjkvowSCkYNt2PJHjmQ5HDwJJ7fAqF4iuJw5JM4MF0sBPjtgBxspBA%2F3V0vUpN0wmV%2FXSerQL0q6F9RhX7IJ18m7iNulGyjMXcRYbl5vNTGdD5w2u8qXrdeg1ATOnrCbNmVMrJkVUe1tq0OfU4dKpukYdXQm3loRbN0u3RpyyXwmn9MIt%2FdIt87JZUjcfp0ROSR0yuSw6ls0OEIVuIMJpINqtHbEDjJVDNxDHp9yqgRiPdnEDMR7jil2wTt5N3CbdSHnmIs5i43KzmelsTANxvA69JmDmlNWkOXNqxaSoG4j1OXW4dKquUUdXwq0l4dbN0q0Rp%2BxXwim9cEu%2FdMu8bJbUzccpkVNSh0zdQNhns8uF0I1FOCOIcQvbDQwwFo0RxPUJdwSxHuH0EmE9wukvFqyTdxO3STdSnrmIs1g4vcmCdTa6gbheh14TMHPKatKcObViUlQNxPE5dbh0qq5RR1fCrSXh1s3SrRGn7FfCKb1wS790y7xsltTNxymRU1KHTNVAlM9mB4i6sQhnBDFuYbuBAcaiMYK4PuGOINYjnF4irEc4%2FcWCdfJu4jbpRsozF3EWC6c3WbDOxjQQx%2BvQawJmTllNmjOnVkyKuoFYn1OHS6fqGnV0JdxaEm7dLN0accp%2BJZzSC7f0S7fMy2ZJ3XycEjkldcjUDYR9ZLEUJJV2QhopURoxURo5URr5UBq5UBrBUBrJUBrRUBrZUBpdjzRiojRqH2nlRGkFRWklRWnVQZKlRslqIcnSo2T1kCQhQZKUIJWYwMyWlRmkEuSkkuSkEuWkkuUkCxWMZgQMySIeWEu2WMUjHQ2FdmNs7URZjQRbyRoryYKDZM2VZEFXsgZLsuAgWZMlleArlUpL0rqTJKWM1JKmVGoPAiubSUE%2F26Tykkp%2BlkozJrVqTCqJWiodmTSitXYxjHQu7FguDSRULhWdlGmSF8SkkYKlEYMlK9qkktql0rhJLbRJluMlq%2BAky%2FOSVXGSxHJJyjLJYqxkOVayICvNWpk0y2fSLJtJIxBKXkGTvCwmeSVNsoZIqhU1qZbSpF5Lk3oxTWp5WdKCmuQVNcn6MckKMmlkTqmFTmlFK2llK2mFK2mlK6nX4qRehJN6VU5q4VXqdTmpF%2BSkXqGTWjqTeD14QhWqXIJdI27bSgCWSp8nlSQslSgslUZAKpWA1DoB6QjJUikIpNIQSK0ikEp8lkpNKJUcLZUgLfW6nbTKBKmka6l0ilKJ2VIpF6UStKWSu6WSuKXSOkolekulfpRK%2BJZKFpdGHymNPC6NQC6NRC6NSC6NTC6NUC6NVC6NWC6NXC6NYC6NZC6NaC61IlQaxYlU65JSLUxKJbdLra2USp6XuNQodU9R%2BhapdJlSKzOl1mZKpYqRShcjlTJGKjWnVHpOycuTDGaLA8MVWxFHXSkMtjAKKRYkr1zKQjUD1QpIeSrVSqYsdJtQa5hSL2JKu34p7bKltGuZ0lHASrucKe0qprRLm9JR0UpaqZSsu5esvJdaey%2B1%2Bl5qvYjUihGpNSNSq0ak0iVKpeuXSqkodWJKuyh1mlr9L9W8oqYV1jtKXg6QWHmFtgGs9ZFSLxRIo5mUZs1AGiWlNMsHkvWVkpcR5DYu6RkxcvCV%2BsUkxSa1pHphz9z1pMu5G%2BJ4uCJddNnAl40EZCMF6SQxxS4%2BPCXOwbgj5T4dWji6NXw0PDVwdGv4cGTh6DbxT4c2PrhN%2BiMLR7eGw4dwSVJeJ9QlTHmdUJc85XVTHjVCXToxskOq8rr5jhqhhmaXYJdal1SXTpdIl0KXPJc2lzCXKpekFj3uZ7VeJ9QlzP2%2B7HXJc7%2BySmrUCHXpdD%2B39br5jhqhmubMbYiZ2xIztylmblvM3MaYua0xc5tj5rbHzG2QmdsiM7dJZosGbc4HztwvnLmfOHO%2FceZ%2B5Mz9ypn7mTP3O2fuh87cL525nzprfGuuKeH0X%2BH0XwNHt9N%2FDRzdTv%2B16YwsHKiw8cHt9F%2Bb%2FkjBuXaE0xeE0xeE0xeE0xeE0xeE0xeE0xeE0xeE0xeE0xeE0xeE266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E266E265w8SGaijHuFC6jmXaUyFWvShWwKlUAiZlzR%2FQs5riLeA1GvsaNSHGMm35D3M4Dxpofs1lPyg2wKZOxck3GE%2B2qSu2a6tB8ipv5sgq3pq3FPBySiW%2FUAINUQCKCLTDxiQCwgNtUDdP0EjtymxHdGcvdYd4dn9yhy8AN0EBMG7Rf2Q4qdkSxDcLWuO3gtnfbj0PxysmWYqGt%2FEL5MbyY0HalAviTMVsRW0u2agWtFbjW8BXbWpIYa1FirGWMsREyNKQ2keqxhelotY23MvFWRmLRIIYge2rkEw1RcsdERMaxnBtXqlw21Al2w00yYrVSLgNSkMhGi1QovdokizIn8Q2siK0lW8zDh8zbM%2Fc9D5dscVjKYcyLz5ldnyODbhaYEhbwSPjEWCZg7HpWrqcRTQmPSnLUEqSWH1XoKHE1K4mjL1HZa92IdSpxQypBQypJQyqpwtgAn4V4WQO1b3YurZPauoYiUQocGefSOumjK%2BgyWIdjfMFvTQe0gjU%2BDrEmQYbk%2BDEWJhink4SMCZgiIQOd%2BO5yij5lT0CWRK%2ByCFEE4%2B08wa0I66CI4oIWlnHjI72ouMaNimiAq6J172qL2NUQTFzATFlGI3upVhUXZn1x0VhfnJ6O1meu%2F95Zw5%2B0whMOx%2B3iZSx4oUm7jZqvtjo97RQA1Vo9YZxuZDe2G92NX1u9Ym0Vi7XVDtZKPciP3GBU5XJUeVwi7ePy6PbXCFNlnSbrukgWVIPGLaxbOHDMmx%2B2pYbGLgMTBqbiLUJWe2mnhQoLFVadyOQpD1OnOosbouhmtd7pSLvuaVhtYDXCUPNFWivu5tiGta3ASz0MUGdml1IfpVpZhO9bkSMzOqbMBGYmVMeuNH68NGhLg2ZcOlRZ8bI2CRhXXNuca5u1dZoI2oZ4hnzjimtLSW1JsU4TQU9K1Oojx63VZaNIOwrrEtqlYlU6VmViVSZWxbHW%2BqOwizVea6FsogO1VcqulZYoUrqpSGmXlspP3wVtrbHSEYWOKXRUoeMKHbk2sWsTvTbxa4NQM0ZOarq85Pko5dkpVT6pvJL9JXtV3FKFljywT%2BikGVWCdjvwpQNfqolAzwesXiqzNJ9F1qmVTotIOzQkM6BsoXQ%2FEVtLUv4Mz0jHQw6hHEJDSA%2BURXR6h6JptwMXDtxoklSqymmhwkJJH4RIrEFil4EJA1PxqI5UTHZb%2BNKB06yH%2Big1rJATho4ROxMLTQh6jSPCiiww4VODmSGrcY0PiAl2gEHvRqbagRDSMwEDdY2veaKVlw22YTGm5m79qxF3q2yaJpPKdWM82uwVaceSxviRGutH6tOMHqiPBQ4NERpiKl%2FFUk4LFRYqDJdQTE8cToJ8btiyEbZ0w4YNvGEDb9jAGy6dj6UzdL2N0GUztIk7bOIOm7jDJi7la06eVEM8d7m4RnOSklmTmREcOHiwUnxVDlpzhaxIOMSGfUYufOWQXuYEfmQ21I6ReqsT42m3DmfnKJgnWXWV5cWJcQ2Ny4aeGteZcd01rnvGdd%2B4HhjX72zKTiY2l6HNZmjzGdqMhjanoc1qaPMa2syGNreRzW3klMnmNrK5jWxuI5vbyOY2srmNbG4jm9upze3U5nbqVKHN7dTmdmpzO7W5ndrcTm1upza3M5vbmc3tzOZ25nwxm9uZze3M5nZmczuzuZ3Z3O7a3O7a3O7a3O7a3O46DcTmdtfmdtfmdtfmdtfmds%2Fmds%2Fmds%2Fmdu%2B0fffI4VeHn6ubhvFQd5HTZevtWEdJEcTwK%2BEXpkE4B5EgGM8D6ImTeRClQTTHN8mDCH7jAt8FT4PywTgofwe%2F4QkaQzRGaJyicYbG3XEQQo9dB5N1EOFzvpAA4AM6YK8Ae4XYaAzRGKFxisYZGndXQQzoMeDHkEAMKcSQRAxp4EnQWCiaH0SQUoQpoTFEY4TGKRpnaNwFA1IqIaVygmoX%2BEFKJaRUQkol0QOJYBqYBKaACSA%2BogcgHkUCcgymIsCzU3hWAv5P4AejSQWDS3UKPxiMqrvwuwe%2F%2B8FicQK%2FIfxG8DuF3xn87sLvHvzuB2uMgOaQzBGZp2SekXmXzHtk3ifzAZm%2FIySFOyRzROYpmWdk3iXzHpmUF4wSaBIyjA1oEu6IcEeEOyLcEeGOCHdEuCPCHRHuKeFCJ98Q%2FRuif0P0b4j%2BDdG%2FIfo3RP%2BG6N8Q%2FRukf8P0b4j%2BDdG%2FIfo3RP%2BG6N8Q%2FRuif0P0b4j%2BDdG%2FIfo3RP%2BG6N8Q%2FRuif0P0b4j%2BDdG%2FIfo3RP%2BG6N8S%2FVuif0v0b4n%2BLdG%2FJfq3RP%2BW6N8S%2FVukf8v0b4n%2BLdG%2FJfq3RP%2BW6N8S%2FVuif0v0b4n%2BLdG%2FJfq3RP%2BW6N8S%2FVuif0v0b4n%2BLdG%2FJfq3RP%2BW6L8%2BCa7BBC7pNLg%2BC67vBtf3guv7OEOeoEEz6giN02BSnsBvCL8R%2FNB%2FBr8HQQTwCOARwCOARwCrwK4gvCrvwu8e%2FO4HJfaLACJBGARBCAQQHPs5%2FLDnY8fHfg%2FdvrwHv%2Fvwo94NP%2Bzb2LWxZ0PHLu%2FB7z78qM%2FCD3ssdljsr9hd78HvPvxO5hAOvxH8TuF3AgPPEH4j%2BJ3C7wx%2Bd%2BF3D373cVCC3%2B8wDkXEmEOMOsS4Q4w8hNggVgA%2FiU8QL4OoClB%2FF%2BVBtAkivBpCjNFYoYFv%2FIKoU9JWdPCSM0djg8ZWnz7H6xHoOWF64jWgd375td8lmVnOz4SU%2BJ74GI%2FLzYJVyU%2BET%2FBsdVgGU%2Fih6Fx07tZp30CFFzw9DI5uRfEUH9a8tdaOb4NbdQaeAIPw%2FCfaVX4d3MKN5bMsuIVPZYcV2fg09y3UoWK8Mq9CIPxWnCZTNAW6swg9%2FFuEkzJHxwSYL7CSKFNWwjaaWb1Ai1JMMOOYIvFT8ujIJCRb4nHaW6uwpAdCb03DCqacW3hBB2ZJNlQr3sYZ3KKzvrfwYDNGgGj0fDC%2FsQ2FK1APdgtPhd%2FC15Rv0Vu49JbzLXqgCiyqGP3sKGag3XeynJ7Tvbr68fmLZ1dX4KC7cdBx8ezJJTjA9fj55QWBXr%2B9%2FPnt5dWPr9%2B8PL8kyNPzS459%2BfzlMwt59falhWrP28snNj56DI4JcaM6uAD5Ge%2FSuQpoFsdLldiRsAVfM8FaINUbm3jIc1IxIAq3ePkMmHUBjXyVBbjAHkC7CPE55bwgtgCaBx7LKepxihrDhN7tiWH0AhOaJJj3zgyO0C9KxzOqSGjQeVpD60EmvMwCfnMs4Gtq8MYRfn0eClJX0%2BE9KiS50ti6x8Z9OrKu1IGqGJTWA%2BtUCZJboZL73pkT%2FWThepyEhqMHacM3J9%2FzjG772JDnL6%2FCV9wq2AGBAbgChAcI4%2FI9CBQ9gaIlUHQEmgbtiAOTt3HNsR2%2BeA1N6%2Bn5Pyg39r15%2FfbVU8d%2FdeBO4sNPMPfd10m83%2B%2B7tyT2PUX6S%2BO2vfatgzd6Trbv2S78O3g5I3CyP1I7Ymy6hGf94H7w%2BMnTnvsSu6Dmq6b4eNdtvEbxAxpXH%2BjRK3xti33uq10M%2Bvb40e72ybu%2FrT8cP3Lxbrto5jkutBq49BoXZNt%2Fs3j%2F9cL6r%2B9CSKiNn%2BK1rguYgr76jEr4yhTkfPBjOJh%2B%2BOZXJO%2BVIe2n755%2Bd%2FndX757%2Fd3j7%2F4eiHo6TdZ9V1y2v49DmHVCLb%2F7af5h536Dd0%2Bjy%2BrDI4TdR9h9hP1l%2BTqnaEMEDRH0ePz3zQf1HT5N9t8aZKOmwo9saiQuwd%2FuTphC1RrAS8QxpeglwpjKbw19n7rWs30B5ffBU%2Fc1bL6MtWcg%2BNSTRIff4t3zSPWnuu4FYOnHx6Ne2nqzxr8Dj73jHz9EjA828t%2BHr%2FveI%2B7%2F2I%2BBXfgSkv7Tk6T%2F9Hoiueelh3397ld5P%2FlT3%2BxPPJGn4RjZ1gwvI5po%2F6GOQOUW36iLJ%2B9cPfqgnNj8v%2FrtH%2F%2FvnUcwbj6ku3XFt5Tc8d7%2B%2BBIZz8HNcr51qyfDh31d6guqXNMW0GXacUercviTdO%2BMxj9djls0un17%2BD3w%2F0byfnPxRbQdzLt7fa2T9ff%2FwZem36F3TAfdJ%2Ba%2F4AZHvvDwV7jDMe27vzH9wrsbU%2B97G9N9T6L1PZvdeR2s5xHfnsfHorz3ha8mrM6qpP0kVffVsp43mntfKFsl1fxTb5R1nmNbzeOyTdaqW8Jx%2B0Honoe7qQ7D9u3JR6hPnXWe8Crj7uvIIB61Hy2DFt%2BmJM%2FTOOw8s9YzgkPOwJC0n5EmLqUNzEXVhfY9jV6V8eFn2h6%2Fff7i8ur5q56G1KYZWminUtrPkYWdN807zWPdgWR5ux5BAm1XWPcdPHrstP1N404DxSW4TmLttCZ5O8Oq883CLlrYxQu7iNDHu5DFsNNt2s%2BwAWTUBQ1PemDtDIqkQ1ZP671K42zW6YQUUvY8IUcBIEe3PzEjxEUadp6X0xJsm7ywk7hIk6jTd6DKJ1d9IfRaxv6Qzst%2F4z7wNIzw9to%2BaN559p3AnVqky1NgEki7LbEHhrqr3sgUsEqi3m9R0zOcnecBdVAFn0rAKNzuiiq8XRW4yn%2F1qD12KHB71FTg7aPOsAJ5pmHVk5IT1E7NCeqkyPrKbnIa3k5Lw7sJoaYMRZP290jKSQcYp2lSdOZCUfRMMqin7PtqVXviXOSyB7qsw6gLndRlX2SYsrvzCEg2MzoK1NPF8GHuzqiAF%2Fd0PkHSSXiR16Kn4hW4nQCDx3VVwfTx6Znl%2BSsUSN%2B%2B6HlPk1%2BufJFDv2p3h%2FMsWcDXbUFf5jKJn5RxlHQKe4EDQfclzhSY5E7UeRh1X7x8CdmB7JS2Y7%2BIM%2FFjGnZaw8uwKLqp%2FPXFk%2FM6SvK%2FAjXtb3oBGcT50xgfSm%2BX92dcxH2S5nX7276Kq1VeXp9PJnHnodE39Dr4E%2Fj6ZYeTeBPPnnUmnSfzMl%2BEf47bn%2FQiy1fTsPvWKBD67xftuEUcT9r94MkcXwr8r30NNjn8GKzznm9DFnGfrFYPAisbJUkQIpsvLLjvVzcCOg8FNELtcr1hp%2FQbJa1e4Lzo2H0L5Onrt49fPLtidc7ls791HijyfMjt66OvG2DSXrSBSZrGMywRqbkOP6h58fzVn34NwtoaH1artIA3IezF61d%2F%2BiKC2m%2FFMkU%2F%2FHAw18fnF8%2BeXplnzPZm3KcV1xmzPuC3rFX8Bz6nYtTOAwYcP%2Frto9vvnsVWZ42wg4Q9f%2Fnz6zeduqAs%2F2yu4e8VxrjcrUWC7pOIjWBndaLTcg%2B%2BOeXxPqtbjf1vomn9Ab0fhpq57MM3gx%2Ba3ZlfNtj3BCC%2FZtLGObzmol6SJIH8zuXzSyg0KVyDX%2Bx7qU00ykf8H5B1f4ZpJKt6COmv62aMfwb%2FbLwGe%2FN3Vv72olmBYZqEIsZygqyTH334zE%2FfU0m%2F3psknXbVCu8MTK1wMz604J9%2BmYS7Ugvodvy%2BEjkvGX7yWx1QW6W%2FgspqWcflpk9tRQFfqLrSifupryj27at9Oiw7czc5A06xI5AAa9xW5GADF0VX%2BKSHO8JyM%2BgLxM32MXDfHV3EYE8ITiNtlkqtoHdFP5ByOiMWirPxoC7bojn0s7jnEXbi6zsapiieAG%2BcDlDg60ijOlDEqCPuPBUJSRabgamtNkNJuzoAt%2Fed%2BHg9iYt2fvj1MxjT9mbIGwg6mjOUY5B93ounhtnut%2BkPSMOO9JJktRj0KI2KuBwskMXowiedl9RUcxvg81gJyDz9rXEQp3H3FbYj3grUAtKdTCAItBl93MMxiJJZp2h0tWRH%2FOjVp%2FLWjzYz3Tt5HuHBrqgrYpkn61qJdD5Qp%2Bl11Chp3NH39kjVVBt9raPddTryP010bSI%2BT%2FddAZ%2BWdjsgape60FWSRfmq863Drnq7m3eedQTyuCPPw%2FAjE5Cy242%2FOxZArt1vFYoJ7vPq0A3ycX8ASH75qgum0aDzZeIQT2l0PnXYgYm8o2iIJcwD7WgwTopp0hmLxCqpOnImvjbV%2FnSbIu6NW3WymoTdWB7q6o5yps663Yn2YOM2qg4cVxg6g2neaadYsZ0P2S1%2B3wefdCt%2F0VEWhmUZdpZEYNzqjAB8%2Bq9bvHYt9Kt7YVjpiPPA9HZXRXAm6miWomTaBtYFjVIW1hX9L%2F%2F%2Bc492CeT1tkI0yic1jtMD5HM6U0sHtG%2FQ18l0xpW%2BSaD3gc69DIuB95FYlDlqgXDaTOwBgHZD6o4SVEv9sdfiYZhtzqt8kUwuN%2B3XdTG4zrCHRRylGxzVZR%2BjAyE9ikaMzwxKN4B2zfXEp%2F0vXfjs73FYvgQGqd2hdVgPmKI%2F7fQCE9QD743dv6CHASHuqnycZGFn7IHQebzeFwTf4O2b5134X151Ow6AX72%2BPEeJpae6oK9c9le8CrmowkV7bFDBXWif4gThGfKeabKNo4s9MWincBdsXuXslunl5es%2FP%2Bsp0p4qeNIPf%2F60D%2Fbm2Y9dMEiczy%2F%2F3oX3L%2F9SqbOfc37m8PneOPEsPBghzfuqK%2BmMEFj78y6Lh61s0%2FepgLhXn8obJi5kiOPoRS8Rdcahz%2FuI0YEX%2FUTp4Me9xBWfqraN7s1P944nUbjB9msiHJoR9iqb42WHqWqzMl3eps0DtWN0mnNnEwM%2BTv%2FwYXtYnidp1IEqLi3MqgNBg7wc9KZppqxOyDRXXN7%2BEJCWiAvuxChYb9XJDPgavN1mb8BeMoHDncRRb1Y6ZC8xr8JXXvsZDikUtbq%2BmfSNn83%2B%2Fv37MfFVD7vPNLNu8fajh2GBRxp2U1qL2k1TXI7IdlDp0QBC03ha7UrUshwDrBzE4WQO4EERJuXxo90srnbzOIx2zJUNxjFEinf4kPmuqAEzxsVGsCRynzs8J7ET0EF3eIEPUrarwiQ9Bjo%2F81lqLCIwk4cKqFWBO2gj5WaH2wNMUagA1%2FFG7BZxOYtdmpHWLyasmh%2BseqJOQFYZ1EP2bvTh0fEOAfG6gKDhCdRwms%2B0s0h2Rb6i2LhlBFG%2BkMB8f8W9f3%2B7J2hNh2SeYQxUEn9%2BztPsvzLn77%2FH01X4bqRREgZJRr1K7boVQSgCrUzA1yXXizRQHDLpo0WrLFad%2Fx9%2F%2BP6rh18fDT7w3utwLHbhBDjuOkU9EXaacIpdifvC8S6MPtaiQjgyMWDhNAGfExnQ40GVD9CxzbN4F2ZhutnGAyZxBz0z3exCCT0EqcQU4kwmZZ6RkKCph%2FazESBMDID%2FLvBilFhApnK209q8nWIId7j3CBPGFV46liseUaLLOkx3QAjni01QqQcH0DXIx%2BdvdngFCIy1O1463OmehQMCMVRQKtLg5VOwgTPfTeoSh2aMQAcVujWwI2UKwHBMhewAnNcV9EOinHol0kixsKceHz%2FCnXI7zS%2BCYwPFmJb5olvFmvs%2F3kVxXAy4oEolOqDOpwq604wfxMTXOrMJ1i%2BIimKnpSksA5CEqeYT9JgPAyDVcujja%2FAOtw8Okuh4R5oKGH6w3lEvSkXDRZcBRtn1fdQdnVnbwYwaFvFgXi1SRlqHkyqFCobWEq%2BBUrGjxWg7fOeA5Tl4s4a2v2HuFJe54yVCwFdqOipimVROw4QxKr%2BGr4Pd5hhG1CyGWo%2Bh5Lt5KAbERkAj4HlintelaHwt%2FojqQ3Gn2CURBJbxFIhJFkWaTJLK9pIkGwhoZfGAdx7CJ4IRPV5jo0syyHuRi6o1HyVlgh0Na%2FCj4DLAR8QmD93%2BGJsVNYAdvpGzw2elBrwmMGAV%2F462qpBeGquPqCfRBw%2FoQDXnK6goukH2eIAqoN0CNTlA2CJc71DRW8WfLjPE2%2BGdenOP1qwoYUkcSjXAvoVfmKtk51IIiBmqk6MdiuxUiJ2RjwY6lR3w3tg8Ie28Uh99B7WNLNICqxA6papaGAEEISZxNR0giVSpxzvcgLRjVhpKBRGYGi7N8SOiZ4e3FoKXcxioxgJttoTWth5wNzdcA2lwdngANpWUJaeB3dDwFGUOBNO2I%2Fw28zCd4qeGQByNRAxjVPTpyhdZWIA4UynmhBZKuXOCu0omAzOWCtSELWzn3%2FGgSV%2BA2B7esYhtyw6zSEk91gsXOz4Cq7EaswVGXLQGdGaSdroD7GkdXBAahpHLwru9yKThGbv6Dje2QQyYPXeoM3HKYJT%2B4KLPG%2FFkU2E%2FR43N8SMilU9rYs%2FGqnAGgCSLsZDYFJ3pAjoXfgtsHTuUoDxaNi0zIGeeMfN1I6aCuul%2FF0ezTQ5yoRA8gEE6xn4B9bLDIZ2qdjcmpcvxgNnTAMJZpwhdBkE4nX8Zl4cpVtCAojGP4mvkLHbraFHgF4rGx79qlbneg5ssaHPCISmoZ0esUyq1ToyDAC7iHr0bnn6g%2FSnDD0fv34tH1IChC%2BKJ76M73x4dP2oWhUv4%2B%2B8PkfjX84PbZ%2FoXowyj%2BNUHPDLy%2Fv3gYePQSDebL9qo8%2F1tqIwTdbDveEe%2BNW7GCQfT88GPBvhu2DhBeseeE929O7lCZra9NaXvbE3P1is61XfT7U03l2WP9jXSnoC9uz96c2jk0pPa%2FtrQfzc9OLm3kF%2FvK2RPwOcX8uue1H6FQnr3%2FPNXWkN8qNl0T2Vp%2Bm959iu1b%2BdQJr3LH3aUuf2wb9B4%2BP798d7OMjxphOz9SgdPpAF3WoU9Z141ZX%2BECrj5QTSnXn5%2Be%2Fns6af24Wl52GjtAn2ThRaKAp81Hz2X%2FNKqy73zSM%2FG0%2Bdvnj3p3zcISf%2FhNjaIO1cPBzCe3cYTnu%2FfX3zzb7e%2F3h0d3%2FmGrONHP%2FR9SYj8vcX9ofVVgU97oeRCqA2YK48%2B89PaBvXL%2Fqn2n92gFgE047XO9baHFtLlHt2gKby6PO85XAUzXyNhrbVsAHnob4B6tp6pXtiA2RGgASaWoI1MTbUB5NbQr2Q9tL%2FwL3Vnfd%2FuMWxV47p7nAKhyx7QolndzTYCqV%2BhMJrxCsPDgOT1Rhyzn%2Fj729idYLoOUT4ASR%2BcuEEJJBhw0dlGsH973LslvLuxs7u1%2FCt3bzm0%2BG%2FaTc5uL%2B%2FbVBkEKDc85AXtVkhn%2F7kbvO%2FSEN36%2Blroge2H1A%2B%2BfAviNi7mSdmzBZEDvmwLokncawsix953ivbzWCxneKK9n4%2FPn%2Fz54sX5xU9Xzy6enP%2F8rNlQ9zJk3V3F5z%2B%2Fvmhc5hD8YttwVqdp8M%2F23SzdRLpXQvSkcjNZgpKBWqL03756%2BuzNxZPXb55d2cADnPe%2BCuCqe%2F7q%2FM3fr5zds9914jy56t1c%2B6GHWmdHaeNuHGi79FFjQXcf5HT%2BqKGIthswOGZA%2B3qm6McrqdRgYduVGg31eBJMQdZM9aVLeIU%2BZBBH4EpkSBd4oLIjiGJc5goxpJqX%2BQqm501Au5OCZ7TLEpOOJ%2FM84Hu2EiAZFey8lSifBnWGgDTGd6XLIItXquA4N%2BleFiTTgG79QgPcvEmKBkxz71OUB3TKO8AT28E0L6lRJ1kdB%2BMyDq9h1LmO0w3kpxzOhVrmii2YLRigt1Sj58kLvuHq6uryzflzvl3r5bPLn17zzUevzl8%2Bu%2Fj5%2FAmmQOtUgdKhq4uleNtHoJSk6kvRTW11OdEXoQSTOZQeF9QDvfxMySBaUJPBgRQPWSCeHLj107VqCeA4s8ux30T3DxpN9k10RzDY%2FHdspt9zGRRwPvDfmYko4BsI6wb88hmijw9zjX%2BGwVbXeXSue8C%2FriT0RXdT7bvgxrC3f%2FjDu6%2BPPjxCnp8cX%2B1jIv8Do%2Fz%2BoKjYPxXcUFyFgUqsaFsmSgRFLqBlJxHqC6dJXIqgyoNQ5kmEN4GgbBDgeVFccdMNbV9Rbz98uBv8cPytYlOu3r9f358OwJxOXdbFBX9zU83Yp0%2FuGIocWcgMqdOeyFz7737%2Fy4dPq8s6ESz79%2F79V7v379%2Ftbt1Q2HeO%2BXxGd6DbWsTh7tCrCLQl78jD%2Bu8TA4tX6fCPpZpeXP%2BzOvqvR2yxfzyJ94V98BkIvqAtkvvTDbE17%2B9rjP2ipn9bfPfw9ldHPc358NDbVSEojgSX8UiZIPqvXbJN%2BEurtE3Bnq2stqZ6xkunGu58fbgSLOFfSmjd3jt%2BkMRfjwRI%2F99%2B6MxyeC9dHizC8rouvgtwB0MQWjUX8jGic8FTO7%2FejtbtYDc8fcay0ueKf7RW3CPzQdjnCHw6uUNSHmaDYxSkr3Ob5GV823JzNIKV8DGwTrXG5%2FbRcHL0nUW5ffxJhHCcTR0U9Ppg0eF9ut3FomqYFz5OjGJSJnj%2ByknCgn1SiUIXOQp9cLIZSA%2BdjC3UJw0YG%2Baxi04AL0wY07q5W6hPGuUkjBq5E8ALMwIZIm%2BgEsQLdxGKRQMVAR6YpAS1ZzUXqU9uYpIkwHS7%2BSmQF3YBstXHBjJBfHDrKp%2Fn1TXeKGHRDdAzhaRqYSdeX1aWrTomgA%2Fm6tpFW1374KzDomp0IAJ4YI5DMXfw0OuHlUyaaInP12wOUH7j07iEiW5aT9xaMTAP%2FMYoOvJBCN1GDj4vnCJDhUrewFQwH%2Fx4k6IcYpEJ4IPJhz0sIvq98PKPdP2Sg0kQf9wBbtHpJkBXbfmksgivG%2Fmj3wcvn07j7sjrgr1SWTaQl144ooEjfHCKwsUpCh%2BcctHoleT3wtuIqtl6GeKDK%2BZh2SCVAF6YTTQ%2FnEZNCp%2BajByMyCM%2Bcq94Ab2DpkE%2BudGJWZsheH2w4hTYUxePAD6YydQdG9Hrg%2FURnO6gwwAfzMz9AuDzwckn1yB30sWbFtUAvVJo5OrVgyKBD6MlLn%2BqQT7YVSPHyivHWjS%2BPXg9sOLm7Bb7TW9xmqxRW2vxCOCFuWig%2BTAXZT12mSH0%2BuRUjt2cyrEXDq6GtacIhvrOEBy7g%2B6DuZ7EjXzR74FHt5YaLPD54KRNpNQPC8TFsjFzK4gPbnusnvqO1TPS9Rk89Hph1aKJVnuN2LNJ3pBuyO%2BDN4%2FL68StGwXxwU2F%2B%2BHR64PVEGxmXoJNY9z1GnNnedrESb2wyjBqjLgM8MMs5su0iYoQL9w8l5sGKgI8MOdhozLR64WVQaHGYSkauBrolYK4jtNm1gTxwl3HDcS1T%2F3OG5zP3IvzmVdVAwm8Pljul5j7fAWQj%2FJycd9BUxAv3KSB58O%2FJGUx%2Fd2Ji0YAH0wxdj8aej2wPobSFXjR64nVkRws0CeFcS7EYJK6NUQwEH986gm3w7uowkvK%2B1inSaO46PfFa0%2FCBPSdg6%2FzKm0MxQzwwMSVCne4I78XXhWvG3jg98GLEpf%2FQq8PVhw2sMDrhdWYENHrg5U0Bgz0emFJupWVLv0qG%2FhugGdKndZvgT4ppNJlOtHrg9WYkv1m5LR22zv4vCS%2B67glnWiQFzauU%2BMWmLCRgIH6pZGG4yY6ALww18mimTECfDAbnO7Ci89dxOWkLjcNPIL44CaFaOo2FcQLdxuWDUzwe%2BAVwPk7aOj1yS3%2FmOPxQbqtyuZpoV5pZE0FMgO8MHuWRSzQI4Vs2GDe0OuDFYM%2F4pt2LK4B%2BqQwSzJ3BCa%2FD17itgrweeE0cvKSnegoY2tSo4U6zzktE4nbINDrgcXbvHDMdXAt0CeFSZM1Jr8PXhFDowldBZgG%2BWCvN3jQ0kVmiE%2B%2Fw%2BOA5anb9Rjig%2BvOq4XPrFrMRKPBk98Hb%2B5Oq%2BDzwxlU8aJI6WohF%2FlKg31SScMka3U1A%2FPBzzN3bEGvF9YqLsW8KexYoE8K5uCGm4IB%2BqXQmmoVxA%2B3ud7MAD9MdclBE1sB%2FVKo8nE9beITyAcbz3k3PjYBvDDLuL1sZmA%2B%2BJtq3pAcGOCN2R4vGeo7YrprJT4rJcvGOLf0GuVcvsCHJyjjEISnRkYa5IOduGwa%2BHxw8nGOimcXUYG8sPEQfUMBrkE%2B2A0euvTioUvctZIqb0Pt68C90mnow0s%2FfbgI3aKCzwdnEqYuE0x%2BLzx%2BksRBRIAXZtLk2BnghdmQAYXfKlZ72PYdsQVe2eDiod8TL63C9LqFSzAv%2FAa1Xn1LLN0uAj4vnEY%2BXvO%2BqBoKdPT6YTX2SpDfCy8uRsMGIgK8MDdpQwRhgA9mPa6zxg4UBfHBXSXTBib6PfCqcDYDTqItubhgj1Q2TVZ348fpVmHRyNKHk6smbkbg88GZl83KYYAPZoNAL%2FpWjbVL9Ppg4c3BnW9ggB4pyOZQKv1GUjnOGgwO%2Bb3wOtRq0A2w6a6jniSuEO6TTlwmTdZSQXxw51Eja%2FD6YDVkXukl866a6pOVn%2B5kVcbuaIdeDyx%2BZNTBY4APZmOvn09dqCPKDha%2FrfBpzK06s2Qw1ZHINuZPegfuv1%2Boo37NcH10rBXW2UXshN5oDzH421uI%2Ba57s4O4yp9dvLxtlavASXwXDDl5jB6LK0ukxdWUu2T8QVRRkv2APtwxfOenF%2F9%2B8dckXgFiKDbZJLgdljPxXRBn8jj4tx%2F0lmM%2BbIeKYYy4CpOKzwsUZYxv0hHSu5MPjPd7F0ezhAfwhn14ajd6jIdm9d0AdyZ0Gfsz3vePcld81MTS9wvsx6HlY40Eud5RKHdw%2Fozv0IOEgH40PDm5ddQTjS%2B3fIJXkN02NDpEMKARTaGaTFVKdOziBTTaO2EU3T7C5gONla6zHuA9a%2BihW6ji6KiNS9eS%2FXT58gWQar%2F%2BHdOuzJk4LO6dqsQhxOya%2F8V%2BFLUn%2FvgOXU1HmfCG%2Ben%2F%2BJd%2F%2BRfxr2C8gRZ7gQ68Lfvif4HjNd2m14rxv8HxNBFFGm4u%2Fie4Fx%2FF%2FwMv6q%2Fq ```
2. Evaluate styles for HLJS in a separate cell: ```html .html ``` 3. Evaluate the Wolfram Language definitions for `HLJS` symbol. It will define an output `WLXForm`: ```wolfram HLJS[code_, Rule["Lang", lang_String]] := CreateFrontEndObject[ HLJSView[code // ToStringRiffle, lang] ] ``` Now we are ready to embed any code on a slide! Here is an example with C: ``` .slide # Pointers in C Here is how you can shoot youself in a leg #include int main() { int *ptr; // Declaring a pointer, but not initializing it *ptr = 42; // 🔫 Writing to an uninitialized pointer — undefined behavior! printf("Value at ptr: %d\n", *ptr); return 0; } ``` Use this special WLX tag `` to disable parsing of the inner content if it contains `<` , `>` and other HTML-like symbols QR Code [#qr-code] A simple helper component for rendering QR codes: ```wolfram QRCode[lnk_, OptionsPattern[]] := BarcodeImage[lnk, "QR", OptionValue["ImageSize"]] Options[QRCode] = {"ImageSize" -> 300} ``` For example: ``` .slide Here is our repo https://github.com/WLJSTeam/wljs-notebook ``` Share downloadable files [#share-downloadable-files] If you export your notebook or presentation to a [HTML file](./../Share/Standalone-HTML), you might need to provide some ASCII or other binary files together with it. It may benefit a user, if you provide a direct link to it right on the notebook page. 1. Define a wrapper, that exports any file to a base64 encoded string and passes it to [a frontend symbol](./Frontend-functions/Overview): ```wolfram EmbedFile[name_String, data_] := With[{exported = Export[name, data]}, If[!FailureQ[exported], With[{base64 = BaseEncode[ReadByteArray[exported]] // URLEncode}, embededFile[name, base64] // Hold // CreateFrontEndObject ] , $Failed ] ] ``` 2. Define a frontend symbol, which handles the file decoding and downloading: ```js .js const b64toBlob = (b64Data, contentType='', sliceSize=512) => { const byteCharacters = atob(b64Data); const byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { const slice = byteCharacters.slice(offset, offset + sliceSize); const byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } const blob = new Blob(byteArrays, {type: contentType}); return blob; } core.embededFile = async (args, env) => { const name = await interpretate(args[0], env); const data = await interpretate(args[1], env); // Create the anchor element const anchor = document.createElement("button"); anchor.className = "sm-controls rounded bg-white px-2 py-1 text-xs text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50 flex flex-row gap-x-1 items-end"; anchor.textContent = "Download"; anchor.innerHTML = `Download ${name} `; env.element.appendChild(anchor); env.element.onclick = () => { const blob = b64toBlob(decodeURIComponent(data)); // Create a download link const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = name; link.click(); link.remove(); } } ``` 3. Hide all previous cells. Let's try to embed something to a notebook: ```wolfram EmbedFile["data.dat", {{1,2}, {3,4}}] ``` Here `EmbedFile` uses the same syntax as [Export](./../File-Operations/Export) and creates a button, which you can press and download a virtually created binary file. You can also assign it to a symbol and **safely place it on a slide** of your presentation. # Asynchronous programming > Asynchronous programming is a technique that enables your program to start potentially long-running tasks while remaining responsive to other events. Rather than blocking until a task finishes, your program can continue handling user input or other operations, and then process the result once the task completes. An introductory guide to handling user interaction A reference and guide on basic event handling An object that represents the eventual completion (or failure) of an asynchronous operation and its resulting value The WLJS ecosystem uses asynchronous programming as the primary technique for handling user interactions and polling long-running tasks. A common pattern looks like this: ```wolfram Button["Press me", foo[]] ``` Or more explicitly: ```wolfram EventHandler[InputButton["Press me"], foo] ``` Here, a button can be pressed at any time and generate an event captured by a handler function. The `foo[]` function (or a `DownValue` of the `foo` symbol) must be a **non-blocking expression**; otherwise, it will hang the evaluation kernel. For example, `foo` **cannot call** [Input](./../Frontend-IO/Input), [NotebookRead](./../Cells-and-Notebook/NotebookRead), [SystemInputDialog](./../Frontend-IO/SystemDialogInput), `Rasterize`, `FrontFetch`, `WaitAll`, or similar blocking functions—which are explicitly marked as blocking in their documentation pages. import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; This will never work ❌ ```wolfram n = EvaluationNotebook[]; Button[ "Ask" , With[{result = InputString["1+1", "Notebook"->n]}, MessageDialog[ If[result =!= "2", "Wrong" , "Correct" ] , "Notebook"->n] ] ] ``` This will work ✅ ```wolfram n = EvaluationNotebook[]; Button[ "Ask" , Then[InputStringAsync["1+1", "Notebook"->n], Function[result, MessageDialog[ If[result =!= "2", "Wrong" , "Correct" ] , "Notebook"->n] ] ] ] ``` Asynchronous functions [#asynchronous-functions] Experimental feature Consider a scenario where the user wants to create a cell with content provided through a series of dialog windows, triggered by a button press: ```wolfram n = EvaluationNotebook[]; EventHandler[InputButton["Add cell"], Function[Null, Then[ChoiceDialogAsync["Create a cell?", "Notebook"->n], Function[choice, If[choice =!= True, Return[]]; Then[InputStringAsync["Enter the content", "Notebook"->n], Function[content, If[!StringQ[content], Return[]]; NotebookWrite[n, Cell[content, "Input"]]; ] ] ]] ]] ``` This is known as **callback hell**—deeply nested callbacks that become hard to read and maintain. This pattern often appears when working with animations (see [Animation Framework](./Animation-framework/Overview)), timers, and async parallel kernels. To solve this problem, WLJS introduces **coroutines** (or **async functions**), similar to those found in many modern programming languages. Here's the same code rewritten using async/await syntax: ```wolfram n = EvaluationNotebook[]; EventHandler[InputButton["Add cell"], AsyncFunction[Null, Module[{choice, content}, choice = ChoiceDialogAsync["Create a cell?", "Notebook"->n]; choice = choice // Await; If[choice =!= True, Return[Null, Module]]; content = InputStringAsync["Enter the content", "Notebook"->n]; content = content // Await; If[!StringQ[content], Return[Null, Module]]; NotebookWrite[n, Cell[content, "Input"]]; ]; ]] ``` The `AsyncFunction` and `Await` expressions provide syntactic sugar over `Function`, `Promise`, and chains of `Then`, allowing you to write asynchronous code in a sequential, readable style. `AsyncFunction` returns a `Promise` , so it can be awaited from other async functions using `Await` . Comparison: Promises vs Async/Await [#comparison-promises-vs-asyncawait] import {Tabs, Tab} from 'fumadocs-ui/components/tabs'; ```wolfram temperature = "Loading"; TextView[temperature // Offload] Then[ParallelSubmitAsync[URLRead["https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41¤t=temperature_2m"]], Function[response, temperature = ImportByteArray[response["BodyByteArray"], "RawJSON"]["current", "temperature_2m"]; ]] ``` ```wolfram temperature = ""; TextView[temperature // Offload] AsyncFunction[Null, Module[{response}, temperature = "Loading"; response = ParallelSubmitAsync[URLRead["https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41¤t=temperature_2m"]] // Await; temperature = ImportByteArray[response["BodyByteArray"], "RawJSON"]["current", "temperature_2m"]; ]][] ``` Advanced example: Branching and assignments [#advanced-example-branching-and-assignments] This example demonstrates **branching**, **assignments**, and compound expressions within async functions: ```wolfram p1 = Promise[]; p2 = Promise[]; p3 = Promise[]; win = CurrentWindow[]; f = AsyncFunction[Null, With[{}, Speak["Press p1", "Window"->win]; p1 // Await; Speak["Press p2A or p2B", "Window"->win]; Module[{m = -100}, m = Await[p2]; Speak["Pause 2 seconds", "Window"->win]; PauseAsync[2] // Await; If[m > 4, Speak["Press p3", "Window"->win]; m = Await[p3]; ]; StringTemplate["Result: ``"][m] ] ]]; Then[f[], Speak]; ``` To simulate async events, use these buttons: ```wolfram Button["p1", EventFire[p1, Resolve, True]] Button["p2A", EventFire[p2, Resolve, 1]] Button["p2B", EventFire[p2, Resolve, 5]] Button["p3", EventFire[p3, Resolve, 10]] ``` Async pause [#async-pause] Use [PauseAsync](./../Misc/Async) to introduce delays in async code without blocking the kernel. Finding async functions [#finding-async-functions] Check the symbol reference section for functions ending in `*Async`. # Component-based markup All mentioned techniques can be used in [Markdown](./../Cell-types/Markdown), [Slide](./../Cell-types/Slide) cells as well as with normal Wolfram expressions when combined with the [HTMLView](./../GUI/HTMLView) wrapper. Have a look at these guides as well: import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; A basic guide on how to write WLX An introductory guide on how to shape your data using all the tools of the modern web that you can imagine and integrate it with normal Wolfram Language input/output An advanced guide on how to build live presentations with dynamic content What we call a component is not a special entity of WLJS, but rather an approach of using Wolfram expressions in [WLX](./../Cell-types/WLX) to build reusable blocks for markup. Think of it as your special custom set of HTML tags that decorate the inner content. Reusable local component [#reusable-local-component] Here is how to define and work with components within a single notebook Headers and footers [#headers-and-footers] Creating presentations is a repetitive process. It is quite common to have some elements shared between different slides. For example we want a basic header to which we can provide textual data. Let's create WLX to define it: ``` .wlx Heading[OptionsPattern[]] := With[{Title = OptionValue["Title"]},

</h1> Some repetitive text you need </div> ]; Options[Heading] = {"Title" -> ""}; ``` Now we mark it [initialization cell](./../Overview), so that we do not need to evaluate it manually next time. Then let's create a slide with it: ``` .slide <Heading Title={"Your title"}/> <br/><br/> The actual content Maybe some equations $m \\mathbf{a} = \\mathbf{F}$ ``` ``` <dummy ><div ><h1 >Your title</h1> Some repetitive text you need</div><br /><br /> The actual content Maybe some equations $m \\mathbf{a} = \\mathbf{F}$</dummy> ``` However, if we want something more complex, we can avoid passing data as options (or attributes) and render children instead. Any children passed to a tag will be automatically converted to [WLXForm](./../Formatting/WLXForm) . If the passed expression does not have `WLXForm` defined, the result is **forcibly converted** to a string. See later on how to alter it. Let's also add a custom icon: ``` .wlx MakeTitle[Children__] := MakeTitle[ToStringRiffle[{Children}]] MakeTitle[Child_String] := With[{ Icon = ParametricPlot[{ReIm@Exp[(I t - 0.1 t)],ReIm@Exp[(I t - 0.3 t)]}, {t,0,8Pi}, PlotStyle->{AbsoluteThickness[4], AbsoluteThickness[4]}, ImageSize->{60,60}, PlotRange->0.9{{-1,1},{-1,1}}] }, <div class="relative flex w-full text-left flex-row gap-x-4" style="align-items: center; margin-bottom:1.5rem;"> <div style="bottom:0; z-index:1; position: absolute; background: linear-gradient(to left, orangered, lightblue); width: 100%; height: 0.7rem;"></div> <div style="display:inline-block"><Icon/></div> <h2><Child/></h2> </div> ] Footer = With[{}, <div class="w-full ml-auto mr-auto absolute text-sm" style="top: 690px"> Some repetitive footer: <i>Short title</i>, Joe Forest </div> ]; ``` This allows us to pass multiple child elements to our title generator. By the first definition of `MakeTitle`, all children will be merged into a single one. Here is an example with slides: ``` .slide <!-- .slide: class="slide-standard" --> <MakeTitle>Here is <b>our title</b></MakeTitle> Content goes... Content goes... Content goes... <Footer/> ``` ``` <dummy ><!-- .slide: class="slide-standard" --> <div class="relative flex w-full text-left flex-row gap-x-4" style="align-items: center; margin-bottom:1.5rem;"><div style="bottom:0; z-index:1; position: absolute; background: linear-gradient(to left, orangered, lightblue); width: 100%; height: 0.7rem;"></div><div style="display:inline-block">FrontEndExecutable[e67a87dd-8fcf-4627-a0d2-52585d182230]</div><h2 >Here is <b >our title</b></h2></div> Content goes... Content goes... Content goes... <div class="w-full ml-auto mr-auto absolute text-sm" style="top: 690px"> Some repetitive footer: <i >Short title</i>, Joe Forest</div></dummy> ``` Layout [#layout] There are built-in `Row` and `Column` wrappers from the Wolfram Standard Library that you can use on your slides. There are two ways: **Way 1: Define beforehand** ```wolfram square[{{imin_, imax_}, {jmin_, jmax_}}] := Table[ UnitStep[i - imin, imax - i] UnitStep[j - jmin, jmax - j], {i, 0, 20}, {j, 0, 20} ] OurGroupedPlot = Row[{ ListPlot3D[square[{{2, 5}, {3, 7}}], Mesh -> None], ListPlot3D[Abs@Fourier@square[{{2, 5}, {3, 7}}], Mesh -> None, ColorFunction -> "Rainbow"] }]; ``` and place on a slide or Markdown cell: ``` .slide # Example <OurPlot/> ``` **Way 2: Assign figures separately** You can also bind each to a separate variable and then assemble them into a group on a slide: ```wolfram {Figure1, Figure2} = { ListPlot3D[square[{{2, 5}, {3, 7}}], Mesh -> None], ListPlot3D[Abs@Fourier@square[{{2, 5}, {3, 7}}], Mesh -> None, ColorFunction -> "Rainbow"] }; ``` ``` .slide # Example <Row> <Figure1 /> <Figure2 /> </Row> ``` ``` <dummy > # Example <div class="flex flex-row">FrontEndExecutable[4de05fe7-a44b-4f51-a71a-3284cbd182b0] FrontEndExecutable[70e41077-f1ce-4422-a7ac-0f1f4a630668]</div></dummy> ``` Try to drag these plots. It's alive! Here is another example, where we more heavily combine Markdown, WLX and HTML: ``` .slide <!-- .slide: class="slide-standard" --> ## Example Slide Title <ul> <li>This slide serves as an example of how to format content.</li> <li>Use this format for presenting various topics.</li> </ul> <br/> <Row> ![](https://picsum.photos/200/300) <div style="width:400px; margin-top:2rem"> - Example Content $$ C = \\frac{m}{V} $$ where: - $C$ is the concentration of coffee in grams per liter, - $m$ is the mass of coffee in grams, - $V$ is the volume of water in liters. </div> </Row> ``` ``` <!-- .slide: class="slide-standard" --> ## Example Slide Title <ul> <li>This slide serves as an example of how to format content.</li> <li>Use this format for presenting various topics.</li> </ul> <br/> <div class="flex flex-row"> ![](https://picsum.photos/200/300) <div style="width:400px; margin-top:2rem"> - Example Content $$ C = \\frac{m}{V} $$ where: - $C$ is the concentration of coffee in grams per liter, - $m$ is the mass of coffee in grams, - $V$ is the volume of water in liters. </div> </div> ``` Custom container [#custom-container] Here’s a simple component implementation using WLX. Use the full power of web-technologies: ``` .wlx Columns[data__, OptionsPattern[]] := With[{ Style = OptionValue["Style"] }, With[{DataList = Table[ <div> <Item /> </div>, {Item, List[data]} ]}, <div class="flex flex-row justify-between" style="{Style}"> <DataList /> </div> ] ]; Options[Columns] = {"Style" -> ""}; ``` Here we can not only provide children elements as arguments, but attributes as options as well. For example: ``` .slide # Hey There! <Columns> <p>Column 1</p> <p>Column 2</p> </Columns> ``` ``` <dummy > # Hey There! <div style="" class="flex flex-row justify-between"><div ><p >Column 1</p></div> <div ><p >Column 2</p></div></div></dummy> ``` You can safely use Markdown if this component is used on [Markdown](./../Cell-types/Markdown) or [slide cells](./../Cell-types/Slide) by wrapping content in `<p>` tags and adding blank lines: ```md <Columns> <p> # Heading 1 </p> <p> # Heading 2 </p> </Columns> ``` Using `"Style"` option we can customize the look of columns: ```md <Columns Style={" border-radius: 4px; background: rgb(49 87 170); padding: 1rem; "}> <p style="color: white">Heading 1</p> <p style="color: white">Heading 2</p> </Columns> ``` ``` <dummy > # Hey There! <div style=" border-radius: 4px; background: rgb(49 87 170); padding: 1rem; " class="flex flex-row justify-between"><div ><p style="color: white">Heading 1</p></div> <div ><p style="color: white">Heading 2</p></div></div></dummy> ``` Adding Javascript [#adding-javascript] An guide on integrating frontend symbols with Wolfram, WLX and event system </Cards> JavaScript code can be embedded normally with `<script>` tags—no special magic is required. Here is an example with a helper component to display, let's say, the number of publications: ``` .wlx Stat[Text_, OptionsPattern[]] := With[{ Count = OptionValue["Count"], UId = CreateUUID[] }, <div class="text-center text-gray-600 m-4 p-4 rounded bg-gray-100 flex flex-col"> <span style="display:hidden" id="{UId}"><Count /></span> <span class="text-md"><Text /></span> <script type="module"> const c = document.getElementById('<UId/>'); const final = Number(c.innerText); c.innerText = 0; c.style.display = ""; let cnt = 0; const int = setInterval(()=>{ c.innerText=cnt++; if (cnt > final) clearInterval(int); }, 100); </script> </div> ] Options[Stat] = {"Count" -> 1}; ``` ``` .slide # Basic counter <Stat Count={11}>Number of publications</Stat> ``` Note that our counter will run **immediately**—that is, if you have many slides, you will always see a static number. You need to subscribe to [SlideEventListener](./../Slides/SlideEventListener) to check if the slide is visible. See this guide: An advanced guide on how to build components and live presentations with dynamic content </Cards> Reusable remote components [#reusable-remote-components] You can reuse components across different notebooks as modules. WLJS provides an interface to define and evaluate a normal notebook as an [isolated module](./../Cells-and-Notebook/NotebookEvaluateAsModule): An advanced guide on working with notebooks and its data programmatically </Cards> Pattern matching [#pattern-matching] Here we use a different approach to constructing components—instead of converting everything to `WLXForm` strings, we keep a symbolic representation of each child element as a **tree of expressions**. This is similar to both XML and pattern matching in Wolfram Language. As stated in w3schools: > HTML was designed to display data - with focus on how data looks > XML was designed to carry data - with focus on what data is In this chapter we use WLX as the second one. This allows to declare **data expressions** such as: ``` .slide Pluto excitation spectra</CardTitle> Song Goo et al. <b>Nature Programming</b> 33 2027</CardCredits> ``` You can use the same approach for markdown cells within other WLX components as well. The `Card` component is responsible for displaying this data. Slides and markdown cells inherit features from [WLX](./../Cell-types/WLX) cells. By default, the WLX parser will pass all arguments as strings using `WLXForm` or `ToString` if the symbol does not have this output form defined. We need to **preserve our data-symbols** to prevent them from being converted to strings: ```wolfram CardTitle /: ToString[c_CardTitle, WLXForm] := c CardCredits /: ToString[c_CardCredits, WLXForm] := c CardImage /: ToString[c_CardImage, WLXForm] := c Card[__] := "Unknown pattern"; SetAttributes[Card, Orderless]; ``` Now `CardTitle`, `CardCredits`, `CardImage` in the context of WLX will not be transformed before reaching the parent element. This allows us to use the full power of native pattern matching with them on `Card` symbol: ``` .wlx Card[CardTitle[Title_], CardCredits[credits__]] := With[{Text = ToStringRiffle[{credits}]}, <div> <h5><Title/></h5> <span style="font-size:smaller"><Text/></span> </div> ] Card[CardTitle[Title_], CardCredits[credits__], CardImage[Rule["Link", url_]]] := With[{Text = ToStringRiffle[{credits}]}, <div> <img src="{url}" width="400" style="scale:1.2"/> <br/> <h5><Title/></h5> <span style="font-size:smaller"><Text/></span> </div> ] ``` Here is an example of a slide created using this approach with 2 cards in `Row` container: ``` <dummy > ## A row or cards <div class="flex flex-row"><div class="flex flex-col text-center items-center"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Reverend_Robert_Walker_%281755_-_1808%29_Skating_on_Duddingston_Loch.jpg/256px-Reverend_Robert_Walker_%281755_-_1808%29_Skating_on_Duddingston_Loch.jpg?20190701200849" width="300"/><br /><h4 style="max-width:15rem; text-wrap: auto;">Skating on Duddingston Loch</h4><div style="max-width:15rem; text-wrap: auto;" style="font-size:smaller">Reverend Robert Walker (1755 - 1808), via Wikimedia</div></div> <div class="flex flex-col text-center items-center"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Robert_Howlett_%28Isambard_Kingdom_Brunel_Standing_Before_the_Launching_Chains_of_the_Great_Eastern%29%2C_The_Metropolitan_Museum_of_Art_-_restoration1.jpg/256px-Robert_Howlett_%28Isambard_Kingdom_Brunel_Standing_Before_the_Launching_Chains_of_the_Great_Eastern%29%2C_The_Metropolitan_Museum_of_Art_-_restoration1.jpg?20220327171342" width="300"/><br /><h4 style="max-width:15rem; text-wrap: auto;">...</h4><div style="max-width:15rem; text-wrap: auto;" style="font-size:smaller">Robert Howlett, via Wikimedia Commons</div></div></div></dummy> ``` More examples [#more-examples] You can create a similar helper component for [textual cells](./../Cell-types/Markdown) as well. WLJS Notebooks are designed for creating lab journals and interactive reports. You can also create a [template notebook](./Notebook-Operations) with your custom components in a hidden initialization cell. Imagine a Lab Journal. Then we need nice-looking header with a title, some parameters and possible tags. Let's start with: ``` .wlx ClearAll[LabJournal]; LabJournal[Content__, opts: OptionsPattern[]] := LabJournal[ToStringRiffle[{Content}], opts]; LabJournal[Content_, OptionsPattern[]] := With[{ Title = OptionValue["Title"], Subtitle = OptionValue["Subtitle"], tags = OptionValue["Tags"] }, { Footer = If[Length[tags] == 0, "", With[{Tags = Table[ <div class="thz-tag"><Tag/></div> , {Tag, tags}]}, <div class="thz-footer"> <Tags/> </div> ] ] }, <div class="thz-lab-journal"> <div class="thz-header"> <div class="thz-title"><Title/></div> <div class="thz-subtitle"><Subtitle/></div> </div> <div class="thz-grid"> <Content/> <div class="thz-item"> <div class="thz-label">Date</div> <div class="thz-value"><Now/></div> </div> </div> <Footer/> </div> ]; Options[LabJournal] = {"Title"->"Lab Journal", "Subtitle"->"", "Tags"->{}}; ``` Here is a list of corresponding styles: <Accordions> <Accordion title="Styles"> ```html <style> .thz-lab-journal { font-family: "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: #1f2933; border: 1px solid #d1d5db; border-radius: 10px; padding: 20px 24px; max-width: 820px; background: linear-gradient(180deg, #f9fafb 0%, #ffffff 100%); } .thz-header { display: flex; justify-content: space-between; align-items: baseline; border-bottom: 2px solid #e5e7eb; padding-bottom: 10px; margin-bottom: 18px; } .thz-title { font-size: 1.4rem; font-weight: 600; letter-spacing: 0.02em; } .thz-subtitle { font-size: 0.9rem; color: #6b7280; } .thz-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 24px; } .thz-item { display: flex; flex-direction: column; } .thz-label { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: #6b7280; margin-bottom: 2px; } .thz-value { font-size: 1rem; font-weight: 500; } .thz-footer { margin-top: 18px; padding-top: 12px; border-top: 1px dashed #e5e7eb; display: flex; gap: 24px; flex-wrap: wrap; } .thz-tag { background: #eef2ff; color: #3730a3; padding: 6px 12px; border-radius: 999px; font-size: 0.85rem; font-weight: 500; } </style> ``` </Accordion> </Accordions> Place it to the end of WLX cell or create a separate one (HTML or WLX type). `LabJournal` itself does not use any special pattern matching and is meant to just render any children in a nice grid-like structure: ``` .md <LabJournal Title={"Lab Journal"} Subtitle={"Sample: ATR370"} Tags={{"Optics", "THZ"}} > Here there will be grid of cards </LabJournal> ``` For rendering key-value structures, we define a separate symbol `Card` with data-holding symbols `CardLabel` and `CardValue`. Since it is not bound to `LabJournal`, we can reuse it as a separate component elsewhere: ``` .wlx ClearAll[Card]; Card[_] := "Undefined pattern"; Card[__] := "Undefined patterns"; Card[CardLabel[LabelContent_], CardValue[ValueContent_]] := With[{}, <div class="thz-item"> <div class="thz-label"><LabelContent/></div> <div class="thz-value"><ValueContent/></div> </div> ]; Card[CardLabel[LabelContent_], CardValue[ValueContent__]] := Card[CardLabel[LabelContent], CardValue[ToStringRiffle[{ValueContent}]]] Card[CardLabel[LabelContent__], CardValue[ValueContent__]] := Card[CardLabel[ToStringRiffle[{LabelContent}]], CardValue[ToStringRiffle[{ValueContent}]]] Card[CardLabel[LabelContent__], CardValue[ValueContent_]] := Card[CardLabel[ToStringRiffle[{LabelContent}]], CardValue[ValueContent]] CardLabel /: ToString[c_CardLabel, WLXForm] := c; CardValue /: ToString[c_CardValue, WLXForm] := c; SetAttributes[Card, Orderless]; ``` We've also handled different patterns—for instance, when `CardValue` has multiple arguments passed to it while `CardLabel` does not. This can be done elegantly using Wolfram Language pattern matching. Now, let's combine both components to create a nice header for our report using Markdown cells: ``` .md <!-- Hide this cell using Alt-2 or Cmd-2 --> <LabJournal Title={"Lab Journal"} Subtitle={"Sample: ATR370"} Tags={{"Optics", "THZ"}} > Resolution</CardLabel> 0.33 cm<sup>2</sup></CardValue> User</CardLabel> Persephone</CardValue> </LabJournal> ``` Here is how the final result looks: <wljs-html encoded="true"> {`%3Cdiv%20class%3D%22thz-lab-journal%22%3E%3Cdiv%20class%3D%22thz-header%22%3E%3Cdiv%20class%3D%22thz-title%22%3ELab%20Journal%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-subtitle%22%3ESample%3A%20ATR370%3C%2Fdiv%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-grid%22%3E%3Cdiv%20class%3D%22thz-item%22%3E%3Cdiv%20class%3D%22thz-label%22%3EResolution%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-value%22%3E0.33%20cm%0A%3Csup%20%3E2%3C%2Fsup%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22thz-item%22%3E%3Cdiv%20class%3D%22thz-label%22%3EUser%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-value%22%3EPersephone%3C%2Fdiv%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-item%22%3E%3Cdiv%20class%3D%22thz-label%22%3EDate%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-value%22%3ESat%2031%20Jan%202026%2014%3A36%3A01%3C%2Fdiv%3E%3C%2Fdiv%3E%3C%2Fdiv%3E%3Cdiv%20class%3D%22thz-footer%22%3E%3Cdiv%20class%3D%22thz-tag%22%3EOptics%3C%2Fdiv%3E%0A%3Cdiv%20class%3D%22thz-tag%22%3ETHZ%3C%2Fdiv%3E%3C%2Fdiv%3E%3Cstyle%20%3E%20.thz-lab-journal%20%7B%0A%20%20%20%20%20%20font-family%3A%20%22Segoe%20UI%22%2C%20Roboto%2C%20Helvetica%2C%20Arial%2C%20sans-serif%3B%0A%20%20%20%20%20%20color%3A%20%231f2933%3B%0A%20%20%20%20%20%20border%3A%201px%20solid%20%23d1d5db%3B%0A%20%20%20%20%20%20border-radius%3A%2010px%3B%0A%20%20%20%20%20%20padding%3A%2020px%2024px%3B%0A%20%20%20%20%20%20max-width%3A%20820px%3B%0A%20%20%20%20%20%20background%3A%20linear-gradient%28180deg%2C%20%23f9fafb%200%25%2C%20%23ffffff%20100%25%29%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-header%20%7B%0A%20%20%20%20%20%20display%3A%20flex%3B%0A%20%20%20%20%20%20justify-content%3A%20space-between%3B%0A%20%20%20%20%20%20align-items%3A%20baseline%3B%0A%20%20%20%20%20%20border-bottom%3A%202px%20solid%20%23e5e7eb%3B%0A%20%20%20%20%20%20padding-bottom%3A%2010px%3B%0A%20%20%20%20%20%20margin-bottom%3A%2018px%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-title%20%7B%0A%20%20%20%20%20%20font-size%3A%201.4rem%3B%0A%20%20%20%20%20%20font-weight%3A%20600%3B%0A%20%20%20%20%20%20letter-spacing%3A%200.02em%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-subtitle%20%7B%0A%20%20%20%20%20%20font-size%3A%200.9rem%3B%0A%20%20%20%20%20%20color%3A%20%236b7280%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-grid%20%7B%0A%20%20%20%20%20%20display%3A%20grid%3B%0A%20%20%20%20%20%20grid-template-columns%3A%201fr%201fr%3B%0A%20%20%20%20%20%20gap%3A%2014px%2024px%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-item%20%7B%0A%20%20%20%20%20%20display%3A%20flex%3B%0A%20%20%20%20%20%20flex-direction%3A%20column%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-label%20%7B%0A%20%20%20%20%20%20font-size%3A%200.75rem%3B%0A%20%20%20%20%20%20text-transform%3A%20uppercase%3B%0A%20%20%20%20%20%20letter-spacing%3A%200.08em%3B%0A%20%20%20%20%20%20color%3A%20%236b7280%3B%0A%20%20%20%20%20%20margin-bottom%3A%202px%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-value%20%7B%0A%20%20%20%20%20%20font-size%3A%201rem%3B%0A%20%20%20%20%20%20font-weight%3A%20500%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-footer%20%7B%0A%20%20%20%20%20%20margin-top%3A%2018px%3B%0A%20%20%20%20%20%20padding-top%3A%2012px%3B%0A%20%20%20%20%20%20border-top%3A%201px%20dashed%20%23e5e7eb%3B%0A%20%20%20%20%20%20display%3A%20flex%3B%0A%20%20%20%20%20%20gap%3A%2024px%3B%0A%20%20%20%20%20%20flex-wrap%3A%20wrap%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20.thz-tag%20%7B%0A%20%20%20%20%20%20background%3A%20%23eef2ff%3B%0A%20%20%20%20%20%20color%3A%20%233730a3%3B%0A%20%20%20%20%20%20padding%3A%206px%2012px%3B%0A%20%20%20%20%20%20border-radius%3A%20999px%3B%0A%20%20%20%20%20%20font-size%3A%200.85rem%3B%0A%20%20%20%20%20%20font-weight%3A%20500%3B%0A%20%20%20%20%7D%3C%2Fstyle%3E%3C%2Fdiv%3E`} </wljs-html> As we mentioned, you can still use `Card` as a standalone component: ``` .md Parameter</CardLabel> 11.2</CardValue> ``` Check out [Advanced slides](./Advanced-Slides) for ready-to-go templates that you can drop in to your notebooks. # Decorating symbols import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <wljs-store kernel="/attachments/1a7a4249-kernel-3138499539191000322.txt" json="/attachments/7404b231-b490a7f8-9a05-441a-b164-3b277b700e03.txt" /> We have significantly simplified the way you create syntax sugar for symbols compared to how it is done in Mathematica. You can still use low-level boxes such as `RowBox` , `GridBox` , etc., but we do not recommend it since it violates SOLID principles Symbol decorations or syntax sugar are one of the main selling points of Wolfram Mathematica and WLJS Notebook. Basic math helpers such as fractions, square roots, and integrals significantly increase the readability of input and output expressions: ``` (*TB[*)Integrate[(*|*)(*FB[*)((Sin[x])(*,*)/(*,*)((*SqB[*)Sqrt[2](*]SqB*)))(*]FB*)(*|*), (*|*)x(*|*)](*|*)(*1:eJxTTMoPSmNmYGAo5gUSYZmp5S6pyflFiSX5RcGcQBHPvJLUdCA3NZMRpIgVSLgl5hSnAgCQTg44*)(*]TB*) ``` and this is how it actually looks like under-the-hood: ```wolfram Integrate[Sin[x]/Sqrt[2], x] ``` Moreover, any [Plot](./../Plotting-Functions/Plot) or [Image](./../Image/Image) is in fact just a fancy output form of corresponding `Graphics` and `Image` expressions and is fully editable! That's why the difference between input and output Wolfram Language cells in WLJS is rather vague. Every symbol has its **[InputForm](./../Formatting/InputForm)** - this is how the expression can be typed by a user or serialized to a file, for example: ```wolfram ListPlot[{0,1,2}] // InputForm ``` ```wolfram Graphics[{{}, Annotation[{{Annotation[{Directive[PointSize[0.012833333333333334], ...]}]}}]] ``` Then every symbol has its output form - how it is displayed in the cell or within other expressions. In WLJS we generally have 2 output forms: * [StandardForm](./../Formatting/StandardForm) - what you see in all input/output [Wolfram Language](./../Cell-types/Wolfram-Language) cells; * [WLXForm](./../Formatting/WLXForm) - what you see if the expression is placed on a [slide](./../Cell-types/Slide), [Markdown](./../Cell-types/Markdown), or [WLX](./../Cell-types/WLX) cells If the output form is not defined, `InputForm` will be used. That's why all user-defined symbols look as they are in the output cells. On output, expressions are processed with [MakeBoxes](./../Formatting/MakeBoxes) - an internal symbol which is applied to any output. To define a form of expression, use the `TagSet` pattern: ```wolfram MySymbol /: MakeBoxes[MySymbol, StandardForm] := "6" MySymbol /: MakeBoxes[MySymbol, WLXForm] := "9" ``` Depending on where this `MySymbol` is placed, it will look and work differently: ``` .slide ## Have a look at <MySymbol/> ``` or ``` MySymbol ``` ``` 6 ``` The given example for `StandardForm` alters not only the appearance but also the output content: `MySymbol` is gone. **This is rather discouraged** in Wolfram Language, when you cannot retrieve the original expression from the output. To address this issue, we shall delve deeper into how to alter the displayed expression without changing the underlying one. Interpretation [#interpretation] Temporary [#temporary] You can temporarily replace a symbol with an icon by applying [Interpretation](./../Formatting/Interpretation). After the first evaluation, the representation is lost and the true expression is revealed: ``` Interpretation[ Graphics[Rectangle[{-1,-1},{1,1}], ImageSize->{20,20}], 1 ] ``` ``` (*VB[*)(1)(*,*)(*"1:eJwlT8tOg0AAJMaD8SuwJyAQgahRk5osZlu2LyxLMEI4AF2B8tgGSoESPtS/keplMjPJTGbuAmp+XzEMU92OAHfJkZZ2Qhr8M0pOsDVX4Ll56R/iJKxck4RHv4gy4vaSIrKSMohsPxJl8EQW5X5EcHImrPTG9qossqo8eDwniGOFMFFeyaK1rDX9wPkm/ZoD6kQQ66f0cfmZrZH2oKc6OI151MGmjmncAJpHioFxuzrLxQwjCJOVpTotJs49AsDyDRRFzxBu9x3dvId2sHCKIF88+YWWz4KDgxLwggAC+7RKq+10Orns8GxN4P8fX49g1hnBNxdC/J1RZN2fa5U1+QVSjFNr"*)(*]VB*) ``` We can prove it by: ``` (*VB[*)(1)(*,*)(*"1:eJwlT8tOg0AAJMaD8SuwJyAQgahRk5osZlu2LyxLMEI4AF2B8tgGSoESPtS/keplMjPJTGbuAmp+XzEMU92OAHfJkZZ2Qhr8M0pOsDVX4Ll56R/iJKxck4RHv4gy4vaSIrKSMohsPxJl8EQW5X5EcHImrPTG9qossqo8eDwniGOFMFFeyaK1rDX9wPkm/ZoD6kQQ66f0cfmZrZH2oKc6OI151MGmjmncAJpHioFxuzrLxQwjCJOVpTotJs49AsDyDRRFzxBu9x3dvId2sHCKIF88+YWWz4KDgxLwggAC+7RKq+10Orns8GxN4P8fX49g1hnBNxdC/J1RZN2fa5U1+QVSjFNr"*)(*]VB*) + 1 ``` ``` 2 ``` <Accordions> <Accordion title="Magic Joystick"> We can create such a structure which looks like a [joystick](./../GUI/InputJoystick) but acts like a [dynamic symbol](./../Guides/Dynamic): ``` createDynamic2DSymbol[] := Module[{symbol = {0,0} }, With[{ eventObject = InputJoystick[], helper = InputJoystick\`IntegrationHelper[][Function[xy, symbol = xy]] }, EventHandler[eventObject, helper]; Interpretation[eventObject, Offload[symbol]] ]] ``` Now we create one symbol like this: ``` createDynamic2DSymbol[] ``` and then **copy and paste** it to, let's say, the text position in `Graphics`: ``` Plot[5Pi Sin[x], {x, -5Pi, 5Pi}, Epilog->{ Text["Sin[x]",50.0 (*BB[*)((*HERE*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwR6dwcAAAAHdFiw="*)(*]BB*), {0,0}] }] ``` <LazyAutoplayVideo url={"/sym-joy.mp4"} /> </Accordion> </Accordions> Permanent [#permanent] To permanently change how a given symbol is displayed, we should use `MakeBoxes`. Remember to apply `MakeBoxes` to any expression you want to provide to the output so it will propagate down the tree: ``` morse[s_String]; morse /: MakeBoxes[m: morse[s_], f: StandardForm] := With[{ i = Interpretation[Row[{"[", Style[s, 12], "]"}], m] }, MakeBoxes[i, f] ] ``` Let's define a helper constructor for our morse code: ``` morseTable = {"a" -> ".- ", "b" -> "-... ", "c" -> "-.-. ", "d" -> "-.. ", "e" -> ". ", "f" -> "..-. ", "g" -> "--. ", "h" -> ".... ", "i" -> ".. ", "j" -> ".--- ", "k" -> "-.- ", "l" -> ".-.. ", "m" -> "-- ", "n" -> "-. ", "o" -> "--- ", "p" -> ".--. ", "q" -> "--.- ", "r" -> ".-. ", "s" -> "... ", "t" -> "- ", "u" -> "..- ", "v" -> "...- ", "w" -> ".-- ", "x" -> "-..- ", "y" -> "-.-- ", "z" -> "--.. ", " " -> "/ "}; morse[s_String] := morse[StringReplace[ToLowerCase[s], morseTable]] /; StringMatchQ[s, ___~~WordCharacter..~~___]; morse /: TextString[morse[s_]] := StringReplace[s, Map[Function[r, Rule[r[[2]], r[[1]]]], SortBy[Normal[morseTable], -StringLength[Last[#]] &]]]; ``` Let's try to create a morse code container: ``` morse["sos"] ``` ``` (*VB[*)(morse["... --- ... "])(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cEngVwNLXenaC3N6mqlaCUNrRotTR0wqaHlBBLWUNLT01PQ1dVVANFKQGEdkJySoVWqV0VIiG9+QHCuX2aku2O+aXpysGNohGlUVHZBYXCetlNweJR2RJ5bYmR5unOISbprWEVwblRAIVA2OcI0KDI7Rzu0MtA3NL00I9MxyMupICS3oDy8Ij0sNDwqNTUnvTjKOdMgJ9DRtzA9vKLc1lYJZG+skxOIgrtSKVapthYo7A4UhviQBUgEleakBnOAGKmJKf55OZVg0ZCi0lQAzblJrw=="*)(*]VB*) ``` To check that this is still `morse` symbol, apply `InputForm`: ``` (*VB[*)(morse["... --- ... "])(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cEngVwNLXenaC3N6mqlaCUNrRotTR0wqaHlBBLWUNLT01PQ1dVVANFKQGEdkJySoVWqV0VIiG9+QHCuX2aku2O+aXpysGNohGlUVHZBYXCetlNweJR2RJ5bYmR5unOISbprWEVwblRAIVA2OcI0KDI7Rzu0MtA3NL00I9MxyMupICS3oDy8Ij0sNDwqNTUnvTjKOdMgJ9DRtzA9vKLc1lYJZG+skxOIgrtSKVapthYo7A4UhviQBUgEleakBnOAGKmJKf55OZVg0ZCi0lQAzblJrw=="*)(*]VB*) //InputForm ``` ``` morse["... --- ... "] ``` Let's convert it back to the text: ``` (*VB[*)(morse["... --- ... "])(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cEngVwNLXenaC3N6mqlaCUNrRotTR0wqaHlBBLWUNLT01PQ1dVVANFKQGEdkJySoVWqV0VIiG9+QHCuX2aku2O+aXpysGNohGlUVHZBYXCetlNweJR2RJ5bYmR5unOISbprWEVwblRAIVA2OcI0KDI7Rzu0MtA3NL00I9MxyMupICS3oDy8Ij0sNDwqNTUnvTjKOdMgJ9DRtzA9vKLc1lYJZG+skxOIgrtSKVapthYo7A4UhviQBUgEleakBnOAGKmJKf55OZVg0ZCi0lQAzblJrw=="*)(*]VB*) // TextString ``` ``` "sos" ``` Finally, make it audible: ``` silence = Table[0, {t,0,40Pi,0.1}]; dot = Table[Sin[5 t], {t,0,40Pi,0.1}]; dash = Join[dot, dot]; morse /: Play[morse[t_String]] := With[{ m = morse[t] }, Join @@ (Switch[#, ".", Join[dot, silence], "-", Join[dash, silence], _, Join[silence, silence]] & /@ StringSplit[m[[1]], ""]) // ListPlay // EmitSound; ]; ``` ``` (*VB[*)(morse["... --- ... "])(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cEngVwNLXenaC3N6mqlaCUNrRotTR0wqaHlBBLWUNLT01PQ1dVVANFKQGEdkJySoVWqV0VIiG9+QHCuX2aku2O+aXpysGNohGlUVHZBYXCetlNweJR2RJ5bYmR5unOISbprWEVwblRAIVA2OcI0KDI7Rzu0MtA3NL00I9MxyMupICS3oDy8Ij0sNDwqNTUnvTjKOdMgJ9DRtzA9vKLc1lYJZG+skxOIgrtSKVapthYo7A4UhviQBUgEleakBnOAGKmJKf55OZVg0ZCi0lQAzblJrw=="*)(*]VB*) // Play ``` ViewBox [#viewbox] An advanced guide how to define frontend symbols and make them do funky stuff for you </Cards> Another way is to use Javascript with a custom display function. This can be done using [ViewBox](./../Formatting/Low-level/ViewBox). Let's firstly define our display function as [frontend symbol](./../Advanced/Frontend-functions/Overview): ``` .js core.smileyDecorator = async (args, env) => { const canvas = document.createElement('canvas'); canvas.width = 50; canvas.height = 50; const ctx = canvas.getContext('2d'); // Draw a smiley face ctx.beginPath(); ctx.arc(25, 25, 20, 0, Math.PI * 2, true); // Outer circle ctx.moveTo(35, 25); ctx.arc(25, 25, 8, 0, Math.PI, false); // Mouth ctx.moveTo(22, 20); ctx.arc(20, 20, 2, 0, Math.PI * 2, true); // Left eye ctx.moveTo(32, 20); ctx.arc(30, 20, 2, 0, Math.PI * 2, true); // Right eye ctx.stroke(); //append to viewbox container env.element.appendChild(canvas); } ``` ``` core.smileyDecorator = async (args, env) => { const canvas = document.createElement('canvas'); canvas.width = 50; canvas.height = 50; const ctx = canvas.getContext('2d'); // Draw a smiley face ctx.beginPath(); ctx.arc(25, 25, 20, 0, Math.PI * 2, true); // Outer circle ctx.moveTo(35, 25); ctx.arc(25, 25, 8, 0, Math.PI, false); // Mouth ctx.moveTo(22, 20); ctx.arc(20, 20, 2, 0, Math.PI * 2, true); // Left eye ctx.moveTo(32, 20); ctx.arc(30, 20, 2, 0, Math.PI * 2, true); // Right eye ctx.stroke(); //append to viewbox container env.element.appendChild(canvas); } ``` The visible DOM element of `ViewBox` is provided as `env.element` property Now we define a `StandardForm` for our symbol with `ViewBox` container. `ViewBox` allows to pass any decorator frontend symbol used to display an expression, and place any other expression underneath it in its `InputForm`: ``` SmileySymbol /: MakeBoxes[s_SmileySymbol, StandardForm] := With[{}, ViewBox[s, smileyDecorator[]] ] SmileySymbol[] ``` ``` (*VB[*)(SmileySymbol[])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWkMIB4/iMjNzEmtdElNzi9KLMkvAgDDMArI"*)(*]VB*) ``` `WLXForm` output form does not support `ViewBox`, and all frontend symbols must be passed as [FrontEndExecutable](./../../Frontend-Objects/FrontEndExecutable) if we want to show it on a slide or markdown cell. If you reevaluate the output cell, you will get the same decorated symbol. You can ensure that this is still the same symbol, by taking its first argument: ``` SmileySymbol[42] ``` ``` (*VB[*)(SmileySymbol[42])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWkMIB4/iMjNzEmtdElNzi9KLMkvAgDDMArI"*)(*]VB*) // First ``` ``` 42 ``` In this sense, this syntax sugar is not temporary but permanent. However, we can apply the same trick as before and use it to decorate other expressions temporarily: ``` Interpretation[SmileySymbol[], 1] ``` ``` (*VB[*)(1)(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cHpQK6GVphTtJamRnBuZk5qZXBlblJ+TnSspoaWDlBQS8nQKtWrIiTENz8gONcvO9LdMT8q3TXYoyzb1Ds829fTyUQ/0zfLr8o1tyTFNcevKtPS28c3u8wx3cXF17HIUwlkRmyYk5YmxH4WIBFUmpMazAFipCam+OflVIJFQ4pKUwGOai6k"*)(*]VB*) - 1 ``` ``` 0 ``` Indicators [#indicators] Here is another example. Let's create a gauge that can react to value changes. Define a gauge meter: ``` gauge[level_Real]; gauge /: MakeBoxes[g_gauge, StandardForm] := With[{}, ViewBox[g, g] ] ``` Here we use identical display and input expressions, the last one has to be defined as a [frontend symbol](./Frontend-functions/Overview) too: ``` .js function setNeedlePosition(needle, value) { value = Math.max(0, Math.min(1, value)); const angle = value * 180 - 90; needle.style.transform = 'rotate('+Math.round(angle)+'deg)'; } core.gauge = async (args, env) => { const gauge = document.createElement('div'); gauge.style.width = '100px'; gauge.style.height = '50px'; gauge.style.border = '1px solid #000'; gauge.style.borderRadius = '50px 50px 0 0'; gauge.style.position = 'relative'; gauge.style.background = 'linear-gradient(to right, red 0%, yellow 50%, green 100%)'; const needle = document.createElement('div'); needle.style.width = '2px'; needle.style.height = '40px'; needle.style.background = '#000'; needle.style.position = 'absolute'; needle.style.bottom = '0'; needle.style.left = '50%'; needle.style.transformOrigin = 'bottom'; const pos = await interpretate(args[0], env); setNeedlePosition(needle, pos); gauge.appendChild(needle); env.element.appendChild(gauge); } ``` ``` function setNeedlePosition(needle, value) { value = Math.max(0, Math.min(1, value)); const angle = value * 180 - 90; needle.style.transform = `rotate(${angle}deg)`; } core.gauge = async (args, env) => { const gauge = document.createElement('div'); gauge.style.width = '100px'; gauge.style.height = '50px'; gauge.style.border = '1px solid #000'; gauge.style.borderRadius = '50px 50px 0 0'; gauge.style.position = 'relative'; gauge.style.background = 'linear-gradient(to right, red 0%, yellow 50%, green 100%)'; const needle = document.createElement('div'); needle.style.width = '2px'; needle.style.height = '40px'; needle.style.background = '#000'; needle.style.position = 'absolute'; needle.style.bottom = '0'; needle.style.left = '50%'; needle.style.transformOrigin = 'bottom'; const pos = await interpretate(args[0], env); setNeedlePosition(needle, pos); gauge.appendChild(needle); env.element.appendChild(gauge); } core.gauge.update = async (args, env) => { const val = await interpretate(args[0], env); setNeedlePosition(env.element.firstChild.firstChild, val); } core.gauge.destroy = () => {} core.gauge.virtual = true; ``` Let's test it: ``` gauge[0.3] ``` ``` (*VB[*)(gauge[0.3])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5BITyxNTy0yBoPL9gCxdwlI"*)(*]VB*) ``` You can also place it with other wolfram expressions ``` gauge[0.3] // Framed ``` For the next step, we need to [define prototypes](./Frontend-functions/Overview) for our symbol to update the needle position and enable instancing: ``` .js //old definitions... core.gauge.update = async (args, env) => { const val = await interpretate(args[0], env); setNeedlePosition(env.element.firstChild.firstChild, val); } core.gauge.destroy = () => {} core.gauge.virtual = true; ``` Now let's provide a symbol to `gauge` and manipulate it with a slider: ``` meterLevel = 0.5; gauge[meterLevel // Offload] EventHandler[InputRange[0,1,0.1], (meterLevel = #)&] ``` ``` (*VB[*)(gauge[Offload[meterLevel]])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeK5BITyxNT4Vw2YGEf1paTn5iSjEXkJ2bWpJa5JNalpoDAKdSDsA="*)(*]VB*) (*VB[*)(EventObject[<|"Id" -> "42c994fc-168b-42e8-b5bb-0913fd5562e3", "Initial" -> 0.5, "View" -> "57468784-2fd4-4991-94b8-1b8fdcc3d093"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5qbmFmYW5joGqWlmOiaWFoa6lqaJFnoGiZZpKUkJxunGFgaAwBzLBUw"*)(*]VB*) ``` Try to drag it - it is alive! ArrangeSummaryBox [#arrangesummarybox] This is a default display structure in Wolfram Language shared across many symbols like `ColorData`, `NumericArray`, `ByteArray`, and many more, which keeps the original expression hidden and instead shows some stats or details about the content. For example, we have a symbol with information inside its arguments: ``` specialSymbol[<|"Date" -> Now, "Color" -> Red, "State" -> True|>] ``` Let's decorate it: ``` specialSymbol /: MakeBoxes[obj : specialSymbol[asc_Association], StandardForm] := Module[{above}, above = { {BoxForm`SummaryItem[{"Date: ", asc["Date"]}]}, {BoxForm`SummaryItem[{"Color: ", asc["Color"]}]}, {BoxForm`SummaryItem[{"State: ", asc["State"]}]} }; BoxForm`ArrangeSummaryBox[ specialSymbol, (* Head *) obj, (* Input expression *) None, (* Icon *) above, (* Summary content *) Null ] ]; ``` The result looks like this: ``` specialSymbol[<|"Date" -> Now, "Color" -> Red, "State" -> True|>] ``` ``` specialSymbol[(*VB[*) <|"Date" -> DateObject[{2026, 2, 2, 11, 28, 25.895413}, "Instant", "Gregorian", 1.], "Color" -> RGBColor[1, 0, 0], "State" -> True|> (*,*)(*"1:eJzFU0uPmzAQTt+PS4+VemoPPuwlAhMS0hvmFaKQBZxEmz2VDQ6iAXtrHCX5j/ujakO63Uo99CVVgvHMN+P5Rt/IH25Yun3S6/Wad9IgdvQZrz/ZnGe0IDne13XGTxLePlI1b6TxOaPCo/mq5GKfVV3iqTQTVuWtM2eUdD1VNCsb8b2ojR6r6O0DvjNPKEi9KskBP5c5NxPk4/uu9rU0Xl4KxlX6R8oueiXNMp25ZMNygi8kBqAFoL1CwETyBHAsAdXz8uYz2QiFjhDU4BBAB55/XVeOpYzZt8bmQDfAULP6+tAcjUcWHEDdMPQhGLmyBEAY0kZkVEiviwNOCsbLjHaI3pe3gel23O0Qzv0orQN1YNhkelwsIhbjel6uA5uZxRKvr+tbEw9vT9vKL/GVmW68JkHB1XE6W669XZFYOyPWAPQRjjwxX1J0itxwEU0SLeLhoeHhyt7ZHjrEuACGqz410gNu012ddekkVnKm+4rgl8ohWX5Jq1OLLvie/O4CX8icwyrG/3SDd72fbzANUNtXYnorp6Z9O/6h0BM6iJ1kHmRJbJPEmUyNTTOKT9j6si4cV/L41wkqIpfanj0ol3H630TG4i+eyT3xLwzXPFNvP6sa8hWDJQpB"*)(*]VB*)] ``` This is still a valid input expression unless it was too large, in which case it will be indicated by a label: "Data is on Kernel". This means that you can still evaluate it in the current session, but the data is not stored in the notebook and will be lost if you restart the evaluation kernel. Now add an icon based on the "Color" field. Note that the icon can only be `Image`, `Image3D`, `Graphics`, `Graphics3D`, `None`, or any [frontend symbol](./../Advanced/Frontend-functions/Overview): ``` specialSymbol /: MakeBoxes[obj : specialSymbol[asc_Association], StandardForm] := Module[{above, icon}, above = { {BoxForm`SummaryItem[{"Date: ", asc["Date"]}]}, {BoxForm`SummaryItem[{"Color: ", asc["Color"]}]}, {BoxForm`SummaryItem[{"State: ", asc["State"]}]} }; icon = Graphics[{ Lighter[asc["Color"]], Disk[{0,0}, 1], asc["Color"], Disk[{0,0}, 0.8] }, ImageSize -> {50, 50}, ImagePadding -> None, Controls -> False, PlotRange -> {{-1,1},{-1,1}} ]; BoxForm`ArrangeSummaryBox[ specialSymbol, obj, icon, above, Null ] ]; ``` ``` specialSymbol[(*VB[*) <|"Date" -> DateObject[{2026, 2, 2, 11, 31, 53.514057}, "Instant", "Gregorian", 1.], "Color" -> RGBColor[1, 0, 0], "State" -> True|> (*,*)(*"1:eJzFVMmOm0AQdfblEimXSDklUvqQgy1oNntubN5kPCzGGc8pbWgjYqAnTVux/zEflcI4jg85ZJMiweuuV03V45Xg7ZqFmwedTqd+DWCx/ZDx8qPJOakymka7siT8APTmXnPmBcCQs0q4VbrMudiRok28vEi4e5rsBFkXNHoHtKEOqEokuatTRe2qCk26BJhuYui61CeUponeKngIMMtr0ZY8R/eb6NWFupOqiaDlMqdfoseQc4igV2/as88B3DQXjDfpH9XGrEjb6BlAHM4cmrCURu+BQ7iPsLm0kGbBivAAiKbm9foTTUTDGhaWsI6wjU+3LAMoDWhKT5NVSTMQvFFP7cuSivuarA0MrKvIcOAIwnhS1YJUAnZtPOI0YzwnVcvIPXgaaU7b+yjCPks5brCMFJNO94uFx/yonOerkcm0LI5Wt+WdFul3h00xzKMbLUzcOrBGN/vpLF652yzobxVfQnhoRZ4r5nFlHTxnsvDGgeTxFdzxB3NrumbghwFSnOZqJF301pzlyZfW4sbOcAcTftpsKEmvq+JwZBd8R393gE8gZ7OC8T+d4NfOzycYjqxjXeDko52S9H35h0aPK9W3g/mIBL5JA3s8VZLa8A9R//Mqsx3oM7wNrMxzKrBYzWM/zP6XyZH4i8/k3PgXxNWPmh8CKWr6DeUsF20="*)(*]VB*)] ``` Place [Refresh](./../GUI/Refresh) or any other expression that support live updates to one of the summary fields for live state display Place [InputRange](./../GUI/InputRange) to one of the summary fields to mutate your state # Notebooks WLJS Notebook provides a rich API for programmatic manipulation of notebooks, cells, and windows compatible with Mathematica. Programmatic notebook generation [#programmatic-notebook-generation] You can create and manipulate notebooks programmatically using several core WL functions. > The API uses `RemoteCellObj` and `RemoteNotebook` objects to operate with cells and notebooks. We call them remote, since the evaluation kernel is generally isolated from the notebooks and in theory it is not necessary to run on the same physical machine, while all actual operations are performed by the host process of the app. Creating notebooks [#creating-notebooks] Use [CreateDocument](../Cells-and-Notebook/CreateDocument) to create a new notebook populated with cells: ```wolfram (* Create a notebook with text and a plot *) nb = CreateDocument[{ "Here is a plot example", Plot[x, {x, 0, 1}] }]; (* Create with specific cell styles *) CreateDocument[{ TextCell["My Section", "Section"], ExpressionCell[Plot[x, {x,0,1}], "Input"] }]; (* Create invisibly for background processing *) nb = CreateDocument[{"Content"}, Visible -> False]; ``` Use `Defer` to prevent evaluation: ```wolfram CreateDocument[Defer[1 + 1]]; ``` The notebook structure is flat. Nested cell groups will be automatically flattened To save a created notebook to a file, use `NotebookSave`: ```wolfram NotebookSave[nb, "path/to/notebook.wln"]; ``` Cell Expressions [#cell-expressions] Here is a list of supported expressions in [CreateDocument](./../Cells-and-Notebook/CreateDocument), [CellPrint](./../Cells-and-Notebook/CellPrint), [NotebookWrite](./../Cells-and-Notebook/NotebookWrite) and [CreateWindow](./../Cells-and-Notebook/CreateWindow): * Any expression → converted `StandardForm` input cell * `_String` → converted to text/markdown cell * `ExpressionCell[expr_, "Input"]` * `ExpressionCell[expr_, "Output"]` where `expr` will be converted to `StandardForm` * `TextCell[expr_]` represent text/markdown cells * `TextCell[expr_, "Title"]` * `TextCell[expr_, "Section"]` * `TextCell[expr_, "Subsection"]` represent styled markdown cells * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output"]` represents complete input and output cells * `Cell[expr_String, "Input", subtype]` represents complete output cell with a `subtype`, which sets a renderer for `expr` content: * `"md"` or `"markdown"` or `"Markdown"` will use markdown renderer, * `"js"` or `"javascript"` will treat `expr` as Javascript expression aka [Javascript Cells](./../Cell-types/Javascript), * `"html"` or `"HTML"` will render text content as HTML document, * `"mermaid"` or `"Mermaid"` will render text content as [Mermaid diagram](./../Cell-types/Misc), * ... The number of cell subtypes roughly corresponds to the number of available [cell types](./../Cell-types/Misc) in WLJS Notebook. For example, let's create a document with HTML output cell: ```wolfram CreateDocument[{ Cell["<h2>Hello World</h2>", "Input", "html"], Cell["<h2>Hello World</h2>", "Output", "html"] }] ``` Importing and opening notebooks [#importing-and-opening-notebooks] Use [NotebookOpen](../Cells-and-Notebook/NotebookOpen) to import a notebook: ```wolfram (* Open a notebook by path *) nb = NotebookOpen["path/to/notebook.wln"]; (* Open invisibly for background processing *) nb = NotebookOpen["path/to/notebook.wln", Visible -> False]; ``` or to show an imported one: ```wolfram nb = NotebookOpen["path/to/notebook.wln", Visible -> False]; (* do something with a notebook *) (* Open in a window *) NotebookOpen[nb]; ``` Accessing evaluation context [#accessing-evaluation-context] Use [EvaluationNotebook](../Cells-and-Notebook/EvaluationNotebook) to get a reference to the notebook where your code is running: ```wolfram nb = EvaluationNotebook[]; ``` `EvaluationNotebook[]` uses evaluation context to get the caller notebook object. **It will not work correctly** if called from a button click, timer or any other event: ```wolfram Button[ "Click", (* context is lost ❌ *) Print[EvaluationNotebook[]] ] ``` Notebook evaluation [#notebook-evaluation] To evaluate a notebook in the global context, use [NotebookEvaluate](./../Cells-and-Notebook/NotebookEvaluate.mdx) ```wolfram NotebookEvaluate["path/to/notebook.wln"] ``` This will evaluate **all cells** in the provided notebook using the same Kernel. Cells manipulation [#cells-manipulation] Creating cells [#creating-cells] Use [CellPrint](../Cells-and-Notebook/CellPrint) to insert a new cell below the currently evaluated one: ```wolfram (* Print an expression as output *) cell = CellPrint[Plot[Sin[x], {x, 0, 2Pi}]]; (* Print with specific cell type *) CellPrint[Cell["<h1>Hello World</h1>", "Output", "HTML"]]; (* Print a text cell *) CellPrint[TextCell["This is a section", "Section"]]; ``` To delete created cell, simply call `NotebookDelete` on `cell`: ```wolfram NotebookDelete[cell]; ``` Use [NotebookWrite](../Cells-and-Notebook/NotebookWrite) for more control over where cells are inserted: ```wolfram (* Append to a notebook *) nb = EvaluationNotebook[]; NotebookWrite[nb, Plot[x, {x, 0, 1}]]; (* Insert after a specific cell *) NotebookWrite[NotebookLocationSpecifier[cell, "After"], expr]; (* Replace a specific cell *) NotebookWrite[NotebookLocationSpecifier[cell, "On"], expr]; ``` `NotebookWrite` returns a list of created cell objects or a single cell object. Accessing evaluation context [#accessing-evaluation-context-1] Use [EvaluationNotebook](../Cells-and-Notebook/EvaluationNotebook) to get the notebook containing the currently evaluated cell: ```wolfram nb = EvaluationNotebook[]; ``` Here is an example where you can append a cell by clicking a button (which is not possible with `CellPrint`): ```wolfram nb = EvaluationNotebook[]; Button["Create", NotebookWrite[nb, Style["Hi there!", Bold]]] ``` Use [EvaluationCell](../Cells-and-Notebook/EvaluationCell) to get a reference to the input cell that triggered the current evaluation: ```wolfram cell = EvaluationCell[]; ``` and add a cell after: ```wolfram NotebookWrite[NotebookLocationSpecifier[cell, "After"], Red]; ``` Use [ResultCell](../Cells-and-Notebook/ResultCell) to get a *future reference* to the output cell (even before it's created): ```wolfram outputCell = ResultCell[]; ``` `ResultCell` can be useful for tracking [cell events](#Cell%20event%20handlers) or deleting it under certain conditions automatically Use [NotebookFocusedCell](./../Cells-and-Notebook/NotebookFocusedCell) to get a focused / selected cell in the notebook: ```wolfram focusedCell = NotebookFocusedCell[] ``` Alternatively, you can apply `NotebookRead` to get selected cells of a given notebook: ```wolfram focusedCell = NotebookRead[EvaluationNotebook[]] ``` Writing to existing cells [#writing-to-existing-cells] Use [NotebookWrite](../Cells-and-Notebook/NotebookWrite) on cell objects to overwrite their content: ```wolfram NotebookWrite[EvaluationCell[], "Hi there!"]; ``` Here is another example with live updates: ```wolfram cell = NotebookWrite[EvaluationNotebook[], Cell["Timer", "Input"]]; timer = SetInterval[NotebookWrite[cell, Now], 1000]; Button["Delete cell", TaskRemove[timer]; NotebookDelete[cell]; ] ``` Only **input cells** can be rewritten for now. Updating output cells is not possible unless you manually remove and create a new one Reading cells [#reading-cells] Use [NotebookRead](../Cells-and-Notebook/NotebookRead) to read cell contents: ```wolfram (* Read the focused cell *) content = NotebookRead[NotebookFocusedCell[]]; ``` List all cells [#list-all-cells] Use [Cells](../Cells-and-Notebook/Cells) to list all cell objects in the notebook ```wolfram cells = Cells[]; Take[NotebookRead[cells], UpTo[5]] ``` Deleting cells [#deleting-cells] Use [NotebookDelete](../Cells-and-Notebook/NotebookDelete) to remove cells: ```wolfram cell = CellPrint[Now]; (* Later... *) NotebookDelete[cell]; ``` Hidden input cells [#hidden-input-cells] You can create a pair of *input-output* cell with a hidden input one using `CellOpen->False`: ```wolfram focused = NotebookFocusedCell[]; input = NotebookWrite[NotebookLocationSpecifier[focused, "After"], Cell["1+1", "Input", CellOpen->False]]; NotebookWrite[NotebookLocationSpecifier[input, "After"], Cell["2", "Output"]]; ``` Cell event handlers [#cell-event-handlers] You can attach event handlers to cells to react to lifecycle events: ```wolfram With[{cell = ResultCell[]}, EventHandler[cell, { "Destroy" -> (Print["Cell was removed!"]&) }]; "Delete me" ] ``` This can come in handy to remove listeners, stop timers, or other processes when you reevaluate the same cell. Example: Self-destructing cell [#example-self-destructing-cell] ```wolfram With[{cell = EvaluationCell[]}, EventHandler[InputButton["Delete me"], Function[Null, cell // NotebookDelete ]] ] ``` Expression windows manipulation [#expression-windows-manipulation] > Note that created expression windows and cells in fact share the same object structure: [RemoteCellObj](./../Cells-and-Notebook/RemoteCellObj) Creating windows [#creating-windows] Use [CreateWindow](../Cells-and-Notebook/CreateWindow) to open content in a new expression window: ```wolfram (* Open graphics in a new window *) win = CreateWindow[Graphics3D[Cuboid[]]]; (* With size and title *) CreateWindow[Plot[Sin[x], {x, 0, 2Pi}, ImageSize->{300,300}], WindowSize -> {400, 400}, WindowTitle -> "My Plot" ]; (* HTML content *) CreateWindow[Cell["<h2 style=\"color:red\">Hello</h2>", "Output", "HTML"]]; ``` Closing windows [#closing-windows] ```wolfram win = CreateWindow[Graphics3D[Sphere[]]]; Pause[3]; NotebookClose[win]; ``` Create window from another window [#create-window-from-another-window] ```wolfram CreateWindow[Button["Open", CreateWindow[Plot3D[x y, {x,-1,1}, {y,-1,1}]]]] ``` Tracking window events [#tracking-window-events] You can attach event handlers to created windows: ```wolfram state = ""; TextView[state // Offload, "Label" -> "State"] win = CreateWindow[ExpressionCell[Plot[x, {x, 0, 1}], "Output"]]; EventHandler[win, { "Mounted" -> Function[Null, state = "Mounted"], "Closed" -> Function[Null, state = "Closed"] }]; ``` Application windows manipulation [#application-windows-manipulation] Each visible window of WLJS Notebook can be retrieved from the context using [CurrentWindow](./../Frontend-IO/CurrentWindow) ```wolfram appWindow = CurrentWindow[] ``` This returns `WindowObj`, that keeps socket connection to it. If you refresh the page/window, the window object changes as well The following rules apply: * Each opened application window has a unique `WindowObj` * Any function calls by UI events implicitly provide `WindowObj` as well, which can be accessed using `CurrentWindow[]` * Evaluation context also contains current `WindowObj` if the notebook is open * `WindowObj` is required for certain actions such as script execution on the window done by [FrontSubmit](./../Frontend-IO/FrontSubmit) and others Tracking window events [#tracking-window-events-1] You can attach event handlers to `WindowObj`: ```wolfram state = "Open"; EventHandler[CurrentWindow[], { "Closed" -> Function[Null, state = "Closed"; ] }]; TextView[state // Offload] ``` Now try to reload a window or close/open a notebook—you will see the change in the state. Cells as data storage [#cells-as-data-storage] Programmatic control over the notebook structure allows you to reuse cells as storage for your data. For example, `Cell` representation automatically picks up a cell type if applicable. If you want to call a Python script from the session, where should you store `.py` expressions? Why not store them in **another input cell** and leave the name in the first line? ```python np.py import numpy as np new_array = np.linspace(0,10,11).astype('int'); new_array ``` Then we can locate this particular cell. Let's define a helper function: ```wolfram getPythonCell[name_String] := StringDrop[SelectFirst[NotebookRead[Cells[]], MatchQ[Cell[_,_,name<>".py"]]][[1]], StringLength[name]+4] ``` and evaluate our script: ```wolfram scriptText = getPythonCell["np"]; ExternalEvaluate["Python", scriptText]; ``` Notebooks as modules [#notebooks-as-modules] Use [NotebookEvaluateAsModule](../Cells-and-Notebook/NotebookEvaluateAsModule) to import notebooks as reusable modules: ```wolfram {exports} = NotebookEvaluateAsModule["myLibrary.wln"]; ``` `NotebookEvaluateAsModule` call breaks the evaluation order and may cause double evaluation of the caller cell. Please consider to use non-blocking `NotebookEvaluateAsModuleAsync` The following rules apply: * Initialization cells are evaluated once per notebook object * The last Wolfram input cell is evaluated on every call and its result is exported * All other cells are ignored * Context of all global symbols will be completely isolated (lexically scoped) Example 1: Creating a component library [#example-1-creating-a-component-library] **Library.wln:** ```jsx title="Initialization cell" .wlx BigHeader[Text_String] := <h1><Text/></h1>; ``` ```wolfram title="Last cell (exports)" {BigHeader} ``` **Main.wln:** ```wolfram {HeaderComponent} = NotebookEvaluateAsModule["Library.wln"]; ``` ```jsx .slide <HeaderComponent>Hi there!</HeaderComponent> This is my slide ``` For non-blocking imports, use [NotebookEvaluateAsModuleAsync](../Cells-and-Notebook/NotebookEvaluateAsModuleAsync): ```wolfram Then[NotebookEvaluateAsModuleAsync["Library.wln"], Function[exports, {HeaderComponent} = exports; ]]; ``` Example 2: Creating a component library [#example-2-creating-a-component-library] **Library.wln:** ```wolfram title="Initialization cell" w3D[x_,y_,t_] := Total@Table[With[{kx = 1.0 \[Omega], ky = 1.0 \[Omega]}, Cos[ kx x + ky y - \[Omega] t] ], {\[Omega], 0, 3, 1.0}]; widget[] := Animate[Plot3D[w3D[x,y,t], {x,-Pi,Pi}, {y,-Pi,Pi}, MaxRecursion->0, Mesh->None, PlotRange->Full], {t,0,5}]; ``` ```wolfram title="Last cell (exports)" widget ``` **Main.wln:** ```wolfram animation = NotebookEvaluateAsModule["Library.wln"]; ``` ```wolfram (* use it *) animation[] ``` This approach may be more preferable for small modules than a traditional Wolfram Package: 1. Easy to use, automatic context isolation 2. All tests and examples are in the same notebook 3. It allows to utilize non-standard cell types Notebooks as templates [#notebooks-as-templates] WLJS Notebook includes a template system for quickly creating new notebooks with predefined styles, content, and structure. Templates are accessible via the [Command Palette](./../Guides/Command-palette) or via <small>File</small> menu. Template locations [#template-locations] | Location | Path | | ------------------ | -------------------------------------------------------- | | User templates | `~/Documents/WLJS Notebooks/UserTemplates/` | | Built-in templates | `AppExeFolder/app/wljs-packages/wljs-templates/Library/` | How templates work [#how-templates-work] A template is simply a regular notebook. When you create a new notebook from a template: 1. The notebook file is copied to your project directory 2. If an `attachments` folder exists alongside the template, it is also copied 3. The notebook opens with all cells and styles intact The filename of the template notebook becomes the title shown in the template list. Creating a custom template [#creating-a-custom-template] Templates typically contain: * **Style cells** — HTML/CSS that override default notebook appearance * **Banner or header content** (optionally) — Images or formatted text or Javascript code * **Hidden initialization cells** - adds predefined symbols to the session * **Boilerplate cells** — Pre-written code or documentation structure Enable <small>Expert Mode</small> from the settings menu to see hidden cells in notebook templates import { Step, Steps } from 'fumadocs-ui/components/steps'; <Steps> <Step> Step 1: Create the notebook [#step-1-create-the-notebook] Start with a new empty notebook and add your content. </Step> <Step> Step 2: Add custom styles (optional) [#step-2-add-custom-styles-optional] Create an `.html` cell with CSS to customize the notebook appearance: ```html .html <style> :root { --editor-key-keyword: #708; --editor-key-string: #a11; } body { background: #fafafa; } h1 { color: #5e8a8b; } </style> ``` Evaluate the cell to apply the styles. See [Global Styling](##Global%20styling) for a complete list of available CSS classes and variables. </Step> <Step> Step 3: Hide style cells [#step-3-hide-style-cells] For a clean template experience, you should hide the style cells using [cell group properties](./../Overview): * **Vanish** — Makes the cell completely invisible and uneditable, but its output remains in the DOM (ideal for CSS/JS injection) or * **Lock + Hide** — Keeps the output visible but prevents editing Vanished cells can be viewed and edited in `Expert` mode (see Settings). </Step> <Step> Step 4: Add hidden initialization cell (optional) [#step-4-add-hidden-initialization-cell-optional] If you need to provide define some symbols: 1. create a new cell at the top of the notebook; 2. add the definitions; 3. apply **Vanish** to this input cell. Step 5: Add a banner (optional) [#step-5-add-a-banner-optional] Create an `.md` cell with a banner image: ```md .md <img src="/attachments/banner.png" style="width: 100%; height: 200px; object-fit: cover;"/> ``` Apply <small>Lock</small> and <small>Hide</small> properties of a cell group to keep the banner visible but uneditable. </Step> <Step> Step 5: Add boilerplate cells [#step-5-add-boilerplate-cells] Create as many preformatted cells as you want </Step> <Step> Step 6: Save and install [#step-6-save-and-install] 1. Save your notebook 2. Create a folder in `~/Documents/WLJS Notebooks/UserTemplates/` with a descriptive name 3. Move your notebook (and `attachments` folder if any) into this folder 4. Restart the app Your template will now appear in the Command Palette under "New from Template". </Step> </Steps> Global Styling [#global-styling] You can apply custom CSS styles to all notebooks by adding them via **Settings → Custom CSS**. These styles are injected into the document head and apply globally. Adding global styles [#adding-global-styles] import { Settings, Dot } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> General </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Custom CSS </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> Add your CSS rules </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> Restart app </div> </div> </div> The styles will be applied to all windows automatically. Available CSS classes [#available-css-classes] WLJS Notebook exposes predefined CSS classes for styling various elements: Document structure [#document-structure] | Selector | Description | | ------------- | ------------------------------------------------ | | `body` | The whole document | | `main` | Main window container | | `.ccontainer` | Cells container (extends to full size of main) | | `.cgroup` | A single group of cells: input + outputs + tools | | `.cframe` | Inner group of cells: input + outputs | | `.cborder` | Vertical line at the right side of cell group | | `.cwrapper` | Input/output cell wrapper | | `.cseparator` | Thin space between cells | Cell states and types [#cell-states-and-types] | Selector | Description | | ---------------- | ----------------------------------------- | | `.cinit` | Initialization cells | | `.cin` | Input cells parent element | | `.cout` | Output cells parent element | | `.ttint` | Focused cells | | `.cgi-ico` | Initialization cell group icon (teal dot) | | `#sidebar-right` | Right sidebar in exported HTML | Input cell languages [#input-cell-languages] | Selector | Description | | ----------------- | ---------------------------- | | `.clang-generic` | Unknown cell type / language | | `.clang-markdown` | Markdown cells | | `.clang-html` | HTML cells | | `.clang-wlx` | WLX cells | | `.clang-js` | JavaScript cells | | `.clang-slide` | Slide cells | Wolfram Language input cells have an empty class field. Markdown output [#markdown-output] | Selector | Description | | ---------------- | --------------------------- | | `.cout.markdown` | Markdown output cells | | `.markdown h1` | Heading level 1 in markdown | | `.markdown h2` | Heading level 2 in markdown | | `.markdown p` | Paragraphs in markdown | Styling examples [#styling-examples] Change notebook background [#change-notebook-background] ```css .ccontainer { background: lightblue; } body { background: lightblue !important; } main { background: lightblue !important; } ``` Style the input cell border marker [#style-the-input-cell-border-marker] The vertical line on the left side of input cells: ```css .cin > :nth-child(2)::after { border-color: #5e8a8b; } ``` Custom heading colors [#custom-heading-colors] ```css .markdown h1 { color: #2e7d32; } .markdown h2 { color: #1565c0; } ``` Editor color variables [#editor-color-variables] The following CSS variables control syntax highlighting and UI colors. Override them in `:root`: ```css :root { /* Syntax highlighting */ --editor-key-meta: #404740; --editor-key-keyword: #708; --editor-key-atom: #219; --editor-key-literal: #164; --editor-key-string: #a11; --editor-key-escape: #e40; --editor-key-variable: #00f; --editor-local-variable: #30a; --editor-key-type: #085; --editor-key-class: #167; --editor-special-variable: #256; --editor-key-property: #00c; --editor-key-comment: #940; --editor-key-invalid: #f00; --editor-outline: #696969; /* Typography */ font-size: medium; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } ``` Global styles are also copied to exported standalone HTML files. Notebooks as Mini Apps [#notebooks-as-mini-apps] Let's transform an interactive notebook to a [mini app](./../Share/Mini-apps.mdx). We will parameterize this 3D plot and add export to an STL file: Create our first cell and add it to initialization group ```wolfram title="Initialization cell 1" model; Model = Manipulate[model = RevolutionPlot3D[{Sin[t] + Sin[y t] /m, Cos[t] + Cos[x t] /m}, {t, 0, Pi}, RegionFunction -> (Sin[5 (#4 + #5)] > 0 &), Mesh -> None, BoundaryStyle -> Black, PlotStyle -> Thickness[.1], MaxRecursion->1, Axes->False, ImageSize->400], {{x,5, "tX"}, 1, 10, 1}, {{y, 5, "tY"},1,10,1}, {{m,5.5,"Scale"},1,10,0.5}, Appearance->None, ContinuousAction->True]; ``` All global variables we define in this notebook will be automatically scoped to it when we run it as a mini app. There is no need for context isolation Now create another one, where we define an exporting function: ```wolfram title="Initialization cell 2" export := Then[SystemDialogInputAsync["FileSave", {Null, {"STL" -> {"*.stl"}}}], Function[path, If[!StringQ[path], Return[]]; Export[path, model]; ] ]; ``` Here we used `SystemDialogInputAsync` instead of `SystemDialogInput`, since the latter is blocking and cannot be used in calls generated by external asynchronous events such as button clicks. Notebooks exported as [mini apps](./../Share/Mini-apps) use the very last cell's output as the main window. To take advantage of better customization, we use a [WLX](./../Cell-types/WLX) cell as the output instead of a plain Wolfram language cell: ```jsx title="Last cell in the notebook" .wlx With[{ ExportButton = Button["Export", export] }, <div class="bg-white p-4 w-full h-full"> <div class="flex flex-row gap-x-2 justify-between"> <Model/> <div class="mt-4"><ExportButton/></div> </div> </div> ] ``` You can try to evaluate this notebook and check the result. To export it as a mini app, follow: import { Share2, CircleQuestionMark } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>Mini app</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Mini app </div> </div> </div> Then double-click on the exported file to open it with WLJS as a runtime. User dialogs [#user-dialogs] Use [MessageDialog](../Frontend-IO/MessageDialog) for notifications: ```wolfram MessageDialog["Operation completed!"]; ``` ```wolfram MessageDialog[Graphics[Disk[{0,0}, 1]]]; ``` In the case of lost context, i.e. `MessageDialog` is called by a timer, button click - provide `"Notebook"` as an option: ```wolfram n = EvaluationNotebook[]; Button["Message", MessageDialog["Operation completed!", "Notebook"->n]] ``` Use [ChoiceDialog](../Frontend-IO/ChoiceDialog) for user choices: ```wolfram (* Simple OK/Cancel *) result = ChoiceDialog["Proceed with operation?"]; ``` ```wolfram (* Custom choices *) choice = ChoiceDialog["Select option:", { "Option A" -> "a", "Option B" -> "b" }]; ``` `ChoiceDialog` is a blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use `ChoiceDialogAsync` instead: ```wolfram n = EvaluationNotebook[]; Button["Message", Then[ChoiceDialogAsync["Proceed with operation?", "Notebook"->n], Function[choise, Print[choise]; ]]] ``` Use [Input](../Frontend-IO/Input) or [InputString](../Frontend-IO/InputString) for user input: ```wolfram Input["Enter expression:", x^2] InputString["Enter your name:"] ``` Both of them are blocking functions. Again, use async versions in `Button` and other event handlers: ```wolfram nb = EvaluationNotebook[]; Button["Enter expr", Then[InputAsync["Enter expression:", x^2, "Notebook"->nb], Function[expr, NotebookWrite[nb, expr]; ] ]] ``` System File dialogs [#system-file-dialogs] This requires WLJS desktop application Use [SystemDialogInput](../Frontend-IO/SystemDialogInput) for file operations: ```wolfram (* Open file *) file = SystemDialogInput["FileOpen", {Null, { "Images" -> {"*.png", "*.jpg"}, "All Files" -> {"*.*"} }}]; (* Save file *) path = SystemDialogInput["FileSave"]; (* Select directory *) dir = SystemDialogInput["Directory"]; ``` System dialogs are no longer associated with notebooks; instead they require `WindowObj` to be provided, which specifies the parent application window: ```wolfram w = CurrentWindow[]; SetTimeout[Then[SystemDialogInputAsync["FileSave", "Window"->w], Print], 1000]; ``` However, you do not have to provide `"Window"` if the dialog is called from a button click. The event context carries `"Window"` implicitly: ```wolfram Button["Save", Then[SystemDialogInputAsync["FileSave"], Print]] ``` Editor commands [#editor-commands] You can send direct commands to the cells editor using [FrontEditorSelected](./../Interpreter/FrontEditorSelected). This function is defined only on frontend, i.e. it has to be executed using [FrontSubmit](./../Frontend-IO/FrontSubmit) or [FrontFetch](./../Frontend-IO/FrontFetch). To read the last selected text in a cell: ```wolfram FrontFetch[FrontEditorSelected["Get"]] ``` `FrontFetch` is a blocking function, please, consider `FrontFetchAsync` Or using a button: ```wolfram Button["Read selected", Then[FrontFetchAsync[FrontEditorSelected["Get"]], Print]] ``` Read cursor position: ```wolfram Button["Read selected", Then[FrontFetchAsync[FrontEditorSelected["Cursor"]], Print]] ``` To insert or overwrite: ```wolfram Button["Overwrite", FrontSubmit[FrontEditorSelected["Set", "1+1"]] ] ``` Clipboard [#clipboard] Copying to clipboard [#copying-to-clipboard] Use [CopyToClipboard](../Frontend-IO/CopyToClipboard) to programmatically copy: ```wolfram CopyToClipboard[{1, 2, 3, 4, 5}]; ``` In the case of context loss, provide `"Window"` object as an option, i.e. ```wolfram win = CurrentWindow[]; SetTimeout[CopyToClipboard[RandomWord[], "Window"->win]; Echo["Copied"], 1000]; ``` Use [ClickToCopy](../Frontend-IO/ClickToCopy) for interactive copy buttons: ```wolfram ClickToCopy["Click to copy this text"] ClickToCopy["Copy Code", "Plot[Sin[x], {x, 0, 2Pi}]"] ``` Pasting from clipboard [#pasting-from-clipboard] Use [Paste](../Frontend-IO/Paste) to paste clipboard content as a new cell: ```wolfram Paste[]; ``` Use [PasteButton](../Frontend-IO/PasteButton) for interactive paste buttons: ```wolfram PasteButton["Paste"] ``` Directly read clipboard [#directly-read-clipboard] `ReadClipboard` is symbol is defined on the frontend and allows to directly read clipboard from a given window. Since this is a frontend-only function, you need to use `FrontFetch` or `FrontFetchAsync`: ```wolfram FrontFetch[ReadClipboard[]] ``` or by a click on a button: ```wolfram Button["Read", Then[FrontFetchAsync[ReadClipboard[]], Print]] ``` Note, that events generated by button clicks or other UI interactions provide `"Window"` object to `FrontFetchAsync` implicitly. This will not work automatically for timers, i.e. `SetTimeout` or events generated by parallel kernels Notebook storage [#notebook-storage] Use [NotebookStore](../Cells-and-Notebook/NotebookStore) to persist data within a notebook. This data survives export/import cycles, including [Static HTML](../Share/Standalone-HTML) export. ```wolfram NotebookStore[key_String ] ``` this object represents a data stored with `key` in the notebook. Or excplicitly specify the notebook: ```wolfram NotebookStore[nb, key_String ] ``` Writting data [#writting-data] ```wolfram NotebookWrite[NotebookStore["myKey"], {1, 2, 3, 4, 5}]; NotebookWrite[NotebookStore["settings"], <|"theme" -> "dark", "fontSize" -> 14|>]; ``` Reading data [#reading-data] ```wolfram data = NotebookRead[NotebookStore["myKey"]]; ``` Note, that `NotebookRead` is a blocking function; use `NotebookReadAsync` if you need to read out the data by a timer or user actions. Notebooks as command palette tools [#notebooks-as-command-palette-tools] We already mentioned our command palette in the [very first guide](./../Guides/Command-palette). Every tool is a normal notebook, which is evaluated in the background and manipulates your working notebook, creating temporal cells whenever you call it from the palette. User's utilities are stored in `~/Documents/WLJS Notebooks/User palette/` What you should note before starting: 1. Initialization cells are evaluated once 2. All other cells are evaluated every time you call a tool (except text/markdown cells) 3. All "global" symbols in tool notebook will be contextually isolated 4. `CurrentWindow` will return the window of the host notebook (not tool's notebook!) 5. `NotebookDirectory`, `NotebookWrite`, `NotebookRead`, `NotebookFocusedCell`, `EvaluationNotebook` will be in the context of the host notebook (not tool's notebook!) 6. `Directory[]` will return the directory of tool's notebook (not host!) 7. Icon can be set using a specially tagged WLX cell (see examples) 8. Title of the tool has to be in the first markdown cell of the tool's notebook 9. You do not need to evaluate any of cells in the tool's notebook All manipulations on the notebook's data can be performed using all symbols we discussed in all sections of this guide. Example-1: search text in a cell and print results [#example-1-search-text-in-a-cell-and-print-results] In this example we prompt a user to enter a string, then read the content of focused cell, find all matches and print them in the output cell. First cell - tool name: ```wolfram .md # Search in cell This tool finds a string in a focused cell and prints the results ``` This example does not require any initialization cells, then we can skip this part and define our "action" cell: ```wolfram focused = NotebookFocusedCell[]; content = NotebookRead[focused][[1]]; Then[InputStringAsync["Enter a string to search"], Function[string, If[!TrueQ[StringLength[string] > 3], EchoLabel["Warning"]["String is too short"], With[{cases = StringCases[content, (WordCharacter..|"")~~string~~(WordCharacter..|""), IgnoreCase->True]}, NotebookWrite[NotebookLocationSpecifier[focused, "After"], ExpressionCell[TableForm[cases], "Output"]] ] ]]]; ``` As the last thing, we make a nice icon. This is a **specially tagged** WLX cell: ```wolfram icon.wlx Component[OptionsPattern[]] := With[{Title = OptionValue["Title"], Kbd = OptionValue["Shortcut"], UTag = OptionValue["Tag"], Btn = OptionValue["Button"]}, <li tabindex="-1" tag="{UTag}" class="list-none nooline group flex cursor-default select-none items-center rounded-md px-2 py-1 focus:bg-teal-500/25"> <svg class="h-4 ml-1 w-4 flex-none text-gray-900 dark:text-gray-400 text-opacity-40" fill="none" viewBox="0 0 24 24"><path d="M21 4H3M20 8H6M18 12H9M15 16H8M17 20H12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> <span class="ml-3 flex-auto truncate"><Title/></span><span class="ml-3 flex-none text-xs font-semibold text-gray-500"> <kbd class="font-sans"><Kbd/></kbd> <button class="p-0.5 rounded hover:bg-gray-100 dark:hover:bg-gray-200" btag="{Btn}"> <svg class="w-4 h-4 text-gray-400" viewBox="0 0 24 24" fill="none"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12ZM12 7.75C11.3787 7.75 10.875 8.25368 10.875 8.875C10.875 9.28921 10.5392 9.625 10.125 9.625C9.71079 9.625 9.375 9.28921 9.375 8.875C9.375 7.42525 10.5503 6.25 12 6.25C13.4497 6.25 14.625 7.42525 14.625 8.875C14.625 9.83834 14.1056 10.6796 13.3353 11.1354C13.1385 11.2518 12.9761 11.3789 12.8703 11.5036C12.7675 11.6246 12.75 11.7036 12.75 11.75V13C12.75 13.4142 12.4142 13.75 12 13.75C11.5858 13.75 11.25 13.4142 11.25 13V11.75C11.25 11.2441 11.4715 10.8336 11.7266 10.533C11.9786 10.236 12.2929 10.0092 12.5715 9.84439C12.9044 9.64739 13.125 9.28655 13.125 8.875C13.125 8.25368 12.6213 7.75 12 7.75ZM12 17C12.5523 17 13 16.5523 13 16C13 15.4477 12.5523 15 12 15C11.4477 15 11 15.4477 11 16C11 16.5523 11.4477 17 12 17Z" fill="currentColor"/> </svg> </button> </span> </li> ]; Options[Component] = {"Title"->"Example", "Shortcut"->"", "Tag"->"generic", "Button"->Null}; Component ``` If you are looking for some nice icons, visit the SVGRepo website. In this example it uses 2 SVG icons, one for a tool and another one for a question mark. Now we save this notebook to the directory `~/Documents/WLJS Notebooks/User palette/` and restart the WLJS application. # HTML Type `.html` in the first line of an input cell and start writing raw HTML on a new line: ``` .html Here is my <h3>Hello World</h3> ``` ``` Here is my <h3>Hello World</h3> ``` The input is also processed with PHP-like template engine (WSP) allowing to embed Wolfram expressions: ``` .html <h3>Today is <?wsp Now // TextString ?></h3> ``` HTML cells are less strict regarding syntax variations than [WLX](./WLX) because HTML tags aren’t parsed. # Javascript Vanilla JS [#vanilla-js] Type `.js` in the first line of an input cell and start writing Javascript on a new line. Entered expressions are evaluated as anonymous function in the isolated environment scoping all declared variables. Depending on the returned result the output cell can show JSON string or DOM element. ``` .js return 1+1 ``` ``` return 2; ``` or ``` .js const dom = document.createElement('span'); dom.innerText = "Hello World"; dom.style.color = 'lightblue'; return dom; ``` ``` const dom = document.createElement('span'); dom.innerText = "Hello World"; dom.style.color = 'lightblue'; return dom; ``` You can still reach global variables with `window` or `core` objects Cell context [#cell-context] There are a few useful built-in objects accessible from the top scope of called expressions: this.ondestroy [#thisondestroy] This property is called when a cell is destroyed. Assign a clean-up function to it: ``` .js this.ondestroy = () => { // Clean up resources } ``` **Always clean up any timers or animation loops** using the `this.ondestroy` property. Otherwise, they will continue running even after the cell is reevaluated. For example: ``` .js const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 250; canvas.height = 250; const ballRadius = 10; let x = canvas.width / 2; let y = canvas.height - 30; let dx = 2; let dy = -2; function drawBall() { ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI * 2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); } let uid; function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawBall(); if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { dx = -dx; } if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) { dy = -dy; } x += dx; y += dy; uid = requestAnimationFrame(draw); } uid = requestAnimationFrame(draw); this.ondestroy = () => { cancelAnimationFrame(uid); }; return canvas; ``` <wljs-editor type="Output" display="js"> { `const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = 250; canvas.height = 250; const ballRadius = 10; let x = canvas.width / 2; let y = canvas.height - 30; let dx = 2; let dy = -2; function drawBall() { ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI * 2); ctx.fillStyle = "#0095DD"; ctx.fill(); ctx.closePath(); } let uid; function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); drawBall(); if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { dx = -dx; } if (y + dy > canvas.height - ballRadius || y + dy < ballRadius) { dy = -dy; } x += dx; y += dy; uid = requestAnimationFrame(draw); } uid = requestAnimationFrame(draw); this.ondestroy = () => { cancelAnimationFrame(uid); }; return canvas; ` } </wljs-editor> Communication with the Wolfram Kernel [#communication-with-the-wolfram-kernel] You can define any *frontend symbol* using JavaScript cells. An overview on frontend symbols / functions How to use Javascirpt to make custom input elements and integrate them with Wolfram language </Cards> MJS Javascript [#mjs-javascript] Type `.mjs` in the first line of an input cell and start writing Javascript on a new line. This type of Javascript cells allows to **import modules** and bundle them using Node.js to run in the output cells. The main motication behind it is to take advantage of a vast NPM library, build a standalone script, which can be executed directly in the notebook and stored there as well. This requires Node.js to be globally installed on your system. Unlike [Vanilla JS](##Vanilla%20JS) it does not return anything directly. Instead it provides a special property available from the content: ``` .mjs const dom = document.createElement('span'); dom.style.color = "red"; dom.innerText = 'Hello World'; this.return(dom); ``` ``` const dom = document.createElement('span'); dom.style.color = "red"; dom.innerText = 'Hello World'; return dom; ``` MJS cells use `rollup` bundler (installed automatically locally) and create `packages.json` locally in your notebook's folder. Note, that the bundled output is stored within the notebook. You do not need to reevaluate the input cell. If you wish to copy the whole group to another notebook - use cell's properties (See [Overview](./../Overview)). Cell context [#cell-context-1] There are a few useful built-in objects accessible from the top scope of called expressions: this.ondestroy [#thisondestroy-1] This function is called when a cell is destroyed. Assign any clean-up function to this object this.return [#thisreturn] This is a function that returns a given object to the output cell. this.after [#thisafter] This function is called when DOM element (if provided early via `this.return`) has been mounted. Use it to trigger any layout-dependent rendering functions For example, let's install an NPM library using [Shell type](./Misc) cell: ``` .sh npm i siriwave --prefix . ``` Use always `--prefix .` to force npm work locally Now we can create a simple animation following the documentation of `siriwave`: ``` .mjs import SiriWave from "siriwave"; const dom = document.createElement('div'); this.return(dom); let siriWave; siriWave = new SiriWave({ container: dom, height: 300, style: "ios9", width: 600 }); siriWave.start(); this.ondestroy = () => { siriWave.dispose(); console.warn('Removed'); } ``` ``` var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf;var __hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function __require(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from)) if(!__hasOwnProp.call(to,key)&&key!==except) __defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})} return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_siriwave_umd=__commonJS({"node_modules/siriwave/dist/siriwave.umd.js"(exports,module){(function(factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory():typeof define==="function"&&define.amd?define(factory):(global=typeof globalThis!=="undefined"?globalThis:global||self,global.SiriWave=factory())})((function(){"use strict";var __assign=function(){__assign=Object.assign||function __assign2(t){for(var s,i=1,n=arguments.length;i<n;i++){s=arguments[i];for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))t[p]=s[p]} return t};return __assign.apply(this,arguments)};function __rest(s,e){var t={};for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0) t[p]=s[p];if(s!=null&&typeof Object.getOwnPropertySymbols==="function") for(var i=0,p=Object.getOwnPropertySymbols(s);i<p.length;i++){if(e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])) t[p[i]]=s[p[i]]} return t} var ClassicCurve=((function(){function ClassicCurve2(ctrl,definition){this.ATT_FACTOR=4;this.GRAPH_X=2;this.AMPLITUDE_FACTOR=0.6;this.ctrl=ctrl;this.definition=definition} ClassicCurve2.prototype.globalAttFn=function(x){return Math.pow(this.ATT_FACTOR/(this.ATT_FACTOR+Math.pow(x,this.ATT_FACTOR)),this.ATT_FACTOR)};ClassicCurve2.prototype.xPos=function(i){return this.ctrl.width*((i+this.GRAPH_X)/(this.GRAPH_X*2))};ClassicCurve2.prototype.yPos=function(i){return this.AMPLITUDE_FACTOR*(this.globalAttFn(i)*(this.ctrl.heightMax*this.ctrl.amplitude)*(1/this.definition.attenuation)*Math.sin(this.ctrl.opt.frequency*i-this.ctrl.phase))};ClassicCurve2.prototype.draw=function(){var ctx=this.ctrl.ctx;ctx.moveTo(0,0);ctx.beginPath();var finalColor=this.definition.color||this.ctrl.color;ctx.lineWidth=this.definition.lineWidth;for(var i=-this.GRAPH_X;i<=this.GRAPH_X;i+=this.ctrl.opt.pixelDepth){ctx.lineTo(this.xPos(i),this.ctrl.heightMax+this.yPos(i))} ctx.stroke()};ClassicCurve2.getDefinition=function(){return[{attenuation:-2,lineWidth:1,opacity:0.1},{attenuation:-6,lineWidth:1,opacity:0.2},{attenuation:4,lineWidth:1,opacity:0.4},{attenuation:2,lineWidth:1,opacity:0.6},{attenuation:1,lineWidth:1.5,opacity:1}]};return ClassicCurve2})());var iOS9Curve=((function(){function iOS9Curve2(ctrl,definition){this.GRAPH_X=25;this.AMPLITUDE_FACTOR=0.8;this.SPEED_FACTOR=1;this.DEAD_PX=2;this.ATT_FACTOR=4;this.DESPAWN_FACTOR=0.02;this.DEFAULT_NOOFCURVES_RANGES=[2,5];this.DEFAULT_AMPLITUDE_RANGES=[0.3,1];this.DEFAULT_OFFSET_RANGES=[-3,3];this.DEFAULT_WIDTH_RANGES=[1,3];this.DEFAULT_SPEED_RANGES=[0.5,1];this.DEFAULT_DESPAWN_TIMEOUT_RANGES=[500,2e3];this.ctrl=ctrl;this.definition=definition;this.noOfCurves=0;this.spawnAt=0;this.prevMaxY=0;this.phases=[];this.offsets=[];this.speeds=[];this.finalAmplitudes=[];this.widths=[];this.amplitudes=[];this.despawnTimeouts=[];this.verses=[]} iOS9Curve2.prototype.getRandomRange=function(e){return e[0]+Math.random()*(e[1]-e[0])};iOS9Curve2.prototype.spawnSingle=function(ci){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k;this.phases[ci]=0;this.amplitudes[ci]=0;this.despawnTimeouts[ci]=this.getRandomRange((_b=(_a=this.ctrl.opt.ranges)===null||_a===void 0?void 0:_a.despawnTimeout)!==null&&_b!==void 0?_b:this.DEFAULT_DESPAWN_TIMEOUT_RANGES);this.offsets[ci]=this.getRandomRange((_d=(_c=this.ctrl.opt.ranges)===null||_c===void 0?void 0:_c.offset)!==null&&_d!==void 0?_d:this.DEFAULT_OFFSET_RANGES);this.speeds[ci]=this.getRandomRange((_f=(_e=this.ctrl.opt.ranges)===null||_e===void 0?void 0:_e.speed)!==null&&_f!==void 0?_f:this.DEFAULT_SPEED_RANGES);this.finalAmplitudes[ci]=this.getRandomRange((_h=(_g=this.ctrl.opt.ranges)===null||_g===void 0?void 0:_g.amplitude)!==null&&_h!==void 0?_h:this.DEFAULT_AMPLITUDE_RANGES);this.widths[ci]=this.getRandomRange((_k=(_j=this.ctrl.opt.ranges)===null||_j===void 0?void 0:_j.width)!==null&&_k!==void 0?_k:this.DEFAULT_WIDTH_RANGES);this.verses[ci]=this.getRandomRange([-1,1])};iOS9Curve2.prototype.getEmptyArray=function(count){return new Array(count)};iOS9Curve2.prototype.spawn=function(){var _a,_b;this.spawnAt=Date.now();this.noOfCurves=Math.floor(this.getRandomRange((_b=(_a=this.ctrl.opt.ranges)===null||_a===void 0?void 0:_a.noOfCurves)!==null&&_b!==void 0?_b:this.DEFAULT_NOOFCURVES_RANGES));this.phases=this.getEmptyArray(this.noOfCurves);this.offsets=this.getEmptyArray(this.noOfCurves);this.speeds=this.getEmptyArray(this.noOfCurves);this.finalAmplitudes=this.getEmptyArray(this.noOfCurves);this.widths=this.getEmptyArray(this.noOfCurves);this.amplitudes=this.getEmptyArray(this.noOfCurves);this.despawnTimeouts=this.getEmptyArray(this.noOfCurves);this.verses=this.getEmptyArray(this.noOfCurves);for(var ci=0;ci<this.noOfCurves;ci++){this.spawnSingle(ci)}};iOS9Curve2.prototype.globalAttFn=function(x){return Math.pow(this.ATT_FACTOR/(this.ATT_FACTOR+Math.pow(x,2)),this.ATT_FACTOR)};iOS9Curve2.prototype.sin=function(x,phase){return Math.sin(x-phase)};iOS9Curve2.prototype.yRelativePos=function(i){var y=0;for(var ci=0;ci<this.noOfCurves;ci++){var t=4*(-1+ci/(this.noOfCurves-1)*2);t+=this.offsets[ci];var k=1/this.widths[ci];var x=i*k-t;y+=Math.abs(this.amplitudes[ci]*this.sin(this.verses[ci]*x,this.phases[ci])*this.globalAttFn(x))} return y/this.noOfCurves};iOS9Curve2.prototype.yPos=function(i){return this.AMPLITUDE_FACTOR*this.ctrl.heightMax*this.ctrl.amplitude*this.yRelativePos(i)*this.globalAttFn(i/this.GRAPH_X*2)};iOS9Curve2.prototype.xPos=function(i){return this.ctrl.width*((i+this.GRAPH_X)/(this.GRAPH_X*2))};iOS9Curve2.prototype.drawSupportLine=function(){var ctx=this.ctrl.ctx;var coo=[0,this.ctrl.heightMax,this.ctrl.width,1];var gradient=ctx.createLinearGradient.apply(ctx,coo);gradient.addColorStop(0,"transparent");gradient.addColorStop(0.1,"rgba(255,255,255,.5)");gradient.addColorStop(1-0.1-0.1,"rgba(255,255,255,.5)");gradient.addColorStop(1,"transparent");ctx.fillStyle=gradient;ctx.fillRect.apply(ctx,coo)};iOS9Curve2.prototype.draw=function(){var ctx=this.ctrl.ctx;ctx.globalAlpha=0.7;ctx.globalCompositeOperation=this.ctrl.opt.globalCompositeOperation;if(this.spawnAt===0){this.spawn()} if(this.definition.supportLine){return this.drawSupportLine()} for(var ci=0;ci<this.noOfCurves;ci++){if(this.spawnAt+this.despawnTimeouts[ci]<=Date.now()){this.amplitudes[ci]-=this.DESPAWN_FACTOR}else{this.amplitudes[ci]+=this.DESPAWN_FACTOR} this.amplitudes[ci]=Math.min(Math.max(this.amplitudes[ci],0),this.finalAmplitudes[ci]);this.phases[ci]=(this.phases[ci]+this.ctrl.speed*this.speeds[ci]*this.SPEED_FACTOR)%(2*Math.PI)} var maxY=-Infinity;for(var _i=0,_a=[1,-1];_i<_a.length;_i++){var sign=_a[_i];ctx.beginPath();for(var i=-this.GRAPH_X;i<=this.GRAPH_X;i+=this.ctrl.opt.pixelDepth){var x=this.xPos(i);var y=this.yPos(i);ctx.lineTo(x,this.ctrl.heightMax-sign*y);maxY=Math.max(maxY,y)} ctx.closePath();ctx.fillStyle="rgba(".concat(this.definition.color,", 1)");ctx.strokeStyle="rgba(".concat(this.definition.color,", 1)");ctx.fill()} if(maxY<this.DEAD_PX&&this.prevMaxY>maxY){this.spawnAt=0} this.prevMaxY=maxY;return null};iOS9Curve2.getDefinition=function(){return[{color:"255,255,255",supportLine:!0},{color:"15, 82, 169"},{color:"173, 57, 76"},{color:"48, 220, 155"}]};return iOS9Curve2})());var SiriWave2=((function(){function SiriWave3(_a){var _this=this;var container=_a.container,rest=__rest(_a,["container"]);this.phase=0;this.run=!1;this.curves=[];var csStyle=window.getComputedStyle(container);this.opt=__assign({container,style:"ios",ratio:window.devicePixelRatio||1,speed:0.2,amplitude:1,frequency:6,color:"#fff",cover:!1,width:parseInt(csStyle.width.replace("px",""),10),height:parseInt(csStyle.height.replace("px",""),10),autostart:!0,pixelDepth:0.02,lerpSpeed:0.1,globalCompositeOperation:"lighter"},rest);this.speed=Number(this.opt.speed);this.amplitude=Number(this.opt.amplitude);this.width=Number(this.opt.ratio*this.opt.width);this.height=Number(this.opt.ratio*this.opt.height);this.heightMax=Number(this.height/2)-6;this.color="rgb(".concat(this.hex2rgb(this.opt.color),")");this.interpolation={speed:this.speed,amplitude:this.amplitude};this.canvas=document.createElement("canvas");var ctx=this.canvas.getContext("2d");if(ctx===null){throw new Error("Unable to create 2D Context")} this.ctx=ctx;this.canvas.width=this.width;this.canvas.height=this.height;if(this.opt.cover===!0){this.canvas.style.width=this.canvas.style.height="100%"}else{this.canvas.style.width="".concat(this.width/this.opt.ratio,"px");this.canvas.style.height="".concat(this.height/this.opt.ratio,"px")} switch(this.opt.style){case "ios9":this.curves=(this.opt.curveDefinition||iOS9Curve.getDefinition()).map(function(def){return new iOS9Curve(_this,def)});break;case "ios":default:this.curves=(this.opt.curveDefinition||ClassicCurve.getDefinition()).map(function(def){return new ClassicCurve(_this,def)});break} this.opt.container.appendChild(this.canvas);if(this.opt.autostart){this.start()}} SiriWave3.prototype.hex2rgb=function(hex){var shorthandRegex=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;hex=hex.replace(shorthandRegex,function(m,r,g,b){return r+r+g+g+b+b});var result=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);return result?"".concat(parseInt(result[1],16).toString(),",").concat(parseInt(result[2],16).toString(),",").concat(parseInt(result[3],16).toString()):null};SiriWave3.prototype.intLerp=function(v0,v1,t){return v0*(1-t)+v1*t};SiriWave3.prototype.lerp=function(propertyStr){var prop=this.interpolation[propertyStr];if(prop!==null){this[propertyStr]=this.intLerp(this[propertyStr],prop,this.opt.lerpSpeed);if(this[propertyStr]-prop===0){this.interpolation[propertyStr]=null}} return this[propertyStr]};SiriWave3.prototype.clear=function(){this.ctx.globalCompositeOperation="destination-out";this.ctx.fillRect(0,0,this.width,this.height);this.ctx.globalCompositeOperation="source-over"};SiriWave3.prototype.draw=function(){this.curves.forEach(function(curve){return curve.draw()})};SiriWave3.prototype.startDrawCycle=function(){this.clear();this.lerp("amplitude");this.lerp("speed");this.draw();this.phase=(this.phase+Math.PI/2*this.speed)%(2*Math.PI);if(window.requestAnimationFrame){this.animationFrameId=window.requestAnimationFrame(this.startDrawCycle.bind(this))}else{this.timeoutId=setTimeout(this.startDrawCycle.bind(this),20)}};SiriWave3.prototype.start=function(){if(!this.canvas){throw new Error("This instance of SiriWave has been disposed, please create a new instance")} this.phase=0;if(!this.run){this.run=!0;this.startDrawCycle()}};SiriWave3.prototype.stop=function(){this.phase=0;this.run=!1;if(this.animationFrameId){window.cancelAnimationFrame(this.animationFrameId)} if(this.timeoutId){clearTimeout(this.timeoutId)}};SiriWave3.prototype.dispose=function(){this.stop();if(this.canvas){this.canvas.remove();this.canvas=null}};SiriWave3.prototype.set=function(propertyStr,value){this.interpolation[propertyStr]=value};SiriWave3.prototype.setSpeed=function(value){this.set("speed",value)};SiriWave3.prototype.setAmplitude=function(value){this.set("amplitude",value)};return SiriWave3})());return SiriWave2}))}});var import_siriwave=__toESM(require_siriwave_umd());var dom=document.createElement("div");var siriWave;siriWave=new import_siriwave.default({container:dom,height:300,style:"ios9",width:250});siriWave.start();this.ondestroy=()=>{siriWave.dispose();console.warn("Removed")};return dom ``` # Markdown Type `.md` in the first line of an input cell and start writing Markdown on a new line: ``` .md # Notebook Title Here are my beautiful notes ``` <h2 style={{fontSize:'larger'}}> Notebook Title </h2> Here are my beautiful notes Markdown is the main language for textual (narrative) cells in WLJS Notebook. Markdown cells inherit features of [WLX](./WLX) and [HTML](./HTML) cells. Hide input cells using **cell group properties** — see [Overview](./../Overview) Markdown Syntax [#markdown-syntax] Headings [#headings] Use `#` for headings, increasing the number of `#` for smaller headings: ``` .md # Heading 1 ## Heading 2 ### Heading 3 ``` Emphasis [#emphasis] Use `*` or `_` for italics, and `**` or `__` for bold: ``` .md *italic* or _italic_ **bold** or __bold__ ``` Lists [#lists] Create unordered lists with `*`, `+`, or `-`, and ordered lists with numbers followed by a period: ``` .md - Item 1 - Item 2 - Subitem 1 1. First item 2. Second item 3. Subitem 1 ``` Links [#links] Create links using `[text](URL)`: ``` .md [Tree](https://en.wikipedia.org/wiki/Tree) ``` Images [#images] Embed images using `![alt text](URL)`: ``` .md ![Tree](https://upload.wikimedia.org/wikipedia/commons/e/eb/Ash_Tree_-_geograph.org.uk_-_590710.jpg) ``` Files can be remote or local (in the notebook folder). **Try dragging and dropping any image into a markdown cell.** Drawing board (Canvas) [#drawing-board-canvas] We use the amazing [Excalidraw](https://excalidraw.com/) editor for complex drawings, right inside a markdown input cell. Try typing: ``` .md !![] ``` A corresponding SVG image will be generated in the output cell. You can drag and drop images 🏞️ on the canvas. It will be uploaded and stored in the notebook If you want to copy the canvas as PNG or SVG - use **context menu** of the canvas Blockquotes [#blockquotes] Create blockquotes using `>`: ``` .md > This is a blockquote. ``` Code [#code] Use backticks for inline code and triple backticks for code blocks: ``` .md \`inline code\` \`\`\` code block \`\`\` ``` Horizontal Rule [#horizontal-rule] Create a horizontal rule with three or more dashes, asterisks, or underscores: ``` .md --- *** ___ ``` Tables [#tables] Create tables using pipes `|` and dashes `-`: ``` .md | Header 1 | Header 2 | |----------|----------| | Cell 1 | Cell 2 | | Cell 3 | Cell 4 | ``` Highlighter [#highlighter] Use `==` to highlight text: ``` .md Here is ==my hello world== ``` Admonitions [#admonitions] Use the following syntax: ``` .md :::tip Use admonitions! ::: ``` The following types have special highlighting: `tip`, `info`, `warning`, `danger`, and `todo`. Unknown types will be treated as `info`. You can also define your own custom type: ``` .html <style> .admonition.yourtype { background-color: pink; } </style> ``` TODO Lists [#todo-lists] The `todo` tag adds a live button-counter at the top of the page, serving as a reminder. Bookmarks [#bookmarks] You can place a bookmark on the page using: ``` .md @bookmark ``` It will appear as an icon at the top. Clicking it will scroll to the bookmarked content. Page breaks [#page-breaks] For printing exported PDF or [HTML](./HTML) it comes handy to control page breaks manually. Use: * `PageBreakAbove` * `PageBreakBelow` For example ``` .md Here it breaks in two <PageBreakBelow/> ``` HTML Tags [#html-tags] You can use **plain HTML**, styles, scripts to stylize markdown or embed media objects as usual LaTeX [#latex] We use KaTeX as the render engine. To write an equation, wrap it inside `$` for inline or `$$` for a block: ``` .md $$ E = \\\\hbar \\\\omega $$ ``` If you don't want to escape Markdown commands in your LaTeX code, please, consider to use [LaTeX](./Misc) cell type Backslashes [#backslashes] To have full compatibility with Markdown syntax you have to escape all backslashes. For example, write `\\alpha` instead of `\alpha`. Trailing underscores [#trailing-underscores] To avoid misinterpretation for `__` markdown command, you need to escape such cases. For example, instead of **this** ``` .md $$ \\hat{\\alpha}_{x} - \\hat{\\beta}_{} $$ ``` try to write this ``` .md $$ \\\\hat{\\\\alpha}\\_{x} - \\\\hat{\\\\beta}\\_{} $$ ``` See [here](https://katex.org/docs/supported.html) for all supported LaTeX functions. WLX [#wlx] Markdown cells inherit features of [WLX](./WLX) cells Embed Figures [#embed-figures] For example, if you create a 3D plot: ``` Figure = Plot3D[Sin[x] Cos[y], {x, -5, 5}, {y, -5, 5}]; ``` Make sure the first letter in a symbol name is capitalized. This is required by WLX syntax. Then you can embed it into a markdown cell using a custom tag: ``` .md Hello there! Here is my plot <br/> <Figure/> ``` Calculate something on-spot using [ToExpression](./../Programming-Constructs/ToExpression): ``` .md So far so good. The error is around <ToExpression>0.6 180/Pi</ToExpression> ``` Autoupload [#autoupload] Drag and drop files into the editor or paste media from the clipboard # Misc Image Preview [#image-preview] You can drop any image available in the folder of your notebook and type its filename in a new cell. ``` randompic.png ``` Reading and Writing Files [#reading-and-writing-files] In principle, you can **print the contents of any file** located in the notebook's folder by typing its name without line breaks. ``` filename.txt ``` For writing, the process is the same, but the actual content goes on the next line: ``` filename.txt Hello World ``` Shell [#shell] You can type commands directly into your system shell. The `PATH` is automatically imported from your terminal, and the working directory is set to `NotebookDirectory[]`. ``` .sh ls ``` Use global shortkey <kbd>Alt+.</kbd> to interrupt the running process LaTeX [#latex] There is a dedicated cell type solely to render LaTeX equations. You can still do it using [Markdown](./Markdown), but if for some reason you have troubles mixing MD and TeX, here you go ``` .latex \\alpha^2 + \\beta^2 ``` This also does not require escaping TeX code with double slashes unlike other cell types. Mermaid [#mermaid] Draw beautiful diagrams using code: ``` .mermaid pie title NETFLIX "Time spent looking for movie" : 90 "Time spent watching it" : 10 ``` You can also apply custom styling: ``` .mermaid %%{init: { 'theme': 'base', 'themeVariables': { 'primaryColor': '#ffcc00', 'edgeLabelBackground':'#ffffff', 'tertiaryColor': '#F0F0F0'}}}%% graph TD; A-->B; A-->C; B-->D; C-->D; ``` # Slide import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; Type `.slide` in the first line of an input cell and start writing Markdown slide on a new line: ``` .slide # Presentation Title You can also create presentations using the WLJS Notebook. ``` ``` # Presentation Title You can also create presentations using the WLJS Notebook. ``` <Accordions> <Accordion title="Demonstration 1"> <LazyAutoplayVideo className={' '} url={"/ppt-dpg.mp4"} /> </Accordion> <Accordion title="Demonstration 2"> <LazyAutoplayVideo url={"/slides-example.mp4"} /> </Accordion> </Accordions> Slide cells inherit the features of [Markdown cells](./Markdown), [WLX](./WLX) and [HTML](./HTML), event listeners for slide events, fragment animations, and the option to export all slides as PDF. To **enter fullscreen** mode, press the `f` key after focusing (click) on a slide. To enable **virtual pointer**, press the `q` key after focusing (click) on a slide. Use the **project** feature (<kbd>Ctrl-Shift-Enter</kbd> or <kbd>⌘-Shift-Enter</kbd>) of cell properties to show slides in a separate window. Note that the slide cell will also be evaluated within the context of a new window A guide on advanced presentation with event handling and effects An advanced guide on making interactive component-based presentations </Cards> Basics [#basics] Creating Individual Slides [#creating-individual-slides] Each `.slide` cell creates a single presentation slide. You can write multiple slides across different cells in your notebook: ``` .slide # First Slide Content for the first slide ``` ``` .slide # Second Slide Content for the second slide ``` Separating Slides Within a Cell [#separating-slides-within-a-cell] Within a single `.slide` cell, you can create multiple slides by separating them with `---`: ``` .slide # First Slide This is the first slide --- # Second Slide This is the second slide --- # Third Slide This is the third slide ``` Merging All Slides [#merging-all-slides] To combine all slides from different cells across your notebook into a single presentation, use the plural form: ``` .slides Thank you for the attention ``` This will merge and render all slide cells in the notebook as one continuous presentation, allowing you to navigate through all slides sequentially. Layout [#layout] Standard text to the left, full-height layout: ``` .slide <!-- .slide: class="slide-standard" --> # Title Content ``` Scrollable slide ``` .slide <!-- .slide: class="slide-standard-scroll" --> ## Title <br/><br/><br/> ...large content goes <br/><br/><br/> ...large content goes <br/><br/><br/> ...large content goes <br/><br/><br/> <br/><br/><br/> ...large content goes <br/><br/><br/> ...large content goes <br/><br/><br/> ...large content goes <br/><br/><br/> ``` Rows [#rows] Use plain HTML and plain CSS (or our predefined classes) to create rows and columns: ``` .slide # Example <div class="flex justify-between"> <div> ## Subtitle 1 Content goes... </div> <div> ## Subtitle 2 Content goes... </div> </div> ``` Add **extra line breaks** to separate HTML tags and embeded Markdown code. <Accordions> <Accordion title="Grid of images"> Using `grid` display property of CSS, we can automatically align many images perfectly on the slide: ``` .slide <div style=" display: grid; grid-template-columns: repeat(auto-fill, minmax(400px, 2fr)); gap: 20px; justify-content: center; align-content: space-around; align-items: baseline; justify-items: center; "> ![](/attachments/yourImage1.png) ![](/attachments/yourImage2.png) ![](/attachments/yourImage3.png) ![](/attachments/yourImage4.png) </div> ``` </Accordion> </Accordions> Or create your [custom layout components](./../Advanced/Component-based-markup) using [WLX](#WLX). Fragments [#fragments] Fragments allow you to reveal content incrementally on a slide. Use the `<!-- .element: class="fragment" -->` comment syntax to make elements appear one at a time when you advance the presentation: ``` .slide # Incremental Content This appears first <!-- .element: class="fragment" --> This appears second <!-- .element: class="fragment" --> This appears third <!-- .element: class="fragment" --> ``` Fragment Animations [#fragment-animations] You can customize how fragments appear using different animation classes: ``` .slide # Fragment Animations Fade in <!-- .element: class="fragment fade-in" --> Fade out <!-- .element: class="fragment fade-out" --> Slide up while fading in <!-- .element: class="fragment fade-up" --> Slide down while fading in <!-- .element: class="fragment fade-down" --> Slide left while fading in <!-- .element: class="fragment fade-left" --> Slide right while fading in <!-- .element: class="fragment fade-right" --> Fades in, then out on next step <!-- .element: class="fragment fade-in-then-out" --> Fades in, then semi-out <!-- .element: class="fragment fade-in-then-semi-out" --> Highlight red <!-- .element: class="fragment highlight-red" --> Highlight green <!-- .element: class="fragment highlight-green" --> Highlight blue <!-- .element: class="fragment highlight-blue" --> Grow <!-- .element: class="fragment grow" --> Shrink <!-- .element: class="fragment shrink" --> ``` Fragment Order [#fragment-order] Control the order in which fragments appear using the `data-fragment-index` attribute: ``` .slide # Custom Fragment Order Appears third <!-- .element: class="fragment" data-fragment-index="3" --> Appears first <!-- .element: class="fragment" data-fragment-index="1" --> Appears second <!-- .element: class="fragment" data-fragment-index="2" --> ``` Backgrounds [#backgrounds] Background Colors [#background-colors] Add background colors to individual slides using HTML attributes: ``` .slide <!-- .slide: data-background-color="#ff0000" --> # Red Background This slide has a red background ``` Background Images [#background-images] Set background images for more visual presentations: ``` .slide <!-- .slide: data-background-image="https://example.com/image.jpg" --> # Image Background Content over the background image ``` Background Options [#background-options] Customize background behavior with additional attributes: ``` .slide <!-- .slide: data-background-image="image.jpg" data-background-size="cover" data-background-position="center" data-background-opacity="0.5" --> # Custom Background - \`data-background-size\`: \`cover\`, \`contain\`, or specific size - \`data-background-position\`: Position of the image - \`data-background-opacity\`: Opacity from 0 to 1 ``` Transitions [#transitions] Slide Transitions [#slide-transitions] Control how slides transition using the `data-transition` attribute: ``` .slide <!-- .slide: data-transition="zoom" --> # Zoom Transition Available transitions: \`none\`, \`fade\`, \`slide\`, \`convex\`, \`concave\`, \`zoom\` ``` Plain HTML Support [#plain-html-support] Slide cells support plain HTML mixed with [Markdown syntax](./Markdown) and [WLX](./WLX). This allows you to embed rich content like websites, videos. For example: ``` .slide <iframe style="margin-left:auto; margin-right:auto; border-radius: 10px" width="600" height="500" src="https://wljs.io/"> </iframe> ``` WLX Integration (Data-driven Slides) [#wlx-integration-data-driven-slides] Slide cells inherit features from the [WLX](./WLX) cell type, similar to [Markdown](./Markdown) cells. This feature enables dynamic, interactive content within your presentations: ``` .slide Today is <Now/> ``` or embed an entire interactive plot ``` pts = RandomReal[10, {100, 2}]; MyFigure = ListLinePlot[pts[[Last@FindShortestTour[pts]]], Epilog->{Point[pts]}, ImageSize->500] ``` ``` .slide Compute and plot the shortest tour through 100 random points: <MyFigure/> ``` A guide on how to make dynamic event-based slides, use components and layout helpers An advanced guide on how to build reusable components for slides and more </Cards> LaTeX Support [#latex-support] Slides use KaTeX as the rendering engine for mathematical equations. Wrap inline equations in single `$` symbols, or use `$$` for block equations: ``` .slide # Mathematical Equations Inline equation: $E = mc^2$ Block equation: $$ E = \\\\hbar \\\\omega $$ ``` Animated equations [#animated-equations] > This particular technique was developed by [Cian Luke Martin](https://www.cianlm.dev/) and is essentially a post-processing engine for SVGs generated from LaTeX equations You can create Manim-like animated equations: ``` .slide ## Animated LaTeX $$ \\\\begin{align*} \\\\mathbf{E}(t,x) &= \\\\sum_{\\\\omega} \\\\mathbf{E}_0^{\\\\omega} ~ exp\\\\Big( i\\\\omega t - \\\\frac{i\\\\hat{n}(\\\\omega) \\\\omega x}{c}\\\\Big) \\\\\\\\ &= \\\\sum\\\\mathbf{E}_0^{\\\\omega} \\\\colorbox{white}{$exp(-\\\\frac{\\\\alpha x}{2})$} ~exp\\\\Big(i\\\\omega t - \\\\frac{i n \\\\omega x}{c}\\\\Big) \\\\end{align*} $$ <!-- .element: data-eq-speed="0.1" --> ``` See additional features: <Accordions> <Accordion title="Options"> Animation Speed (data-eq-speed) [#animation-speed-data-eq-speed] The time increment (in seconds) between each stroke ``` .slide ## Animated LaTeX $$ m a = F $$ <!-- .element: data-eq-speed="0.7" --> $$ m a = F $$ <!-- .element: data-eq-speed="0.1" --> ``` Color/Color Gradient (data-eq-gradient) [#colorcolor-gradient-data-eq-gradient] Any number of colors n≥1 is accepted (as well as RGB/hex values) ``` .slide ## Animated LaTeX $$ m a = F $$ <!-- .element: data-eq-gradient="['red', 'gold']" --> ``` Color Precession (data-eq-color-precess) [#color-precession-data-eq-color-precess] The gradient precesses in a loop ``` .slide ## Animated LaTeX $$ m a = F $$ <!-- .element: data-eq-gradient="['red', 'gold']" data-eq-color-precess="true" --> ``` Bypass the animation (data-eq-static) [#bypass-the-animation-data-eq-static] This is used to skip the animation while still using MathJax for rendering instead of standard KaTeX. It can be used to unify the look of all equations. Fragments [#fragments-1] You can also combine this with [Fragments](##Fragments) in the usual way. The only condition is that the `fragment` class must be in the same `.element` selector as the options for animating ``` .slide ## Animated LaTeX $$ m a = m g $$ <!-- .element: class="fragment" data-eq-speed="0.3" --> $$ m a = m g + F_{ext} $$ <!-- .element: class="fragment" data-eq-speed="0.3" --> ``` </Accordion> </Accordions> Backslashes [#backslashes] For full compatibility with Markdown syntax, escape all backslashes in LaTeX commands. Write `\\alpha` instead of `\alpha`. See [Markdown cells](./Markdown) for more information Drawings [#drawings] Slides integrate the [Excalidraw](https://excalidraw.com/) editor for creating drawings directly within your presentations. To create a drawing, type: `!![]` This will open the Excalidraw editor, and the resulting drawing will be saved as an SVG image in the output cell. Export Options (Share) [#export-options-share] You can export slides in multiple formats: * Export notebook as a standalone HTML file * Export only slides as a PDF file Auto-upload Images [#auto-upload-images] Slides support automatic image uploading: * **Drop a file**: Drag and drop image files directly onto your slide * **Paste a media file**: Copy an image and paste it directly into the slide editor By the default all dropped/pasted images are uploaded to the working directory Events [#events] To capture events such as slide or fragment reveals, use [SlideEventListener](./../Slides/SlideEventListener): ``` .slide # 1st Slide Nothing --- # 2nd Slide A message pops up Another message <!-- .element: class="fragment" data-fragment-index="1" --> <SlideEventListener Id={"myEvent"}/> ``` Before evaluating, attach an event handler: ``` EventHandler["myEvent", { "Slide" -> (Print["Hey there!"]&), "fragment-1" -> (Print["Hey there from fragment!"]&) }] ``` The identifier acts as an event object with these patterns: * `"Slide"` — fired when a slide is revealed * `"Mounted"` - fired when the presentation is ready to show * `"Left"` - fired when you left the slide * `"Destroy"` - fired when this slide cell was destroyed * `"fragment-INDEX"` — fired when a fragment `INDEX` is revealed You can assign as many listeners to the same slide as you want. Use this feature to scope events to [your components](./../Advanced/Component-based-markup) Check out the examples on triggered animations and more: A guide on how to make dynamic event-based slides, use components and layout helpers </Cards> Misc [#misc] Embedding PDFs or Websites [#embedding-pdfs-or-websites] With full HTML support, you can embed a local PDF: ``` .slide <embed width="800" height="500" src="/attachments/antisymmetry.pdf"/> ``` Or an entire website: ``` .slide <iframe width="800" height="500" src="https://wikipedia.com" style="border: none; border-radius: 4px"/> ``` The Marquee element [#the-marquee-element] This element is used to insert a scrolling area of text. You can control what happens when the text reaches the edges of its content area using its attributes. ``` .slide # Title <marquee>Hello World</marquee> ``` Mark [#mark] This HTML element represents text which is **marked** or **highlighted** ``` .slide # Title <mark>salamander</mark> ``` JavaScript Code [#javascript-code] Any `script` tag will execute after slides are mounted and **scoped to the slide** (aka module): ``` .slide <div id="dtext">Hello World</div> <script> document.getElementById('dtext').style.background = "yellow" </script> ``` If you use unique `id` for elements on the slide, please, remove the output cell before reevaluating the input one. Otherwise two identical elements might coexist on the same page, which then cause issues with bindings to JS. # WLX Type `.wlx` in the first line of an input cell and start writing WLX on a new line: import {Tab, Tabs} from 'fumadocs-ui/components/tabs'; ``` .wlx <Now/> ``` ``` Fri 2 Jan 2026 16:11:04 ``` Make sure the first letter in a symbol name is capitalized. This is required by WLX syntax. This allows you to use Wolfram Language XML extension in your cell. It's extremely powerful and especially useful when creating complex cell structures, components for [presentations](./Slide), mini-apps, or enhancing output with the power of HTML, CSS, and JavaScript. An advanced guide on how to build reusable components for slides and more </Cards> You can think of WLX as WL and plain HTML extended to work with each other. It allows you to write Wolfram Language using XML tags and build HTML templates using Wolfram Expressions. Unlike JSX, you can write a plain HTML inside WLX scripts with no restrictions. Tags [#tags] Wolfram expressions always start with a capital letter, while plain `HTML` tags must remain in a lower case: <Tabs items={['HTML tag', 'Wolfram Expression']}> <Tab value="HTML tag"> ``` .wlx <div></div> ``` </Tab> <Tab value="Wolfram Expression"> ``` .wlx <Div></Div> ``` </Tab> </Tabs> Ownvalues and Downvalues [#ownvalues-and-downvalues] `OwnValue` of a symbol corresponds to **self-closing** tags with no attributes, while `DownValue` of a symbol corresponds to normal tags with or without attributes. For example: ```wolfram TimeNow := TextString[Now]; StringReverse[TimeNow] ``` can be written as ``` .wlx TimeNow := TextString[Now]; <StringReverse> <TimeNow/> </StringReverse> ``` **First child** element is the **first argument** of a given function and etc. Any symbol defined within WLX cell is in `Global`` context Output form [#output-form] Any symbol in Wolfram Language has a few predefined output forms. `StandardForm` is shown in all output cells, while `WLXForm` is shown in WLX, [slide](./Slide), [markdown](./Markdown) output cells and is usually some sort of a string. If `WLXForm` is not defined for a given symbol, `ToString` is applied For example: ``` SpecialSymbol; SpecialSymbol /: MakeBoxes[SpecialSymbol, WLXForm] := MakeBoxes["Hey!", WLXForm] ``` then if you evaluate `SpecialSymbol` in WLX cell, it will print `"Hey!"` to a DOM tree: ``` .wlx <SpecialSymbol/> ``` Many symbols have [predefined `WLXForm`](./../Advanced/Decorating-symbols), namely: `Graphics`, `Graphics3D`, `Image`, `EventObject`, any GUI input elements and many more. However, a basic plot will work out of the box: ``` MyPlot = Plot[x, {x,0,1}]; ``` ``` .wlx <MyPlot/> ``` Passing arguments [#passing-arguments] 1. Any argument passed to an expression is converted to a string (or specifically `WLXForm`) 2. Plain text content counts as an argument too 3. Tags attributes are passed as options Here is a function, that takes 3 arguments, but prints only the 2nd one: ``` .wlx SomeFunction[Arg1_, Arg2_, Arg3_] := <h3><Arg2/></h3> <SomeFunction> <div>You will not see me</div> You will see only me <Now/> </SomeFunction> ``` Attributes interpolation [#attributes-interpolation] This is a crucial thing, when it comes to a markup. **Curly braces with double quotes** can be used to interpolate strings in HTML attributes: ``` .wlx With[{ url = "upload.wikimedia.org/wikipedia/commons/7/70/Oftheunicorn.jpg" }, <img width="300" src="https://{url}"/> ] ``` Any Wolfram expressions are allowed inside the braces ``` .wlx With[{ url = {"upload.wikimedia.org/wikipedia/commons/7/70/Oftheunicorn.jpg"} }, <img width="300" src="https://{url[[1]]}"/> ] ``` Attributes of symbols [#attributes-of-symbols] If you pass an HTML attribute to a Wolfram symbol, it will be translated to an option, i.e. ``` .wlx <Heading title={"Some title"}/> ``` where we defined `Heading` as ``` .wlx Heading[OptionsPattern[]] := With[{Title = OptionValue["title"]}, <h1>This is some <Title/></h1> ] Options[Heading] = {"title" -> "Empty title"} ``` The same can be done for tags with children: ``` .wlx <TagName option1={1+1} option2={Now}> whatever </TagName> ``` where all passed arguments **go firstly and before** the `OptionsPattern[]`: ``` .wlx TagName[child_, OptionsPattern[]] := ... TagName[children__, OptionsPattern[]] := ... ``` Escaping [#escaping] Use special `<Escape>` tag to avoid interpretation of tags inside: ``` .wlx <Escape> <Div>It won't be parsed by WLX</Div> </Escape> ``` The inner content will not be parsed and, but will be returned as string Iterators, branching? [#iterators-branching] `HTML/XML` is a markup language by its nature. Therefore we recommend to use Wolfram Language making tables, conditional rendering for that: ``` .wlx Columns[YourList__] := Table[ <div class="lg:pr-4"> <div class="text-base leading-7 text-gray-700 "> <Child/> </div> </div> , {Child, List[YourList]}]; <div class="flex flex-col"> <Columns> <p>This is column 1</p> <p>This is column 2</p> <p>This is column 3</p> </Columns> </div> ``` Here a multiple `<p>` tags are substituted as a sequence of arguments to `Columns` function, that iterates over them and forms a wrapper HTML structure. Then the result is substituted into the bottom `div col` structure. Here is another way to build lists from raw data: ``` .wlx With[{ TableList = Table[ With[{SomeField = item["Field"]}, <li class="red"><SomeField/></li> ] , {item, YouList}] }, <ul> <TableList/> </ul> ] ``` Putting a plain text separated by multiple linebreaks counts as a single argument. Wrap each line with `<span>` or `<p>` or `<Identity>` if you want them to be separable A few things to keep in mind [#a-few-things-to-keep-in-mind] There are certain rules you should sticked to in order to avoid headaches Keep only one or zero root element [#keep-only-one-or-zero-root-element] This implies that this one will be exported to the output, like in `CompoundExpression`. Always close any XML tags [#always-close-any-xml-tags] Modern web-browsers are quite forgiving, when it comes to the syntax mistakes. WLX parser decodes the whole tree of HTML and WL and, then, builds an AST. Therefore, always close tags explicitly ``` .wlx <img src="http://..."/> ``` More examples [#more-examples] Embed Figures into a Custom Layout [#embed-figures-into-a-custom-layout] Plot a function and assign it to a symbol: ``` Figure = Plot[Sinc[5x], {x, -5, 5}] ``` Then, in a new cell, type: ``` .wlx <div> <style> @keyframes tilt-shaking { 0% { transform: rotate(0deg); } 25% { transform: rotate(5deg); } 50% { transform: rotate(0deg); } 75% { transform: rotate(-5deg); } 100% { transform: rotate(0deg); } } </style> <div style="animation: tilt-shaking 0.35s infinite"> <Figure/> </div> </div> ``` Now your plot will shake infinitely 😉 Creating Components [#creating-components] Let's define a hybrid WL function: ``` Heading[Text_, OptionPattern[]] := With[{color = OptionValue["Color"]}, <h2 style="color: {color}"><Text/></h2>; ] Options[Heading] = {"Color" -> "black"}; ``` You can now use it in your layout: ``` .wlx <Heading Color={"blue"}> Hello World! </Heading> ``` this will work on [slides](./Slide) and [markdown](./Markdown) cells as well: ``` .slide # Slide title <Heading Color={"red"}> Hello World! </Heading> ``` Two-Column Layout Using Flexbox [#two-column-layout-using-flexbox] You can fine-tune the layout since you're working directly with HTML and CSS. For example, here's a slider and a plot aligned in a row: ``` .wlx Module[{Slider = InputRange[0.1, 1, 0.1, 0.5], Figure, lines}, EventHandler[Slider, Function[data, lines = {#, Sinc[#/data]} & /@ Range[-5, 5, 0.1]]]; Slider // EventFire; Figure = Graphics[Line[lines // Offload], ImageSize -> 350]; <div style="display: flex"> <div><Slider/></div> <div><Figure/></div> </div> ] ``` # Wolfram Language An input cell is a multi-tool. By default, it assumes Wolfram Language as input if no other patterns are found in the first line: ``` 1+1 ``` ``` 2 ``` Read our fast-track introduction on Wolfram Language at [that page](./../Wolfram-Language) If an output is too large, it may be truncated or converted into a temporary symbol to reduce editor load. This can be adjusted in the editor's settings. Morph Output Cell into Input [#morph-output-cell-into-input] If you modify a Wolfram Language **output cell**, it will automatically be converted into a new **input cell**. Auto-upload Files [#auto-upload-files] Drag and drop files into the editor or paste media from the clipboard Syntax Highlighting & Symbol Tracking [#syntax-highlighting--symbol-tracking] Wolfram Language autocomplete and highlighting can be extended using external packages. Once a symbol is defined in the \`Global\`\` context of a Wolfram Kernel session, it appears in the autocomplete window and is shared across open notebooks. At startup, the Wolfram Kernel loads all imported packages, reads `::usage` directives for defined symbols. Autocomplete for loaded packages [#autocomplete-for-loaded-packages] You can enable periodic checking in the editor's settings for newly loaded packages (not user-defined symbols) information upon `Get` or `Needs` commands. Access to Documentation [#access-to-documentation] Click the 🔎 icon in the autocomplete window to open the documentation for a symbol in a new tab. Opening documentation for another symbol will not create an extra window, but it will refresh the existing one. Therefore you can safely arrange the windows **in a fixed layout** # Beep ```wolfram Beep[] ``` make a sound notification. It does not require any context or window object. ```wolfram Beep["Your Message"] ``` make a sound notification and pops up a message dialog window with your message. *Only for desktop application* To make system beep sound use ```wolfram Beep["System"] ``` Example [#example] Click on this button to make sound ```wolfram EventHandler[InputButton[], Beep] ``` # CellPrint ```wolfram CellPrint[expr_] _RemoteCellObj ``` ```wolfram CellPrint[cellExpr_] _RemoteCellObj ``` Inserts a new cell directly below the currently evaluated one. The expression `expr` is automatically converted to a [StandardForm](../Formatting/StandardForm) output cell. Alternatively, `cellExpr` can be any of the following cell types: * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output"]` * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output", subtype_String]` * `TextCell[expr_String]` * `TextCell[expr_String, "Title"]` * `TextCell[expr_String, "Section"]` * `TextCell[expr_String, "Subsection"]` * `ExpressionCell[expr_, "Input"]` * `ExpressionCell[expr_, "Output"]` where the `subtype` property can be any view component from the available cell types: * `"WLX"` or `"wlx"` * `"HTML"` or `"html"` * `"JS"` or `"js"` or `"javascript"` * `"MERMAID"` or `"mermaid"` * ... `CellPrint` returns the created [RemoteCellObj](./RemoteCellObj), which can be further manipulated. See also the more comprehensive functions [NotebookWrite](./NotebookWrite) and [CreateWindow](./CreateWindow) for generating cells. Examples [#examples] Basic usage [#basic-usage] Print a cell after the current one, displaying the current date: ```wolfram cell = CellPrint[Now]; ``` Then remove it: ```wolfram NotebookDelete[cell]; ``` Using different renderers [#using-different-renderers] You can use [WLX](frontend/Cell-types/WLX) view components as well. First, create a template in a separate cell: ```jsx .wlx wlTest[P_] := <div class="p-1 rounded" style="border: 1px solid blue"><P/></div> ``` Then wrap it in the corresponding cell representation: ```wolfram CellPrint[Cell[wlTest[Plot[x, {x,0,1}]], "Output", "wlx"]]; ``` # Cells ```wolfram Cells[] Cells[notebook] ``` return all cells in the `notebook` or evaluation notebook. To read all cells of the notebook **fast** use: ```wolfram NotebookRead[Cells[]] ``` # CreateDocument ```wolfram CreateDocument[{cell1, cell2, ...}, opts___] _RemoteNotebook ``` creates a notebook in memory and populates it with cells, where `celli` can be: * `_` any expressions (automatically converted to the input cell) * `_String` expression (automatically converted to text cells aka markdown) * `ExpressionCell[expr_, "Input"]` * `ExpressionCell[expr_, "Output"]` * `TextCell[expr_]` * `TextCell[expr_, "Title"]` * `TextCell[expr_, "Section"]` * `TextCell[expr_, "Subsection"]` * `CellGroup[{cells...}]` a group of cells (it will be flattened and it is kept only for compatibility with Mathematica) The expression returns [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) For example: ```wolfram CreateDocument[{"Here is a plot example", Plot[x, {x,0,1}]}, Visible->False] // NotebookOpen ``` Specify the cells style: ```wolfram CreateDocument[{TextCell["S1", "Section"], ExpressionCell[x^2, "Input"]}]; ``` Use `Defer` ```wolfram CreateDocument[Defer[1 + 1]]; ``` Options [#options] Visible [#visible] By the default is `True`, that opens a notebook automatically after using provided `"Window"` "Window" [#window] For the case if `Visible->True` it will use [CurrentWindow](../Frontend-IO/CurrentWindow) by the default to pop up a new window # CreateWindow ```wolfram CreateWindow[notebook_RemoteNotebook] ``` opens a notebook in a new window ```wolfram CreateWindow[expr, opts] ``` creates a new window with `expr` shown in `StandardForm`. `CreateWindow` returns [RemoteCellObj](./RemoteCellObj). ```wolfram CreateWindow[cellExpr, opts] ``` creates a new window with `cellExpr` rendered: * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output"]` * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output", subtype_String]` * `TextCell[expr_String]` * `TextCell[expr_String, "Title"]` * `TextCell[expr_String, "Section"]` * `TextCell[expr_String, "Subsection"]` * `ExpressionCell[expr_, "Input"]` * `ExpressionCell[expr_, "Output"]` `subtype` property can be any view-component provided by known cell types: * `"WLX"` or `"wlx"` * `"HTML"` or `"html"` * `"JS"` or `"js"` or `"javascript"` * `"MERMAID"` or `"mermaid"` * ... here `CreateWindow` also returns [RemoteCellObj](./RemoteCellObj). Options [#options] WindowSize [#windowsize] Sets size `{w,h}` of the created window in pixels. WindowTitle [#windowtitle] Sets the name of created window. "Notebook" [#notebook] Specify the notebook (optional) associated with a created window. Examples [#examples] Basic examples [#basic-examples] Print graphics to a new window: ```wolfram win = CreateWindow[Graphics3D[Cuboid[]]]; ``` then close it: ```wolfram NotebookClose[win]; ``` Print HTML content to a new window: ```wolfram CreateWindow[Cell["<h2 style=\"color:red\">Hello World</h2>", "Output", "HTML"]]; ``` A window that opens another window [#a-window-that-opens-another-window] This is possible if you provide the notebook in [Options](#Options); otherwise, the system does not know where to open it: ```wolfram man := ManipulatePlot[Sin[x w], {x,-1,1}, {w,1,5}]; open[n_] := CreateWindow[man]; CreateWindow[EventHandler[InputButton[], Function[Null, open[n]]]] ``` This will continue to work even if you close the original notebook. Tracking created window [#tracking-created-window] You can assign handlers to events from the window: ```wolfram state = ""; TextView[state // Offload, "Label"->"State"] win = CreateWindow[ExpressionCell[Plot[x,{x,0,1}], "Output"]]; EventHandler[win, { "Mounted" -> Function[Null, state = "Mounted"], "Closed" -> Function[Null, state = "Closed"] }]; ``` The `Mounted` event provides `WindowObj`, which can be used together with `FrontSubmit` and `FrontFetch` to trigger actions in the created window. # CurrentNotebookImage Generates a raster image of the current notebook ```wolfram CurrentNotebookImage[] ``` This is a blocking function. Avoid using it with buttons or async events This feature requires running WLJS Notebook as desktop app # EvaluateCell ```wolfram EvaluateCell[cell_RemoteCellObj, opts___] ``` evaluates interactively a cell in current notebook given by [RemoteCellObj](../Cells-and-Notebook/RemoteCellObj) This only tells a UI to evaluate a given cell interactively if a user would click to evaluate Options [#options] "Target" [#target] Specifies where to output the result. Default is `"Notebook"`, possible values * `"Notebook"` or `Null` * `"Window"` or `_` makes the output to be projected to a new window # EvaluationCell returns a source input-cell as a [RemoteCellObj](../Cells-and-Notebook/RemoteCellObj) from the evaluation context ```wolfram EvaluationCell[] _RemoteCellObj ``` # EvaluationNotebook returns a [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) object of a current notebook from the evaluation context ```wolfram EvaluationNotebook[] _RemoteNotebook ``` # HapticFeedback Only for MacOS users and desktop application ```wolfram HapticFeedback[] ``` produces vibrations on native trackpad or external one. The same function is called on a slider from [InputRange](../GUI/InputRange) For example: ```wolfram Module[{balls1, balls2, balls3, ev = CreateUUID[]}, balls1 = balls2 = balls3 = {RandomReal[{-0.5,0.5}, 2]}; balls2 = balls2 + {0.01 RandomReal[{-1,1}, 2]}; EventHandler[ev, Function[Null, balls3 = balls2; balls2 = balls1; balls1 = Map[Function[p, If[Norm[p] > 1, HapticFeedback[]; Normalize[p] 0.99 , p ] ], (2 balls2 - balls3)]; ]]; Graphics[{ LightBlue, EventHandler[Disk[], {"click" -> Function[xy, AppendTo[balls1, xy]; AppendTo[balls2, xy + 0.01 RandomReal[{-1,1}, 2]]; AppendTo[balls3, xy]; ]}], Black, PointSize[0.08], Point[balls1 // Offload], AnimationFrameListener[balls1 // Offload, "Event"->ev] }, "Controls"->False, TransitionType->None ] ] ``` Each time a ball bounces off the wall, it produces a vibration. # NotebookClose ```wolfram NotebookClose[_RemoteNotebook] NotebookClose[_RemoteCellObj] ``` closes (if opened) a notebook represented by [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) or removes cell # NotebookDelete Deletes the content from notebook Syntax [#syntax] **Delete cell or projected cell:** ```wolfram NotebookDelete[cell_RemoteCellObj] ``` **Delete multiple items:** ```wolfram NotebookDelete[{item1, item2, ...}] ``` # NotebookDirectory ```wolfram NotebookDirectory[] _String ``` returns a file path to the current notebook. Use it in a multiuser environment, where you cannot rely on `Directory[]` Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. # NotebookEvaluate ```wolfram NotebookEvaluate[_RemoteNotebook, opts___] NotebookEvaluate[path_String | File[path_String], opts___] ``` evaluates all content of provided [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) or by file path following the rules: * all initialization cells are evaluated once for this notebook object * the rest of the remianing cells are evaluated for every call Options [#options] "ContextIsolation" [#contextisolation] By the default is `False`, i.e. all notebook content is placed to `Global` and will be available globally on Kernel. Set to `True` to isolate notebook in generated context. "EvaluationContext" [#evaluationcontext] Allows to manually provide evaluation context, i.e. `System`\$EvaluationContext\`. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [NotebookEvaluateAsync](./NotebookEvaluateAsync) instead. Use [NotebookEvaluateAsModule](./NotebookEvaluateAsModule) if you need to get the output from the evaluated notebook # NotebookEvaluateAsModule ```wolfram NotebookEvaluateAsModule[path_String | f_File] NotebookEvaluateAsModule[notebook_RemoteNotebook] ``` imports WLJS notebook as an isolated module/library: ```wolfram {exports} = NotebookEvaluateAsModule["mySecondNotebook.wln"]; ``` This breaks the evaluation order. The caller cell will be evaluated last in the queue. Consider using the **safer** async version [NotebookEvaluateAsModuleAsync](./NotebookEvaluateAsModuleAsync) instead. The following rules apply: * Initialization cells **are evaluated once** for a given notebook object * The last **Wolfram input cell** is evaluated on every call and its result is exported * All other cells are ignored This allows you to create reusable components using plain notebooks. For example: *Notebook-1.wln* ```jsx title="Initialization cell" .wlx BigHeader[Text_String] := <h1><Text/></h1>; ``` ```wolfram title="Last cell" {BigHeader} ``` Then in the host notebook we can import the result of the previous notebook as a component: *Notebook-2.wln* ```wolfram title="Cell 1" {HeaderComponent} = NotebookEvaluateAsModule["Notebook-1.wln"]; ``` ```markdown title="Cell 2" .slide <HeaderComponent>Here is my presentation</HeaderComponent> Hi there! ``` # NotebookEvaluateAsModuleAsync is async variant of [NotebookEvaluateAsModule](../Cells-and-Notebook/NotebookEvaluateAsModule) function, that returns `Promise` with evaluation results # NotebookEvaluateAsync is async variant of [NotebookEvaluate](../Cells-and-Notebook/NotebookEvaluate) function, that returns `Promise` # NotebookFocusedCell ```wolfram NotebookFocusedCell[] ``` returns a [RemoteCellObj](../Cells-and-Notebook/RemoteCellObj) object of a currently focused cell from the evaluation context Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [NotebookReadAsync](./NotebookReadAsync) instead. # NotebookOpen ```wolfram NotebookOpen[_RemoteNotebook, opts___] NotebookOpen[path_String | File[path_String], opts___] ``` opens a notebook represented by [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) or imports a notebook by file path and returns [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) object Options [#options] Visible [#visible] By the default is `True`, that automatically opens a new window with a given notebook. In the case of lost context, a window from which to open can be provided "Window" [#window] By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) # NotebookRead Reads the content for the notebook or from a given cell Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [NotebookReadAsync](./NotebookReadAsync) instead. Syntax [#syntax] **Read focused cell:** ```wolfram NotebookRead[notebook_RemoteNotebook] ``` **Read multiple items:** ```wolfram NotebookRead[{item1, item2, ...}] ``` **Read cell content:** ```wolfram NotebookRead[cell_RemoteCellObj] ``` **Read notebook storage:** ```wolfram NotebookRead[store_NotebookStore] ``` For example: ```wolfram NotebookRead[NotebookFocusedCell[]] ``` # NotebookReadAsync Reads the content for the notebook or from a given cell, storage async and safe: Syntax [#syntax] **Read focused cell:** ```wolfram NotebookReadAsync[notebook_RemoteNotebook] ``` **Read multiple items:** ```wolfram NotebookReadAsync[{item1, item2, ...}] ``` **Read cell content:** ```wolfram NotebookReadAsync[cell_RemoteCellObj] ``` **Read notebook storage:** ```wolfram NotebookReadAsync[store_NotebookStore] ``` it will always return `Promise` or a list of them. Use `Then` or `Await` to resolve them, for example: ```wolfram nb = EvaluationNotebook[]; Button["Print focused", Then[NotebookReadAsync[nb], Function[focused, Then[NotebookReadAsync[focused], Function[cell, Print[cell[[1]]]; ]] ]]] ``` # NotebookSave saves a [RemoteNotebook](../Cells-and-Notebook/RemoteNotebook) to a file ```wolfram NotebookSave[_RemoteNotebook] NotebookSave[_RemoteNotebook, path_] ``` # NotebookStore Represents a key in the permanent local notebook storage. You can carry the raw data within the notebook, ***regardless if it has been exported*** to [Static HTML](./../Share/Standalone-HTML) and imported back. Representation of a single key: ```wolfram NotebookStore[key_String] ``` Representation of multiple keys: ```wolfram NotebookStore[{key1, key2, key3, ..}] ``` Explicitly specify a notebook: ```wolfram NotebookStore[nb_RemoteNotebook, key_String] _ ``` It works like a key-value storage. Methods [#methods] Write [#write] To assign any Wolfram Expression using [NotebookWrite](./NotebookWrite): ```wolfram NotebookWrite[NotebookStore["key"], expr_] ``` Read [#read] To get the data use [NotebookRead](./NotebookRead): ```wolfram NotebookRead[NotebookStore["key"]] ``` Be aware of a **evaluation context loss**, use [EvaluationNotebook](../Cells-and-Notebook/EvaluationNotebook) for such cases if it is called from an external handler, i.e. ```wolfram (* evaluation context is ok *) NotebookWrite[NotebookStore["key"], 123]; With[{n = EvaluationNotebook[]}, (* evaluation context is ok *) EventHandler[InputButton[], AsyncFunction[Null, Module[{data}, (* evaluation context is lost!!! *) data = NotebookReadAsync[NotebookStore[n, "key"]] // Await; NotebookWrite[NotebookStore[n, "key"], data+1]; ]]] ] ``` Then check: ```wolfram NotebookRead[NotebookStore["key"]] ``` # NotebookWrite Writes content to a notebook or replaces the content of a specific cell. Syntax [#syntax] **Writing to a notebook:** ```wolfram NotebookWrite[notebook_RemoteNotebook, expr_] NotebookWrite[notebook_RemoteNotebook, {expr1_, expr2_, ...}] ``` **Writing to a cell:** ```wolfram NotebookWrite[cell_RemoteCellObj, expr_String] NotebookWrite[cell_RemoteCellObj, expr_] ``` Basic Usage [#basic-usage] See also [CreateWindow](./CreateWindow) and [CellPrint](./CellPrint) Appending to a Notebook [#appending-to-a-notebook] Writing to a notebook appends new cells, similar to [CellPrint](../Cells-and-Notebook/CellPrint): ```wolfram NotebookWrite[EvaluationNotebook[], Plot[x, {x, 0, 1}]]; ``` Overwriting a Cell [#overwriting-a-cell] Writing to a `RemoteCellObj` replaces the content of that cell: ```wolfram NotebookWrite[NotebookFocusedCell[], Plot[x, {x, 0, 1}]]; ``` Only input cells can be overwritten. Controlling Insertion Location [#controlling-insertion-location] Use `NotebookLocationSpecifier` to control exactly where content is written: **Insert after a specific cell:** ```wolfram NotebookWrite[NotebookLocationSpecifier[cell, "After"], expr] ``` **Overwrite a specific cell:** ```wolfram NotebookWrite[NotebookLocationSpecifier[cell, "On"], expr] ``` Writting to NotebookStore [#writting-to-notebookstore] Use [NotebookStore](./NotebookStore) to write the raw data into local notebook storage: ```wolfram NotebookWrite[NotebookStore["key"], Now]; ``` Cell Types [#cell-types] Using `Cell`, `ExpressionCell` or `TextCell` wrapper you can specify the properties of inserted cell: ```wolfram NotebookWrite[EvaluationNotebook[], cell] ``` where `cell` can be * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output"]` * `Cell[expr_String, "Input"]` * `Cell[expr_String, "Output", subtype_String]` * `TextCell[expr_String]` * `TextCell[expr_String, "Title"]` * `TextCell[expr_String, "Section"]` * `TextCell[expr_String, "Subsection"]` * `ExpressionCell[expr_, "Input"]` * `ExpressionCell[expr_, "Output"]` `subtype` property can be any view-component provided by known cell types: * `"WLX"` or `"wlx"` * `"HTML"` or `"html"` * `"JS"` or `"js"` or `"javascript"` * `"MERMAID"` or `"mermaid"` * ... For example to create an output HTML cell: ```wolfram NotebookWrite[EvaluationNotebook[], Cell["<h1>Hello World</h1>", "Output", "HTML"]] ``` # ParentCell fetches [RemoteCellObj](../Cells-and-Notebook/RemoteCellObj) for a parent input cell of a given cell ```wolfram ParentCell[cell_RemoteCellObj] _CellObj ``` Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. # RemoteCellObj a remote representation of a notebook cell for evaluation Kernel ```wolfram RemoteCellObj[uid_String] _RemoteCellObj ``` Methods [#methods] NotebookDelete [#notebookdelete] NotebookWrite [#notebookwrite] NotebookRead [#notebookread] NotebookReadAsync [#notebookreadasync] EventHandler [#eventhandler] You can listen a cell's events from the evaluation Kernel ```wolfram With[{cell = EvaluationCell[]}, EventHandler[cell, {any_ :> (Print[any, ": ", #]&)}]; ] ``` *listen all events from the input cell* Possible events [#possible-events] Normal cells [#normal-cells] * `"Destroy"` when a cell was removed Expression Windows [#expression-windows] * `"Mounted"` fired once cell is mounted and is ready, returns [WindowObj](../Frontend-IO/WindowObj); `"Mounted"` can be fired multiple times in the case if a window was refreshed (or reconnected) * `"Closed"` fired when user closes window (or connection breaks), returns [WindowObj](../Frontend-IO/WindowObj) # RemoteNotebook represents notebook object for a evaluation Kernel ```wolfram RemoteNotebook[uid_String] _RemoteNotebook ``` Methods [#methods] * [NotebookEvaluate](../Cells-and-Notebook/NotebookEvaluate) * [NotebookEvaluateAsync](../Cells-and-Notebook/NotebookEvaluateAsync) * [NotebookOpen](../Cells-and-Notebook/NotebookOpen) * [NotebookClose](../Cells-and-Notebook/NotebookClose) * [NotebookSave](../Cells-and-Notebook/NotebookSave) * [NotebookRead](./NotebookRead.mdx) * [NotebookWrite](./NotebookWrite.mdx) * [NotebookEvaluateAsModule](./NotebookEvaluateAsModule.mdx) # ResultCell returns an future output cell identifier as an [RemoteCellObj](../Cells-and-Notebook/RemoteCellObj) *even if it was not yet created* from the evaluation context ```wolfram ResultCell[] _RemoteCellObj ``` Works in all output cells # Speak ```wolfram Speak[expr_, opts___] ``` speaks a spoken representation of the expression `expr` For example ```wolfram Speak[Red] ``` Options [#options] "Window" [#window] By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) Audio object [#audio-object] To get an audio object (see [Audio](../Sound/Audio)) ```wolfram SpeechSynthesize[SpokenString[Red], GeneratedAssetLocation -> None] ``` # AbelianGroup `AbelianGroup[{n1, n2, ...}]` represents the direct product of the cyclic groups of degrees n1, n2, .... Example [#example] Define an abelian group and get its elements: ```wolfram g = AbelianGroup[{2, 3}]; GroupElements[g] (* {{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbelianGroup.html) for more details. # AlgebraicIntegerQ `AlgebraicIntegerQ[a]` yields `True` if a is an algebraic integer, and yields `False` otherwise. Examples [#examples] Test if a number is an algebraic integer: ```wolfram AlgebraicIntegerQ[Sqrt[2]] (* True *) ``` Rational numbers that aren't integers are not algebraic integers: ```wolfram AlgebraicIntegerQ[1/2] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicIntegerQ.html) for more details. # AlgebraicNumberDenominator `AlgebraicNumberDenominator[a]` gives the smallest positive integer n such that n\*a is an algebraic integer. Examples [#examples] Find the denominator of an algebraic number: ```wolfram AlgebraicNumberDenominator[Sqrt[2]/3] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicNumberDenominator.html) for more details. # AlgebraicNumberNorm `AlgebraicNumberNorm[a]` gives the norm of the algebraic number a. Examples [#examples] Find the norm of an algebraic number: ```wolfram AlgebraicNumberNorm[Sqrt[2]] (* -2 *) ``` Norm of a complex algebraic number: ```wolfram AlgebraicNumberNorm[1 + I] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicNumberNorm.html) for more details. # AlgebraicNumberPolynomial `AlgebraicNumberPolynomial[a, x]` gives the polynomial in x corresponding to the `AlgebraicNumber` object a. Examples [#examples] Get the minimal polynomial: ```wolfram AlgebraicNumberPolynomial[AlgebraicNumber[Sqrt[2], {1, 1}], x] (* 1 + x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicNumberPolynomial.html) for more details. # AlgebraicNumberTrace `AlgebraicNumberTrace[a]` gives the trace of the algebraic number a. Examples [#examples] Find the trace of an algebraic number: ```wolfram AlgebraicNumberTrace[Sqrt[2]] (* 0 *) ``` Trace of a root of unity: ```wolfram AlgebraicNumberTrace[Root[#^3 - 2 &, 1]] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicNumberTrace.html) for more details. # AlgebraicUnitQ `AlgebraicUnitQ[a]` yields `True` if a is an algebraic unit, and yields `False` otherwise. Examples [#examples] Test if a number is an algebraic unit: ```wolfram AlgebraicUnitQ[1 + Sqrt[2]] (* True *) ``` An integer other than ±1 is not an algebraic unit: ```wolfram AlgebraicUnitQ[2] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlgebraicUnitQ.html) for more details. # AlternatingGroup `AlternatingGroup[n]` represents the alternating group of degree n. Examples [#examples] ```wolfram AlternatingGroup[4] (* AlternatingGroup[4] *) ``` ```wolfram GroupOrder[AlternatingGroup[5]] (* 60 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlternatingGroup.html) for more details. # Antihermitian `Antihermitian[{1, 2}]` represents the symmetry of an antihermitian matrix. Examples [#examples] Define a tensor with antihermitian symmetry: ```wolfram TensorSymmetry[{{0, I}, {-I, 0}}] (* Antihermitian[{1, 2}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Antihermitian.html) for more details. # Antisymmetric `Antisymmetric[{s1, ..., sn}]` represents the symmetry of a tensor that is antisymmetric in the slots si. Examples [#examples] Define an antisymmetric tensor: ```wolfram TensorSymmetry[LeviCivitaTensor[3]] (* Antisymmetric[{1, 2, 3}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Antisymmetric.html) for more details. # Apart `Apart[expr]` rewrites a rational expression as a sum of terms with minimal denominators. Examples [#examples] Partial fraction decomposition: ```wolfram Apart[1/(x^2 - 1)] (* 1/(2(-1 + x)) - 1/(2(1 + x)) *) ``` ```wolfram Apart[(x + 1)/(x (x + 2))] (* 1/(2 x) + 1/(2 (2 + x)) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Apart.html) for more details. # ApartSquareFree `ApartSquareFree[expr]` rewrites a rational expression as a sum of terms whose denominators are powers of square-free polynomials. `ApartSquareFree[expr, var]` treats all variables other than var as constants. Examples [#examples] Decompose a rational expression: ```wolfram ApartSquareFree[1/((x - 1)^2 (x + 1)), x] ``` Compare with standard Apart: ```wolfram ApartSquareFree[x/((x^2 - 1)^2), x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ApartSquareFree.html) for more details. # Assuming `Assuming[assum, expr]` evaluates expr with assum appended to \$Assumptions, so that assum is included in the default assumptions used by functions such as Refine, Simplify, and Integrate. Examples [#examples] ```wolfram Assuming[x > 0, Simplify[Sqrt[x^2]]] (* x *) ``` ```wolfram Assuming[n ∈ Integers, Integrate[Sin[n x], {x, 0, 2 Pi}]] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Assuming.html) for more details. # BabyMonsterGroupB `BabyMonsterGroupB[]` represents the sporadic simple baby monster group B. Examples [#examples] Get the order of the baby monster group: ```wolfram GroupOrder[BabyMonsterGroupB[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BabyMonsterGroupB.html) for more details. # Cancel `Cancel[expr]` cancels out common factors in the numerator and denominator of expr. Examples [#examples] Cancel common factors: ```wolfram Cancel[(x^2 - 1)/(x - 1)] (* x + 1 *) ``` ```wolfram Cancel[(x^2 + 2x + 1)/(x + 1)] (* x + 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cancel.html) for more details. # ChineseRemainder `ChineseRemainder[{r1, r2, ...}, {m1, m2, ...}]` gives the smallest non-negative x that satisfies all the integer congruences x ≡ ri (mod mi). `ChineseRemainder[{r1, r2, ...}, {m1, m2, ...}, d]` gives the smallest x ≥ d that satisfies all congruences. Examples [#examples] Solve a system of congruences: ```wolfram ChineseRemainder[{2, 3, 2}, {3, 5, 7}] (* 23 *) ``` Verify the result: ```wolfram Mod[23, {3, 5, 7}] (* {2, 3, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChineseRemainder.html) for more details. # Coefficient `Coefficient[expr, form]` gives the coefficient of form in the polynomial expr. `Coefficient[expr, form, n]` gives the coefficient of form^n in expr. Examples [#examples] Get coefficient of x^2: ```wolfram Coefficient[3x^3 + 5x^2 + 2x + 1, x, 2] (* 5 *) ``` Coefficient of a linear term: ```wolfram Coefficient[a*x + b*y + c, x] (* a *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Coefficient.html) for more details. # CoefficientArrays `CoefficientArrays[polys, vars]` gives the arrays of coefficients of the variables vars in the polynomials polys. Examples [#examples] ```wolfram CoefficientArrays[{a x + b y, c x + d y}, {x, y}] (* {{0, 0}, {{a, b}, {c, d}}} *) ``` ```wolfram CoefficientArrays[x^2 + 2 x + 1, x] (* {1, {2}, {{1}}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoefficientArrays.html) for more details. # CoefficientList `CoefficientList[poly, var]` gives a list of coefficients of powers of var in poly, starting with power 0. Examples [#examples] Get all coefficients: ```wolfram CoefficientList[3x^3 + 2x^2 + x + 5, x] (* {5, 1, 2, 3} *) ``` For a quadratic: ```wolfram CoefficientList[x^2 - 3x + 2, x] (* {2, -3, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoefficientList.html) for more details. # CoefficientRules `CoefficientRules[poly, {x1, x2, ...}]` gives exponent vectors and coefficients for monomials in poly. Examples [#examples] Get exponent-coefficient rules: ```wolfram CoefficientRules[x^2 + 3x*y + y^2, {x, y}] (* {{2, 0} -> 1, {1, 1} -> 3, {0, 2} -> 1} *) ``` Single variable: ```wolfram CoefficientRules[2x^3 + 5x + 1, {x}] (* {{3} -> 2, {1} -> 5, {0} -> 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoefficientRules.html) for more details. # Collect `Collect[expr, x]` collects together terms involving the same powers of objects matching x. Examples [#examples] Collect terms in x: ```wolfram Collect[a*x + b*x + c*x^2, x] (* c x^2 + (a + b) x *) ``` Collect with multiple variables: ```wolfram Collect[Expand[(x + y + 1)^3], {x, y}] (* 1 + 3 y + 3 y^2 + y^3 + (3 + 6 y + 3 y^2) x + (3 + 3 y) x^2 + x^3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Collect.html) for more details. # Complex `Complex` is the head used for complex numbers. Examples [#examples] Create a complex number: ```wolfram Complex[3, 4] (* 3 + 4 I *) ``` Check the head of a complex number: ```wolfram Head[2 + 3 I] (* Complex *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Complex.html) for more details. # ComplexExpand `ComplexExpand[expr]` expands expr assuming that all variables are real. `ComplexExpand[expr, {x1, x2, ...}]` expands expr assuming that variables matching any of the xi are complex. Examples [#examples] Expand assuming real variables: ```wolfram ComplexExpand[Re[a + b I]] (* a *) ``` Expand with complex variable: ```wolfram ComplexExpand[Abs[z]^2, {z}] (* Re[z]^2 + Im[z]^2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexExpand.html) for more details. # ComposeSeries `ComposeSeries[series1, series2, ...]` composes several power series. Examples [#examples] Compose two series: ```wolfram s1 = Series[Exp[x], {x, 0, 3}]; s2 = Series[Sin[y], {y, 0, 3}]; ComposeSeries[s1, s2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComposeSeries.html) for more details. # CompositeQ `CompositeQ[n]` yields True if n is a composite number, and yields False otherwise. Examples [#examples] Check if a number is composite: ```wolfram CompositeQ[15] (* True *) CompositeQ[7] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompositeQ.html) for more details. # Convergents `Convergents[list]` gives a list of the convergents corresponding to the continued fraction terms list. `Convergents[x, n]` gives the first n convergents for a number x. `Convergents[x]` gives if possible all convergents leading to the number x. Examples [#examples] Convergents from continued fraction terms: ```wolfram Convergents[{3, 7, 15, 1, 292}] (* {3, 22/7, 333/106, 355/113, 103993/33102} *) ``` Convergents of Pi: ```wolfram Convergents[Pi, 5] (* {3, 22/7, 333/106, 355/113, 103993/33102} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Convergents.html) for more details. # ConwayGroupCo1 `ConwayGroupCo1[]` represents the sporadic simple Conway group Co1. Examples [#examples] Create the Conway group Co1: ```wolfram ConwayGroupCo1[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConwayGroupCo1.html) for more details. # ConwayGroupCo2 `ConwayGroupCo2[]` represents the sporadic simple Conway group Co2. Examples [#examples] Create the Conway group Co2: ```wolfram ConwayGroupCo2[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConwayGroupCo2.html) for more details. # ConwayGroupCo3 `ConwayGroupCo3[]` represents the sporadic simple Conway group Co3. Examples [#examples] Create the Conway group Co3: ```wolfram ConwayGroupCo3[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConwayGroupCo3.html) for more details. # CoprimeQ `CoprimeQ[n1, n2]` yields True if n1 and n2 are relatively prime, and yields False otherwise. `CoprimeQ[n1, n2, ...]` yields True if all pairs of the ni are relatively prime, and yields False otherwise. Examples [#examples] Check if two numbers are coprime: ```wolfram CoprimeQ[8, 15] (* True *) ``` Numbers with common factor: ```wolfram CoprimeQ[12, 18] (* False *) ``` Multiple numbers: ```wolfram CoprimeQ[3, 5, 7] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoprimeQ.html) for more details. # CountRoots `CountRoots[f, x]` gives the number of real roots of the univariate function f in x. `CountRoots[f, {x, a, b}]` gives the number of roots between a and b. Examples [#examples] Count roots of a polynomial: ```wolfram CountRoots[x^3 - x, x] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CountRoots.html) for more details. # Cycles `Cycles[{cyc1, cyc2, ...}]` represents a permutation with disjoint cycles cyci. Examples [#examples] Create a permutation from cycles: ```wolfram Cycles[{{1, 3, 2}}] (* Cycles[{{1, 3, 2}}] *) ``` Convert to list: ```wolfram PermutationList[Cycles[{{1, 3, 2}}], 4] (* {3, 1, 2, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cycles.html) for more details. # CyclicGroup `CyclicGroup[n]` represents the cyclic group of degree n. Examples [#examples] Create a cyclic group: ```wolfram CyclicGroup[4] ``` Get elements of the group: ```wolfram GroupElements[CyclicGroup[4]] (* {Cycles[{}], Cycles[{{1, 2, 3, 4}}], Cycles[{{1, 3}, {2, 4}}], Cycles[{{1, 4, 3, 2}}]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CyclicGroup.html) for more details. # Cyclotomic `Cyclotomic[n, x]` gives the nth cyclotomic polynomial in x. Examples [#examples] First few cyclotomic polynomials: ```wolfram Cyclotomic[1, x] (* x - 1 *) Cyclotomic[2, x] (* x + 1 *) Cyclotomic[6, x] (* x^2 - x + 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cyclotomic.html) for more details. # CylindricalDecomposition `CylindricalDecomposition[expr, {x1, x2, ...}]` finds a decomposition of the region represented by the statement expr into cylindrical parts whose directions correspond to the successive xi. `CylindricalDecomposition[expr, {x1, x2, ...}, op]` finds a decomposition of the result of applying the topological operation op to the region represented by the statement expr. `CylindricalDecomposition[expr, {x1, x2, ...}, "Function"]` represents the result as `CylindricalDecompositionFunction[...][x1, x2, ...]` that can be efficiently used in further computation. Examples [#examples] Decompose a circular region: ```wolfram CylindricalDecomposition[x^2 + y^2 < 1, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CylindricalDecomposition.html) for more details. # CylindricalDecompositionFunction `CylindricalDecompositionFunction[data][x1,x2,…]` represents a cylindrical algebraic formula in x1,x2,…. Examples [#examples] Create a cylindrical decomposition function: ```wolfram CylindricalDecomposition[x^2 + y^2 < 1, {x, y}, "Function"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CylindricalDecompositionFunction.html) for more details. # DihedralGroup `DihedralGroup[n]` represents the dihedral group of order 2n. Examples [#examples] Create the dihedral group of a triangle: ```wolfram DihedralGroup[3] (* DihedralGroup[3] *) ``` Get group elements: ```wolfram GroupElements[DihedralGroup[4]] ``` Group order: ```wolfram GroupOrder[DihedralGroup[5]] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DihedralGroup.html) for more details. # Discriminant `Discriminant[poly, var]` computes the discriminant of the polynomial poly with respect to var. Examples [#examples] Discriminant of a quadratic: ```wolfram Discriminant[a*x^2 + b*x + c, x] (* b^2 - 4 a c *) ``` Numeric example: ```wolfram Discriminant[x^2 - 5x + 6, x] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Discriminant.html) for more details. # Eliminate `Eliminate[eqns, vars]` eliminates variables between a set of simultaneous equations. Examples [#examples] Eliminate y from two equations: ```wolfram Eliminate[{x + y == 3, x - y == 1}, y] (* x == 2 *) ``` Eliminate multiple variables: ```wolfram Eliminate[{a == b + c, b == 2c, c == 3}, {b, c}] (* a == 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Eliminate.html) for more details. # ExtendedGCD `ExtendedGCD[n1, n2, ...]` gives the extended greatest common divisor of the integers ni, including coefficients for expressing the GCD as a linear combination. Examples [#examples] Find extended GCD: ```wolfram ExtendedGCD[12, 8] (* {4, {1, -1}} *) ``` This means 4 = 12×1 + 8×(-1). Multiple arguments: ```wolfram ExtendedGCD[15, 10, 6] (* {1, {1, -1, -1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExtendedGCD.html) for more details. # Factor `Factor[poly]` factors a polynomial over the integers. Examples [#examples] Factor a polynomial: ```wolfram Factor[x^2 - 1] (* (x - 1)(x + 1) *) ``` Factor a cubic: ```wolfram Factor[x^3 - 1] (* (x - 1)(x^2 + x + 1) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Factor.html) for more details. # FactorInteger `FactorInteger[n]` gives a list of the prime factors of the integer n, together with their exponents. `FactorInteger[n, k]` does partial factorization, pulling out at most k distinct factors. Examples [#examples] Factor an integer into primes: ```wolfram FactorInteger[120] (* {{2, 3}, {3, 1}, {5, 1}} *) ``` This means 120 = 2³ × 3¹ × 5¹. Factor a larger number: ```wolfram FactorInteger[1000] (* {{2, 3}, {5, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorInteger.html) for more details. # FactorList `FactorList[poly]` gives a list of the factors of a polynomial, together with their exponents. Examples [#examples] Factor list of a polynomial: ```wolfram FactorList[x^2 - 1] (* {{1, 1}, {-1 + x, 1}, {1 + x, 1}} *) ``` With repeated factors: ```wolfram FactorList[(x - 1)^3 (x + 1)] (* {{1, 1}, {-1 + x, 3}, {1 + x, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorList.html) for more details. # FactorSquareFree `FactorSquareFree[poly]` pulls out any multiple factors in a polynomial, giving a product of square-free factors. Examples [#examples] Square-free factorization: ```wolfram FactorSquareFree[x^4 - 2x^2 + 1] (* (x^2 - 1)^2 *) ``` Separate repeated factors: ```wolfram FactorSquareFree[(x - 1)^3 (x + 2)] (* (x - 1)^3 (x + 2) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorSquareFree.html) for more details. # FactorSquareFreeList `FactorSquareFreeList[poly]` gives a list of square-free factors of a polynomial, together with their exponents. Examples [#examples] List square-free factors: ```wolfram FactorSquareFreeList[x^4 - 2x^2 + 1] (* {{1, 1}, {-1 + x^2, 2}} *) ``` With multiple factors: ```wolfram FactorSquareFreeList[(x - 1)^3 (x + 2)^2] (* {{1, 1}, {2 + x, 2}, {-1 + x, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorSquareFreeList.html) for more details. # FactorTerms `FactorTerms[poly]` pulls out any overall numerical factor in poly. `FactorTerms[poly, x]` pulls out any overall factor that does not depend on x. Examples [#examples] Pull out numerical factor: ```wolfram FactorTerms[2x + 4y] (* 2 (x + 2 y) *) ``` Factor out terms not depending on x: ```wolfram FactorTerms[a x + a y, x] (* a (x + y) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorTerms.html) for more details. # FactorTermsList `FactorTermsList[poly]` gives a list where the first element is the overall numerical factor and the second is the polynomial with the factor removed. Examples [#examples] Get numerical factor and remainder: ```wolfram FactorTermsList[6x + 12y] (* {6, x + 2 y} *) ``` With multiple variables: ```wolfram FactorTermsList[a b x + a b y, {x, y}] (* {1, a b, x + y} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorTermsList.html) for more details. # FareySequence `FareySequence[n]` generates the Farey sequence of order n. `FareySequence[n,k]` gives the kth element of the Farey sequence of order n. Examples [#examples] ```wolfram (* Generate Farey sequence of order 4 *) FareySequence[4] (* {0, 1/4, 1/3, 1/2, 2/3, 3/4, 1} *) (* Get a specific element *) FareySequence[5, 3] (* Length of Farey sequence *) Length[FareySequence[10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FareySequence.html) for more details. # FindRoot `FindRoot[f, {x, x0}]` searches for a numerical root of f, starting from x = x0. `FindRoot[lhs == rhs, {x, x0}]` searches for a numerical solution to the equation. Examples [#examples] Find a root: ```wolfram FindRoot[Cos[x] == x, {x, 0.5}] (* {x -> 0.739085} *) ``` Multivariate: ```wolfram FindRoot[{x + y == 3, x - y == 1}, {{x, 1}, {y, 1}}] (* {x -> 2., y -> 1.} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindRoot.html) for more details. # FiniteField `FiniteField[p, d]` gives a finite field with p^d elements. * `FiniteField[p, f]` gives the finite field defined by the irreducible polynomial f. * `FiniteField[p, ..., rep]` uses field element representation rep, either "Polynomial" or "Exponential". Examples [#examples] Create a finite field with 8 elements: ```wolfram ff = FiniteField[2, 3] ``` Get elements of a finite field: ```wolfram ff = FiniteField[3, 2]; ff["Elements"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteField.html) for more details. # FiniteFieldElementPrimitiveQ `FiniteFieldElementPrimitiveQ[a]` tests whether a is a primitive element of its ambient field. Examples [#examples] Test if an element is primitive: ```wolfram ff = FiniteField[2, 3]; a = ff["PrimitiveElement"]; FiniteFieldElementPrimitiveQ[a] ``` Test another element: ```wolfram FiniteFieldElementPrimitiveQ[a^2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteFieldElementPrimitiveQ.html) for more details. # FiniteFieldEmbedding `FiniteFieldEmbedding[ff1, ff2]` gives an embedding of the finite field ff1 in the finite field ff2. * `FiniteFieldEmbedding[e1 -> e2]` represents the embedding of the ambient field of e1 in the ambient field of e2, which maps e1 to e2. Examples [#examples] Create an embedding between finite fields: ```wolfram ff1 = FiniteField[2, 2]; ff2 = FiniteField[2, 4]; emb = FiniteFieldEmbedding[ff1, ff2] ``` Apply the embedding to an element: ```wolfram a = ff1["PrimitiveElement"]; emb[a] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteFieldEmbedding.html) for more details. # FiniteFieldIndex `FiniteFieldIndex[u]` gives the index of the FiniteFieldElement object u. Examples [#examples] Get the index of a finite field element: ```wolfram ff = FiniteField[2, 3]; a = ff["PrimitiveElement"]; FiniteFieldIndex[a] ``` Get indices for powers of the primitive element: ```wolfram Table[FiniteFieldIndex[a^k], {k, 0, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteFieldIndex.html) for more details. # FischerGroupFi22 `FischerGroupFi22[]` represents the sporadic simple Fischer group Fi22. Examples [#examples] Create the Fischer group Fi22: ```wolfram FischerGroupFi22[] ``` Get the group order: ```wolfram GroupOrder[FischerGroupFi22[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FischerGroupFi22.html) for more details. # FischerGroupFi23 `FischerGroupFi23[]` represents the sporadic simple Fischer group Fi23. Examples [#examples] Get the order of the Fischer group Fi23: ```wolfram GroupOrder[FischerGroupFi23[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FischerGroupFi23.html) for more details. # FischerGroupFi24Prime `FischerGroupFi24Prime[]` represents the sporadic simple Fischer group Fi24′. Examples [#examples] Get the order of the Fischer group Fi24′: ```wolfram GroupOrder[FischerGroupFi24Prime[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FischerGroupFi24Prime.html) for more details. # FromCoefficientRules `FromCoefficientRules[list, {x1, x2, ...}]` constructs a polynomial from a list of rules for exponent vectors and coefficients. Examples [#examples] Construct a polynomial from coefficient rules: ```wolfram FromCoefficientRules[{{2, 1} -> 3, {0, 0} -> 1}, {x, y}] ``` Create a multivariate polynomial: ```wolfram FromCoefficientRules[{{1, 0} -> a, {0, 1} -> b, {0, 0} -> c}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromCoefficientRules.html) for more details. # FromContinuedFraction `FromContinuedFraction[list]` reconstructs a number from the list of its continued fraction terms. Examples [#examples] Reconstruct a number from continued fraction: ```wolfram FromContinuedFraction[{3, 7, 15, 1}] ``` Verify with Pi: ```wolfram FromContinuedFraction[ContinuedFraction[Pi, 10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromContinuedFraction.html) for more details. # FromFiniteField `FromFiniteField[a, ff]` converts the element a of the prime subfield of the finite field ff to an integer. `FromFiniteField[expr, ff, t]` converts the elements of the finite field ff in the coefficients of the rational expression expr to polynomials in t, where t represents the field generator. Examples [#examples] ```wolfram ff = FiniteField[5]; FromFiniteField[ff[3], ff] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromFiniteField.html) for more details. # FromFiniteFieldIndex `FromFiniteFieldIndex[ind,ff]` gives the element of the finite field ff with index ind. Examples [#examples] Get an element from a finite field by index: ```wolfram FromFiniteFieldIndex[5, GF[7]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromFiniteFieldIndex.html) for more details. # FullSimplify `FullSimplify[expr]` tries a wide range of transformations involving elementary and special functions to find the simplest form. Examples [#examples] Simplify with special functions: ```wolfram FullSimplify[Sin[x]^2 + Cos[x]^2] (* 1 *) ``` Simplify complex expressions: ```wolfram FullSimplify[Gamma[n + 1]/Gamma[n], n > 0] (* n *) ``` With assumptions: ```wolfram FullSimplify[Log[Exp[x]], x \[Element] Reals] (* x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FullSimplify.html) for more details. # FunctionExpand `FunctionExpand[expr]` tries to expand out special and certain other functions in expr, when possible reducing compound arguments to simpler ones. * `FunctionExpand[expr, assum]` expands using assumptions. Examples [#examples] Expand a logarithm of a product: ```wolfram FunctionExpand[Log[a b], a > 0 && b > 0] ``` Expand special functions: ```wolfram FunctionExpand[Gamma[n + 1/2], n ∈ Integers && n >= 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FunctionExpand.html) for more details. # GenericCylindricalDecomposition `GenericCylindricalDecomposition[ineqs,{x1,x2,...}]` finds the full-dimensional part of the decomposition of the region represented by the inequalities ineqs into cylindrical parts whose directions correspond to the successive xi, together with any hypersurfaces containing the rest of the region. Examples [#examples] Decompose a simple region: ```wolfram GenericCylindricalDecomposition[x^2 + y^2 < 1, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GenericCylindricalDecomposition.html) for more details. # GroebnerBasis `GroebnerBasis[{poly1,poly2,…},{x1,x2,…}]` gives a list of polynomials that form a Gröbner basis for the set of polynomials polyi. `GroebnerBasis[{poly1,poly2,…},{x1,x2,…},{y1,y2,…}]` finds a Gröbner basis in which the yi have been eliminated. Examples [#examples] Find a Gröbner basis for two polynomials: ```wolfram GroebnerBasis[{x^2 + y^2 - 1, x - y}, {x, y}] (* {-1 + 2 y^2, -y + x} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroebnerBasis.html) for more details. # GroupCentralizer `GroupCentralizer[group, g]` returns the centralizer of the element `g` in `group`. Examples [#examples] ```wolfram GroupCentralizer[SymmetricGroup[4], Cycles[{{1, 2}}]] ``` ```wolfram GroupCentralizer[AlternatingGroup[5], Cycles[{{1, 2, 3}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupCentralizer.html) for more details. # GroupElementFromWord `GroupElementFromWord[group, w]` returns the element of `group` determined by the word `w` in the generators of `group`. Examples [#examples] ```wolfram GroupElementFromWord[SymmetricGroup[4], {1, 2, 1}] ``` ```wolfram GroupElementFromWord[DihedralGroup[6], {1, -1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupElementFromWord.html) for more details. # GroupElementPosition `GroupElementPosition[group, g]` returns the position of the element `g` in the list of elements of `group`. * `GroupElementPosition[group, {g1, …, gn}]` returns the list of positions of the elements `g1, …, gn` in `group`. Examples [#examples] ```wolfram GroupElementPosition[SymmetricGroup[3], Cycles[{{1, 2}}]] ``` ```wolfram GroupElementPosition[CyclicGroup[6], {Cycles[{}], Cycles[{{1, 2, 3, 4, 5, 6}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupElementPosition.html) for more details. # GroupElementQ `GroupElementQ[group, g]` returns `True` if the object `g` is an element of `group` and `False` otherwise. Examples [#examples] ```wolfram GroupElementQ[SymmetricGroup[4], Cycles[{{1, 2, 3}}]] ``` ```wolfram GroupElementQ[AlternatingGroup[4], Cycles[{{1, 2}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupElementQ.html) for more details. # GroupElementToWord `GroupElementToWord[group, g]` decomposes the group element g as a product of generators of group. Examples [#examples] Decompose a permutation into generators: ```wolfram GroupElementToWord[SymmetricGroup[3], Cycles[{{1, 2, 3}}]] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupElementToWord.html) for more details. # GroupElements `GroupElements[group]` returns the list of all elements of `group`. * `GroupElements[group, {r1, …, rk}]` returns the elements numbered `r1, …, rk` in `group` in the standard order. Examples [#examples] ```wolfram GroupElements[SymmetricGroup[3]] ``` ```wolfram GroupElements[CyclicGroup[4], {1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupElements.html) for more details. # GroupGenerators `GroupGenerators[group]` returns a list of generators of group. Examples [#examples] Get generators of the symmetric group: ```wolfram GroupGenerators[SymmetricGroup[4]] (* {Cycles[{{1, 2}}], Cycles[{{1, 2, 3, 4}}]} *) ``` Get generators of the alternating group: ```wolfram GroupGenerators[AlternatingGroup[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupGenerators.html) for more details. # GroupMultiplicationTable `GroupMultiplicationTable[group]` gives the multiplication table of `group` as an array. Examples [#examples] ```wolfram GroupMultiplicationTable[SymmetricGroup[3]] ``` ```wolfram GroupMultiplicationTable[CyclicGroup[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupMultiplicationTable.html) for more details. # GroupOrbits `GroupOrbits[group, {p1, …}]` returns the orbits of the points `pi` under the action of the elements of `group`. * `GroupOrbits[group, {p1, …}, f]` finds the orbits under the group action given by a function `f`. Examples [#examples] ```wolfram GroupOrbits[SymmetricGroup[4], {1, 2, 3, 4}] ``` ```wolfram GroupOrbits[CyclicGroup[3], Range[6]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupOrbits.html) for more details. # GroupOrder `GroupOrder[group]` returns the number of elements of `group`. Examples [#examples] ```wolfram GroupOrder[SymmetricGroup[5]] ``` ```wolfram GroupOrder[AlternatingGroup[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupOrder.html) for more details. # HaradaNortonGroupHN `HaradaNortonGroupHN[]` represents the sporadic simple Harada–Norton group HN. Examples [#examples] ```wolfram HaradaNortonGroupHN[] ``` ```wolfram GroupOrder[HaradaNortonGroupHN[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HaradaNortonGroupHN.html) for more details. # HeldGroupHe `HeldGroupHe[]` represents the sporadic simple Held group He. Examples [#examples] Get the order of the Held group: ```wolfram GroupOrder[HeldGroupHe[]] (* 4030387200 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeldGroupHe.html) for more details. # Hermitian `Hermitian[{1, 2}]` represents the symmetry of a Hermitian matrix. Examples [#examples] Define a Hermitian matrix: ```wolfram m = {{1, 2 + I}, {2 - I, 3}}; HermitianMatrixQ[m] (* True *) ``` Use Hermitian symmetry in tensor operations: ```wolfram TensorSymmetry[{{a, b}, {Conjugate[b], c}}, Hermitian[{1, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hermitian.html) for more details. # HigmanSimsGroupHS `HigmanSimsGroupHS[]` represents the sporadic simple Higman–Sims group HS. Examples [#examples] Get the Higman-Sims group: ```wolfram HigmanSimsGroupHS[] ``` Get the group order: ```wolfram GroupOrder[HigmanSimsGroupHS[]] (* 44352000 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HigmanSimsGroupHS.html) for more details. # Integer `Integer` is the head used for integers. Examples [#examples] Check if a value is an integer: ```wolfram Head[42] (* Integer *) ``` Test for integer type: ```wolfram IntegerQ[42] (* True *) ``` ```wolfram IntegerQ[3.14] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Integer.html) for more details. # IntegerExponent `IntegerExponent[n, b]` gives the highest power of b that divides n. Examples [#examples] Power of 2 in 24: ```wolfram IntegerExponent[24, 2] (* 3 *) ``` Power of 5 in 1000: ```wolfram IntegerExponent[1000, 5] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerExponent.html) for more details. # IntegerLength `IntegerLength[n]` gives the number of digits in the base 10 representation of n. `IntegerLength[n, b]` gives the number of digits in base b. Examples [#examples] Decimal digits: ```wolfram IntegerLength[12345] (* 5 *) ``` Binary digits: ```wolfram IntegerLength[255, 2] (* 8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerLength.html) for more details. # IntegerName `IntegerName[n]` gives a string containing the full English name of the integer `n`. * `IntegerName[n, qualifier]` gives a string conforming to the given qualifications. Examples [#examples] ```wolfram IntegerName[42] ``` ```wolfram IntegerName[1000000, "Ordinal"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerName.html) for more details. # IntegerReverse `IntegerReverse[n]` gives the integer whose digits are reversed with respect to those of the integer n. * `IntegerReverse[n, b]` gives the integer whose digits in base b are reversed with respect to those of n. * `IntegerReverse[n, b, len]` gives the integer with reversed digits after padding n with zeros on the left to have len digits. Examples [#examples] ```wolfram IntegerReverse[12345] ``` ```wolfram IntegerReverse[12, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerReverse.html) for more details. # IntegerString `IntegerString[n]` gives a string consisting of the decimal digits in integer n. `IntegerString[n, b]` gives a string in base b. `IntegerString[n, b, len]` pads with zeros to length len. Examples [#examples] Decimal string: ```wolfram IntegerString[255] (* "255" *) ``` Hexadecimal string: ```wolfram IntegerString[255, 16] (* "ff" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerString.html) for more details. # IrreduciblePolynomialQ `IrreduciblePolynomialQ[poly]` tests whether poly is an irreducible polynomial over the rationals. `IrreduciblePolynomialQ[poly,Modulus->p]` tests whether poly is irreducible modulo a prime p. `IrreduciblePolynomialQ[poly,Extension->{a1,a2,…}]` tests whether poly is irreducible over the field extension generated by the algebraic numbers ai. `IrreduciblePolynomialQ[poly,Extension->All]` tests whether poly is absolutely irreducible over the complex numbers. Examples [#examples] ```wolfram IrreduciblePolynomialQ[x^2 + 1] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IrreduciblePolynomialQ.html) for more details. # IsolatingInterval `IsolatingInterval[a]` gives a rational isolating interval for the algebraic number a. * `IsolatingInterval[a, dx]` gives an isolating interval of width at most dx. Examples [#examples] ```wolfram IsolatingInterval[Sqrt[2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IsolatingInterval.html) for more details. # JankoGroupJ1 `JankoGroupJ1[]` represents the sporadic simple Janko group J1. Examples [#examples] ```wolfram JankoGroupJ1[] ``` ```wolfram GroupOrder[JankoGroupJ1[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JankoGroupJ1.html) for more details. # JankoGroupJ2 `JankoGroupJ2[]` represents the sporadic simple Janko group J2. Examples [#examples] ```wolfram JankoGroupJ2[] ``` ```wolfram GroupOrder[JankoGroupJ2[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JankoGroupJ2.html) for more details. # JankoGroupJ3 `JankoGroupJ3[]` represents the sporadic simple Janko group J3. Examples [#examples] ```wolfram JankoGroupJ3[] ``` ```wolfram GroupOrder[JankoGroupJ3[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JankoGroupJ3.html) for more details. # JankoGroupJ4 `JankoGroupJ4[]` represents the sporadic simple Janko group J4. Examples [#examples] Get the order of the Janko group J4: ```wolfram GroupOrder[JankoGroupJ4[]] (* 86775571046077562880 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JankoGroupJ4.html) for more details. # LatticeReduce `LatticeReduce[{v1, v2, ...}]` gives a reduced basis for the set of vectors v\_i using the LLL algorithm. Examples [#examples] Reduce a lattice basis: ```wolfram LatticeReduce[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] ``` 2D example: ```wolfram LatticeReduce[{{1, 0}, {3, 4}}] (* {{1, 0}, {0, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LatticeReduce.html) for more details. # LyonsGroupLy `LyonsGroupLy[]` represents the sporadic simple Lyons group Ly. Examples [#examples] Get the order of the Lyons group: ```wolfram GroupOrder[LyonsGroupLy[]] (* 51765179004000000 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LyonsGroupLy.html) for more details. # MantissaExponent `MantissaExponent[x]` gives a list containing the mantissa and exponent of a number x. `MantissaExponent[x,b]` gives the base-b mantissa and exponent of x. Examples [#examples] Get the mantissa and exponent of a number: ```wolfram MantissaExponent[1234.5] (* {0.12345, 4} *) ``` Use base 2: ```wolfram MantissaExponent[8, 2] (* {0.5, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MantissaExponent.html) for more details. # McLaughlinGroupMcL `McLaughlinGroupMcL[]` represents the sporadic simple McLaughlin group McL. Examples [#examples] Create the McLaughlin group: ```wolfram McLaughlinGroupMcL[] ``` Get the group order: ```wolfram GroupOrder[McLaughlinGroupMcL[]] (* 898128000 *) ``` Check properties: ```wolfram FiniteGroupData["McLaughlinGroup", "SimpleGroupQ"] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/McLaughlinGroupMcL.html) for more details. # MixedFractionParts `MixedFractionParts[expr]` gives the list `{IntegerPart[expr], FractionalPart[expr]}`. Examples [#examples] Get the integer and fractional parts of a number: ```wolfram MixedFractionParts[7/3] (* {2, 1/3} *) ``` Works with negative numbers: ```wolfram MixedFractionParts[-7/3] (* {-3, 2/3} *) ``` With real numbers: ```wolfram MixedFractionParts[3.75] (* {3, 0.75} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MixedFractionParts.html) for more details. # MixedRadix `MixedRadix[{b1,…,bn}]` represents the list of bases of a numerical system in which different digits have different bases. Examples [#examples] Convert a number using mixed radix (hours, minutes, seconds): ```wolfram MixedRadix[{24, 60, 60}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MixedRadix.html) for more details. # MixedRadixQuantity `MixedRadixQuantity[{value1, …, valuen}, {unit1, …, unitn}]` yields a single `Quantity` expression representing the addition of compatible units with magnitude values. Examples [#examples] ```wolfram MixedRadixQuantity[{5, 10, 30}, {"Hours", "Minutes", "Seconds"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MixedRadixQuantity.html) for more details. # MonomialList `MonomialList[poly]` gives the list of all monomials in the polynomial poly. * `MonomialList[poly, {x1, x2, ...}]` gives the list of monomials with respect to the variables xi in poly. * `MonomialList[poly, {x1, x2, ...}, order]` puts the monomials in the specified order. Examples [#examples] ```wolfram MonomialList[x^2 + 3x*y + y^2, {x, y}] ``` ```wolfram MonomialList[a + b x + c x^2, {x}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MonomialList.html) for more details. # MonsterGroupM `MonsterGroupM[]` represents the sporadic simple monster group M. Examples [#examples] Get the order of the monster group: ```wolfram GroupOrder[MonsterGroupM[]] (* 808017424794512875886459904961710757005754368000000000 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MonsterGroupM.html) for more details. # NBernoulliB `NBernoulliB[n]` gives the numerical value of the nth Bernoulli number. `NBernoulliB[n, d]` gives the result to d-digit precision. Examples [#examples] ```wolfram NBernoulliB[10] (* 0.0757576 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NBernoulliB.html) for more details. # NRoots `NRoots[lhs == rhs, var]` yields numerical approximations to the roots of a polynomial equation. Examples [#examples] Numeric roots: ```wolfram NRoots[x^3 - 2 == 0, x] (* x == 1.26 || x == -0.63 - 1.09 I || x == -0.63 + 1.09 I *) ``` Quadratic roots: ```wolfram NRoots[x^2 - 5x + 3 == 0, x] (* x == 0.697 || x == 4.303 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NRoots.html) for more details. # NSolve `NSolve[expr, vars]` attempts to find numerical approximations to the solutions of the system. `NSolve[expr, vars, Reals]` finds solutions over the real numbers. Examples [#examples] Numerical solutions: ```wolfram NSolve[x^3 - 2 == 0, x] (* {{x -> 1.2599}, {x -> -0.62996 - 1.0911 I}, {x -> -0.62996 + 1.0911 I}} *) ``` Real solutions only: ```wolfram NSolve[x^3 - 2 == 0, x, Reals] (* {{x -> 1.2599}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NSolve.html) for more details. # NSolveValues `NSolveValues[expr, vars]` attempts to find numerical approximations to the values of *vars* determined by the solutions of the system *expr*. * `NSolveValues[expr, vars, Reals]` finds solutions over the domain of real numbers. Examples [#examples] ```wolfram NSolveValues[x^2 - 2 == 0, x] (* {-1.41421, 1.41421} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NSolveValues.html) for more details. # NonCommutativeMultiply `a ** b ** c` is a general associative, but non-commutative, form of multiplication. Examples [#examples] Non-commutative product: ```wolfram a ** b ** c (* a ** b ** c *) ``` Not automatically reordered: ```wolfram b ** a (* b ** a *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonCommutativeMultiply.html) for more details. # NumberCompose `NumberCompose[{c1, ..., cn}, {u1, ..., un}]` returns the quantity c₁u₁ + ... + cₙuₙ. Examples [#examples] Compose a number from units: ```wolfram NumberCompose[{3, 2, 5}, {100, 10, 1}] (* 325 *) ``` Time composition: ```wolfram NumberCompose[{2, 30, 45}, {3600, 60, 1}] (* 9045 seconds *) ``` With unit objects: ```wolfram NumberCompose[{5, 3}, {Quantity[1, "Meters"], Quantity[1, "Centimeters"]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberCompose.html) for more details. # NumberDecompose `NumberDecompose[x, {u1, ..., un}]` returns a list of coefficients \{c1, ..., cn} of a decomposition of the number x in the basis \{u1, ..., un}. Examples [#examples] Decompose into hours, minutes, seconds: ```wolfram NumberDecompose[3723, {3600, 60, 1}] (* {1, 2, 3} *) ``` Money decomposition: ```wolfram NumberDecompose[87, {20, 10, 5, 1}] (* {4, 0, 1, 2} *) ``` Time units: ```wolfram NumberDecompose[90061, {86400, 3600, 60, 1}] (* {1, 1, 1, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberDecompose.html) for more details. # NumberFieldClassNumber `NumberFieldClassNumber[θ]` gives the class number for the algebraic number field ℚ\[θ] generated by θ. Examples [#examples] Class number for a quadratic field: ```wolfram NumberFieldClassNumber[Sqrt[-5]] (* 2 *) ``` A field with class number 1: ```wolfram NumberFieldClassNumber[Sqrt[2]] (* 1 *) ``` Cyclotomic field: ```wolfram NumberFieldClassNumber[Exp[2 Pi I/7]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldClassNumber.html) for more details. # NumberFieldDiscriminant `NumberFieldDiscriminant[a]` gives the discriminant of the field ℚ\[a] generated by the algebraic number a. Examples [#examples] ```wolfram NumberFieldDiscriminant[Sqrt[5]] (* 5 *) ``` ```wolfram NumberFieldDiscriminant[2^(1/3)] (* -108 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldDiscriminant.html) for more details. # NumberFieldFundamentalUnits `NumberFieldFundamentalUnits[a]` gives a list of fundamental units for the field ℚ\[a] generated by the algebraic number a. Examples [#examples] Find fundamental units for a quadratic field: ```wolfram NumberFieldFundamentalUnits[Sqrt[2]] (* {1 + Sqrt[2]} *) ``` For a cubic field: ```wolfram NumberFieldFundamentalUnits[2^(1/3)] (* {-1 + 2^(1/3)} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldFundamentalUnits.html) for more details. # NumberFieldIntegralBasis `NumberFieldIntegralBasis[a]` gives an integral basis for the field ℚ\[a] generated by the algebraic number a. Examples [#examples] ```wolfram NumberFieldIntegralBasis[Sqrt[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldIntegralBasis.html) for more details. # NumberFieldNormRepresentatives `NumberFieldNormRepresentatives[a, m]` gives a list of representatives of classes of algebraic integers of norm ±m in the field ℚ\[a] generated by the algebraic number a. Examples [#examples] ```wolfram NumberFieldNormRepresentatives[Sqrt[5], 4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldNormRepresentatives.html) for more details. # NumberFieldRegulator `NumberFieldRegulator[a]` gives the regulator of the field ℚ\[a] generated by the algebraic number a. The regulator is an important invariant in algebraic number theory. Examples [#examples] ```wolfram NumberFieldRegulator[Sqrt[2]] ``` ```wolfram NumberFieldRegulator[2^(1/3)] ``` ```wolfram NumberFieldRegulator[GoldenRatio] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldRegulator.html) for more details. # NumberFieldRootsOfUnity `NumberFieldRootsOfUnity[a]` gives the roots of unity for the field ℚ\[a] generated by the algebraic number a. Examples [#examples] ```wolfram NumberFieldRootsOfUnity[Sqrt[5]] (* {2, -1} *) ``` ```wolfram NumberFieldRootsOfUnity[Exp[2 Pi I/6]] (* {6, E^(I Pi/3)} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldRootsOfUnity.html) for more details. # NumberFieldSignature `NumberFieldSignature[a]` gives the signature of the field ℚ\[a] generated by the algebraic number a. Examples [#examples] Get the signature of a number field: ```wolfram NumberFieldSignature[Sqrt[2]] (* {2, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberFieldSignature.html) for more details. # Numerator `Numerator[expr]` gives the numerator of expr. Examples [#examples] Get numerator of a fraction: ```wolfram Numerator[3/4] (* 3 *) ``` From rational expression: ```wolfram Numerator[(a + b)/(c + d)] (* a + b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Numerator.html) for more details. # NumeratorDenominator `NumeratorDenominator[expr]` gives the list `{Numerator[expr], Denominator[expr]}` of expr. Examples [#examples] ```wolfram NumeratorDenominator[3/4] ``` ```wolfram NumeratorDenominator[(a + b)/(c + d)] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumeratorDenominator.html) for more details. # ONanGroupON `ONanGroupON[]` represents the sporadic simple O'Nan group O'N. This is one of the 26 sporadic simple groups in the classification of finite simple groups. Examples [#examples] ```wolfram ONanGroupON[] ``` ```wolfram GroupOrder[ONanGroupON[]] ``` ```wolfram FiniteGroupData["ONan", "Order"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ONanGroupON.html) for more details. # PadeApproximant `PadeApproximant[expr,{x,x0,{m,n}}]` gives the Padé approximant to expr about the point x=x0, with numerator order m and denominator order n. `PadeApproximant[expr,{x,x0,n}]` gives the diagonal Padé approximant to expr about the point x=x0 of order n. Examples [#examples] Compute a Padé approximant of Exp\[x]: ```wolfram PadeApproximant[Exp[x], {x, 0, {2, 2}}] (* (1 + x/2 + x^2/12)/(1 - x/2 + x^2/12) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PadeApproximant.html) for more details. # PalindromeQ `PalindromeQ[list]` returns True if the given list is identical to Reverse\[list], and False otherwise. `PalindromeQ[n]` returns True if the integer n is identical to IntegerReverse\[n], and False otherwise. `PalindromeQ[string]` returns True if the given string is identical to StringReverse\[string], and False otherwise. Examples [#examples] Check if a string is a palindrome: ```wolfram PalindromeQ["racecar"] (* True *) ``` Check a number: ```wolfram PalindromeQ[12321] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PalindromeQ.html) for more details. # PascalBinomial `PascalBinomial[n, m]` gives the binomial coefficient C(n, m) that preserves Pascal's identity. Examples [#examples] ```wolfram PascalBinomial[5, 2] ``` ```wolfram Table[PascalBinomial[n, k], {n, 0, 5}, {k, 0, n}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PascalBinomial.html) for more details. # PerfectNumber `PerfectNumber[n]` gives the nth perfect number. Examples [#examples] ```wolfram PerfectNumber[1] (* 6 *) ``` ```wolfram PerfectNumber[4] (* 8128 *) ``` ```wolfram Table[PerfectNumber[n], {n, 1, 5}] (* {6, 28, 496, 8128, 33550336} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PerfectNumber.html) for more details. # PerfectNumberQ `PerfectNumberQ[n]` returns `True` if n is a perfect number, and `False` otherwise. Examples [#examples] Test for perfect number: ```wolfram PerfectNumberQ[6] (* True *) ``` Non-perfect number: ```wolfram PerfectNumberQ[10] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PerfectNumberQ.html) for more details. # PermutationCycles `PermutationCycles[perm]` gives a disjoint cycle representation of permutation perm. Examples [#examples] Get the cycle representation of a permutation list: ```wolfram PermutationCycles[{3, 1, 4, 2}] (* Cycles[{{1, 3, 4, 2}}] *) ``` Convert a cycle representation to a permutation list: ```wolfram PermutationList[Cycles[{{1, 3, 4, 2}}]] (* {3, 1, 4, 2} *) ``` Find cycles for the identity permutation: ```wolfram PermutationCycles[{1, 2, 3, 4}] (* Cycles[{}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationCycles.html) for more details. # PermutationCyclesQ `PermutationCyclesQ[expr]` returns True if expr is a permutation in disjoint cyclic form, and False otherwise. Examples [#examples] ```wolfram PermutationCyclesQ[Cycles[{{1, 2, 3}}]] ``` ```wolfram PermutationCyclesQ[{1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationCyclesQ.html) for more details. # PermutationGroup `PermutationGroup[{perm1, …, permn}]` represents the group generated by multiplication of the permutations perm1, …, permn. Examples [#examples] ```wolfram PermutationGroup[{Cycles[{{1, 2}}], Cycles[{{2, 3}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationGroup.html) for more details. # PermutationList `PermutationList[perm]` returns a permutation list representation of permutation perm. `PermutationList[perm, len]` returns a permutation list of length len. Examples [#examples] Convert a permutation to list form: ```wolfram PermutationList[Cycles[{{1, 3, 2}}]] (* {3, 1, 2} *) ``` Specify the length: ```wolfram PermutationList[Cycles[{{1, 3}}], 5] (* {3, 2, 1, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationList.html) for more details. # PermutationListQ `PermutationListQ[expr]` returns `True` if expr is a valid permutation list and `False` otherwise. Examples [#examples] ```wolfram PermutationListQ[{2, 3, 1}] ``` ```wolfram PermutationListQ[{1, 2, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationListQ.html) for more details. # PermutationMatrix `PermutationMatrix[permv]` represents the permutation matrix given by permutation vector permv as a structured array. * `PermutationMatrix[pmat]` converts a permutation matrix pmat to a structured array. Examples [#examples] ```wolfram PermutationMatrix[{3, 1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationMatrix.html) for more details. # PermutationMax `PermutationMax[perm]` returns the largest integer moved by the permutation perm. Examples [#examples] Find the largest moved element: ```wolfram PermutationMax[Cycles[{{1, 3, 5}}]] ``` For a permutation involving larger indices: ```wolfram PermutationMax[Cycles[{{2, 7}, {4, 10, 6}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationMax.html) for more details. # PermutationMin `PermutationMin[perm]` returns the smallest integer moved by the permutation perm. Examples [#examples] Smallest moved element: ```wolfram PermutationMin[Cycles[{{1, 3, 5}}]] (* 1 *) ``` Larger cycle: ```wolfram PermutationMin[Cycles[{{4, 7, 9}}]] (* 4 *) ``` Identity has no minimum: ```wolfram PermutationMin[Cycles[{}]] (* Infinity *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationMin.html) for more details. # PermutationOrder `PermutationOrder[perm]` gives the order of permutation perm. Examples [#examples] Find the order of a permutation: ```wolfram PermutationOrder[Cycles[{{1, 2, 3}}]] ``` Order of a transposition: ```wolfram PermutationOrder[Cycles[{{1, 2}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationOrder.html) for more details. # PermutationPower `PermutationPower[perm, n]` gives the nth permutation power of the permutation perm. Examples [#examples] Square of a permutation: ```wolfram PermutationPower[Cycles[{{1, 2, 3}}], 2] (* Cycles[{{1, 3, 2}}] *) ``` Cube returns identity: ```wolfram PermutationPower[Cycles[{{1, 2, 3}}], 3] (* Cycles[{}] *) ``` Negative power: ```wolfram PermutationPower[Cycles[{{1, 2, 3}}], -1] (* Cycles[{{1, 3, 2}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationPower.html) for more details. # PermutationProduct `PermutationProduct[a, b, c]` gives the product of permutations a, b, c. Examples [#examples] ```wolfram PermutationProduct[Cycles[{{1, 2}}], Cycles[{{2, 3}}]] ``` ```wolfram PermutationProduct[{2, 3, 1}, {3, 1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationProduct.html) for more details. # PermutationSupport `PermutationSupport[perm]` returns the support of the permutation perm. Examples [#examples] Get the support of a permutation (elements that are moved): ```wolfram PermutationSupport[Cycles[{{1, 3, 5}}]] (* {1, 3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationSupport.html) for more details. # PiecewiseExpand `PiecewiseExpand[expr]` expands nested piecewise functions in expr to give a single piecewise function. * `PiecewiseExpand[expr, assum]` expands piecewise functions using assumptions. * `PiecewiseExpand[expr, assum, dom]` does the expansion over the domain dom. Examples [#examples] Expand Abs: ```wolfram PiecewiseExpand[Abs[x]] (* Piecewise[{{-x, x < 0}}, x] *) ``` With assumptions: ```wolfram PiecewiseExpand[Abs[x], x > 0] (* x *) ``` Nested piecewise: ```wolfram PiecewiseExpand[Max[x, Min[y, z]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PiecewiseExpand.html) for more details. # PolynomialExpressionQ `PolynomialExpressionQ[expr, x]` gives `True` if expr is structurally a polynomial expression in x, and `False` otherwise. * `PolynomialExpressionQ[expr, {x, y, ...}]` gives `True` if expr is structurally a polynomial expression in x, y, ..., and `False` otherwise. * `PolynomialExpressionQ[expr, {x, y, ...}, test]` gives `True` if expr is structurally a polynomial expression in x, y, ... with coefficients satisfying test. Examples [#examples] Test if an expression is a polynomial in x: ```wolfram PolynomialExpressionQ[x^2 + 3x + 1, x] (* True *) ``` Non-polynomial expressions: ```wolfram PolynomialExpressionQ[Sin[x] + x^2, x] (* False *) ``` Test for integer coefficients: ```wolfram PolynomialExpressionQ[2x^2 + 3x + 1, {x}, IntegerQ] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialExpressionQ.html) for more details. # PolynomialExtendedGCD `PolynomialExtendedGCD[poly1, poly2, x]` gives the extended GCD of poly1 and poly2 treated as univariate polynomials in x. * `PolynomialExtendedGCD[poly1, poly2, x, Modulus -> p]` gives the extended GCD over the integers modulo the prime p. Examples [#examples] Compute the extended GCD of two polynomials: ```wolfram PolynomialExtendedGCD[x^2 - 1, x^3 - 1, x] ``` With modular arithmetic: ```wolfram PolynomialExtendedGCD[x^2 + 1, x^3 + 1, x, Modulus -> 7] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialExtendedGCD.html) for more details. # PolynomialGCD `PolynomialGCD[poly1, poly2, ...]` gives the greatest common divisor of the polynomials. Examples [#examples] Find GCD of two polynomials: ```wolfram PolynomialGCD[x^2 - 1, x^3 - x] (* x^2 - 1 *) ``` Polynomials with common factor: ```wolfram PolynomialGCD[(x + 1)^2 * (x - 1), (x + 1) * (x - 2)] (* 1 + x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialGCD.html) for more details. # PolynomialLCM `PolynomialLCM[poly1, poly2, …]` gives the least common multiple of the polynomials. `PolynomialLCM[poly1, poly2, …, Modulus -> p]` evaluates the LCM modulo the prime p. Examples [#examples] LCM of polynomials: ```wolfram PolynomialLCM[x^2 - 1, x^2 - x] (* -x + x^2 + x^3 - x^4 *) ``` Simplified: ```wolfram Factor[PolynomialLCM[x^2 - 1, x^2 - x]] (* x (1 + x) (-1 + x)^2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialLCM.html) for more details. # PolynomialMod `PolynomialMod[poly, m]` gives the polynomial poly reduced modulo m. `PolynomialMod[poly, {m1, m2, …}]` reduces modulo all of the mi. Examples [#examples] Reduce coefficients modulo: ```wolfram PolynomialMod[5 x^2 + 7 x + 3, 3] (* 2 x^2 + x *) ``` Multiple moduli: ```wolfram PolynomialMod[12 x^2 + 15 x + 9, {2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialMod.html) for more details. # PolynomialQ `PolynomialQ[expr, var]` yields `True` if expr is a polynomial in var, and `False` otherwise. `PolynomialQ[expr, {var1, …}]` tests whether expr is a polynomial in the vari. Examples [#examples] Test for polynomial: ```wolfram PolynomialQ[x^2 + 2x + 1, x] (* True *) ``` Not a polynomial: ```wolfram PolynomialQ[1/x + x, x] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialQ.html) for more details. # PolynomialQuotient `PolynomialQuotient[p, q, x]` gives the quotient of p and q, treated as polynomials in x, with any remainder dropped. Examples [#examples] Polynomial division: ```wolfram PolynomialQuotient[x^3 + 2x^2 + x + 1, x + 1, x] (* x^2 + x *) ``` Divide higher degree polynomial: ```wolfram PolynomialQuotient[x^4 - 1, x^2 - 1, x] (* x^2 + 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialQuotient.html) for more details. # PolynomialQuotientRemainder `PolynomialQuotientRemainder[p, q, x]` gives a list of the quotient and remainder of p and q, treated as polynomials in x. Examples [#examples] Get quotient and remainder: ```wolfram PolynomialQuotientRemainder[x^3 + 2x^2 + x + 1, x + 1, x] (* {x^2 + x, 1} *) ``` Verify: ```wolfram {quot, rem} = PolynomialQuotientRemainder[x^4 - 1, x^2 - 1, x] (* {x^2 + 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialQuotientRemainder.html) for more details. # PolynomialReduce `PolynomialReduce[poly, {poly1, poly2, ...}, {x1, x2, ...}]` yields a list representing a reduction of poly in terms of the polyi. The list has the form `{{a1, a2, ...}, b}`, where b is minimal and `a1*poly1 + a2*poly2 + ... + b` is exactly poly. Examples [#examples] Reduce a polynomial: ```wolfram PolynomialReduce[x^2 + y^2, {x + y, x - y}, {x, y}] (* {{x/2 - y/2, x/2 + y/2}, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialReduce.html) for more details. # PolynomialRemainder `PolynomialRemainder[p, q, x]` gives the remainder from dividing p by q, treated as polynomials in x. Examples [#examples] Get remainder after division: ```wolfram PolynomialRemainder[x^3 + 2x^2 + x + 1, x + 1, x] (* 1 *) ``` Another example: ```wolfram PolynomialRemainder[x^4 + x^2, x^2 + x + 1, x] (* 1 + x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolynomialRemainder.html) for more details. # PrimitivePolynomialQ `PrimitivePolynomialQ[poly, p]` tests whether poly is a primitive polynomial modulo a prime p. Examples [#examples] ```wolfram PrimitivePolynomialQ[x^4 + x + 1, 2] ``` ```wolfram PrimitivePolynomialQ[x^2 + 1, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimitivePolynomialQ.html) for more details. # PrimitiveRoot `PrimitiveRoot[n]` gives a primitive root of n. `PrimitiveRoot[n, k]` gives the smallest primitive root of n greater than or equal to k. Examples [#examples] ```wolfram PrimitiveRoot[7] (* 3 *) ``` ```wolfram PrimitiveRoot[13, 5] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimitiveRoot.html) for more details. # PrimitiveRootList `PrimitiveRootList[n]` gives a list of primitive roots of n. Examples [#examples] ```wolfram PrimitiveRootList[7] ``` ```wolfram PrimitiveRootList[23] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimitiveRootList.html) for more details. # QBinomial `QBinomial[n, m, q]` gives the q-binomial coefficient (Gaussian binomial). Examples [#examples] Compute a q-binomial coefficient: ```wolfram QBinomial[5, 2, q] ``` Evaluate at a specific q value: ```wolfram QBinomial[4, 2, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QBinomial.html) for more details. # QFactorial `QFactorial[n, q]` gives the q-factorial \[n]\_q!. Examples [#examples] ```wolfram QFactorial[5, q] ``` ```wolfram QFactorial[4, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QFactorial.html) for more details. # QGamma `QGamma[z, q]` gives the q-gamma function Γq(z). Examples [#examples] Evaluate q-gamma: ```wolfram QGamma[3, 0.5] ``` Symbolic form: ```wolfram QGamma[n, q] ``` Limit as q→1: ```wolfram Limit[QGamma[3, q], q -> 1] (* 2 (= Gamma[3] = 2!) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QGamma.html) for more details. # QHypergeometricPFQ `QHypergeometricPFQ[{a1, ..., ar}, {b1, ..., bs}, q, z]` gives the basic hypergeometric series rϕs(a;b;q;z). Examples [#examples] ```wolfram QHypergeometricPFQ[{a}, {b}, q, z] ``` ```wolfram QHypergeometricPFQ[{1/2, 1/3}, {1/4}, 1/5, 1/10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QHypergeometricPFQ.html) for more details. # QPochhammer `QPochhammer[a, q, n]` gives the q-Pochhammer symbol (a;q)ₙ. * `QPochhammer[a, q]` gives the q-Pochhammer symbol (a;q)∞. * `QPochhammer[q]` gives the q-Pochhammer symbol (q;q)∞. Examples [#examples] Compute finite q-Pochhammer: ```wolfram QPochhammer[1/2, 1/3, 5] ``` Infinite product: ```wolfram N[QPochhammer[1/2, 1/2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QPochhammer.html) for more details. # QPolyGamma `QPolyGamma[z, q]` gives the q-digamma function ψ\_q(z). * `QPolyGamma[n, z, q]` gives the nth derivative of the q-digamma function ψ\_q^(n)(z). Examples [#examples] ```wolfram QPolyGamma[2, 0.5] ``` ```wolfram QPolyGamma[1, 3, 0.8] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QPolyGamma.html) for more details. # QuadraticIrrationalQ `QuadraticIrrationalQ[x]` gives `True` if x is a quadratic irrational and `False` otherwise. Examples [#examples] ```wolfram QuadraticIrrationalQ[Sqrt[2]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuadraticIrrationalQ.html) for more details. # Rational `Rational` is the head used for rational numbers. Examples [#examples] Check head of a fraction: ```wolfram Head[3/4] (* Rational *) ``` Pattern matching: ```wolfram MatchQ[5/7, _Rational] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rational.html) for more details. # RationalExpressionQ `RationalExpressionQ[expr,x]` gives True if expr is structurally a rational expression in x, and False otherwise. `RationalExpressionQ[expr,{x,y,…}]` gives True if expr is structurally a rational expression in x,y,…, and False otherwise. `RationalExpressionQ[expr,{x,y,…},test]` gives True if expr is structurally a rational expression in x,y,… with coefficients satisfying test, and False otherwise. Examples [#examples] Test if an expression is rational in x: ```wolfram RationalExpressionQ[(x^2 + 1)/(x - 1), x] (* True *) ``` ```wolfram RationalExpressionQ[Sin[x]/x, x] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RationalExpressionQ.html) for more details. # Reduce `Reduce[expr, vars]` reduces the statement expr by solving equations or inequalities for vars. `Reduce[expr, vars, dom]` does the reduction over the specified domain. Examples [#examples] Solve an equation: ```wolfram Reduce[x^2 - 4 == 0, x] (* x == -2 || x == 2 *) ``` With domain: ```wolfram Reduce[x^2 == 2, x, Reals] (* x == -Sqrt[2] || x == Sqrt[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Reduce.html) for more details. # Refine `Refine[expr, assum]` gives the form of expr that would be obtained if symbols in it were replaced by explicit numerical expressions satisfying the assumptions. `Refine[expr]` uses default assumptions specified by any enclosing `Assuming` constructs. Examples [#examples] Simplify with assumptions: ```wolfram Refine[Sqrt[x^2], x > 0] (* x *) ``` Without assumptions: ```wolfram Refine[Abs[x], x < 0] (* -x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Refine.html) for more details. # Resultant `Resultant[poly1, poly2, var]` computes the resultant of two polynomials with respect to var. Examples [#examples] Compute resultant: ```wolfram Resultant[x^2 - 1, x^2 - 4, x] (* 9 *) ``` Resultant of linear polynomials: ```wolfram Resultant[a*x + b, c*x + d, x] (* a d - b c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Resultant.html) for more details. # RootApproximant `RootApproximant[x]` converts the number x to one of the "simplest" algebraic numbers that approximates it well. * `RootApproximant[x, n]` finds an algebraic number of degree at most n that approximates x. Examples [#examples] Find an algebraic approximation: ```wolfram RootApproximant[1.41421356] ``` Find a cubic root approximation: ```wolfram RootApproximant[1.2599210498, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootApproximant.html) for more details. # RootIntervals `RootIntervals[{poly1, poly2, ...}]` gives a list of isolating intervals for the real roots of any of the polyi, together with a list of which polynomials actually have each successive root. * `RootIntervals[poly]` gives isolating intervals for real roots of a single polynomial. * `RootIntervals[polys, Complexes]` gives bounding rectangles for complex roots. Examples [#examples] ```wolfram RootIntervals[x^2 - 2] ``` ```wolfram RootIntervals[{x^2 - 2, x^2 - 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootIntervals.html) for more details. # RootReduce `RootReduce[expr]` attempts to reduce expr to a single Root object. Examples [#examples] Reduce a sum of roots: ```wolfram RootReduce[Sqrt[2] + Sqrt[3]] (* Root[1 - 10 #1^2 + #1^4 &, 4] *) ``` Simplify a root expression: ```wolfram RootReduce[Sqrt[2]^3] (* 2 Sqrt[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootReduce.html) for more details. # RootSum `RootSum[f, form]` represents the sum of form\[x] for all x that satisfy the polynomial equation f\[x]==0. Examples [#examples] ```wolfram RootSum[#^3 - 1 &, #^2 &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootSum.html) for more details. # Roots `Roots[lhs == rhs, var]` yields a disjunction of equations which represent the roots of a polynomial equation. Examples [#examples] Find polynomial roots: ```wolfram Roots[x^2 - 4 == 0, x] (* x == -2 || x == 2 *) ``` Cubic roots: ```wolfram Roots[x^3 - 1 == 0, x] (* x == 1 || x == -1/2 - I Sqrt[3]/2 || x == -1/2 + I Sqrt[3]/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Roots.html) for more details. # RudvalisGroupRu `RudvalisGroupRu[]` represents the sporadic simple Rudvalis group Ru. Examples [#examples] ```wolfram RudvalisGroupRu[] ``` ```wolfram GroupOrder[RudvalisGroupRu[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RudvalisGroupRu.html) for more details. # SemialgebraicComponentInstances `SemialgebraicComponentInstances[ineqs, {x1, x2, …}]` gives at least one sample point in each connected component of the semialgebraic set defined by the inequalities ineqs in the variables x1, x2, …. Examples [#examples] ```wolfram SemialgebraicComponentInstances[x^2 + y^2 < 1, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemialgebraicComponentInstances.html) for more details. # Simplify `Simplify[expr]` performs algebraic transformations on expr and returns the simplest form it finds. `Simplify[expr, assum]` simplifies using assumptions. Examples [#examples] Simplify expressions: ```wolfram Simplify[x^2 - 1 - (x - 1)(x + 1)] (* 0 *) ``` With assumptions: ```wolfram Simplify[Sqrt[x^2], x > 0] (* x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Simplify.html) for more details. # Solve `Solve[expr, vars]` attempts to solve the system expr of equations or inequalities for the variables vars. `Solve[expr, vars, dom]` solves over the domain dom. Common choices are `Reals`, `Integers`, and `Complexes`. Examples [#examples] Solve a linear equation: ```wolfram Solve[x + 2 == 5, x] (* {{x -> 3}} *) ``` Solve a quadratic equation: ```wolfram Solve[x^2 - 4 == 0, x] (* {{x -> -2}, {x -> 2}} *) ``` Solve a system of equations: ```wolfram Solve[{x + y == 3, x - y == 1}, {x, y}] (* {{x -> 2, y -> 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Solve.html) for more details. # SolveAlways `SolveAlways[eqns, vars]` gives the values of parameters that make the equations eqns valid for all values of the variables vars. Examples [#examples] Find parameters that make an equation always true: ```wolfram SolveAlways[a x^2 + b x + c == (x - 1)(x - 2), x] (* {{a -> 1, b -> -3, c -> 2}} *) ``` Solve for coefficients of a polynomial identity: ```wolfram SolveAlways[a + b x + c x^2 == 3 + 2 x - x^2, x] (* {{a -> 3, b -> 2, c -> -1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolveAlways.html) for more details. # SolveDelayed `SolveDelayed` is an obsolete option to `NDSolve`. The option `"EquationSimplification"` should be used instead. Examples [#examples] ```wolfram (* Use "EquationSimplification" instead *) NDSolve[{y'[x] == y[x], y[0] == 1}, y, {x, 0, 1}, Method -> {"EquationSimplification" -> "Residual"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolveDelayed.html) for more details. # SolveValues `SolveValues[expr, vars]` gives the values of vars determined by the solutions of the system expr. `SolveValues[expr, vars, dom]` uses solutions over the domain dom. Common choices are Reals, Integers, and Complexes. Examples [#examples] Get solution values directly: ```wolfram SolveValues[x^2 == 4, x] (* {-2, 2} *) ``` Solve over integers: ```wolfram SolveValues[x^2 < 10, x, Integers] (* {-3, -2, -1, 0, 1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolveValues.html) for more details. # SquareFreeQ `SquareFreeQ[expr]` gives True if expr is a square-free polynomial or number, and False otherwise. `SquareFreeQ[expr, vars]` gives True if expr is square free with respect to the variables vars. Examples [#examples] Test if a number is square-free: ```wolfram SquareFreeQ[30] (* True *) ``` Test a non-square-free number: ```wolfram SquareFreeQ[12] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SquareFreeQ.html) for more details. # SquaresR `SquaresR[d, n]` gives the number of ways to represent the integer n as a sum of d squares. Examples [#examples] Number of ways to write 5 as sum of 2 squares: ```wolfram SquaresR[2, 5] (* 8 *) ``` Number of ways to write 10 as sum of 4 squares: ```wolfram SquaresR[4, 10] (* 120 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SquaresR.html) for more details. # SubresultantPolynomialRemainders `SubresultantPolynomialRemainders[poly1, poly2, var]` gives the subresultant polynomial remainder sequence of the polynomials poly1 and poly2 with respect to the variable var. * `SubresultantPolynomialRemainders[poly1, poly2, var, Modulus -> p]` computes the sequence modulo the prime p. Examples [#examples] ```wolfram SubresultantPolynomialRemainders[x^3 + x + 1, x^2 + 1, x] ``` ```wolfram SubresultantPolynomialRemainders[x^4 - 1, x^2 - 1, x] ``` ```wolfram SubresultantPolynomialRemainders[x^3 + 2 x + 1, x^2 + x, x, Modulus -> 5] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubresultantPolynomialRemainders.html) for more details. # SubresultantPolynomials `SubresultantPolynomials[poly1, poly2, var]` generates a list of subresultant polynomials of the polynomials poly1 and poly2 with respect to the variable var. * `SubresultantPolynomials[poly1, poly2, var, Modulus -> p]` computes the subresultant polynomials modulo the prime p. Examples [#examples] ```wolfram SubresultantPolynomials[x^3 - 1, x^2 - 1, x] ``` ```wolfram SubresultantPolynomials[x^4 + x + 1, x^2 + 1, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubresultantPolynomials.html) for more details. # Subresultants `Subresultants[poly1, poly2, var]` generates a list of the principal subresultant coefficients of the polynomials poly1 and poly2 with respect to the variable var. * `Subresultants[poly1, poly2, var, Modulus -> p]` computes the principal subresultant coefficients modulo the prime p. Examples [#examples] ```wolfram Subresultants[x^3 + 2 x + 1, x^2 - 1, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subresultants.html) for more details. # SuzukiGroupSuz `SuzukiGroupSuz[]` represents the sporadic simple Suzuki group Suz. Examples [#examples] ```wolfram SuzukiGroupSuz[] ``` ```wolfram GroupOrder[SuzukiGroupSuz[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SuzukiGroupSuz.html) for more details. # Symmetric `Symmetric[{s1, ..., sn}]` represents the symmetry of a tensor that is symmetric in the slots *si*. Examples [#examples] ```wolfram TensorSymmetry[{{a, b}, {b, c}}] (* Symmetric[{1, 2}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Symmetric.html) for more details. # SymmetricDifference `SymmetricDifference[list1, list2, ...]` gives the symmetric difference of the lists listi. Examples [#examples] Find elements in one list but not both: ```wolfram SymmetricDifference[{1, 2, 3, 4}, {3, 4, 5, 6}] ``` With multiple lists: ```wolfram SymmetricDifference[{a, b, c}, {b, c, d}, {c, d, e}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricDifference.html) for more details. # SymmetricGroup `SymmetricGroup[n]` represents the symmetric group of degree n. Examples [#examples] Get the order of the symmetric group S4: ```wolfram GroupOrder[SymmetricGroup[4]] (* 24 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricGroup.html) for more details. # Symmetrize `Symmetrize[tensor, sym]` returns the symmetrization of tensor under the symmetry sym. Examples [#examples] Symmetrize a matrix: ```wolfram Symmetrize[{{a, b}, {c, d}}] (* {{a, (b + c)/2}, {(b + c)/2, d}} *) ``` Antisymmetrize: ```wolfram Symmetrize[{{a, b}, {c, d}}, Antisymmetric[{1, 2}]] (* {{0, (b - c)/2}, {(-b + c)/2, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Symmetrize.html) for more details. # SymmetrizedArray `SymmetrizedArray[{pos1 -> val1, pos2 -> val2, ...}, dims, sym]` yields an array of dimensions dims whose entries are given by those in the rules posi -> vali or through the symmetry sym. * `SymmetrizedArray[list]` yields a symmetrized array version of list. Examples [#examples] ```wolfram SymmetrizedArray[{{1, 2} -> a, {2, 1} -> a}, {3, 3}, Symmetric[{1, 2}]] ``` ```wolfram SymmetrizedArray[{{1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetrizedArray.html) for more details. # SymmetrizedArrayRules `SymmetrizedArrayRules[sa]` returns a list of rules posi -> vali of the symmetrized array sa. * `SymmetrizedArrayRules[a, sym]` returns a list of rules posi -> vali of the array a after being symmetrized with symmetry sym. Examples [#examples] ```wolfram sa = SymmetrizedArray[{{1, 2} -> a, {2, 1} -> b}, {3, 3}, Symmetric[{1, 2}]]; SymmetrizedArrayRules[sa] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetrizedArrayRules.html) for more details. # SymmetrizedDependentComponents `SymmetrizedDependentComponents[comp, sym]` gives the list of components that are equivalent to the component comp by the symmetry sym. Examples [#examples] Find equivalent components: ```wolfram SymmetrizedDependentComponents[{1, 2}, Symmetric[{1, 2}]] ``` With antisymmetric tensors: ```wolfram SymmetrizedDependentComponents[{1, 2}, Antisymmetric[{1, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetrizedDependentComponents.html) for more details. # SymmetrizedIndependentComponents `SymmetrizedIndependentComponents[dims, sym]` gives the list of independent components of an array of dimensions *dims* with the symmetry *sym*. Examples [#examples] ```wolfram SymmetrizedIndependentComponents[{3, 3}, Symmetric[{1, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetrizedIndependentComponents.html) for more details. # SymmetrizedReplacePart `SymmetrizedReplacePart[sa,{pos1->val1,pos2->val2,…}]` replaces independent values of the symmetrized array sa as given by the rules posi->vali. Examples [#examples] Replace a value in a symmetric array: ```wolfram sa = SymmetrizedArray[{{1, 2} -> a, {2, 1} -> a}, {2, 2}, Symmetric[{1, 2}]]; SymmetrizedReplacePart[sa, {{1, 2} -> b}] ``` Modify an antisymmetric array: ```wolfram asa = SymmetrizedArray[{{1, 2} -> x}, {3, 3}, Antisymmetric[{1, 2}]]; SymmetrizedReplacePart[asa, {{1, 3} -> y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetrizedReplacePart.html) for more details. # ThompsonGroupTh `ThompsonGroupTh[]` represents the sporadic simple Thompson group Th. Examples [#examples] Create the Thompson group: ```wolfram ThompsonGroupTh[] ``` Get group order: ```wolfram GroupOrder[ThompsonGroupTh[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ThompsonGroupTh.html) for more details. # TitsGroupT `TitsGroupT[]` represents the simple Tits group T. Examples [#examples] ```wolfram TitsGroupT[] ``` ```wolfram GroupOrder[TitsGroupT[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TitsGroupT.html) for more details. # ToFiniteField `ToFiniteField[k,ff]` converts the integer k to an element of the prime subfield of the finite field ff. `ToFiniteField[expr,ff]` converts the coefficients of the rational expression expr to elements of the finite field ff. `ToFiniteField[expr,ff,t]` converts the coefficients of the rational expression expr to elements of the finite field ff, with t representing the field generator. Examples [#examples] Convert an integer to a finite field element: ```wolfram ToFiniteField[5, GF[7]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToFiniteField.html) for more details. # ToNumberField `ToNumberField[a, θ]` expresses the algebraic number a in the number field generated by θ. * `ToNumberField[{a1, a2, ...}, θ]` expresses the ai in the field generated by θ. * `ToNumberField[{a1, a2, ...}]` expresses the ai in a common extension field generated by a single algebraic number. Examples [#examples] ```wolfram ToNumberField[Sqrt[2], Sqrt[2]] ``` ```wolfram ToNumberField[{Sqrt[2], Sqrt[3]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToNumberField.html) for more details. # Together `Together[expr]` puts terms in a sum over a common denominator, and cancels factors in the result. Examples [#examples] Combine fractions: ```wolfram Together[1/x + 1/y] (* (x + y)/(x y) *) ``` ```wolfram Together[a/b + c/d] (* (a d + b c)/(b d) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Together.html) for more details. # Variables `Variables[poly]` gives a list of all independent variables in a polynomial. Examples [#examples] Find variables in polynomial: ```wolfram Variables[x^2 + 3x*y + z] (* {x, y, z} *) ``` Single variable expression: ```wolfram Variables[a*t^2 + b*t + c] (* {a, b, c, t} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Variables.html) for more details. # ArcCurvature `ArcCurvature[{x1, ..., xn}, t]` gives the curvature of the parametrized curve whose Cartesian coordinates xi are functions of t. `ArcCurvature[{x1, ..., xn}, t, chart]` interprets the xi as coordinates in the specified coordinate chart. Examples [#examples] Find the curvature of a circle: ```wolfram ArcCurvature[{Cos[t], Sin[t]}, t] (* 1 *) ``` Curvature of a helix: ```wolfram ArcCurvature[{Cos[t], Sin[t], t}, t] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCurvature.html) for more details. # ArcLength `ArcLength[reg]` gives the length of a one-dimensional region (curve). Examples [#examples] Length of a line: ```wolfram ArcLength[Line[{{0, 0}, {3, 4}}]] (* 5 *) ``` Circumference of a circle: ```wolfram ArcLength[Circle[{0, 0}, r]] (* 2 Pi r *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcLength.html) for more details. # Area `Area[reg]` gives the area of a two-dimensional region. Examples [#examples] Area of a disk: ```wolfram Area[Disk[{0, 0}, r]] (* Pi r^2 *) ``` Area of a polygon: ```wolfram Area[Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}]] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Area.html) for more details. # ArgMax `ArgMax[f, x]` gives a position xmax at which f is maximized. `ArgMax[f, {x, y, ...}]` gives a position \{xmax, ymax, ...} at which f is maximized. `ArgMax[{f, cons}, {x, y, ...}]` gives a position at which f is maximized subject to the constraints cons. Examples [#examples] Find where a function is maximized: ```wolfram ArgMax[Sin[x], x] (* Pi/2 *) ``` With constraints: ```wolfram ArgMax[{x + y, x^2 + y^2 <= 1}, {x, y}] (* {1/Sqrt[2], 1/Sqrt[2]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArgMax.html) for more details. # ArgMin `ArgMin[f, x]` gives a position xmin at which f is minimized. `ArgMin[f, {x, y, ...}]` gives a position \{xmin, ymin, ...} at which f is minimized. `ArgMin[{f, cons}, {x, y, ...}]` gives a position at which f is minimized subject to the constraints cons. Examples [#examples] Find where a function is minimized: ```wolfram ArgMin[x^2 + 2x + 1, x] (* -1 *) ``` With constraints: ```wolfram ArgMin[{x^2 + y^2, x + y == 1}, {x, y}] (* {1/2, 1/2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArgMin.html) for more details. # Asymptotic `Asymptotic[expr, x -> x0]` gives an asymptotic approximation for expr near x0. `Asymptotic[expr, {x, x0, n}]` gives an asymptotic approximation for expr near x0 to order n. Examples [#examples] Asymptotic approximation near infinity: ```wolfram Asymptotic[Sqrt[1 + 1/x], x -> Infinity] (* 1 + 1/(2 x) *) ``` With specified order: ```wolfram Asymptotic[Gamma[x], {x, Infinity, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Asymptotic.html) for more details. # AsymptoticDSolveValue `AsymptoticDSolveValue[eqn, f, x -> x0]` computes an asymptotic approximation to the differential equation eqn for f\[x] centered at x0. `AsymptoticDSolveValue[{eqn1, eqn2, ...}, {f1, f2, ...}, x -> x0]` computes an asymptotic approximation to a system of differential equations. `AsymptoticDSolveValue[eqn, f, x, ε -> ε0]` computes an asymptotic approximation of f\[x, ε] for the parameter ε centered at ε0. Examples [#examples] Find asymptotic solution to a differential equation: ```wolfram AsymptoticDSolveValue[y''[x] + y[x] == 0, y, x -> 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticDSolveValue.html) for more details. # AsymptoticEqual `AsymptoticEqual[f, g, x -> x*]` gives conditions for f(x) ≍ g(x) or f(x) ∈ Θ(g(x)) as x -> x\*. `AsymptoticEqual[f, g, {x1, ..., xn} -> {x1*, ..., xn*}]` gives conditions for the multivariate case. Examples [#examples] Test asymptotic equality: ```wolfram AsymptoticEqual[x^2 + x, x^2, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticEqual.html) for more details. # AsymptoticEquivalent `AsymptoticEquivalent[f, g, x -> x*]` gives conditions for f(x) \~ g(x) as x -> x\*. `AsymptoticEquivalent[f, g, {x1, ..., xn} -> {x1*, ..., xn*}]` gives conditions for the multivariate case. Examples [#examples] Test asymptotic equivalence: ```wolfram AsymptoticEquivalent[x^2 + x, x^2, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticEquivalent.html) for more details. # AsymptoticExpectation `AsymptoticExpectation[expr, x \[Distributed] dist, a -> a0]` computes an asymptotic approximation for the expectation of expr centered at a0, under the assumption that x follows the probability distribution dist. `AsymptoticExpectation[expr, vars, {a, a0, n}]` computes the asymptotic expectation to order n. Examples [#examples] Asymptotic expectation: ```wolfram AsymptoticExpectation[x^2, x \[Distributed] NormalDistribution[a, 1], a -> Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticExpectation.html) for more details. # AsymptoticGreater `AsymptoticGreater[f, g, x -> x*]` gives conditions for f(x) ≻ g(x) or f(x) ∈ ω(g(x)) as x -> x\*. `AsymptoticGreater[f, g, {x1, ..., xn} -> {x1*, ..., xn*}]` gives conditions for the multivariate case. Examples [#examples] Test if one function dominates another: ```wolfram AsymptoticGreater[x^3, x^2, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticGreater.html) for more details. # AsymptoticGreaterEqual `AsymptoticGreaterEqual[f, g, x->x*]` gives conditions for f(x)⪰g(x) or f(x)∈Ω(g(x)) as x->x\*. `AsymptoticGreaterEqual[f, g, {x1, ..., xn}->{x1*, ..., xn*}]` gives conditions for f(x1,...,xn)⪰g(x1,...,xn) as \{x1,...,xn}->\{x1\*,...,xn\*}. Examples [#examples] Check asymptotic inequality: ```wolfram AsymptoticGreaterEqual[x^2, x, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticGreaterEqual.html) for more details. # AsymptoticLess `AsymptoticLess[f,g,x->x*]` gives conditions for f(x)≺g(x) or f(x)∈o(g(x)) as x->x\*. `AsymptoticLess[f,g,{x1,…,xn}->{x1*,…,xn*}]` gives conditions for f(x1,…,xn)≺g(x1,…,xn) or f(x1,…,xn)∈o(g(x1,…,xn)) as \{x1,…,xn}->\{x1\*,…,xn\*}. Examples [#examples] Check if x grows slower than x^2 as x approaches infinity: ```wolfram AsymptoticLess[x, x^2, x -> Infinity] (* True *) ``` Compare growth rates: ```wolfram AsymptoticLess[Log[x], x, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticLess.html) for more details. # AsymptoticLessEqual `AsymptoticLessEqual[f, g, x -> x*]` gives conditions for f(x) ⪯ g(x) or f(x) ∈ O(g(x)) as x -> x\*. `AsymptoticLessEqual[f, g, {x1, ..., xn} -> {x1*, ..., xn*}]` gives conditions for the multivariate case. Examples [#examples] Check big-O notation: ```wolfram AsymptoticLessEqual[x + Log[x], x, x -> Infinity] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticLessEqual.html) for more details. # AsymptoticProbability `AsymptoticProbability[pred, x \[Distributed] dist, a -> a0]` computes an asymptotic approximation for the probability of pred centered at a0, under the assumption that x follows the probability distribution dist. `AsymptoticProbability[pred, vars, {a, a0, n}]` computes the asymptotic probability to order n. Examples [#examples] Asymptotic probability: ```wolfram AsymptoticProbability[x > 0, x \[Distributed] NormalDistribution[a, 1], a -> Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticProbability.html) for more details. # AsymptoticRSolveValue `AsymptoticRSolveValue[eqn,f,x->∞]` computes an asymptotic approximation to the difference equation eqn for f\[x] near ∞. `AsymptoticRSolveValue[{eqn1,eqn2,…},{f1,f2,…},x-> ∞]` computes an asymptotic approximation to a system of difference equations. `AsymptoticRSolveValue[eqn,f,x,ϵ->ϵ0]` computes an asymptotic approximation of f\[x,ϵ] for the parameter ϵ centered at ϵ0. `AsymptoticRSolveValue[eqn,f,…,{ξ,ξ0,n}]` computes the asymptotic approximation to order n. Examples [#examples] Find asymptotic solution to a recurrence: ```wolfram AsymptoticRSolveValue[f[x + 1] == 2 f[x] + 1, f, x -> Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticRSolveValue.html) for more details. # AsymptoticSolve `AsymptoticSolve[eqn, y -> b, x -> a]` computes asymptotic approximations of solutions y\[x] of the equation eqn passing through \{a, b}. `AsymptoticSolve[eqn, {y}, x -> a]` computes asymptotic approximations of solutions y\[x] of the equation eqn for x near a. `AsymptoticSolve[eqns, {y1, y2, ...} -> {b1, b2, ...}, {x1, x2, ...} -> {a1, a2, ...}]` computes asymptotic approximations for a system of equations. Examples [#examples] Find asymptotic solutions: ```wolfram AsymptoticSolve[y^2 + x y + x^2 == 0, y -> 0, x -> 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AsymptoticSolve.html) for more details. # BilateralLaplaceTransform `BilateralLaplaceTransform[expr, t, s]` gives the bilateral Laplace transform of expr. `BilateralLaplaceTransform[expr, {t1, t2, ..., tn}, {s1, s2, ..., sn}]` gives the multidimensional bilateral Laplace transform of expr. Examples [#examples] Bilateral Laplace transform: ```wolfram BilateralLaplaceTransform[Exp[-Abs[t]], t, s] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BilateralLaplaceTransform.html) for more details. # BilateralZTransform `BilateralZTransform[expr,n,z]` gives the bilateral Z transform of expr. `BilateralZTransform[expr,{n1,…,nk},{z1,…,zk}]` gives the multidimensional bilateral Z transform of expr. Examples [#examples] ```wolfram BilateralZTransform[n UnitStep[n], n, z] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BilateralZTransform.html) for more details. # CaputoD `CaputoD[f, {x, α}]` gives the Caputo fractional differintegral of the function f(x). Examples [#examples] Caputo fractional derivative: ```wolfram CaputoD[x^2, {x, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CaputoD.html) for more details. # CirclePoints `CirclePoints[n]` gives the positions of n points equally spaced around the unit circle. `CirclePoints[r, n]` gives the positions of n points equally spaced around a circle of radius r. `CirclePoints[{r, θ1}, n]` starts at angle θ1 with respect to the x axis. Examples [#examples] Points on a unit circle: ```wolfram CirclePoints[6] (* {{1, 0}, {1/2, Sqrt[3]/2}, ...} *) ``` Visualize circle points: ```wolfram Graphics[Point[CirclePoints[12]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CirclePoints.html) for more details. # CompleteIntegral `CompleteIntegral[pde, u, {x1, ..., xn}]` gives a complete integral u for the first-order partial differential equation pde, with independent variables \{x1, ..., xn}. Examples [#examples] Find complete integral of a PDE: ```wolfram CompleteIntegral[D[u[x, y], x] + D[u[x, y], y] == 1, u[x, y], {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompleteIntegral.html) for more details. # ConicOptimization `ConicOptimization[f, cons, vars]` finds values of variables vars that minimize the linear objective f subject to conic constraints cons. `ConicOptimization[..., "prop"]` specifies what solution property "prop" should be returned. Examples [#examples] Solve a conic optimization problem: ```wolfram ConicOptimization[x + y, {x^2 + y^2 <= 1}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConicOptimization.html) for more details. # ConservativeConvectionPDETerm `ConservativeConvectionPDETerm[vars, α]` represents a conservative convection term ∇\{x1,…,xn}·(-α u) with conservative convection coefficient α and model variables vars. `ConservativeConvectionPDETerm[vars, α, pars]` uses model parameters pars. Examples [#examples] ```wolfram ConservativeConvectionPDETerm[{u[x, y], {x, y}}, {{1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConservativeConvectionPDETerm.html) for more details. # ContourIntegrate `ContourIntegrate[f, z ∈ cont]` gives the integral of f along the contour defined by cont in the complex plane. Examples [#examples] Integrate along a circle contour: ```wolfram ContourIntegrate[1/z, z ∈ Circle[0, 1]] (* 2 π I *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContourIntegrate.html) for more details. # ConvectionPDETerm `ConvectionPDETerm[vars, β]` represents a convection term β·∇u with convection coefficient β and model variables vars. `ConvectionPDETerm[vars, β, pars]` uses model parameters pars. Examples [#examples] ```wolfram ConvectionPDETerm[{u[x, y], {x, y}}, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvectionPDETerm.html) for more details. # ConvexOptimization `ConvexOptimization[f, cons, vars]` finds values of variables vars that minimize the convex objective function f subject to convex constraints cons. `ConvexOptimization[..., "prop"]` specifies what solution property "prop" should be returned. Examples [#examples] Solve a convex optimization problem: ```wolfram ConvexOptimization[x^2 + y^2, {x + y >= 1}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexOptimization.html) for more details. # Convolve `Convolve[f, g, x, y]` gives the convolution of expressions f and g with respect to x. Examples [#examples] Convolve two functions: ```wolfram Convolve[Exp[-x^2], Exp[-x^2], x, y] (* Sqrt[Pi/2] E^(-y^2/2) *) ``` Box convolution: ```wolfram Convolve[UnitBox[x], UnitBox[x], x, y] (* UnitTriangle[y] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Convolve.html) for more details. # Curl `Curl[{f1, f2, f3}, {x1, x2, x3}]` gives the curl of a 3D vector field. Examples [#examples] Curl of a vector field: ```wolfram Curl[{y, -x, 0}, {x, y, z}] (* {0, 0, -2} *) ``` 2D curl (scalar): ```wolfram Curl[{-y, x}, {x, y}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Curl.html) for more details. # D `D[f, x]` gives the partial derivative of f with respect to x. `D[f, {x, n}]` gives the nth derivative. Examples [#examples] First derivative: ```wolfram D[x^3, x] (* 3 x^2 *) ``` Second derivative: ```wolfram D[Sin[x], {x, 2}] (* -Sin[x] *) ``` Partial derivative: ```wolfram D[x^2 y, x] (* 2 x y *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/D.html) for more details. # DEigensystem `DEigensystem[ℒ[u[x, y, ...]], u, {x, y, ...} ∈ Ω, n]` gives the n smallest magnitude eigenvalues and eigenfunctions for the linear differential operator ℒ over the region Ω. `DEigensystem[eqns, u, t, {x, y, ...} ∈ Ω, n]` gives the eigenvalues and eigenfunctions for solutions u of the time-dependent differential equations eqns. Examples [#examples] Find eigenvalues and eigenfunctions: ```wolfram DEigensystem[-Laplacian[u[x, y], {x, y}], u, {x, y} ∈ Rectangle[], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DEigensystem.html) for more details. # DEigenvalues `DEigenvalues[ℒ[u[x, y, ...]], u, {x, y, ...} ∈ Ω, n]` gives the n smallest magnitude eigenvalues for the linear differential operator ℒ over the region Ω. `DEigenvalues[eqns, u, t, {x, y, ...} ∈ Ω, n]` gives the eigenvalues for solutions u of the time-dependent differential equations eqns. Examples [#examples] Find eigenvalues of a differential operator: ```wolfram DEigenvalues[-Laplacian[u[x, y], {x, y}], u, {x, y} ∈ Disk[], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DEigenvalues.html) for more details. # DFixedPoints `DFixedPoints[eqn, x[t], t]` gives the fixed points for a differential equation. `DFixedPoints[{eqn1, eqn2, ...}, {x1[t], x2[t], ...}, t]` gives the fixed points for a system of differential equations. Examples [#examples] Find fixed points of a differential equation: ```wolfram DFixedPoints[x'[t] == x[t] (1 - x[t]), x[t], t] (* {0, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DFixedPoints.html) for more details. # DMSList `DMSList[θ]` converts an angle θ given in decimal degrees to a DMS list \{degree, minute, second}. `DMSList["dms"]` converts a DMS string to a DMS list \{degree, minute, second}. `DMSList["latlon"]` converts a latitude-longitude string to a pair of DMS lists. `DMSList[GeoPosition[...]]` converts `GeoPosition` data to a pair or array of pairs of DMS lists. Examples [#examples] Convert decimal degrees to DMS list: ```wolfram DMSList[40.7128] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DMSList.html) for more details. # DMSString `DMSString[θ]` converts an angle θ given in decimal degrees to a degrees-minutes-seconds string. `DMSString[{ϕ, λ}]` converts latitude and longitude given in decimal degrees to a DMS latitude-longitude string. `DMSString[{d, m, s}]` converts a DMS list to a DMS string. Examples [#examples] Convert decimal degrees to DMS string: ```wolfram DMSString[40.7128] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DMSString.html) for more details. # DSolve `DSolve[eqn, u, x]` solves a differential equation for the function u with independent variable x. Examples [#examples] Solve a first-order ODE: ```wolfram DSolve[y'[x] == y[x], y, x] (* {{y -> Function[{x}, E^x C[1]]}} *) ``` Solve with initial condition: ```wolfram DSolve[{y'[x] == y[x], y[0] == 1}, y, x] (* {{y -> Function[{x}, E^x]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DSolve.html) for more details. # DSolveChangeVariables `DSolveChangeVariables[dsolve, u, t, trans]` changes the solution function in dsolve to u(t) using the transformation trans. `DSolveChangeVariables[dsolve, {u1, u2, ...}, t, trans]` changes the solution functions in the system to \{u1(t), ..., un(t)}. `DSolveChangeVariables[dsolve, u, {t1, ..., tn}, trans]` changes the solution function in the partial differential equation to u(t1, ..., tn). Examples [#examples] Change variables in a DSolve solution: ```wolfram DSolveChangeVariables[DSolve[y'[x] == y[x], y, x], u, t, {y -> u, x -> t}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DSolveChangeVariables.html) for more details. # DSolveValue `DSolveValue[eqn, expr, x]` gives the value of expr determined by a symbolic solution to the differential equation. Examples [#examples] Solve ODE and get function: ```wolfram DSolveValue[{y'[x] == y[x], y[0] == 1}, y[x], x] (* E^x *) ``` Second order ODE: ```wolfram DSolveValue[y''[x] + y[x] == 0, y[x], x] (* C[1] Cos[x] + C[2] Sin[x] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DSolveValue.html) for more details. # DStabilityConditions `DStabilityConditions[eqn, x[t], t]` gives the fixed points and stability conditions for a differential equation. `DStabilityConditions[{eqn1, eqn2, ...}, {x1[t], x2[t], ...}, t]` gives the fixed points and stability conditions for a system of differential equations. `DStabilityConditions[{eqn1, eqn2, ...}, {x1[t], x2[t], ...}, t, {pnt1, pnt2, ...}]` gives the stability conditions for the given fixed points. Examples [#examples] Find stability conditions: ```wolfram DStabilityConditions[x'[t] == x[t] (1 - x[t]), x[t], t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DStabilityConditions.html) for more details. # DamerauLevenshteinDistance `DamerauLevenshteinDistance[u, v]` gives the Damerau–Levenshtein distance between strings or vectors u and v. Examples [#examples] Distance between strings: ```wolfram DamerauLevenshteinDistance["hello", "hallo"] (* 1 *) ``` With transposition: ```wolfram DamerauLevenshteinDistance["ab", "ba"] (* 1 *) ``` Compare to edit distance: ```wolfram EditDistance["ab", "ba"] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DamerauLevenshteinDistance.html) for more details. # DataStructure `DataStructure["type",data]` represents a data structure. Examples [#examples] Create a stack data structure: ```wolfram DataStructure["Stack", {1, 2, 3}] (* DataStructure["Stack", ...] *) ``` Create a hash map: ```wolfram DataStructure["HashTable", {"a" -> 1, "b" -> 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DataStructure.html) for more details. # DataStructureQ `DataStructureQ[ds]` yields `True` if ds is a valid data structure and `False` otherwise. `DataStructureQ[ds, type]` yields `True` if ds is a valid data structure of the specified type and `False` otherwise. Examples [#examples] Check if something is a data structure: ```wolfram ds = CreateDataStructure["Stack"]; DataStructureQ[ds] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DataStructureQ.html) for more details. # DayHemisphere `DayHemisphere[]` is a two-dimensional GeoGraphics primitive that represents the half of the Earth that is currently in daylight. `DayHemisphere[datespec]` represents the daylight half of the Earth for the specified date. Examples [#examples] Show the current daylight hemisphere: ```wolfram GeoGraphics[DayHemisphere[]] ``` Show daylight for a specific date: ```wolfram GeoGraphics[DayHemisphere[DateObject[{2024, 6, 21}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayHemisphere.html) for more details. # DayMatchQ `DayMatchQ[date, daytype]` returns True if the date matches the daytype specification and returns False otherwise. Examples [#examples] Check if a date is a weekend: ```wolfram DayMatchQ[{2024, 1, 6}, "Weekend"] (* True - Saturday *) ``` Check if it's a business day: ```wolfram DayMatchQ[{2024, 1, 5}, "BusinessDay"] (* True - Friday *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayMatchQ.html) for more details. # DayNightTerminator `DayNightTerminator[]` is a one-dimensional GeoGraphics primitive that represents the separation line between the halves of the Earth currently in daytime and nighttime. `DayNightTerminator[datespec]` represents the separation line between day and night for the specified date. Examples [#examples] Show the day/night boundary: ```wolfram GeoGraphics[{Red, DayNightTerminator[]}] ``` For a specific date: ```wolfram GeoGraphics[DayNightTerminator[DateObject[{2024, 6, 21}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayNightTerminator.html) for more details. # Decompose `Decompose[poly, x]` decomposes a polynomial, if possible, into a composition of simpler polynomials. Examples [#examples] Decompose a polynomial: ```wolfram Decompose[x^4 + 2x^2 + 1, x] (* {1 + x^2, x^2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Decompose.html) for more details. # Decrement `x--` decreases the value of x by 1, returning the old value of x. Examples [#examples] Decrement a variable: ```wolfram x = 5; x-- (* 5 *) x (* 4 *) ``` In a loop: ```wolfram i = 3; While[i-- > 0, Print[i]] (* prints 2, 1, 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Decrement.html) for more details. # Del `Del[x]` displays as ∇x. Examples [#examples] Display the del operator: ```wolfram Del[f] (* ∇f *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Del.html) for more details. # DelimitedSequence `DelimitedSequence[form]` represents a delimited sequence of elements of the specified form in Interpreter and related functions. `DelimitedSequence[form,sep]` assumes a separator that matches sep. `DelimitedSequence[form,{left,sep,right}]` assumes left and right delimiters matching left and right, respectively. Examples [#examples] Parse a comma-separated list of integers: ```wolfram Interpreter[DelimitedSequence["Integer"]]["1, 2, 3, 4"] (* {1, 2, 3, 4} *) ``` Use a custom separator: ```wolfram Interpreter[DelimitedSequence["Word", ";"]]["apple;banana;cherry"] (* {"apple", "banana", "cherry"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DelimitedSequence.html) for more details. # Denominator `Denominator[expr]` gives the denominator of expr. Examples [#examples] Get the denominator of a fraction: ```wolfram Denominator[3/4] (* 4 *) ``` From a rational expression: ```wolfram Denominator[(a + b)/(c + d)] (* c + d *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Denominator.html) for more details. # DensityGraphics `DensityGraphics[array]` is a representation of a density plot. Examples [#examples] Create density graphics: ```wolfram DensityGraphics[Table[Sin[x] Cos[y], {x, 0, 2Pi, 0.1}, {y, 0, 2Pi, 0.1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DensityGraphics.html) for more details. # Derivative `f'` represents the derivative of a function f of one argument. `Derivative[n1, n2, ...][f]` represents a function obtained from f by differentiating n1 times with respect to the first argument, n2 times with respect to the second argument, and so on. Examples [#examples] First derivative: ```wolfram f'[x] (* f'[x] *) ``` Compute derivative of sine: ```wolfram Sin'[x] (* Cos[x] *) ``` Second derivative: ```wolfram Derivative[2][f][x] (* f''[x] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Derivative.html) for more details. # DerivativeFilter `DerivativeFilter[data, {n1, n2, ...}]` computes the nith derivative of data at level i. `DerivativeFilter[data, {n1, n2, ...}, σ]` computes the derivative at a Gaussian scale of standard deviation σ. `DerivativeFilter[data, {der1, der2, ...}, ...]` computes several derivatives der1, der2, .... Examples [#examples] Compute derivative of an image: ```wolfram DerivativeFilter[image, {1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DerivativeFilter.html) for more details. # DerivativePDETerm `DerivativePDETerm[vars, γ]` represents a load derivative term ∇\{x1,...,xn}·(γ) with load derivative coefficient γ and model variables vars. `DerivativePDETerm[vars, γ, pars]` uses model parameters pars. Examples [#examples] Create a derivative PDE term: ```wolfram DerivativePDETerm[{x, y}, f[x, y]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DerivativePDETerm.html) for more details. # DerivedKey `DerivedKey[assoc]` represents a derived key generated by GenerateDerivedKey. Examples [#examples] ```wolfram key = GenerateDerivedKey["password"] (* DerivedKey[...] *) ``` ```wolfram VerifyDerivedKey[key, "password"] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DerivedKey.html) for more details. # DiagonalizableMatrixQ `DiagonalizableMatrixQ[m]` gives True if m is diagonalizable, and False otherwise. Examples [#examples] ```wolfram DiagonalizableMatrixQ[{{1, 2}, {0, 3}}] (* True *) ``` ```wolfram DiagonalizableMatrixQ[{{1, 1}, {0, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiagonalizableMatrixQ.html) for more details. # DiceDissimilarity `DiceDissimilarity[x,y]` gives the Dice dissimilarity between Boolean vectors x and y. Examples [#examples] ```wolfram DiceDissimilarity[{1, 0, 1, 1}, {0, 1, 1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiceDissimilarity.html) for more details. # Diff `Diff[first, second]` returns a representation of the diffs between first and second. `Diff[first, second, format]` represents the diffs in the indicated format. Examples [#examples] ```wolfram Diff["hello world", "hello there"] ``` ```wolfram Diff[{1, 2, 3, 4}, {1, 3, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Diff.html) for more details. # Diff3 `Diff3[ancestor, first, second]` returns a representation of the three-way diff between ancestor and two independently changed versions of ancestor. `Diff3[ancestor, first, second, format]` represents the diffs in the indicated format. Examples [#examples] Three-way diff of strings: ```wolfram Diff3["abc", "ab", "acd"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Diff3.html) for more details. # DiffApply `DiffApply[diffobj, expr]` returns the result of applying the given `DiffObject` to the expression expr. `DiffApply[diffobj, expr, File["file"]]` writes the result of changing expr to file. Examples [#examples] Apply a diff to an expression: ```wolfram diff = Diff["abc", "aXc"]; DiffApply[diff, "abc"] (* "aXc" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiffApply.html) for more details. # DifferenceQuotient `DifferenceQuotient[f, {x, h}]` gives the difference quotient (f(x+h)-f(x))/h. `DifferenceQuotient[f, {x, n, h}]` gives a multiple difference quotient with step h. `DifferenceQuotient[f, {x1, n1, h1}, {x2, n2, h2}, ...]` computes the partial difference quotient. Examples [#examples] Simple difference quotient: ```wolfram DifferenceQuotient[f[x], {x, h}] (* (f[h + x] - f[x])/h *) ``` Second-order quotient: ```wolfram DifferenceQuotient[x^2, {x, 2, h}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferenceQuotient.html) for more details. # DifferenceRoot `DifferenceRoot[lde][k]` gives the holonomic sequence h(k), specified by the linear difference equation lde\[h, k]. `DifferenceRoot[lde]` represents a pure holonomic sequence h. Examples [#examples] Define a sequence via difference equation: ```wolfram DifferenceRoot[Function[{y, n}, {y[n + 2] == y[n + 1] + y[n], y[0] == 0, y[1] == 1}]][10] (* 55 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferenceRoot.html) for more details. # DifferenceRootReduce `DifferenceRootReduce[expr,n]` attempts to reduce expr to a single DifferenceRoot object as a function of n. Examples [#examples] ```wolfram DifferenceRootReduce[Fibonacci[n], n] (* DifferenceRoot[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferenceRootReduce.html) for more details. # Differences `Differences[list]` gives the successive differences between consecutive elements: `{e2-e1, e3-e2, ...}`. Examples [#examples] Compute differences: ```wolfram Differences[{1, 4, 9, 16, 25}] (* {3, 5, 7, 9} *) (* Second differences *) Differences[{1, 4, 9, 16, 25}, 2] (* {2, 2, 2} *) (* Inverse of Accumulate *) Differences[Accumulate[{1, 2, 3, 4, 5}]] (* {2, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Differences.html) for more details. # DifferentialD `DifferentialD[x]` displays as dx, representing a differential. Examples [#examples] Display differential: ```wolfram DifferentialD[x] (* Displays as dx *) ``` In integrals: ```wolfram Integrate[f[x], DifferentialD[x]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferentialD.html) for more details. # DifferentialRoot `DifferentialRoot[lde][x]` gives the holonomic function h(x), specified by the linear differential equation lde\[h, x]. `DifferentialRoot[lde]` represents a pure holonomic function h. Examples [#examples] ```wolfram DifferentialRoot[Function[{y, x}, {y''[x] + y[x] == 0, y[0] == 0, y'[0] == 1}]][x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferentialRoot.html) for more details. # DifferentialRootReduce `DifferentialRootReduce[expr, x]` attempts to reduce expr to a single `DifferentialRoot` object as a function of x. `DifferentialRootReduce[expr, {x, x0}]` takes the initial conditions to be specified at x=x0. Examples [#examples] Reduce a holonomic expression: ```wolfram DifferentialRootReduce[Sin[x] + Cos[x], x] (* DifferentialRoot[...] *) ``` With initial point: ```wolfram DifferentialRootReduce[Exp[x], {x, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferentialRootReduce.html) for more details. # DifferentiatorFilter `DifferentiatorFilter[data,ωc]` applies a differentiator filter with a cutoff frequency ωc to an array of data. `DifferentiatorFilter[data,ωc,n]` uses a filter kernel of length n. `DifferentiatorFilter[data,ωc,n,wfun]` applies a smoothing window wfun to the filter kernel. Examples [#examples] Apply a differentiator filter to data: ```wolfram data = Table[Sin[x], {x, 0, 2 Pi, 0.1}]; DifferentiatorFilter[data, 0.5] ``` Use a specific kernel length: ```wolfram DifferentiatorFilter[data, 0.5, 21] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DifferentiatorFilter.html) for more details. # DiffusionPDETerm `DiffusionPDETerm[vars]` represents a diffusion term ∇\{x1,…,xn}·(-∇\{x1,…,xn}u) with model variables vars. `DiffusionPDETerm[vars,c]` represents a diffusion term ∇\{x1,…,xn}·(-c∇\{x1,…,xn}u) with diffusion coefficient c. `DiffusionPDETerm[vars,c,pars]` uses model parameters pars. Examples [#examples] Create a diffusion term for a 2D problem: ```wolfram DiffusionPDETerm[{u[x, y], {x, y}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiffusionPDETerm.html) for more details. # DigitCount `DigitCount[n, b, d]` gives the number of d digits in the base-b representation of n. `DigitCount[n, b]` gives a list of the numbers of 1, 2, ..., b-1, 0 digits in base b. `DigitCount[n]` gives counts of 1, 2, ..., 9, 0 digits in base 10. Examples [#examples] Count 1s in binary: ```wolfram DigitCount[255, 2, 1] (* 8 *) ``` Digit frequency in base 10: ```wolfram DigitCount[123456789] (* {1, 1, 1, 1, 1, 1, 1, 1, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DigitCount.html) for more details. # DigitSum `DigitSum[n]` gives the sum of the decimal digits in the integer n. `DigitSum[n, b]` gives the sum of the base b digits in the integer n. `DigitSum[n, b, k]` gives the sum of the first k base b digits in the integer n. `DigitSum[n, b, -k]` gives the sum of the last k base b digits in the integer n. Examples [#examples] Sum digits of a number: ```wolfram DigitSum[12345] (* 15 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DigitSum.html) for more details. # DimensionReduction `DimensionReduction[{example1,example2,…}]` generates a `DimensionReducerFunction[…]` that projects from the space defined by the examplei to a lower-dimensional approximating manifold. `DimensionReduction[examples,n]` generates a `DimensionReducerFunction[…]` for an n-dimensional approximating manifold. `DimensionReduction[examples,n,props]` generates the specified properties of the dimensionality reduction. Examples [#examples] Reduce dimensionality of data: ```wolfram data = RandomReal[1, {100, 10}]; reducer = DimensionReduction[data, 2] (* DimensionReducerFunction[...] *) ``` Apply the reducer: ```wolfram reducer[data[[1]]] (* {0.123, 0.456} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DimensionReduction.html) for more details. # DimensionalCombinations `DimensionalCombinations[{pq1, pq2, ...}]` returns possible combinations of physical quantities that are dimensionless. `DimensionalCombinations[{pq1, pq2, ...}, dim]` returns combinations matching dimensions of dim. Examples [#examples] Find dimensionless combinations: ```wolfram DimensionalCombinations[{Quantity["Length"], Quantity["Time"], Quantity["Speed"]}] ``` Match specific dimensions: ```wolfram DimensionalCombinations[{Quantity["Mass"], Quantity["Speed"]}, Quantity["Energy"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DimensionalCombinations.html) for more details. # DimensionalMeshComponents `DimensionalMeshComponents[mr]` gives a list \{r0,r1,…} of regions such that rd has dimension d for a mesh region mr. Examples [#examples] Get components of different dimensions: ```wolfram mesh = BoundaryMeshRegion[{{0,0},{1,0},{1,1},{0,1}}, Line[{1,2,3,4,1}]]; DimensionalMeshComponents[mesh] ``` Extract 1D components: ```wolfram DimensionalMeshComponents[mesh][[2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DimensionalMeshComponents.html) for more details. # DiracComb `DiracComb[x]` represents the Dirac comb function giving a delta function at every integer point. `DiracComb[x1, x2, ...]` represents the multidimensional Dirac comb function. Examples [#examples] Fourier transform of Dirac comb: ```wolfram FourierTransform[DiracComb[x], x, k] ``` Sampling with DiracComb: ```wolfram DiracComb[x] Sin[2 Pi x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiracComb.html) for more details. # DiracDelta `DiracDelta[x]` represents the Dirac delta function δ(x). `DiracDelta[x1,x2,…]` represents the multidimensional Dirac delta function δ(x1,x2,…). Examples [#examples] Integrate a function with DiracDelta: ```wolfram Integrate[f[x] DiracDelta[x - a], {x, -Infinity, Infinity}] (* f[a] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiracDelta.html) for more details. # DirectedEdge `DirectedEdge[u, v]` or `u -> v` represents a directed edge from u to v. Examples [#examples] Create directed edges: ```wolfram DirectedEdge[1, 2] (* 1 \[DirectedEdge] 2 *) ``` Build a directed graph: ```wolfram Graph[{DirectedEdge[1, 2], DirectedEdge[2, 3]}] (* same as Graph[{1 -> 2, 2 -> 3}] *) ``` With tags: ```wolfram DirectedEdge["A", "B", "route1"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectedEdge.html) for more details. # DirichletCharacter `DirichletCharacter[k, j, n]` gives the Dirichlet character χk,j(n) with modulus k and index j. Examples [#examples] Compute a Dirichlet character: ```wolfram DirichletCharacter[5, 2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletCharacter.html) for more details. # DirichletCondition `DirichletCondition[beqn, pred]` represents a Dirichlet boundary condition given by equation beqn, satisfied on the part of the boundary of the region given to `NDSolve` and related functions where pred is `True`. Examples [#examples] Set a Dirichlet boundary condition: ```wolfram DirichletCondition[u[x, y] == 0, x == 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletCondition.html) for more details. # DirichletConvolve `DirichletConvolve[f, g, n, m]` gives the Dirichlet convolution of expressions f and g. Examples [#examples] Convolve arithmetic functions: ```wolfram DirichletConvolve[1, MoebiusMu[n], n, m] (* DiscreteDelta[m - 1] *) ``` Identity convolution: ```wolfram DirichletConvolve[f[n], DiscreteDelta[n - 1], n, m] (* f[m] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletConvolve.html) for more details. # DirichletTransform `DirichletTransform[expr, n, s]` gives the Dirichlet transform of expr with respect to n. Examples [#examples] Transform of a constant: ```wolfram DirichletTransform[1, n, s] (* Zeta[s] *) ``` Transform of n^k: ```wolfram DirichletTransform[n^2, n, s] (* Zeta[s - 2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletTransform.html) for more details. # DiscreteAsymptotic `DiscreteAsymptotic[expr, n -> ∞]` gives an asymptotic approximation for expr as n tends to infinity over the integers. `DiscreteAsymptotic[expr, {n, ∞, m}]` gives an asymptotic series approximation for expr to order m. Examples [#examples] Find discrete asymptotic: ```wolfram DiscreteAsymptotic[n!, n -> Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteAsymptotic.html) for more details. # DiscreteChirpZTransform `DiscreteChirpZTransform[list]` gives the chirp Z transform of list. `DiscreteChirpZTransform[list, n]` returns a length n chirp Z transform. `DiscreteChirpZTransform[list, n, w]` uses a spiral path on the complex z plane defined by w. `DiscreteChirpZTransform[list, n, w, a]` uses a as the complex starting point. Examples [#examples] Compute chirp Z transform: ```wolfram DiscreteChirpZTransform[{1, 2, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteChirpZTransform.html) for more details. # DiscreteConvolve `DiscreteConvolve[f, g, n, m]` gives the convolution with respect to n of the expressions f and g. `DiscreteConvolve[f, g, {n1, n2, ...}, {m1, m2, ...}]` gives the multidimensional convolution. Examples [#examples] Convolve two sequences: ```wolfram DiscreteConvolve[UnitStep[n], UnitStep[n], n, m] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteConvolve.html) for more details. # DiscreteDelta `DiscreteDelta[n1, n2, ...]` gives the discrete delta function δ(n1, n2, ...), equal to 1 if all ni are zero, and 0 otherwise. Examples [#examples] Single argument: ```wolfram DiscreteDelta[0] (* 1 *) DiscreteDelta[5] (* 0 *) ``` Multiple arguments: ```wolfram DiscreteDelta[0, 0, 0] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteDelta.html) for more details. # DiscreteHadamardTransform `DiscreteHadamardTransform[list]` gives the discrete Hadamard transform of list. Examples [#examples] Compute the discrete Hadamard transform of a list: ```wolfram DiscreteHadamardTransform[{1, 2, 3, 4}] (* {5, -1, -2, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteHadamardTransform.html) for more details. # DiscreteIndicator `DiscreteIndicator[x, x1, {u1, u2, ...}]` yields the discrete indicator function, equal to 1 if x=x1 and, otherwise, to 0 if x=ui for some i. Examples [#examples] ```wolfram DiscreteIndicator[a, a, {a, b, c}] (* 1 *) ``` ```wolfram DiscreteIndicator[b, a, {a, b, c}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteIndicator.html) for more details. # DiscreteRatio `DiscreteRatio[f, i]` gives the discrete ratio f(i+1)/f(i). `DiscreteRatio[f, {i, n}]` gives the multiple discrete ratio. `DiscreteRatio[f, {i, n, h}]` gives the multiple discrete ratio with step h. Examples [#examples] Basic ratio: ```wolfram DiscreteRatio[f[i], i] (* f[1 + i]/f[i] *) ``` Factorial ratio: ```wolfram DiscreteRatio[i!, i] (* 1 + i *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteRatio.html) for more details. # DisjointQ `DisjointQ[list1, list2]` yields `True` if list1 and list2 do not share any common elements, and `False` otherwise. Examples [#examples] Test disjoint lists: ```wolfram DisjointQ[{1, 2, 3}, {4, 5, 6}] (* True *) ``` Lists with common elements: ```wolfram DisjointQ[{1, 2, 3}, {3, 4, 5}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DisjointQ.html) for more details. # Disjunction `Disjunction[expr, {a1, a2, ...}]` gives the disjunction of expr over all choices of the Boolean variables ai. Examples [#examples] Disjunction over Boolean variables: ```wolfram Disjunction[a && b, {a, b}] (* a || b *) ``` Expand logical expression: ```wolfram Disjunction[a || b, {a}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Disjunction.html) for more details. # Div `Div[{f1, ..., fn}, {x1, ..., xn}]` gives the divergence ∂f1/∂x1 + ... + ∂fn/∂xn. Examples [#examples] Divergence of a vector field: ```wolfram Div[{x^2, y^2, z^2}, {x, y, z}] (* 2x + 2y + 2z *) ``` 2D divergence: ```wolfram Div[{x, y}, {x, y}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Div.html) for more details. # Divisible `Divisible[n, m]` yields `True` if n is divisible by m, and `False` otherwise. Examples [#examples] Check divisibility: ```wolfram Divisible[12, 4] (* True *) ``` ```wolfram Divisible[13, 4] (* False *) ``` Filter divisible numbers: ```wolfram Select[Range[20], Divisible[#, 3] &] (* {3, 6, 9, 12, 15, 18} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Divisible.html) for more details. # DualPlanarGraph `DualPlanarGraph[g]` gives the dual of the planar graph g. Examples [#examples] Get the dual of a planar graph: ```wolfram DualPlanarGraph[GridGraph[{3, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DualPlanarGraph.html) for more details. # DualPolyhedron `DualPolyhedron[poly]` gives the dual polyhedron of the polyhedron poly. Examples [#examples] Get the dual of a cube (octahedron): ```wolfram DualPolyhedron[PolyhedronData["Cube", "Polyhedron"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DualPolyhedron.html) for more details. # DumpGet `DumpGet["filename"]` reads in a file saved with `DumpSave`. Examples [#examples] Load a previously saved dump file: ```wolfram DumpGet["mydata.mx"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DumpGet.html) for more details. # Duration `Duration[expr]` returns the duration of expr. `Duration[expr, unit]` returns the result in the specified unit. Examples [#examples] Get the duration of an audio object: ```wolfram audio = ExampleData[{"Audio", "Apollo11SmallStep"}]; Duration[audio] (* 5.4 seconds *) ``` Get duration in a specific unit: ```wolfram Duration[audio, "Milliseconds"] (* 5400. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Duration.html) for more details. # ElectricCurrentPDEComponent `ElectricCurrentPDEComponent[vars,pars]` yields an electric current PDE term with variables vars and parameters pars. Examples [#examples] Create an electric current PDE component: ```wolfram ElectricCurrentPDEComponent[{V[x, y], {x, y}}, <|"ElectricConductivity" -> 1|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ElectricCurrentPDEComponent.html) for more details. # ElectrostaticPDEComponent `ElectrostaticPDEComponent[vars, pars]` yields an electrostatic PDE term with variables vars and parameters pars. Examples [#examples] Create electrostatic PDE component: ```wolfram ElectrostaticPDEComponent[{V[x, y], {x, y}}, <|"Permittivity" -> 1|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ElectrostaticPDEComponent.html) for more details. # Element `Element[x, dom]` or `x ∈ dom` asserts that x is an element of the domain dom. `Element[x, reg]` asserts that x is an element of the region reg. Examples [#examples] Assert integer domain: ```wolfram Simplify[Sin[n Pi], Element[n, Integers]] (* 0 *) ``` Real assumption: ```wolfram Integrate[1/(1 + x^2), {x, -Infinity, Infinity}, Assumptions -> Element[x, Reals]] (* Pi *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Element.html) for more details. # FindArgMax `FindArgMax[f,x]` gives the position xmax of a local maximum of f. * `FindArgMax[f,{x,x0}]` gives the position xmax of a local maximum of f, found by a search starting from the point x=x0. * `FindArgMax[f,{{x,x0},{y,y0},…}]` gives the position \{xmax,ymax,…} of a local maximum of a function of several variables. * `FindArgMax[{f,cons},{{x,x0},{y,y0},…}]` gives the position of a local maximum subject to the constraints cons. * `FindArgMax[{f,cons},{x,y,…}]` starts from a point within the region defined by the constraints. Examples [#examples] ```wolfram (* Find the position of maximum *) FindArgMax[Sin[x] Exp[-x^2], x] (* Start from a specific point *) FindArgMax[x^4 - 3x^2 + x, {x, 1}] (* Multivariate function *) FindArgMax[-(x^2 + y^2), {{x, 1}, {y, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindArgMax.html) for more details. # FindArgMin `FindArgMin[f,x]` gives the position xmin of a local minimum of f. * `FindArgMin[f,{x,x0}]` gives the position xmin of a local minimum of f, found by a search starting from the point x=x0. * `FindArgMin[f,{{x,x0},{y,y0},…}]` gives the position \{xmin,ymin,…} of a local minimum of a function of several variables. * `FindArgMin[{f,cons},{{x,x0},{y,y0},…}]` gives the position of a local minimum subject to the constraints cons. * `FindArgMin[{f,cons},{x,y,…}]` starts from a point within the region defined by the constraints. Examples [#examples] ```wolfram (* Find the position of minimum *) FindArgMin[x^2 + 2x + 1, x] (* Start from a specific point *) FindArgMin[x^4 - 3x^2 + x, {x, 0}] (* Multivariate function *) FindArgMin[(x - 1)^2 + (y - 2)^2, {{x, 0}, {y, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindArgMin.html) for more details. # FindMaxValue `FindMaxValue[f,x]` gives the value at a local maximum of f. * `FindMaxValue[f,{x,x0}]` gives the value at a local maximum of f, found by a search starting from the point x=x0. * `FindMaxValue[f,{{x,x0},{y,y0},…}]` gives the value at a local maximum of a function of several variables. * `FindMaxValue[{f,cons},{{x,x0},{y,y0},…}]` gives the value at a local maximum subject to the constraints cons. * `FindMaxValue[{f,cons},{x,y,…}]` starts from a point within the region defined by the constraints. Examples [#examples] ```wolfram (* Find the maximum value *) FindMaxValue[Sin[x] Exp[-x^2], x] (* Start from a specific point *) FindMaxValue[x^4 - 3x^2 + x, {x, 1}] (* Multivariate maximum *) FindMaxValue[-(x^2 + y^2), {{x, 1}, {y, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMaxValue.html) for more details. # FindMaximum `FindMaximum[f, {x, x0}]` searches for a local maximum in f, starting from the point x=x0. Examples [#examples] Find local maximum: ```wolfram FindMaximum[-x^2 + 4x + 5, {x, 0}] (* {9., {x -> 2.}} *) ``` With constraints: ```wolfram FindMaximum[{x + y, x^2 + y^2 <= 1}, {{x, 0.5}, {y, 0.5}}] (* {1.414, {x -> 0.707, y -> 0.707}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMaximum.html) for more details. # FindMaximumCut `FindMaximumCut[g]` gives the maximum cut of the graph g. Examples [#examples] Find the maximum cut of a graph: ```wolfram FindMaximumCut[CycleGraph[5]] (* {{1, 3}, {2, 4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMaximumCut.html) for more details. # FindMinValue `FindMinValue[f,x]` gives the value at a local minimum of f. * `FindMinValue[f,{x,x0}]` gives the value at a local minimum of f, found by a search starting from the point x=x0. * `FindMinValue[f,{{x,x0},{y,y0},…}]` gives the value at a local minimum of a function of several variables. * `FindMinValue[{f,cons},{{x,x0},{y,y0},…}]` gives the value at a local minimum subject to the constraints cons. * `FindMinValue[{f,cons},{x,y,…}]` starts from a point within the region defined by the constraints. Examples [#examples] ```wolfram (* Find the minimum value *) FindMinValue[x^2 + 2x + 1, x] (* Start from a specific point *) FindMinValue[x^4 - 3x^2 + x, {x, 0}] (* Multivariate minimum *) FindMinValue[(x - 1)^2 + (y - 2)^2, {{x, 0}, {y, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMinValue.html) for more details. # FindMinimum `FindMinimum[f, {x, x0}]` searches for a local minimum in f, starting from the point x=x0. Examples [#examples] Find local minimum: ```wolfram FindMinimum[x^2 - 4x + 5, {x, 0}] (* {1., {x -> 2.}} *) ``` Multivariable: ```wolfram FindMinimum[x^2 + y^2 + x*y, {{x, 1}, {y, 1}}] (* {0., {x -> 0., y -> 0.}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMinimum.html) for more details. # FindMinimumCostFlow `FindMinimumCostFlow[g,{sd1,sd2,…}]` finds the minimum cost flow in the graph g with sd1, sd2, … vertex supplies or demands. * `FindMinimumCostFlow[g,s,t]` finds the minimum cost maximum flow between source vertex s and target vertex t in a graph g. * `FindMinimumCostFlow[g,s,t,d]` finds the minimum cost flow between source s and target t, with the required flow d. * `FindMinimumCostFlow[m,…]` finds the minimum cost flow in a graph with cost matrix m. * `FindMinimumCostFlow[data,…,"property"]` returns the value of "property". * `FindMinimumCostFlow[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find minimum cost flow *) g = Graph[{1 -> 2, 2 -> 3, 1 -> 3}, EdgeWeight -> {1, 2, 4}, EdgeCapacity -> {5, 3, 2}]; FindMinimumCostFlow[g, 1, 3] (* Get the cost *) FindMinimumCostFlow[g, 1, 3, "Cost"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMinimumCostFlow.html) for more details. # FluidFlowPDEComponent `FluidFlowPDEComponent[vars,pars]` yields a flow PDE term with variables vars and parameters pars. Examples [#examples] ```wolfram FluidFlowPDEComponent[{u[x, y], v[x, y], p[x, y]}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FluidFlowPDEComponent.html) for more details. # Fourier `Fourier[list]` finds the discrete Fourier transform of a list of complex numbers. Examples [#examples] DFT of a simple signal: ```wolfram Fourier[{1, 1, 1, 1, 0, 0, 0, 0}] (* {1.41421, 0.5 + 0.5 I, 0, 0.5 - 0.5 I, 0, ...} *) ``` Sinusoidal signal: ```wolfram data = Table[Sin[2 Pi k / 8], {k, 0, 7}]; Abs[Fourier[data]] (* {0, 0, 1.41, 0, 0, 0, 1.41, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Fourier.html) for more details. # FourierCoefficient `FourierCoefficient[expr, t, n]` gives the nth coefficient in the Fourier series expansion of expr. * `FourierCoefficient[expr, {t1, t2, ...}, {n1, n2, ...}]` gives a multidimensional Fourier coefficient. Examples [#examples] Compute the 3rd Fourier coefficient: ```wolfram FourierCoefficient[Cos[3 t], t, 3] ``` Get Fourier coefficients for a square wave: ```wolfram FourierCoefficient[SquareWave[t], t, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierCoefficient.html) for more details. # FourierCosCoefficient `FourierCosCoefficient[expr,t,n]` gives the nth coefficient in the Fourier cosine series expansion of expr. `FourierCosCoefficient[expr,{t1,t2,…},{n1,n2,…}]` gives a multidimensional Fourier cosine coefficient. Examples [#examples] Find the first Fourier cosine coefficient: ```wolfram FourierCosCoefficient[t^2, t, 1] (* -4/Pi^2 *) ``` Compute higher-order coefficients: ```wolfram FourierCosCoefficient[Sin[t]^2, t, 2] (* -1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierCosCoefficient.html) for more details. # FourierCosSeries `FourierCosSeries[expr,t,n]` gives the nth-order Fourier cosine series expansion of expr in t. `FourierCosSeries[expr,{t1,t2,…},{n1,n2,…}]` gives the multidimensional Fourier cosine series of expr. Examples [#examples] Compute a 3rd-order Fourier cosine series: ```wolfram FourierCosSeries[t^2, t, 3] (* Pi^2/3 - 4 Cos[t] + Cos[2 t] - 4/9 Cos[3 t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierCosSeries.html) for more details. # FourierCosTransform `FourierCosTransform[expr, t, ω]` gives the symbolic Fourier cosine transform of expr. * `FourierCosTransform[expr, {t1, t2, ...}, {ω1, ω2, ...}]` gives the multidimensional Fourier cosine transform of expr. Examples [#examples] Compute the Fourier cosine transform: ```wolfram FourierCosTransform[Exp[-t^2], t, ω] ``` Transform a Gaussian function: ```wolfram FourierCosTransform[Exp[-a t] UnitStep[t], t, ω, Assumptions -> a > 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierCosTransform.html) for more details. # FourierSequenceTransform `FourierSequenceTransform[expr,n,ω]` gives the Fourier sequence transform of expr. `FourierSequenceTransform[expr,{n1,n2,…},{ω1,ω2,…}]` gives the multidimensional Fourier sequence transform. Examples [#examples] Compute the Fourier sequence transform: ```wolfram FourierSequenceTransform[a^n, n, ω] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierSequenceTransform.html) for more details. # FourierSeries `FourierSeries[expr, t, n]` gives the nth-order Fourier series expansion of expr in t. `FourierSeries[expr, {t1, t2, …}, {n1, n2, …}]` gives the multidimensional Fourier series. Examples [#examples] Compute a Fourier series: ```wolfram FourierSeries[t, t, 3] ``` Fourier series of a square wave: ```wolfram FourierSeries[Sign[Sin[t]], t, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierSeries.html) for more details. # FourierSinCoefficient `FourierSinCoefficient[expr, t, n]` gives the nth coefficient in the Fourier sine series expansion of expr. * `FourierSinCoefficient[expr, {t1, t2, ...}, {n1, n2, ...}]` gives a multidimensional Fourier sine coefficient. Examples [#examples] Compute the Fourier sine coefficient: ```wolfram FourierSinCoefficient[Sin[3 t], t, 3] ``` Get coefficients for a sawtooth wave: ```wolfram FourierSinCoefficient[t, t, n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierSinCoefficient.html) for more details. # FourierSinSeries `FourierSinSeries[expr, t, n]` gives the nth-order Fourier sine series expansion of expr in t. * `FourierSinSeries[expr, {t1, t2, ...}, {n1, n2, ...}]` gives the multidimensional Fourier sine series of expr. Examples [#examples] Compute a Fourier sine series: ```wolfram FourierSinSeries[t, t, 5] ``` Expand a function as a sine series: ```wolfram FourierSinSeries[t (Pi - t), t, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierSinSeries.html) for more details. # FourierSinTransform `FourierSinTransform[expr, t, ω]` gives the symbolic Fourier sine transform of expr. * `FourierSinTransform[expr, {t1, t2, ...}, {ω1, ω2, ...}]` gives the multidimensional Fourier sine transform of expr. Examples [#examples] Compute the Fourier sine transform: ```wolfram FourierSinTransform[Exp[-t^2], t, ω] ``` Transform an exponential function: ```wolfram FourierSinTransform[Exp[-a t], t, ω, Assumptions -> a > 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierSinTransform.html) for more details. # FourierTransform `FourierTransform[expr, t, ω]` gives the symbolic Fourier transform of expr. Examples [#examples] Fourier transform of a Gaussian: ```wolfram FourierTransform[Exp[-t^2], t, ω] (* E^(-ω^2/4)/Sqrt[2] *) ``` Rectangular function: ```wolfram FourierTransform[UnitBox[t], t, ω] (* Sinc[ω/2]/Sqrt[2 Pi] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierTransform.html) for more details. # FourierTrigSeries `FourierTrigSeries[expr, t, n]` gives the nth-order Fourier trigonometric series expansion of expr in t. * `FourierTrigSeries[expr, {t1, t2, ...}, {n1, n2, ...}]` gives the multidimensional Fourier trigonometric series of expr. Examples [#examples] Compute a Fourier trigonometric series: ```wolfram FourierTrigSeries[t^2, t, 3] ``` Expand a periodic function: ```wolfram FourierTrigSeries[SquareWave[t], t, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierTrigSeries.html) for more details. # FrobeniusSolve `FrobeniusSolve[{a1, ..., an}, b]` gives a list of all solutions of the Frobenius equation a1*x1 + ... + an*xn = b. * `FrobeniusSolve[{a1, ..., an}, b, m]` gives at most m solutions. Examples [#examples] Find all ways to make 10 using 3 and 5: ```wolfram FrobeniusSolve[{3, 5}, 10] ``` Find at most 3 solutions: ```wolfram FrobeniusSolve[{2, 3, 5}, 15, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FrobeniusSolve.html) for more details. # FromPolarCoordinates `FromPolarCoordinates[{r,θ}]` gives the \{x,y} Cartesian coordinates corresponding to the polar coordinates \{r,θ}. `FromPolarCoordinates[{r,θ1,…,θn-2,ϕ}]` gives the coordinates corresponding to the hyperspherical coordinates \{r,θ1,…,θn-2,ϕ}. Examples [#examples] Convert polar to Cartesian coordinates: ```wolfram FromPolarCoordinates[{1, Pi/4}] (* {1/Sqrt[2], 1/Sqrt[2]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromPolarCoordinates.html) for more details. # FromSphericalCoordinates `FromSphericalCoordinates[{r, θ, ϕ}]` gives the \{x, y, z} Cartesian coordinates corresponding to the spherical coordinates \{r, θ, ϕ}. Examples [#examples] Convert spherical to Cartesian coordinates: ```wolfram FromSphericalCoordinates[{1, Pi/4, Pi/3}] ``` Convert a unit vector: ```wolfram FromSphericalCoordinates[{1, Pi/2, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromSphericalCoordinates.html) for more details. # Grad `Grad[f, {x1, ..., xn}]` gives the gradient (∂f/∂x1, ..., ∂f/∂xn). Examples [#examples] Gradient of a scalar field: ```wolfram Grad[x^2 + y^2 + z^2, {x, y, z}] (* {2x, 2y, 2z} *) ``` 2D gradient: ```wolfram Grad[x*y, {x, y}] (* {y, x} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Grad.html) for more details. # GradientFilter `GradientFilter[data, r]` gives the magnitude of the gradient of `data`, computed using discrete derivatives of a Gaussian of sample radius `r`. * `GradientFilter[data, {r, σ}]` uses a Gaussian with standard deviation `σ`. * `GradientFilter[data, {{r1, r2, …}, …}]` uses a Gaussian with radius `ri` at level `i` in `data`. Examples [#examples] ```wolfram GradientFilter[ExampleData[{"TestImage", "Lena"}], 2] ``` ```wolfram GradientFilter[image, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GradientFilter.html) for more details. # GradientFittedMesh `GradientFittedMesh[{p1,p2,…}]` gives a MeshRegion whose gradient best fits the normals at points p1,p2,…. Examples [#examples] ```wolfram GradientFittedMesh[{{0, 0, 0}, {1, 0, 1}, {0, 1, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GradientFittedMesh.html) for more details. # GradientOrientationFilter `GradientOrientationFilter[data, r]` gives the local orientation parallel to the gradient of `data`, computed using discrete derivatives of a Gaussian of pixel radius `r`, returning values between -π/2 and π/2. * `GradientOrientationFilter[data, {r, σ}]` uses a Gaussian with standard deviation `σ`. Examples [#examples] ```wolfram GradientOrientationFilter[ExampleData[{"TestImage", "Lena"}], 2] ``` ```wolfram GradientOrientationFilter[image, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GradientOrientationFilter.html) for more details. # GreenFunction `GreenFunction[{ℒ[u[x]], ℬ[u[x]]}, u, {x, xmin, xmax}, y]` gives a Green's function for the linear differential operator ℒ with boundary conditions ℬ in the range xmin to xmax. `GreenFunction[{ℒ[u[x1, x2, ...]], ℬ[u[x1, x2, ...]]}, u, {x1, x2, ...} ∈ Ω, {y1, y2, ...}]` gives a Green's function for the linear partial differential operator ℒ over the region Ω. `GreenFunction[{ℒ[u[x, t]], ℬ[u[x, t]]}, u, {x, xmin, xmax}, t, {y, τ}]` gives a Green's function for the linear time-dependent operator ℒ in the range xmin to xmax. `GreenFunction[{ℒ[u[x1, ..., t]], ℬ[u[x1, ..., t]]}, u, {x1, ...} ∈ Ω, t, {y1, ..., τ}]` gives a Green's function for the linear time-dependent operator ℒ over the region Ω. Examples [#examples] ```wolfram GreenFunction[{y''[x] - y[x], y[0] == 0, y[1] == 0}, y, {x, 0, 1}, s] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreenFunction.html) for more details. # HeatTransferPDEComponent `HeatTransferPDEComponent[vars,pars]` yields a heat transfer PDE term with variables vars and parameters pars. Examples [#examples] Create a heat transfer PDE component: ```wolfram HeatTransferPDEComponent[{T[t, x, y], t, {x, y}}, <|"ThermalConductivity" -> 1|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeatTransferPDEComponent.html) for more details. # HeatTransferValue `HeatTransferValue[pred, vars, pars]` represents a thermal transfer boundary condition for PDEs with predicate `pred` indicating where it applies, with model variables `vars` and global parameters `pars`. * `HeatTransferValue[pred, vars, pars, lkey]` represents a thermal transfer boundary condition with local parameters specified in `pars[lkey]`. Examples [#examples] ```wolfram HeatTransferValue[x == 0, {T, {x}}, <|"AmbientTemperature" -> 300|>] ``` ```wolfram HeatTransferPDEComponent[{T[x, t], t}, {x}, <|"ThermalConductivity" -> 1|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeatTransferValue.html) for more details. # HeavisideLambda `HeavisideLambda[x]` represents the triangle distribution Λ(x) which is nonzero for |x| \< 1. * `HeavisideLambda[x1, x2, …]` represents the multidimensional triangle distribution Λ(x1, x2, …) which is nonzero for |xi| \< 1. Examples [#examples] ```wolfram HeavisideLambda[0.5] ``` ```wolfram Plot[HeavisideLambda[x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeavisideLambda.html) for more details. # HeavisidePi `HeavisidePi[x]` represents the box distribution Π(x), equal to 1 for |x| \< 1/2 and 0 for |x| > 1/2. * `HeavisidePi[x1, x2, ...]` represents the multidimensional box distribution which is 1 if all |xi| \< 1/2. Examples [#examples] ```wolfram HeavisidePi[0.3] ``` ```wolfram Plot[HeavisidePi[x], {x, -1, 1}] ``` ```wolfram HeavisidePi[0.2, 0.3] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeavisidePi.html) for more details. # HeavisideTheta `HeavisideTheta[x]` represents the Heaviside theta function θ(x), equal to 0 for x \< 0 and 1 for x > 0. * `HeavisideTheta[x1, x2, …]` represents the multidimensional Heaviside theta function, which is 1 only if all of the `xi` are positive. Examples [#examples] ```wolfram HeavisideTheta[1] ``` ```wolfram Plot[HeavisideTheta[x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeavisideTheta.html) for more details. # HelmholtzPDEComponent `HelmholtzPDEComponent[vars,pars]` yields a Helmholtz PDE term ∇2\{x1,…,xn}u+k2u with model variables vars and model parameters pars. Examples [#examples] ```wolfram HelmholtzPDEComponent[{u[x, y], {x, y}}, {k}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HelmholtzPDEComponent.html) for more details. # Integrate `Integrate[f, x]` gives the indefinite integral. `Integrate[f, {x, xmin, xmax}]` gives the definite integral. Examples [#examples] Indefinite integral: ```wolfram Integrate[x^2, x] (* x^3/3 *) ``` Definite integral: ```wolfram Integrate[Sin[x], {x, 0, Pi}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Integrate.html) for more details. # IntegrateChangeVariables `IntegrateChangeVariables[integral, u, trans]` changes the variable in integral to the new variable u using the transformation trans. `IntegrateChangeVariables[integral, {u, v, ...}, trans]` changes the variables to the new variables u, v, .... Examples [#examples] ```wolfram IntegrateChangeVariables[Integrate[Sin[x]^2, x], u, u == Sin[x]] ``` ```wolfram IntegrateChangeVariables[Integrate[x^2 Exp[x^3], x], u, u == x^3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegrateChangeVariables.html) for more details. # InverseFourierTransform `InverseFourierTransform[expr, ω, t]` gives the symbolic inverse Fourier transform of expr. Examples [#examples] Inverse transform: ```wolfram InverseFourierTransform[E^(-ω^2/4)/Sqrt[2], ω, t] (* E^(-t^2) *) ``` Round-trip verification: ```wolfram InverseFourierTransform[FourierTransform[f[t], t, ω], ω, t] (* f[t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseFourierTransform.html) for more details. # InverseHankelTransform `InverseHankelTransform[expr, s, r]` gives the inverse Hankel transform of order 0 for expr. * `InverseHankelTransform[expr, s, r, ν]` gives the inverse Hankel transform of order ν for expr. Examples [#examples] Inverse Hankel transform of order 0: ```wolfram InverseHankelTransform[1/(1 + s^2), s, r] ``` With a specific order: ```wolfram InverseHankelTransform[s, s, r, 1] ``` Verify round-trip: ```wolfram f = Exp[-r^2]; InverseHankelTransform[HankelTransform[f, r, s], s, r] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseHankelTransform.html) for more details. # InverseMellinTransform `InverseMellinTransform[expr, s, x]` gives the inverse Mellin transform of expr. Examples [#examples] Inverse Mellin transform of Gamma: ```wolfram InverseMellinTransform[Gamma[s], s, x] (* Exp[-x] *) ``` Round-trip verification: ```wolfram f = Exp[-x]; InverseMellinTransform[MellinTransform[f, x, s], s, x] ``` Transform of a product: ```wolfram InverseMellinTransform[Gamma[s] Gamma[1 - s], s, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseMellinTransform.html) for more details. # InverseZTransform `InverseZTransform[expr, z, n]` gives the inverse Z transform of expr. Examples [#examples] Inverse Z transform: ```wolfram InverseZTransform[z/(z - a), z, n] (* a^n *) ``` Round-trip: ```wolfram InverseZTransform[ZTransform[f[n], n, z], z, n] (* f[n] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseZTransform.html) for more details. # KnapsackSolve `KnapsackSolve[{cost1,cost2,…},maxtotalcost]` solves the knapsack problem of finding the maximum number of items associated with each of the costi, subject to the constraint that the total cost is not larger than maxtotalcost. `KnapsackSolve[{{payoff1,cost1},{payoff2,cost2},…},maxtotalcost]` finds a number of items that maximizes the total payoff, while satisfying the constraint on the total cost. `KnapsackSolve[{{payoff1,cost1,maxcount1},…},maxtotalcost]` allows at most maxcounti copies of item i. `KnapsackSolve[items,{maxtotalpayoff,maxtotalcost}]` finds a result that gives a total payoff not larger than maxtotalpayoff. `KnapsackSolve[items,{maxtotalpayoff,maxtotalcost,maxtotalcount}]` adds the constraint of having no more than maxtotalcount items in total. `KnapsackSolve[<|label1->itemspec1,…|>,maxtotals]` labels each type of item and gives the result as an association. Examples [#examples] ```wolfram KnapsackSolve[{2, 3, 5}, 10] (* {5, 0, 0} *) ``` ```wolfram KnapsackSolve[{{10, 5}, {6, 4}, {3, 2}}, 9] (* {1, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KnapsackSolve.html) for more details. # Laplacian `Laplacian[f, {x1, ..., xn}]` gives the Laplacian ∂²f/∂x1² + ... + ∂²f/∂xn². Examples [#examples] Laplacian of a function: ```wolfram Laplacian[x^2 + y^2 + z^2, {x, y, z}] (* 6 *) ``` 2D Laplacian: ```wolfram Laplacian[Sin[x] Cos[y], {x, y}] (* -2 Cos[y] Sin[x] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Laplacian.html) for more details. # LaplacianFilter `LaplacianFilter[data, r]` convolves data with a radius-r Laplacian kernel. * `LaplacianFilter[data, {r1, r2, ...}]` uses radius ri at level i in data. Examples [#examples] ```wolfram LaplacianFilter[ExampleData[{"TestImage", "Lena"}], 2] ``` ```wolfram LaplacianFilter[{1, 2, 5, 2, 1}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LaplacianFilter.html) for more details. # LaplacianGaussianFilter `LaplacianGaussianFilter[data, r]` convolves data with a Laplacian of Gaussian kernel of pixel radius r. * `LaplacianGaussianFilter[data, {r, σ}]` convolves data with a Laplacian of Gaussian kernel of radius r and standard deviation σ. Examples [#examples] Apply Laplacian of Gaussian filter to an image: ```wolfram LaplacianGaussianFilter[ExampleData[{"TestImage", "Lena"}], 2] ``` Edge detection with custom radius: ```wolfram LaplacianGaussianFilter[ExampleData[{"TestImage", "Mandrill"}], 5] ``` Specify radius and standard deviation: ```wolfram LaplacianGaussianFilter[ExampleData[{"TestImage", "Peppers"}], {3, 1.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LaplacianGaussianFilter.html) for more details. # LaplacianPDETerm `LaplacianPDETerm[vars]` represents a Laplacian term ∇²u with model variables vars. `LaplacianPDETerm[vars, pars]` uses model parameters pars. Examples [#examples] ```wolfram LaplacianPDETerm[{u[x, y], {x, y}}] (* LaplacianPDETerm[{u[x, y], {x, y}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LaplacianPDETerm.html) for more details. # Limit `Limit[f, x -> x0]` gives the limit of f as x approaches x0. Examples [#examples] Limit at a point: ```wolfram Limit[Sin[x]/x, x -> 0] (* 1 *) ``` Limit at infinity: ```wolfram Limit[1/x, x -> Infinity] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Limit.html) for more details. # LineIntegrate `LineIntegrate[f, {x, y, ...} ∈ curve]` computes the scalar line integral of the function f\[x, y, ...] over the curve. * `LineIntegrate[{p, q, ...}, {x, y, ...} ∈ curve]` computes the vector line integral of the vector function \{p\[x, y, ...], q\[x, y, ...], ...}. Examples [#examples] ```wolfram LineIntegrate[x^2 + y^2, {x, y} ∈ Circle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LineIntegrate.html) for more details. # LinearFractionalOptimization `LinearFractionalOptimization[f, cons, vars]` finds values of variables vars that minimize the linear fractional objective f subject to linear constraints cons. * `LinearFractionalOptimization[{α, β, γ, δ}, {a, b}]` finds a vector x that minimizes the linear fractional function (α.x+β)/(γ.x+δ) subject to the linear inequality constraints a.x+b⪰0. * `LinearFractionalOptimization[{α, β, γ, δ}, {a, b}, {aeq, beq}]` includes the linear equality constraints aeq.x+beq=0. * `LinearFractionalOptimization[{α, β, γ, δ}, ..., {dom1, dom2, ...}]` takes xi to be in the domain domi, where domi is Integers or Reals. * `LinearFractionalOptimization[..., "prop"]` specifies what solution property "prop" should be returned. Examples [#examples] Minimize a linear fractional function: ```wolfram LinearFractionalOptimization[(x + 1)/(2 x + 3), {x >= 0, x <= 10}, {x}] ``` With matrix constraints: ```wolfram LinearFractionalOptimization[{c1, d1, c2, d2}, {A, b}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearFractionalOptimization.html) for more details. # LinearFractionalTransform `LinearFractionalTransform[m]` gives a TransformationFunction that represents a linear fractional transformation defined by the homogeneous matrix m. * `LinearFractionalTransform[{a, b, c, d}]` represents a linear fractional transformation that maps r to (a.r+b)/(c.r+d). Examples [#examples] Simple transformation: ```wolfram LinearFractionalTransform[{{1, 2}, {0, 1}}][x] ``` Möbius transformation: ```wolfram LinearFractionalTransform[{1, 0, 1, 1}][z] (* z/(z + 1) *) ``` Apply to a point: ```wolfram LinearFractionalTransform[{{2, 1}, {1, 1}}][{3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearFractionalTransform.html) for more details. # LinearModelFit `LinearModelFit[data, {f1, f2, ...}, x]` creates a linear regression model with statistical analysis. Examples [#examples] Perform linear regression: ```wolfram data = {{1, 2.1}, {2, 3.9}, {3, 6.2}, {4, 7.8}} lm = LinearModelFit[data, {1, x}, x] (* Get the fitted function *) lm["BestFit"] (* 0.1 + 1.98 x *) (* R-squared *) lm["RSquared"] (* 0.9973 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearModelFit.html) for more details. # LinearProgramming `LinearProgramming[c, m, b]` finds a vector x that minimizes the quantity c.x subject to the constraints m.x ≥ b and x ≥ 0. `LinearProgramming[c, m, {{b1, s1}, {b2, s2}, ...}]` finds x that minimizes c.x subject to constraints where s\_i = 1 means ≥, s\_i = 0 means =, and s\_i = -1 means ≤. Examples [#examples] Simple linear program: ```wolfram LinearProgramming[{1, 1}, {{1, 0}, {0, 1}}, {2, 3}] (* {2, 3} *) ``` With equality constraint: ```wolfram LinearProgramming[{-1, -1}, {{1, 1}}, {{5, 0}}] (* {5, 0} or equivalent *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearProgramming.html) for more details. # ListZTransform `ListZTransform[list, z]` gives the Z transform of list as a function of z. * `ListZTransform[list, z, k]` places the first element of list at integer time k on the infinite time axis. * `ListZTransform[list, {z1, z2, ...}, {k1, k2, ...}]` gives the multidimensional Z transform. Examples [#examples] ```wolfram ListZTransform[{1, 2, 3, 4}, z] ``` ```wolfram ListZTransform[{a, b, c}, z, 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListZTransform.html) for more details. # MassTransportPDEComponent `MassTransportPDEComponent[vars, pars]` yields a mass transport PDE term with variables vars and parameters pars. This is used for modeling mass transport in partial differential equations. Examples [#examples] ```wolfram MassTransportPDEComponent[{c[x, t], {x}}, {D, v}] ``` ```wolfram MassTransportPDEComponent[{u[x, y, t], {x, y}}, params] ``` ```wolfram pde = MassTransportPDEComponent[vars, {diffusion, velocity}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MassTransportPDEComponent.html) for more details. # MellinConvolve `MellinConvolve[f, g, x, y]` gives the Mellin convolution with respect to x of the expressions f and g. * `MellinConvolve[f, g, {x1, x2, ...}, {y1, y2, ...}]` gives the multidimensional Mellin convolution. Examples [#examples] ```wolfram MellinConvolve[Exp[-x], Exp[-x], x, y] ``` ```wolfram MellinConvolve[x^2, x^3, x, y] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MellinConvolve.html) for more details. # MellinTransform `MellinTransform[expr, x, s]` gives the Mellin transform of expr. * `MellinTransform[expr, {x1, x2, ...}, {s1, s2, ...}]` gives the multidimensional Mellin transform of expr. Examples [#examples] Mellin transform of a simple function: ```wolfram MellinTransform[Exp[-x], x, s] (* Gamma[s] *) ``` Transform of power function: ```wolfram MellinTransform[x^a Exp[-x], x, s] ``` Multidimensional transform: ```wolfram MellinTransform[Exp[-x - y], {x, y}, {s, t}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MellinTransform.html) for more details. # NeumannValue `NeumannValue[val, pred]` represents a Neumann boundary value val, specified on the part of the boundary of the region given to `NDSolve` and related functions where pred is True. Examples [#examples] ```wolfram NDSolve[{Laplacian[u[x, y], {x, y}] == 0, NeumannValue[1, x == 0], DirichletCondition[u[x, y] == 0, x == 1]}, u, {x, 0, 1}, {y, 0, 1}] ``` ```wolfram NeumannValue[0, y == 0 || y == 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NeumannValue.html) for more details. # O `O[x]^n` represents a term of order x^n in power series, indicating omitted higher-order terms. Examples [#examples] In series expansion: ```wolfram Series[Sin[x], {x, 0, 3}] (* x - x^3/6 + O[x]^4 *) ``` Remove O terms with Normal: ```wolfram Normal[Series[Exp[x], {x, 0, 3}]] (* 1 + x + x^2/2 + x^3/6 *) ``` Arithmetic with O: ```wolfram (1 + O[x]^2) * (x + O[x]^3) (* x + O[x]^2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/O.html) for more details. # ParametricConvexOptimization `ParametricConvexOptimization[f, cons, vars, pars]` gives a ParametricFunction object that finds values of variables vars that minimize the convex objective function f subject to convex constraints cons with parameters pars. * `ParametricConvexOptimization[..., "prop"]` specifies what solution property "prop" should be returned by the ParametricFunction object. Examples [#examples] Create a parametric optimizer: ```wolfram pf = ParametricConvexOptimization[x^2 + p x, {x >= 0}, {x}, {p}]; pf[2] ``` Get minimum value: ```wolfram ParametricConvexOptimization[obj, cons, vars, pars, "PrimalMinimumValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricConvexOptimization.html) for more details. # ParametricNDSolve `ParametricNDSolve[eqns, u, {x, xmin, xmax}, pars]` finds a numerical solution to the ordinary differential equations eqns for the function u with the independent variable x in the range xmin to xmax with parameters pars. * `ParametricNDSolve[eqns, u, {x, xmin, xmax}, {y, ymin, ymax}, pars]` solves the partial differential equations eqns over a rectangular region. * `ParametricNDSolve[eqns, u, {x, y} ∈ Ω, pars]` solves the partial differential equations eqns over the region Ω. * `ParametricNDSolve[eqns, {u1, u2, ...}, ...]` solves for the functions ui. Examples [#examples] Solve an ODE with a parameter: ```wolfram sol = ParametricNDSolve[{y'[x] == a y[x], y[0] == 1}, y, {x, 0, 1}, {a}]; Plot[Evaluate[Table[y[a][x] /. sol, {a, {-1, 0, 1, 2}}]], {x, 0, 1}] ``` Access the parametric solution: ```wolfram y[2][0.5] /. sol ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricNDSolve.html) for more details. # ParametricNDSolveValue `ParametricNDSolveValue[eqns,expr,{x,xmin,xmax},pars]` gives the value of expr with functions determined by a numerical solution to the ordinary differential equations eqns with the independent variable x in the range xmin to xmax with parameters pars. `ParametricNDSolveValue[eqns,expr,{x,xmin,xmax},{y,ymin,ymax},pars]` solves the partial differential equations eqns over a rectangular region. `ParametricNDSolveValue[eqns,expr,{x,y}∈Ω,pars]` solves the partial differential equations eqns over the region Ω. `ParametricNDSolveValue[eqns,expr,{t,tmin,tmax},{x,y}∈Ω,pars]` solves the time-dependent partial differential equations eqns over the region Ω. Examples [#examples] Solve an ODE with a parameter: ```wolfram f = ParametricNDSolveValue[{y'[x] == a y[x], y[0] == 1}, y, {x, 0, 10}, {a}]; Plot[f[-0.5][x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricNDSolveValue.html) for more details. # Perimeter `Perimeter[reg]` gives the perimeter of the two-dimensional region reg. `Perimeter[{x1,x2},{s,smin,smax},{t,tmin,tmax}]` gives the perimeter of the parametrized region whose Cartesian coordinates xi are functions of s and t. `Perimeter[{x1,x2},{s,smin,smax},{t,tmin,tmax},chart]` interprets the xi as coordinates in the specified coordinate chart. Examples [#examples] Compute the perimeter of a disk: ```wolfram Perimeter[Disk[]] (* 2 Pi *) ``` Compute the perimeter of a rectangle: ```wolfram Perimeter[Rectangle[{0, 0}, {3, 4}]] (* 14 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Perimeter.html) for more details. # PeriodicBoundaryCondition `PeriodicBoundaryCondition[u[x1, ...], pred, f]` represents a periodic boundary condition u(xtarget) = u(f(xtarget)) for all xtarget on the boundary of the region given to NDSolve where pred is True. * `PeriodicBoundaryCondition[a + b u[x1, ...], pred, f]` represents a generalized periodic boundary condition a + b u(xtarget) = u(f(xtarget)). Examples [#examples] Solve a PDE with periodic boundary conditions on a square: ```wolfram NDSolveValue[{ Laplacian[u[x, y], {x, y}] == 1, PeriodicBoundaryCondition[u[x, y], x == 1, Function[{x, y}, {x - 1, y}]], DirichletCondition[u[x, y] == 0, y == 0 || y == 1] }, u, {x, y} \[Element] Rectangle[]] ``` Periodic boundary on both sides: ```wolfram PeriodicBoundaryCondition[u[x], x == L, TranslationTransform[{-L}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PeriodicBoundaryCondition.html) for more details. # Product `Product[f, {i, imin, imax}]` evaluates the product of f as i ranges from imin to imax. Examples [#examples] Factorial as a product: ```wolfram Product[i, {i, 1, 5}] (* 120 *) ``` Symbolic product: ```wolfram Product[x + i, {i, 0, 3}] (* x (1 + x) (2 + x) (3 + x) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Product.html) for more details. # ProductDistribution `ProductDistribution[dist1,dist2,…]` represents the joint distribution with independent component distributions dist1, dist2, …. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProductDistribution.html) for more details. # QuadraticOptimization `QuadraticOptimization[f, cons, vars]` finds values of variables vars that minimize the quadratic objective f subject to linear constraints cons. * `QuadraticOptimization[{q, c}, {a, b}]` finds a vector x that minimizes the quadratic objective ½x.q.x + c.x subject to the linear inequality constraints a.x + b ≥ 0. * `QuadraticOptimization[{q, c}, {a, b}, {aeq, beq}]` includes the linear equality constraints aeq.x + beq = 0. * `QuadraticOptimization[{q, c}, ..., {dom1, dom2, ...}]` takes xi to be in the domain domi, where domi is `Integers` or `Reals`. * `QuadraticOptimization[..., "prop"]` specifies what solution property "prop" should be returned. Examples [#examples] ```wolfram QuadraticOptimization[x^2 + y^2, {x + y >= 1}, {x, y}] ``` ```wolfram QuadraticOptimization[(x - 1)^2 + (y - 2)^2, {x >= 0, y >= 0}, {x, y}] ``` ```wolfram QuadraticOptimization[{{{2, 0}, {0, 2}}, {-1, -1}}, {{{1, 1}}, {-1}}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuadraticOptimization.html) for more details. # RSolve `RSolve[eqn, a[n], n]` solves a recurrence equation for a\[n]. `RSolve[{eqn1, eqn2, ...}, {a1[n], a2[n], ...}, n]` solves a system of recurrence equations. `RSolve[eqn, a[n1, n2, ...], {n1, n2, ...}]` solves a partial recurrence equation. Examples [#examples] Solve a simple recurrence: ```wolfram RSolve[a[n] == 2 a[n - 1], a[n], n] (* {{a[n] -> 2^n C[1]}} *) ``` Solve with initial condition: ```wolfram RSolve[{a[n] == a[n - 1] + 1, a[0] == 0}, a[n], n] (* {{a[n] -> n}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RSolve.html) for more details. # RSolveValue `RSolveValue[eqn,expr,n]` gives the value of expr determined by a symbolic solution to the ordinary difference equation eqn with independent variable n. `RSolveValue[{eqn1,eqn2,…},expr,…]` uses a symbolic solution for a list of difference equations. `RSolveValue[eqn,expr,{n1,n2,…}]` uses a solution for the partial recurrence equation eqn. Examples [#examples] Solve a recurrence relation: ```wolfram RSolveValue[{a[n] == a[n - 1] + a[n - 2], a[0] == 1, a[1] == 1}, a[n], n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RSolveValue.html) for more details. # ReactionBalance `ReactionBalance[rxn]` returns a version of the reaction rxn in which the stoichiometric coefficients for elements in the reactants and products are balanced. Examples [#examples] ```wolfram ReactionBalance["H2 + O2 -> H2O"] ``` ```wolfram ReactionBalance["Fe + O2 -> Fe2O3"] ``` ```wolfram ReactionBalance["C6H12O6 + O2 -> CO2 + H2O"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReactionBalance.html) for more details. # ReactionBalancedQ `ReactionBalancedQ[rxn]` returns True if the given chemical reaction is balanced, and False otherwise. Examples [#examples] ```wolfram ReactionBalancedQ["2H2 + O2 -> 2H2O"] ``` ```wolfram ReactionBalancedQ[Molecule["CH4"] + Molecule["O2"] -> Molecule["CO2"] + Molecule["H2O"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReactionBalancedQ.html) for more details. # ReactionPDETerm `ReactionPDETerm[vars, a]` represents a reaction term a u with reaction coefficient a and with model variables vars. `ReactionPDETerm[{u, {x1, …, xn}}, a, pars]` uses model parameters pars. Examples [#examples] Create a reaction term: ```wolfram ReactionPDETerm[{u[t, x], {t, x}}, k] ``` Use in a PDE system: ```wolfram eq = ReactionPDETerm[{c[t, x], {t, x}}, -k c[t, x]]; NDSolve[{eq == 0, c[0, x] == Exp[-x^2]}, c, {t, 0, 1}, {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReactionPDETerm.html) for more details. # RecurrenceTable `RecurrenceTable[eqns, expr, {n, nmax}]` generates a list of values of expr for successive n based on solving the recurrence equations eqns. `RecurrenceTable[eqns, expr, nspec]` generates a list of values of expr over the range of n values specified by nspec. `RecurrenceTable[eqns, expr, {n1, ...}, {n2, ...}, ...]` generates an array of values of expr for successive n1, n2, ... . Examples [#examples] Generate the first 10 Fibonacci numbers: ```wolfram RecurrenceTable[{a[n] == a[n - 1] + a[n - 2], a[1] == 1, a[2] == 1}, a[n], {n, 1, 10}] (* {1, 1, 2, 3, 5, 8, 13, 21, 34, 55} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RecurrenceTable.html) for more details. # Residue `Residue[expr, {z, z0}]` finds the residue of expr at the point z = z0. Examples [#examples] Find the residue of a simple pole: ```wolfram Residue[1/z, {z, 0}] (* 1 *) ``` Residue at a higher-order pole: ```wolfram Residue[1/z^3, {z, 0}] (* 0 *) Residue[1/(z - 1)^2, {z, 1}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Residue.html) for more details. # ResidueSum `ResidueSum[f, z]` finds the sum of residues of the meromorphic function f with the variable z. * `ResidueSum[{f, cons}, z]` finds the sum of residues of f within the solution set of the constraints cons. Examples [#examples] Sum of all residues: ```wolfram ResidueSum[1/(z^2 - 1), z] (* 0 *) ``` With constraints: ```wolfram ResidueSum[{1/z, Im[z] > 0}, z] ``` For a rational function: ```wolfram ResidueSum[1/((z - 1)(z - 2)), z] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ResidueSum.html) for more details. # RobustConvexOptimization `RobustConvexOptimization[f, ForAll[pars, pcons, vcons], vars]` finds values of vars that give the minimum value of f for vars that satisfy the constraints vcons for all possible values of the parameters pars that satisfy the parametric constraints pcons. * `RobustConvexOptimization[..., "prop"]` specifies what solution property "prop" should be returned. This function solves optimization problems with uncertainty in parameters. Examples [#examples] ```wolfram RobustConvexOptimization[x + y, ForAll[{a}, -1 <= a <= 1, x + a*y >= 1], {x, y}] ``` ```wolfram RobustConvexOptimization[x, ForAll[{p}, Abs[p] <= 1, x + p >= 0], {x}] ``` ```wolfram RobustConvexOptimization[x^2 + y^2, ForAll[{a, b}, a^2 + b^2 <= 1, a*x + b*y <= 1], {x, y}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RobustConvexOptimization.html) for more details. # SchrodingerPDEComponent `SchrodingerPDEComponent[vars, pars]` yields a Schrödinger PDE term with model variables vars and model parameters pars. Examples [#examples] Schrödinger equation component: ```wolfram SchrodingerPDEComponent[{ψ[x, t], t}, {x}] ``` Time-independent Schrödinger equation: ```wolfram SchrodingerPDEComponent[{ψ, x}, <|"Mass" -> 1, "PlanckConstant" -> 1|>] ``` In NDSolve: ```wolfram NDSolve[{SchrodingerPDEComponent[{u[x, t], t}, {x}] == 0, u[x, 0] == Exp[-x^2]}, u, {x, -5, 5}, {t, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SchrodingerPDEComponent.html) for more details. # Series `Series[f, {x, x0, n}]` generates a power series expansion for f about the point x=x0 to order n. Examples [#examples] Taylor series of Sin: ```wolfram Series[Sin[x], {x, 0, 5}] (* x - x^3/6 + x^5/120 + O[x]^6 *) ``` Series of Exp: ```wolfram Series[Exp[x], {x, 0, 4}] (* 1 + x + x^2/2 + x^3/6 + x^4/24 + O[x]^5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Series.html) for more details. # SeriesCoefficient `SeriesCoefficient[series, n]` finds the coefficient of the nth-order term in a power series in the form generated by Series. `SeriesCoefficient[f, {x, x0, n}]` finds the coefficient of (x-x0)^n in the expansion of f about the point x=x0. Examples [#examples] Coefficient from a series: ```wolfram SeriesCoefficient[Series[Sin[x], {x, 0, 5}], 3] (* -1/6 *) ``` Direct computation: ```wolfram SeriesCoefficient[Exp[x], {x, 0, 4}] (* 1/24 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SeriesCoefficient.html) for more details. # SeriesData `SeriesData[x, x0, {a0, a1, ...}, nmin, nmax, den]` represents a power series in the variable x about the point x0. The ai are the coefficients in the power series. Examples [#examples] Construct a series manually: ```wolfram SeriesData[x, 0, {1, 1, 1/2, 1/6}, 0, 4, 1] (* 1 + x + x^2/2 + x^3/6 + O[x]^4 *) ``` Extract series data: ```wolfram s = Series[Sin[x], {x, 0, 3}]; SeriesData[s] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SeriesData.html) for more details. # SolidMechanicsPDEComponent `SolidMechanicsPDEComponent[vars,pars]` yields solid mechanics PDE terms with variables vars and parameters pars. Examples [#examples] ```wolfram SolidMechanicsPDEComponent[{u[x, y], {x, y}}, <|"YoungsModulus" -> 1, "PoissonRatio" -> 0.3|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolidMechanicsPDEComponent.html) for more details. # SolidMechanicsStrain `SolidMechanicsStrain[vars, pars, displ]` yields a solid mechanics total strain with variables vars, parameters pars, and displacements displ. Examples [#examples] ```wolfram SolidMechanicsStrain[{x, y}, <||>, {u[x, y], v[x, y]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolidMechanicsStrain.html) for more details. # SolidMechanicsStress `SolidMechanicsStress[vars, pars, strain]` yields solid mechanics internal stress with variables vars, parameters pars and total strain strain. * `SolidMechanicsStress[vars, pars, strain, displacement]` yields solid mechanics stress for nonlinear material laws. Examples [#examples] Compute stress: ```wolfram SolidMechanicsStress[{u[x, y], v[x, y]}, <|"YoungModulus" -> 200*^9, "PoissonRatio" -> 0.3|>, strain] ``` Linear elastic material: ```wolfram vars = {u, {x, y}}; pars = <|"YoungModulus" -> 1, "PoissonRatio" -> 0.25|>; SolidMechanicsStress[vars, pars, Automatic] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolidMechanicsStress.html) for more details. # SourcePDETerm `SourcePDETerm[vars, f]` represents a source term f with source coefficient f and model variables vars. * `SourcePDETerm[vars, f, pars]` uses model parameters pars. Examples [#examples] Create a simple source term: ```wolfram SourcePDETerm[{u[x, y], {x, y}}, 1] ``` Use a source term in a PDE system: ```wolfram op = SourcePDETerm[{u[x, y], {x, y}}, x^2 + y^2]; NDSolveValue[{op == 0, DirichletCondition[u[x, y] == 0, True]}, u, {x, y} \[Element] Disk[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SourcePDETerm.html) for more details. # SpherePoints `SpherePoints[n]` gives the positions of n uniformly distributed points on the surface of a unit sphere. This function generates approximately evenly spaced points on a sphere. Examples [#examples] ```wolfram SpherePoints[10] ``` ```wolfram Graphics3D[Point[SpherePoints[100]]] ``` ```wolfram ListPointPlot3D[SpherePoints[50]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpherePoints.html) for more details. # Sum `Sum[f, {i, imax}]` evaluates the sum from i=1 to imax. `Sum[f, {i, imin, imax}]` starts with i=imin. `Sum[f, {i, imin, imax, di}]` uses steps di. Examples [#examples] Sum of integers: ```wolfram Sum[i, {i, 1, 10}] (* 55 *) ``` Sum of squares: ```wolfram Sum[i^2, {i, 1, 5}] (* 55 *) ``` Symbolic sum: ```wolfram Sum[i, {i, 1, n}] (* n(n+1)/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sum.html) for more details. # SumConvergence `SumConvergence[f,n]` gives conditions for the sum ∑f to be convergent. `SumConvergence[f,{n1,n2,…}]` gives conditions for the multiple sum to be convergent. `SumConvergence[f,{n,a,∞}]` gives conditions for the sum to be convergent on the interval \[a,∞). `SumConvergence[f,{n,a,∞},…,{m,b,∞}]` gives conditions for the multiple sum to be convergent. Examples [#examples] Test convergence of 1/n^2: ```wolfram SumConvergence[1/n^2, n] (* True *) ``` Test convergence with a parameter: ```wolfram SumConvergence[1/n^p, n] (* p > 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SumConvergence.html) for more details. # SummationLayer `SummationLayer[]` represents a net layer that sums all of its input elements. Examples [#examples] ```wolfram SummationLayer[] ``` ```wolfram SummationLayer[][{1, 2, 3, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SummationLayer.html) for more details. # SurfaceArea `SurfaceArea[reg]` gives the surface area of the three-dimensional region reg. * `SurfaceArea[{x1, ..., xn}, {s, smin, smax}, {t, tmin, tmax}, {u, umin, umax}]` gives the surface area of the parametrized region whose Cartesian coordinates xi are functions of s, t, u. * `SurfaceArea[{x1, ..., xn}, {s, smin, smax}, {t, tmin, tmax}, {u, umin, umax}, chart]` interprets the xi as coordinates in the specified coordinate chart. Examples [#examples] ```wolfram SurfaceArea[Sphere[]] ``` ```wolfram SurfaceArea[Cylinder[{{0, 0, 0}, {0, 0, 1}}, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurfaceArea.html) for more details. # SurfaceIntegrate `SurfaceIntegrate[f, {x, y, ...} ∈ surface]` computes the scalar surface integral of the function f\[x, y, ...] over the surface. * `SurfaceIntegrate[{p, q, ...}, {x, y, ...} ∈ surface]` computes the vector surface integral of the vector field \{p\[x, y, ...], q\[x, y, ...], ...}. Examples [#examples] Surface area of a sphere: ```wolfram SurfaceIntegrate[1, {x, y, z} ∈ Sphere[]] (* 4 π *) ``` Flux through a hemisphere: ```wolfram SurfaceIntegrate[{x, y, z}, {x, y, z} ∈ ImplicitRegion[x^2 + y^2 + z^2 == 1 && z >= 0, {x, y, z}]] ``` Integrate a scalar field over a surface: ```wolfram SurfaceIntegrate[x^2, {x, y, z} ∈ Sphere[{0, 0, 0}, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurfaceIntegrate.html) for more details. # ToPolarCoordinates `ToPolarCoordinates[{x, y}]` gives the \{r, θ} polar coordinates corresponding to the Cartesian coordinates \{x, y}. * `ToPolarCoordinates[{x1, x2, …, xn}]` gives the hyperspherical coordinates corresponding to the Cartesian coordinates \{x1, x2, …, xn}. Examples [#examples] ```wolfram ToPolarCoordinates[{1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToPolarCoordinates.html) for more details. # ToRadicals `ToRadicals[expr]` attempts to express all Root objects in expr in terms of radicals. Examples [#examples] Convert roots to radicals: ```wolfram ToRadicals[Root[#^2 - 2 &, 1]] (* -Sqrt[2] *) ``` Solve and convert: ```wolfram ToRadicals[Solve[x^3 - 2 == 0, x]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToRadicals.html) for more details. # ToSphericalCoordinates `ToSphericalCoordinates[{x, y, z}]` gives the \{r, θ, ϕ} spherical coordinates corresponding to the Cartesian coordinates \{x, y, z}. Examples [#examples] ```wolfram ToSphericalCoordinates[{1, 1, 1}] ``` ```wolfram ToSphericalCoordinates[{0, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToSphericalCoordinates.html) for more details. # UnilateralConvolve `UnilateralConvolve[f, g, u, t]` gives the unilateral convolution with respect to u of the expressions f and g. `UnilateralConvolve[f, g, {u1, ..., un}, {t1, ..., tn}]` gives the multidimensional unilateral convolution. Examples [#examples] Convolve two functions: ```wolfram UnilateralConvolve[Exp[-a u], Exp[-b u], u, t] (* (E^(-b t) - E^(-a t))/(a - b) *) ``` Convolve with unit step: ```wolfram UnilateralConvolve[1, Sin[u], u, t] (* 1 - Cos[t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnilateralConvolve.html) for more details. # UnitStep `UnitStep[x]` represents the unit step function, equal to `0` for x \< 0 and `1` for x ≥ 0. `UnitStep[x1, x2, ...]` is 1 only if none of the xi are negative. Examples [#examples] Evaluate the unit step: ```wolfram UnitStep[-1] (* 0 *) UnitStep[0] (* 1 *) UnitStep[5] (* 1 *) ``` Plot the unit step function: ```wolfram Plot[UnitStep[x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitStep.html) for more details. # UnitTriangle `UnitTriangle[x]` represents the unit triangle function on the interval |x| ≤ 1. `UnitTriangle[x1,x2,…]` represents the multidimensional unit triangle function on the interval |xi| ≤ 1. Examples [#examples] Evaluate the unit triangle function: ```wolfram UnitTriangle[0.5] (* 0.5 *) ``` Plot the unit triangle: ```wolfram Plot[UnitTriangle[x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitTriangle.html) for more details. # Volume `Volume[reg]` gives the volume of a three-dimensional region. Examples [#examples] Volume of a ball: ```wolfram Volume[Ball[{0, 0, 0}, r]] (* (4 Pi r^3)/3 *) ``` Volume of a cylinder: ```wolfram Volume[Cylinder[{{0, 0, 0}, {0, 0, 1}}, 1]] (* Pi *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Volume.html) for more details. # WavePDEComponent `WavePDEComponent[vars, pars]` yields a wave equation PDE term ∂²u/∂t² - c²∇²u with model variables vars and model parameters pars. Examples [#examples] ```wolfram WavePDEComponent[{u[t, x, y], t, {x, y}}, {{"WaveSpeed" -> 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WavePDEComponent.html) for more details. # WienerFilter `WienerFilter[data,r]` removes noise from data by applying a range-r Wiener filter. `WienerFilter[data,r,ns]` assumes an additive noise power value ns. `WienerFilter[data,{r1,r2,…},…]` uses radius ri at level i in data. Examples [#examples] Apply a Wiener filter to noisy data: ```wolfram data = Table[Sin[x] + RandomReal[{-0.2, 0.2}], {x, 0, 10, 0.1}]; WienerFilter[data, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WienerFilter.html) for more details. # ZTransform `ZTransform[expr, n, z]` gives the Z transform of expr. Examples [#examples] Z transform of a sequence: ```wolfram ZTransform[a^n, n, z] (* z/(z - a) *) ``` Unit step: ```wolfram ZTransform[UnitStep[n], n, z] (* z/(z - 1) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ZTransform.html) for more details. # Architecture <img alt="" src={__img0} placeholder="blur" /> WLJS Notebook is an application built on top of the Wolfram Engine (a freeware distribution of Wolfram Language) with a web-based GUI. Naturally, we isolate evaluation to a separate process of the Wolfram Engine, similar to Mathematica or Jupyter. Both can directly interact with the content rendered on the page directly for the sake of performance and low-latency. GUI [#gui] We use a superset of Wolfram Language and HTML—[WLX](./../Cell-types/WLX)—to build app components (similar to JSX) and the entire GUI. Together with a small UI framework, it allows seamless integration of JS with WL, which is why we do not explicitly separate backend and frontend parts in the architecture. The state is not stored on the client; all UI updates are performed by the main Wolfram Engine process. Notebooks [#notebooks] The notebook interface is simply a separate view-component of the app that loads a notebook file, renders it, and evaluates its cells using specialized evaluators. The evaluator to use is determined by the cell type via special patterns at the beginning of the cell content. Evaluators vary significantly, from [JavaScript](./../Cell-types/Javascript) cells that do not involve the Wolfram Kernel to [Slides](./../Cell-types/Slide) and [Wolfram Language](./../Cell-types/Wolfram-Language) input cells. All notebooks are stored as associations, with input/output expressions presented as plain strings, that the main kernel (server) does not interpret a cell's content. WLJS Interpreter [#wljs-interpreter] A key component of WLJS Notebook is its deep integration with JavaScript. Unlike most notebook solutions, we do not convert cell content into a special format before rendering it on the page. To display a graph, code, or button, we send the Wolfram Expression directly to the browser and let JavaScript interpret it in place. To enable this, we implemented a compact (\~3 kB) JavaScript-based WL interpreter called the *WLJS Interpreter*. In fact, our API also relies on Wolfram Expressions—handling all dynamics, graphics, sound, and even GUI management through the WLJS Interpreter. There is a 1:1 correspondence between most JavaScript objects and Wolfram Expressions. Communication [#communication] We use as much SSR (Server-Side Rendering) as possible via a basic HTTP channel. The *main kernel* establishes a WebSocket connection to provide interactivity and avoid long polling. Each *evaluation kernel* (limited to one by the freeware license) has its own dedicated WebSocket connection to the page. This approach ensures optimal performance for dynamic evaluations involving real-time video streaming or updating $10^6$ polygons in a 3D plot. We use a binary protocol instead of a text-based one to update data within expressions. Wolfram Paclets [#wolfram-paclets] Despite differences between Mathematica and WLJS Notebook, both share the same Wolfram Language with its standard library set. Consequently, we support standard WL packages in any form. Extensions (Plugins) [#extensions-plugins] Extensions or plugins are a significant part of WLJS Notebook and are supersets of Wolfram Paclets. They function as composite packages, which may include: * Features for the main kernel * Features for the evaluation kernel * JavaScript libraries * UI elements for the notebook interface * Implementations of new cell types Each package has its own context name, which can be required by other extensions. WLJS Notebook is split into more than ten such modules. # Expression rendering The WLJS Notebook integrates a wide range of Web APIs to maximize performance and render complex, decorated Wolfram expressions—including nested elements such as: * SVG graphics * Canvas * WebGL shaders * Basic HTML elements Here are a few examples showing how we compose these elements to render Wolfram expressions: ```wolfram Plot[{x, x^2}, {x, 0, 1}, PlotLegends -> Automatic] ``` <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div> In this example, we have a typical scenario where SVG graphics are overlaid with an HTML element inset—specifically, a `SwatchLegend`. The `CodeMirror` elements represent truncated versions of the code editor found in every input cell. While this might seem excessive, we use this setup only when the expression is not plain text and it is unclear how to render it. This universal approach allows us to embed full expressions, including nested plots, within other plots and more. ```wolfram Legended[ Grid[Partition[ Table[If[PrimeQ[n], Item[n, Background -> LightBlue], n], {n, 100}], 10], Frame -> All], SwatchLegend[{LightBlue}, {"prime numbers"}]] ``` <div className="invertColor"> <img alt="" src={__img1} placeholder="blur" /> </div> In this example, we render a grid of 100 editors, where all *prime* number cells have a different background color. Most importantly, this matrix remains a fully **editable expression**. You can copy and paste it into other cells without issues, even in `wolframscript`. WLJS Notebook treats `StandardForm` as a decorated version of `InputForm`, making it compatible with other editors outside the Wolfram ecosystem. ```wolfram ContourPlot[Cos[x] + Sin[y], {x,0,4Pi}, {y, 0, 4Pi}, PlotLegends->Automatic] ``` <div className="invertColor"> <img alt="" src={__img2} placeholder="blur" /> </div> This is one of our favorite examples. SVG graphics are not ideal for rendering shaded triangles generated by `Polygon` elements within a `GraphicsComplex`. To address performance issues, we developed a custom WebGL renderer. It renders all *heavy* graphics using low-level GPU calls into a static image, which is then embedded inside an SVG element and overlaid with elements that are tricky to render correctly—such as lines. > Line rendering in WebGL is particularly problematic. On some platforms, you can't change line thickness—unless you render them using triangles, but that's another story. Here is another example: a complex canvas of `Inset` inside `Graphics` inside other `Inset`, which is typically the case when you need to assemble multiple figures (5) into 1 using another `Graphics`: <div className="invertColor"> <img alt="" src={__img3} placeholder="blur" /> </div> # HTTP API Overview [#overview] The HTTP API provides a programmatic interface to interact with the Wolfram notebook application. It allows external clients to manage notebooks, cells, evaluate code, and query the kernel without direct user interaction. The API uses **HTTP POST requests with JSON payloads** for all operations. Responses are returned as JSON with appropriate HTTP status codes: * **200** - Success * **409** - Failure (returned with error message) Response Format [#response-format] All responses follow this structure: **Success Response:** ```json { "Body": <response-data>, "Code": 200, "Headers": { "Content-Length": <length>, "Connection": "Keep-Alive", "Keep-Alive": "timeout=5, max=1000", "Access-Control-Allow-Origin": "*" } } ``` **Error Response:** ```json { "Body": <error-message>, "Code": 409, "Headers": { ... } } ``` Asynchronous Operations [#asynchronous-operations] Some operations (like notebook evaluation and kernel execution) are asynchronous and return a **Promise ID** instead of immediate results. Use the `/api/promise/` endpoint to poll for completion. *** API Endpoints [#api-endpoints] The default server address is the same as one used for Web UI: ``` https://127.0.0.1:20560/ ``` Availability Check [#availability-check] GET /api/ready/ [#get-apiready] Check if the API server is ready to accept requests. **Request:** ```json {} ``` **Response:** ```json { "ReadyQ": true } ``` *** Promise Status [#promise-status] POST /api/promise/ [#post-apipromise] Poll the status of an asynchronous operation using a Promise ID. **Request:** ```json { "Promise": "promise-id-string" } ``` **Response (Pending):** ```json { "ReadyQ": false } ``` **Response (Ready):** ```json { "ReadyQ": true, "Result": <actual-result> } ``` **Errors:** * `"Missing promise or already resolved"` - Promise ID doesn't exist or has already been resolved *** Wolfram Alpha Queries [#wolfram-alpha-queries] POST /api/alphaRequest/ [#post-apialpharequest] Query Wolfram Alpha for short answers to natural language queries. **Request:** ```json { "Query": "what is the capital of France" } ``` **Response:** ```json "Paris, Île-de-France, France" ``` **Notes:** * Results are limited to 1000 characters * Longer results are truncated with "..." **Errors:** * `"Failed request"` - Query could not be processed *** Notebook Operations [#notebook-operations] POST /api/notebook/list/ [#post-apinotebooklist] List all notebooks known to the application. **Request:** ```json {} ``` **Response:** ```json [ { "Id": "notebook-hash", "Opened": true, "Path": "/path/to/file.wln" }, ... ] ``` *** POST /api/notebook/create/ [#post-apinotebookcreate] Create a new empty notebook and open it in the application. This operation is asynchronous. **Request:** ```json {} ``` **Response:** ```json { "Promise": "promise-id" } ``` Poll `/api/promise/` to get the notebook hash ID. **Final Result:** ```json "notebook-hash-id" ``` **Errors:** * `"All windows are closed"` - No notebook window available *** Cell Operations [#cell-operations] POST /api/notebook/cells/list/ [#post-apinotebookcellslist] List all cells in a notebook with their metadata. **Request:** ```json { "Notebook": "notebook-hash-id" } ``` **Response:** ```json [ { "Id": "cell-hash-id", "Type": "Input", "Display": "codemirror", "Lines": 5, "FirstLine": "Plot[Sin[x], {x, 0, 2Pi}]" }, ... ] ``` **Cell Types:** `"Input"` | `"Output"` **Display Formats:** `"codemirror"` | `"markdown"` | `"js"` | `"html"` | ... **Errors:** * `"Notebook is missing"` - Notebook ID not found *** POST /api/notebook/cells/focused/ [#post-apinotebookcellsfocused] Get the currently focused cell and text selection information. **Request:** ```json { "Notebook": "notebook-hash-id" } ``` **Response:** ```json { "Id": "cell-hash-id", "Type": "Input", "Display": "codemirror", "Lines": 10, "FirstLine": "f[x_] := ...", "SelectedLines": [3, 5] } ``` **SelectedLines:** `[startLine, endLine]` (1-indexed) or `null` if no selection **Errors:** * `"Notebook is missing"` * `"Nothing is focused"` - No cell currently has focus *** POST /api/notebook/cells/getlines/ [#post-apinotebookcellsgetlines] Read a range of lines from a cell. **Request:** ```json { "Cell": "cell-hash-id", "From": 1, "To": 5 } ``` **Response:** ```json "line1\nline2\nline3\nline4\nline5" ``` **Notes:** * Line numbers are 1-indexed * `From` and `To` are inclusive **Errors:** * `"Cell not found"` * `"From or To is not a number"` *** POST /api/notebook/cells/setlines/ [#post-apinotebookcellssetlines] Replace a range of lines in a cell. **Request:** ```json { "Cell": "cell-hash-id", "From": 3, "To": 5, "Content": "new line 3\nnew line 4" } ``` **Response:** ```json "Lines were set" ``` **Notes:** * Replaces lines `From` through `To` (inclusive) * Content can have more or fewer lines than the range being replaced * Cannot edit output cells **Errors:** * `"Cell not found"` * `"From or To is not a number"` * `"Cannot edit output cells"` *** POST /api/notebook/cells/setlines/batch/ [#post-apinotebookcellssetlinesbatch] Apply multiple non-overlapping edits to a cell in a single call. **Request:** ```json { "Cell": "cell-hash-id", "Changes": [ {"From": 10, "To": 12, "Content": "replaced lines 10-12"}, {"From": 5, "To": 5, "Content": "replaced line 5"}, {"From": 1, "To": 2, "Content": "replaced lines 1-2"} ] } ``` **Response:** ```json { "Applied": 3, "Message": "Batch lines were set" } ``` **Notes:** * Changes are automatically applied bottom-to-top to preserve line indices * Ranges must not overlap **Errors:** * `"Cell not found"` * `"Changes must be a list"` * `"Cannot edit output cells"` * `"Each change must have numeric From, To and string Content"` * `"Changes have overlapping line ranges"` *** POST /api/notebook/cells/insertlines/ [#post-apinotebookcellsinsertlines] Insert new lines into a cell without replacing existing content. **Request:** ```json { "Cell": "cell-hash-id", "After": 5, "Content": "new line 1\nnew line 2" } ``` **Response:** ```json "Lines were inserted" ``` **Notes:** * `After: 0` inserts at the beginning * `After: n` inserts after line n * Cannot edit output cells **Errors:** * `"Cell not found"` * `"After must be a number"` * `"Content must be a string"` * `"Cannot edit output cells"` *** POST /api/notebook/cells/add/ [#post-apinotebookcellsadd] Add a new cell to the notebook. **Request:** ```json { "Notebook": "notebook-hash-id", "Content": "Plot[Sin[x], {x, 0, 2Pi}]", "Type": "Input", "Display": "codemirror", "Hidden": false, "After": "cell-hash-id" } ``` **Optional Parameters:** * `Type`: `"Input"` (default) | `"Output"` * `Display`: `"codemirror"` (default) or other format * `Hidden`: `false` (default) * `After`: Insert after this cell ID * `Before`: Insert before this cell ID * `Id`: Specify a custom cell ID **Response:** ```json "created-cell-hash-id" ``` **Errors:** * `"Notebook is missing"` *** POST /api/notebook/cells/add/batch/ [#post-apinotebookcellsaddbatch] Add multiple cells in sequence. **Request:** ```json { "Notebook": "notebook-hash-id", "After": "anchor-cell-id", "Cells": [ {"Content": "cell 1 code", "Type": "Input"}, {"Content": "cell 2 code"}, {"Content": "cell 3 code", "Hidden": true} ] } ``` **Response:** ```json { "Created": ["uuid-1", "uuid-2", "uuid-3"], "Count": 3 } ``` **Notes:** * Cells are inserted sequentially, each after the previous * Type, Display, and Hidden are optional per cell **Errors:** * `"Notebook is missing"` * `"Cells must be a list"` * `"Cells list is empty"` * `"Each cell must have a string Content field"` *** POST /api/notebook/cells/delete/ [#post-apinotebookcellsdelete] Delete a cell from the notebook. **Request:** ```json { "Cell": "cell-hash-id" } ``` **Response:** ```json "Removed 1 cell" ``` **Notes:** * Only input cells can be deleted directly * Output cells must be deleted via their parent input cell **Errors:** * `"Cell is missing"` * `"Cannot delete output cell. Delete parent input cell"` *** POST /api/notebook/cells/evaluate/ [#post-apinotebookcellsevaluate] Evaluate an input cell in the notebook's kernel. This is an asynchronous operation. **Request:** ```json { "Cell": "input-cell-hash-id" } ``` **Response:** ```json { "Promise": "promise-id" } ``` Poll `/api/promise/` to get the output cells. **Final Result:** ```json [ { "Id": "output-cell-hash-id", "Type": "Output", "Display": "html", "Lines": 3, "FirstLine": "<svg>..." }, ... ] ``` **Errors:** * `"Cell is missing"` * `"Can't evaluate cell in a closed notebook. Use /api/kernel/evaluate/ path"` **Notes:** * The notebook must be open for evaluation * For closed notebooks, use `/api/kernel/evaluate/` instead *** POST /api/notebook/cells/project/ [#post-apinotebookcellsproject] Open cell content in a separate projection window (useful for presentations or focused viewing). **Request:** ```json { "Cell": "cell-hash-id" } ``` **Response:** ```json "Window was created" ``` **Errors:** * `"Cell is missing"` * `"Output cells cannot be projected"` * `"Can't project cell in a closed notebook"` *** POST /api/notebook/cells/add/markdown/ [#post-apinotebookcellsaddmarkdown] Create an output cell with markdown content. **Request:** ```json { "Notebook": "notebook-hash-id", "Content": "# Heading\n\nMarkdown content here", "After": "cell-hash-id" } ``` **Response:** ```json "created-cell-hash-id" ``` *** POST /api/notebook/cells/add/js/ [#post-apinotebookcellsaddjs] Create an output cell with JavaScript content. **Request:** ```json { "Notebook": "notebook-hash-id", "Content": "console.log('Hello, World!');", "After": "cell-hash-id" } ``` **Response:** ```json "created-cell-hash-id" ``` *** POST /api/notebook/cells/add/html/ [#post-apinotebookcellsaddhtml] Create an output cell with HTML content. **Request:** ```json { "Notebook": "notebook-hash-id", "Content": "<div>Hello, World!</div>", "After": "cell-hash-id" } ``` **Response:** ```json "created-cell-hash-id" ``` *** Kernel Operations [#kernel-operations] POST /api/kernel/evaluate/ [#post-apikernelevaluate] Evaluate a Wolfram Language expression directly in the kernel without needing an open notebook. This is an asynchronous operation. **Request:** ```json { "Expression": "1 + 1", "Kernel": "kernel-hash-id" } ``` **Optional Parameters:** * `Kernel`: Specify a kernel by its hash ID. If omitted, uses the first available ready kernel. **Response:** ```json { "Promise": "promise-id" } ``` Poll `/api/promise/` to get the result. **Final Result:** ```json "2" ``` **Errors:** * `"No kernel is ready for evaluation"` - No kernel is available *** Documentation Search [#documentation-search] POST /api/docs/find/ [#post-apidocsfind] Search documentation for matching queries. **Request:** ```json { "Query": "Plot", "WordSearch": true } ``` **Response:** ```json [ { "Title": "Plotting Functions", "Path": "/docs/plotting", "Snippet": "..." }, ... ] ``` **Parameters:** * `Query`: Search term * `WordSearch`: `true` (default) for word-boundary matching, `false` for substring matching **Notes:** * Returns up to 5 results * Results are ordered by relevance *** CORS Support [#cors-support] All endpoints support **Cross-Origin Resource Sharing (CORS)** with the header: ``` Access-Control-Allow-Origin: * ``` This allows requests from any domain. *** Best Practices [#best-practices] 1. **Handle Promises:** Always poll `/api/promise/` when you receive a Promise ID. Use exponential backoff to avoid overwhelming the server. 2. **Batch Operations:** Use batch endpoints (`/api/notebook/cells/add/batch/` and `/api/notebook/cells/setlines/batch/`) when making multiple related changes for better performance. 3. **Check Notebook State:** Use `/api/notebook/list/` to verify notebook status (open/closed) before attempting operations. 4. **Error Handling:** Always check for error responses (HTTP 409) and handle them appropriately in your client application. # Wolfram Packages Paclets are the [canonical format](https://reference.wolfram.com/language/tutorial/Paclets.html) for distributing libraries (packages) for Wolfram Language interpreters (Wolfram Engine, WolframScript, Mathematica). A paclet can be a compressed or uncompressed bundle that contains one or more packages **plus** metadata and optional assets (documentation, front-end resources, data, web assets). WLJS Notebook on the fundamental level supports paclets ditributed for Matheamtica. There might be some visual glitches or issues with `Dynamic` due to the differences in the frontend implementations. Extensions for Wolfram Paclets [#extensions-for-wolfram-paclets] You can write a normal Wolfram package for both **Mathematica** and **WLJS** that can take advantage of WLJS’s extra features when needed. ❓ **What you can do with this:** * **Ship JavaScript and CSS assets** that are automatically integrated into the runtime once the package is loaded. * Write **a single package for WLJS, Mathematica, and WolframScript**. * **Expose folders from your paclet to an HTTP server.** ❓ **Will it work for exported notebooks?** * Yes. JavaScript bundles can be compressed and embedded into the notebook if you enable this in **Settings**. * You can safely publish your notebook. * Anyone who doesn’t have those package assets installed will still be able to read the notebook without issues. * Everything is cached and updated whenever changes are made to the paclet. Example [#example] Here’s how this might look in your `PacletInfo`: ```wolfram PacletObject[ <| "Name" -> "CoffeeLiqueur/SplatMesh", "License" -> "MIT", "Extensions" -> { { "Javascript", "Root" -> {"Assets", "Spark", "kernel.js"} }, { "Javascript Bundle", (* only for exporting to HTML *) "Root" -> {"Assets", "Bundle", "bundle.js"} } <...> ``` Your package structure might look like this: ``` PacletInfo.wl Kernel/ Kernel.wl ... Assets/ Spark/ kernel.js ... ``` Front-end Extensions [#front-end-extensions] These are special fields in the `PacletInfo.wl` file that describe what is added to the front-end runtime (i.e., what becomes globally available). > Mathematica uses a somewhat similar mechanism for adding new styles or extending context menus/palettes. "Javascript" [#javascript] ⚠️ Requires the `"Root"` option. Use this to include `.js` files in the runtime. They are loaded before the notebook view and are never unloaded. Dynamic imports of other assets from the root folder are supported. "Javascript Bundle" [#javascript-bundle] ⚠️ Requires the `"Root"` option. Use this to include `.js` bundles (no dynamic imports; all-in-one) for notebooks exported as [Static HTML](frontend/Exporting/Static%20HTML.md) or [MDX](frontend/Exporting/MDX.md). It is not loaded into the runtime under normal circumstances. However, if someone opens a notebook without the required package/paclet installed, **the bundle will be temporarily loaded** to avoid rendering issues. "CSS" [#css] ⚠️ Requires the `"Root"` option. Use this to include `.css` files in the runtime. They are loaded before the notebook view and are never unloaded. The same CSS file will be imported and embedded into all exported notebooks. Notes on Saving/Exporting Notebooks [#notes-on-savingexporting-notebooks] The listed third-party assets **are not stored within the notebook by default** to avoid unwanted copies of random bundles in all notebooks. From the **Settings** menu you can: * Remove all cached assets from the WLJS Notebook app. * Remove all cached assets from opened (visible) notebooks. * Embed all assets into opened notebooks. **The last option** lets you embed assets not only in saved notebooks but also in notebooks exported to [HTML](./../Share/Standalone-HTML) or [MDX](./../Share/Markdown-React). Examples [#examples] Some packages published for both WLJS and Mathematica: * [SplatMesh](https://github.com/JerryI/wl-splatmesh) # DeviceClose `DeviceClose[device]` closes the connection to a device and frees related resources. Examples [#examples] Close a device connection: ```wolfram DeviceClose[myDevice] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceClose.html) for more details. # DeviceConfigure `DeviceConfigure[device, config]` configures the specified device according to config. Examples [#examples] Configure a device: ```wolfram DeviceConfigure[device, "SampleRate" -> 44100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceConfigure.html) for more details. # DeviceExecute `DeviceExecute[device, "command"]` executes the specified command on a device. `DeviceExecute[device, "command", params]` executes the command with the parameters params. Examples [#examples] Execute a command on a device: ```wolfram DeviceExecute[device, "Start"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceExecute.html) for more details. # DeviceExecuteAsynchronous `DeviceExecuteAsynchronous[device, "command", fun]` initiates asynchronous execution of the specified command on a device, calling the handler function fun when an event occurs. `DeviceExecuteAsynchronous[device, "command", params, fun]` executes the command with the parameters params. Examples [#examples] Execute asynchronously: ```wolfram DeviceExecuteAsynchronous[device, "Measure", Print] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceExecuteAsynchronous.html) for more details. # DeviceObject `DeviceObject[...]` represents a device that can be accessed in a Wolfram Language session. Examples [#examples] Open a device: ```wolfram DeviceOpen["Serial", "/dev/ttyUSB0"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceObject.html) for more details. # DeviceOpen `DeviceOpen["devclass"]` opens a connection to the first available device in the class specified by "devclass". `DeviceOpen["devclass",spec]` opens a connection to the particular device defined by spec. `DeviceOpen[device]` opens a connection to an existing device specified by a DeviceObject. Examples [#examples] Open a serial port connection: ```wolfram dev = DeviceOpen["Serial", "/dev/ttyUSB0"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceOpen.html) for more details. # DeviceRead `DeviceRead[devobj]` reads a single default item from the open device corresponding to the specified DeviceObject. `DeviceRead["devclass"]` reads from the default device in the class "devclass". `DeviceRead[device,param]` reads the parameter param from the specified device. `DeviceRead[device,{param1,param2,…}]` reads the list of parameters parami from the specified device. Examples [#examples] Read from a device class: ```wolfram DeviceRead["Serial"] ``` Read a specific parameter from a device: ```wolfram DeviceRead[device, "Temperature"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceRead.html) for more details. # DeviceReadBuffer `DeviceReadBuffer[device]` reads the complete contents of the buffer on a device. `DeviceReadBuffer[device, n]` reads n elements from the buffer. `DeviceReadBuffer[device, crit]` reads elements from the buffer until the device-specific criterion crit is met. `DeviceReadBuffer[device, crit, param]` reads elements associated with the parameter param. Examples [#examples] Read from device buffer: ```wolfram DeviceReadBuffer[device, 100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceReadBuffer.html) for more details. # DeviceReadLatest `DeviceReadLatest[device]` returns the most recently collected default item from a device. `DeviceReadLatest[device, n]` returns a list of the n most recently collected items. `DeviceReadLatest[device, n, param]` returns the n most recently collected values of param. `DeviceReadLatest[device, n, {param1, param2, ...}]` returns a list of the most recently collected values of the parami. Examples [#examples] Get the latest reading: ```wolfram DeviceReadLatest[sensor] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceReadLatest.html) for more details. # DeviceReadList `DeviceReadList[device, n]` reads from the specified device n times, returning a list of the results. `DeviceReadList[device, n, param]` reads the parameter param. `DeviceReadList[device, n, {param1, param2, ...}]` reads the list of parameters parami. Examples [#examples] Read multiple values from a device: ```wolfram DeviceReadList[sensor, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceReadList.html) for more details. # DeviceReadTimeSeries `DeviceReadTimeSeries[device,{t,dt}]` repeatedly reads default items from the specified device at interval dt for a total time t, returning a time series of the resulting values. `DeviceReadTimeSeries[device,{t,dt},param]` repeatedly reads the parameter param and returns a time series of its values. `DeviceReadTimeSeries[device,{t,dt},{param1,param2,…}]` repeatedly reads the parami and returns a time series of their values. Examples [#examples] Read from a device for 10 seconds at 1 second intervals: ```wolfram DeviceReadTimeSeries["Serial", {10, 1}] ``` Read specific parameters: ```wolfram DeviceReadTimeSeries[device, {5, 0.5}, "Temperature"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceReadTimeSeries.html) for more details. # DeviceStreams `DeviceStreams[device]` gives a list of all open streams associated with a device. `DeviceStreams[device, patt]` gives a list of streams whose names match the string pattern patt. `DeviceStreams[device, {patt1, patt2, ...}]` gives a list of streams whose names match any of the patti. Examples [#examples] List device streams: ```wolfram DeviceStreams[device] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceStreams.html) for more details. # DeviceWrite `DeviceWrite[device, val]` writes the value val to the specified device. `DeviceWrite[device, {val1, val2, ...}]` writes the sequence of values vali to the specified device. `DeviceWrite[device, param -> val]` writes val as the value of the parameter param. `DeviceWrite[device, {param1 -> val1, param2 -> val2, ...}]` writes values of several parameters. Examples [#examples] Write to a device: ```wolfram DeviceWrite[device, {1, 0, 1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceWrite.html) for more details. # DeviceWriteBuffer `DeviceWriteBuffer[device, vals]` fills the buffer on a device with the values vals. `DeviceWriteBuffer[device, param -> vals]` fills the buffer associated with the parameter param with the values vals. `DeviceWriteBuffer[device, {param1 -> vals1, param2 -> vals2, ...}]` fills the buffers associated with the parami with the corresponding values valsi. Examples [#examples] Write to device buffer: ```wolfram DeviceWriteBuffer[device, Range[100]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeviceWriteBuffer.html) for more details. # Devices `Devices[]` gives a list of registered devices on a particular system. `Devices[form]` gives a list of devices in classes whose names match the string pattern form. `Devices[{form1, form2, ...}]` gives a list of devices in classes whose names match any of the formi. Examples [#examples] List all devices: ```wolfram Devices[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Devices.html) for more details. # AbsoluteTime `AbsoluteTime[]` gives the total number of seconds since the beginning of January 1, 1900, in your time zone. `AbsoluteTime[date]` gives the absolute time specification corresponding to the given date specification. Examples [#examples] Get the current absolute time: ```wolfram AbsoluteTime[] (* 3.94...*10^9 - a large number *) ``` Convert a date to absolute time: ```wolfram AbsoluteTime[{2000, 1, 1}] (* 3155673600 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbsoluteTime.html) for more details. # AbsoluteTiming `AbsoluteTiming[expr]` evaluates expr, returning a list of the absolute number of seconds in real time that have elapsed, together with the result obtained. Example [#example] Measure execution time: ```wolfram AbsoluteTiming[Sum[i^2, {i, 10^6}]] (* {0.05, 333333833333500000} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbsoluteTiming.html) for more details. # BusinessDayQ `BusinessDayQ[date]` returns `True` if the date is a business day and returns `False` otherwise. Examples [#examples] ```wolfram BusinessDayQ[DateObject[{2024, 1, 15}]] (* True *) ``` ```wolfram BusinessDayQ[DateObject[{2024, 1, 14}]] (* Sunday *) (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BusinessDayQ.html) for more details. # CalendarConvert `CalendarConvert[date, calendar]` converts the date object date to the specified calendar type calendar. `CalendarConvert[date]` converts to the default calendar type. Examples [#examples] Convert to different calendar: ```wolfram CalendarConvert[DateObject[{2024, 1, 1}], "Jewish"] ``` Convert from Islamic calendar: ```wolfram CalendarConvert[DateObject[{1445, 1, 1}, CalendarType -> "Islamic"], "Gregorian"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CalendarConvert.html) for more details. # CalendarData `CalendarData[cal]` gives the default parameters associated with the date calendar cal. `CalendarData[country]` gives available holiday calendars for the stock exchanges in the country entity. `CalendarData[cal, param]` gives the value of the specified parameter param for calendar cal. Examples [#examples] Get calendar information: ```wolfram CalendarData["Jewish"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CalendarData.html) for more details. # CurrentDate `CurrentDate[gran]` gives the current date of the specified granularity type gran. `CurrentDate[date,gran]` gives the date of the given granularity that includes the specified date. `CurrentDate[]` gives the instant corresponding to the current date. Examples [#examples] Get the current month: ```wolfram CurrentDate["Month"] ``` Get the current year: ```wolfram CurrentDate["Year"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CurrentDate.html) for more details. # Date `Date[]` gives the current local date and time in the form \{year, month, day, hour, minute, second}. Examples [#examples] Get the current date and time: ```wolfram Date[] (* {2024, 1, 15, 10, 30, 45} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Date.html) for more details. # DateBounds `DateBounds[{date1, date2, …}]` gives the earliest and latest of the datei. `DateBounds[tseries]` gives the first and last dates in the time series tseries. `DateBounds[bin]` gives the first and last time stamps in the databin bin. `DateBounds[interval]` gives the start and end dates of the date interval interval. `DateBounds[interval, gran]` gives the endpoints of interval in the specified granularity gran. Examples [#examples] Find bounds of a list of dates: ```wolfram DateBounds[{DateObject[{2020, 1, 1}], DateObject[{2022, 6, 15}], DateObject[{2021, 3, 10}]}] ``` Get bounds from a time series: ```wolfram ts = TimeSeries[{{1, 10}, {2, 20}, {3, 15}}]; DateBounds[ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateBounds.html) for more details. # DateDifference `DateDifference[date1, date2]` gives the number of days between two dates. `DateDifference[date1, date2, "unit"]` uses specified units. Examples [#examples] Calculate time differences: ```wolfram DateDifference[{2024, 1, 1}, {2024, 12, 31}] (* Quantity[365, "Days"] *) (* In months *) DateDifference[{2020, 1, 1}, {2024, 1, 1}, "Year"] (* Quantity[4, "Years"] *) (* Multiple units *) DateDifference[{2024, 1, 1}, {2025, 6, 15}, {"Year", "Month", "Day"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateDifference.html) for more details. # DateHistogram `DateHistogram[{date1,date2,…}]` plots a histogram of the dates datei. `DateHistogram[{date1,date2,…},bspec]` plots a histogram with bin width specification bspec. `DateHistogram[{date1,date2,…},bspec,hspec]` plots a histogram with bin heights computed according to the specification hspec. `DateHistogram[{data1,data2,…}]` plots histograms for multiple datasets datai. Examples [#examples] Plot a histogram of dates: ```wolfram DateHistogram[{"2020-01-01", "2020-02-15", "2020-02-20", "2020-03-10"}] ``` Specify monthly bins: ```wolfram DateHistogram[{"2020-01-01", "2020-02-15", "2020-03-10"}, "Month"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateHistogram.html) for more details. # DateInterval `DateInterval[{start, end}]` represents the continuous interval of time between start and end. `DateInterval[{start, end}, gran]` represents an interval of dates with calendar granularity gran. `DateInterval[{{start1, end1}, {start2, end2}, ...}]` represents the union of intervals. `DateInterval[gdate]` gives the date interval from the initial to final instants of the granular date object gdate. Examples [#examples] Create a date interval: ```wolfram DateInterval[{DateObject[{2024, 1, 1}], DateObject[{2024, 12, 31}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateInterval.html) for more details. # DateList `DateList[]` gives the current local date and time in the form `{year, month, day, hour, minute, second}`. `DateList[date]` gives a date list for a given date specification. Examples [#examples] Get current date as a list: ```wolfram DateList[] (* {2025, 1, 15, 14, 30, 45.123} *) ``` Convert a date string to a list: ```wolfram DateList["January 1, 2024"] (* {2024, 1, 1, 0, 0, 0.} *) ``` Get date components from a DateObject: ```wolfram DateList[Now] (* {2025, 1, 15, 14, 30, 45.123} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateList.html) for more details. # DateObject `DateObject[]` gives the current local date and time. `DateObject[{y, m, d}]` creates a date object for a specific date. Examples [#examples] Work with dates: ```wolfram (* Current date *) DateObject[] (* Specific date *) DateObject[{2024, 12, 25}] (* With time *) DateObject[{2024, 1, 1, 12, 0, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateObject.html) for more details. # DateObjectQ `DateObjectQ[expr]` gives `True` if expr is a `DateObject` with valid arguments, and `False` otherwise. Examples [#examples] Check if an expression is a valid date object: ```wolfram DateObjectQ[DateObject[{2020, 1, 1}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateObjectQ.html) for more details. # DateOverlapsQ `DateOverlapsQ[date1, date2]` returns `True` if the calendar dates date1 and date2 overlap, and `False` otherwise. Examples [#examples] Check if two date ranges overlap: ```wolfram DateOverlapsQ[DateInterval[{{2020, 1}, {2020, 6}}], DateInterval[{{2020, 4}, {2020, 12}}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateOverlapsQ.html) for more details. # DatePattern `DatePattern[{"e1", "e2", ...}]` represents the characters of a date with elements of type "ei" in `StringExpression`. `DatePattern[{"e1", "e2", ...}, sep]` allows separators that match the string expression sep. Examples [#examples] Match a date pattern in a string: ```wolfram StringMatchQ["2020-01-15", DatePattern[{"Year", "-", "Month", "-", "Day"}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DatePattern.html) for more details. # DatePlus `DatePlus[date, n]` gives the date `n` days after `date`. `DatePlus[date, {n, "unit"}]` uses specified time units. Examples [#examples] Add time to dates: ```wolfram (* 10 days from now *) DatePlus[Now, 10] (* 3 months later *) DatePlus[DateObject[{2024, 1, 15}], {3, "Month"}] (* 1 year and 6 months *) DatePlus[Today, {{1, "Year"}, {6, "Month"}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DatePlus.html) for more details. # DateRange `DateRange[date1, date2]` gives all dates in the range from date1 to date2. `DateRange[date1, date2, increment]` gives the dates in the range from date1 to date2 that are increment apart. Examples [#examples] Get all days in a range: ```wolfram DateRange[{2024, 1, 1}, {2024, 1, 5}] ``` Monthly intervals: ```wolfram DateRange[{2024, 1, 1}, {2024, 12, 1}, "Month"] ``` Weekly intervals: ```wolfram DateRange[DateObject[{2024, 1, 1}], DateObject[{2024, 2, 1}], "Week"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateRange.html) for more details. # DateScale `DateScale[]` represents the canonical mapping of continuous dates and times to a quantitative scale. Examples [#examples] Create a date scale: ```wolfram DateScale[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateScale.html) for more details. # DateSelect `DateSelect[list, crit]` picks out all dates datei of a list for which crit\[datei] is True. `DateSelect[int, crit]` returns all dates within the DateInterval int for which crit\[datei] is True. `DateSelect[crit]` represents an operator form of DateSelect that can be applied to an expression. Examples [#examples] Select weekends from a date range: ```wolfram dates = DateRange[{2024, 1, 1}, {2024, 1, 14}]; DateSelect[dates, DayName[#] === Saturday || DayName[#] === Sunday &] ``` Select Mondays: ```wolfram DateSelect[dates, DayName[#] === Monday &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateSelect.html) for more details. # DateString `DateString[]` gives the current date and time as a string. `DateString[date, format]` formats a date according to specified elements. Examples [#examples] Format dates as strings: ```wolfram DateString[] (* "Wed 15 Jan 2025 14:30:00" *) (* Custom format *) DateString[Now, {"Year", "-", "Month", "-", "Day"}] (* "2025-01-15" *) (* ISO format *) DateString[Now, "ISODate"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateString.html) for more details. # DateValue `DateValue["elem"]` gives the specified element of the current date and time. `DateValue[date, elem]` extracts the element from a specific date. Examples [#examples] Get the current year: ```wolfram DateValue["Year"] (* 2025 *) ``` Extract multiple elements: ```wolfram DateValue[{"Month", "Day", "Year"}] (* {1, 15, 2025} *) ``` Get hour from a specific date: ```wolfram DateValue[DateObject[{2024, 12, 25, 10, 30, 0}], "Hour"] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateValue.html) for more details. # DateWithinQ `DateWithinQ[date1, date2]` returns `True` if the calendar date date2 is entirely contained within date1, and `False` otherwise. Examples [#examples] Check if a date is within another: ```wolfram DateWithinQ[DateObject[{2020}], DateObject[{2020, 6, 15}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateWithinQ.html) for more details. # Dated `Dated[obj, year]` represents the object obj associated with a particular year. `Dated[obj, date]` represents the object obj associated with a date. `Dated[obj, All]` represents the object obj for all dates where information is available about it. Examples [#examples] Get entity data for a specific year: ```wolfram Dated[Entity["Country", "France"], 2000] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Dated.html) for more details. # DatedUnit `DatedUnit[unit, date]` represents the specified unit at a specific date. Examples [#examples] Currency at a specific date: ```wolfram Quantity[100, DatedUnit["USDollars", {2020, 1, 1}]] ``` Convert historical currency: ```wolfram UnitConvert[Quantity[100, DatedUnit["USDollars", {2010, 1, 1}]], "Euros"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DatedUnit.html) for more details. # DayCount `DayCount[date1,date2]` gives the number of days from date1 to date2. `DayCount[date1,date2,daytype]` gives the number of days of the specified daytype from date1 to date2. Examples [#examples] Count days between two dates: ```wolfram DayCount[{2020, 1, 1}, {2020, 12, 31}] (* 365 *) ``` Count only business days: ```wolfram DayCount[{2020, 1, 1}, {2020, 1, 31}, "BusinessDay"] (* 22 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayCount.html) for more details. # DayName `DayName[]` gives the current day of the week. `DayName[date]` gives the day of the week for the given date. Examples [#examples] Get current day: ```wolfram DayName[] (* Wednesday *) ``` Day of a specific date: ```wolfram DayName[{2024, 12, 25}] (* Wednesday *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayName.html) for more details. # DayPlus `DayPlus[date,n]` gives the date n days away from date. `DayPlus[date,n,daytype]` gives the date that is n days of daytype away from date. Examples [#examples] Get the date 10 days from today: ```wolfram DayPlus[Today, 10] ``` Get 5 business days from a specific date: ```wolfram DayPlus[{2024, 1, 1}, 5, "BusinessDay"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayPlus.html) for more details. # DayRange `DayRange[date1, date2]` gives the dates in the range from date1 to date2. `DayRange[date1, date2, daytype]` gives the dates in the range from date1 to date2 that are of the specified daytype. Examples [#examples] Get all days in January: ```wolfram DayRange[{2024, 1, 1}, {2024, 1, 31}] ``` Get only business days: ```wolfram DayRange[{2024, 1, 1}, {2024, 1, 31}, "BusinessDay"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayRange.html) for more details. # DayRound `DayRound[date, daytype]` rounds date to the nearest day of daytype, using the next-day rounding convention. `DayRound[date, daytype, rounding]` rounds date to the nearest day of daytype, using rounding. Examples [#examples] Round to the next business day: ```wolfram DayRound[{2024, 1, 6}, "BusinessDay"] (* Next Monday since Saturday is not a business day *) ``` Round to the previous weekday: ```wolfram DayRound[{2024, 1, 7}, "Weekday", "Previous"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DayRound.html) for more details. # DaylightQ `DaylightQ[]` gives `True` if it is currently daylight from the user's location. `DaylightQ[datespec]` gives `True` if it is daylight from the user's location on the specified datespec. `DaylightQ[locationspec]` gives `True` if it is currently daylight from the specified locationspec. `DaylightQ[locationspec, datespec]` gives `True` if it is daylight from the specified locationspec on the specified datespec. Examples [#examples] Check if it's currently daylight: ```wolfram DaylightQ[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DaylightQ.html) for more details. # Friday `Friday` is a day of the week. Examples [#examples] Check if today is Friday: ```wolfram DayName[Today] === Friday ``` Find next Friday: ```wolfram NextDate[Friday] ``` Use in date calculations: ```wolfram DayCount[Today, NextDate[Friday]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Friday.html) for more details. # FromAbsoluteTime `FromAbsoluteTime[time]` gives a date object corresponding to an absolute time specification as given by AbsoluteTime. Examples [#examples] Convert absolute time to a date: ```wolfram FromAbsoluteTime[AbsoluteTime[]] ``` Convert a specific absolute time: ```wolfram FromAbsoluteTime[0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromAbsoluteTime.html) for more details. # FromDate `FromDate[date]` converts a date of the form \{y,m,d,h,m,s} to an absolute number of seconds since the beginning of January 1, 1900. Examples [#examples] ```wolfram FromDate[{2000, 1, 1, 0, 0, 0}] (* 3155673600 *) ``` ```wolfram FromDate[{1900, 1, 1}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromDate.html) for more details. # FromDateString `FromDateString["string"]` gives a date object corresponding to the date represented by "string". * `FromDateString["string", {e1, e2, ...}]` gives the date object obtained by extracting elements "ei" from "string". * `FromDateString["string", fmt]` gives the date object obtained using the date format fmt. Examples [#examples] Parse a date string: ```wolfram FromDateString["January 1, 2024"] ``` Parse with a specific format: ```wolfram FromDateString["2024-01-15", {"Year", "-", "Month", "-", "Day"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromDateString.html) for more details. # FromJulianDate `FromJulianDate[jd]` gives a date object corresponding to the Julian date jd. * `FromJulianDate["type", jd]` gives a date object corresponding to the specified Julian date variant. Examples [#examples] Convert a Julian date to a date object: ```wolfram FromJulianDate[2451545] ``` Convert a modified Julian date: ```wolfram FromJulianDate["ModifiedJulian", 51545] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromJulianDate.html) for more details. # FromLunationNumber `FromLunationNumber[ln]` returns the date corresponding to the lunation number ln. * `FromLunationNumber[scheme, ln]` returns the date corresponding to the lunation number in the given counting scheme. Examples [#examples] Get the date for a lunation number: ```wolfram FromLunationNumber[1000] ``` Use a specific counting scheme: ```wolfram FromLunationNumber["Brown", 1000] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromLunationNumber.html) for more details. # FromUnixTime `FromUnixTime[time]` gives a DateObject corresponding to a Unix time specification (seconds since January 1, 1970). Examples [#examples] Convert a Unix timestamp to a date: ```wolfram FromUnixTime[0] (* DateObject[{1970, 1, 1, 0, 0, 0}, ...] *) ``` Convert a specific timestamp: ```wolfram FromUnixTime[1704067200] (* DateObject[{2024, 1, 1, 0, 0, 0}, ...] *) ``` Get the current time via round-trip: ```wolfram FromUnixTime[UnixTime[]] (* DateObject[...] - current date/time *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromUnixTime.html) for more details. # JulianDate `JulianDate[]` gives the current number of days since noon on November 24, 4714 BCE in the GMT time zone. `JulianDate[date]` gives the number of days for the specified date. `JulianDate["type"]` gives the Julian date variant of the specified type. `JulianDate["type",date]` gives the variant for the specified date. Examples [#examples] ```wolfram JulianDate[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JulianDate.html) for more details. # LeapVariant `LeapVariant[n]` represents a repeated calendar element caused by a leap period. Examples [#examples] ```wolfram LeapVariant[2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeapVariant.html) for more details. # LeapYearQ `LeapYearQ[date]` returns `True` if the year corresponding to date is a leap year. Examples [#examples] Check if a year is a leap year: ```wolfram LeapYearQ[2024] (* True *) ``` Check a non-leap year: ```wolfram LeapYearQ[2023] (* False *) ``` Use with a date object: ```wolfram LeapYearQ[DateObject[{2000, 1, 1}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeapYearQ.html) for more details. # LocalTime `LocalTime[]` gives a DateObject corresponding to the current local time at the current geo location. * `LocalTime[loc]` gives the current local time at the geo location specified by loc. * `LocalTime[loc, time]` gives the local time corresponding to the date object time at the geo location loc. * `LocalTime[loc, time, func]` uses func to determine what to return for extended geographic regions. Examples [#examples] Get the current local time: ```wolfram LocalTime[] ``` Get the current time in New York: ```wolfram LocalTime[Entity["City", {"NewYork", "NewYork", "UnitedStates"}]] ``` Convert a time to a different location: ```wolfram LocalTime[Entity["City", {"Tokyo", "Tokyo", "Japan"}], Now] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalTime.html) for more details. # LocalTimeZone `LocalTimeZone[]` gives the current time zone for the current geo location. `LocalTimeZone[loc]` gives the current time zone for the geo location specified by loc. `LocalTimeZone[loc, date]` gives the time zone for the geo location loc on the specified date. `LocalTimeZone[loc, date, "prop"]` gives the specified property of the time zone. Examples [#examples] Get the current local time zone: ```wolfram LocalTimeZone[] (* "America/New_York" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalTimeZone.html) for more details. # LunarEclipse `LunarEclipse[]` gives the time of the next lunar eclipse. * `LunarEclipse[datespec]` gives the time for the next lunar eclipse after the specified date. * `LunarEclipse[propertyspec]` gives the specified property value for the next lunar eclipse. * `LunarEclipse[datespec, propertyspec]` gives the specified property value for the next lunar eclipse after the specified date. Examples [#examples] ```wolfram LunarEclipse[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LunarEclipse.html) for more details. # LunationNumber `LunationNumber[]` returns the number of new moons since the first new moon of the year 2000. * `LunationNumber[date]` returns the number of new moons since the given date. * `LunationNumber[scheme, date]` returns the number of new moons since the zeroth new moon of the given counting scheme. Examples [#examples] ```wolfram LunationNumber[] ``` ```wolfram LunationNumber[DateObject[{2020, 1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LunationNumber.html) for more details. # Monday `Monday` is a day of the week. Examples [#examples] Get the next Monday: ```wolfram NextDate[Monday] ``` Check if a date is a Monday: ```wolfram DayName[DateObject[{2024, 1, 1}]] === Monday ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Monday.html) for more details. # MoonPhase `MoonPhase[]` gives moon phase fraction of illumination for the current date. * `MoonPhase[datespec]` gives moon phase fraction of illumination for the specified date. * `MoonPhase[property]` gives the property of the moon phase for the current date. * `MoonPhase[datespec, property]` gives the property of the moon phase for the specified date. Examples [#examples] ```wolfram MoonPhase[] ``` ```wolfram MoonPhase[DateObject[{2024, 1, 1}]] ``` ```wolfram MoonPhase["Name"] ``` ```wolfram MoonPhase[Today, "Icon"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MoonPhase.html) for more details. # MoonPhaseDate `MoonPhaseDate[]` returns the date of the next new moon. `MoonPhaseDate[phase]` returns the date of the next instance of the given phase of the Moon. `MoonPhaseDate[date,phase]` returns the date for the first instance of the given phase after date. Examples [#examples] Get the next full moon date: ```wolfram MoonPhaseDate["FullMoon"] (* DateObject[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MoonPhaseDate.html) for more details. # MoonPosition `MoonPosition[]` gives the position of the Moon for the current date and location. * `MoonPosition[datespec]` gives the position of the Moon for the specified date. * `MoonPosition[locationspec]` gives the position of the Moon for the specified location. * `MoonPosition[locationspec, datespec]` gives the position of the Moon for the specified date and location. * `MoonPosition[{{location1, date1}, {location2, date2}, ...}]` gives the positions of the Moon for all specified locations on the specified dates. * `MoonPosition[locationspec, datespec, func]` uses func to determine what to return for extended locations. Examples [#examples] ```wolfram MoonPosition[] ``` ```wolfram MoonPosition[DateObject[{2024, 1, 15}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MoonPosition.html) for more details. # NewMoon `NewMoon[]` gives the date of the next new moon. * `NewMoon[date]` gives the date of the first new moon after the given date. Examples [#examples] Get the next new moon: ```wolfram NewMoon[] ``` New moon after a specific date: ```wolfram NewMoon[DateObject[{2024, 1, 1}]] ``` List upcoming new moons: ```wolfram NestList[NewMoon, Now, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NewMoon.html) for more details. # NextDate `NextDate[gran]` gives the next occurring date of the specified granularity type *gran*. * `NextDate[daytype]` gives the next day corresponding to the specified *daytype*. * `NextDate[date, gran]` gives the next date of the given granularity relative to the specified *date*. Examples [#examples] ```wolfram NextDate["Monday"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NextDate.html) for more details. # Now `Now` gives a `DateObject` representing the current moment in time, including date and time. Examples [#examples] Get the current time: ```wolfram Now (* DateObject[{2025, 1, 15, 14, 30, 45.123}, "Instant", ...] *) (* Extract components *) DateValue[Now, "Hour"] (* Time arithmetic *) Now + Quantity[1, "Hours"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Now.html) for more details. # PreviousDate `PreviousDate[gran]` gives the previously occurring date of the specified granularity type gran. `PreviousDate[daytype]` gives the previous day corresponding to the specified daytype. `PreviousDate[date,gran]` gives the previous date of the given granularity relative to the specified date. Examples [#examples] ```wolfram PreviousDate["Month"] (* DateObject[...] *) ``` ```wolfram PreviousDate[Friday] (* DateObject for the previous Friday *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PreviousDate.html) for more details. # Saturday `Saturday` is a day of the week. Examples [#examples] ```wolfram DayName[{2025, 1, 4}] (* Saturday *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Saturday.html) for more details. # SessionTime `SessionTime[]` gives the total number of seconds of real time that have elapsed since the beginning of your Wolfram System session. Examples [#examples] ```wolfram SessionTime[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SessionTime.html) for more details. # SiderealTime `SiderealTime[]` gives the right ascension of the local meridian for the current date and location. `SiderealTime[date]` gives the right ascension of the local meridian for the specified date. `SiderealTime[loc]` gives the right ascension of the local meridian for the specified location. `SiderealTime[loc,date]` gives the right ascension of the local meridian for the specified date and location. `SiderealTime[{{loc1,date1},{loc2,date2},…}]` gives the right ascensions of the local meridians for all specified locations on the specified dates. `SiderealTime[loc,date,func]` uses func to determine what to return for extended locations. `SiderealTime["MeanTime",loc,date,func]` gives the mean sidereal time for the specified date, location and aggregation function. Examples [#examples] Get the current sidereal time: ```wolfram SiderealTime[] ``` Get sidereal time for a specific location: ```wolfram SiderealTime[Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SiderealTime.html) for more details. # SolarEclipse `SolarEclipse[]` gives the date of the next solar eclipse. * `SolarEclipse[date]` gives the date of the next solar eclipse after the specified date. * `SolarEclipse[prop]` gives the value of property prop for the next solar eclipse. * `SolarEclipse[date, prop]` gives the value of property prop for the next solar eclipse after date. Examples [#examples] Get the next solar eclipse: ```wolfram SolarEclipse[] ``` Get eclipse type: ```wolfram SolarEclipse["Type"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolarEclipse.html) for more details. # SolarTime `SolarTime[]` gives the angle on the celestial equator between the Sun and the local antimeridian for the current location and date. * `SolarTime[loc]` gives the solar time angle for the specified location and current date. * `SolarTime[date]` gives the solar time angle for the specified date and current location. * `SolarTime[loc, date]` gives the solar time for the specified location and date. * `SolarTime["MeanTime", loc, date]` gives the mean solar time for the specified location and date. Examples [#examples] ```wolfram SolarTime[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolarTime.html) for more details. # SunPosition `SunPosition[]` gives the position of the Sun for the current date and location. * `SunPosition[datespec]` gives the position of the Sun for the specified date. * `SunPosition[locationspec]` gives the positions of the Sun for the specified location. * `SunPosition[locationspec, datespec]` gives the position of the Sun for the specified date and location. * `SunPosition[{{location1, date1}, {location2, date2}, …}]` gives the positions of the Sun for all specified locations on the specified dates. * `SunPosition[locationspec, datespec, func]` uses func to determine what to return for extended locations. Examples [#examples] ```wolfram SunPosition[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SunPosition.html) for more details. # Sunday `Sunday` is a day of the week. Examples [#examples] Use in date functions: ```wolfram DayName[DateObject[{2024, 1, 7}]] === Sunday ``` Find next Sunday: ```wolfram DateObject[Today, Sunday] ``` In date patterns: ```wolfram DateSelect[dates, DayName[#] === Sunday &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sunday.html) for more details. # Sunrise `Sunrise[]` gives the time of the next sunrise for the current date and location. * `Sunrise[datespec]` gives the times of the next sunrise for the specified dates. * `Sunrise[locationspec]` gives the times of the next sunrise for the specified locations. * `Sunrise[locationspec, datespec]` gives the time of the next sunrise for the specified date and location. * `Sunrise[{{location1, date1}, {location2, date2}, ...}]` gives the times of the next sunrise for all specified locations on the specified dates. * `Sunrise[locationspec, datespec, func]` uses func to determine what to return for extended locations. Examples [#examples] Next sunrise at current location: ```wolfram Sunrise[] ``` Sunrise in a specific city: ```wolfram Sunrise[Entity["City", {"NewYork", "NewYork", "UnitedStates"}]] ``` Sunrise on a specific date: ```wolfram Sunrise[Here, DateObject[{2024, 6, 21}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sunrise.html) for more details. # Sunset `Sunset[]` gives the time of the next sunset for the current date and location. `Sunset[datespec]` gives the time of the next sunset for the specified dates. `Sunset[locationspec]` gives the times of the next sunset for the specified locations. `Sunset[locationspec,datespec]` gives the time of the next sunset for the specified date and location. `Sunset[{{location1,date1},{location2,date2},…}]` gives the times of the next sunset for all specified locations on the specified dates. `Sunset[locationspec,datespec,func]` uses func to determine what to return for extended locations. Examples [#examples] Get the next sunset time: ```wolfram Sunset[] (* DateObject[...] *) ``` Get sunset for a specific location: ```wolfram Sunset[Entity["City", {"NewYork", "NewYork", "UnitedStates"}]] (* DateObject[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sunset.html) for more details. # Thursday `Thursday` is a day of the week. Examples [#examples] ```wolfram DayName[Thursday] (* Thursday *) ``` ```wolfram NextDate[Thursday] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Thursday.html) for more details. # TimeConstrained `TimeConstrained[expr, t]` evaluates expr, stopping after t seconds. `TimeConstrained[expr, t, failexpr]` returns failexpr if the time constraint is not met. Examples [#examples] Limit computation time: ```wolfram TimeConstrained[Pause[5], 2] (* $Aborted *) ``` Provide a fallback value on timeout: ```wolfram TimeConstrained[Pause[5], 1, "Timed out"] (* "Timed out" *) ``` Successful computation within time limit: ```wolfram TimeConstrained[2 + 2, 1] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeConstrained.html) for more details. # TimeObject `TimeObject[]` represents the current time. `TimeObject[{h, m, s}]` represents a time object of standard normalized form. `TimeObject[date]` gives the time component of the specified date representation. `TimeObject[rtime, gran]` gives the time object of granularity gran that includes the reference time rtime. Examples [#examples] Current time: ```wolfram TimeObject[] (* TimeObject[{14, 30, 45.123}] *) ``` Specific time: ```wolfram TimeObject[{10, 30, 0}] (* TimeObject[{10, 30, 0}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeObject.html) for more details. # TimeObjectQ `TimeObjectQ[expr]` gives `True` if expr is a `TimeObject` with valid arguments, and `False` otherwise. Examples [#examples] ```wolfram TimeObjectQ[TimeObject[{12, 30, 0}]] ``` ```wolfram TimeObjectQ[Now] ``` ```wolfram TimeObjectQ["not a time"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeObjectQ.html) for more details. # TimeRemaining `TimeRemaining[]` gives the number of seconds remaining until the earliest enclosing `TimeConstrained` will request the current computation to stop. Examples [#examples] ```wolfram TimeConstrained[While[True, If[TimeRemaining[] < 0.5, Break[]]]; "done", 2] ``` ```wolfram TimeConstrained[TimeRemaining[], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeRemaining.html) for more details. # TimeValue `TimeValue[s, i, t]` calculates the time value of a security s at time t for an interest specified by i. Examples [#examples] Calculate future value with simple interest: ```wolfram TimeValue[1000, .05, 10] ``` Present value calculation: ```wolfram TimeValue[Annuity[100, 10], .08, 0] ``` Time value with compound interest: ```wolfram TimeValue[1000, EffectiveInterest[.06, 12], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeValue.html) for more details. # TimeWarpingCorrespondence `TimeWarpingCorrespondence[s1, s2]` gives the time warping (DTW) similarity path between sequences s1 and s2. `TimeWarpingCorrespondence[s1, s2, r]` uses a window of radius r for local search. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeWarpingCorrespondence.html) for more details. # TimeWarpingDistance `TimeWarpingDistance[s1, s2]` gives the dynamic time warping (DTW) distance between sequences s1 and s2. * `TimeWarpingDistance[s1, s2, r]` uses a window of radius r for local search. Examples [#examples] ```wolfram TimeWarpingDistance[{1, 2, 3, 4}, {1, 2, 2, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeWarpingDistance.html) for more details. # TimeZoneConvert `TimeZoneConvert[time, timezone]` converts the date or time object time to the specified time zone timezone. `TimeZoneConvert[time]` converts to the current `$TimeZone` value. `TimeZoneConvert[{time1, ..., timen}, timezone]` converts time1 through timen to the specified timezone. Examples [#examples] ```wolfram TimeZoneConvert[Now, "America/New_York"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeZoneConvert.html) for more details. # TimeZoneOffset `TimeZoneOffset[tz]` gives the numeric offset between the time zone tz and GMT on the current date. * `TimeZoneOffset[loc]` gives the numeric offset between the time zone for the location loc and GMT. * `TimeZoneOffset[tz, base]` gives the numeric offset between tz and the specified base time zone. * `TimeZoneOffset[tz, date]` gets a list of possible time zone offsets for tz at the given date list. * `TimeZoneOffset[tz, base, date]` gives the numeric offset between tz and base on the specified date. Examples [#examples] ```wolfram TimeZoneOffset["America/New_York"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeZoneOffset.html) for more details. # ToDate `ToDate[time]` converts an absolute time in seconds since the beginning of January 1, 1900 to a date of the form \{y, m, d, h, m, s}. Examples [#examples] ```wolfram ToDate[0] (* {1900, 1, 1, 0, 0, 0} *) ``` ```wolfram ToDate[AbsoluteTime[]] (* current date and time *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToDate.html) for more details. # Today `Today` gives a `DateObject` representing the current day (without time). Examples [#examples] Get today's date: ```wolfram Today (* DateObject[{2025, 1, 15}, "Day", ...] *) (* Days until a date *) DateDifference[Today, {2025, 12, 31}] (* Date arithmetic *) Today + Quantity[7, "Days"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Today.html) for more details. # Tomorrow `Tomorrow` gives a DateObject representing the following day. Examples [#examples] Get tomorrow's date: ```wolfram Tomorrow ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tomorrow.html) for more details. # Tuesday `Tuesday` is a day of the week. This named constant is used with date-related functions. Examples [#examples] ```wolfram DayName[Tuesday] ``` ```wolfram NextDate[Tuesday] ``` ```wolfram DateSelect[DateRange[Today, Today + Quantity[30, "Days"]], DayName[#] === Tuesday &] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tuesday.html) for more details. # UnixTime `UnixTime[]` gives the total number of seconds since January 1, 1970, in the GMT time zone. `UnixTime[date]` converts a date to Unix timestamp. Examples [#examples] Get the current Unix timestamp: ```wolfram UnixTime[] (* 1736951445 *) ``` Convert a date to Unix time: ```wolfram UnixTime[{2024, 1, 1, 0, 0, 0}] (* 1704067200 *) ``` Convert a DateObject: ```wolfram UnixTime[DateObject[{2000, 1, 1}]] (* 946684800 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnixTime.html) for more details. # Wednesday `Wednesday` is a day of the week. Examples [#examples] ```wolfram DayName[Wednesday] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Wednesday.html) for more details. # Yesterday `Yesterday` gives a DateObject representing the previous day. Examples [#examples] Get yesterday's date: ```wolfram Yesterday ``` Use in date calculations: ```wolfram DateDifference[Yesterday, Today] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Yesterday.html) for more details. # AccountingForm `AccountingForm[expr]` prints with all numbers in expr given in standard accounting notation. `AccountingForm[expr, n]` prints with numbers given to n-digit precision. Examples [#examples] Display a number in accounting form: ```wolfram AccountingForm[1234567.89] (* 1,234,567.89 *) ``` Display negative numbers with parentheses: ```wolfram AccountingForm[-1234.56] (* (1,234.56) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AccountingForm.html) for more details. # Annotation ```wolfram Annotation[expr_, data_] ``` represents an expression `expr` annotated with `data`. This kind of annotation is not visible on output ```wolfram a = Table[Annotation[i, PrimeQ[i]], {i, 20}] ``` in the evaluated cell annotations are not visible: ```wolfram {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} ``` Now find annotated data from the raw data of a symbol `a` ```wolfram Cases[a, Annotation[_, True]] ``` ```wolfram {2,3,5,7,11,13,17,19} ``` Another use-case with graphs ```wolfram Annotation[item_, key_->value_] ``` associates key-value pairs with items in objects such as [Graph](https://reference.wolfram.com/language/ref/Graph.html), [MeshRegion](https://reference.wolfram.com/language/ref/MeshRegion.html) etc. For example ```wolfram Graph[{Annotation[1 <-> 2, EdgeLabels -> "hello"], 2 <-> 3, 3 <-> 1}] ``` ``` (*VB[*)(Graph[{1, 2, 3}, {UndirectedEdge[1, 2], UndirectedEdge[2, 3], UndirectedEdge[3, 1]}, {EdgeLabels -> {UndirectedEdge[1, 2] -> "hello"}}])(*,*)(*"1:eJy9UzFLAzEUvmqrthUE/4G/wUkQDrXWCkVLr4NrvHvXhqZNSa6115/g7KKD4CIiuLp2VXBwd1AoiOLi4qyXXHNy12t1EN/wSPJeXr5833tL+7RsJzRN40nPFSix7Cmxm/PcFkOtGja5fyLiRcwdOxnayVjacznMwHRwB/xys57bbSETOy6zpT3r9rSICFdoA1uWNtCDMNOkPemRB8M7WT3juTXG6EENkMWHFzXNT02p4KQ67KK499K7fuuzj09hj/1IPHN4WlxxL1eHxd91dlNavDsbHEXhJRQDHl9uETpAsMQS8FSBrmMIUDUghEaeOZcwHvpsRj5zr/v1sp7bbqAqGCYiYEUuKaJiGCu3CUg064iD4bgEjAla/heZV35cZ1kfcH8imX8AaES93wP6sb/ju/jkWNitWrwOhRTkb1pVyFPWGDssMd0zfoiCj+Qwr4PIEydKASVADMGhfEXQhO4O5SvCRvlKxcsgG1EoKX6OnIrbAr4gpoEhCzuYNhH55iR8gaEGVLBZ5/J8hzYhkjWvpqOELAs3q+Py0sEU4R7gbtBDQYJQZ4M2HUYJl52VR4TDFzU3VBs="*)(*]VB*) ``` # ArrangeSummaryBox ```wolfram BoxForm`ArrangeSummaryBox[head_Symbol, interpretation_, icon_Graphics | _Graphics3D | _Image | None, summary_List, Null, opts___] _RowBox ``` A decoration for summarizing internals of any WL expression to a human-readable form A decoration behaves like a single symbol and should contain all covered data. Usually it is applied to the output expression using [MakeBoxes](../Formatting/MakeBoxes) and [StandardForm](../Formatting/StandardForm) representation ```wolfram $icon = Graphics[{Red, Disk[]}]; MyObject /: MakeBoxes[obj : MyObject[asc_Association], StandardForm] := Module[{above, below}, above = { {BoxForm`SummaryItem[{"Name: ", asc["Name"]}]}, {BoxForm`SummaryItem[{"Variables: ", asc["Variables"]}], BoxForm`SummaryItem[{"Length: ", asc["Length"]}]} }; BoxForm`ArrangeSummaryBox[ MyObject, (* head *) obj, (* interpretation *) $icon, (* icon, use None if not needed *) (* above and below must be in a format suitable for Grid or Column *) above, (* always shown content *) Null (* expandable content. Currently not supported!*) ] ]; ``` where `$icon` can be any [Image](../Image/Image) or [Graphics](../Graphics/Graphics) or [Graphics3D](../Graphics3D/Graphics3D) or other arbitrary [WLJS Function](frontend/Advanced/Frontend%20interpretation/WLJS%20Functions) that can output to the DOM. Each line is a ```wolfram BoxForm`SummaryItem[{label_String, expr_}] ``` where `expr` is an expression that will be printed in place Let us test this ```wolfram MyObject[<| "Name" -> "My particular object", "Length" -> 10, "Variables" -> {a,b,c}, "Date" -> Today, MetaInformation -> "more info..." |>] ``` This expression **is still valid for normal coping and evaluating** Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) Options [#options] "Event" [#event] A string identifier used for attaching event listeners to a widget. Since this is a wrapper over [ViewBox](../Formatting/Low-level/ViewBox) and `RowBox`, see more on its page. # BarLegend Represents bar-type legend ```wolfram BarLegend[cf_ColorFunction | cf_String] ``` ```wolfram BarLegend[{cf_, {min, max}}] ``` where `cf` is a color function (named or provided explicitly) Examples [#examples] Named colors ```wolfram BarLegend[{"Rainbow", {0,1}}] ``` Using `Hue` ```wolfram BarLegend[{Hue, {0, 1}}] ``` Implicit usage [#implicit-usage] Automatically generated and wrapped into [Legended](../Formatting/Legended) ```wolfram ContourPlot[Sin[x y], {x, 0, \[Pi]}, {y, 0, \[Pi]}, Contours -> 5, PlotLegends -> Automatic] ``` # BaseForm `BaseForm[expr, n]` prints with the numbers in expr given in base n. Examples [#examples] Display a number in binary: ```wolfram BaseForm[255, 2] (* 11111111₂ *) ``` Display in hexadecimal: ```wolfram BaseForm[255, 16] (* ff₁₆ *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BaseForm.html) for more details. # Because `Because[x, y]` displays as x ∵ y. Examples [#examples] Display with "because" symbol: ```wolfram Because[a, b] (* a ∵ b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Because.html) for more details. # Bra the same as [Ket](../Formatting/Ket) Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Column ```wolfram Column[{object1, object2, ...}] ``` shows the list of any Wolfram Expressions in a single column acting as a decoration * spawns a normal WL editor for each row of a column * editable Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # DecimalForm `DecimalForm[expr]` prints with approximate real numbers in expr always given in decimal form, without scientific notation. `DecimalForm[expr, n]` prints with approximate real numbers given in decimal form to n-digit precision. `DecimalForm[expr, {n, f}]` prints with approximate real numbers having n digits, with f digits to the right of the decimal point. Examples [#examples] Display a number in decimal form: ```wolfram DecimalForm[1.23456789*^-5, 10] (* 0.0000123457 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DecimalForm.html) for more details. # EngineeringForm `EngineeringForm[expr]` prints with all real numbers in expr given in engineering notation. `EngineeringForm[expr, n]` prints with numbers given to n-digit precision. Examples [#examples] Display number in engineering notation: ```wolfram EngineeringForm[12345.6789] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EngineeringForm.html) for more details. # Framed Acts like a [Style](../Formatting/Style) box, but wrapped into a frame ```wolfram Framed[expr_, opts__] ``` The argument `opts` contains directives for the formatted output. The following options are supported * `Background->RGBColor[...]` adds background to the wrapped expression Styling options are currently quite limited Example [#example] Highlight prime numbers in the list ```wolfram Table[If[PrimeQ[i], Framed[i, Background->Yellow], i], {i, 1, 100}] ``` Or this neat example from Wolfram Research ```wolfram NestList[Framed, x, 6] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Grid Spawns a grid of WL editors with an arbitrary objects inside ```wolfram Grid[Table[x, {4}, {7}]] ``` Options [#options] Dividers [#dividers] it has to be explicitly set ```wolfram Grid[Table[x, {3}, {7}], Dividers -> {{False, False, True}, {False, True}}] ``` ``` (*GB[*){{x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x}(*||*),(*||*){x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x}(*||*),(*||*){x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x(*|*),(*|*)x}}(*||*)(*1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5BwL8pMccqvSGOCSQeV5qQW8yNkXDLLMlNSi4oRKnwyi0tQ1QeDTHLOzynNzStOY0ZWV8wKZLgl5hSnIrFAkiFFpalohoAZ+eVoNmHRBwA5XS0Q*)(*]GB*) ``` Modifiers [#modifiers] * [`Item`](../Formatting/Item) `Item` being placed inside `Grid` modifies the outer container ```wolfram a = {{1, 2}, {3, 4}}; Grid[KroneckerProduct[IdentityMatrix[5], a]] /. {0 -> 0, x_?NumberQ -> Item[x, Background -> Orange]} ``` ``` (*GB[*){{1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)}}(*]GB*) ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Highlighted ```wolfram Highlighted[expr_, effect_] ``` highlights given expression ```wolfram Highlighted[expr_, effect_] ``` applies `effect` on expression `effect` is not supported for now Examples [#examples] Highlight with yellow color ```wolfram Highlighted[4] ``` ``` (*BB[*)(4)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWnMIB4HkHArSsxNdcqvSGOCyQeV5qQWCwAZLqlpiaU5JU6JxanBJZU5qcEgQY/M9IwcIC5JTfHMKygtQdPHA2QElxRlFvjngaWLWUF2JOYUp6Ip5ILZDTYaLO6Xn5cKANJHKvA="*)(*]BB*) ``` # HornerForm `HornerForm[poly]` puts the polynomial poly in Horner form for efficient numerical evaluation. `HornerForm[poly, vars]` uses the specified variables. Examples [#examples] Convert polynomial to Horner form: ```wolfram HornerForm[1 + x + x^2 + x^3] (* 1 + x (1 + x (1 + x)) *) ``` Multivariate: ```wolfram HornerForm[a + b x + c x^2, x] (* a + x (b + c x) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HornerForm.html) for more details. # Iconize compresses any arbitrary `expr` into an icon (encoded as base64 gzip string or a file) ```wolfram Iconize[expr_, opts___] _ ``` If an expression exceeds `30000` bytes, it will be serialized to a local file in the subdirectory of the notebook `.iconized`. Available from the context menu Options [#options] "Label" [#label] Specifies a label for an icon. Accepts only `_String` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Indexed ```wolfram Indexed[expr_, i_] ``` represents the component of `expr` with index `i` and formats as expected in traditional form. ```wolfram Indexed[expr_, {i_, j_, ...}] ``` For example ```wolfram Indexed[x, {1,2}] ``` ``` (*TB[*)Indexed[(*|*)x(*|*), {(*|*)1,2(*|*)}](*|*)(*1:eJxTTMoPSmMAgmIuIOGZl5JakZrilF8BAECTBhI=*)(*]TB*) ``` If `expr` represents a `List`, a corresponding `Part` of this list will be taken # Infix `Infix[f[e1, e2, ...]]` prints with f in default infix form: e1~~f~~e2~~f~~e3.... `Infix[expr, h]` prints with arguments separated by h. Examples [#examples] Default infix form: ```wolfram Infix[f[a, b, c]] (* a ~f~ b ~f~ c *) ``` Custom separator: ```wolfram Infix[Plus[a, b, c], " + "] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Infix.html) for more details. # InputForm ```wolfram InputForm[expr_] ``` reveals true form of a given expression avoiding any transformations. It is one-dimensional output, suitable to be typed as lines of Wolfram Language input. Standard output form of WLJS notebook output cells is decorated `InputForm` For example: ```wolfram Red Red // InputForm ``` ```wolfram RGBColor[1, 0, 0] ``` or as an input string: ```wolfram ToString[Red, InputForm] ``` ```wolfram "RGBColor[1, 0, 0]" ``` # Interpretation Make a formatting structure whose interpretation is not based on its appearance ```wolfram Interpretation[display_, expr_] ``` where `display` will be shown in the output cell, instead of `expr`, keeping `expr` for the evaluation. By the default [Interpretation](../Formatting/Interpretation) applies `MakeBoxes` with [StandardForm](../Formatting/StandardForm) to `display` expression before printing it to an output cell Example [#example] Have a look at the following example ```wolfram Interpretation[Red, 1] ``` ``` (*VB[*)(1)(*,*)(*"1:eJxTTMoPSmNiYGAo5gISrimZJflFYZmp5cFdQK6GVphTtJamRpC7k3N+Tn5RtKGOggEQxWpqaOkAxbWUDK1SvSpCQnzzA4Jz/TIj3R3zTdNDgyOjcgtMg80KKtNy3DKDI0yDkl2LA5088kwCnAP93BMDAxxTA509vIyTi80DKoMtCiPTnV1c9KMCndJ9XfIcXR1NMkMDgtJtbZVAdsSGOWlpQpzIAiSCSnNSgzlAjNTEFP+8nEqwaEhRaSoAIuc3cA=="*)(*]VB*) + 1 ``` ```wolfram 2 ``` You can create custom output form for certain symbols: ``` vec2 /: MakeBoxes[v: vec2[x_,y_], StandardForm] := With[{i = Interpretation[Row[{Hue[(*SpB[*)Power[Sin[x](*|*),(*|*)2](*]SpB*)], Hue[(*SpB[*)Power[Sin[y](*|*),(*|*)2](*]SpB*)]}]//Panel, v]}, MakeBoxes[i, StandardForm] ] ``` Now if we evaluate this: ```wolfram vec2[0.4,0.2] ``` ``` (*VB[*)(vec2[0.4, 0.2])(*,*)(*"1:eJy1kcFugkAURWnTRdO/qCtEU0EZlCZdDMhIbbTAoAjGBepIUUAUiVDrt/ZXitqk6aa7bu67977FO8m7n66NxTVFUcldIcrc3623Q5/s8ecVRdGMJI2ZMq25EQnGNNM5pcOBZobnWk3JmH3gACfwgsCDRl3guWZjUqaZarFlStwj6Wam2VtrOOz7dgeugTfAthPGAAtxvgiQj0fAmCmJLqkRr8l6v+PqGiS6rHYbs6Sp5bi1sT253a45CLU4K67kxsJKNGQhD0LoLrL+W+l0azKUTuODKVfP+huRbYi8IAK2LootAJo8EP4LUjbRFKFV+30XtA3DsyGMaspy9fQDeTwWplOYvxFmGA5GwHFW8QZHFQlbTmUUIdfee/KQ9xTHdaxUwGGcXQAzsycHL27YJS4U1S70sYyjPvZYpbcUTQU96zJUwQax7DeKVBBc/n5TiJEGBN+eDHHnr1GQn1tzm5Iv+HGbcQ=="*)(*]VB*) ``` ``` (*VB[*)(vec2[0.4, 0.2])(*,*)(*"1:eJy1kcFugkAURWnTRdO/qCtEU0EZlCZdDMhIbbTAoAjGBepIUUAUiVDrt/ZXitqk6aa7bu67977FO8m7n66NxTVFUcldIcrc3623Q5/s8ecVRdGMJI2ZMq25EQnGNNM5pcOBZobnWk3JmH3gACfwgsCDRl3guWZjUqaZarFlStwj6Wam2VtrOOz7dgeugTfAthPGAAtxvgiQj0fAmCmJLqkRr8l6v+PqGiS6rHYbs6Sp5bi1sT253a45CLU4K67kxsJKNGQhD0LoLrL+W+l0azKUTuODKVfP+huRbYi8IAK2LootAJo8EP4LUjbRFKFV+30XtA3DsyGMaspy9fQDeTwWplOYvxFmGA5GwHFW8QZHFQlbTmUUIdfee/KQ9xTHdaxUwGGcXQAzsycHL27YJS4U1S70sYyjPvZYpbcUTQU96zJUwQax7DeKVBBc/n5TiJEGBN+eDHHnr1GQn1tzm5Iv+HGbcQ=="*)(*]VB*)[[1]] ``` ```wolfram 0.4 ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Invisible ```wolfram Invisible[expr_] ``` makes an expression invisible, but keeps the space occupied For example ```wolfram Framed[Invisible[Integrate[f[x], {x, -\[Pi]/2, \[Pi]/2}]]] ``` ``` (*BB[*)((*BB[*)((*TB[*)Integrate[(*|*)f[x](*|*), {(*|*)x(*|*),(*|*)-(*FB[*)((\[Pi])(*,*)/(*,*)(2))(*]FB*)(*|*),(*|*)(*FB[*)((\[Pi])(*,*)/(*,*)(2))(*]FB*)(*|*)}](*|*)(*1:eJxTTMoPSmNiYGAo5gESnnklqelFiSWpTvkVmYwgURYgEVJUmgoAvmMJeQ==*)(*]TB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkAguqcxJdcqvgIiA5INKc1KLeUBSGfnlzvl5Jal5JcXFrEABt8Sc4lRsCkuKMgv88zzzCkpLEAoBE0ocRw=="*)(*]BB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5BwK0rMTXXKr0hjgskHleakFvMAGcElRZkF/nmeeQWlJcWsILWJOcWpAG8uEdg="*)(*]BB*) ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Item ```wolfram Item[expr_, opts___] ``` represents an item within constructs such [Grid](../Formatting/Grid) It modifies on outer container applying custom styles specified in `opts` ```wolfram Grid[{{Item[a, Frame -> True], b}, {c, d}}] ``` ``` (*GB[*){{a(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUotZgQy3osTcVLBQSFFpKpoCHiAjuKQos8A/zzOvoLQEoiMxpzgVAMnhGG0="*)(*]VB*)(*|*),(*|*)b}(*||*),(*||*){c(*|*),(*|*)d}}(*]GB*) ``` Another example ```wolfram a = {{1, 2}, {3, 4}}; Grid[KroneckerProduct[IdentityMatrix[5], a]] /. {0 -> 0, x_?NumberQ -> Item[x, Background -> Orange]} ``` ``` (*GB[*){{1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)0(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)1(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)2(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)}(*||*),(*||*){0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)0(*|*),(*|*)3(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)(*|*),(*|*)4(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZFoRAxg8sM8EUWgm8AAZwSVFmQX+eZ55BaUlxaxAAbfEnOJUABnOHpI="*)(*]VB*)}}(*]GB*) ``` Options [#options] The same as for [Style](../Graphics/Style) # Ket represents ket-vector from Quantum Mechanics ```wolfram Ket[any__] ``` which comes with built-in decoration There is no predefined rules for such expressions. # Labeled ```wolfram Labeled[expr_, lbl_, pos_:Bottom] ``` displays `expr` labeled with `lbl` at `pos` Options [#options] The same as for [Style](../Formatting/Style) Examples [#examples] Simple box with a label centered at the bottom ```wolfram Labeled[Framed[{a, b, c, d}], lbl] ``` ``` (*GB[*){{(*BB[*)((*BB[*)({a,b,c,d})(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5BwK0rMTXXKr0hjgskHleakFvMAGcElRZkF/nmeeQWlJcWsILWJOcWpAG8uEdg="*)(*]BB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwT0vLyU9MSWOCCQQk5qU65VdABEDqg0pzUos5gQzHnMz0vNzUvBKEnE9mcUkxG5DhDBROLSrmADKdEotTczLzUtFMEECSCsgvzizJzM9DUQ8Ap40nag=="*)(*]BB*)(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwLEnNdcqvSGOCSQeV5qQWCwAZLqlpiaU5JU6JxanBJZU5qcEg5T6JSak5qSkAy0sTkQ=="*)(*]VB*)}(*||*),(*||*){lbl(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwLEnNdcqvSGOCSQeV5qQWCwAZLqlpiaU5JU6JxanBJZU5qcE8QEGfxKTUnNQUMAUAMtsVdg=="*)(*]VB*)}}(*]GB*) ``` Label at the right ```wolfram Labeled[Framed[{a, b, c, d}], lbl, Right] ``` ``` (*GB[*){{(*BB[*)((*BB[*)({a,b,c,d})(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5BwK0rMTXXKr0hjgskHleakFvMAGcElRZkF/nmeeQWlJcWsILWJOcWpAG8uEdg="*)(*]BB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwT0vLyU9MSWOCCQQk5qU65VdABEDqg0pzUos5gQzHnMz0vNzUvBKEnE9mcUkxG5DhDBROLSrmADKdEotTczLzUtFMEECSCsgvzizJzM9DUQ8Ap40nag=="*)(*]BB*)(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwLEnNdcqvSGOCSQeV5qQWCwAZLqlpiaU5JU6JxanBJZU5qcEg5T6JSak5qSkAy0sTkQ=="*)(*]VB*)(*|*),(*|*)lbl(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5DwLEnNdcqvSGOCSQeV5qQWCwAZLqlpiaU5JU6JxanBJZU5qcE8QEGfxKTUnNQUMAUAMtsVdg=="*)(*]VB*)}}(*]GB*) ``` Dynamic example with [InputButton](../GUI/InputButton) ```wolfram Module[{radius = 10.0}, Labeled[Graphics[Disk[{0,0}, radius // Offload], TransitionDuration->500, ImagePadding->None ], EventHandler[InputButton["Collapse/Expand"], Function[state, radius = 1.0/radius]], Background->Yellow] ] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Legended Attaches legend or label to any `expr` ```wolfram Legended[expr_, lbl_ | legend_] ``` One can use it to provide legend entries for specific elements ```wolfram PieChart[{1, Legended[2, "Bob"], 3, Legended[4, "John"]}] ``` Add a legend to a table of numbers ```wolfram Legended[ Grid[Partition[ Table[If[PrimeQ[n], Item[n, Background -> LightBlue], n], {n, 100}], 10], Frame -> All], SwatchLegend[{LightBlue}, {"prime numbers"}]] ``` `Legended` is used implicitly with provided options `PlotLegends` ```wolfram Plot[{BesselJ[2, x], BesselJ[3, x]}, {x, 0, 20}, PlotLegends -> Placed["Expressions", {Right, Top}]] ``` Legend placement [#legend-placement] Use [Placed](../Formatting/Placed) to adjust the position of your legend, i.e. ```wolfram Legended[1/2, Placed[SwatchLegend[{Red}, {"Number"}], Before]] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # LineLegend Similar to [SwatchLegend](../Formatting/SwatchLegend), but renders as lines # Magnify ```wolfram Magnify[expr_, scale_:GoldenRatio] ``` literally magnifies any expression by `scale` ```wolfram Magnify[x, 5] ``` ``` (*BB[*)(x)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkAguqcxJdcqvgIiA5INKc1KLeYEM38T0vMy0zOTEksz8PIg8K5AIycxNLc4EsYo5gYRnXkZqUWZJagqaCTxgw4syC/zzPPMKSkvAet0Sc4pTAdw/IZc="*)(*]BB*) ``` It resolves into [Style](../Graphics/Style) boxes on output. # MakeBoxes ```wolfram MakeBoxes[expr_, form_] ``` defines how `expr` is represented in the Wolfram output cells, [output slides](./../Cell-types/Slide), output [WLX cells](./../Cell-types/WLX). The representation is constructed using so-called *boxes* - a wrapper expressions, allowing to decorate or completely alter the visible content of expression. * `MakeBoxes` does not evaluate `expr`. * `form` can be `StandardForm`, `WLXForm`, or any other format represented using boxes. * You can give definitions for `MakeBoxes[expr,form]` to specify your own rules for how expressions should be converted to boxes. * You should define the output form using `TagSet`. `MakeBoxes[expr, StandardForm]` is applied to any visible output of Wolfram cells by default in WLJS Notebook `MakeBoxes[expr, WLXForm]` is applied to any visible output of slides, WLX and markdown cells by default in WLJS Notebook Supported forms [#supported-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) Used together with [#used-together-with] * [BoxBox](../Formatting/Low-level/BoxBox) * [ViewBox](../Formatting/Low-level/ViewBox) * [InterpretationBox](../Formatting/Low-level/InterpretationBox) * [Interpretation](../Formatting/Interpretation) Applications [#applications] It is a core concept of the notebook interface Creating interactive objects [#creating-interactive-objects] Used by [#used-by] * [Graphics](../Graphics/Graphics) * [Graphics3D](../Graphics3D/Graphics3D) * [ListLinePlotly](../Plotly/ListLinePlotly) * [Plotly](../Plotting-Functions/Plotly) * [EventObject](../Misc/Events) * many more All graphics and interactive objects run on <small>WLJS Interpreter</small>, which is a minimal Wolfram Language interpreter running in the browser using JavaScript. It draws graphics and handles user interaction via JS. To explicitly run an expression on the browser's side, you need to define an output representation with [ViewBox](../Formatting/Low-level/ViewBox). An advanced guide on how alter or enchance the displayed expression of a symbol </Cards> For example ```wolfram ... MyJSPlot /: MakeBoxes[m: MyJSPlot[args__], StandardForm] := ViewBox[m, m] ... ``` where ```js .js core.MyJSPlot = async (args, env) => { ....plot the data } ``` If the inner data is large, to avoid editor lags, please compress expressions into a reference using [CreateFrontEndObject](./../Frontend-Objects/CreateFrontEndObject), i.e.: ```wolfram MyJSPlot /: MakeBoxes[m: MyJSPlot[args__], StandardForm] := With[{ b = CreateFrontEndObject[m] }, MakeBoxes[b, StandardForm] ] ``` Styling symbols [#styling-symbols] Please consider using `StandardForm` for the `form` argument to achieve these effects. **See [ViewBox](../Formatting/Low-level/ViewBox) and [BoxBox](../Formatting/Low-level/BoxBox)** Data preview [#data-preview] You can create a data preview, for example: ```wolfram dataHolder /: MakeBoxes[d:dataHolder[data_], StandardForm] := With[{ display = ListPlot[data, ImageSize->100, Axes->False, ImagePadding->None]//Panel }, InterpretationBox[MakeBoxes[display, StandardForm], d] ] dataHolder /: ListLinePlot[d_dataHolder, opts___] := ListLinePlot[d//First, opts] dataHolder[RandomReal[{-1,1}, 100]] ``` ```wolfram dataHolder[RandomReal[{-1,1}, 100]] // ListLinePLot ``` For just a one-time decoration - use [Interpretation](../Formatting/Interpretation) # MatrixForm ```wolfram MatrixForm[matrix_List] ``` shows the given `matrix` (list of lists) in a traditional form using [Grid](../Formatting/Grid) decoration Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # NumberForm prints with approximate real numbers ```wolfram NumberForm[expr_, n_] ``` or just ```wolfram NumberForm[expr_] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # OverBar `OverBar[expr]` displays with a bar over expr. Examples [#examples] Display an expression with an overbar: ```wolfram OverBar[x] ``` Denote complex conjugate: ```wolfram OverBar[z] == Conjugate[z] ``` In mathematical notation: ```wolfram OverBar[a + b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OverBar.html) for more details. # OverHat `OverHat[expr]` displays with a hat over expr. Examples [#examples] Display a variable with a hat: ```wolfram OverHat[x] (* x̂ *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OverHat.html) for more details. # OverTilde `OverTilde[expr]` displays with a tilde over expr. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OverTilde.html) for more details. # OverVector `OverVector[expr]` displays with a right vector over expr. Examples [#examples] ```wolfram OverVector[v] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OverVector.html) for more details. # Overscript `Overscript[x, y]` is an object that formats as x with y as an overscript. Examples [#examples] ```wolfram Overscript[a, "~"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Overscript.html) for more details. # PaddedForm `PaddedForm[expr, n]` prints with all numbers in expr padded to leave room for a total of n digits. * `PaddedForm[expr, {n, f}]` prints with approximate real numbers having exactly f digits to the right of the decimal point. Examples [#examples] Pad to 6 digits: ```wolfram PaddedForm[3.14, 6] ``` With decimal places: ```wolfram PaddedForm[Pi, {10, 5}] ``` Format table: ```wolfram Column[PaddedForm[#, {6, 2}] & /@ {1.5, 12.75, 123.456}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PaddedForm.html) for more details. # Pane ```wolfram Pane[expr_] ``` displays as a pane containing `expr`. ```wolfram Pane[expr_, w_] ``` ```wolfram Pane[expr_, {w_, h_}] ``` displays with a given container size. Methods [#methods] EventHandler [#eventhandler] It supports `Click` event ```wolfram EventHandler[Pane["Click on me"], {"Click" -> Print}] ``` Options [#options] ImageSize [#imagesize] The effect is the same as if `{w_, h_}` or `w` were specified as a second argument. Background [#background] Specifies the background color Examples [#examples] ```wolfram Pane[50!, 200] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Panel ```wolfram Panel[expr_] ``` ```wolfram Panel[expr_, titleLabel_, pos_:Top] ``` displays as a panel containing `expr` and provides a title at the top. Methods [#methods] EventHandler [#eventhandler] It supports `Click` event ```wolfram EventHandler[Panel["Click on me"], {"Click" -> Print}] ``` Options [#options] ImageSize [#imagesize] The effect is the same as if `{w_, h_}` or `w` were specified as a second argument. FrameMargins [#framemargins] Sets a margin to the content in *1/10 rem* Background [#background] Specifies the background color Examples [#examples] ```wolfram Panel[i = InputRange[0,1,0.1], Style["My slider", 10]] ``` Common issues [#common-issues] By the default it shows [StandardForm](../Formatting/StandardForm) of expression passed as `titleLabel`. For string it will print double quotes as well. To remove them apply [Style](../Graphics/Style) ```wolfram Panel[123, Style["Title", 10]] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) limited # PercentForm `PercentForm[expr]` prints with numbers in expr given as percentages. `PercentForm[expr,n]` prints with approximate real numbers in expr given as percentages to n-digit precision. Examples [#examples] Display a number as a percentage: ```wolfram PercentForm[0.25] (* 25.% *) PercentForm[1/3, 3] (* 33.3% *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PercentForm.html) for more details. # Placed A special symbol used across formatting, plotting functions in Wolfram Language ```wolfram Placed[feature_, position_] ``` where `position` can be ```wolfram Before | After | {x, y} | {Left, Top} | ... ``` where `x,y` are scaled coordinates. Use cases [#use-cases] Legended [#legended] ```wolfram Legended[Disk[]//Graphics, Placed[SwatchLegend[{Red}, {"Mark"}], Before]] ``` ```wolfram Legended[Disk[]//Graphics, Placed[SwatchLegend[{Red}, {"Mark"}], After]] ``` Or using scaled coordinates ```wolfram Legended[Disk[]//Graphics, Placed[SwatchLegend[{Red}, {"Mark"}], {0.5,0.5}]] ``` Plot [#plot] In the most plotting function you can use this wrapper to place your generated legend ```wolfram Plot[ {x,x^2}, {x,0,1}, PlotLegends->Placed[SwatchLegend[Automatic], {0.2,0.2}] ] ``` # PointLegend Similar to [SwatchLegend](../Formatting/SwatchLegend), but renders as points # Postfix `Postfix[f[expr]]` prints with f\[expr] given in default postfix form: expr//f. `Postfix[f[expr],h]` prints as exprh. Examples [#examples] Display a function call in postfix form: ```wolfram Postfix[f[x]] (* x // f *) ``` Use a custom separator: ```wolfram Postfix[f[x], "@"] (* x@f *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Postfix.html) for more details. # Prefix `Prefix[f[expr]]` prints with `f[expr]` given in default prefix form: `f @ expr`. * `Prefix[f[expr], h]` prints as `h @ expr`. Examples [#examples] ```wolfram Prefix[f[x]] ``` ```wolfram f @ x ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Prefix.html) for more details. # Quantity ```wolfram Quantity[size_, unit_String] ``` represents a quantity with `size` magnitude and unit specified by `unit`. Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Rotate ```wolfram Rotate[expr_, angle_Real] ``` rotates an expression (literally!), try ```wolfram Rotate[x+y, 45Degree] ``` ``` (*BB[*)(x+y)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5Kdh43EAiKL8ksSQzP88pv6JIQtcl5LfiS3sAg3IPAA=="*)(*]BB*) ``` See `Rotate` in other contexts - [Rotate](../Graphics/Rotate) used for graphics primitives Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Row ```wolfram Row[{object1, object2, ...}] ``` shows the list of any Wolfram Expressions in a row acting as a decoration Or using it on slides with [WLX](frontend/Cell-types/WLX) ```wolfram title="cell 1" Figure = Plot[x, {x,0,1}]; Editor = EditorView["Plot[x, {x,0,1}] -> "]; ``` ```html title="cell 2" .slide <Row> <Editor/> <Figure/> </Row> ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Spacer ```wolfram Spacer[pts_Integer] ``` ```wolfram Spacer[{w_Integer, h_Integer}] ``` displays a blank space in printer-points (*\~1/10.0 of 1 rem*) ```wolfram Framed[Row[{x, Spacer[20], y}]] ``` ``` (*BB[*)((*GB[*){{x(*|*),(*|*)(*VB[*)(Spacer[20])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeJ5AILkhMTi1yyq/IFAHyALIcCJE="*)(*]VB*)(*|*),(*|*)y}}(*]GB*))(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5BwK0rMTXXKr0hjgskHleakFvMAGcElRZkF/nmeeQWlJcWsILWJOcWpAG8uEdg="*)(*]BB*) ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Squiggled Underlines text or expression ```wolfram Squiggled[expr_, color_:Lighter[Red]] ``` It resolves into a subset of [Style](../Graphics/Style) Example ```wolfram Style[If[!DictionaryWordQ[#], Squiggled[#], #], 14] & /@ TextWords[ExampleData[{"Text", "TheRaven"}]][[;; 45]] ``` ``` {(*BB[*)("Once")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("upon")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("a")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("midnight")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("dreary")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("while")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("I")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("pondered")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("weak")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("and")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("weary")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("Over")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("many")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("a")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("quaint")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("and")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("curious")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("volume")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("of")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("forgotten")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("lore")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("While")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("I")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("nodded")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("nearly")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("napping")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("suddenly")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("there")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("came")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("a")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("tapping")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("As")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("of")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("some")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("one")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("gently")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("rapping")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("rapping")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("at")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("my")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("chamber")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("door")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("'Tis")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwJRxgkkgkuKMvPSnfIrMvmAPIg4SFVQaU5qMReQEZqXklqUk5mXmpLGDJLkAEm6Oznn5+QXZTLC9YCFE0FWJeaAhTOZiZKD2RXMBncMWCykqDQVAMXxLCI="*)(*]BB*),(*BB[*)("some")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*),(*BB[*)("visitor")(*,*)(*"1:eJxTTMoPSmNiYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCRYg4ZGfkwLhcQKJ4JKizLx0p/yKTD4gD6IdpCqoNCc1mA2uACwWUlSaCgCn0xcV"*)(*]BB*)} ``` # StandardForm A standard form for representing math, colors, dates, graphics, which comes with visual decorations **This is a default representation** used in output cells. You can apply it to expressions before using in [EditorView](../GUI/EditorView) and [InputEditor](../GUI/InputEditor) and [CellPrint](../Cells-and-Notebook/CellPrint) and [Interpretation](./Interpretation) `StandardForm` is a decorated `InputForm` in WLJS Notebook # Style Styling box used as a decoration for an arbitrary Wolfram Expressions ```wolfram Style[expr_, opts__] ``` Expressions are editable The argument `opts` contains directives for the formatted output. Options [#options] * `Background` * `FontFamily` * `FontSize` Directives [#directives] * `_Integer` font size * `_RGBColor` font color * `Bold` * `Italic` Example [#example] ```wolfram Style[1, Background->Yellow] ``` For string options are much richer ```wolfram Style["ddd", Background->LightBlue, FontFamily->"Monospace", Bold, Red, Italic, 20] ``` Hamlet's soliloquy, with repeated words successively has more contrast background ```wolfram With[{data = ExampleData[{"Text", "ToBeOrNotToBe"}, "Words"]}, Take[MapIndexed[Style[#, 4 Count[Take[data, First[#2]], #]] &, data], 100] ] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # Subscript `Subscript[x, y]` is an object that formats as x with subscript y. `Subscript[x, y1, y2, ...]` formats with multiple subscripts. Examples [#examples] Create a subscript: ```wolfram Subscript[x, 1] (* x₁ *) ``` Multiple subscripts: ```wolfram Subscript[a, i, j] (* aᵢⱼ *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subscript.html) for more details. # SuchThat `SuchThat[x,y]` displays as x∍y. Examples [#examples] Display the SuchThat operator: ```wolfram SuchThat[x, x > 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SuchThat.html) for more details. # SwatchLegend Represents swatch-type legend ```wolfram SwatchLegend[colors_List, labels_List] ``` where `labels` can be any Wolfram Expression Examples [#examples] Manual [#manual] Define firstly ```wolfram legend = SwatchLegend[{Red, Green, Blue}, {1,2,3}] ``` and place it to an existing plot ```wolfram Plot[{x, x^2, x^3}, {x,0,1}, PlotStyle->{Red, Green, Blue}, PlotLegends->legend] ``` Automatic [#automatic] Let it determine colors or expressions automatically ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 5}, PlotLegends -> SwatchLegend["Expressions"]] ``` # TabView ```wolfram TabView[{lbl1->expr1, lbl2->expr2, ...}, default_Integer:1] ``` represents an object in which clicking the tab with label `lbli` displays `expri` ```wolfram TabView[{expr1, expr2, ...}, default_Integer:1] ``` It prerenders all expressions and swaps between them in the display widget. Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # TableForm ```wolfram TableForm[table_List, opts___] ``` shows the given `table` (list) in a traditional form using [Grid](../Formatting/Grid) decoration For large formatted table, please see [TableView](../GUI/TableView). It supports lazy loading and is much faster Options [#options] TableHeading [#tableheading] Modifiers [#modifiers] See [Item](../Formatting/Item) Examples [#examples] A fully formatted table ```wolfram TableForm[{{5, Item[7, Background->Yellow]}, {4, 2}, {10, 3}}, TableHeadings -> {{"Group A", "Group B", "Group C"}, {"y1", "y2"}}] ``` ``` (*GB[*){{(*BB[*)()(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFouApDLyy4NLijLz0p0zEosSk0tSi4qLWYESbok5xakAImsVPw=="*)(*]BB*)(*|*),(*|*)"y1"(*|*),(*|*)"y2"}(*||*),(*||*){"Group A"(*|*),(*|*)5(*|*),(*|*)7(*VB[*)(**)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB47kPAsSc11yq+ACICkg0pzUou5gAynxOTs9KL80ryUNGaQJAdI0t3JOT8nvygTZBqEAGIGNN08QEZwSVFmgX+eZ15BaUkxK1DALTGnOBUAl00daw=="*)(*]VB*)}(*||*),(*||*){"Group B"(*|*),(*|*)4(*|*),(*|*)2}(*||*),(*||*){"Group C"(*|*),(*|*)10(*|*),(*|*)3}}(*||*)(*1:eJxTTMoPSmNkYGAoZgESHvk5KRAeO5BwL8pMccqvSGOCSQeV5qQW8yNkXDLLMlNSi4oRKnwyi0tQ1QeDTHLOzynNzStOY0FWV8wKZLgl5hSngoVCikpTES5BUwBnoRkOZuSXU8NkAKaJOTA=*)(*]GB*) ``` # TeXForm Exports an expression to TeX format ```wolfram TeXForm[expr_] ``` Examples [#examples] ```wolfram Series[Sin[x], {x,0,5}] // Normal // TeXForm ``` ```wolfram title="output" "\\frac{x^5}{120}-\\frac{x^3}{6}+x" ``` One can directly render it using built-in LaTeX support in [Markdown](./../Cell-types/Markdown) cells or [LaTeX cells](./../Cell-types/Misc). Or alternatively via `CellView` ```wolfram CellView[StringJoin[ TeXForm[Series[Sin[x], {x,0,7}] // Normal] ], "Display"->"latex"] ``` Back-conversion [#back-conversion] Using `ToExpression` one can parse TeX to Wolfram Language ```wolfram ToExpression["\\frac{x^5}{120}-\\frac{x^3}{6}+x", TeXForm] ``` # Tooltip ```wolfram Tooltip[expr_, label_] ``` displays `expr` and shows `label` when the pointer hovers over it. `Tooltip` can be used with ordinary formatted expressions and with graphics primitives. Examples [#examples] Basic tooltip [#basic-tooltip] ```wolfram Tooltip[Style["hover me", 18, Blue], "This is a tooltip"] ``` Tooltip with rich label content [#tooltip-with-rich-label-content] ```wolfram Tooltip[ Framed[Style["status", Bold, 14], Background -> LightYellow], Column[{"Server: online", "Latency: 24 ms", Style["OK", Darker[Green]]}] ] ``` Tooltips on graphics objects [#tooltips-on-graphics-objects] ```wolfram Graphics[{ Tooltip[{Red, Disk[{0, 0}, 0.25]}, "center disk"], Tooltip[{Blue, Rectangle[{0.5, -0.2}, {1.1, 0.4}]}, "data block"], Tooltip[{Black, PointSize[0.03], Point[{0.8, 0.8}]}, "marker"] }, PlotRange -> {{-0.4, 1.3}, {-0.4, 1.1}}, Frame -> True] ``` Tooltip in generated plots [#tooltip-in-generated-plots] ```wolfram Plot[{Tooltip[Sin[x], "This is sine"], Tooltip[Cos[x], "This is cosine"]}, {x,0,2Pi}] ``` ```wolfram ListPlot[ Table[Tooltip[{x, Sin[x]}, Row[{"x = ", NumberForm[x, {3, 2}], ", y = ", NumberForm[Sin[x], {3, 2}]}]], {x, 0, 6, 0.3}], PlotStyle -> Red, Joined -> False ] ``` Avoid large number of tooltips on generated data Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) # UnderBar `UnderBar[expr]` displays with a bar under expr. Examples [#examples] Display an expression with an underbar: ```wolfram UnderBar[x] ``` In a mathematical expression: ```wolfram UnderBar[a] + UnderBar[b] ``` Combine with other formatting: ```wolfram Style[UnderBar[expr], Large, Bold] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnderBar.html) for more details. # Underlined `Underlined` represents an underlined font. Examples [#examples] Display underlined text: ```wolfram Style["Important text", Underlined] ``` Combine with other styles: ```wolfram Style["Bold and underlined", Bold, Underlined] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Underlined.html) for more details. # Underscript `Underscript[x, y]` is an object that formats as x with y underneath. Examples [#examples] ```wolfram Underscript[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Underscript.html) for more details. # VerticalBar `VerticalBar[x, y, ...]` displays as x|y|.... Examples [#examples] ```wolfram VerticalBar[a, b, c] (* a|b|c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VerticalBar.html) for more details. # WLXForm A standard form used for representing Wolfram expressions on [slides](./../Cell-types/Slide), [WLX](./../Cell-types/WLX) and [markdown](./../Cell-types/Markdown) cells. The final result must be conveted using `MakeBoxes` **if it is not a string** Example [#example] Depending on where an expression is displayed, one can change its visual representation using [MakeBoxes](../Formatting/MakeBoxes) tagset, i.e. ```wolfram SpecialOne /: MakeBoxes[SpecialOne, StandardForm] := With[{ o = Graphics[{Red, Disk[]}] }, MakeBoxes[o, StandardForm] ] SpecialOne /: MakeBoxes[SpecialOne, WLXForm] := With[{ o = Graphics[{Blue, Disk[]}] }, MakeBoxes[o, WLXForm] ] ``` # Accumulate `Accumulate[list]` gives a list of cumulative sums (running totals) of the elements. Examples [#examples] Compute cumulative sums: ```wolfram Accumulate[{1, 2, 3, 4, 5}] (* {1, 3, 6, 10, 15} *) (* Cumulative product using FoldList *) FoldList[Times, 1, {1, 2, 3, 4}] (* {1, 1, 2, 6, 24} *) (* Verify: Total of Accumulate *) Total[{1, 2, 3, 4}] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Accumulate.html) for more details. # AllTrue `AllTrue[{e1, e2, ...}, test]` yields `True` if `test[ei]` is `True` for all elements. `AllTrue[test]` represents an operator form that can be applied to an expression. Examples [#examples] Check if all elements are positive: ```wolfram AllTrue[{1, 2, 3, 4}, Positive] (* True *) ``` Check if all are even: ```wolfram AllTrue[{2, 4, 5, 8}, EvenQ] (* False *) ``` Using operator form: ```wolfram AllTrue[NumericQ][{1, 2.5, 3}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AllTrue.html) for more details. # AnyMatch `AnyMatch[{e1, e2, ...}, form]` yields `True` if ei matches the pattern form for any of the ei. `AnyMatch[expr, form, level]` tests parts of expr at level level. `AnyMatch[form]` represents an operator form of `AnyMatch` that can be applied to an expression. Examples [#examples] Check if any element matches a pattern: ```wolfram AnyMatch[{1, 2, "a", 3}, _String] (* True *) ``` Using operator form: ```wolfram AnyMatch[_Integer][{1.5, 2.5, 3}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AnyMatch.html) for more details. # AnyTrue `AnyTrue[{e1, e2, ...}, test]` yields `True` if `test[ei]` is `True` for any element. `AnyTrue[test]` represents an operator form that can be applied to an expression. Examples [#examples] Check if any element is negative: ```wolfram AnyTrue[{1, -2, 3, 4}, Negative] (* True *) ``` Check if any is a string: ```wolfram AnyTrue[{1, 2, 3}, StringQ] (* False *) ``` Using operator form: ```wolfram AnyTrue[PrimeQ][{4, 6, 7, 8}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AnyTrue.html) for more details. # Append `Append[expr, elem]` gives expr with elem appended. `Append[elem]` represents an operator form of Append that can be applied to an expression. Examples [#examples] Append an element to a list: ```wolfram Append[{a, b, c}, d] (* {a, b, c, d} *) ``` Using the operator form: ```wolfram Append[x][{1, 2, 3}] (* {1, 2, 3, x} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Append.html) for more details. # AppendTo `AppendTo[x, elem]` appends elem to the value of x, and resets x to the result. Examples [#examples] Append an element to a list: ```wolfram list = {1, 2, 3}; AppendTo[list, 4]; list (* {1, 2, 3, 4} *) ``` Build a list incrementally: ```wolfram result = {}; Do[AppendTo[result, i^2], {i, 5}]; result (* {1, 4, 9, 16, 25} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppendTo.html) for more details. # Apply `f @@ expr` or `Apply[f, expr]` replaces the head of expr by f. `f @@@ expr` or `Apply[f, expr, {1}]` replaces heads at level 1 of expr by f. `Apply[f, expr, levelspec]` replaces heads in parts of expr specified by levelspec. `Apply[f]` represents an operator form of Apply that can be applied to an expression. Examples [#examples] Apply Plus to sum a list: ```wolfram Plus @@ {1, 2, 3, 4} (* 10 *) ``` Apply at level 1: ```wolfram f @@@ {{a, b}, {c, d}} (* {f[a, b], f[c, d]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Apply.html) for more details. # ApplyTo `ApplyTo[x, f]` or `x //= f` computes `f[x]` and resets x to the result. Examples [#examples] Apply a function to a variable in place: ```wolfram x = 5; x //= Sqrt; x (* Sqrt[5] *) ``` Chain operations: ```wolfram list = {3, 1, 4, 1, 5}; list //= Sort; list (* {1, 1, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ApplyTo.html) for more details. # Array `Array[f, n]` generates a list of length n, with elements f\[i]. `Array[f, n, r]` generates a list using the index origin r. `Array[f, {n1, n2, ...}]` generates an n1×n2×... array of nested lists, with elements f\[i1, i2, ...]. Examples [#examples] Generate a simple array: ```wolfram Array[f, 4] (* {f[1], f[2], f[3], f[4]} *) ``` Generate a 2×3 matrix: ```wolfram Array[a, {2, 3}] (* {{a[1,1], a[1,2], a[1,3]}, {a[2,1], a[2,2], a[2,3]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Array.html) for more details. # ArrayComponents `ArrayComponents[array]` gives an array in which all identical elements of array are replaced by an integer index representing the component in which the element lies. `ArrayComponents[array,level]` finds the identical elements at the specified level in array. `ArrayComponents[array,level,rules]` uses a rule or a list of rules for specifying the labels. Examples [#examples] ```wolfram ArrayComponents[{a, b, a, c, b, a}] (* {1, 2, 1, 3, 2, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayComponents.html) for more details. # ArrayDepth `ArrayDepth[expr]` gives the depth to which expr is a full (rectangular) array, with all parts at each level having the same length. Examples [#examples] Depth of a matrix: ```wolfram ArrayDepth[{{1, 2, 3}, {4, 5, 6}}] (* 2 *) ``` Depth of a 3D array: ```wolfram ArrayDepth[{{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}] (* 3 *) ``` Non-rectangular arrays: ```wolfram ArrayDepth[{{1, 2}, {3}}] (* 1 - not rectangular at depth 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayDepth.html) for more details. # ArrayDot `ArrayDot[a, b, k]` computes the product of arrays a and b obtained by summing up products of terms over the last k dimensions of a and the first k dimensions of b. `ArrayDot[a, b, {{s1, t1}, {s2, t2}, ...}]` computes the product over the pairs \{si, ti} of dimensions. Examples [#examples] Compute the dot product over specified dimensions: ```wolfram ArrayDot[{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayDot.html) for more details. # ArrayFilter `ArrayFilter[f, array, r]` applies f to all range-r blocks in the specified array. `ArrayFilter[f, array, {r1, r2, ...}]` applies f to blocks with ranges r1, r2, ... in successive dimensions. Examples [#examples] Apply a mean filter to an array: ```wolfram ArrayFilter[Mean, {1, 2, 3, 4, 5}, 1] (* {3/2, 2, 3, 4, 9/2} *) ``` 2D filtering: ```wolfram ArrayFilter[Max, {{1, 2}, {3, 4}}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayFilter.html) for more details. # ArrayReduce `ArrayReduce[f, array, n]` reduces dimension n of array by applying f. `ArrayReduce[f, array, n1;;n2]` reduces dimensions n1 through n2. `ArrayReduce[f, array, {n1, n2, ...}]` reduces dimensions n1, n2, etc. Examples [#examples] Sum over the first dimension: ```wolfram ArrayReduce[Total, {{1, 2}, {3, 4}}, 1] (* {4, 6} *) ``` Reduce multiple dimensions: ```wolfram ArrayReduce[Max, RandomReal[1, {3, 4, 5}], {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayReduce.html) for more details. # ArrayResample `ArrayResample[array, {n1, n2, ...}]` resamples array to have dimensions \{n1, n2, ...}. `ArrayResample[array, dspec]` resamples array according to the dimension specification dspec. `ArrayResample[array, dspec, scheme]` specifies resampling scheme, either point or bin based. Examples [#examples] Resample an array to a different size: ```wolfram ArrayResample[{1, 4, 9, 16}, 8] (* {1, 2.5, 4, 6.5, 9, 12.5, 16, 16} *) ``` Resample a 2D array: ```wolfram ArrayResample[RandomReal[1, {3, 3}], {6, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayResample.html) for more details. # Arrays `Arrays[{d1, ..., dr}]` represents the domain of arrays of rank r and dimensions di. `Arrays[{d1, ..., dr}, dom]` represents the domain of arrays of dimensions di, with components in the domain dom. `Arrays[{d1, ..., dr}, dom, sym]` represents the subdomain of arrays with dimensions di and symmetry sym. Examples [#examples] Define an array domain: ```wolfram Arrays[{3, 3}] ``` Array domain with integer components: ```wolfram Arrays[{2, 2}, Integers] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Arrays.html) for more details. # AssociateTo `AssociateTo[a, key -> val]` changes the association a by adding the key-value pair key->val. `AssociateTo[a, {key1 -> val1, key2 -> val2, ...}]` adds all key-value pairs keyi->vali. Examples [#examples] Add a key-value pair: ```wolfram a = <|"x" -> 1|>; AssociateTo[a, "y" -> 2] (* <|"x" -> 1, "y" -> 2|> *) ``` Add multiple pairs: ```wolfram AssociateTo[a, {"z" -> 3, "w" -> 4}] (* <|"x" -> 1, "y" -> 2, "z" -> 3, "w" -> 4|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AssociateTo.html) for more details. # Association `Association[key1 -> val1, key2 -> val2, ...]` or `<|key1 -> val1, key2 -> val2, ...|>` represents an association between keys and values. Examples [#examples] Create an association: ```wolfram assoc = <|"a" -> 1, "b" -> 2, "c" -> 3|> ``` Access values by key: ```wolfram assoc["b"] (* 2 *) ``` Get all keys or values: ```wolfram Keys[assoc] (* {"a", "b", "c"} *) Values[assoc] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Association.html) for more details. # AssociationMap `AssociationMap[f, {key1, key2, ...}]` creates the association `<|key1 -> f[key1], key2 -> f[key2], ...|>`. `AssociationMap[f, <|key1 -> val1, key2 -> val2, ...|>]` creates `<|f[key1 -> val1], f[key2 -> val2], ...|>`. Examples [#examples] Map a function to create values: ```wolfram AssociationMap[StringLength, {"cat", "dog", "elephant"}] (* <|"cat" -> 3, "dog" -> 3, "elephant" -> 8|> *) ``` Transform key-value pairs: ```wolfram AssociationMap[Reverse, <|a -> 1, b -> 2|>] (* <|1 -> a, 2 -> b|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AssociationMap.html) for more details. # AssociationQ `AssociationQ[expr]` gives `True` if expr is a valid `Association` object, and `False` otherwise. Examples [#examples] Test for associations: ```wolfram AssociationQ[<|"a" -> 1, "b" -> 2|>] (* True *) ``` ```wolfram AssociationQ[{"a" -> 1}] (* False *) ``` Lists of rules are not associations: ```wolfram AssociationQ[{a -> 1, b -> 2}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AssociationQ.html) for more details. # AssociationThread `AssociationThread[{key1, key2, ...} -> {val1, val2, ...}]` or `AssociationThread[{keys}, {values}]` creates an association pairing corresponding keys and values. Examples [#examples] Create an association from two lists: ```wolfram AssociationThread[{"a", "b", "c"}, {1, 2, 3}] (* <|"a" -> 1, "b" -> 2, "c" -> 3|> *) (* Using rule form *) AssociationThread[{"x", "y"} -> {10, 20}] (* <|"x" -> 10, "y" -> 20|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AssociationThread.html) for more details. # BandpassFilter `BandpassFilter[data, {ω1, ω2}]` applies a bandpass filter with cutoff frequencies ω1 and ω2 to an array of data. `BandpassFilter[data, {{ω, q}}]` uses center frequency ω and quality factor q. `BandpassFilter[data, spec, n]` uses a filter kernel of length n. Examples [#examples] Apply bandpass filter: ```wolfram data = Table[Sin[2 Pi 0.1 t] + Sin[2 Pi 0.4 t], {t, 100}]; BandpassFilter[data, {0.2, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BandpassFilter.html) for more details. # BandstopFilter `BandstopFilter[data, {ω1, ω2}]` applies a bandstop filter with cutoff frequencies ω1 and ω2 to an array of data. `BandstopFilter[data, {{ω, q}}]` uses center frequency ω and quality factor q. `BandstopFilter[data, spec, n]` uses a filter kernel of length n. Examples [#examples] Apply bandstop filter: ```wolfram data = Table[Sin[2 Pi 0.1 t] + Sin[2 Pi 0.4 t], {t, 100}]; BandstopFilter[data, {0.3, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BandstopFilter.html) for more details. # BartlettHannWindow `BartlettHannWindow[x]` represents a Bartlett–Hann window function of x. Examples [#examples] Plot the Bartlett-Hann window: ```wolfram Plot[BartlettHannWindow[x], {x, -1/2, 1/2}] ``` Evaluate at a specific point: ```wolfram BartlettHannWindow[0] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BartlettHannWindow.html) for more details. # BartlettWindow `BartlettWindow[x]` represents a Bartlett window function of x. Examples [#examples] Plot the Bartlett window: ```wolfram Plot[BartlettWindow[x], {x, -1/2, 1/2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BartlettWindow.html) for more details. # BinCounts `BinCounts[data]` counts the number of elements of data whose values lie in successive integer bins. `BinCounts[data, binspec]` counts the number of elements of data whose values lie in successive bins specified by binspec. Examples [#examples] Count integers in default bins: ```wolfram BinCounts[{1, 2, 2, 3, 3, 3}] (* {1, 2, 3} *) ``` Specify bin width: ```wolfram BinCounts[{0.1, 0.5, 1.2, 1.8, 2.5}, 1] (* {2, 2, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinCounts.html) for more details. # BinLists `BinLists[data]` gives lists of the elements of data whose values lie in successive integer bins. `BinLists[data, binspec]` gives lists of the elements of data whose values lie in successive bins specified by binspec. `BinLists[data -> inds, ...]` gives the lists of the labels inds specified by the binning of data. Examples [#examples] Group data by integer bins: ```wolfram BinLists[{1, 2, 2, 3, 3, 3}] (* {{1}, {2, 2}, {3, 3, 3}} *) ``` Custom bin specification: ```wolfram BinLists[{0.5, 1.2, 1.8, 2.5}, {0, 3, 1}] (* {{0.5}, {1.2, 1.8}, {2.5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinLists.html) for more details. # BohmanWindow `BohmanWindow[x]` represents a Bohman window function of x. Examples [#examples] Plot the Bohman window: ```wolfram Plot[BohmanWindow[x], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BohmanWindow.html) for more details. # Cases `Cases[{e1, e2, ...}, pattern]` gives a list of the ei that match the pattern. `Cases[{e1, ...}, pattern -> rhs]` gives a list of the values of rhs corresponding to the ei that match the pattern. `Cases[expr, pattern, levelspec]` gives a list of all parts of expr on levels specified by levelspec that match the pattern. Examples [#examples] Find all integers: ```wolfram Cases[{1, a, 2, b, 3}, _Integer] (* {1, 2, 3} *) ``` Extract matching parts with transformation: ```wolfram Cases[{f[1], g[2], f[3]}, f[x_] -> x] (* {1, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cases.html) for more details. # Catch `Catch[expr]` returns the argument of the first `Throw` generated in the evaluation of expr. `Catch[expr, form]` returns value from the first `Throw[value, tag]` for which form matches tag. Examples [#examples] Catch a thrown value: ```wolfram Catch[Throw["found it"]] (* "found it" *) ``` With tags: ```wolfram Catch[Throw[42, "myTag"], "myTag"] (* 42 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Catch.html) for more details. # Catenate `Catenate[{list1, list2, ...}]` yields a single list with all elements from the listi in order. `Catenate[{assoc1, assoc2, ...}]` yields a list of all values in order appearing in the associations associ. Examples [#examples] Catenate multiple lists: ```wolfram Catenate[{{a, b}, {c, d, e}, {f}}] (* {a, b, c, d, e, f} *) ``` Catenate associations: ```wolfram Catenate[{<|"a" -> 1|>, <|"b" -> 2|>}] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Catenate.html) for more details. # CauchyWindow `CauchyWindow[x]` represents a Cauchy window function of x. `CauchyWindow[x, α]` uses the parameter α. Examples [#examples] ```wolfram CauchyWindow[0.5] (* 0.8 *) ``` ```wolfram Plot[CauchyWindow[x], {x, -1, 1}] (* Graphics[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CauchyWindow.html) for more details. # CenterArray `CenterArray[a, n]` creates a list of length n with the elements of a at the center and zeros elsewhere. `CenterArray[a, {n1, n2, ...}]` creates an n1×n2×... array with the array a at the center and zeros elsewhere. `CenterArray[a, nspec, pad]` uses pad instead of zero for the background. `CenterArray[nspec]` creates an array with a single 1 at the center and zeros elsewhere. Examples [#examples] Center a list in a larger array: ```wolfram CenterArray[{1, 2, 3}, 7] (* {0, 0, 1, 2, 3, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CenterArray.html) for more details. # Commonest `Commonest[list]` gives a list of the elements that are the most common in list. `Commonest[list, n]` gives a list of the n most common elements in list. Examples [#examples] Find the most common element: ```wolfram Commonest[{a, b, a, c, a, b}] (* {a} *) ``` Find the 2 most common: ```wolfram Commonest[{a, b, a, c, a, b, c, c}, 2] (* {a, c} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Commonest.html) for more details. # Complement `Complement[eall, e1, e2, ...]` gives the elements in eall that are not in any of the ei. Examples [#examples] Find elements not in another list: ```wolfram Complement[{a, b, c, d, e}, {b, d}] (* {a, c, e} *) ``` Multiple lists: ```wolfram Complement[{1, 2, 3, 4, 5}, {2, 4}, {3}] (* {1, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Complement.html) for more details. # ComplementedEntityClass `ComplementedEntityClass[classall,class1,…]` represents an entity class containing all the entities in classall that are not in any of the classi. Examples [#examples] Get countries not in Europe: ```wolfram ComplementedEntityClass[EntityClass["Country", "Countries"], EntityClass["Country", "Europe"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplementedEntityClass.html) for more details. # ComposeList `ComposeList[{f1, f2, ...}, x]` generates a list of the form \{x, f1\[x], f2\[f1\[x]], ...}. Examples [#examples] Generate a composition list: ```wolfram ComposeList[{Sin, Cos, Tan}, 0.5] (* {0.5, 0.479426, 0.877583, 1.18678} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComposeList.html) for more details. # ConnesWindow `ConnesWindow[x]` represents a Connes window function of x. `ConnesWindow[x,α]` uses the parameter α. Examples [#examples] ```wolfram ConnesWindow[0.5] (* 0.5625 *) ``` ```wolfram Plot[ConnesWindow[x], {x, -1, 1}] (* Plots the Connes window function *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConnesWindow.html) for more details. # ContainsAll `ContainsAll[list1, list2]` yields True if list1 contains all of the elements of list2. `ContainsAll[list2]` is an operator form that yields True when the object to which it is applied contains all of the elements of list2. Examples [#examples] Check if list contains all elements: ```wolfram ContainsAll[{1, 2, 3, 4, 5}, {2, 4}] (* True *) ``` Missing elements: ```wolfram ContainsAll[{1, 2, 3}, {2, 4}] (* False *) ``` Operator form: ```wolfram ContainsAll[{a, b}][{a, b, c, d}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContainsAll.html) for more details. # ContainsAny `ContainsAny[list1, list2]` yields True if list1 contains any of the elements of list2. `ContainsAny[list2]` is an operator form that yields True when the object to which it is applied contains any of the elements in list2. Examples [#examples] Check for any matching elements: ```wolfram ContainsAny[{1, 2, 3, 4}, {3, 5, 7}] (* True *) ``` No matching elements: ```wolfram ContainsAny[{1, 2, 3}, {4, 5, 6}] (* False *) ``` Operator form: ```wolfram ContainsAny[{x, y}][{a, b, x, c}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContainsAny.html) for more details. # ContainsExactly `ContainsExactly[list1, list2]` yields True if list1 contains exactly the same elements as list2. `ContainsExactly[list2]` is an operator form that yields True when the object to which it is applied contains exactly the same elements as list2. Examples [#examples] Same elements in different order: ```wolfram ContainsExactly[{3, 1, 2}, {1, 2, 3}] (* True *) ``` Different elements: ```wolfram ContainsExactly[{1, 2, 3}, {1, 2, 4}] (* False *) ``` Duplicates are ignored: ```wolfram ContainsExactly[{1, 1, 2}, {1, 2, 2}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContainsExactly.html) for more details. # ContainsNone `ContainsNone[list1, list2]` yields True if list1 contains none of the elements in list2. `ContainsNone[list2]` is an operator form that yields True when the object to which it is applied contains none of the elements of list2. Examples [#examples] No matching elements: ```wolfram ContainsNone[{1, 2, 3}, {4, 5, 6}] (* True *) ``` Some matching elements: ```wolfram ContainsNone[{1, 2, 3}, {3, 4, 5}] (* False *) ``` Operator form: ```wolfram ContainsNone[{x, y}][{a, b, c}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContainsNone.html) for more details. # ContainsOnly `ContainsOnly[list1, list2]` yields `True` if list1 contains only elements that appear in list2. `ContainsOnly[list2]` is an operator form that yields `True` when the object to which it is applied contains only elements that appear in list2. Examples [#examples] Check if a list contains only specified elements: ```wolfram ContainsOnly[{a, b, a}, {a, b, c}] (* True *) ``` ```wolfram ContainsOnly[{a, b, d}, {a, b, c}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContainsOnly.html) for more details. # Count `Count[list, pattern]` gives the number of elements in list that match pattern. Examples [#examples] Count occurrences: ```wolfram Count[{a, b, a, c, a}, a] (* 3 *) ``` With patterns: ```wolfram Count[{1, 2, "a", 3, "b"}, _Integer] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Count.html) for more details. # CountDistinct `CountDistinct[list]` gives the number of distinct elements that appear in list. `CountDistinct[list, test]` applies test to pairs of elements to determine whether they should be considered equivalent. Examples [#examples] Count distinct elements: ```wolfram CountDistinct[{a, b, a, c, a, b}] (* 3 *) ``` With duplicates: ```wolfram CountDistinct[{1, 1, 1, 2, 2, 3}] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CountDistinct.html) for more details. # CountDistinctBy `CountDistinctBy[{e1, e2, ...}, f]` gives the number of distinct values of f\[ei] that occur. `CountDistinctBy[f]` represents an operator form of CountDistinctBy that can be applied to an expression. Examples [#examples] Count distinct values after applying a function: ```wolfram CountDistinctBy[{-3, -2, -1, 1, 2, 3}, Abs] (* 3 *) ``` Count words by length: ```wolfram CountDistinctBy[{"cat", "dog", "bird", "fish"}, StringLength] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CountDistinctBy.html) for more details. # CountryData `CountryData["tag", property]` gives the value of the specified property for the country, country-like entity, or group of countries specified by "tag". `CountryData["tag", {property, ..., dates}]` gives time series for certain economic and other properties. Examples [#examples] Get country population: ```wolfram CountryData["France", "Population"] ``` Get country capital: ```wolfram CountryData["Germany", "Capital"] (* Entity["City", {"Berlin", "Berlin", "Germany"}] *) ``` List all countries: ```wolfram CountryData[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CountryData.html) for more details. # Counts `Counts[list]` gives an association whose keys are the distinct elements and values are their counts. Examples [#examples] Count element occurrences: ```wolfram Counts[{a, b, a, c, b, a}] (* <|a -> 3, b -> 2, c -> 1|> *) ``` Count characters: ```wolfram Counts[Characters["mississippi"]] (* <|"m" -> 1, "i" -> 4, "s" -> 4, "p" -> 2|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Counts.html) for more details. # CountsBy `CountsBy[{e1, e2, ...}, f]` gives an association whose keys are the distinct values of the f\[ei], and whose values give the number of times these f\[ei] values appear. `CountsBy[f]` represents an operator form of CountsBy that can be applied to an expression. Examples [#examples] Count by absolute value: ```wolfram CountsBy[{-2, -1, 1, 2, 2}, Abs] (* <|2 -> 3, 1 -> 2|> *) ``` Count words by length: ```wolfram CountsBy[{"cat", "dog", "bird", "fish"}, StringLength] (* <|3 -> 2, 4 -> 2|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CountsBy.html) for more details. # Curry `Curry[f, n]` represents an operator form of the function f of n arguments so that `Curry[f, n][x1]…[xn]` is equivalent to `f[x1, …, xn]`. `Curry[f]` represents an operator form of the function f of two arguments so that `Curry[f][y][x]` is equivalent to `f[x, y]`. `Curry[f, {i1, …, in}]` represents an operator form of the function f of n arguments so that `Curry[f, {i1, …, in}][x1]…[xn]` is equivalent to `f[xi1, …, xin]`. Examples [#examples] Create a curried version of a two-argument function: ```wolfram Curry[f][y][x] (* f[x, y] *) ``` Curry a function with explicit arity: ```wolfram Curry[f, 3][a][b][c] (* f[a, b, c] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Curry.html) for more details. # CurryApplied `CurryApplied[f, n]` represents an operator form of the function f of n arguments so that `CurryApplied[f, n][x1]...[xn]` is equivalent to `f[x1, ..., xn]`. `CurryApplied[n]` represents an operator form of `CurryApplied` that can be applied to a function to represent an operator form with n arguments. `CurryApplied[f, {i1, ..., in}]` represents an operator form of the function f of n arguments so that `CurryApplied[f, {i1, ..., in}][x1]...[xn]` is equivalent to `f[xi1, ..., xin]`. `CurryApplied[f, k -> {i1, ..., in}]` represents an operator form that takes k arguments. Examples [#examples] Curry a function of two arguments: ```wolfram CurryApplied[Plus, 2][3][5] (* 8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CurryApplied.html) for more details. # Dataset `Dataset[data]` represents a structured dataset based on a hierarchy of lists and associations, enabling query operations and visualization. Examples [#examples] Create and query a dataset: ```wolfram ds = Dataset[{ <|"name" -> "Alice", "age" -> 30|>, <|"name" -> "Bob", "age" -> 25|> }] (* Select column *) ds[All, "name"] (* {"Alice", "Bob"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Dataset.html) for more details. # Delete `Delete[expr, n]` deletes the element at position n in expr. Examples [#examples] Delete at position: ```wolfram Delete[{a, b, c, d}, 2] (* {a, c, d} *) ``` Delete from the end: ```wolfram Delete[{a, b, c, d}, -1] (* {a, b, c} *) ``` Delete multiple positions: ```wolfram Delete[{a, b, c, d}, {{1}, {3}}] (* {b, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Delete.html) for more details. # DeleteAdjacentDuplicates `DeleteAdjacentDuplicates[list]` deletes all duplicates in runs of identical elements in list. `DeleteAdjacentDuplicates[list, test]` applies test to pairs of consecutive elements to determine whether they should be considered duplicates. Examples [#examples] Remove adjacent duplicates: ```wolfram DeleteAdjacentDuplicates[{1, 1, 2, 2, 2, 3, 1, 1}] (* {1, 2, 3, 1} *) ``` With custom test: ```wolfram DeleteAdjacentDuplicates[{1, 2, 1, 3, 2}, Abs[#1 - #2] < 2 &] (* {1, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteAdjacentDuplicates.html) for more details. # DeleteAnomalies `DeleteAnomalies[{example1, example2, ...}]` gives a list in which examplei that are considered anomalous have been dropped. `DeleteAnomalies[fun, data]` drops anomalies in data using the given `AnomalyDetectorFunction[...]` or `LearnedDistribution[...]`. Examples [#examples] Delete anomalies from data: ```wolfram DeleteAnomalies[{1, 2, 3, 100, 4, 5}] (* {1, 2, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteAnomalies.html) for more details. # DeleteBorderComponents `DeleteBorderComponents[image]` replaces connected components adjacent to the border in a binary image image with background pixels. `DeleteBorderComponents[m]` replaces components adjacent to the border in a label matrix m with 0. Examples [#examples] Remove border-touching components from a binary image: ```wolfram DeleteBorderComponents[Binarize[img]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteBorderComponents.html) for more details. # DeleteCases `DeleteCases[expr, pattern]` removes all elements of expr that match pattern. Examples [#examples] Remove specific elements: ```wolfram DeleteCases[{1, a, 2, b, 3}, _Symbol] (* {1, 2, 3} *) ``` Remove by value: ```wolfram DeleteCases[{1, 2, 3, 2, 1}, 2] (* {1, 3, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteCases.html) for more details. # DeleteDuplicates `DeleteDuplicates[data]` deletes all duplicates from data, keeping the first occurrence. Examples [#examples] Remove duplicates: ```wolfram DeleteDuplicates[{1, 2, 3, 2, 1, 4}] (* {1, 2, 3, 4} *) ``` With custom test: ```wolfram DeleteDuplicates[{1, -1, 2, -2, 3}, Abs[#1] == Abs[#2] &] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteDuplicates.html) for more details. # DeleteDuplicatesBy `DeleteDuplicatesBy[data, f]` deletes elements that give duplicate values when f is applied. `DeleteDuplicatesBy[f]` represents an operator form. Examples [#examples] Keep first of each length: ```wolfram DeleteDuplicatesBy[{"a", "bb", "ccc", "dd", "e"}, StringLength] (* {"a", "bb", "ccc"} *) ``` Keep first of each absolute value: ```wolfram DeleteDuplicatesBy[{1, -1, 2, -2, 3}, Abs] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteDuplicatesBy.html) for more details. # DeleteElements `DeleteElements[list, {e1, e2, ...}]` removes all instances of elements ei from list. Examples [#examples] Remove elements: ```wolfram DeleteElements[{a, b, c, b, a}, {a, b}] (* {c} *) ``` Remove limited instances: ```wolfram DeleteElements[{a, a, a, b, b}, 1 -> {a}] (* {a, a, b, b} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteElements.html) for more details. # DeleteMissing `DeleteMissing[list]` drops elements with head `Missing` from a list. `DeleteMissing[assoc]` drops elements whose values have head `Missing` from an association. `DeleteMissing[expr, n]` applies `DeleteMissing` to lists or associations within the first n levels of expr. Examples [#examples] Remove missing values: ```wolfram DeleteMissing[{1, Missing[], 2, Missing["NotFound"], 3}] (* {1, 2, 3} *) ``` From an association: ```wolfram DeleteMissing[<|"a" -> 1, "b" -> Missing[], "c" -> 3|>] (* <|"a" -> 1, "c" -> 3|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteMissing.html) for more details. # DeletePermissionsKey `DeletePermissionsKey[key]` deletes a permissions key, rendering it invalid. `DeletePermissionsKey[{key1, key2, ...}]` deletes several permissions keys. Examples [#examples] Delete a permissions key: ```wolfram DeletePermissionsKey[myKey] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeletePermissionsKey.html) for more details. # DeleteSmallComponents `DeleteSmallComponents[image]` replaces small connected components in a binary image with background pixels. `DeleteSmallComponents[m]` replaces positive integers in a label matrix with 0 if their tally is small. `DeleteSmallComponents[..., n]` replaces components consisting of n or fewer elements. Examples [#examples] Remove small components from binary image: ```wolfram img = Binarize[Import["ExampleData/text.png"]] DeleteSmallComponents[img] ``` Specify minimum size: ```wolfram DeleteSmallComponents[img, 50] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteSmallComponents.html) for more details. # DeleteStopwords `DeleteStopwords[list]` deletes stopwords from a list of words. `DeleteStopwords["string"]` deletes stopwords from a string. `DeleteStopwords[{string1, string2, ...}]` deletes stopwords from a list of strings. Examples [#examples] Remove stopwords from a sentence: ```wolfram DeleteStopwords["The quick brown fox jumps over the lazy dog"] (* "quick brown fox jumps lazy dog" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteStopwords.html) for more details. # Depth `Depth[expr]` gives the maximum number of indices needed to specify any part of expr, plus 1. Examples [#examples] Depth of expressions: ```wolfram Depth[{a, b, c}] (* 2 *) Depth[{{1, 2}, {3, 4}}] (* 3 *) Depth[x] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Depth.html) for more details. # DepthFirstScan `DepthFirstScan[g, s, {event1 -> f1, event2 -> f2, ...}]` performs a depth-first scan of the graph g starting at the vertex s and evaluates fi whenever "eventi" occurs. `DepthFirstScan[g, {event1 -> f1, event2 -> f2, ...}]` performs a depth-first scan of the whole graph g. `DepthFirstScan[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Perform a depth-first scan: ```wolfram DepthFirstScan[Graph[{1 -> 2, 2 -> 3, 1 -> 3}], 1, {"PrevisitVertex" -> Print}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DepthFirstScan.html) for more details. # Dimensions `Dimensions[expr]` gives a list of the dimensions of expr. Examples [#examples] Dimensions of a matrix: ```wolfram Dimensions[{{1, 2, 3}, {4, 5, 6}}] (* {2, 3} *) ``` Dimensions of a vector: ```wolfram Dimensions[{a, b, c, d}] (* {4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Dimensions.html) for more details. # DirichletWindow `DirichletWindow[x]` represents a Dirichlet window function of x. Examples [#examples] Create a Dirichlet window: ```wolfram DirichletWindow[x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletWindow.html) for more details. # Drop `Drop[list, n]` gives list with its first n elements dropped. `Drop[list, -n]` gives list with its last n elements dropped. `Drop[list, {m, n}]` gives list with elements m through n dropped. Examples [#examples] Drop the first 2 elements: ```wolfram Drop[{a, b, c, d, e}, 2] (* {c, d, e} *) ``` Drop the last element: ```wolfram Drop[{a, b, c, d, e}, -1] (* {a, b, c, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Drop.html) for more details. # DropoutLayer `DropoutLayer[]` represents a net layer that sets its input elements to zero with probability 0.5 during training. `DropoutLayer[p]` sets its input elements to zero with probability p during training. Examples [#examples] Create a dropout layer with default probability: ```wolfram DropoutLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DropoutLayer.html) for more details. # DuplicateFreeQ `DuplicateFreeQ[list]` gives True if list has no duplicates, and False otherwise. `DuplicateFreeQ[list,test]` applies test to pairs of elements to determine whether they should be considered duplicates. Examples [#examples] Check if a list has no duplicates: ```wolfram DuplicateFreeQ[{a, b, c}] (* True *) ``` ```wolfram DuplicateFreeQ[{a, b, a}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DuplicateFreeQ.html) for more details. # ExactBlackmanWindow `ExactBlackmanWindow[x]` represents an exact Blackman window function of x. Examples [#examples] Create an exact Blackman window: ```wolfram ExactBlackmanWindow[x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExactBlackmanWindow.html) for more details. # Extract `Extract[expr, pos]` extracts the part of expr at the position specified by pos. `Extract[expr, {pos1, pos2, ...}]` extracts multiple parts. Examples [#examples] Extract a part by position: ```wolfram Extract[{{a, b}, {c, d}}, {2, 1}] (* c *) ``` Extract multiple parts: ```wolfram Extract[{a, b, c, d}, {{1}, {3}}] (* {a, c} *) ``` Useful with Position: ```wolfram Extract[{1, 2, 3, 2}, Position[{1, 2, 3, 2}, 2]] (* {2, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Extract.html) for more details. # ExtractArchive `ExtractArchive[source]` expands an archive file, saving its content into the current directory. * `ExtractArchive[source,dir]` saves the content of an archive file into directory dir. * `ExtractArchive[source,dir,pattern]` extracts only files whose names match pattern. Examples [#examples] ```wolfram (* Extract a ZIP archive to current directory *) ExtractArchive["data.zip"] (* Extract to specific directory *) ExtractArchive["archive.tar.gz", "/tmp/extracted"] (* Extract only certain files *) ExtractArchive["package.zip", "/tmp", "*.txt"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExtractArchive.html) for more details. # ExtractLayer `ExtractLayer[]` represents a net layer that takes an array and a position specification as inputs and extracts the specified parts from the array. Examples [#examples] ```wolfram (* Create an extract layer *) layer = ExtractLayer[] (* Apply to an array with position *) layer[<|"Array" -> {1, 2, 3, 4}, "Position" -> 2|>] (* Use in a neural network *) net = NetChain[{LinearLayer[10], ExtractLayer[]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExtractLayer.html) for more details. # ExtractPacletArchive `ExtractPacletArchive[file]` extracts the contents of the paclet archive file into the directory in which file resides. `ExtractPacletArchive[file,destdir]` extracts the contents of the paclet archive file into destdir. Examples [#examples] ```wolfram (* Extract a paclet archive in place *) ExtractPacletArchive["MyPaclet-1.0.0.paclet"] (* Extract to a specific directory *) ExtractPacletArchive["MyPaclet-1.0.0.paclet", "/tmp/paclets"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExtractPacletArchive.html) for more details. # First `First[expr]` gives the first element in expr. `First[expr, def]` gives the first element if it exists, or def otherwise. Examples [#examples] Get the first element: ```wolfram First[{a, b, c}] (* a *) ``` With a default value: ```wolfram First[{}, "empty"] (* "empty" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/First.html) for more details. # FirstCase `FirstCase[{e1, e2, ...}, pattern]` gives the first element matching pattern, or `Missing["NotFound"]` if none is found. `FirstCase[expr, pattern, default]` gives default if no match is found. Examples [#examples] Find first match: ```wolfram FirstCase[{1, "a", 2, "b"}, _String] (* "a" *) ``` With default: ```wolfram FirstCase[{1, 2, 3}, _String, "none"] (* "none" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FirstCase.html) for more details. # FirstPassageTimeDistribution `FirstPassageTimeDistribution[mproc,f]` represents the distribution of times for the Markov process mproc to pass from the initial state to final states f for the first time. Examples [#examples] Create a first passage time distribution: ```wolfram proc = DiscreteMarkovProcess[1, {{0.5, 0.5}, {0.3, 0.7}}]; dist = FirstPassageTimeDistribution[proc, {2}] ``` Compute mean first passage time: ```wolfram Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FirstPassageTimeDistribution.html) for more details. # FirstPosition `FirstPosition[expr, pattern]` gives the position of the first element matching pattern, or `Missing["NotFound"]` if none is found. `FirstPosition[expr, pattern, default]` gives default if no match is found. Examples [#examples] Find first position: ```wolfram FirstPosition[{1, 2, 3, 2}, 2] (* {2} *) ``` In nested lists: ```wolfram FirstPosition[{{a, b}, {c, d}}, d] (* {2, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FirstPosition.html) for more details. # FixedPoint `FixedPoint[f, expr]` starts with expr, then applies f repeatedly until the result no longer changes. `FixedPoint[f, expr, n]` stops after at most n steps. Examples [#examples] Find a fixed point: ```wolfram FixedPoint[Cos, 1.0] (* 0.739085 *) ``` Newton's method for square root: ```wolfram FixedPoint[(# + 2/#)/2 &, 1.0] (* 1.41421 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FixedPoint.html) for more details. # FixedPointList `FixedPointList[f, expr]` generates a list of results from applying f repeatedly until the result no longer changes. `FixedPointList[f, expr, n]` stops after at most n steps. Examples [#examples] Find fixed point iterations: ```wolfram FixedPointList[Cos, 1.0, 10] (* {1., 0.540302, 0.857553, 0.65429, 0.79348, ...} *) ``` Newton's method for sqrt(2): ```wolfram FixedPointList[(# + 2/#)/2 &, 1.0] (* {1., 1.5, 1.41667, 1.41422, 1.41421, 1.41421, 1.41421} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FixedPointList.html) for more details. # FlatTopWindow `FlatTopWindow[x]` represents an exact flat top window function of x. Examples [#examples] Plot the flat top window: ```wolfram Plot[FlatTopWindow[x], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FlatTopWindow.html) for more details. # Flatten `Flatten[list]` flattens out nested lists. `Flatten[list, n]` flattens to level n. Examples [#examples] Completely flatten a nested list: ```wolfram Flatten[{{a, b}, {c, {d, e}}}] (* {a, b, c, d, e} *) ``` Flatten only one level: ```wolfram Flatten[{{a, b}, {c, {d, e}}}, 1] (* {a, b, c, {d, e}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Flatten.html) for more details. # FlattenAt `FlattenAt[list, n]` flattens out a sublist that appears as the nth element of list. `FlattenAt[expr, {i, j, ...}]` flattens out the part of expr at the specified position. Examples [#examples] Flatten at position 2: ```wolfram FlattenAt[{a, {b, c}, d}, 2] (* {a, b, c, d} *) ``` Flatten at nested position: ```wolfram FlattenAt[{{a, {b, c}}, d}, {1, 2}] (* {{a, b, c}, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FlattenAt.html) for more details. # FlattenLayer `FlattenLayer[]` represents a net layer that flattens any input array into a vector. * `FlattenLayer[n]` represents a net layer that flattens its input to level n. * `FlattenLayer[{{s11, s12, ...}, {s21, s22, ...}, ...}]` represents a net layer that flattens its input by combining all levels sij to make each level i in the result. Examples [#examples] Create a flatten layer: ```wolfram FlattenLayer[] ``` Apply a flatten layer to an array: ```wolfram layer = FlattenLayer[]; layer[{{1, 2}, {3, 4}}, NetEvaluationMode -> "Train"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FlattenLayer.html) for more details. # Fold `Fold[f, x, list]` gives the last element of `FoldList[f, x, list]`. `Fold[f, list]` is equivalent to `Fold[f, First[list], Rest[list]]`. Examples [#examples] Sum a list using Fold: ```wolfram Fold[Plus, 0, {1, 2, 3, 4}] (* 10 *) ``` Build a nested expression: ```wolfram Fold[f, x, {a, b, c}] (* f[f[f[x, a], b], c] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Fold.html) for more details. # FoldList `FoldList[f, x, {a, b, ...}]` gives `{x, f[x, a], f[f[x, a], b], ...}`. `FoldList[f, {a, b, c, ...}]` gives `{a, f[a, b], f[f[a, b], c], ...}`. Examples [#examples] Cumulative sums: ```wolfram FoldList[Plus, 0, {1, 2, 3, 4}] (* {0, 1, 3, 6, 10} *) ``` Build nested expressions: ```wolfram FoldList[f, x, {a, b, c}] (* {x, f[x, a], f[f[x, a], b], f[f[f[x, a], b], c]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoldList.html) for more details. # FoldPair `FoldPair[f, y0, list]` gives the last element of `FoldPairList[f, y0, list]`. Examples [#examples] Generate with state: ```wolfram FoldPair[{#1 + #2, #1 + #2} &, 0, {1, 2, 3, 4}] (* 10 *) ``` Running total with pair: ```wolfram FoldPair[{#1 + #2, #1 + #2} &, 0, Range[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoldPair.html) for more details. # FoldPairList `FoldPairList[f, y0, {a1, a2, ...}]` gives the list of successive xi obtained by applying f to pairs, where f returns `{xi, yi}` at each step. Examples [#examples] Running total with outputs: ```wolfram FoldPairList[{#1 + #2, #1 + #2} &, 0, {1, 2, 3, 4}] (* {1, 3, 6, 10} *) ``` Generate Fibonacci-like sequence: ```wolfram FoldPairList[{#1, #1 + #2} &, 1, Range[6]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoldPairList.html) for more details. # FoldWhile `FoldWhile[f,x,{a1,a2,…},test]` returns the first expression f\[… f\[f\[x,a1],a2]…,ak] to which applying test does not yield True. `FoldWhile[f,list,test]` is equivalent to FoldWhile\[f,First\[list],Rest\[list],test]. `FoldWhile[f,x,{a1,a2,…},test,m]` supplies the most recent m results as arguments for test at each step. `FoldWhile[f,x,{a1,a2,…},test,All]` supplies all results so far as arguments for test at each step. `FoldWhile[f,x,{a1,a2,…},test,m,n]` returns the result after applying f an extra n times after test fails. `FoldWhile[f,x,{a1,a2,…},test,m,-n]` returns the result found when f had been applied n fewer times. `FoldWhile[f,test]` represents an operator form of FoldWhile that can be applied to expressions. Examples [#examples] Fold while result is less than 100: ```wolfram FoldWhile[Times, 1, Range[10], # < 100 &] (* 120 *) ``` Fold while sum is less than 10: ```wolfram FoldWhile[Plus, 0, {1, 2, 3, 4, 5}, # < 10 &] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoldWhile.html) for more details. # FoldWhileList `FoldWhileList[f, x, {a1, a2, ...}, test]` returns \{x, f\[x, a1], f\[f\[x, a1], a2], ...}, repeatedly applying f with subsequent values ai until applying test to the result does not yield True. * `FoldWhileList[f, list, test]` is equivalent to `FoldWhileList[f, First[list], Rest[list], test]`. * `FoldWhileList[f, x, {a1, a2, ...}, test, m]` supplies the most recent m results as arguments for test at each step. * `FoldWhileList[f, x, {a1, a2, ...}, test, All]` supplies all results so far as arguments for test at each step. * `FoldWhileList[f, test]` represents an operator form. Examples [#examples] Accumulate until result exceeds 10: ```wolfram FoldWhileList[Plus, 0, Range[10], # < 10 &] ``` Multiply while less than 100: ```wolfram FoldWhileList[Times, 1, Range[10], # < 100 &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoldWhileList.html) for more details. # FreeQ `FreeQ[expr, form]` yields `True` if no subexpression in expr matches form, and `False` otherwise. Examples [#examples] Check if expression is free of a symbol: ```wolfram FreeQ[x^2 + y, z] (* True *) FreeQ[x^2 + y, x] (* False *) ``` With patterns: ```wolfram FreeQ[{a, b, c}, _Integer] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FreeQ.html) for more details. # Gather `Gather[list]` gathers the elements of list into sublists of identical elements. Examples [#examples] Group identical elements: ```wolfram Gather[{a, b, a, c, b, a}] (* {{a, a, a}, {b, b}, {c}} *) ``` With custom test: ```wolfram Gather[{1, -1, 2, -2, 3}, Abs[#1] == Abs[#2] &] (* {{1, -1}, {2, -2}, {3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Gather.html) for more details. # GatherBy `GatherBy[list, f]` gathers elements into sublists that give the same value when f is applied. `GatherBy[list, {f1, f2, ...}]` gathers into nested sublists using fi at level i. Examples [#examples] Group by a function: ```wolfram GatherBy[{1, 2, 3, 4, 5, 6}, EvenQ] (* {{1, 3, 5}, {2, 4, 6}} *) ``` Group strings by length: ```wolfram GatherBy[{"a", "ab", "abc", "bc", "c"}, StringLength] (* {{"a", "c"}, {"ab", "bc"}, {"abc"}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GatherBy.html) for more details. # GroupBy `GroupBy[{elem1, elem2, ...}, f]` gives an association that groups elements into lists associated with distinct keys `f[elemi]`. Examples [#examples] Group by a function: ```wolfram GroupBy[{1, 2, 3, 4, 5, 6}, EvenQ] (* <|False -> {1, 3, 5}, True -> {2, 4, 6}|> *) ``` Group strings by first letter: ```wolfram GroupBy[{"apple", "banana", "avocado", "blueberry"}, StringTake[#, 1] &] (* <|"a" -> {"apple", "avocado"}, "b" -> {"banana", "blueberry"}|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GroupBy.html) for more details. # HammingWindow `HammingWindow[x]` represents a Hamming window function of x. The Hamming window is commonly used in signal processing and spectral analysis to reduce spectral leakage. Examples [#examples] ```wolfram HammingWindow[0.5] ``` ```wolfram Plot[HammingWindow[x], {x, -1/2, 1/2}] ``` ```wolfram (* Apply to a signal *) ListLinePlot[Table[HammingWindow[x], {x, -0.5, 0.5, 0.01}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HammingWindow.html) for more details. # HannPoissonWindow `HannPoissonWindow[x]` represents a Hann–Poisson window function of x. * `HannPoissonWindow[x, α]` uses the parameter α. This window function combines the properties of Hann and Poisson windows. Examples [#examples] ```wolfram HannPoissonWindow[0.5] ``` ```wolfram Plot[HannPoissonWindow[x], {x, -1, 1}] ``` ```wolfram Plot[HannPoissonWindow[x, 2], {x, -1, 1}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HannPoissonWindow.html) for more details. # HannWindow `HannWindow[x]` represents a Hann window function of x. * `HannWindow[x, α]` uses the parameter α. Examples [#examples] Evaluate window: ```wolfram HannWindow[0.3] ``` Plot the window: ```wolfram Plot[HannWindow[x], {x, -0.5, 0.5}] ``` In signal processing: ```wolfram LowpassFilter[data, 0.1, HannWindow] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HannWindow.html) for more details. # HighpassFilter `HighpassFilter[data, ωc]` applies a highpass filter with a cutoff frequency `ωc` to an array of data. * `HighpassFilter[data, ωc, n]` uses a filter kernel of length `n`. * `HighpassFilter[data, ωc, n, wfun]` applies a smoothing window `wfun` to the filter kernel. Examples [#examples] ```wolfram HighpassFilter[RandomReal[1, 100], 0.1] ``` ```wolfram HighpassFilter[Table[Sin[t] + 0.5 Sin[10 t], {t, 0, 10, 0.01}], 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HighpassFilter.html) for more details. # Identity `Identity[expr]` gives expr (the identity operation). Examples [#examples] Identity function: ```wolfram Identity[5] (* 5 *) Identity[{a, b, c}] (* {a, b, c} *) ``` Useful with Map: ```wolfram Map[Identity, {1, 2, 3}] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Identity.html) for more details. # Indexed `Indexed[expr, i]` represents the component of expr with index i and formats as expr\_i. `Indexed[expr, {i, j, ...}]` uses multiple indices. Examples [#examples] Indexed variable: ```wolfram Indexed[x, 1] (* x_1 displayed with subscript *) ``` Multi-index: ```wolfram Indexed[A, {i, j}] (* A_{i,j} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Indexed.html) for more details. # Insert `Insert[list, elem, n]` inserts elem at position n in list. Examples [#examples] Insert at position 2: ```wolfram Insert[{a, b, c}, x, 2] (* {a, x, b, c} *) ``` Insert from the end: ```wolfram Insert[{a, b, c}, x, -1] (* {a, b, c, x} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Insert.html) for more details. # InsertLinebreaks `InsertLinebreaks["string"]` inserts newline characters into string to make a string in which no line is longer than 78 characters. * `InsertLinebreaks["string", n]` inserts newline characters to make no line longer than n characters. Examples [#examples] Break a long string at 78 characters: ```wolfram InsertLinebreaks["This is a very long string that will be broken into multiple lines."] ``` Specify a custom line length: ```wolfram InsertLinebreaks["Short lines are easier to read.", 20] ``` Format code for display: ```wolfram InsertLinebreaks[StringRepeat["word ", 30], 40] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InsertLinebreaks.html) for more details. # Intersection `Intersection[list1, list2, ...]` gives a sorted list of the elements common to all the lists. Examples [#examples] Find common elements: ```wolfram Intersection[{a, b, c, d}, {b, c, d, e}] (* {b, c, d} *) ``` Multiple lists: ```wolfram Intersection[{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}] (* {3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Intersection.html) for more details. # Join `Join[list1, list2, ...]` concatenates lists or other expressions that share the same head. Examples [#examples] Join two lists: ```wolfram Join[{a, b}, {c, d}] (* {a, b, c, d} *) ``` Join multiple lists: ```wolfram Join[{1, 2}, {3, 4}, {5, 6}] (* {1, 2, 3, 4, 5, 6} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Join.html) for more details. # JoinAcross `JoinAcross[{a1, a2, ...}, {b1, b2, ...}, key]` gives a list of associations obtained by joining those pairs of associations ai and bj in which the values associated with key are the same. * `JoinAcross[{a1, a2, ...}, {b1, b2, ...}, {key1, key2, ...}]` joins pairs of associations only when the values associated with all keys keyi are the same. * `JoinAcross[{a1, a2, ...}, {b1, b2, ...}, keya -> keyb]` joins pairs of associations ai, bj in which the values associated with keya in the ai are the same as those associated with keyb in the bj. * `JoinAcross[alist, blist, keyspec, "joinspec"]` uses joinspec to determine when to allow associations that contain missing elements to be generated. Examples [#examples] ```wolfram JoinAcross[{<|"a" -> 1, "b" -> 2|>}, {<|"a" -> 1, "c" -> 3|>}, "a"] ``` ```wolfram JoinAcross[{<|"x" -> 1|>, <|"x" -> 2|>}, {<|"x" -> 1, "y" -> 10|>}, "x"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JoinAcross.html) for more details. # JoinForm `JoinForm[type]` is a graphics directive that specifies what type of joins should be used to connect segments of lines, tubes, edges, and related primitives. Examples [#examples] ```wolfram Graphics[{AbsoluteThickness[15], JoinForm["Round"], Line[{{0, 0}, {1, 0.5}, {2, 0}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JoinForm.html) for more details. # JoinedCurve `JoinedCurve[{segment1, segment2, ...}]` represents a curve consisting of connected segments. Examples [#examples] Connected line segments: ```wolfram Graphics[JoinedCurve[{Line[{{0, 0}, {1, 1}}], Line[{{1, 1}, {2, 0}}]}]] ``` With Bezier curves: ```wolfram Graphics[JoinedCurve[{BezierCurve[{{0, 0}, {0.5, 1}, {1, 0}}], Line[{{1, 0}, {2, 1}}]}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JoinedCurve.html) for more details. # KaiserBesselWindow `KaiserBesselWindow[x]` represents a Kaiser–Bessel window function of x. Examples [#examples] ```wolfram Plot[KaiserBesselWindow[x], {x, -1/2, 1/2}] ``` ```wolfram KaiserBesselWindow[0] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KaiserBesselWindow.html) for more details. # KaiserWindow `KaiserWindow[x]` represents a Kaiser window function of x. * `KaiserWindow[x, α]` uses the parameter α. Examples [#examples] Default Kaiser window: ```wolfram Plot[KaiserWindow[x], {x, -0.5, 0.5}] ``` With parameter: ```wolfram Plot[KaiserWindow[x, 10], {x, -0.5, 0.5}] ``` Apply as window function: ```wolfram data = Table[Sin[2 Pi 5 t], {t, 0, 1, 0.01}]; ListLinePlot[data KaiserWindow[Range[-50, 50]/100, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KaiserWindow.html) for more details. # Key `Key[key]` represents a key used to access a value in an association or a column in a Tabular object. `Key[key][assoc]` extracts the value corresponding to key in the association assoc. Examples [#examples] Extract a value using Key: ```wolfram assoc = <|"a" -> 1, "b" -> 2|>; Key["a"][assoc] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Key.html) for more details. # KeyComplement `KeyComplement[{assocall, assoc1, assoc2, ...}]` generates an association in which only elements whose keys appear in assocall but not in any of the associ are retained. Examples [#examples] Find complement keys: ```wolfram KeyComplement[{<|a -> 1, b -> 2, c -> 3|>, <|a -> 4|>}] (* <|b -> 2, c -> 3|> *) ``` Multiple exclusions: ```wolfram KeyComplement[{<|a -> 1, b -> 2, c -> 3, d -> 4|>, <|a -> 0|>, <|c -> 0|>}] (* <|b -> 2, d -> 4|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyComplement.html) for more details. # KeyDrop `KeyDrop[assoc, {key1, key2, ...}]` yields an association from which elements with keys key\_i have been dropped. `KeyDrop[{assoc1, assoc2, ...}, keys]` gives a list of associations. `KeyDrop[keys]` represents an operator form of `KeyDrop` that can be applied to an expression. Examples [#examples] Drop keys from an association: ```wolfram KeyDrop[<|"a" -> 1, "b" -> 2, "c" -> 3|>, {"a", "c"}] (* <|"b" -> 2|> *) ``` Operator form: ```wolfram KeyDrop[{"b"}][<|"a" -> 1, "b" -> 2|>] (* <|"a" -> 1|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyDrop.html) for more details. # KeyDropFrom `KeyDropFrom[a,key]` changes the association a by dropping the element with the specified key. `KeyDropFrom[a,{key1,key2,...}]` drops the elements with keys keyi. Examples [#examples] ```wolfram assoc = <|"a" -> 1, "b" -> 2, "c" -> 3|>; KeyDropFrom[assoc, "b"]; assoc (* <|"a" -> 1, "c" -> 3|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyDropFrom.html) for more details. # KeyExistsQ `KeyExistsQ[assoc, key]` returns `True` if the specified key exists in the association assoc, and `False` otherwise. `KeyExistsQ[key]` represents an operator form of `KeyExistsQ` that can be applied to an expression. Examples [#examples] Check if key exists: ```wolfram KeyExistsQ[<|"a" -> 1, "b" -> 2|>, "a"] (* True *) ``` Non-existent key: ```wolfram KeyExistsQ[<|"a" -> 1, "b" -> 2|>, "c"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyExistsQ.html) for more details. # KeyFreeQ `KeyFreeQ[assoc, form]` yields `True` if no key in the association `assoc` matches `form`, and yields `False` otherwise. * `KeyFreeQ[form]` represents an operator form of `KeyFreeQ` that can be applied to an expression. Examples [#examples] ```wolfram KeyFreeQ[<|"a" -> 1, "b" -> 2|>, "c"] ``` ```wolfram KeyFreeQ[<|1 -> "x", 2 -> "y"|>, _String] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyFreeQ.html) for more details. # KeyIntersection `KeyIntersection[{assoc1, assoc2, ...}]` generates a list of associations in which only elements whose keys appear in all the *associ* are retained. Examples [#examples] ```wolfram KeyIntersection[{<|"a" -> 1, "b" -> 2|>, <|"a" -> 3, "c" -> 4|>}] (* {<|"a" -> 1|>, <|"a" -> 3|>} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyIntersection.html) for more details. # KeyMap `KeyMap[f, <|key1 -> val1, key2 -> val2, ...|>]` maps f over the keys in an association, giving \<|f\[key1] -> val1, f\[key2] -> val2, ...|>. * `KeyMap[f]` represents an operator form of KeyMap that can be applied to an expression. Examples [#examples] Uppercase keys: ```wolfram KeyMap[ToUpperCase, <|"a" -> 1, "b" -> 2|>] (* <|"A" -> 1, "B" -> 2|> *) ``` Transform numeric keys: ```wolfram KeyMap[# + 10 &, <|1 -> "one", 2 -> "two"|>] (* <|11 -> "one", 12 -> "two"|> *) ``` Operator form: ```wolfram KeyMap[ToString] @ <|1 -> a, 2 -> b|> ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyMap.html) for more details. # KeyMemberQ `KeyMemberQ[assoc, form]` yields `True` if a key in the association assoc matches form, and `False` otherwise. `KeyMemberQ[form]` represents an operator form of `KeyMemberQ` that can be applied to an expression. Examples [#examples] ```wolfram KeyMemberQ[<|"a" -> 1, "b" -> 2|>, "a"] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyMemberQ.html) for more details. # KeySelect `KeySelect[assoc, crit]` selects elements in the association assoc for which crit applied to their keys is `True`. `KeySelect[crit]` represents an operator form of `KeySelect` that can be applied to an expression. Examples [#examples] Select keys matching criterion: ```wolfram KeySelect[<|1 -> "a", 2 -> "b", 3 -> "c"|>, OddQ] (* <|1 -> "a", 3 -> "c"|> *) ``` Select string keys: ```wolfram KeySelect[<|"x" -> 1, "y" -> 2, "z" -> 3|>, StringMatchQ[#, "x" | "z"] &] (* <|"x" -> 1, "z" -> 3|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeySelect.html) for more details. # KeySort `KeySort[assoc]` orders the elements of an association by sorting its keys. `KeySort[assoc, p]` orders the elements of an association using the ordering function p. Examples [#examples] Sort by keys: ```wolfram KeySort[<|"c" -> 3, "a" -> 1, "b" -> 2|>] (* <|"a" -> 1, "b" -> 2, "c" -> 3|> *) ``` Reverse sort: ```wolfram KeySort[<|1 -> "a", 3 -> "c", 2 -> "b"|>, Greater] (* <|3 -> "c", 2 -> "b", 1 -> "a"|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeySort.html) for more details. # KeySortBy `KeySortBy[assoc,f]` sorts the elements of an association in the order defined by applying f to each of their keys. `KeySortBy[f]` represents an operator form of KeySortBy that can be applied to an expression. Examples [#examples] Sort by string length of keys: ```wolfram KeySortBy[<|"abc" -> 1, "a" -> 2, "ab" -> 3|>, StringLength] (* <|"a" -> 2, "ab" -> 3, "abc" -> 1|> *) ``` Use operator form: ```wolfram KeySortBy[StringLength][<|"long" -> 1, "x" -> 2|>] (* <|"x" -> 2, "long" -> 1|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeySortBy.html) for more details. # KeyTake `KeyTake[assoc, {key1, key2, ...}]` yields an association containing only the elements with keys key\_i. `KeyTake[{assoc1, assoc2, ...}, keys]` gives a list of associations. `KeyTake[{key1, key2, ...}]` represents an operator form of `KeyTake` that can be applied to an expression. Examples [#examples] Take specific keys: ```wolfram KeyTake[<|"a" -> 1, "b" -> 2, "c" -> 3|>, {"a", "c"}] (* <|"a" -> 1, "c" -> 3|> *) ``` Operator form: ```wolfram KeyTake[{"b"}][<|"a" -> 1, "b" -> 2, "c" -> 3|>] (* <|"b" -> 2|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyTake.html) for more details. # KeyUnion `KeyUnion[{assoc1, assoc2, …}]` generates a list of associations in which each association has the union of the keys of the `associ`, padding by inserting values of `Missing[…]` if necessary. * `KeyUnion[{assoc1, assoc2, …}, f]` uses `f[key]` as the value associated with a missing key. Examples [#examples] ```wolfram KeyUnion[{<|"a" -> 1|>, <|"b" -> 2|>}] ``` ```wolfram KeyUnion[{<|"x" -> 1|>, <|"y" -> 2|>}, 0 &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyUnion.html) for more details. # KeyValueMap `KeyValueMap[f, assoc]` applies `f` to each key-value pair and returns a list of results `{f[key1, val1], f[key2, val2], ...}`. Examples [#examples] Transform an association into a list: ```wolfram assoc = <|"a" -> 1, "b" -> 2, "c" -> 3|> KeyValueMap[#1 <> ToString[#2] &, assoc] (* {"a1", "b2", "c3"} *) KeyValueMap[Rule, assoc] (* {"a" -> 1, "b" -> 2, "c" -> 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyValueMap.html) for more details. # KeyValuePattern `KeyValuePattern[{patt1, ...}]` is a pattern object that represents an association or list of rules that includes elements matching each of the patti. Examples [#examples] Match an association with specific keys: ```wolfram MatchQ[<|"a" -> 1, "b" -> 2|>, KeyValuePattern[{"a" -> _}]] (* True *) ``` Use in pattern matching: ```wolfram Cases[{<|"x" -> 1|>, <|"y" -> 2|>, <|"x" -> 3|>}, KeyValuePattern[{"x" -> _}]] (* {<|"x" -> 1|>, <|"x" -> 3|>} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KeyValuePattern.html) for more details. # Keys `Keys[assoc]` gives a list of the keys in an association. `Keys[{key1 -> val1, key2 -> val2, ...}]` gives a list of keys in a list of rules. Examples [#examples] Get keys from an association: ```wolfram Keys[<|"a" -> 1, "b" -> 2, "c" -> 3|>] (* {"a", "b", "c"} *) ``` Get keys from rules: ```wolfram Keys[{x -> 1, y -> 2}] (* {x, y} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Keys.html) for more details. # LanczosWindow `LanczosWindow[x]` represents a Lanczos window function of x. Examples [#examples] Evaluate the Lanczos window at a point: ```wolfram LanczosWindow[0] (* 1 *) ``` Plot the window function: ```wolfram Plot[LanczosWindow[x], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LanczosWindow.html) for more details. # Last `Last[expr]` gives the last element in expr. `Last[expr, def]` gives the last element if there are any elements, or def otherwise. Examples [#examples] Get the last element: ```wolfram Last[{a, b, c}] (* c *) ``` With a default value: ```wolfram Last[{}, "empty"] (* "empty" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Last.html) for more details. # Length `Length[expr]` gives the number of elements in expr. Examples [#examples] Get the length of a list: ```wolfram Length[{a, b, c, d, e}] (* 5 *) ``` Length of a string (use StringLength for characters): ```wolfram Length["hello"] (* 0 - strings have no parts at level 1 *) StringLength["hello"] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Length.html) for more details. # LengthWhile `LengthWhile[list,crit]` gives the number of contiguous elements ei starting at the beginning of list for which crit\[ei] is True. Examples [#examples] Count elements less than 4: ```wolfram LengthWhile[{1, 2, 3, 5, 2, 1}, # < 4 &] (* 3 *) ``` Count positive elements from the beginning: ```wolfram LengthWhile[{1, 2, -3, 4}, Positive] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LengthWhile.html) for more details. # Level `Level[expr, levelspec]` gives a list of all subexpressions of expr on the specified levels. Examples [#examples] Get elements at level 1: ```wolfram Level[f[g[a, b], h[c]], {1}] (* {g[a, b], h[c]} *) ``` All levels: ```wolfram Level[{{1, 2}, {3, 4}}, {-1}] (* {1, 2, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Level.html) for more details. # LexicographicSort `LexicographicSort[{e1,e2,…}]` sorts the list of expressions ei in lexicographic order. `LexicographicSort[{e1,e2,…},p]` compares elements of the ei expressions using the ordering function p. Examples [#examples] Sort lists lexicographically: ```wolfram LexicographicSort[{{1, 2}, {1, 1}, {2, 1}}] (* {{1, 1}, {1, 2}, {2, 1}} *) ``` Sort strings: ```wolfram LexicographicSort[{"apple", "apricot", "banana"}] (* {"apple", "apricot", "banana"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LexicographicSort.html) for more details. # List `{e1, e2, ...}` is a list of elements. Examples [#examples] Create a simple list: ```wolfram list = {1, 2, 3, 4, 5} (* {1, 2, 3, 4, 5} *) ``` Lists can contain any expressions: ```wolfram {1, "hello", Pi, {a, b}} ``` Access elements using Part: ```wolfram list[[2]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/List.html) for more details. # ListConvolve `ListConvolve[ker, list]` gives a convolution of list using kernel ker. Examples [#examples] ```wolfram ListConvolve[{1, 2, 1}, {1, 4, 8, 10, 8, 4, 1}] ``` ```wolfram ker = {1, 2, 1}; data = ListConvolve[ker, {1, 0, 0, 0, 1}]; data ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListConvolve.html) for more details. 2D example [#2d-example] ```wolfram ker2 = {{1, 2, 1}, {2, 4, 2}, {1, 2, 1}}; data2 = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}; ListConvolve[ker2, data2] ``` Padding and alignment [#padding-and-alignment] The third argument controls alignment and cyclic behavior, while explicit padding is supplied as the fourth argument. For example, `ListConvolve[ker, list, k]` makes a cyclic convolution aligning the `k`-th element of `ker` with each element of `list`, and `ListConvolve[ker, list, {kL, kR}]` specifies left/right alignment. To pad the input at each end use a padding argument `p` (a single value) or a list of padding values. For example, padding with zeros: ```wolfram ListConvolve[{1, 2, 1}, {1, 0, 0, 0, 1}, {2, 2}, 0] ``` Or supply a list of padding values that will be repeated cyclically: ```wolfram ListConvolve[{1, 2, 1}, {1, 0, 0, 0, 1}, {2, 2}, {a, b}] ``` See the Wolfram Language reference for additional forms (generalized convolutions and level specifications). # ListDeconvolve `ListDeconvolve[ker, list]` gives a deconvolution of list using kernel ker. Examples [#examples] ```wolfram ListDeconvolve[{1, 2, 1}, {1, 4, 8, 10, 8, 4, 1}] ``` ```wolfram ker = {1, 2, 1}; data = ListConvolve[ker, {1, 0, 0, 0, 1}]; ListDeconvolve[ker, data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListDeconvolve.html) for more details. # ListFourierSequenceTransform `ListFourierSequenceTransform[list, ω]` gives the discrete-time Fourier transform (DTFT) of a list as a function of the parameter ω. * `ListFourierSequenceTransform[list, ω, k]` places the first element of list at integer time k on the infinite time axis. * `ListFourierSequenceTransform[list, {ω1, ω2, ...}, {k1, k2, ...}]` gives the multidimensional discrete-time Fourier transform. Examples [#examples] Compute the DTFT of a sequence: ```wolfram ListFourierSequenceTransform[{1, 2, 3, 4}, ω] ``` Evaluate at a specific frequency: ```wolfram ListFourierSequenceTransform[{1, 1, 1, 1}, ω] /. ω -> Pi/4 ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListFourierSequenceTransform.html) for more details. # ListInterpolation `ListInterpolation[array]` constructs an InterpolatingFunction object from a regular grid of values. Examples [#examples] Interpolate a 2D array: ```wolfram data = Table[Sin[x] Cos[y], {x, 0, Pi, Pi/4}, {y, 0, Pi, Pi/4}]; f = ListInterpolation[data, {{0, Pi}, {0, Pi}}] f[1.0, 0.5] (* 0.739 *) ``` 1D interpolation from values: ```wolfram f = ListInterpolation[{1, 4, 9, 16}]; f[2.5] (* 6.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListInterpolation.html) for more details. # ListLineIntegralConvolutionPlot `ListLineIntegralConvolutionPlot[{array, image}]` generates a line integral convolution plot of image convolved with the vector field defined by an array of vector field values. * `ListLineIntegralConvolutionPlot[array]` generates a line integral convolution plot of white noise convolved with the vector field defined by array. * `ListLineIntegralConvolutionPlot[{{{{x1, y1}, {vx1, vy1}}, ...}, image}]` generates a plot of image convolved with the vector field defined by vectors at specified points. * `ListLineIntegralConvolutionPlot[{{{x1, y1}, {vx1, vy1}}, ...}]` generates a plot of white noise convolved with the vector field. Examples [#examples] Create a LIC plot from vector data: ```wolfram data = Table[{Cos[y], Sin[x]}, {x, -3, 3, 0.1}, {y, -3, 3, 0.1}]; ListLineIntegralConvolutionPlot[data] ``` With coordinate specifications: ```wolfram vecs = Table[{{x, y}, {-y, x}}, {x, -2, 2, 0.5}, {y, -2, 2, 0.5}]; ListLineIntegralConvolutionPlot[Flatten[vecs, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListLineIntegralConvolutionPlot.html) for more details. # ListQ `ListQ[expr]` gives `True` if the head of expr is `List`, and `False` otherwise. Examples [#examples] Test for lists: ```wolfram ListQ[{1, 2, 3}] (* True *) ``` ```wolfram ListQ[5] (* False *) ``` Associations are not lists: ```wolfram ListQ[<|"a" -> 1|>] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListQ.html) for more details. # Listable `Listable` is an attribute that can be assigned to a symbol f to indicate that the function f should automatically be threaded over lists that appear as its arguments. Examples [#examples] Define a listable function: ```wolfram SetAttributes[myFunc, Listable] myFunc[x_] := x^2 myFunc[{1, 2, 3}] (* {1, 4, 9} *) ``` Built-in listable functions: ```wolfram Sin[{0, Pi/2, Pi}] (* {0, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Listable.html) for more details. # Listen `Listen` is a setting for the `LinkMode` option of `LinkOpen`. `LinkMode -> Listen` causes a link to be created that listens on a named port for an incoming connection request. Examples [#examples] Create a link that listens for connections: ```wolfram LinkOpen["8000", LinkMode -> Listen] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Listen.html) for more details. # Longest `Longest[p]` is a pattern object that matches the longest sequence consistent with the pattern p. Examples [#examples] Match longest sequence: ```wolfram StringCases["aabbbcc", Longest[a ~~ __ ~~ c]] (* {"aabbbc"} *) ``` Compare with Shortest: ```wolfram {StringCases["aabbcc", Longest[a ~~ __ ~~ c]], StringCases["aabbcc", Shortest[a ~~ __ ~~ c]]} (* {{"aabbc"}, {"abc"}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Longest.html) for more details. # LongestMatch `LongestMatch[p]` is a string pattern object matching the longest sequence of characters consistent with the string pattern p. Examples [#examples] ```wolfram StringCases["abcabc", LongestMatch["a" ~~ __ ~~ "c"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestMatch.html) for more details. # Lookup `Lookup[assoc, key]` looks up the value associated with `key` in the association. `Lookup[assoc, key, default]` returns `default` if the key is missing. Examples [#examples] Look up values in an association: ```wolfram assoc = <|"a" -> 1, "b" -> 2, "c" -> 3|> Lookup[assoc, "b"] (* 2 *) (* With default value *) Lookup[assoc, "missing", 0] (* 0 *) (* Multiple keys *) Lookup[assoc, {"a", "c"}] (* {1, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Lookup.html) for more details. # LowpassFilter `LowpassFilter[data, ωc]` applies a lowpass filter with a cutoff frequency ωc to an array of data. * `LowpassFilter[data, ωc, n]` uses a filter kernel of length n. * `LowpassFilter[data, ωc, n, wfun]` applies a smoothing window wfun to the filter kernel. Examples [#examples] Apply a lowpass filter to noisy data: ```wolfram data = Table[Sin[x] + RandomReal[{-0.2, 0.2}], {x, 0, 10, 0.1}]; LowpassFilter[data, 0.1] ``` Use a specific kernel length: ```wolfram LowpassFilter[data, 0.2, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LowpassFilter.html) for more details. # Map `Map[f, expr]` or `f /@ expr` applies f to each element on the first level in expr. `Map[f, expr, levelspec]` applies f to parts of expr specified by levelspec. `Map[f]` represents an operator form of Map that can be applied to an expression. Examples [#examples] Apply a function to each element: ```wolfram Map[f, {a, b, c}] (* {f[a], f[b], f[c]} *) ``` Using the shorthand notation: ```wolfram Sqrt /@ {1, 4, 9, 16} (* {1, 2, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Map.html) for more details. # MapAll `MapAll[f, expr]` or `f //@ expr` applies f to every subexpression in expr. Examples [#examples] ```wolfram MapAll[f, {a, {b, c}}] (* f[{f[a], f[{f[b], f[c]}]}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MapAll.html) for more details. # MapApply `f @@@ expr` or `MapApply[f, expr]` replaces heads at level 1 of expr by f. `MapApply[f]` represents an operator form of `MapApply` that can be applied to an expression. Examples [#examples] Apply to sublists: ```wolfram MapApply[f, {{a, b}, {c, d}}] (* {f[a, b], f[c, d]} *) ``` Using shorthand: ```wolfram Plus @@@ {{1, 2}, {3, 4, 5}} (* {3, 12} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MapApply.html) for more details. # MapAt `MapAt[f, expr, n]` applies f to the element at position n in expr. `MapAt[f, expr, {i, j, ...}]` applies f to the part at a nested position. `MapAt[f, expr, {{i1}, {i2}, ...}]` applies f at multiple positions. Examples [#examples] Apply a function at a specific position: ```wolfram MapAt[f, {a, b, c, d}, 2] (* {a, f[b], c, d} *) ``` Apply at multiple positions: ```wolfram MapAt[f, {a, b, c, d}, {{1}, {3}}] (* {f[a], b, f[c], d} *) ``` Square a specific element: ```wolfram MapAt[#^2 &, {1, 2, 3, 4}, 2] (* {1, 4, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MapAt.html) for more details. # MapIndexed `MapIndexed[f, expr]` applies f to the elements of expr, providing the position as a second argument. `MapIndexed[f, expr, levelspec]` applies f to parts at specified levels. Examples [#examples] Map with position information: ```wolfram MapIndexed[f, {a, b, c}] (* {f[a, {1}], f[b, {2}], f[c, {3}]} *) ``` Use position to label elements: ```wolfram MapIndexed[{#2[[1]], #1} &, {a, b, c}] (* {{1, a}, {2, b}, {3, c}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MapIndexed.html) for more details. # MapThread `MapThread[f, {{a1, a2, ...}, {b1, b2, ...}, ...}]` gives `{f[a1, b1, ...], f[a2, b2, ...], ...}`. Examples [#examples] Apply function to corresponding elements: ```wolfram MapThread[Plus, {{1, 2, 3}, {10, 20, 30}}] (* {11, 22, 33} *) ``` With a custom function: ```wolfram MapThread[f, {{a, b}, {1, 2}, {x, y}}] (* {f[a, 1, x], f[b, 2, y]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MapThread.html) for more details. # Mean `Mean[data]` gives the arithmetic mean of the elements in data. `Mean[dist]` gives the mean of the distribution dist. Examples [#examples] Mean of a list: ```wolfram Mean[{1, 2, 3, 4, 5}] (* 3 *) ``` Mean of a distribution: ```wolfram Mean[NormalDistribution[0, 1]] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Mean.html) for more details. # MeanAbsoluteLossLayer `MeanAbsoluteLossLayer[]` represents a loss layer that computes the mean absolute loss between the "Input" port and "Target" port. Examples [#examples] ```wolfram MeanAbsoluteLossLayer[] ``` ```wolfram NetGraph[{LinearLayer[], MeanAbsoluteLossLayer[]}, {1 -> 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanAbsoluteLossLayer.html) for more details. # MeanAround `MeanAround[{x1,x2,x3,…}]` gives an Around object describing the mean of the xi and its uncertainty. `MeanAround[{{x11,x12,…},{x21,…},…}]` gives a VectorAround object describing the means of the vectors xi and their covariance. Examples [#examples] Compute mean with uncertainty: ```wolfram MeanAround[{1.2, 1.5, 1.3, 1.4}] (* Around[1.35, 0.065] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanAround.html) for more details. # MeanClusteringCoefficient `MeanClusteringCoefficient[g]` gives the mean clustering coefficient of the graph g. * `MeanClusteringCoefficient[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = RandomGraph[{10, 25}]; MeanClusteringCoefficient[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanClusteringCoefficient.html) for more details. # MeanDegreeConnectivity `MeanDegreeConnectivity[g]` gives a list of k-mean degree connectivity for the graph g for successive k=0,1,2.... * `MeanDegreeConnectivity[g, "In"]` gives a list of k-mean in-degree connectivity for the graph g. * `MeanDegreeConnectivity[g, "Out"]` gives a list of k-mean out-degree connectivity for the graph g. * `MeanDegreeConnectivity[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Get degree connectivity: ```wolfram MeanDegreeConnectivity[RandomGraph[{100, 200}]] ``` In-degree connectivity: ```wolfram MeanDegreeConnectivity[graph, "In"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanDegreeConnectivity.html) for more details. # MeanDeviation `MeanDeviation[data]` gives the mean absolute deviation from the mean of the elements in data. Examples [#examples] ```wolfram MeanDeviation[{1, 2, 3, 4, 5}] ``` ```wolfram MeanDeviation[RandomReal[1, 100]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanDeviation.html) for more details. # MeanGraphDistance `MeanGraphDistance[g]` gives the mean distance between all pairs of vertices in the graph g. * `MeanGraphDistance[{v -> w, …}]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}]; MeanGraphDistance[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanGraphDistance.html) for more details. # MeanNeighborDegree `MeanNeighborDegree[g]` gives a list of mean neighbor degrees of vertices for the graph *g*. * `MeanNeighborDegree[g, "In"]` gives a list of mean neighbor in-degrees. * `MeanNeighborDegree[g, "Out"]` gives a list of mean neighbor out-degrees. * `MeanNeighborDegree[{v -> w, ...}, ...]` uses rules *v -> w* to specify the graph *g*. Examples [#examples] ```wolfram MeanNeighborDegree[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanNeighborDegree.html) for more details. # MeanPointDensity `MeanPointDensity[pdata]` estimates the mean point density λ from point data pdata in the observation region reg. `MeanPointDensity[bdata]` estimates the mean point density λ from binned data bdata. `MeanPointDensity[pproc]` computes the mean point density λ for point process pproc. Examples [#examples] Estimate the mean point density from random points: ```wolfram points = RandomPoint[Disk[], 100]; MeanPointDensity[PointData[points, Disk[]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanPointDensity.html) for more details. # MeanShift `MeanShift[list,d]` replaces each element in list by the mean of the values of all elements that differ by less than d. `MeanShift[list,d,{p1,p2,…}]` returns the list where only the specified parts pi are replaced with mean-shifted values. `MeanShift[image,…]` mean shift of the pixel values in image. Examples [#examples] ```wolfram MeanShift[{1, 2, 3, 10, 11, 12}, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanShift.html) for more details. # MeanSquaredLossLayer `MeanSquaredLossLayer[]` represents a loss layer that computes the mean squared loss between its "Input" port and "Target" port. Examples [#examples] ```wolfram MeanSquaredLossLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeanSquaredLossLayer.html) for more details. # Median `Median[data]` gives the median of the elements in `data`. `Median[dist]` gives the median of the distribution `dist`. Examples [#examples] Compute the median of a list: ```wolfram Median[{1, 2, 3, 4, 5}] (* 3 *) Median[{1, 2, 3, 4}] (* 5/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Median.html) for more details. # MedianDeviation `MedianDeviation[data]` gives the median absolute deviation from the median of the elements in data. Examples [#examples] Calculate the median deviation of a list: ```wolfram MedianDeviation[{1, 2, 3, 4, 100}] (* 1 *) ``` More robust than standard deviation for outliers: ```wolfram {StandardDeviation[{1, 2, 3, 4, 100}], MedianDeviation[{1, 2, 3, 4, 100}]} ``` Apply to a matrix (column-wise): ```wolfram MedianDeviation[{{1, 2}, {3, 4}, {5, 100}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MedianDeviation.html) for more details. # MemberQ `MemberQ[list, form]` returns `True` if an element of list matches form, and `False` otherwise. Examples [#examples] Check membership: ```wolfram MemberQ[{a, b, c}, b] (* True *) MemberQ[{a, b, c}, d] (* False *) ``` With patterns: ```wolfram MemberQ[{1, 2, 3}, _Integer] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MemberQ.html) for more details. # Merge `Merge[{assoc1, assoc2, ...}, f]` merges associations, using `f` to combine values with the same key. Examples [#examples] Merge associations with conflict resolution: ```wolfram a1 = <|"x" -> 1, "y" -> 2|> a2 = <|"y" -> 3, "z" -> 4|> (* Sum values with same key *) Merge[{a1, a2}, Total] (* <|"x" -> 1, "y" -> 5, "z" -> 4|> *) (* Keep first value *) Merge[{a1, a2}, First] (* <|"x" -> 1, "y" -> 2, "z" -> 4|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Merge.html) for more details. # Missing `Missing[]` represents data that is missing. `Missing["reason"]` specifies a reason for the data being missing. `Missing["reason", expr]` associates the expression expr with the missing data. Examples [#examples] Create missing data: ```wolfram Missing["NotAvailable"] (* Missing["NotAvailable"] *) ``` Missing values propagate through computations: ```wolfram {1, 2, Missing[], 4} + 1 (* {2, 3, Missing[], 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Missing.html) for more details. # MissingQ `MissingQ[expr]` gives `True` if expr has head `Missing`. Examples [#examples] Test for Missing values: ```wolfram MissingQ[Missing["NotAvailable"]] (* True *) MissingQ[Missing[]] (* True *) MissingQ[5] (* False *) ``` Filter out missing values: ```wolfram Select[{1, Missing[], 3, Missing["NA"]}, Not @* MissingQ] (* {1, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MissingQ.html) for more details. # Most `Most[list]` gives the list with the last element removed. Equivalent to `Drop[list, -1]`. Examples [#examples] Remove the last element: ```wolfram Most[{a, b, c, d}] (* {a, b, c} *) Most[Range[10]] (* {1, 2, 3, 4, 5, 6, 7, 8, 9} *) (* Combine with Last *) {Most[{1, 2, 3}], Last[{1, 2, 3}]} (* {{1, 2}, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Most.html) for more details. # Nearest `Nearest[{elem1, elem2, ...}, x]` gives the list of elem\_i to which x is nearest. `Nearest[data, x, n]` gives the n nearest elem\_i to x. `Nearest[data]` generates a `NearestFunction[...]` that can be applied repeatedly to different x. Examples [#examples] Find nearest element: ```wolfram Nearest[{1, 2, 5, 10}, 4] (* {5} *) ``` Multiple nearest: ```wolfram Nearest[{1, 2, 5, 10}, 4, 2] (* {5, 2} *) ``` With points: ```wolfram Nearest[{{0, 0}, {1, 0}, {0, 1}}, {0.5, 0.5}] (* {{1, 0}} or {{0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Nearest.html) for more details. # NearestFunction `NearestFunction[data]` represents a function whose values give the elements closest to an element that is supplied. Examples [#examples] Create a nearest function and query it: ```wolfram nf = Nearest[{1, 2, 5, 8, 10}] nf[6] (* {5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NearestFunction.html) for more details. # NearestTo `NearestTo[x]` is an operator form that yields Nearest\[elems,x] when applied to a list elems. `NearestTo[x,n]` is an operator form that yields Nearest\[elems,x,n] when applied to a list elems. `NearestTo[x,{n,r}]` is an operator form that yields Nearest\[elems,x,\{n,r}] when applied to a list elems. Examples [#examples] Find the nearest element: ```wolfram NearestTo[2.5][{1, 2, 3, 4, 5}] (* {3} *) ``` Find the 3 nearest elements: ```wolfram NearestTo[2.5, 3][{1, 2, 3, 4, 5}] (* {3, 2, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NearestTo.html) for more details. # Nest `Nest[f, expr, n]` gives an expression with f applied n times to expr. Examples [#examples] Apply a function 3 times: ```wolfram Nest[f, x, 3] (* f[f[f[x]]] *) ``` Practical example: ```wolfram Nest[Sqrt, 256, 3] (* 2. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Nest.html) for more details. # NestGraph `NestGraph[f,expr,n]` gives the graph obtained by starting with expr and applying f successively n times. `NestGraph[f,{expr1,expr2,…},n]` gives the graph obtained by applying f to expr1, expr2, …. `NestGraph[f,graph,n]` gives the graph obtained by applying f to the vertices of graph and extending the graph. Examples [#examples] Create a graph by nesting a function: ```wolfram NestGraph[{# + 1, 2 #} &, 1, 4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestGraph.html) for more details. # NestList `NestList[f, expr, n]` gives a list of the results of applying f to expr 0 through n times. Examples [#examples] Create a list of successive applications: ```wolfram NestList[f, x, 3] (* {x, f[x], f[f[x]], f[f[f[x]]]} *) ``` Practical example: ```wolfram NestList[# + 1 &, 0, 5] (* {0, 1, 2, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestList.html) for more details. # NestTree `NestTree[f,tree]` adds children to each leaf of tree, with f\[expr] giving the list of data for the new children of a leaf with data expr. `NestTree[f,tree,n]` successively applies f to the data of each leaf up to level n, adding at most n levels to each leaf. `NestTree[f,tree,n,h]` additionally applies h to the data of the new subtrees. `NestTree[f,expr,…]` constructs a tree by nesting f on the tree leaf with data expr. Examples [#examples] ```wolfram NestTree[{#-1, #+1}&, 0, 2] (* Creates a tree starting from 0 with two levels *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestTree.html) for more details. # NestWhile `NestWhile[f, expr, test]` applies f repeatedly to expr until `test[result]` is no longer `True`. `NestWhile[f, expr, test, m]` supplies the most recent m results to test. `NestWhile[f, expr, test, m, max]` applies f at most max times. Examples [#examples] Divide by 2 while even: ```wolfram NestWhile[#/2 &, 64, EvenQ] (* 1 *) ``` Collatz sequence step: ```wolfram NestWhile[If[EvenQ[#], #/2, 3# + 1] &, 7, # != 1 &] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestWhile.html) for more details. # NestWhileList `NestWhileList[f, expr, test]` generates a list of results from applying f repeatedly until test fails. `NestWhileList[f, expr, test, m, max]` applies f at most max times. Examples [#examples] Divide by 2 while even: ```wolfram NestWhileList[#/2 &, 64, EvenQ] (* {64, 32, 16, 8, 4, 2, 1} *) ``` Collatz sequence: ```wolfram NestWhileList[If[EvenQ[#], #/2, 3# + 1] &, 7, # != 1 &] (* {7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestWhileList.html) for more details. # NestedGreaterGreater `NestedGreaterGreater[x, y, ...]` displays as x⪢y⪢.... Examples [#examples] Display the nested greater-greater relation: ```wolfram NestedGreaterGreater[a, b] ``` Multiple arguments: ```wolfram NestedGreaterGreater[x, y, z] ``` In mathematical notation: ```wolfram Row[{NestedGreaterGreater[1, 2], " means deeply greater"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestedGreaterGreater.html) for more details. # NestedLessLess `NestedLessLess[x, y, …]` displays as x⪡y⪡…. Examples [#examples] ```wolfram NestedLessLess[a, b, c] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NestedLessLess.html) for more details. # NoneTrue `NoneTrue[{e1, e2, ...}, test]` yields `True` if `test[ei]` is `False` for all elements. `NoneTrue[test]` represents an operator form that can be applied to an expression. Examples [#examples] Check if no elements are negative: ```wolfram NoneTrue[{1, 2, 3, 4}, Negative] (* True *) ``` Check if none are strings: ```wolfram NoneTrue[{1, "a", 3}, StringQ] (* False *) ``` Using operator form: ```wolfram NoneTrue[PrimeQ][{4, 6, 8, 9}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NoneTrue.html) for more details. # Nothing `Nothing` represents an element of a list that will automatically be removed. Examples [#examples] Nothing disappears from lists: ```wolfram {1, 2, Nothing, 3, Nothing, 4} (* {1, 2, 3, 4} *) ``` Conditionally remove elements: ```wolfram Table[If[OddQ[n], n, Nothing], {n, 1, 6}] (* {1, 3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Nothing.html) for more details. # NuttallWindow `NuttallWindow[x]` represents a Nuttall window function of x. The Nuttall window is a smoothing window used in signal processing with minimal spectral leakage. Examples [#examples] ```wolfram NuttallWindow[0.5] ``` ```wolfram Plot[NuttallWindow[x], {x, -1, 1}] ``` ```wolfram Periodogram[data, NuttallWindow] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NuttallWindow.html) for more details. # Operate `Operate[p, f[x, y, ...]]` gives `p[f][x, y, ...]`, applying `p` to the head of the expression. Examples [#examples] Apply function to head: ```wolfram Operate[g, f[x, y]] (* g[f][x, y] *) Operate[Print, Sin[x]] (* Print[Sin][x] *) (* At level 2 *) Operate[h, f[g[x]], 2] (* f[h[g]][x] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Operate.html) for more details. # OperatorApplied `OperatorApplied[f, n]` represents an operator form of the function f of n arguments so that `OperatorApplied[f, n][x1]...[xn]` is equivalent to `f[x1, ..., xn]`. * `OperatorApplied[f]` represents an operator form of the function f of two arguments so that `OperatorApplied[f][y][x]` is equivalent to `f[x, y]`. * `OperatorApplied[f, {i1, ..., in}]` represents an operator form of the function f of n arguments so that `OperatorApplied[f, {i1, ..., in}][x1]...[xn]` is equivalent to `f[xi1, ..., xin]`. * `OperatorApplied[f, k -> {i1, ..., in}]` represents an operator form that takes k arguments. Examples [#examples] Create a curried function: ```wolfram op = OperatorApplied[f, 3]; op[a][b][c] (* f[a, b, c] *) ``` Default two-argument form (swapped): ```wolfram OperatorApplied[Divide][2][10] (* 5 *) ``` Specify argument order: ```wolfram OperatorApplied[f, {2, 1}][a][b] (* f[b, a] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OperatorApplied.html) for more details. # Ordering `Ordering[list]` gives the positions that would sort the list. `Ordering[list, n]` gives positions of the `n` smallest elements. Examples [#examples] Find sorting order: ```wolfram list = {3, 1, 4, 1, 5, 9} Ordering[list] (* {2, 4, 1, 3, 5, 6} *) (* Verify: list[[Ordering[list]]] is sorted *) list[[Ordering[list]]] (* {1, 1, 3, 4, 5, 9} *) (* Positions of 3 largest *) Ordering[list, -3] (* {6, 5, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Ordering.html) for more details. # OrderingBy `OrderingBy[list, f]` gives the positions in list at which each successive element of `SortBy[list, f]` appears. * `OrderingBy[list, f, n]` gives the positions in list at which the first n elements of `SortBy[list, f]` appear. * `OrderingBy[list, f, -n]` gives the positions of the last n elements of `SortBy[list, f]`. * `OrderingBy[list, f, n, p]` gives positions in list of elements of `SortBy[list, f, p]`. * `OrderingBy[f]` represents an operator form of `OrderingBy` that can be applied to an expression. Examples [#examples] ```wolfram OrderingBy[{"apple", "pear", "banana"}, StringLength] ``` ```wolfram OrderingBy[{-3, 1, 5, -2}, Abs, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrderingBy.html) for more details. # OrderingLayer `OrderingLayer[]` represents a net layer that effectively applies `Ordering` to its input. * `OrderingLayer[n]` gives the first n elements in the ordering of its input. * `OrderingLayer[-n]` gives the last n elements in the ordering of its input. Examples [#examples] ```wolfram layer = OrderingLayer[3]; layer[{5, 2, 8, 1, 9}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrderingLayer.html) for more details. # PadLeft `PadLeft[list, n]` pads a list to length `n` with zeros on the left. `PadLeft[list, n, x]` uses element `x` for padding. Examples [#examples] Pad lists on the left: ```wolfram PadLeft[{1, 2, 3}, 6] (* {0, 0, 0, 1, 2, 3} *) PadLeft[{1, 2, 3}, 6, "x"] (* {"x", "x", "x", 1, 2, 3} *) (* Cyclic padding *) PadLeft[{1, 2}, 7, {a, b, c}] (* {a, b, c, a, b, 1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PadLeft.html) for more details. # PadRight `PadRight[list, n]` pads a list to length `n` with zeros on the right. `PadRight[list, n, x]` uses element `x` for padding. Examples [#examples] Pad lists on the right: ```wolfram PadRight[{1, 2, 3}, 6] (* {1, 2, 3, 0, 0, 0} *) PadRight[{a, b}, 5, "*"] (* {a, b, "*", "*", "*"} *) (* Make all sublists same length *) lists = {{1}, {1, 2}, {1, 2, 3}} PadRight[#, 4] & /@ lists (* {{1, 0, 0, 0}, {1, 2, 0, 0}, {1, 2, 3, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PadRight.html) for more details. # Part `expr[[i]]` or `Part[expr, i]` gives the ith part of expr. `expr[[-i]]` counts from the end. `expr[[i, j, ...]]` or `Part[expr, i, j, ...]` is equivalent to `expr[[i]][[j]]...`. `expr[[{i1, i2, ...}]]` gives a list of the parts i1, i2, ... of expr. `expr[[m;;n]]` gives parts m through n. Examples [#examples] Get the second element: ```wolfram {a, b, c, d}[[2]] (* b *) ``` Get the last element: ```wolfram {a, b, c, d}[[-1]] (* d *) ``` Get multiple parts: ```wolfram {a, b, c, d}[[{1, 3}]] (* {a, c} *) ``` Slice a list: ```wolfram {a, b, c, d, e}[[2;;4]] (* {b, c, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Part.html) for more details. # PartialCorrelationFunction `PartialCorrelationFunction[data,hspec]` estimates the partial correlation function at lags hspec from data. `PartialCorrelationFunction[tproc,hspec]` represents the partial correlation function at lags hspec for the time series process tproc. Examples [#examples] Estimate partial correlation at specific lags: ```wolfram PartialCorrelationFunction[{1, 2, 3, 2, 1, 2, 3}, {1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PartialCorrelationFunction.html) for more details. # Partition `Partition[list, n]` partitions list into nonoverlapping sublists of length n. `Partition[list, n, d]` generates sublists with offset d. Examples [#examples] Partition into pairs: ```wolfram Partition[{a, b, c, d, e, f}, 2] (* {{a, b}, {c, d}, {e, f}} *) ``` Overlapping partitions: ```wolfram Partition[{1, 2, 3, 4, 5}, 3, 1] (* {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Partition.html) for more details. # PartitionsP `PartitionsP[n]` gives the number p(n) of unrestricted partitions of the integer n. Examples [#examples] Number of partitions: ```wolfram PartitionsP[5] (* 7 *) ``` Larger value: ```wolfram PartitionsP[100] (* 190569292 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PartitionsP.html) for more details. # PartitionsQ `PartitionsQ[n]` gives the number q(n) of partitions of the integer n into distinct parts. Examples [#examples] Distinct partitions: ```wolfram PartitionsQ[5] (* 3 *) ``` Compare with PartitionsP: ```wolfram {PartitionsP[10], PartitionsQ[10]} (* {42, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PartitionsQ.html) for more details. # ParzenWindow `ParzenWindow[x]` represents a Parzen window function of x. Examples [#examples] ```wolfram ParzenWindow[0.3] ``` ```wolfram Plot[ParzenWindow[x], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParzenWindow.html) for more details. # PermutationReplace `PermutationReplace[expr, perm]` replaces each part in expr by its image under the permutation perm. * `PermutationReplace[expr, gr]` returns the list of images of expr under all elements of the permutation group gr. Examples [#examples] ```wolfram PermutationReplace[{a, b, c}, Cycles[{{1, 2, 3}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationReplace.html) for more details. # Permutations `Permutations[list]` generates all permutations of the elements. `Permutations[list, {n}]` gives permutations of exactly `n` elements. Examples [#examples] Generate permutations: ```wolfram Permutations[{a, b, c}] (* {{a, b, c}, {a, c, b}, {b, a, c}, {b, c, a}, {c, a, b}, {c, b, a}} *) (* 2-element permutations *) Permutations[{1, 2, 3}, {2}] (* {{1, 2}, {1, 3}, {2, 1}, {2, 3}, {3, 1}, {3, 2}} *) Length[Permutations[Range[5]]] (* 120 = 5! *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Permutations.html) for more details. # Permute `Permute[expr, perm]` permutes the positions of the elements of expr according to the permutation perm. * `Permute[expr, gr]` returns the list of permuted forms of expr under the elements of the permutation group gr. This function rearranges elements according to a specified permutation. Examples [#examples] ```wolfram Permute[{a, b, c, d}, Cycles[{{1, 3}}]] ``` ```wolfram Permute[{1, 2, 3, 4}, {2, 3, 4, 1}] ``` ```wolfram Permute[{a, b, c}, SymmetricGroup[3]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Permute.html) for more details. # Pick `Pick[list, sel]` picks out those elements of *list* for which the corresponding element of *sel* is `True`. * `Pick[list, sel, patt]` picks out those elements of *list* for which the corresponding element of *sel* matches *patt*. Examples [#examples] ```wolfram Pick[{a, b, c, d}, {True, False, True, False}] (* {a, c} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pick.html) for more details. # Position `Position[expr, pattern]` gives a list of the positions at which objects matching pattern appear in expr. Examples [#examples] Find positions of an element: ```wolfram Position[{a, b, c, b, a}, b] (* {{2}, {4}} *) ``` Find positions in nested lists: ```wolfram Position[{{1, 2}, {3, 1}}, 1] (* {{1, 1}, {2, 2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Position.html) for more details. # PositionIndex `PositionIndex[list]` gives an association between unique elements in list and the positions at which they occur. * `PositionIndex[assoc]` gives an association whose keys are the distinct values in assoc, and whose values are lists of the keys with which they are associated. Examples [#examples] ```wolfram PositionIndex[{a, b, c, a, b, a}] ``` ```wolfram PositionIndex[<|"x" -> 1, "y" -> 2, "z" -> 1|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositionIndex.html) for more details. # PositionLargest `PositionLargest[list]` gives the positions of the numerically largest value in list. * `PositionLargest[list, n]` gives the positions of the first n largest values. * `PositionLargest[list, n, orderfun]` gives the positions of the n largest values in list as determined by orderfun. Examples [#examples] Find the position of the largest element: ```wolfram PositionLargest[{3, 1, 4, 1, 5, 9, 2, 6}] ``` Find positions of the 3 largest elements: ```wolfram PositionLargest[{3, 1, 4, 1, 5, 9, 2, 6}, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositionLargest.html) for more details. # PositionSmallest `PositionSmallest[list]` gives the positions of the numerically smallest value in list. `PositionSmallest[list, n]` gives the positions of the first n smallest values. `PositionSmallest[list, n, orderfun]` gives the positions of the n smallest values as determined by orderfun. Examples [#examples] Find position of the smallest element: ```wolfram PositionSmallest[{5, 2, 8, 1, 9}] (* {{4}} *) ``` Find positions of the 3 smallest: ```wolfram PositionSmallest[{5, 2, 8, 1, 9}, 3] (* {{4}, {2}, {1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositionSmallest.html) for more details. # Prepend `Prepend[expr, elem]` gives expr with elem prepended. Examples [#examples] Prepend to a list: ```wolfram Prepend[{b, c, d}, a] (* {a, b, c, d} *) ``` Operator form: ```wolfram Prepend[x][{1, 2, 3}] (* {x, 1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Prepend.html) for more details. # PrependLayer `PrependLayer[]` represents a net layer that takes an input array and prepends another array to it. Examples [#examples] ```wolfram PrependLayer[] ``` ```wolfram PrependLayer[][<|"Input" -> {1, 2, 3}, "Element" -> 0|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrependLayer.html) for more details. # PrependTo `PrependTo[x,elem]` prepends elem to the value of x, and resets x to the result. Examples [#examples] Prepend an element to a list: ```wolfram x = {2, 3, 4}; PrependTo[x, 1]; x (* {1, 2, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrependTo.html) for more details. # Query `Query[op1, op2, ...]` represents a query that can be applied to a `Dataset`, with successive operators applied at deeper levels. Examples [#examples] Build and apply a query: ```wolfram ds = Dataset[{<|"x" -> 1, "y" -> 2|>, <|"x" -> 3, "y" -> 4|>}] (* Sum all x values *) ds[Total, "x"] (* 4 *) (* Using Query explicitly *) Query[All, "y"][ds] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Query.html) for more details. # Range `Range[imax]` generates the list `{1, 2, ..., imax}`. `Range[imin, imax]` generates the list `{imin, ..., imax}`. `Range[imin, imax, di]` uses step di. Examples [#examples] Generate integers 1 to 5: ```wolfram Range[5] (* {1, 2, 3, 4, 5} *) ``` Generate with custom start and step: ```wolfram Range[0, 10, 2] (* {0, 2, 4, 6, 8, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Range.html) for more details. # RankedMax `RankedMax[list,n]` gives the nth largest element in list. `RankedMax[list,-n]` gives the nth smallest element in list. Examples [#examples] Get the 2nd largest element: ```wolfram RankedMax[{3, 1, 4, 1, 5, 9, 2, 6}, 2] (* 6 *) ``` Get the 3rd smallest element: ```wolfram RankedMax[{3, 1, 4, 1, 5, 9, 2, 6}, -3] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RankedMax.html) for more details. # RankedMin `RankedMin[list, n]` gives the nth smallest element in list. `RankedMin[list, -n]` gives the nth largest element in list. Examples [#examples] Get the 2nd smallest element: ```wolfram RankedMin[{3, 1, 4, 1, 5, 9, 2, 6}, 2] (* 1 *) ``` Get the 3rd largest element: ```wolfram RankedMin[{3, 1, 4, 1, 5, 9, 2, 6}, -3] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RankedMin.html) for more details. # Ratios `Ratios[list]` gives the successive ratios between consecutive elements: `{e2/e1, e3/e2, ...}`. Examples [#examples] Compute ratios: ```wolfram Ratios[{1, 2, 4, 8, 16}] (* {2, 2, 2, 2} *) Ratios[{1, 2, 6, 24, 120}] (* {2, 3, 4, 5} *) (* Detecting geometric sequences *) Ratios[{3, 9, 27, 81}] (* {3, 3, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Ratios.html) for more details. # Reap `Reap[expr]` gives the value of expr together with all expressions to which Sow has been applied during its evaluation. Expressions sown using Sow\[e] or Sow\[e,tagi] with different tags are given in different lists. `Reap[expr,patt]` reaps only expressions sown with tags that match patt. `Reap[expr,{patt1,patt2,…}]` puts expressions associated with each of the patti in a separate list. `Reap[expr,patt,f]` returns \{expr,\{f\[tag1,\{e11,e12,…}],…}}. Examples [#examples] ```wolfram Reap[Sow[1]; Sow[2]; Sow[3]] (* {3, {{1, 2, 3}}} *) ``` ```wolfram Reap[Sow[a, x]; Sow[b, y]; Sow[c, x], x] (* {c, {{a, c}}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Reap.html) for more details. # ReapVideo `ReapVideo[expr]` gives a video whose frames are the expressions to which `SowVideo` has been applied during its evaluation. Examples [#examples] ```wolfram ReapVideo[Do[SowVideo[Graphics[Disk[{i, i}]]], {i, 10}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReapVideo.html) for more details. # ReplacePart `ReplacePart[expr, i -> new]` yields an expression in which the ith part is replaced by new. Examples [#examples] Replace at position: ```wolfram ReplacePart[{a, b, c, d}, 2 -> x] (* {a, x, c, d} *) ``` Replace multiple parts: ```wolfram ReplacePart[{a, b, c, d}, {1 -> x, 3 -> y}] (* {x, b, y, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReplacePart.html) for more details. # Rest `Rest[list]` gives the list with the first element removed. Equivalent to `Drop[list, 1]`. Examples [#examples] Remove the first element: ```wolfram Rest[{a, b, c, d}] (* {b, c, d} *) Rest[Range[10]] (* {2, 3, 4, 5, 6, 7, 8, 9, 10} *) (* Combine with First *) {First[{1, 2, 3}], Rest[{1, 2, 3}]} (* {1, {2, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rest.html) for more details. # Restricted `Restricted[form,cond,…]` represents a form for `Interpreter` and related functions restricted according to the conditions cond. Examples [#examples] Create a restricted integer interpreter: ```wolfram Interpreter[Restricted["Integer", {1, 100}]]["50"] (* 50 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Restricted.html) for more details. # Reverse `Reverse[expr]` reverses the order of the elements in expr. Examples [#examples] Reverse a list: ```wolfram Reverse[{1, 2, 3, 4, 5}] (* {5, 4, 3, 2, 1} *) ``` Reverse a string: ```wolfram StringReverse["hello"] (* "olleh" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Reverse.html) for more details. # ReverseApplied `ReverseApplied[f]` represents a form of f that takes arguments in reverse order so that `ReverseApplied[f][x1, ..., xn]` is equivalent to `f[xn, ..., x1]`. * `ReverseApplied[f, n]` represents a form of f that reverses the first n arguments before evaluation. Examples [#examples] Reverse all arguments: ```wolfram ReverseApplied[Divide][2, 10] (* 5 *) ``` Reverse first 2 arguments: ```wolfram ReverseApplied[f, 2][a, b, c, d] (* f[b, a, c, d] *) ``` Use with Subtract: ```wolfram ReverseApplied[Subtract][3, 10] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseApplied.html) for more details. # ReverseElement `ReverseElement[x, y, ...]` displays as x∋y∋…. This is a symbolic representation that displays as the "contains as member" relation symbol (reverse of ∈). Examples [#examples] ```wolfram ReverseElement[A, x] ``` ```wolfram ReverseElement[S, a, b] ``` ```wolfram A \[ReverseElement] x ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseElement.html) for more details. # ReverseEquilibrium `ReverseEquilibrium[x,y,…]` displays as x⇋y⇋…. Examples [#examples] ```wolfram ReverseEquilibrium[a, b] (* a ⇋ b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseEquilibrium.html) for more details. # ReverseGraph `ReverseGraph[g]` gives the reverse graph of the directed graph g. * `ReverseGraph[{v -> w, ...}]` uses rules `v -> w` to specify the graph g. The reverse graph has all edge directions reversed. Examples [#examples] ```wolfram ReverseGraph[Graph[{1 -> 2, 2 -> 3, 3 -> 1}]] ``` ```wolfram g = DirectedGraph[PathGraph[{a, b, c, d}]]; ReverseGraph[g] ``` ```wolfram ReverseGraph[{a -> b, b -> c, c -> d}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseGraph.html) for more details. # ReverseSort `ReverseSort[list]` sorts the elements of list into reverse canonical order. `ReverseSort[list, p]` sorts using the ordering function p. Examples [#examples] Sort a list in descending order: ```wolfram ReverseSort[{3, 1, 4, 1, 5, 9}] (* {9, 5, 4, 3, 1, 1} *) ``` Sort strings by length (longest first): ```wolfram ReverseSort[{"a", "bbb", "cc"}, StringLength] (* {"bbb", "cc", "a"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseSort.html) for more details. # ReverseSortBy `ReverseSortBy[list, f]` sorts the elements of list using the reverse canonical order defined by applying f to each of them. * `ReverseSortBy[list, f, p]` sorts the elements of list using the function p to compare pairs of results of applying f to each element. * `ReverseSortBy[f]` represents an operator form of `ReverseSortBy` that can be applied to an expression. Examples [#examples] ```wolfram ReverseSortBy[{1, -3, 2, -5}, Abs] ``` ```wolfram ReverseSortBy[{"apple", "pie", "cake"}, StringLength] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseSortBy.html) for more details. # ReverseUpEquilibrium `ReverseUpEquilibrium[x, y, …]` displays as x⥯y⥯…. Examples [#examples] ```wolfram ReverseUpEquilibrium[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReverseUpEquilibrium.html) for more details. # Riffle `Riffle[{e1, e2, ...}, x]` interleaves `x` between elements: `{e1, x, e2, x, ...}`. Examples [#examples] Interleave elements: ```wolfram Riffle[{a, b, c}, "-"] (* {a, "-", b, "-", c} *) (* With multiple separators *) Riffle[{1, 2, 3}, {a, b}] (* {1, a, 2, b, 3} *) (* Join strings with separator *) StringJoin[Riffle[{"a", "b", "c"}, ","]] (* "a,b,c" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Riffle.html) for more details. # RotateLeft `RotateLeft[expr, n]` cycles the elements in expr n positions to the left. `RotateLeft[expr]` cycles one position to the left. Examples [#examples] Rotate left by 1: ```wolfram RotateLeft[{a, b, c, d, e}] (* {b, c, d, e, a} *) ``` Rotate left by 2: ```wolfram RotateLeft[{a, b, c, d, e}, 2] (* {c, d, e, a, b} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RotateLeft.html) for more details. # RotateRight `RotateRight[expr, n]` cycles the elements in expr n positions to the right. `RotateRight[expr]` cycles one position to the right. Examples [#examples] Rotate right by 1: ```wolfram RotateRight[{a, b, c, d, e}] (* {e, a, b, c, d} *) ``` Rotate right by 2: ```wolfram RotateRight[{a, b, c, d, e}, 2] (* {d, e, a, b, c} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RotateRight.html) for more details. # Scan `Scan[f, expr]` evaluates f applied to each element of expr in turn (for side effects). `Scan[f, expr, levelspec]` applies f to parts at specified levels. Examples [#examples] Print each element: ```wolfram Scan[Print, {a, b, c}] (* prints: a, b, c *) ``` Accumulate values with side effects: ```wolfram total = 0; Scan[(total += #) &, {1, 2, 3, 4}]; total (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Scan.html) for more details. # Select `Select[data, crit]` picks out all elements ei of data for which crit\[ei] is True. `Select[data, crit, n]` picks out the first n elements for which crit\[ei] is True. `Select[crit]` represents an operator form of Select that can be applied to an expression. Examples [#examples] Select even numbers: ```wolfram Select[{1, 2, 3, 4, 5, 6}, EvenQ] (* {2, 4, 6} *) ``` Select with a custom condition: ```wolfram Select[{-3, -1, 0, 2, 5}, # > 0 &] (* {2, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Select.html) for more details. # SelectComponents `SelectComponents[{image, lmat}, crit]` selects components of image indicated by the label matrix lmat that satisfy crit, replacing other parts with black. * `SelectComponents[image, crit]` selects connected components of image. * `SelectComponents[…, "prop", n]` computes the property "prop" and selects the first n in sorted order. * `SelectComponents[…, "prop", n, p]` sorts computed properties using the ordering function p. Examples [#examples] ```wolfram SelectComponents[img, #Area > 100 &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SelectComponents.html) for more details. # SelectFirst `SelectFirst[data, crit]` gives the first element for which `crit[ei]` is `True`, or `Missing["NotFound"]` if none is found. Examples [#examples] Find first even number: ```wolfram SelectFirst[{1, 3, 5, 6, 7, 8}, EvenQ] (* 6 *) ``` With default value: ```wolfram SelectFirst[{1, 3, 5}, EvenQ, "none"] (* "none" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SelectFirst.html) for more details. # SelectedCells `SelectedCells[notebook]` returns a list of `CellObject` expressions corresponding to the currently selected cells in notebook. * `SelectedCells[]` returns the currently selected cells in the notebook in which this function is being evaluated. Examples [#examples] ```wolfram SelectedCells[] ``` ```wolfram SelectedCells[EvaluationNotebook[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SelectedCells.html) for more details. # SequenceCases `SequenceCases[list, patt]` gives a list of the sublists in list that match the sequence pattern patt. `SequenceCases[list, patt -> rhs]` gives a list of the values of rhs corresponding to sublists that match patt. `SequenceCases[list, patt, n]` includes only the first n matches. Examples [#examples] Find consecutive pairs: ```wolfram SequenceCases[{a, b, c, d}, {x_, y_}] (* {{a, b}, {c, d}} *) ``` Extract matching sequences: ```wolfram SequenceCases[{1, 2, 3, 4, 5}, {x_, y_} /; y == x + 1] (* {{1, 2}, {2, 3}, {3, 4}, {4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceCases.html) for more details. # SequenceCount `SequenceCount[list, sub]` gives a count of the number of times sub appears as a sublist of list. `SequenceCount[list, patt]` gives the number of sublists in list that match the general sequence pattern patt. Examples [#examples] Count occurrences of a sublist: ```wolfram SequenceCount[{a, b, a, b, c, a, b}, {a, b}] (* 3 *) ``` Count pattern matches: ```wolfram SequenceCount[{1, 2, 3, 4, 5}, {x_, y_} /; y > x] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceCount.html) for more details. # SequencePosition `SequencePosition[list, sublist]` gives a list of the starting and ending positions at which sublist appears in list. `SequencePosition[list, patt]` gives all positions at which sequences matching patt occur in list. `SequencePosition[list, patt, n]` includes only the first n occurrences. Examples [#examples] Find positions of a sublist: ```wolfram SequencePosition[{a, b, c, a, b, d}, {a, b}] (* {{1, 2}, {4, 5}} *) ``` Find consecutive integer pairs: ```wolfram SequencePosition[{1, 2, 4, 5, 6}, {x_, y_} /; y == x + 1] (* {{1, 2}, {3, 4}, {4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequencePosition.html) for more details. # SequenceReplace `SequenceReplace[list, rules]` replaces sequences in list according to the specified rule or list of rules. `SequenceReplace[list, rules, n]` does only the first n replacements. `SequenceReplace[rules]` represents an operator form that can be applied to an expression. Examples [#examples] Replace a sequence: ```wolfram SequenceReplace[{a, b, c, d}, {a, b} -> x] (* {x, c, d} *) ``` Replace all consecutive pairs: ```wolfram SequenceReplace[{1, 2, 3, 4}, {x_, y_} -> x + y] (* {3, 7} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceReplace.html) for more details. # SequenceSplit `SequenceSplit[list, patt]` splits list into sublists separated by sequences that match the sequence pattern patt. * `SequenceSplit[list, patt -> rhs]` inserts rhs at the position of each matched sequence. * `SequenceSplit[list, {patt1 -> rhs1, ...}]` inserts rhsi at the position of each patti. * `SequenceSplit[list, patt, n]` splits into at most n sublists. Examples [#examples] ```wolfram SequenceSplit[{a, b, 0, c, d, 0, e}, {0}] ``` ```wolfram SequenceSplit[{1, 2, 3, 4, 5}, {x_, y_} /; x + y > 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceSplit.html) for more details. # Shortest `Shortest[p]` is a pattern object that matches the shortest sequence consistent with the pattern p. Examples [#examples] Match shortest sequence: ```wolfram ReplaceList[{a, b, c, d}, {Shortest[x__], y__} -> {{x}, {y}}] (* {{{a}, {b, c, d}}} *) ``` Compare with longest match: ```wolfram Cases[{{a, b}, {a, b, c}, {a}}, {Shortest[__]}] (* {{a}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Shortest.html) for more details. # ShortestMatch `ShortestMatch[p]` is a string pattern object matching the shortest sequence of characters consistent with the string pattern p. Examples [#examples] Match shortest string: ```wolfram StringCases["aXbXc", "a" ~~ ShortestMatch[__] ~~ "c"] (* {"aXbXc"} *) ``` Compare with greedy match: ```wolfram StringCases["<a><b>", "<" ~~ ShortestMatch[__] ~~ ">"] (* {"<a>", "<b>"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShortestMatch.html) for more details. # Sort `Sort[list]` sorts the elements of list into canonical order. `Sort[list, p]` sorts using the ordering function p. Examples [#examples] Sort a list of numbers: ```wolfram Sort[{3, 1, 4, 1, 5, 9, 2, 6}] (* {1, 1, 2, 3, 4, 5, 6, 9} *) ``` Sort in descending order: ```wolfram Sort[{3, 1, 4, 1, 5}, Greater] (* {5, 4, 3, 1, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sort.html) for more details. # SortBy `SortBy[list, f]` sorts the elements of list in the order defined by applying f to each of them. Examples [#examples] Sort by length: ```wolfram SortBy[{"apple", "pie", "banana"}, StringLength] (* {"pie", "apple", "banana"} *) ``` Sort by absolute value: ```wolfram SortBy[{3, -1, 2, -5, 4}, Abs] (* {-1, 2, 3, 4, -5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SortBy.html) for more details. # SortedEntityClass `SortedEntityClass[class,prop]` represents an entity class derived from class by sorting according to the values of the property prop. `SortedEntityClass[class,prop->"order"]` sorts according to prop in the order specified. `SortedEntityClass[class,{prop1,prop2,…}]` breaks ties by successively using the values of the property specifications propi. `SortedEntityClass[class,sortspec,n]` represents the first n entities of class when sorted by sortspec. `SortedEntityClass[class,sortspec,{m,n}]` represents the entities m through n of class when sorted by sortspec. Examples [#examples] Get countries sorted by population: ```wolfram SortedEntityClass["Country", "Population" -> "Descending", 5] (* SortedEntityClass[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SortedEntityClass.html) for more details. # Sow `Sow[e]` specifies that e should be collected by the nearest enclosing Reap. `Sow[e, tag]` specifies that e should be collected by the nearest enclosing Reap whose pattern matches tag. `Sow[e, {tag1, tag2, ...}]` specifies that e should be collected once for each pattern that matches a tagi. Examples [#examples] Collect values with Reap and Sow: ```wolfram Reap[Do[Sow[i^2], {i, 5}]] (* {Null, {{1, 4, 9, 16, 25}}} *) ``` Use tags to separate values: ```wolfram Reap[Do[Sow[i, If[EvenQ[i], "even", "odd"]], {i, 6}], {"even", "odd"}] (* {Null, {{{2, 4, 6}}, {{1, 3, 5}}}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sow.html) for more details. # SowVideo `SowVideo[frame]` specifies that frame should be collected by the nearest enclosing `ReapVideo`. * `SowVideo[frame, n]` repeats frame n times when reaped. This function is used for procedural video generation. Examples [#examples] ```wolfram ReapVideo[Do[SowVideo[Graphics[Circle[], ImageSize -> 100]], 10]] ``` ```wolfram ReapVideo[Table[SowVideo[Plot[Sin[x + t], {x, 0, 2 Pi}]], {t, 0, 2 Pi, 0.1}]] ``` ```wolfram SowVideo[frame, 5] (* Repeat frame 5 times *) ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SowVideo.html) for more details. # Split `Split[list]` splits list into sublists consisting of runs of identical elements. `Split[list, test]` treats adjacent elements as identical when test yields `True`. Examples [#examples] Split into runs: ```wolfram Split[{1, 1, 2, 3, 3, 3, 1}] (* {{1, 1}, {2}, {3, 3, 3}, {1}} *) ``` With custom test: ```wolfram Split[{1, 2, 3, 5, 6, 8}, #2 == #1 + 1 &] (* {{1, 2, 3}, {5, 6}, {8}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Split.html) for more details. # SplitBy `SplitBy[list, f]` splits list into sublists consisting of runs of successive elements that give the same value when f is applied. `SplitBy[list, {f1, f2, ...}]` recursively splits list into sublists by testing elements successively with each of the fi. Examples [#examples] Split by a function: ```wolfram SplitBy[{1, 2, 2, 3, 1, 1, 1}, EvenQ] (* {{1}, {2, 2}, {3}, {1, 1, 1}} *) ``` Split strings by first character: ```wolfram SplitBy[{"apple", "ant", "banana", "cherry"}, First@Characters[#] &] (* {{"apple", "ant"}, {"banana"}, {"cherry"}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SplitBy.html) for more details. # Standardize `Standardize[list]` shifts and rescales the elements of list to have zero mean and unit sample variance. * `Standardize[list, f1]` shifts the elements in list by f1\[list] and rescales them to have unit sample variance. * `Standardize[list, f1, f2]` shifts by f1\[list] and scales by f2\[list]. Examples [#examples] ```wolfram Standardize[{1, 2, 3, 4, 5}] ``` ```wolfram Standardize[{10, 20, 30}, Mean, StandardDeviation] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Standardize.html) for more details. # Subdivide `Subdivide[n]` generates the list `{0, 1/n, 2/n, ..., 1}`. `Subdivide[xmax, n]` subdivides the interval 0 to xmax into n equal parts. `Subdivide[xmin, xmax, n]` subdivides the interval xmin to xmax. Examples [#examples] Subdivide unit interval: ```wolfram Subdivide[4] (* {0, 1/4, 1/2, 3/4, 1} *) ``` Subdivide a range: ```wolfram Subdivide[0, 10, 5] (* {0, 2, 4, 6, 8, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subdivide.html) for more details. # SubsetCases `SubsetCases[list,patt]` gives a list of the sublists in list that match the pattern patt in any order. `SubsetCases[list,patt->rhs]` gives a list of the values of rhs corresponding to matching sublists. `SubsetCases[list,patt,n]` includes only the first n matches. Examples [#examples] Find subsets matching a pattern: ```wolfram SubsetCases[{1, 2, 3, 4}, {_?OddQ, _?EvenQ}] (* {{1, 2}, {1, 4}, {3, 2}, {3, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubsetCases.html) for more details. # SubsetCount `SubsetCount[list,sub]` gives a count of the number of times sub appears in any order as a sublist of list. `SubsetCount[list,patt]` gives the number of sublists in list that match the general pattern patt in any order. Examples [#examples] Count occurrences of a subset: ```wolfram SubsetCount[{a, b, c, a, b}, {a, b}] (* 2 *) ``` Count subsets matching a pattern: ```wolfram SubsetCount[{1, 2, 3, 4}, {_?OddQ, _?EvenQ}] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubsetCount.html) for more details. # SubsetPosition `SubsetPosition[list, sublist]` gives a list of positions at which sublist appears in list in any order. * `SubsetPosition[list, patt]` gives all positions at which sublists matching patt in any order appear in list. * `SubsetPosition[list, patt, n]` includes only the first n positions. Examples [#examples] ```wolfram SubsetPosition[{a, b, c, d, e}, {b, d}] ``` ```wolfram SubsetPosition[{1, 2, 3, 4, 5}, {2, 4}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubsetPosition.html) for more details. # SubsetReplace `SubsetReplace[list, rules]` replaces sublists in list according to the specified rule or list of rules. * `SubsetReplace[list, rules, n]` does only the first n replacements. * `SubsetReplace[rules]` represents an operator form of `SubsetReplace` that can be applied to an expression. Examples [#examples] ```wolfram SubsetReplace[{1, 2, 3, 4}, {1, 2} -> x] ``` ```wolfram SubsetReplace[{a, b, c, b, c, d}, {b, c} -> z, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubsetReplace.html) for more details. # Table `Table[expr, n]` generates a list of n copies of expr. `Table[expr, {i, imax}]` generates a list of the values of expr when i runs from 1 to imax. `Table[expr, {i, imin, imax}]` starts with i=imin. `Table[expr, {i, imin, imax, di}]` uses steps di. Examples [#examples] Generate a list of squares: ```wolfram Table[i^2, {i, 5}] (* {1, 4, 9, 16, 25} *) ``` Create a multiplication table: ```wolfram Table[i*j, {i, 3}, {j, 3}] (* {{1, 2, 3}, {2, 4, 6}, {3, 6, 9}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Table.html) for more details. # TableForm `TableForm[list]` displays a list as a table with elements in rectangular cells. Examples [#examples] Display data as a table: ```wolfram TableForm[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] (* With headers *) TableForm[ {{"Alice", 30}, {"Bob", 25}}, TableHeadings -> {None, {"Name", "Age"}} ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TableForm.html) for more details. # Take `Take[list, n]` gives the first n elements of list. `Take[list, -n]` gives the last n elements of list. `Take[list, {m, n}]` gives elements m through n of list. Examples [#examples] Take the first 3 elements: ```wolfram Take[{a, b, c, d, e}, 3] (* {a, b, c} *) ``` Take the last 2 elements: ```wolfram Take[{a, b, c, d, e}, -2] (* {d, e} *) ``` Take a range: ```wolfram Take[{a, b, c, d, e}, {2, 4}] (* {b, c, d} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Take.html) for more details. # TakeDrop `TakeDrop[list, n]` gives the pair \{list1, list2}, where list1 contains the first n elements of list and list2 contains the rest. * `TakeDrop[list, seq]` gives the pair \{Take\[list, seq], Drop\[list, seq]}. Examples [#examples] ```wolfram TakeDrop[{a, b, c, d, e}, 2] ``` ```wolfram TakeDrop[Range[10], -3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeDrop.html) for more details. # TakeLargest `TakeLargest[data, n]` gives the n largest elements of data, sorted in descending order. `TakeLargest[n]` represents an operator form. Examples [#examples] Get 3 largest elements: ```wolfram TakeLargest[{3, 1, 4, 1, 5, 9, 2, 6}, 3] (* {9, 6, 5} *) ``` From an association: ```wolfram TakeLargest[<|"a" -> 5, "b" -> 2, "c" -> 8, "d" -> 1|>, 2] (* {8, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeLargest.html) for more details. # TakeLargestBy `TakeLargestBy[data, f, n]` gives the n elements ei in data for which f\[ei] is largest, sorted in descending order. * `TakeLargestBy[data -> prop, f, n]` gives the property prop for the n elements in data for which f\[ei] is largest. * `TakeLargestBy[data, f, n, p]` uses the ordering function p for sorting. * `TakeLargestBy[f, n]` represents an operator form of `TakeLargestBy` that can be applied to an expression. Examples [#examples] ```wolfram TakeLargestBy[{-5, 3, -2, 8, 1}, Abs, 3] ``` ```wolfram TakeLargestBy[{"apple", "banana", "cherry"}, StringLength, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeLargestBy.html) for more details. # TakeList `TakeList[list,{n1,n2,…}]` gives the list of results obtained by successively taking ni elements from list. `TakeList[list,{seq1,seq2,…}]` successively uses the sequence specifications seqi. `TakeList[list,seqs1,seqs2,…]` gives a nested list in which elements specified by the lists seqsi are taken at level i in list. Examples [#examples] Take successive groups of elements: ```wolfram TakeList[{a, b, c, d, e, f, g}, {2, 3, 2}] (* {{a, b}, {c, d, e}, {f, g}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeList.html) for more details. # TakeSmallest `TakeSmallest[data, n]` gives the n smallest elements of data, sorted in ascending order. `TakeSmallest[n]` represents an operator form. Examples [#examples] Get 3 smallest elements: ```wolfram TakeSmallest[{3, 1, 4, 1, 5, 9, 2, 6}, 3] (* {1, 1, 2} *) ``` From an association: ```wolfram TakeSmallest[<|"a" -> 5, "b" -> 2, "c" -> 8, "d" -> 1|>, 2] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeSmallest.html) for more details. # TakeSmallestBy `TakeSmallestBy[data,f,n]` gives the n elements ei in data for which f\[ei] is smallest, sorted in ascending order. `TakeSmallestBy[data->prop,f,n]` gives the property prop for the n elements in data for which f\[ei] is smallest. `TakeSmallestBy[data,f,n,p]` uses the ordering function p for sorting. `TakeSmallestBy[f,n]` represents an operator form of TakeSmallestBy that can be applied to an expression. Examples [#examples] Get the 2 smallest elements by absolute value: ```wolfram TakeSmallestBy[{-5, 2, 10, -3}, Abs, 2] (* {2, -3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeSmallestBy.html) for more details. # TakeWhile `TakeWhile[list, crit]` gives elements ei from the beginning of list, continuing so long as crit\[ei] is True. Examples [#examples] Take while positive: ```wolfram TakeWhile[{1, 2, 3, -1, 4, 5}, Positive] (* {1, 2, 3} *) ``` Take while less than 5: ```wolfram TakeWhile[{1, 3, 5, 7, 9}, # < 5 &] (* {1, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TakeWhile.html) for more details. # Tally `Tally[list]` tallies the elements in list, listing all distinct elements together with their multiplicities. Examples [#examples] Count element occurrences: ```wolfram Tally[{a, b, a, c, b, a}] (* {{a, 3}, {b, 2}, {c, 1}} *) ``` Count characters: ```wolfram Tally[Characters["mississippi"]] (* {{"m", 1}, {"i", 4}, {"s", 4}, {"p", 2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tally.html) for more details. # Thread `Thread[f[args]]` threads f over any lists that appear in args. Examples [#examples] Thread over lists: ```wolfram Thread[f[{a, b, c}, {1, 2, 3}]] (* {f[a, 1], f[b, 2], f[c, 3]} *) ``` Create rules: ```wolfram Thread[{a, b, c} -> {1, 2, 3}] (* {a -> 1, b -> 2, c -> 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Thread.html) for more details. # Threaded `Threaded[list]` is an object whose elements will automatically be threaded into the lowest level of an array when used in a listable operation such as Plus. * `a + Threaded[b]` adds elements of an array b to elements of an array a at the lowest possible level. * `a + Threaded[b, alev]` adds elements at level alev of a. * `a + Threaded[b, blev -> alev]` adds elements at level alev in a to level blev in b. * `f[a, Threaded[b, ...]]` combines elements for a function f with the attribute Listable. Examples [#examples] Thread addition at lowest level: ```wolfram {{1, 2}, {3, 4}} + Threaded[{10, 20}] ``` Specify threading level: ```wolfram {{1, 2}, {3, 4}} + Threaded[{100, 200}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Threaded.html) for more details. # Through `Through[p[f, g, ...][x, y, ...]]` gives `p[f[x, y, ...], g[x, y, ...], ...]`. Examples [#examples] Apply multiple functions to the same argument: ```wolfram Through[{f, g, h}[x]] (* {f[x], g[x], h[x]} *) ``` Apply Min and Max together: ```wolfram Through[{Min, Max}[{1, 5, 3, 2}]] (* {1, 5} *) ``` With boolean operations: ```wolfram Through[And[EvenQ, Positive][4]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Through.html) for more details. # Throw `Throw[value]` stops evaluation and returns value as the value of the nearest enclosing `Catch`. `Throw[value, tag]` is caught only by `Catch[expr, form]` where tag matches form. Examples [#examples] Throw and catch a value: ```wolfram Catch[ Do[If[i > 5, Throw[i]], {i, 1, 10}] ] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Throw.html) for more details. # Total `Total[list]` gives the total of the elements in list. `Total[list, n]` totals all elements down to level n. Examples [#examples] Sum a list: ```wolfram Total[{1, 2, 3, 4, 5}] (* 15 *) ``` Total of nested lists: ```wolfram Total[{{1, 2}, {3, 4}}, 2] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Total.html) for more details. # TotalLayer `TotalLayer[]` represents a net layer taking a list of input arrays and performing elementwise addition on them. Examples [#examples] ```wolfram TotalLayer[][{{1, 2, 3}, {4, 5, 6}}] (* {5, 7, 9} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TotalLayer.html) for more details. # TotalVariationFilter `TotalVariationFilter[data]` iteratively reduces noise while preserving rapid transitions in data. `TotalVariationFilter[data, param]` assumes a regularization parameter value param. Examples [#examples] ```wolfram TotalVariationFilter[{1, 2, 10, 3, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TotalVariationFilter.html) for more details. # TukeyWindow `TukeyWindow[x]` represents a Tukey window function of x. * `TukeyWindow[x, α]` uses the parameter α. Examples [#examples] ```wolfram TukeyWindow[0.5] ``` ```wolfram Plot[TukeyWindow[x, 0.5], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TukeyWindow.html) for more details. # Union `Union[list1, list2, ...]` gives a sorted list of all distinct elements from any of the lists. `Union[list]` gives a sorted version of a list with duplicates removed. Examples [#examples] Union of lists: ```wolfram Union[{a, b, c}, {b, c, d}] (* {a, b, c, d} *) ``` Remove duplicates and sort: ```wolfram Union[{3, 1, 2, 1, 3}] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Union.html) for more details. # UnionPlus `UnionPlus[x,y,…]` displays as x⊎y⊎…. Examples [#examples] Display the multiset union symbol: ```wolfram UnionPlus[A, B, C] (* A ⊎ B ⊎ C *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnionPlus.html) for more details. # UnionedEntityClass `UnionedEntityClass[class1, ...]` represents an entity class containing all the distinct entities in all the classi. Examples [#examples] ```wolfram UnionedEntityClass[EntityClass["Country", "G8"], EntityClass["Country", "BRICS"]] ``` ```wolfram UnionedEntityClass[class1, class2, class3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnionedEntityClass.html) for more details. # Unique `Unique[]` generates a new symbol with a name of the form `$nnn`. `Unique[x]` generates a new symbol with a name of the form `x$nnn`. Examples [#examples] Generate a unique symbol: ```wolfram Unique[] (* $1 *) ``` With a base name: ```wolfram Unique[x] (* x$1 *) ``` Generate multiple: ```wolfram Unique[{a, b, c}] (* {a$1, b$2, c$3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unique.html) for more details. # UniqueElements `UniqueElements[{list1, list2, ...}]` gives the elements for each listi that are not in any other list. * `UniqueElements[lists, test]` uses test to determine whether pairs of elements should be considered equivalent. Examples [#examples] Find unique elements: ```wolfram UniqueElements[{{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}] (* {{1}, {}, {5}} *) ``` Multiple lists: ```wolfram UniqueElements[{{a, b, c}, {b, c, d}}] (* {{a}, {d}} *) ``` Custom equivalence: ```wolfram UniqueElements[{{"A", "B"}, {"a", "c"}}, SameQ[ToLowerCase[#1], ToLowerCase[#2]] &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UniqueElements.html) for more details. # UpTo `UpTo[n]` is a symbolic specification that represents up to n objects or positions. If n objects or positions are available, all are used. If fewer are available, only those available are used. Examples [#examples] Take up to 5 elements: ```wolfram Take[{1, 2, 3}, UpTo[5]] (* {1, 2, 3} *) ``` Take up to 2 elements: ```wolfram Take[{1, 2, 3, 4, 5}, UpTo[2]] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpTo.html) for more details. # Values `Values[assoc]` gives a list of the values in an association. `Values[{key1 -> val1, key2 -> val2, ...}]` gives a list of values in a list of rules. Examples [#examples] Get values from an association: ```wolfram Values[<|"a" -> 1, "b" -> 2, "c" -> 3|>] (* {1, 2, 3} *) ``` Get values from rules: ```wolfram Values[{x -> 1, y -> 2}] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Values.html) for more details. # WelchWindow `WelchWindow[x]` represents a Welch window function of x. * `WelchWindow[x, α]` uses the parameter α. Examples [#examples] Plot the Welch window function: ```wolfram Plot[WelchWindow[x], {x, -1, 1}] ``` Apply a Welch window to sampled data: ```wolfram ListLinePlot[WelchWindow[Range[-1, 1, 0.05]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WelchWindow.html) for more details. # AbsoluteFileName `AbsoluteFileName["name"]` gives the full absolute path for a file. Examples [#examples] Get absolute path: ```wolfram AbsoluteFileName["data.txt"] (* "/Users/username/project/data.txt" *) ``` Resolve relative paths: ```wolfram AbsoluteFileName["../other/file.m"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbsoluteFileName.html) for more details. # AddToSearchIndex `AddToSearchIndex[obj, content]` adds the specified content to the existing search index object obj. `AddToSearchIndex[obj, {content1, ...}]` adds all the contenti to obj. Examples [#examples] Add content to a search index: ```wolfram index = CreateSearchIndex[{}]; AddToSearchIndex[index, "sample text"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AddToSearchIndex.html) for more details. # BinaryDeserialize `BinaryDeserialize[ByteArray[...]]` recovers an expression from a binary representation generated by BinarySerialize. `BinaryDeserialize[ByteArray[...], h]` wraps h around the expression produced before returning it. Examples [#examples] Serialize and deserialize: ```wolfram bytes = BinarySerialize[{1, 2, 3}]; BinaryDeserialize[bytes] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryDeserialize.html) for more details. # BinaryDistance `BinaryDistance[u, v]` gives the binary distance between vectors u and v, equal to 0 if they are identical and 1 otherwise. Examples [#examples] Compare identical vectors: ```wolfram BinaryDistance[{1, 2, 3}, {1, 2, 3}] (* 0 *) ``` Compare different vectors: ```wolfram BinaryDistance[{1, 2, 3}, {1, 2, 4}] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryDistance.html) for more details. # BinaryImageQ `BinaryImageQ[image]` yields True if image has the form of a binary Image or Image3D object, and False otherwise. Examples [#examples] Test binary image: ```wolfram img = Binarize[ExampleData[{"TestImage", "Lena"}]]; BinaryImageQ[img] (* True *) ``` Test non-binary image: ```wolfram BinaryImageQ[ExampleData[{"TestImage", "Lena"}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryImageQ.html) for more details. # BinaryRead `BinaryRead[stream]` reads one byte of raw binary data from an input stream, and returns an integer from 0 to 255. `BinaryRead[stream, type]` reads an object of the specified type. `BinaryRead[stream, {type1, type2, ...}]` reads a sequence of objects of the specified types. Examples [#examples] Read bytes from a stream: ```wolfram stream = OpenRead["file.bin", BinaryFormat -> True]; BinaryRead[stream, "Integer32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryRead.html) for more details. # BinaryReadList `BinaryReadList["file"]` reads all remaining bytes from a file, and returns them as a list of integers from 0 to 255. `BinaryReadList["file", type]` reads objects of the specified type from a file until the end is reached. `BinaryReadList["file", {type1, type2, ...}]` reads objects with a sequence of types until the end of the file. `BinaryReadList["file", types, n]` reads only the first n objects of the specified types. Examples [#examples] Read all bytes from a file: ```wolfram BinaryReadList["data.bin"] ``` Read integers: ```wolfram BinaryReadList["data.bin", "Integer32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryReadList.html) for more details. # BinarySerialize `BinarySerialize[expr]` gives a binary representation of any expression expr as a ByteArray object. Examples [#examples] Serialize an expression to binary: ```wolfram BinarySerialize[{1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinarySerialize.html) for more details. # BinaryWrite `BinaryWrite[channel, b]` writes a byte of data, specified as an integer from 0 to 255. `BinaryWrite[channel, {b1, b2, ...}]` writes a sequence of bytes. `BinaryWrite[channel, "string"]` writes the raw sequence of characters in a string. `BinaryWrite[channel, x, type]` writes an object of the specified type. Examples [#examples] Write bytes to a file: ```wolfram stream = OpenWrite["test.bin", BinaryFormat -> True]; BinaryWrite[stream, {72, 101, 108, 108, 111}]; Close[stream]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinaryWrite.html) for more details. # BitAnd `BitAnd[n1, n2, ...]` gives the bitwise AND of the integers ni. Examples [#examples] Bitwise AND of two integers: ```wolfram BitAnd[5, 3] (* 1 *) ``` Multiple operands: ```wolfram BitAnd[15, 7, 3] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitAnd.html) for more details. # BitClear `BitClear[n, k]` sets to 0 the bit corresponding to the coefficient of 2^k in the integer n. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitClear.html) for more details. # BitFlip `BitFlip[n, k]` flips the bit corresponding to the coefficient of 2^k in the integer n. Examples [#examples] Flip bit position: ```wolfram BitFlip[5, 1] (* 7 *) ``` Binary representation: ```wolfram IntegerDigits[5, 2] (* {1, 0, 1} *) IntegerDigits[BitFlip[5, 1], 2] (* {1, 1, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitFlip.html) for more details. # BitGet `BitGet[n, k]` gets the bit corresponding to the coefficient of $2^k$ in the integer n. Examples [#examples] ```wolfram BitGet[5, 2] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitGet.html) for more details. # BitLength `BitLength[n]` gives the number of binary bits necessary to represent the integer n. Examples [#examples] Number of bits for small integers: ```wolfram BitLength[7] (* 3 *) ``` ```wolfram BitLength[255] (* 8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitLength.html) for more details. # BitNot `BitNot[n]` gives the bitwise NOT of the integer n. Examples [#examples] Bitwise NOT: ```wolfram BitNot[5] (* -6 *) ``` ```wolfram BitNot[0] (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitNot.html) for more details. # BitOr `BitOr[n1, n2, ...]` gives the bitwise OR of the integers ni. Examples [#examples] Bitwise OR of two integers: ```wolfram BitOr[5, 3] (* 7 *) ``` Multiple operands: ```wolfram BitOr[1, 2, 4] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitOr.html) for more details. # BitSet `BitSet[n, k]` sets to 1 the bit corresponding to the coefficient of 2^k in the integer n. Examples [#examples] Set the 3rd bit: ```wolfram BitSet[0, 3] (* 8 *) ``` Set a bit in an existing integer: ```wolfram BitSet[5, 1] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitSet.html) for more details. # BitShiftLeft `BitShiftLeft[n, k]` shifts the binary bits in the integer n to the left by k places, padding with zeros on the right. `BitShiftLeft[n]` shifts one bit to the left. Examples [#examples] Shift bits to the left by 2 positions: ```wolfram BitShiftLeft[5, 2] (* 20 *) ``` Shift one bit to the left (equivalent to multiplying by 2): ```wolfram BitShiftLeft[7] (* 14 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitShiftLeft.html) for more details. # BitShiftRight `BitShiftRight[n, k]` shifts the binary bits in the integer n to the right by k places, dropping bits that are shifted past the unit's position. `BitShiftRight[n]` shifts one bit to the right. Examples [#examples] Shift bits to the right by 2 positions: ```wolfram BitShiftRight[20, 2] (* 5 *) ``` Shift one bit to the right (equivalent to integer division by 2): ```wolfram BitShiftRight[7] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitShiftRight.html) for more details. # BitXor `BitXor[n1, n2, ...]` gives the bitwise XOR of the integers ni. Examples [#examples] Compute bitwise XOR: ```wolfram BitXor[5, 3] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BitXor.html) for more details. # Byte `Byte` represents a single byte of data when used with `Read` and related functions. Examples [#examples] Read bytes from a stream: ```wolfram stream = OpenRead["file.bin", BinaryFormat -> True]; Read[stream, Byte] (* 65 *) Close[stream]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Byte.html) for more details. # ByteArray `ByteArray[{b1, b2, ...}]` constructs a ByteArray object containing the byte values bi. `ByteArray["string"]` constructs a ByteArray object by extracting byte values from a Base64-encoded string. Examples [#examples] Create a byte array: ```wolfram ByteArray[{72, 101, 108, 108, 111}] ``` From Base64 string: ```wolfram ByteArray["SGVsbG8="] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteArray.html) for more details. # ByteArrayFormat `ByteArrayFormat[ba]` attempts to determine what ImportByteArray format could be used to import the ByteArray object ba. Examples [#examples] Detect format of byte array: ```wolfram ba = ExportByteArray[Plot[Sin[x], {x, 0, 2 Pi}], "PNG"]; ByteArrayFormat[ba] (* "PNG" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteArrayFormat.html) for more details. # ByteArrayFormatQ `ByteArrayFormatQ[ba, "fmt"]` gives True if the ByteArray object ba might be imported as format "fmt" and gives False otherwise. `ByteArrayFormatQ[ba, {fmt1, fmt2, ...}]` gives True if ba might be imported as one of "fmti". Examples [#examples] Check byte array format: ```wolfram ByteArrayFormatQ[ByteArray[{137, 80, 78, 71}], "PNG"] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteArrayFormatQ.html) for more details. # ByteArrayQ `ByteArrayQ[expr]` gives True if expr is a valid ByteArray object, and False otherwise. Examples [#examples] Test byte array: ```wolfram ByteArrayQ[ByteArray[{1, 2, 3}]] (* True *) ``` Non-byte array: ```wolfram ByteArrayQ[{1, 2, 3}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteArrayQ.html) for more details. # ByteArrayToString `ByteArrayToString[ba]` returns a string by decoding the data in the byte array ba, assuming UTF-8 encoding. `ByteArrayToString[ba,"encoding"]` interprets the data in the specified character encoding. Examples [#examples] Convert a byte array to a string: ```wolfram ByteArrayToString[ByteArray[{72, 101, 108, 108, 111}]] (* "Hello" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteArrayToString.html) for more details. # Close `Close[stream]` closes a stream or socket. Examples [#examples] Close a file stream: ```wolfram stream = OpenRead["file.txt"]; data = ReadList[stream]; Close[stream] (* "file.txt" *) ``` Close returns the name of the closed stream. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Close.html) for more details. # CopyDirectory `CopyDirectory[dir1, dir2]` copies the directory dir1 to dir2. Examples [#examples] Copy a directory: ```wolfram CopyDirectory["~/Documents/source", "~/Documents/backup"] ``` Copy to a new name: ```wolfram CopyDirectory["myFolder", "myFolder_copy"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CopyDirectory.html) for more details. # CreateArchive `CreateArchive[source]` creates a compressed archive in the current directory from source. `CreateArchive[source, path]` creates a compressed archive in the directory or file specified by path. Examples [#examples] Create a zip archive: ```wolfram CreateArchive["myFolder"] (* "myFolder.zip" *) ``` Specify output location: ```wolfram CreateArchive["data", "~/Archives/data.zip"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateArchive.html) for more details. # CreateDirectory `CreateDirectory["dir"]` creates a directory with the given name. `CreateDirectory[]` creates a temporary directory. Examples [#examples] Create a directory: ```wolfram CreateDirectory["output"] (* "/path/to/output" *) ``` Create nested directories: ```wolfram CreateDirectory["path/to/new/folder"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateDirectory.html) for more details. # CreateFile `CreateFile["file"]` creates a file with name file. `CreateFile[]` creates a file in the default area for temporary files on your computer system. Examples [#examples] Create a temporary file: ```wolfram CreateFile[] (* /var/folders/.../tmp12345 *) ``` Create a named file: ```wolfram CreateFile["myfile.txt"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateFile.html) for more details. # CreateLicenseEntitlement `CreateLicenseEntitlement[settings]` creates an on-demand license entitlement using settings. `CreateLicenseEntitlement[]` creates an on-demand license entitlement using the default settings. Examples [#examples] Create a license entitlement: ```wolfram CreateLicenseEntitlement[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateLicenseEntitlement.html) for more details. # CreateSearchIndex `CreateSearchIndex[dir]` creates a search index from all files in the directory dir and its subdirectories. `CreateSearchIndex[{source1, source2, ...}]` creates a search index from all sources sourcei. `CreateSearchIndex[sources, "name"]` gives the search index the specified name. `CreateSearchIndex[]` creates an empty search index, which can be added to with `AddToSearchIndex`. Examples [#examples] Create a search index from a directory: ```wolfram CreateSearchIndex["/path/to/docs"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateSearchIndex.html) for more details. # CreateSemanticSearchIndex `CreateSemanticSearchIndex[source]` creates a search index from the data in source. `CreateSemanticSearchIndex[{source1, ...}]` creates a search index with a collection of sources sourcei. `CreateSemanticSearchIndex[{source1 -> val1, ...}]` associates the source sourcei to the value vali. `CreateSemanticSearchIndex[data, "name"]` gives the search index the specified name. Examples [#examples] Create a semantic search index: ```wolfram CreateSemanticSearchIndex[{"text1", "text2", "text3"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateSemanticSearchIndex.html) for more details. # CreateTemporary `CreateTemporary[]` creates a temporary file with a unique name in the default temporary directory and returns the name of the file. Examples [#examples] Create a temporary file: ```wolfram CreateTemporary[] (* "/tmp/m000001234567" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateTemporary.html) for more details. # CreateUUID `CreateUUID[]` creates a random, universally unique UUID string. `CreateUUID["base"]` appends a UUID string to the specified base string. Examples [#examples] Generate a random UUID: ```wolfram CreateUUID[] (* "550e8400-e29b-41d4-a716-446655440000" *) ``` With a base prefix: ```wolfram CreateUUID["user-"] (* "user-550e8400-e29b-41d4-a716-446655440000" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CreateUUID.html) for more details. # DeleteDirectory `DeleteDirectory["dir"]` deletes the specified directory. Examples [#examples] Delete an empty directory: ```wolfram DeleteDirectory["emptyFolder"] ``` Delete with contents: ```wolfram DeleteDirectory["myFolder", DeleteContents -> True] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteDirectory.html) for more details. # DeleteFile `DeleteFile["file"]` deletes a file. `DeleteFile[{"file1", "file2", ...}]` deletes multiple files. Examples [#examples] Delete a file: ```wolfram DeleteFile["temp.txt"] (* Null *) ``` Delete multiple files: ```wolfram DeleteFile[{"old1.txt", "old2.txt"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteFile.html) for more details. # DeleteSearchIndex `DeleteSearchIndex[obj]` deletes the search index represented by the search index object obj. `DeleteSearchIndex["name"]` deletes the search index with the specified name in the `SearchIndices[]` list. Examples [#examples] Delete a search index: ```wolfram DeleteSearchIndex["myindex"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeleteSearchIndex.html) for more details. # Directory `Directory[]` gives the current working directory. Examples [#examples] Get current directory: ```wolfram Directory[] (* "/Users/username/project" *) ``` Use with FileNames: ```wolfram FileNames["*.txt", {Directory[]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Directory.html) for more details. # DirectoryName `DirectoryName["name"]` extracts the directory name from the specification for a file. Examples [#examples] Get directory from file path: ```wolfram DirectoryName["/path/to/file.txt"] (* "/path/to/" *) ``` Multiple levels: ```wolfram DirectoryName["/a/b/c/d.txt", 2] (* "/a/b/" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectoryName.html) for more details. # DirectoryQ `DirectoryQ["name"]` gives `True` if the directory exists, and `False` otherwise. Examples [#examples] Check if directory exists: ```wolfram DirectoryQ["/path/to/folder"] (* True or False *) ``` Filter directories from files: ```wolfram Select[FileNames["*"], DirectoryQ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectoryQ.html) for more details. # DirectoryStack `DirectoryStack[]` gives the directory stack that represents the sequence of current directories used. Examples [#examples] Get the current directory stack: ```wolfram DirectoryStack[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectoryStack.html) for more details. # DumpSave `DumpSave["file.mx", symbol]` writes definitions associated with a symbol to a file in internal Wolfram System format. `DumpSave["file.mx", "context\`"]\` writes out definitions associated with all symbols in the specified context. `DumpSave["file.mx", {obj1, obj2, ...}]` writes out definitions for several symbols or contexts. Examples [#examples] Save a function definition to a file: ```wolfram f[x_] := x^2; DumpSave["myfunction.mx", f] (* {f} *) ``` Load it back: ```wolfram Get["myfunction.mx"] f[3] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DumpSave.html) for more details. # Environment `Environment["var"]` gives the value of an operating system environment variable. Examples [#examples] Get the PATH environment variable: ```wolfram Environment["PATH"] ``` Get the HOME directory: ```wolfram Environment["HOME"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Environment.html) for more details. # Export `Export["file.ext", expr]` exports data to a file, converting it to the format corresponding to the file extension. `Export[file, expr, "fmt"]` exports data in the specified format. Examples [#examples] Export to a file: ```wolfram Export["data.csv", {{1, 2}, {3, 4}}] ``` Export an image: ```wolfram Export["plot.png", Plot[Sin[x], {x, 0, 2 Pi}]] ``` Export as PDF [#export-as-pdf] Use `.pdf` extension to convert an expression to PDF ```wolfram Export["expr.pdf", Plot[x, {x,0,1}]] ``` This feature requires running WLJS as a desktop application. PDF export is a **blocking function** , avoid using it with buttons or async events - use [ExportAsync](./ExportAsync) instead import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="List of supported formats"> Evaluate `$ExportFormats`: "3DS","AC","ACO","AIFF","ArrowDataset","ArrowIPC","ASE","AU","AVI","Base64","Binary","Bit","BLEND","BMP","BREP","BSON","Byte","BYU","BZIP2","C","CDF","CDXML","Character16","Character32","Character8","CIF","CML","Complex128","Complex256","Complex64","CSV","Cube","CUR","DAE","DICOM","DIF","DIMACS","DOT","DTA","DXF","EPS","ExpressionJSON","ExpressionML","FASTA","FASTQ","FBX","FCS","FITS","FLAC","FLV","FMU","GeoJSON","GIF","GLTF","Graph6","Graphlet","GraphML","GXL","GZIP","HarwellBoeing","HDF","HDF5","HEIF","HIN","HTML","HTMLFragment","HTTPRequest","HTTPResponse","ICNS","ICO","IFC","IGES","Ini","Integer128","Integer16","Integer24","Integer32","Integer64","Integer8","ISO","JavaProperties","JavaScriptExpression","JPEG","JPEG2000","JSON","JSONLD","JSONLines","JVX","KML","LEDA","List","LWO","LXO","Markdown","MAT","MathML","Matroska","Maya","MCTT","MGF","MIDI","MMCIF","MMJSON","MO","MOL","MOL2","MP3","MP4","MS3D","MTX","MX","MXNet","NASACDF","NB","NetCDF","NEXUS","NOFF","NQuads","NTriples","OBJ","OFF","Ogg","ONNX","OpenEXR","ORC","OWLFunctional","Pajek","Parquet","PBM","PCX","PDB","PDF","PGM","PHPIni","PLY","PNG","PNM","POR","POV","PPM","PXR","PythonExpression","QuickTime","RawBitmap","RawJSON","RDFXML","Real128","Real32","Real64","RIB","RLE","RTF","SAS7BDAT","SAV","SCT","SDF","SMA","SMILES","SND","SPARQLQuery","SPARQLResultsJSON","SPARQLResultsXML","SPARQLUpdate","Sparse6","STEP","STL","String","SurferGrid","SVG","Table","TAR","TerminatedString","TeX","TeXFragment","Text","TGA","TGF","TIFF","TriG","TSV","Turtle","UBJSON","UnsignedInteger128","UnsignedInteger16","UnsignedInteger24","UnsignedInteger32","UnsignedInteger64","UnsignedInteger8","USD","UUE","VideoFrames","VRML","VTK","WAV","Wave64","WDX","WebP","WL","WLNet","WMLF","WXF","X3D","XBM","XGL","XHTML","XHTMLMathML","XLS","XLSX","XML","XPORT","XYZ","ZIP","ZPR","ZSTD" </Accordion> </Accordions> Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Export.html) for more details. # ExportAsync `ExportAsync["file.ext", expr]` exports data to a file, converting it to the format corresponding to the file extension and returns `Promise` `ExportAsync[file, expr, "fmt"]` exports data in the specified format and returns `Promise` Examples [#examples] Export to a file: ```wolfram Then[ExportAsync["data.csv", {{1, 2}, {3, 4}}], Function[Null, Print["Done!"]; ]] ``` See also [Export](./Export) # ExportByteArray `ExportByteArray[expr, "format"]` generates a `ByteArray` object corresponding to expr exported in the specified format. `ExportByteArray[exprs, elems]` generates a `ByteArray` object by treating exprs as elements specified by elems. Examples [#examples] Export an image to byte array: ```wolfram ExportByteArray[Graphics[Circle[]], "PNG"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExportByteArray.html) for more details. # ExportString `ExportString[expr, "format"]` generates a string of expr in the specified format. Examples [#examples] Export to JSON string: ```wolfram ExportString[{1, 2, 3}, "JSON"] (* "[1, 2, 3]" *) ``` Export to CSV: ```wolfram ExportString[{{1, 2}, {3, 4}}, "CSV"] (* "1,2\n3,4" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExportString.html) for more details. # File `File["path"]` is a symbolic representation of a location in the local file system. Examples [#examples] Create a file reference: ```wolfram file = File["/path/to/document.txt"] (* File["/path/to/document.txt"] *) ``` Use with Import: ```wolfram Import[File["data.csv"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/File.html) for more details. # FileBaseName `FileBaseName["file"]` gives the base name without extension. Examples [#examples] Get base name: ```wolfram FileBaseName["document.pdf"] (* "document" *) ``` ```wolfram FileBaseName["/path/to/image.png"] (* "image" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileBaseName.html) for more details. # FileByteCount `FileByteCount[file]` gives the number of bytes in a file. Examples [#examples] Get file size: ```wolfram FileByteCount["document.pdf"] (* 1048576 *) ``` Human-readable size: ```wolfram FileByteCount["image.png"] / 1024.0 (* 256.5 kilobytes *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileByteCount.html) for more details. # FileConvert `FileConvert[source->"dest.ext"]` converts the contents of source to the format defined by the extension ext and writes the result to the file dest.ext. * `FileConvert[source,"format"]` writes the result to the filename defined by source, but with an extension defined by the specified format. * `FileConvert[source->"dest.ext",format1->format2]` takes the contents of source to be in the specified format "format1". Examples [#examples] ```wolfram (* Convert an image to a different format *) FileConvert["photo.png" -> "photo.jpg"] (* Convert to PDF *) FileConvert["document.docx", "PDF"] (* Specify source format explicitly *) FileConvert["data.csv" -> "data.xlsx", "CSV" -> "XLSX"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileConvert.html) for more details. # FileDate `FileDate["file"]` gives the date and time the file was last modified. `FileDate["file", "type"]` gives info on the specified date type. Examples [#examples] Get modification date: ```wolfram FileDate["myfile.txt"] (* DateObject[{2024, 1, 15, 14, 30, 0}] *) ``` Get creation date: ```wolfram FileDate["myfile.txt", "Creation"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileDate.html) for more details. # FileExistsQ `FileExistsQ["name"]` gives `True` if the file exists, and `False` otherwise. Examples [#examples] Check if file exists: ```wolfram FileExistsQ["/path/to/file.txt"] (* True or False *) ``` Conditional loading: ```wolfram If[FileExistsQ["config.m"], Get["config.m"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileExistsQ.html) for more details. # FileExtension `FileExtension["file"]` gives the file extension. Examples [#examples] Get extension: ```wolfram FileExtension["document.pdf"] (* "pdf" *) ``` ```wolfram FileExtension["archive.tar.gz"] (* "gz" *) ``` No extension: ```wolfram FileExtension["README"] (* "" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileExtension.html) for more details. # FileFormat `FileFormat[source]` attempts to determine what Import format could be used to import the file. `FileFormat[source, {fmt1, fmt2, ...}]` returns the first format that can be used. Examples [#examples] Detect file format: ```wolfram FileFormat["image.png"] (* "PNG" *) ``` Check from multiple formats: ```wolfram FileFormat["data.csv", {"CSV", "TSV", "JSON"}] (* "CSV" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileFormat.html) for more details. # FileFormatQ `FileFormatQ[source,"fmt"]` gives True if the file corresponding to source might be imported as format "fmt" and gives False otherwise. `FileFormatQ[source,{fmt1,fmt2,…}]` gives True if source might be imported as one of "fmti". Examples [#examples] ```wolfram (* Check if a file is a PNG *) FileFormatQ["image.png", "PNG"] (* Check against multiple formats *) FileFormatQ["data.txt", {"CSV", "TSV", "Text"}] (* Verify file type *) FileFormatQ["document.pdf", "PDF"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileFormatQ.html) for more details. # FileHash `FileHash[file]` gives an integer hash code for the contents of the file. `FileHash[file, "type"]` gives a hash of the specified type (e.g., "MD5", "SHA256"). Examples [#examples] Get default hash: ```wolfram FileHash["document.txt"] (* 123456789012345678901234567890 *) ``` Get SHA-256 hash: ```wolfram FileHash["document.txt", "SHA256"] ``` As hexadecimal string: ```wolfram FileHash["document.txt", "MD5", "HexString"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileHash.html) for more details. # FileNameDepth `FileNameDepth["name"]` gives the number of path elements in the file name. Examples [#examples] Count path elements: ```wolfram FileNameDepth["/path/to/file.txt"] (* 4 *) ``` Relative path: ```wolfram FileNameDepth["folder/subfolder/data.csv"] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNameDepth.html) for more details. # FileNameDrop `FileNameDrop["name", n]` drops the first n path elements. `FileNameDrop["name", -n]` drops the last n path elements. `FileNameDrop["name"]` drops the last path element (filename). Examples [#examples] Drop last element: ```wolfram FileNameDrop["/path/to/file.txt"] (* "/path/to" *) ``` Drop first two elements: ```wolfram FileNameDrop["/path/to/file.txt", 2] (* "to/file.txt" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNameDrop.html) for more details. # FileNameJoin `FileNameJoin[{name1, name2, ...}]` joins path components into a file path. Examples [#examples] Join path components: ```wolfram FileNameJoin[{"path", "to", "file.txt"}] (* "path/to/file.txt" on Unix, "path\\to\\file.txt" on Windows *) ``` Create absolute path: ```wolfram FileNameJoin[{$HomeDirectory, "Documents", "data.csv"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNameJoin.html) for more details. # FileNameSplit `FileNameSplit["name"]` splits a file path into a list of components. Examples [#examples] Split a path: ```wolfram FileNameSplit["/path/to/file.txt"] (* {"/", "path", "to", "file.txt"} *) ``` ```wolfram FileNameSplit["folder/subfolder/data.csv"] (* {"folder", "subfolder", "data.csv"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNameSplit.html) for more details. # FileNameTake `FileNameTake["name"]` gives the last path element (filename) from a path. `FileNameTake["name", n]` gives the first n path elements. `FileNameTake["name", -n]` gives the last n path elements. Examples [#examples] Get filename: ```wolfram FileNameTake["/path/to/file.txt"] (* "file.txt" *) ``` Get parent directory: ```wolfram FileNameTake["/path/to/file.txt", -2] (* "to/file.txt" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNameTake.html) for more details. # FileNames `FileNames[]` lists all files in the current working directory. `FileNames[form]` lists files matching a string pattern. `FileNames[forms, dirs, n]` includes files in subdirectories up to n levels deep. Examples [#examples] List all files: ```wolfram FileNames[] (* {"file1.txt", "file2.m", ...} *) ``` Find specific files: ```wolfram FileNames["*.txt"] (* {"data.txt", "notes.txt"} *) ``` Recursive search: ```wolfram FileNames["*.m", {Directory[]}, Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileNames.html) for more details. # FilePrint `FilePrint["file"]` prints out the raw textual contents of a file. `FilePrint["file", n]` prints the first n lines. `FilePrint["file", -n]` prints the last n lines. Examples [#examples] Print entire file: ```wolfram FilePrint["data.txt"] ``` Print first 5 lines: ```wolfram FilePrint["log.txt", 5] ``` Print lines 10-20: ```wolfram FilePrint["log.txt", 10 ;; 20] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FilePrint.html) for more details. # FileSize `FileSize[file]` gives the size of a file as a quantity. Examples [#examples] Get the size of a file: ```wolfram FileSize["example.txt"] (* Quantity[1024, "Bytes"] *) ``` Convert to megabytes: ```wolfram UnitConvert[FileSize["largefile.dat"], "Megabytes"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileSize.html) for more details. # FileTemplate `FileTemplate["file"]` yields a TemplateObject expression representing a file template to be applied using functions like `TemplateApply`. Examples [#examples] Create a file template: ```wolfram template = FileTemplate["letter.txt"] ``` Apply a template: ```wolfram TemplateApply[FileTemplate["greeting.txt"], <|"name" -> "Alice"|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileTemplate.html) for more details. # FileTemplateApply `FileTemplateApply[template]` applies a template and writes the result to a temporary file, returning its name. `FileTemplateApply[template, args]` applies a template using args to fill its slots. `FileTemplateApply[template, args, output]` writes the result to the specified output file. Examples [#examples] Apply template to file: ```wolfram FileTemplateApply[FileTemplate["report.txt"], <|"date" -> DateString[]|>, "output.txt"] ``` Get temporary file result: ```wolfram result = FileTemplateApply[template, <|"x" -> 42|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileTemplateApply.html) for more details. # FileType `FileType["file"]` gives the type of a file, typically File, Directory, or None. Examples [#examples] Check the type of a file: ```wolfram FileType["/path/to/file.txt"] (* File *) ``` Check a directory: ```wolfram FileType["/path/to/folder"] (* Directory *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FileType.html) for more details. # FindFile `FindFile[name]` finds the file with the specified name that would be loaded by Get\[name] and related functions. Examples [#examples] ```wolfram (* Find a package file *) FindFile["ExampleData/sample.txt"] (* Find a context file *) FindFile["Combinatorica`"] (* Returns $Failed if not found *) FindFile["NonExistentFile"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindFile.html) for more details. # FindLibrary `FindLibrary[lib]` finds a dynamic library that can be loaded by LibraryFunctionLoad. Examples [#examples] Find a library by name: ```wolfram FindLibrary["demo"] ``` Check if a library exists: ```wolfram FindLibrary["mylib"] =!= $Failed ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindLibrary.html) for more details. # Get `<< name` or `Get["name"]` reads in a file, evaluating each expression and returning the last one. Examples [#examples] Load a package or file: ```wolfram << "myfile.m" ``` Get returns the last expression: ```wolfram Get["definitions.m"] (* last expression in file *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Get.html) for more details. # GetContext `GetContext["context\`"]\` loads the file for a package that defines the specified context. Examples [#examples] Load a context: ```wolfram GetContext["MyPackage`"] ``` This finds and loads the conventional file for the package. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GetContext.html) for more details. # Import `Import[source]` imports data from source, returning a Wolfram Language representation of it. `Import[source, "fmt"]` interprets the file as the specified format. Examples [#examples] Import a CSV file: ```wolfram data = Import["data.csv"] ``` Import specific elements: ```wolfram Import["image.png", "Data"] ``` Import from URL: ```wolfram Import["https://example.com/data.json"] ``` import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="List of supported formats"> Evaluate `$ImportFormats`: "3DS","7z","AC","ACO","Affymetrix","AgilentMicroarray","AIFF","ApacheLog","ArcGRID","ArrowDataset","ArrowIPC","ASC","ASE","AU","AVI","AVIF","Base64","BDF","Binary","BioImageFormat","Bit","BLEND","BMP","BREP","BSON","Byte","BYU","BZIP2","CDED","CDF","CDX","CDXML","Character16","Character32","Character8","CIF","CML","CommonLog","Complex128","Complex256","Complex64","CSV","Cube","CUR","DAE","DBF","DICOM","DICOMDIR","DIF","DIMACS","Directory","DOCX","DOT","DTA","DXF","EDF","EML","EPS","ExpressionJSON","ExpressionML","ExtendedLog","FASTA","FASTQ","FBX","FCHK","FCS","FITS","FLAC","FLV","GaussianLog","GenBank","GeoJSON","GeoTIFF","GGUF","GIF","GLTF","GML","GPX","Graph6","Graphlet","GraphML","GRIB","GTOPO30","GXF","GXL","GZIP","HarwellBoeing","HDF","HDF5","HEIF","HIN","HTML","HTTPRequest","HTTPResponse","ICC","ICNS","ICO","ICS","IFC","IGES","Ini","Integer128","Integer16","Integer24","Integer32","Integer64","Integer8","ISO","JavaProperties","JavaScriptExpression","JCAMP-DX","JPEG","JPEG2000","JSON","JSONLD","JSONLines","JVX","KML","LaTeX","LEDA","List","LWO","LXO","Markdown","MAT","MathML","Matroska","MBOX","MCTT","MDB","MESH","MGF","MIDI","MMCIF","MMJSON","MO","MOBI","MOL","MOL2","MP3","MP4","MPS","MS3D","MTP","MTX","MX","MXNet","NASACDF","NB","NDK","NetCDF","NEXUS","NOFF","NQuads","NTriples","OBJ","ODS","OFF","Ogg","ONNX","OpenEXR","ORC","OSM","OWLFunctional","Pajek","Parquet","PBM","PCAP","PCX","PDB","PDF","PEM","PGM","PHPIni","PLY","PNG","PNM","POR","PPM","PXR","PythonExpression","QuickTime","RAR","Raw","RawBitmap","RawJSON","RData","RDFXML","RDS","Real128","Real32","Real64","RIB","RLE","RSS","RTF","SAS7BDAT","SAV","SCT","SDF","SDTS","SDTSDEM","SFF","SHP","SMA","SME","SMILES","SND","SP3","SPARQLQuery","SPARQLResultsJSON","SPARQLResultsXML","SPARQLUpdate","Sparse6","STEP","STL","String","SurferGrid","SVG","SXC","Table","TAR","TerminatedString","TeX","Text","TGA","TGF","TIFF","TIGER","TLE","TopoJSON","TriG","TSV","Turtle","UBJSON","UnsignedInteger128","UnsignedInteger16","UnsignedInteger24","UnsignedInteger32","UnsignedInteger64","UnsignedInteger8","USD","USGSDEM","UUE","VCF","VCS","VideoFormat","VTK","WARC","WAV","Wave64","WDX","WebP","WL","WLN","WLNet","WMLF","WXF","X3D","XBM","XGL","XHTML","XHTMLMathML","XLS","XLSX","XML","XPORT","XYZ","ZIP","ZSTD" </Accordion> </Accordions> Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Import.html) for more details. # ImportByteArray `ImportByteArray[ba, "format"]` imports data in the specified format from a ByteArray object. * `ImportByteArray[ba, elements]` imports the specified elements. * `ImportByteArray[ba]` attempts to determine the format automatically. Examples [#examples] ```wolfram ImportByteArray[ByteArray[{72, 101, 108, 108, 111}], "Text"] ``` ```wolfram ImportByteArray[ExportByteArray[{1, 2, 3}, "JSON"], "JSON"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImportByteArray.html) for more details. # ImportString `ImportString["data", "format"]` imports data in the specified format from a string. `ImportString["data"]` attempts to determine the format automatically. Examples [#examples] Import JSON: ```wolfram ImportString["[1, 2, 3]", "JSON"] (* {1, 2, 3} *) ``` Import CSV: ```wolfram ImportString["1,2\n3,4", "CSV"] (* {{"1", "2"}, {"3", "4"}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImportString.html) for more details. # OpenAppend `OpenAppend["file"]` opens a file to append output to it, and returns an OutputStream object. Examples [#examples] Open a file for appending: ```wolfram stream = OpenAppend["myfile.txt"] ``` Write and close: ```wolfram WriteString[stream, "New line\n"]; Close[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OpenAppend.html) for more details. # OpenRead `OpenRead["file"]` opens a file for reading and returns an `InputStream` object. Examples [#examples] Open a file for reading: ```wolfram stream = OpenRead["data.txt"] (* InputStream[...] *) ``` Read and close: ```wolfram stream = OpenRead["data.txt"]; data = ReadList[stream]; Close[stream]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OpenRead.html) for more details. # OpenTemporary `OpenTemporary[]` opens a temporary file to which output can be written, and returns an OutputStream object. Examples [#examples] ```wolfram stream = OpenTemporary[]; Write[stream, "test data"]; Close[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OpenTemporary.html) for more details. # OpenWrite `OpenWrite["file"]` opens a file for writing and returns an `OutputStream` object. `OpenWrite[]` opens a new temporary file. Examples [#examples] Open a file for writing: ```wolfram stream = OpenWrite["output.txt"] (* OutputStream[...] *) ``` Write and close: ```wolfram stream = OpenWrite["output.txt"]; WriteString[stream, "Hello, World!"]; Close[stream]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OpenWrite.html) for more details. # ParentDirectory `ParentDirectory[]` gives the parent of the current working directory. * `ParentDirectory["dir"]` gives the parent of the directory dir. * `ParentDirectory["dir", n]` gives the directory n levels up from dir. Examples [#examples] ```wolfram ParentDirectory[] ``` ```wolfram ParentDirectory["/path/to/some/dir", 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParentDirectory.html) for more details. # Put `expr >> filename` writes expr to a file. `Put[expr1, expr2, ..., "filename"]` writes a sequence of expressions to a file. Examples [#examples] Save an expression: ```wolfram {1, 2, 3} >> "mydata.m" ``` Save multiple expressions: ```wolfram Put[x = 5, y = 10, "values.m"] ``` Read back with Get: ```wolfram Get["mydata.m"] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Put.html) for more details. # PutAppend `expr>>>filename` appends expr to a file. `PutAppend[expr1,expr2,…,"filename"]` appends a sequence of expressions expri to a file. Examples [#examples] ```wolfram {1, 2, 3} >>> "data.txt" ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PutAppend.html) for more details. # Read `Read[stream]` reads one expression from an input stream and returns the expression. `Read[stream, type]` reads one object of the specified type. `Read[stream, {type1, type2, …}]` reads a sequence of objects of the specified types. Examples [#examples] Read from a stream: ```wolfram stream = OpenRead["data.txt"]; Read[stream] Close[stream] ``` Read specific type: ```wolfram Read[stream, Number] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Read.html) for more details. # ReadByteArray `ReadByteArray[src]` gives the contents of src as a ByteArray object. `ReadByteArray[src,n]` reads the first n bytes from src. `ReadByteArray[src,term]` reads until the termination condition term is satisfied. Examples [#examples] Read a file as a byte array: ```wolfram ReadByteArray["example.bin"] ``` Read only the first 100 bytes: ```wolfram ReadByteArray["example.bin", 100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReadByteArray.html) for more details. # ReadLine `ReadLine[stream]` reads a line of text from a stream and returns it as a string. `ReadLine[proc]` reads a line from an external process. Examples [#examples] Read a line from a file: ```wolfram stream = OpenRead["file.txt"]; ReadLine[stream] (* "first line of file" *) ``` Close the stream when done: ```wolfram Close[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReadLine.html) for more details. # ReadList `ReadList["file"]` reads all expressions in a file and returns a list. `ReadList["file", type]` reads objects of the specified type. `ReadList["file", types, n]` reads only the first n objects. Examples [#examples] Read all expressions: ```wolfram ReadList["data.txt"] (* {expr1, expr2, ...} *) ``` Read numbers: ```wolfram ReadList["numbers.txt", Number] (* {1, 2, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReadList.html) for more details. # ReadProtected `ReadProtected` is an attribute that prevents values associated with a symbol from being seen. Examples [#examples] ```wolfram SetAttributes[f, ReadProtected] f[x_] := x^2 ??f ``` ```wolfram Attributes[Plus] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReadProtected.html) for more details. # ReadString `ReadString["file"]` reads the complete contents of a file as a string. `ReadString[stream]` reads everything from a stream. `ReadString[src, term]` reads until the terminator is encountered. Examples [#examples] Read entire file: ```wolfram ReadString["myfile.txt"] (* "contents of file..." *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReadString.html) for more details. # RenameDirectory `RenameDirectory[dir1, dir2]` renames the directory dir1 to dir2. This function moves or renames a directory on the file system. Examples [#examples] ```wolfram RenameDirectory["/path/to/oldname", "/path/to/newname"] ``` ```wolfram RenameDirectory["myFolder", "myNewFolder"] ``` ```wolfram (* Move directory to new location *) RenameDirectory[FileNameJoin[{$TemporaryDirectory, "test"}], FileNameJoin[{$HomeDirectory, "test"}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RenameDirectory.html) for more details. # RenameFile `RenameFile[file1, file2]` renames or moves file1 to file2. Examples [#examples] Rename a file: ```wolfram RenameFile["old.txt", "new.txt"] (* "new.txt" *) ``` Move to different directory: ```wolfram RenameFile["data.csv", "archive/data.csv"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RenameFile.html) for more details. # ResetDirectory `ResetDirectory[]` resets the current working directory to its previous value. Examples [#examples] ```wolfram SetDirectory["~"] ResetDirectory[] ``` ```wolfram Directory[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ResetDirectory.html) for more details. # Save `Save["filename", symbol]` appends definitions associated with the specified symbol to a file. `Save["filename", "patt"]` appends definitions associated with all symbols whose names match the string pattern "patt". `Save["filename", "context\`"]\` appends definitions associated with all symbols in the specified context. `Save["filename", {object1, object2, …}]` appends definitions associated with several objects. Examples [#examples] Define a function and save it: ```wolfram f[x_] := x^2 Save["myfile.wl", f] ``` Save multiple definitions: ```wolfram Save["defs.wl", {f, g, h}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Save.html) for more details. # SearchAdjustment `SearchAdjustment[query, w]` represents a component of a search query that is to be treated as having weight w. * `SearchAdjustment[query, ..., opts]` represents a component of a search query with certain options. Examples [#examples] ```wolfram TextSearch[texts, SearchAdjustment["term", 2.0]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SearchAdjustment.html) for more details. # SearchIndexObject `SearchIndexObject[loc]` represents a search index object, as created by `CreateSearchIndex`. * `SearchIndexObject["name"]` represents the search index with the specified name in the `SearchIndices[]` list. Examples [#examples] Create a search index from files: ```wolfram index = CreateSearchIndex[NotebookDirectory[]] ``` Search within the index: ```wolfram TextSearch[index, "query"] ``` List all available search indices: ```wolfram SearchIndices[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SearchIndexObject.html) for more details. # SearchIndices `SearchIndices[]` returns a list with all the locally stored instances of `SearchIndexObject`. Examples [#examples] ```wolfram SearchIndices[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SearchIndices.html) for more details. # SearchQueryString `SearchQueryString["query"]` represents a search engine-style query in `TextSearch` and related functions. Examples [#examples] ```wolfram TextSearch[texts, SearchQueryString["term1 AND term2"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SearchQueryString.html) for more details. # SearchResultObject `SearchResultObject[...]` represents a result from `TextSearch[...]` and related functions. Examples [#examples] ```wolfram res = TextSearch[index, "query"]; res["Snippet"] ``` ```wolfram SearchResultObject[...]["Location"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SearchResultObject.html) for more details. # SemanticImport `SemanticImport[file]` attempts to import a file semantically to give a Dataset object. * `SemanticImport[file, type]` attempts to interpret all elements in the file as being of the specified type. * `SemanticImport[file, {type1, type2, ...}]` attempts to interpret elements in successive columns as being of the specified types. * `SemanticImport[file, <|col1 -> type1, col2 -> type2, ...|>]` keeps only the columns specified by their positions or names. * `SemanticImport[file, typespec, form]` puts the result in the specified form. Examples [#examples] Import a CSV file semantically: ```wolfram SemanticImport["data.csv"] ``` Specify column types: ```wolfram SemanticImport["data.csv", {"String", "Number", "Date"}] ``` Select specific columns: ```wolfram SemanticImport["data.csv", <|"Name" -> "String", "Age" -> "Number"|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticImport.html) for more details. # SemanticSearch `SemanticSearch[index, query]` finds the items similar to query inside index. * `SemanticSearch[index, query -> f]` filters the results using the function f. * `SemanticSearch[index, query, prop]` returns the specified property prop. Examples [#examples] Search a semantic index: ```wolfram index = SemanticSearchIndex[{"apple", "banana", "car", "truck"}]; SemanticSearch[index, "fruit"] ``` Filter results: ```wolfram SemanticSearch[index, "vehicle" -> (StringLength[#] > 3 &)] ``` Get distances: ```wolfram SemanticSearch[index, "food", "Distances"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticSearch.html) for more details. # SemanticSearchIndex `SemanticSearchIndex[...]` represents a semantic search index object. * `SemanticSearchIndex[source]` attempts to recreate a SemanticSearchIndex from source. Examples [#examples] Create a semantic search index: ```wolfram index = CreateSemanticSearchIndex[{"document1", "document2", "document3"}] ``` Search the index: ```wolfram SemanticSearch[index, "query text"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticSearchIndex.html) for more details. # SemanticSearchIndices `SemanticSearchIndices[]` returns a list with all the known instances of SemanticSearchIndex. `SemanticSearchIndices[patt]` returns a list of indices with the name matching the pattern patt. Examples [#examples] Get all known semantic search indices: ```wolfram SemanticSearchIndices[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticSearchIndices.html) for more details. # SetDirectory `SetDirectory["dir"]` sets the current working directory to dir. `SetDirectory[]` sets it to your home directory. Examples [#examples] Change directory: ```wolfram SetDirectory["/path/to/folder"] (* "/path/to/folder" *) ``` Return to home: ```wolfram SetDirectory[] (* "/Users/username" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SetDirectory.html) for more details. # SetStreamPosition `SetStreamPosition[stream, n]` sets the current point in an open stream. Examples [#examples] Set stream position to the beginning: ```wolfram stream = OpenRead["file.txt"]; SetStreamPosition[stream, 0] ``` Move to a specific byte position: ```wolfram SetStreamPosition[stream, 100] ``` Read from a specific position: ```wolfram SetStreamPosition[stream, 50]; ReadLine[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SetStreamPosition.html) for more details. # Snippet `Snippet[doc]` gives a snippet of text from a document or other content object. * `Snippet[doc, n]` gives about n lines from the beginning. * `Snippet[doc, -n]` gives about n lines from the end. * `Snippet[doc, n1;;n2]` gives a span from lines n1 to n2. * `Snippet[doc, n1;;n2;;n3]` gives a span from lines n1 to n2 in steps of n3. * `Snippet[ContentObject[...], SearchResultObject[...]]` gives contextual snippets from a content object based on search results. Examples [#examples] Get first 5 lines from a file: ```wolfram Snippet[File["example.txt"], 5] ``` Get last 3 lines: ```wolfram Snippet[File["example.txt"], -3] ``` Get a range of lines: ```wolfram Snippet[File["example.txt"], 10;;20] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Snippet.html) for more details. # StreamPosition `StreamPosition[stream]` returns an integer that specifies the position of the current point in an open stream. Examples [#examples] ```wolfram str = OpenRead["ExampleFile.txt"]; StreamPosition[str] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StreamPosition.html) for more details. # ToFileName `ToFileName["directory", "name"]` assembles a full file name from a directory name and a file name. * `ToFileName[{dir1, dir2, ...}, name]` assembles a full file name from a hierarchy of directory names. * `ToFileName[{dir1, dir2, ...}]` assembles a single directory name from a hierarchy of directory names. Examples [#examples] Create a file path: ```wolfram ToFileName["/home/user", "file.txt"] ``` Build from directory hierarchy: ```wolfram ToFileName[{"home", "user", "documents"}, "report.pdf"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToFileName.html) for more details. # UpdateSearchIndex `UpdateSearchIndex[obj]` updates the given search index object. `UpdateSearchIndex["name"]` updates the search index with the specified name in the SearchIndices\[] list. Examples [#examples] Update a search index by name: ```wolfram UpdateSearchIndex["MyIndex"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpdateSearchIndex.html) for more details. # UpdateSemanticSearchIndex `UpdateSemanticSearchIndex[index, source]` updates the `SemanticSearchIndex[...]` *index* with the data in *source*. * `UpdateSemanticSearchIndex[index, {source1, ...}]` updates the `SemanticSearchIndex[...]` index with the collection of sources *sourcei*. * `UpdateSemanticSearchIndex[index, {source1 -> val1, ...}]` associates the new source *sourcei* to the value *vali*. Examples [#examples] ```wolfram UpdateSemanticSearchIndex[myIndex, "new document.txt"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpdateSemanticSearchIndex.html) for more details. # Write `Write[channel, expr1, expr2, ...]` writes the expressions expri in sequence, followed by a newline, to the specified output channel. Examples [#examples] Write to a file: ```wolfram stream = OpenWrite["output.txt"]; Write[stream, "Hello", " ", "World"]; Close[stream] ``` Write multiple expressions: ```wolfram Write[stream, {1, 2, 3}, " - ", "data"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Write.html) for more details. # WriteLine `WriteLine[stream, "string"]` writes "string", followed by a newline, to the specified output stream. * `WriteLine[proc, "string"]` writes "string" to an external process proc. Examples [#examples] ```wolfram stream = OpenWrite["test.txt"]; WriteLine[stream, "Hello World"]; Close[stream]; ``` ```wolfram proc = StartProcess[$SystemShell]; WriteLine[proc, "echo hello"]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WriteLine.html) for more details. # WriteString `WriteString["file", "string"]` writes a string to a file. `WriteString[channel, expr1, expr2, ...]` writes multiple expressions in sequence. Examples [#examples] Write to a file: ```wolfram WriteString["output.txt", "Hello, World!"] ``` Write to standard output: ```wolfram WriteString[$Output, "Message: ", value, "\n"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WriteString.html) for more details. # CreateFrontEndObject creates a reference to the inner expression and stores it into frontend objects storage shared with Kernel and frontend ```wolfram CreateFrontEndObject[expr_, uid_String | Nothing] _FrontEndExecutable ``` Returns [`FrontEndExecutable`](../Frontend-Objects/FrontEndExecutable) object with a given `uid` or generated. This is a fundamental component for expressions like `Graphics` and other interactive elements, which are too large to be stored inline in the editor, but also needed to be fully copyable and evaluatable. If you do not want to apply [CreateFrontEndObject](../Frontend-Objects/CreateFrontEndObject) on your symbol manually, consider to define [MakeBoxes](../Formatting/MakeBoxes) for [StandardForm](../Formatting/StandardForm). Then it can be applied automatically once it goes to the output cell. Applications [#applications] It is mostly used for storing *heavy* expressions to be executed as [WLJS Functions](frontend/Advanced/Frontend%20interpretation/WLJS%20Functions) such as [Graphics](../Graphics/Graphics), [Graphics3D](../Graphics3D/Graphics3D), [Audio](../Sound/Audio) and etc. Exporting [#exporting] Created stored objects are fully portable and can be automatically exported to any available formats. # FrontEndExecutable ```wolfram FrontEndExecutable[uid_String] ``` A static reference to a frontend object (see [CreateFrontEndObject](../Frontend-Objects/CreateFrontEndObject)) like [FrontEndRef](../Frontend-Objects/FrontEndRef), but can only be executed on the frontend (WLJS Interpreter). Application [#application] Custom WLJS function [#custom-wljs-function] Use for custom defined WLJS functions i.e. ```js .js core.MyCustomStuff = async (args, env) => { env.element.innerText = "Hi dude!"; } ``` and then in the next cell ```wolfram CreateFrontEndObject[MyCustomStuff[]] ``` Use `TagSetDelayed` on [MakeBoxes](../Formatting/MakeBoxes) to apply it automatically, i.e. ```wolfram MyCustomStuff /: MakeBoxes[m_MyCustomStuff, StandardForm] := With[{ o = CreateFrontEndObject[m] }, MakeBoxes[m, StandardForm] ] ``` then you don't need to manually create a frontend object anymore. Or even better - **if your expression is not large** one can bypass frontend objects at all ```wolfram MyCustomStuff /: MakeBoxes[m_MyCustomStuff, StandardForm] := ViewBox[m,m] ``` # FrontEndRef ```wolfram FrontEndRef[uid_String] ``` A static reference to a frontend object (see [CreateFrontEndObject](../Frontend-Objects/CreateFrontEndObject)), which can only be evaluated on Kernel unlike [FrontEndExecutable](./FrontEndExecutable) that runs on the frontend (WLJS). # GPUArray `GPUArray[array]` yields an array stored in GPU memory, making it available for GPU-accelerated computation. The input `array` can be: * a packed list of real or complex numbers * a `NumericArray` * a `SparseArray` Data is automatically transferred to the GPU. Use `Normal` to copy it back to the CPU. Examples [#examples] Basic usage [#basic-usage] Create a `GPUArray` from a vector and compute element-wise cosine: ```wolfram g = GPUArray[Range[1.0, 5.0]]; Cos[g] ``` Retrieve the result as an ordinary list: ```wolfram Normal[Cos[g]] ``` Matrix operations [#matrix-operations] Perform a matrix–vector dot product on the GPU: ```wolfram mat = GPUArray[RandomReal[1, {500, 500}]]; vec = GPUArray[RandomReal[1, 500]]; Normal[mat . vec] ``` Fourier transform on the GPU [#fourier-transform-on-the-gpu] ```wolfram data = GPUArray[RandomReal[1, 2^16]]; Normal[Fourier[data]] ``` Random number generation on GPU [#random-number-generation-on-gpu] ```wolfram g = GPUArray[RandomReal[{0, 1}, 10^6, Method -> "GPU"]]; Mean[g] ``` Linear algebra [#linear-algebra] Solve a linear system entirely on the GPU: ```wolfram a = GPUArray[RandomReal[1, {200, 200}]]; b = GPUArray[RandomReal[1, 200]]; Normal[LinearSolve[a, b]] ``` Arithmetic [#arithmetic] Standard arithmetic operations are dispatched to the GPU automatically: ```wolfram x = GPUArray[Range[1.0, 1000.0]]; Normal[x^2 + Sin[x]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GPUArray.html) for more details. # GPUArrayQ `GPUArrayQ[g]` returns `True` if `g` is a valid [GPUArray](./GPUArray) object and `False` otherwise. Examples [#examples] Basic check [#basic-check] ```wolfram g = GPUArray[{1.0, 2.0, 3.0}]; GPUArrayQ[g] ``` An ordinary list is not a `GPUArray`: ```wolfram GPUArrayQ[{1.0, 2.0, 3.0}] ``` After computation [#after-computation] Results of GPU operations are still `GPUArray` objects: ```wolfram g = GPUArray[Range[1.0, 5.0]]; GPUArrayQ[Sin[g]] ``` After converting back with `Normal`, the result is no longer a `GPUArray`: ```wolfram GPUArrayQ[Normal[g]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GPUArrayQ.html) for more details. # Autocomplete `Autocomplete[{string1, string2, ...}, "string"]` gives a list of the stringi that can complete string. `Autocomplete[<|s1 -> w1, s2 -> w2, ...|>, "string"]` puts the completions in order of decreasing weights wi. `Autocomplete[comps, "string", n]` gives the first at most n completions. `Autocomplete[comps]` gives an AutocompletionFunction that can be applied to a string. Examples [#examples] Complete a string from options: ```wolfram Autocomplete[{"apple", "application", "banana"}, "app"] (* {"apple", "application"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Autocomplete.html) for more details. # AutocompletionFunction `AutocompletionFunction[...]` represents a function to be applied to a string to generate possible completions. Examples [#examples] Create an autocompletion function: ```wolfram acf = Autocomplete[{"hello", "help", "world"}]; acf["hel"] (* {"hello", "help"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AutocompletionFunction.html) for more details. # ChoiceDialog ```wolfram ChoiceDialog[expr_] ``` puts up a standard choice dialog that displays `expr` together with two buttons OK and CANCEL. It block the execution, until any button is pressed (or ESC / ENTER) ```wolfram ChoiceDialog[expr_, {label1_ -> value1_, label2_ -> value2_ ...}] ``` includes buttons with labels `labeli` and returns `valuei` if clicked. Labels and values can be **any WL expressions**. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [ChoiceDialogAsync](./ChoiceDialogAsync) instead It will use [StandardForm](../Formatting/StandardForm) for displaying expressions Examples [#examples] Confirm action ```wolfram ChoiceDialog["Ok or not Ok?"] ``` Choose from the list of expressions ```wolfram ChoiceDialog["Choose the Date", {Now->Now, Now + Quantity[1, "Days"] -> Now + Quantity[1, "Days"]}] ``` Choose from the list of labels ```wolfram ChoiceDialog["Choose the Date", {"Now"->Now, "Tomorrow" -> Now + Quantity[1, "Days"]}] ``` Options [#options] In a case of a lost context provide "Notebook" [#notebook] Specify explicitly a notebook where to pop up a window # ChoiceDialogAsync Asynchronous version of [ChoiceDialog](../Frontend-IO/ChoiceDialog), that returns [Promise](../Misc/Promise) # ClickToCopy ```wolfram ClickToCopy[expr_ | str_String, opts___] ClickToCopy[label_, expr_ | str_String, opts___] ``` represents sort of a button with `label` (or `expr` in [StandardForm](../Formatting/StandardForm)) as a label. It pushes [InputForm](../Formatting/InputForm) of `expr` or directly `str` to user's clipboard when pressed. Options [#options] In a case of a lost context provide "Window" [#window] Specify explicitly a window to which the data will be pushed. By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) # CopyToClipboard ```wolfram CopyToClipboard[expr_, opts___] ``` pushes [InputForm](../Formatting/InputForm) form of `expr` to the clipboard of a user. Options [#options] In a case of a lost context provide "Window" [#window] Specify explicitly a notebook where to pop up a window. By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) # CurrentWindow ```wolfram CurrentWindow[] _WindowObj ``` returns a window socket object from the evaluation context. The object corresponds to the current socket channel used for the communication with a window, where a cell is evaluated. Provides [WindowObj](../Frontend-IO/WindowObj) Notes on projected cells [#notes-on-projected-cells] `CurrentWindow[]` will return an object pointing to the window, where a cell was projected. To get the window object of the parent notebook window use ```wolfram CurrentWindow["Origin"] ``` It is used by [FrontSubmit](../Frontend-IO/FrontSubmit), [FrontFetch](../Frontend-IO/FrontFetch) and [FrontFetchAsync](../Frontend-IO/FrontFetchAsync) # FrontFetch is a synchronous version of [FrontFetchAsync](../Frontend-IO/FrontFetchAsync). Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. # FrontFetchAsync asynchronously evaluates (aka [FrontSubmit](../Frontend-IO/FrontSubmit)) and fetches the resulting expression back to the Wolfram Kernel from the frontend (browser) ```wolfram FrontFetchAsync[expr_, opts___] ``` and returns [Promise](../Misc/Promise) object. Options [#options] "Window" [#window] specifies a window object, on which an expression will be evaluated. Use [CurrentWindow](../Frontend-IO/CurrentWindow) to fetch a window object from the evaluation context explicitly. "Format" [#format] The default expression form used to import raw data acquired from the frontend. It effectively applies `ImportString` on raw JSON data. The possible values * `"RawJSON"` (*the default*) * `"JSON"` * `"ExpressionJSON"` * `"Raw"` bypasses parser and returns a string Usage with FrontInstanceReference [#usage-with-frontinstancereference] Using an extension [FrontInstanceReference](../Frontend-IO/FrontInstanceReference), one can execute an expression **in the context of instance** of a specified frontend symbol and fetch the result back ```wolfram FrontFetchAsync[expr_, m_FrontInstanceReference, opts___] _Promise ``` See examples on [FrontSubmit](../Frontend-IO/FrontSubmit) Examples [#examples] To read the selected text from a cell and print it to another cell. Here we use `FrontEditorSelected` which is a frontend-only symbol: ```wolfram With[{notebook = EvaluationNotebook[]}, EventHandler[InputButton["Read selected text"], Function[Null, Then[FrontFetchAsync[FrontEditorSelected["Get"]], Function[result, NotebookWrite[notebook, Cell[result, "Input"]] ] ] ]] ] ``` or to read a clipboard ```wolfram With[{notebook = EvaluationNotebook[]}, EventHandler[InputButton["Read clipboard"], Function[Null, Then[FrontFetchAsync[ReadClipboard[]], Function[result, NotebookWrite[notebook, Cell[result, "Input"]] ] ] ]] ] ``` # FrontInstanceGroup ```wolfram FrontInstanceGroup[] _FrontInstanceGroup ``` constructs a group container for frontend expressions (or symbols). Normally one can append objects on existing plots using [FrontSubmit](../Frontend-IO/FrontSubmit), this group container allows to undo those action by disposing the created instances (even if they are nested). It does also support batch operations. To add expressions into created group, use the following pattern ```wolfram g = FrontInstanceGroup[]; g[{Red, Disk[]}] ``` This expression is immutable Methods [#methods] FrontSubmit [#frontsubmit] Evaluates the group on the frontend ```wolfram group = FrontInstanceGroup[]; FrontSubmit[group[expr_], scene] ``` one can submit multiple groups as well ```wolfram ... FrontSubmit[{group1[expr_], group2, ...}, scene] ``` Delete [#delete] Disposes created group (s) ```wolfram Delete[_FrontInstanceGroup | __FrontInstanceGroup] ``` FrontInstanceGroupRemove [#frontinstancegroupremove] Akin to `Delete` but allows to specify the window ```wolfram FrontInstanceGroupRemove[_FrontInstanceGroup | __FrontInstanceGroup | {__FrontInstanceGroup}, opts___] ``` where `opts` can be "Window" [#window] By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) Example [#example] The common use case is to be able to add and remove groups of expressions from the some frontend instance. For example to add and then remove primitives from a plot ```wolfram scene = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{scene}] ``` now add an object ```wolfram group = FrontInstanceGroup[]; FrontSubmit[{Red, Disk[]} // group, scene]; ``` and dispose created instanced and revert any side effects ```wolfram FrontInstanceGroupRemove[group] ``` # FrontInstanceReference ```wolfram FrontInstanceReference[] _FrontInstanceReference ``` or ```wolfram FrontInstanceReference[uid_String] _FrontInstanceReference ``` constructs an instance reference object, which can be used to refer the instance context of a frontend symbol. Methods [#methods] FrontSubmit [#frontsubmit] ```wolfram FrontSubmit[expr_, _FrontInstanceReference, opts___] ``` For example to add a new object on a scene ```wolfram scene = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{scene}] ``` Then one can add new object to an existing plot if to was always there ```wolfram FrontSubmit[{RandomColor[], Disk[{.5,.5},.2]}, scene]; ``` FrontFetch [#frontfetch] FrontFetchAsync [#frontfetchasync] ```wolfram FrontFetchAsync[expr_, _FrontInstanceReference, opts___] ``` # FrontProxy Definitions are not loaded to the main context by default An low-level optional abstraction for managing and manipulating graphical or any [prototype-based frontend symbols](./../Advanced/Frontend-functions/Overview) efficiently and process them in batch. The idea is to use proxy objects as lightweight references to groups of instances (like rectangles, circles combined with other primitives) in a larger scene and **minimize the data transfer** and symbols usage. All properties of proxies are stored in linear auto-sizable buffers, which allows JIT-enabled processing and easy sync with a frontend (single transaction). To load this library use any context **that differs from** `Global` ```wolfram Needs["FrontProxy`" -> "f`"] // Quiet ``` Factory [#factory] Creates a new proxy type ```wolfram f`Proxy[{properties__}, body_] _FrontProxy`Reference ``` or if you want to specify mutable properties explicitly ```wolfram f`Proxy[{properties__}, body_, {mutable__}] _FrontProxy`Reference ``` For example to make proxy for many [Disk](../Graphics/Disk)s with controllable opacity, color and position ```wolfram disk = f`Proxy[{pos, c}, { Opacity[c], RGBColor[With[{h=c}, {h, 1-h, 0.}]], Disk[pos, 0.1] }]; ``` Proxy factory will automatically wrap all mentioned variables `pos` and `c` linear buffer parts wrapped with [Offload](../Interpreter/Offload) Constructor [#constructor] To construct an single instance ```wolfram f`AddTo[_FrontProxy`Reference, {args__}] _Integer ``` To construct multiple instances use ```wolfram f`AddTo[_FrontProxy`Reference, {args__}..] _List ``` as a result it returns **a plain `List` of integers corresponding to the internal `Ids`**. For example ```wolfram ids = f`AddTo[disk, Sequence @@ Table[{RandomReal[{-1,1}, 2], RandomReal[{0,1}]}, {10}]]; ``` Methods [#methods] The following methods can be applied FullForm [#fullform] ```wolfram f`FullForm[_FrontProxy`Reference, id_Integer] ``` ```wolfram f`FullForm[_FrontProxy`Reference, {id__Integer}] ``` Reveals the actual expressions. This method can be used to display an object. For example ```wolfram Graphics[{f`FullForm[disk, ids]}, PlotRange->{{-1,1}, {-1,1}}] ``` Remove [#remove] Removes the given proxy or list of proxies by provided Ids (live) ```wolfram f`Remove[_FrontProxyFunction, Id_Integer] ``` ```wolfram f`Remove[_FrontProxyFunction, {Id__Integer}] ``` Dispatch [#dispatch] Dispatches the changes made to the properties of proxies and effectively syncing all buffers ```wolfram f`Dispatch[_FrontProxyFunction] ``` It is called usually when all calculations have been finished and an update is needed to see the changes. Behind the scenes it submits all buffers storing the properties of object to the frontend. FrontProxyBuffer [#frontproxybuffer] Provides a read access to the slice of a given property of all proxies in a form if linear packed array ```wolfram FrontProxyBuffer[_FrontProxyFunction, index_Integer] _List ``` where `index` goes from the first property provided in [Constructor](#Constructor) to the last. There is a special case ```wolfram FrontProxyBuffer[_FrontProxyFunction, -1] _List ``` which **returns a boolean array standing for the validity of the property at the given position**. Since proxies are dynamic and can be created or removed any time it might temporary lead to "holes" in buffers marked as `False` in the list. Each position in buffers does correspond to `Id` returned by [Constructor](#Constructor) FrontProxyBufferSet [#frontproxybufferset] Updates a given property buffer with a new array ```wolfram FrontProxyBuffer[_FrontProxyFunction, index_Integer, new_List] ``` For example one can update `disks` primitives in the following way ```wolfram With[{ position = f`Buffer[disk, 1] }, With[{velocity = Table[{a[[2]], -a[[1]]}, {a, position}]}, f`BufferSet[disk, 1, position - 0.1 velocity]; f`Dispatch[disk]; ]; ]; ``` It will cause the rotation of all disks Tips [#tips] If you dynamically add proxies to the scene. Call [`Dispatch`](#`Dispatch`) before submitting it to a scene. This will make sure, that the buffer size is up-to date on the frontend as well. For fast animations with many proxies involved turn off transition interpolation globally on [Graphics](../Graphics/Graphics) using an option [`TransitionType`](../Graphics/Graphics) set to `None`. For processing many proxies use pure functions with `Map`, `Table` or `MapThread` and etc. **Multiple passes using less complicated function cost less**, than a single pass with one complex due to JIT optimizations. Examples [#examples] Spherical attracting molecules [#spherical-attracting-molecules] Here we will use Lennard-Jones potential to model a bunch of sphere-like molecules on 2D canvas aka [Graphics](../Graphics/Graphics) ``` disk = f\`Proxy[{pos, c}, { Opacity[0.2], RGBColor[With[{h=c}, {h, 1-h, 0.}]], Disk[pos, 0.1] }]; disks = f\`AddTo[disk, Sequence @@ Table[{RandomReal[{-1,1}, 2], 0.2}, {10}]]; animation = CreateUUID[]; scene = FrontInstanceReference[]; trigger = 1; potential = Function[{a,b}, With[{r = Norm[a-b]+0.001, r0 = 0.22}, With[{c = (*FB[*)((3.0 ((*SpB[*)Power[r0(*|*),(*|*)6](*]SpB*)))(*,*)/(*,*)((*SpB[*)Power[r(*|*),(*|*)8](*]SpB*)))(*]FB*)-(*FB[*)((3.0 ((*SpB[*)Power[r0(*|*),(*|*)12](*]SpB*)))(*,*)/(*,*)((*SpB[*)Power[r(*|*),(*|*)14](*]SpB*)))(*]FB*)}, If[Abs[c] > 100.0, {0.,0.}, (a-b) c] ] ]]; EventHandler[animation, Function[Null, With[{ position = f\`Buffer[disk, 1], state = f\`Buffer[disk, 2] }, With[{velocity = Map[Total] @ Table[potential[a,b], {a, position}, {b, position}]}, With[{ character = Map[Clip[5.0 Norm[#], {0.2, 0.8}]&, velocity] }, f\`BufferSet[disk, 1, position - 0.001 velocity]; f\`BufferSet[disk, 2, character]; f\`Dispatch[disk]; ]; ]; ]; trigger = 1; ]]; add = With[{new = f\`AddTo[disk, {#, 0.2}]}, f\`Dispatch[disk]; FrontSubmit[f\`FullForm[disk, new], scene]; ]&; Graphics[{ f\`FullForm[disk, disks], scene, AnimationFrameListener[trigger // Offload, "Event"->animation], EventHandler[Null, {"click" -> add}] }, PlotRange->{{-1,1}, {-1,1}}, TransitionType->None] ``` Fireworks [#fireworks] A crash test for the frontend system ```wolfram (* Define the rectangle proxy with initial properties *) rectangleProxy = f`Proxy[ {position, velocity, rotationAngle, lifeSpan}, Translate[ {Opacity[lifeSpan], RGBColor[With[{l = lifeSpan}, {l, 0, 1 - l}]], Rectangle[{-1, -1}, {1, 1}]}, position ] ]; (* Initialize variables *) newProxies = {}; expiredProxies = {}; frameCounter = 1; frameRate = 1; lastUpdateTime = AbsoluteTime[]; sceneReference = FrontInstanceReference[]; (* Function to add new proxies at a given position *) addProxyAtPosition[position_] := newProxies = { newProxies, f`AddTo[ rectangleProxy, Sequence @@ Table[ {position, RandomReal[{0.99, 1.01}] {Cos[angle], Sin[angle]} // N, RandomReal[{0, 3.14}], 1.0}, {angle, 0., 2 Pi, 2 Pi / 12.0} ] ] }; (* Frame update logic *) Module[{}, EventHandler["frame", Function[Null, With[{ positions = f`Buffer[rectangleProxy, 1], velocities = f`Buffer[rectangleProxy, 2], lifeSpans = f`Buffer[rectangleProxy, 4], isValid = f`Buffer[rectangleProxy, -1] }, (* Identify expired proxies for disposal *) expiredProxies = MapThread[ If[#1 && #2 < 0.2, #3, Nothing] &, {isValid, lifeSpans, Range[Length[lifeSpans]]} ]; (* Update positions and life spans *) f`BufferSet[rectangleProxy, 1, positions + velocities]; f`BufferSet[rectangleProxy, 4, lifeSpans * 0.95]; ]; (* Dispatch updates to proxies *) f`Dispatch[rectangleProxy]; (* Remove expired proxies *) If[Length[expiredProxies] > 0, f`Remove[rectangleProxy, expiredProxies]; expiredProxies = {}; ]; (* Submit new proxies *) If[Length[newProxies] > 0, FrontSubmit[f`FullForm[rectangleProxy, newProxies // Flatten], sceneReference]; newProxies = {}; ]; (* Update FPS counter *) With[{currentTime = AbsoluteTime[]}, If[currentTime - lastUpdateTime > 1.0, frameRate = Round[(frameCounter + frameRate) / 2.0]; frameCounter = 1; lastUpdateTime = currentTime; , frameCounter++; ]; ]; ]] ]; (* Create the graphics and event handlers *) Graphics[ { sceneReference, {Directive[FontSize -> 20], Text[frameRate // Offload, {-80, -80}]}, AnimationFrameListener[frameCounter // Offload, "Event" -> "frame"], EventHandler[ Null, {"mousemove" -> addProxyAtPosition} ] }, PlotRange -> {{-100, 100}, {-100, 100}}, TransitionType -> None ] ``` # FrontSubmit To send an expression to be evaluated on frontend / browser: ```wolfram FrontSubmit[expr_, opts___] ``` where `expr` can be a small subset of Wolfram Language symbols for basic math operations or [any frontend symbols/expressions](./../Advanced/Frontend-functions/Overview). To sends an raw Javascript expression to be executed on frontend / browser, use: ```wolfram FrontSubmit[expr_String, opts___] ``` where `expr` is any valid JS expression represented as a string. Options [#options] "Window" [#window] specifies a window object, where an expression will be evaluated. Use [CurrentWindow](../Frontend-IO/CurrentWindow) to fetch a window object from the evaluation context. Be aware of a context loss in a case of an handler function called from outside. For example with [Parallel kernels](frontend/Advanced/Events%20system/Parallel%20kernels) or [`SetTimeout`](../Misc/Async) one have to explicitly provide a [WindowObj](../Frontend-IO/WindowObj) ```wolfram With[{win = CurrentWindow[]}, (* Current evaluation context *) SetTimeout[ (* Evaluation context lost!!! *) FrontSubmit[Alert["Boom"], "Window"->win] , 3000]; "Hi there!" ] ``` Examples [#examples] Evaluating frontend symbols [#evaluating-frontend-symbols] ```wolfram FrontSubmit[Alert["Hello World!"]] ``` which will produce a pop-up modal window. Or to call a custom-defined Javascript function ```js title="cell 1" .js core.reversed = async (args, env) => { const text = await interpretate(args[0], env); return (text..split("").reverse().join("")); } ``` ```wolfram title="cell 2" FrontSubmit[reversed["Must be reversed..."] // Alert]; ``` Append objects to a static graph [#append-objects-to-a-static-graph] We can append anything to a graphics canvas without reevaluation of a cell ```wolfram title="cell 1" scene = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{scene}] ``` and then ```wolfram title="cell 2" FrontSubmit[Arrow[RandomReal[{0,1}, {2,2}]], scene] ``` to append an arrow to an existing graph. Overwritting ViewBox [#overwritting-viewbox] A typical graphics figure is usually a [ViewBox](../Formatting/Low-level/ViewBox). Here we can reference it using [FrontInstanceReference](../Frontend-IO/FrontInstanceReference) ```wolfram plot = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{plot}] ``` and then we can destroy it and replace with some other text ```wolfram FrontSubmit[ViewBox`OuterExpression["BAM!"], plot] ``` # Input ```wolfram Input[] Input[prompt_String] Input[prompt_String, default_] ``` interactively prompts a user to enter Wolfram Expression displaying `prompt` message with `default` expression shown in the input field. This is a blocking sync expression. Please consider to use `InputAsync` For example: ```wolfram Plot[Evaluate[Input[]], {x,0,1}] ``` # InputAsync Async version of [Input](../Frontend-IO/Input), that returns [`Promise`](../Misc/Promise) # InputString Similar to [Input](../Frontend-IO/Input), but returns a string. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [InputStringAsync](./InputStringAsync) instead # InputStringAsync Async version of [InputString](../Frontend-IO/InputString), that returns [`Promise`](../Misc/Promise) # MessageDialog ```wolfram MessageDialog[expr_] ``` opens a modal window with `expr` displayed in the middle in a *non-blocking way*, where `expr` can be a string, graphics or any other expression It will use [StandardForm](../Formatting/StandardForm) for displaying expressions Options [#options] In a case of a lost context provide "Notebook" [#notebook] Specify explicitly a notebook where to pop up a window # Paste ```wolfram Paste[opts___] ``` pushes the content of a clipboard to a notebook as a new cell. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Options [#options] In a case of a lost window context provide (executed by a timer or an external event) "Window" [#window] Specify explicitly window from which to read a clipboard content. By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) # PasteButton ```wolfram PasteButton[expr_ | str_String] PasteButton[label_, expr_ | str_String] ``` pushes [StandardForm](../Formatting/StandardForm) form of `expr` or `str` directly as a new cell when pressed with a `label` displayed # SystemDialogInput ```wolfram SystemDialogInput[type_String, opts___] ``` opens a OS dialog window to operate with IO. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [SystemDialogInputAsync](./SystemDialogInputAsync) instead This feature is currently available only for WLJS Desktop App type [#type] "FileOpen" [#fileopen] Opens a file browser. Filters can be provided as well ```wolfram SystemDialogInput["FileOpen", {Null, {"Tabular Formats" -> {"*.csv", "*.tsv"}, "Plain Text Document" -> {"*.txt"}}}] ``` "FileSave" [#filesave] Opens a file saving dialog. Filters can be provided as well ```wolfram SystemDialogInput["FileSave", {Null, {"Tabular Formats" -> {"*.csv", "*.tsv"}, "Plain Text Document" -> {"*.txt"}}}] ``` "OpenList" [#openlist] Opens a file browser with multiple selections. Filters can be provided as well similar to `FileOpen` type. "Directory" [#directory] Opens a dialog to select a directory ```wolfram SystemDialogInput["Directory"] ``` General options [#general-options] WindowTitle [#windowtitle] The title of the browser window "Window" [#window] A window to which the dialog will be assigned. By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) # SystemDialogInputAsync An async version of [SystemDialogInput](../Frontend-IO/SystemDialogInput), which returns [Promise](../Misc/Promise) # SystemOpen ```wolfram SystemOpen[path_String | _File | _URL, opts___] ``` opens a file, url or a folder specified by the first argument. It uses OS API. It uses absolute path. To open a file in your notebook directory use the pattern ```wolfram SystemOpen[FileNameJoin[{NotebookDirectory[], "yourFile"}]] ``` Options [#options] "Window" [#window] By the default is uses [CurrentWindow](../Frontend-IO/CurrentWindow) from the current context. If the context is not available, you have to specify a window object explicitly. Works only for Desktop App # WindowEventListener ```wolfram WindowEventListener[ev_String | ev_EventObject] ``` ```wolfram WindowEventListener["Id" -> ev_String] ``` acts similar to [SlideEventListener](./../Slides/SlideEventListener) and captures global events from a window, **where it is placed**. All events are fired on provided `ev` - [EventObject](./../Misc/Events) The following patterns can be captured: * `"Mounted"` - when the component or window has loaded * `"Closed"` - when a window is closed * `"Blur"` - when a user removes focus from a window * `"Focus"` - when a user focuses a window This component works in regular cells as well as in WLX. It takes up no space and renders nothing. For example ``` ev = EventObject[]; WindowEventListener[ev] ``` ``` log = {}; Refresh[log, 1] EventHandler[ev, { ev_ :> Function[Null, AppendTo[log, ev]; ] }]; ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # WindowObj ```wolfram WindowObj[assoc_Association] ``` an internal representation of a current window (can be a notebook or projected cell), that contains the information of a live connection to it used by [FrontSubmit](../Frontend-IO/FrontSubmit), [FrontFetch](../Frontend-IO/FrontFetch), [FrontSlidesSelected](../Slides/FrontSlidesSelected) and other functions. It is produced by [CurrentWindow](../Frontend-IO/CurrentWindow). Methods [#methods] EventHandler [#eventhandler] You can attach an event listener to it. The following patterns are supported * `"Closed"` - fires, when a windows has been closed You can hook up multiple event handlers to the same window without clonning the event object. It returns a wrapper for [`EventObject`](../Misc/Events) generated from the events of the given window. You can apply `EventRemove` on it to remove all handlers. *example* ```wolfram test = {0,1,0}; EventHandler[CurrentWindow[], {"Closed" -> Function[Null, test = {1,0,0}; ]}]; Graphics[{RGBColor[test // Offload], Disk[{0,0}, 1]}] ``` Try to reopen a window (reload) a disk must turn red. # Animate ```wolfram Animate[expr_, {u_Symbol, min_, max_}, opts___] ``` ```wolfram Animate[expr_, {u_Symbol, min_, max_, step_}, opts___] ``` generates a version of `expr` allowing automatic repeated reevaluation for each `u` though `min`, `max` with a defined frame rate. Consider to use [AnimatePlot](../Plotting-Functions/AnimatePlot) for basic animated plots or use low-level tools: [Offload](../Interpreter/Offload) and [AnimationFrameListener](../Graphics/AnimationFrameListener) . `Animate` uses **Just-In-Time** transpilation of expressions to optimized ones. It might not work in all cases and may fall back to full reevaluation. Examples [#examples] Symbolic expressions ```wolfram Animate[Row[{Sin[x], "==", Series[Sin[x], {x,0,n}], Invisible[1/2]}], {n, 1, 10, 1}, RefreshRate->3] ``` Animate [Plot](../Plotting-Functions/Plot) expression ```wolfram Animate[Plot[1.0 + Sin[w] Sin[x + w],{x,0,5Pi}, Epilog->{ Red, Point[{8.0, 1.0 + Sin[w] Sin[8.0 + w]}] }], {w,0,Pi}] ``` Spinograph ``` Animate[ ParametricPlot[ReIm[(*SpB[*)Power[I(*|*),(*|*)-t](*]SpB*) + 3 (*SpB[*)Power[I(*|*),(*|*)t/3](*]SpB*)], {t,0,u}, Epilog->{ Arrow[{{0,0}, ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*)]}], Arrow[{ ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*)], ReIm[(*SpB[*)Power[I(*|*),(*|*)-u](*]SpB*) + 3 (*SpB[*)Power[I(*|*),(*|*)u/3](*]SpB*)]}] }, PlotRange->{{-4,4}, {-4,4}}, GridLines->Automatic, PlotStyle->(*VB[*)(RGBColor[1, 0, 0])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYgCDD/ZQBgMDnAEA4iUPRg=="*)(*]VB*) ] , {u, 0.001, 4Pi}, RefreshRate->30, Appearance->None] ``` Animate [Plot3D](../Plotting-Functions/Plot3D) expression ``` w3D[x_,y_,t_] := Total@Table[With[{kx = 1.0 \[Omega], ky = 1.0 \[Omega]}, Cos[ kx x + ky y - \[Omega] t] ], {\[Omega], 0, 3, 1.0}]; Animate[Plot3D[w3D[x,y,t], {x,-Pi,Pi}, {y,-Pi,Pi}, MaxRecursion->0, Mesh->None, PlotRange->Full], {t,0,5}] ``` Here we tried to lower the computation costs by reducing mesh quality, so that the animation can be played with higher FPS JIT Transpiler [#jit-transpiler] `Animate` as well as [Manipulate](../GUI/Manipulate) uses a diff algorithm that detects and tries to convert manipulated expressions to a more optimized ones using a low-level granular updates with `Offload`. If something else goes wrong, it will *deoptimize* it back and send an original expression to the output. Tips for better performance [#tips-for-better-performance] See [Manipulate](../GUI/Manipulate) Portability [#portability] See [Manipulate](../GUI/Manipulate) Exporting as GIF or video [#exporting-as-gif-or-video] This feature is only available for WLJS Notebook desktop application, since we rely on our custom Electron.js renderer You can wrap [Animate](../GUI/Animate), [AnimatePlot](../Plotting-Functions/AnimatePlot), [AnimateParametericPlot](../Plotting-Functions/AnimateParametericPlot) expressions with [AnimatedImage](../Image/AnimatedImage) to rasterize them into the series of images and export to a file as GIF or video ```wolfram Export["animation.gif", AnimatedImage @ Animate[ Plot[Sinc[x z], {x,0,4Pi}] , {z,1,5}, RefreshRate->25] ] ``` where `AnimatedImage` can be extended with options alike [Rasterize](../Image/Rasterize) Options [#options] * `FrameRate` playback speed (does not affect rasterization). By the default is taken from `Animate` options (as `RefhreshRate` or `AnimationRate`) * `"Window"` by the default is [CurrentWindow](../Frontend-IO/CurrentWindow) * `"ExposureTime"` sets waiting time before each frame is captured. By the default it is `Automatic` and the actual values is taken from the animation rate of the widget * `"Asynchronous"` sets async rasterization mode, where the constructor returns `Promise` immediately. By the default is `False`. In the same way it can be exported to `ByteArray` or Base64 string: ```wolfram ExportByteArray[AnimatedImage[...], "GIF"] ``` ```wolfram ExportString[AnimatedImage[...], {"Base64", "GIF"}] ``` Also [Video](../Video/Video) object can be directly derived from [AnimatedImage](../Image/AnimatedImage): ```wolfram Video[AnimatedImage[...]] ``` MMAView [#mmaview] [MMAView](../GUI/MMAView) wrapper allows to use **native Wolfram Engine rendering engine** for animating expressions, **any expression**. It uses a parallel kernel to rasterize the provided expression and stream updates to the frontend. ```wolfram Animate[Plot[Sin[x y], {x,0,1}], {y,0,5}] // MMAView ``` Options [#options-1] RefreshRate [#refreshrate] Sets the number of frames per second for which animation is being evaluated and played. The default is `12` AnimationRate [#animationrate] Specifies units or steps per second. By the default is `Automatic`. If set to a numeric value, it will effectively overwrite the step size of the iterator. "TriggerEvent" [#triggerevent] Specifies an [`EventObject`](../Misc/Events) used to start an animation (or restart) externally (via a button for instance) "UpdateFunction" [#updatefunction] Allows to alter the data generated on update or cause user-defined side-effects. The following values are expected ```wolfram Function[u, (* side effects *) (* RETURN *) True <- accept change False <- prevent default _String <- will be written instead to the output expr ] ``` One can bypass the default method completely and rely on side effects ```wolfram Module[{pts}, Animate[Graphics[{ Circle[{0,0},1], Red, Point[pts // Offload] }, ImageSize->Small], {t, 0, 2Pi, 0.1}, "UpdateFunction" -> Function[t, pts = {Sin[t], Cos[t]}; False ]] ] ``` Appearance [#appearance] By the default is `Automatic`. Change to `None` or `False` to remove extra information. Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Button ```wolfram Button[label_, action_] ``` represents a shorthand notation for [InputButton](../GUI/InputButton) with event-handler made for compatibility with Mathematica. If `label` is not a string then a clickable pane will be displayed with a limited styling options For example ```wolfram Button["Click to beep", Beep[]] ``` This button changes the color of the disk each time you click it: ```wolfram Module[{b = List @@ Red}, {Button["change", b = RandomReal[{0, 1}, 3]], Graphics[{RGBColor[Offload[b]], Disk[]}]}] ``` This button changes position each time you click it: ```wolfram Module[{pt = {0, 0}}, Framed@Graphics[ Inset[Button["Click Me", pt = RandomReal[{-1, 1}, 2]], Offload[pt]], PlotRange -> {{-1,1}, {-1,1}}, Controls->False]] ``` # CellView A component, that renders the content as a cell according to the provided view-component: ```wolfram CellView[content_String, opts___] ``` where `content` is a string, that represents an expression needed by a view component of a cell. View-components are provided by different cell types used by the default to render the notebook in a window. `CellView` supports [complete cell objects](./../Advanced/Notebook-Operations) representation as an input: ```wolfram CellView[ExpressionCell[expr, "Input"]] CellView[Cell[expr_String, "Input"]] CellView[Cell[expr_String, "Output", "html"]] CellView[Cell[expr_String, "Output", "js"]] CellView[Cell[expr_String, "Output", "markdown"]] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) Options [#options] "Display" [#display] A view-component to render the content. For default cell types it can be * `"codemirror"` a default view component used in all input cells as well as in [EditorView](../GUI/EditorView) * `"markdown"` a renderer of [Markdown](./../Cell-types/Markdown) cells * `"html"` a renderer of [HTML](./../Cell-types/HTML) * `"js"` a renderer of [Javascript](./../Cell-types/Javascript) cells * `"mermaid"` a renderer of [Mermaid Diagrams](./../Cell-types/Misc) * ... "Class" [#class] Specify a class names to apply for a container element "Style" [#style] Specify a style names to apply for a container element ImageSize [#imagesize] Resizes the container Applications [#applications] If you want to show mermaid diagrams in your slides *craft a diagram* ```wolfram MyDiagram = CellView[" graph LR A[Text Header 3200 byte] --> B[Binary Header 400 byte] B --> C1[240 byte 1-st trace header] --> T1[samples of 1-st trace] B --> C2[240 byte 2-st trace header] --> T2[samples of 1-st trace] B --> CN[240 byte n-st trace header] --> T3[samples of 1-st trace] ", ImageSize->650, "Display"->"mermaid"] ``` *make a slide* ```wolfram .slide # My slide with a Diagram <MyDiagram/> ``` # EditorView A component, that renders Wolfram Expressions as in the code editor: ```wolfram EditorView[expr_String | expr_Offload, opts___] ``` where `expr` is a string, that represents an expression. It can receive updates and emit, when a user change the inner content. `EditorView` supports [complete cell objects](./../Advanced/Notebook-Operations) representation as an input: ```wolfram EditorView[ExpressionCell[expr, "Input"]] EditorView[Cell[expr_String, "Input"]] EditorView[TextCell[expr_String]] EditorView[TextCell[expr_String, "Section"]] ``` Editor is usually quite slow, when it comes to updates, because of many decoration widgets used there. Please, **do not use it on a rapidly changing data**, consider [TextView](../GUI/TextView) instead. Event generation [#event-generation] When `"Event"` option is provided, it will send a new data in a form of a string. Options [#options] "Event" [#event] Specifies an `uid` of an event-object, that will be fired on-change. "ReadOnly" [#readonly] Blocks the editing mode. The default value is `False` "Selectable" [#selectable] Allows or blocks any selection and copying. The default is `True` "FullReset" [#fullreset] Fully updates an editor when `expr` changes (rebuilds all widgets). By the default it is set to `False`, which simplifies an update strategy and has less overhead. However it might not work on the content with [Row](../Formatting/Row), [Grid](../Formatting/Grid). "KeepMaxHeight" [#keepmaxheight] Measures and keep the maximum height. By the default is `False` Application [#application] If you want to show the dynamic symbols content, use it together with `ToString[expr, StandardForm]` ```wolfram EventHandler[InputRange[1,10,1,1], Function[n, series = ToString[Series[Sin[x], {x,0,n}] // Normal, StandardForm]; ]] EventFire[%, 1]; EditorView[series // Offload] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) Dev notes [#dev-notes] This is used in [InterpretationBox](../Formatting/Low-level/InterpretationBox) implementation to replace a WL expression using a user-provided WL expression in a code editor. # HTMLView ```wolfram HTMLView[string_String | List[strings__String] | _Offload, opts___] ``` a representation of an HTML element in the notebook. It is used for rendering HTML in-place, where this expression is located and also is used for dynamic indication. ```wolfram HTMLView["<span style=\"color:red\">Hello World</span>"] ``` This is a core function behind most input elements, such as [InputButton](../GUI/InputButton), [InputText](../GUI/InputText), [TextView](../GUI/TextView) and etc. Options [#options] Prolog [#prolog] **works only if a string or a list of strings provided as input** A function to be executed on the frontend before embedding HTML into DOM. You probably have to define it by yourself (see frontend symbols). It exposes in `env` following fields Overview of frontend symbols / function </Cards> ```js env.htmlContent //mutable HTML expression ``` There is a built-in feature for modifying the string - see below [Post-template processor](#Template%20processor) Epilog [#epilog] **works only if a string or a list of strings provided as input** A function to be executed on the frontend after embedding HTML into DOM. The exposed fields are ```js env.element //access to DOM element created ``` "Style" [#style] a string, which sets CSS style attribute "Class" [#class] a string, which sets CSS class attribute Template processor [#template-processor] There is built-in tool for post-processing HTML elements before embedding them into DOM. It can be included to the pipeline using `Prolog` option ```wolfram HTMLView`TemplateProcessor[object_Association] ``` **It has `HoldFirst` attribute and `object` will be evaluated on the frontend** This text processor replaces all string like ``` #name ``` With a corresponding field value from `object["name"]`. It comes handy to create unique ID's in runtime, before a widget is rendered on a page. For example ```wolfram HTMLView["<div>Unique Id #instanceId</div>", Prolog->HTMLView`TemplateProcessor[<|"instanceId" -> CreateUUID[]|>]] ``` It will generate a new UID for each instance even if you copy and paste one. WLX processor [#wlx-processor] This allows to hydrate all interactive elements inseted to HTML template in `WLXForm` if it would be a normal WLX cell. It can be included to the pipeline using `Prolog` option ```wolfram HTMLView`WLXProcessor[] ``` for example, you have WLX component, that decorates a `Plot`: ```html .wlx wlTest[P_] := <div class="p-1 rounded" style="border: 1px solid blue"><P/></div> ``` ```html .wlx wlTest[Plot[x, {x,0,1}]] ``` it works perfectly fine within WLX cells. To embed it as `HTMLView` you provide it directly as a first argument with WLX processor in `Prolog`: ```wolfram HTMLView[wlTest[Plot[x, {x,0,1}]], Prolog->HTMLView`WLXProcessor[]] ``` Transitions and updates [#transitions-and-updates] It fully supports updates. Use [Offload](../Interpreter/Offload) on the first argument. For example ```wolfram word = ""; HTMLView[word] ``` and then ```wolfram word = "<h1>"<>RandomWord[]<>"</h1>"; ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputAutocomplete ```wolfram InputAutocomplete[autocompleteFunction_, opts___] _EventObject ``` ```wolfram InputAutocomplete[autocompleteFunction_, default_String, opts___] _EventObject ``` renders an input field ([InputText](../GUI/InputText)) with autocomplete generated by `autocompleteFunction`. This handler function should have the following structure ```wolfram autocompleteFunction[input_String, callBack_] := With[{}, ... callBack[results] ]; ``` where `results` is a sorted `List` of strings. `cbk` may return `False` to cancel autocompletion Options [#options] "Label" [#label] A text-label for the widget "ClearOnSubmit" [#clearonsubmit] Keeps or clears out the input field when a users submitted the result. By the default is `True`. Event generation [#event-generation] It fires two patterns * `"Entered"` gives a string, which was entered by a user * `"Selected"` gives a string, which was picked up by a user from the list, generated by `autocompleteFunction` Example [#example] Find words starting with a given letters and speak them ```wolfram EventHandler[InputAutocomplete[Function[{data, cbk}, cbk[DictionaryLookup[data<>"*", 6]]; ], "ClearOnSubmit"->False], Function[text, SpeechSynthesize[text, GeneratedAssetLocation -> None] // EmitSound ]] ``` Here we use a wild-card pattern, which does not differentiate between `Entered` and `Selected` there. # InputButton ```wolfram InputButton[label_String, opts___] _EventObject ``` creates a button component and returns [`EventObject`](../Misc/Events) Event generation [#event-generation] On-click emits `True` to a handler function assigned Options [#options] "Class" [#class] A text string of CSS classes used for customizing a button "Style" [#style] A text string with CSS styles applied to an element "Topic" [#topic] The default topic/pattern is `"Default"`. Specifies an event-pattern used on emitting (see more on [`EventFire`](../Misc/Events) patterns topics) Application [#application] A basic GUI element ```wolfram button = InputButton["Click me!"]; EventHandler[button, Print] ``` or click to make sound ```wolfram EventHandler[InputButton[], Beep] ``` Chaining events [#chaining-events] One can reuse another event when creating a button ```wolfram InputButton[event_EventObject, label_String, opts___] ``` for example ```wolfram ev = EventObject[]; InputButton[ev, "Topic"->"Button"] InputRange[ev, 0,1,0.1, "Topic"->"Slider"] EventHandler[ev, { "Button" -> Beep, "Slider" -> Print }]; ``` Possible issues [#possible-issues] Grouping two buttons using [InputGroup](../GUI/InputGroup) ```wolfram group = InputGroup[{ InputButton[], InputButton[] }] EventHandler[group, Print]; ``` You **will always see** `{True, True}`. This is because buttons are stateless, and [InputGroup](../GUI/InputGroup) records the last state of each. There are different ways to differentiate between them Option 1A [#option-1a] By patterns ```wolfram group = InputGroup[{ InputButton["Topic"->"A"], InputButton["Topic"->"B"] }] EventHandler[group, { topic_ :> Function[Null, Print[topic]] }]; ``` Option 1B [#option-1b] Using custom wrapper and separate by patterns ```wolfram ev = EventObject[]; { InputButton[ev, "Topic"->"A"], InputButton[ev, "Topic"->"B"] }// Column // Panel EventHandler[ev, { any_ :> Function[Null, Print[any]] }]; ``` Option 2 [#option-2] Connect separately ```wolfram { b1 = InputButton[], b2 = InputButton[] }// Column // Panel EventHandler[b1, (Print["A"])&]; EventHandler[b2, (Print["B"])&]; ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputCheckbox ```wolfram InputCheckbox[initial_Boolean:False, opts___] _EventObject ``` represents a UI element - checkbox or a toggle switch Event generation [#event-generation] Emits `True` or `False` based on its state Options [#options] "Label" [#label] A text label for an element "Description" [#description] A description label for an element "Topic" [#topic] The default topic/pattern is `"Default"`. Specifies an event-pattern used on emitting (see more on [`EventFire`](../Misc/Events) patterns topics) Application [#application] A basic GUI element ```wolfram tg = InputCheckbox[False]; EventHandler[tg, Print] ``` Chaining events [#chaining-events] One can reuse another event ```wolfram InputCheckbox[event_EventObject, rest__] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputEditor a wrapper over [EditorView](../GUI/EditorView) used for making input elements ```wolfram InputEditor[expr_String] _EventObject ``` as a result it returns [`EventObject`](../Misc/Events) Event generation [#event-generation] It fires the following patterns/topics "Input" [#input] Fires every time users changes the content with a content as a payload "Evaluate" [#evaluate] Fires when a user presses a combination `Shift+Enter` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputFile ```wolfram InputFile[opts___] _EventObject ``` outputs as a drag & drop file-form used to handle file input Options [#options] "Label" [#label] A text label for an element "Description" [#description] A description label for an element Event generation [#event-generation] It accepts single or multiple files. The whole pipeline is separated into two steps 1. Initiation of a transaction. Emits an event with a topic `"Transaction"`, which has the following structure ```wolfram <|"Id"->uid_String, "Length"->numberOfFiles_Integer|> ``` 2. Sending files one by one files emitting `"File"` event that follows the structure ```wolfram <|"Transaction"->uid_String, "Name"->filename_String, "Data"->base64_String|> ``` Chaining events [#chaining-events] One can reuse another event ```wolfram InputFile[event_EventObject, rest__] ``` Example [#example] A simple file-form to plot the data from the uploaded file ```wolfram plot = Plotly[<|"type"->"line"|>] EventHandler[InputFile[], {"File" -> Function[file, Module[{}, imported = Drop[ImportByteArray[file["Data"]//BaseDecode, "CSV"], 3]; (* try different encoding *) If[!NumberQ[imported[[1,1]]], imported = Drop[ImportByteArray[file["Data"]//BaseDecode, "TSV"], 3]]; Plotly`addTraces[plot, {<|"x" -> imported[[All,1]], "y" -> imported[[All,2]]|>}]; ] ]}] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputGroup ```wolfram InputGroup[events_List | _Association, opts___] _EventObject ``` groups different [event-generators](frontend/Advanced/Events%20system/event-generators) such as [InputRange](../GUI/InputRange), [InputButton](../GUI/InputButton) or in general [`EventObject`](../Misc/Events) into a new `EventObject` Please consider to read the full guide [event-generators](frontend/Advanced/Events%20system/event-generators) Options [#options] "Label" [#label] A text label for an element "Description" [#description] A description label for an element "Layout" [#layout] By the default is `"Vertical"`. Possible values: * `"Horisontal"` * `"Vertical"` Event generation [#event-generation] Every-time user acts on an inner event-view from a group `events`, it will fire an event and send the data from all event objects keeping the original structure Association [#association] ```wolfram group = InputGroup[<| "left"->InputRange[0, 10, 1, "Label"->"Range 1"], "right"->InputRange[0, 10, 1, "Label"->"Range 2"] |>] EventHandler[group, Print]; ``` On each update it generates the data for the handler function in a form ```wolfram <|"left"->5, "right"->7|> ``` Arrays [#arrays] ```wolfram group = InputGroup[{ InputRange[0, 10, 1, "Label"->"Range 1"], InputRange[0, 10, 1, "Label"->"Range 2"], InputText["Hi"] }] EventHandler[group, Print]; ``` the data provided to a handler function `Print` will look like ```wolfram {5, 7, "Hi"} ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputJoystick ```wolfram InputJoystick[] _EventObject ``` creates and instance of 2D manipulator (virtual joystick) Event generation [#event-generation] It fires an event with `{x_, y_}` coordinates of a joystick in a range of `[-1,1]` once it has been dragged by a user. Helpers [#helpers] There is helper function to integrate the position, that joystick controls velocity instead of absolute position ```wolfram InputJoystick`IntegrationHelper[initialValue_:{0,0}, delta_:0.01][callback_Function] _Function ``` for example ```wolfram title="cell 1" pt = {0.,0.}; handler = InputJoystick`IntegrationHelper[][Function[xy, pt = xy ]]; EventHandler[InputJoystick[], handler] ``` ```wolfram title="cell 2" Graphics[ {Red, PointSize[0.05], Point[pt // Offload]} , PlotRange->{{-1,1}, {-1,1}} ] ``` Chaining events [#chaining-events] One can reuse another event ```wolfram InputJoystick[event_EventObject, rest___] ``` Options [#options] No options are available Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputRadio The same as [InputSelect](../GUI/InputSelect), but displays radio-like buttons. Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputRange ```wolfram InputRange[min_, max_, step_:1, initial_:(min+max)/2, opts___] _EventObject ``` creates a basic combo of a slider and numerical input field and returns [`EventObject`](../Misc/Events) Event generation [#event-generation] Every-time user drags a slider, an event **in a form of number** will be generated ```wolfram slider = InputRange[0,1,0.1]; EventHandler[slider, Function[data, Print[StringTemplate["`` is a number"][data]] ]]; slider ``` On MacOS devices it provides a haptic feedback when dragged Options [#options] "Label" [#label] Adds a label to a slider ```wolfram slider = InputRange[0, 1, 0.1, "Label"->"Slider"] ``` "Topic" [#topic] Specifies which topic or pattern of an event is used ```wolfram "Topic" -> name_String ``` emits `name` for each time when user drags a slider ```wolfram "Topic" -> {oninput_String, onchange_String} ``` emits `oninput` when any changes occur, while `onchange` is **emitted after** the users action. `Null` value will suppress event generation, i.e. to make `onchange` only slider ```wolfram "Topic" -> {Null, "Default"} ``` "TrackedExpression" [#trackedexpression] Adds expression to track (usually a symbol) and update the slider position ```wolfram var = 0.3; EventHandler[InputRange[0,2,0.1, var, "TrackedExpression"->Offload[var], Print] ``` Now you can overwrite slider position by setting ```wolfram var = 0.6; ``` Your slider effectively acquires an initialization value because of tracked expression Debouncing [#debouncing] To prevent an event propagation, when a tracked symbol is updated use ```wolfram "TrackedExpression"->{Offload[var], "Debounce"} ``` then you can safely write ``` var = 0.3; EventHandler[InputRange[0,2,0.1, var, "TrackedExpression"->{Offload[var], "Debounce"}], Function[newValue, var = newValue ]] ``` Then InputRange *will remember its state* Appearance [#appearance] By the default is `Automatic`. Possible value: `"FineTuning"` - adds a fine control element to vary the range value $\pm 10\%$. Chaining events [#chaining-events] One can reuse another event for a new element ```wolfram InputRange[event_EventObject, min_, max_, step_:1, initial_:(min+max)/2, opts___] ``` for example ```wolfram ev = EventObject[]; InputButton[ev, "Topic"->"Button"] InputRange[ev, 0,1,0.1, "Topic"->"Slider"] EventHandler[ev, { "Button" -> Beep, "Slider" -> Print }]; ``` Applications [#applications] Control properties using knob ```wolfram EventHandler[InputRange[0,1,0.1], Function[data, pos = data]]; % % // EventFire; Graphics[Rectangle[{-1,0}, {1, Offload[pos]}]] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputRaster provides a free-drawing 2D input ```wolfram InputRaster[opts___] _EventObject ``` provides a free-drawing over an image ```wolfram InputRaster[img_Image, opts___] _EventObject ``` Event generation [#event-generation] Fires a single event on any changes on canvas with [Image](../Image/Image) as a payload. For example ```wolfram bufferImage = ImageData[ConstantImage[{0,0,0,0}, {350,350}], "Byte"]; EventHandler[InputRaster[ImageSize->{350,350}], Function[img, bufferImage = ImageData[img, "Byte"]; ]] Image[bufferImage // Offload, "Byte"] ``` Chaining events [#chaining-events] One can reuse another event ```wolfram InputRaster[event_EventObject, rest__] ``` Options [#options] ImageSize [#imagesize] If no image or overlay image is provided, one can specify a size for blank canvas. By the default is `300` "OverlayImage" [#overlayimage] Places a semitransparent image over the canvas. It comes handy when working with masks for images "Topic" [#topic] Specifies which topic (or pattern) of an event is used. By the default is `"Default"` "AllowUpdateWhileDrawing" [#allowupdatewhiledrawing] By the default is `False`. Sends new image on every change. # InputSelect ```wolfram InputSelect[{expr1_ -> name1_String, expr2_ -> name2_String}, defaultExpr_] _EventObject ``` represents a select field with different choices or ```wolfram InputSelect[{val1_, val2_}, defaultval_] _EventObject ``` is also valid Event generation [#event-generation] Emits corresponding `expr` based on user's choice. Options [#options] "Label" [#label] Adds a label "Topic" [#topic] Specifies which topic or pattern of an event is used Chaining events [#chaining-events] One can reuse another event ```wolfram InputSelect[event_EventObject, rest__] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputTerminal ```wolfram InputTerminal[opts___] _EventObject ``` creates a minimal interactive terminal, which can capture user inputs and used for streaming data as well. **Based on [ttty project](https://github.com/mkrl/ttty)** Event generation [#event-generation] The following patters are emitted * `"Command"` * `"Interrupt"` (caused by Ctrl+C) Backprogapation [#backprogapation] Any event handling function output can be used to output the data back to the terminal, i.e. a simple echo handler can be constructed as follows: ```wolfram t = InputTerminal[] EventHandler[t, {"Command" -> Function[c, c]}] ``` The returned value of `Function[c, ...]` can be: * `_String` * `{__String}` list of string * `_Promise` a promise that resolves into strings * `{__Promise}` list of promises * anything else will not be printed to the terminal Options [#options] ImageSize [#imagesize] Sets the size of a terminal in pixels. Must be a number or a pair of numbers Streaming [#streaming] The generated `EventObject` contains two input streams: * `t["StandardOutput"]` a writable stream for basic output * `t["StandardError"]` a writable stream for errors For example ```wolfram t = InputTerminal[] ``` ```wolfram WriteString[t["StandardOutput"], "Hi There!"]; ``` Another example: you can redirect the output of all warnings to the terminal using: ```wolfram $Messages = {t["StandardError"]}; ``` and then try ```wolfram 1/0 ``` Output forms [#output-forms] The same as any [`EventObject`](../Misc/Events) * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # InputText ```wolfram InputText[initial_String, opts___] _EventObject ``` represents an input-text field and returns [`EventObject`](../Misc/Events) For dynamic read-only indication use [TextView](../GUI/TextView) Event generation [#event-generation] Every-time user changes the content, an event **in a form of string** will be generated ```wolfram "<current string>" ``` Options [#options] "Label" [#label] adds a label at the left side to the input text field "Placeholder" [#placeholder] Text placeholder "Description" [#description] adds description field to a widget ImageSize [#imagesize] sets the width in pixels "Topic" [#topic] Specifies which topic or pattern of an event is used ```wolfram "Topic" -> name_String ``` emits `name` for each time when user types ```wolfram "Topic" -> {oninput_String, onchange_String} ``` emits `oninput` when any changes occur, while `onchange` is **emitted after** the users leaves the field Example [#example] A simple text input ```wolfram text = InputText["Hi"] EventHandler[text, Print]; ``` Chaining events [#chaining-events] One can reuse another event ```wolfram InputText[event_EventObject, rest__] ``` Dev notes [#dev-notes] This is a wrapper for [TextView](../GUI/TextView) view-component Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # ListAnimate ```wolfram ListAnimate[seq_List, fps_:20] ``` animates the list of expressiions `seq` with `fps` frames per second (at best) For example: ```wolfram ListAnimate[Table[Plot[Sin[n x], {x, 0, 10}], {n, 5}], 10] ``` ```wolfram ListAnimate[Table[Graphics[Disk[{0,0}, RandomReal[100]]], {50}]] ``` Note, that `ListAnimate` is effectively wrapper over a more general symbol [Animate](./Animate) # MMAView ```wolfram MMAView[head_[args__]] ``` ```wolfram MMAView[_Animate] ``` ```wolfram MMAView[_Manipulate] ``` ```wolfram MMAView[_Graphics3D] ``` attempts to use Mathematica's frontend (technically backend) to render given expression to a raster [Image](../Image/Image) and return it back. Note: `MMAView` has `HoldFirst` attribute Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use `MMAViewAsync` instead. WLJS Notebook does not support all possible styling and diagram types compared to Wolfram Mathematica. Here we give a user a workaround, which might be suitable for some cases. For example ``` Plot3D[(*SpB[*)Power[x(*|*),(*|*)2](*]SpB*) (*SpB[*)Power[y(*|*),(*|*)2](*]SpB*), {x,0,1}, {y,0,1}] // MMAView ``` Graphics3D [#graphics3d] We have a special wrapper for [Graphics3D](../Graphics3D/Graphics3D) -like plots to make them interactive in the session ```wolfram With[{p = Plot3D[x^2 y, {x,0,10}, {y,0,10}]}, MMAView[p] ] ``` Note, that it is important to pass it using `With`, since `MMAView` has `HoldFirst` attribute. Otherwise the direct pass will give your a static plot How to force static view [#how-to-force-static-view] One can bypass `UpValue` for `Graphics3D` by ```wolfram With[{p = Plot3D[x^2 y, {x,0,10}, {y,0,10}]}, MMAView[p // Rasterize] ] ``` Interactive 3D view cannot be exported to any portable format Manipulate [#manipulate] There is a similar wrapper for [Manipulate](../GUI/Manipulate) ```wolfram Manipulate[Plot[Sin[x y], {x,0,1}], {y,0,5}] // MMAView ``` It literally streams uncompressed raster images in real-time. Please do not overuse it. If it detect `Graphics3D` inside `Manipulate` it also provides mouse controls over it ```wolfram Manipulate[Plot3D[Sin[n x] Cos[n y], {x,-1,1}, {y,-1,1}], {n, 1, 5, 1}] // MMAView ``` Animate [#animate] The same as before but for [Animate](../GUI/Animate) ```wolfram Animate[Plot[Sin[x y], {x,0,1}], {y,0,5}] // MMAView ``` # Manipulate ```wolfram Manipulate[expr_, {u_Symbol, min_, max_}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol, initial_}, min_, max_}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol, initial_}, min_, max_, step_}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol, initial_, label_String}, min_, max_, step_}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol}, values_List}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol, initial_}, values_List}..] ``` ```wolfram Manipulate[expr_, {{u_Symbol, initial_, label_String}, values_List}..] ``` generates a version of `expr` with controls added to allow interactive reevaluation. `Manipulate` can be used on any Wolfram expression. Graphics or images passed as `expr` or part of it will be automatically optimized using <abbr title="Just In Time">JIT</abbr> transpiler if possible. This provides an immediate mode for a user to construct interactive widgets. By its nature, all interactivity in WLJS Notebooks is implemented in retained mode, while `Manipulate` is a wrapper over low-level building blocks such as [Offload](../Interpreter/Offload), [InputRange](../GUI/InputRange), etc., with a diff algorithm used to optimize evaluation of changes. For frequently changing data or complex visuals, we still recommend using these low-level building blocks. Consider also [ManipulatePlot](../Plotting-Functions/ManipulatePlot) and [ManipulateParametricPlot](../Plotting-Functions/ManipulateParametricPlot) for basic interactive curve plotting. Examples [#examples] Here is a basic example involving symbolics: ```wolfram Manipulate[Series[Sinc[x], {x, 0, n}], {n, 1, 5, 1}] ``` Here are a few examples with [Plot](../Plotting-Functions/Plot) expressions that effectively use JIT: ```wolfram Manipulate[ Plot[Sin[a x + b], {x, 0, 6}], {{a, 2, "Multiplier"}, 1, 4}, {{b, 0, "Phase Parameter"}, 0, 10}, ContinuousAction->True] ``` ```wolfram Manipulate[Plot[1.0 + Sin[w] Sin[x + w],{x,0,5Pi}, Epilog->{ Red, Point[{8.0, 1.0 + Sin[w] Sin[8.0 + w]}] }], {w,0,Pi}, ContinuousAction->True] ``` Another example that solves an ODE on the fly: ```wolfram Manipulate[ Plot[Evaluate[ y[t] /. First[ NDSolve[ {y''[x] == -x y[x], y[0] == a, y'[0] == b}, y, {x, 0, 4}]]], {t, 0, 4}, Epilog -> {Point[{4, 1/2}], Green, Arrow[{{0, a}, {1, b + a}}], Red, Point[{0, a}]}, PlotRange -> 3], {{a, 1}, -3, 3}, {{b, 0}, -3, 3}] ``` 3D plot example: ```wolfram Manipulate[Plot3D[Sin[n x] Cos[n y], {x,-1,1}, {y,-1,1}], {n, 1, 5, 0.3}, ContinuousAction->True] ``` Images: ```wolfram img = ImageResize[ExampleData[ExampleData["TestImage"] // Last], 350]; Manipulate[ ImageAdjust[img, {c,a}], {{c, 0},0,5,0.1}, {{a, 0},0,5,0.1}, ContinuousAction->True ] ``` Here is an example with mixed symbolics and graphics: ``` Manipulate[ Row[{ "m", "==", MatrixForm[m], StreamPlot[Evaluate[m . {x, y}], {x, -1, 1}, {y, -1, 1}, StreamScale -> Large, ImageSize -> Small ] }], {{m, ((*GB[*){{1(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)2}}(*]GB*))}, { ((*GB[*){{1(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)2}}(*]GB*)) -> "Nodal source", ((*GB[*){{1(*|*),(*|*)1}(*||*),(*||*){0(*|*),(*|*)1}}(*]GB*)) -> "Degenerate source", ((*GB[*){{0(*|*),(*|*)1}(*||*),(*||*){-1(*|*),(*|*)1}}(*]GB*)) -> "Spiral source", ((*GB[*){{-1(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)-2}}(*]GB*)) -> "Nodal sink", ((*GB[*){{-1(*|*),(*|*)1}(*||*),(*||*){0(*|*),(*|*)-1}}(*]GB*)) -> "Degenerate sink", ((*GB[*){{0(*|*),(*|*)1}(*||*),(*||*){-1(*|*),(*|*)-1}}(*]GB*)) -> "Spiral sink", ((*GB[*){{0(*|*),(*|*)1}(*||*),(*||*){-1(*|*),(*|*)0}}(*]GB*)) -> "Center", ((*GB[*){{1(*|*),(*|*)0}(*||*),(*||*){0(*|*),(*|*)-2}}(*]GB*)) -> "Saddle"}}] ``` Options [#options] ContinuousAction [#continuousaction] By default, this is `False`, which means that any update happens after the user's action, not before. "ControlsLayout" [#controlslayout] By default, this is `"Vertical"`. Another possible value is `"Horizontal"`. PerformanceGoal [#performancegoal] By default, this is `"Speed"`, which involves the [JIT Transpiler](#JIT%20Transpiler). Change it to any other value to disable it completely. "JITFeature" [#jitfeature] By default, this is `True`, which involves the [JIT Transpiler](#JIT%20Transpiler). If either `PerformanceGoal` or `"JITFeature"` is set to a non-default value, the JIT transpiler will be disabled. Appearance [#appearance] By default, this is `"Default"`. Set it to `None` to remove the frame and info boxes. "UpdateFunction" [#updatefunction] Allows to alter the expression, prevent default actions or cause side-effects upon update. The following return values are expected ```wolfram Function[input, (* side effects *) (* RETURN *) True <- accept change False <- prevent default _String <- will be written instead ] ``` One can completely bypass the default reevaluation and use side-effects only ```wolfram Module[{r}, Manipulate[Graphics[Disk[{0,0}, r//Offload]], {{radius, 1}, 0,1}, "UpdateFunction" -> Function[value, r = value; False (* always reject *) ] ] ] ``` However, *we do recommend to use* [InputRange](../GUI/InputRange) directly instead of `Manipulate` for such cases. JIT Transpiler [#jit-transpiler] `Manipulate`, as well as [Animate](../GUI/Animate), uses a diff algorithm that detects and tries to convert manipulated expressions to more optimized ones that utilize granular updates. If the diff algorithm fails, it will use full reevaluation and update the shown expression accordingly. Our transpiler does not cover all symbols and is limited to the following for now: * `Line`, `Point`, `Polygon`, `Tube`, `Arrow`, `Disk`, `Circle`, `Sphere`, `Cuboid`, `Rectangle`, `Text` * `GraphicsComplex` in the context of `Graphics3D` * `Image`, `Raster` * `PlotLabel` in the context of `Graphics` * `LineLegend`, `PointLegend`, `SwatchLegend` which is a good subset to cover the output produced by `Plot`, `Plot3D` and many others standard functions. What will not be supported in the near future: * `PlotRange` mutations are ignored * `Texture` is not supported * adding/removing `Line`, `Point` and etc primitives at runtime leads to deoptimization * changing color or opacity **leads to full reevaluation** Tips for better performance [#tips-for-better-performance] If you still want to use `Manipulate` on some complex expressions, there are some tricks to avoid JIT engine failures: * Try to keep the number of curves/traces/polygons expressions the same if possible. Try not to add new entities to your graphs. * `PerformanceGoal->"Speed"` is also a good option for 3D plots. * `Mesh->None` might also help. * `PlotRange->Full` or set it manually, it can help to avoid fragmentation of line segments * Avoid changing colors, opacity Debugging [#debugging] To see the latest message of JIT failure - evaluate the symbol: ```wolfram CoffeeLiqueur`Extensions`Manipulate`Diff`$lastJITFailure ``` Portability [#portability] Same as for [Animate](../GUI/Animate), `Manipulate` widgets can be shared as [MDX](./../Share/Markdown-React) or [HTML](./../Share/Standalone-HTML) in automatic mode. Keep the number of possible states determined by all your sliders and selection boxes **below 500-600**. MMAView [#mmaview] [MMAView](../GUI/MMAView) wrapper allows to use **native Wolfram Engine rendering engine** for manipulated expressions. It uses a parallel kernel to rasterize the provided expression and stream updates to the frontend. ```wolfram Manipulate[Plot3D[Sin[n x] Cos[n y], {x,-1,1}, {y,-1,1}], {n, 1, 5, 1}] // MMAView ``` It literally streams uncompressed raster images in real-time. Please **do not overuse it** Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Monitor ```wolfram Monitor[expr_, mon_] ``` generates a temporary monitor cell in which the continually updated current value of `mon` is displayed during the course of evaluation of `expr`. Examples [#examples] Monitor `NIntegrate`, with steps along the axis and evaluation points on the `y` axis: ```wolfram values = {}; Monitor[NIntegrate[Sqrt[x (1 - x)], {x, 0, 1}, EvaluationMonitor :> (Pause[0.025]; AppendTo[values, x];)], Quiet@ListPlot[values]] ``` Steps in parameter space for a nonlinear fit: ```wolfram ClearAll[data, model, lp]; data = {{0.18, -0.13}, {0.84, -0.06}, {0.05, 0.88}, {0.24, -0.63}, {0.67, 0.93}, {0.05, 0.88}, {0.65, 0.92}, {0.01, 0.99}, {0.17, -0.04}, {0.23, -0.55}}; lp = ListPlot[data, PlotRange -> All]; model[{a_, k_, w_, p_}][x_] = a Exp[-k x] Sin[w x + p]; ``` ```wolfram Module[{vars = {a, k, w, p}}, Monitor[FindFit[data, model[vars][x], vars, x, StepMonitor :> Pause[0.3]], Show[Plot[model[vars][x], {x, 0, 1}, PlotRange -> {-2, 2}], lp]]] ``` # OpenerView ```wolfram OpenerView[{exprSummary_, expr_}, state_:False] ``` represent a disclosure widget in which `expr` is visible only when the widget is toggled into an open state. A summary or label is represented as `exprSummary`. For example: ```wolfram OpenerView[{"Show me a plot", Plot[x, {x,0,1}]}] ``` Output forms [#output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # ProgressIndicator ```wolfram ProgressIndicator[x] ProgressIndicator[x, {min, max}] ``` represents an active indicator used for reporting the progress. When ranges are not specified, it is assumed to be from 0 to 1. Transitions and updates [#transitions-and-updates] First argument `x` can be dynamic symbols or expression. Use [Offload](../Interpreter/Offload) to dynamically update the indicator, i.e. ```wolfram x = 0.2; ProgressIndicator[Offload[x], {0,10}] ``` then in the next cell ```wolfram Do[x++; Pause[0.2];, {5}]; ``` or as a button ```wolfram Button["Increase", x++] ``` Output forms [#output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Refresh Implementation differs from Wolfram Standard Library ```wolfram Refresh[expr_, interval_] ``` produces a dynamic window with `expr` reevaluated each interval of time specified **in seconds** or in `Quantity` ```wolfram Refresh[expr_, trigger_EventObject | trigger_String] ``` produces a dynamic window with `expr` reevaluated by `trigger` event (see [Events](../Misc/Events)). `Referesh` has `HoldFirst` attribute. Unlike [Animate](../GUI/Animate), `Refresh` will throttle the refresh rate if the CPU time takes more than provided interval. Example [#example] ```wolfram Refresh[Now // TextString, 1] ``` or even for decorated symbols ```wolfram Refresh[Now, 1] ``` JIT Features [#jit-features] `Refresh` expression uses the same runtime optimization features as [Manipulate](../GUI/Manipulate) and [Animate](../GUI/Animate), which can benefit some cases and prevent full reevaluation. For example: ```wolfram Refresh[RandomImage[], 0.2] ``` or ```wolfram Refresh[ListLinePlot[RandomReal[{-1,1}, 100]], 0.2] ``` Be careful with `Plot` or any other functions placed as `expr` with a fast refresh rate (\< 1 second). It might cause a significant load to the system in some cases if JIT optimizations were not successful. Test it on longer update times beforehand. Consider to use [Offload](../Interpreter/Offload) for rapidly changing data [AnimatePlot](./../Plotting-Functions/AnimatePlot) or [PlotlyExtendTraces](../Plotly/PlotlyExtendTraces). # Slider This is not and will not be supported. Please, use [InputRange](../GUI/InputRange) # TableView ```wolfram TableView[{{1, 2, 3}, {4, 5, 6}}] ``` ```wolfram TableView[RandomReal[1, {5, 4}]] ``` ```wolfram TableView[Table[i + j, {i, 3}, {j, 4}]] ``` presents the provided data in a table form including: * lazy-loading and pagination * supports boolean, numerical and arbitrary expressions Use `TableForm` on large tables # TeXView ```wolfram TeXView[expr_String] ``` renders `expr` as LaTeX expression to the screen ```wolfram TeXView[expr_] ``` converts arbitrary expression `expr` using [TeXForm](./../Formatting/TeXForm) and then renders it. For example: ```wolfram TeXView[1/2] ``` or directly using LaTeX: ```wolfram TeXView["\\frac{1}{2}"] ``` It works on slides, markdown and in a normal Wolfram output cells. Output forms [#output-forms] * [StandardForm](./../Formatting/StandardForm) * [WLXForm](./../Formatting/WLXForm) # TextView ```wolfram TextView[string_String, opts___] ``` represents a text field used for displaying dynamic data Options [#options] "Event" [#event] **If specified** it acts like an [InputText](../GUI/InputText). "Description" [#description] adds description label "Placeholder" [#placeholder] adds placeholder of the given `string` is empty ImageSize [#imagesize] sets the width in pixels "Label" [#label] adds a label at the left side to the text field Appearance [#appearance] by the default is `Automatic`. By setting to any other value it will remove borders and other styling Application [#application] Dynamic indication [#dynamic-indication] There are various of applications. For example to display the current coordinates on a graph ```wolfram pointer = {0.,0.} // ToString; Plot[Sinc[x], {x,-10,10}, Prolog->{ White, EventHandler[Rectangle[{-10,-10}, {10,10}], {"mousemove" -> Function[xy, pointer = xy // ToString]}] }] TextView[pointer // Offload] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # CityData `CityData["name", "property"]` gives the value of the specified property for the city with the specified name. `CityData["name"]` gives a list of the full specifications of cities whose names are consistent with name. Examples [#examples] Get the population of a city: ```wolfram CityData["New York", "Population"] (* 8336817 *) ``` Get the coordinates: ```wolfram CityData["Paris", "Coordinates"] (* GeoPosition[{48.8567, 2.3508}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CityData.html) for more details. # EntityClass `EntityClass[type, name]` represents a class of entities of the specified type identified by name. `EntityClass[type, {property1 -> vspec1, ...}]` represents an implicitly defined entity class containing entities for which properties conform to value specifications. Examples [#examples] Named entity class: ```wolfram EntityClass["Country", "G20"] ``` Filtered entity class: ```wolfram EntityClass["Country", "Population" -> GreaterThan[Quantity[100, "Millions"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EntityClass.html) for more details. # EntityClassList `EntityClassList["type"]` gives a list of entity classes for the specified type of entity. Examples [#examples] Get all country entity classes: ```wolfram EntityClassList["Country"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EntityClassList.html) for more details. # EntityProperty `EntityProperty[type, pname]` represents a property identified by pname for use in EntityValue. `EntityProperty[class, pname]` represents a property introduced by the computed entity class class. `EntityProperty[type, pname, {qual1->val1, qual2->val2, …}]` represents a property modified by the qualifier rules quali->vali. Examples [#examples] Get a property of a country: ```wolfram EntityValue[Entity["Country", "France"], EntityProperty["Country", "Population"]] ``` Use a qualified property: ```wolfram EntityProperty["Country", "Population", {"Date" -> 2020}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EntityProperty.html) for more details. # EntityPropertyClass `EntityPropertyClass[type,pcname]` represents a class of properties identified by the name pcname. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EntityPropertyClass.html) for more details. # EntityValue `EntityValue[entity, property]` gets the value of a property for an entity. Can query multiple entities or properties at once. Examples [#examples] Query entity properties: ```wolfram EntityValue[Entity["Country", "Japan"], "Population"] (* Quantity[1.258*10^8, "People"] *) (* Multiple properties *) EntityValue[Entity["Country", "Germany"], {"Capital", "Area"}] (* Multiple entities *) EntityValue[{Entity["Planet", "Earth"], Entity["Planet", "Mars"]}, "Radius"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EntityValue.html) for more details. # FindGeoLocation `FindGeoLocation[]` attempts to find the current geo location of your computer. * `FindGeoLocation["ip"]` gives an estimate of the geo location associated with the IP address given. * `FindGeoLocation["address"]` attempts to find the geo location associated with the street address given. * `FindGeoLocation[entity]` gives the geo location associated with the specified entity. Examples [#examples] ```wolfram (* Get current location *) FindGeoLocation[] (* Find location from address *) FindGeoLocation["1600 Pennsylvania Ave, Washington DC"] (* Find location from IP *) FindGeoLocation["8.8.8.8"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGeoLocation.html) for more details. # FromDMS `FromDMS[{d, m, s}]` converts from degrees, minutes, and seconds to decimal degrees. * `FromDMS["dms"]` converts from a DMS string to decimal degrees. * `FromDMS["latlon"]` converts from a latitude-longitude string to latitude and longitude in decimal degrees. Examples [#examples] Convert degrees, minutes, seconds to decimal: ```wolfram FromDMS[{40, 26, 46}] ``` Convert a DMS string: ```wolfram FromDMS["40°26'46\"N"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromDMS.html) for more details. # GeoArea `GeoArea[g]` gives the area of the geo region `g`. Examples [#examples] ```wolfram GeoArea[Entity["Country", "France"]] ``` ```wolfram GeoArea[GeoDisk[Here, Quantity[100, "Kilometers"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoArea.html) for more details. # GeoBoundary `GeoBoundary[g]` returns the boundary line of the geo region `g`. Examples [#examples] ```wolfram GeoBoundary[Entity["Country", "Germany"]] ``` ```wolfram GeoGraphics[GeoBoundary[Entity["AdministrativeDivision", {"California", "UnitedStates"}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoBoundary.html) for more details. # GeoBounds `GeoBounds[g]` gives the ranges of latitudes and longitudes in the geo region g. `GeoBounds[g, δ]` pads ranges of latitudes and longitudes by ±δ. `GeoBounds[g, Scaled[s]]` pads range of latitudes and longitudes by a scaled amount s. Examples [#examples] Get bounds of a country: ```wolfram GeoBounds[Entity["Country", "France"]] (* {{41.3, 51.1}, {-5.14, 9.56}} *) ``` Pad the bounds: ```wolfram GeoBounds[Entity["Country", "France"], Quantity[1, "Degrees"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoBounds.html) for more details. # GeoCircle `GeoCircle[loc, r]` is a two-dimensional `GeoGraphics` primitive that represents a circle of radius `r` centered at the location `loc` on the surface of the Earth. * `GeoCircle[loc, r, {α1, α2}]` represents a sector of a circle from bearing `α1` to bearing `α2`. Examples [#examples] ```wolfram GeoGraphics[GeoCircle[Entity["City", {"Paris", "IleDeFrance", "France"}], Quantity[100, "Kilometers"]]] ``` ```wolfram GeoGraphics[GeoCircle[Here, Quantity[50, "Miles"], {0, 90}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoCircle.html) for more details. # GeoDisk `GeoDisk[loc, r]` is a two-dimensional `GeoGraphics` primitive that represents a filled disk of radius `r` centered at the location `loc` on the surface of the Earth. * `GeoDisk[loc, r, {α1, α2}]` gives a sector of a disk from bearing `α1` to bearing `α2`. Examples [#examples] ```wolfram GeoGraphics[GeoDisk[Entity["City", {"Tokyo", "Tokyo", "Japan"}], Quantity[200, "Kilometers"]]] ``` ```wolfram GeoGraphics[GeoDisk[Here, Quantity[100, "Miles"], {0, 180}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoDisk.html) for more details. # GeoDisplacement `GeoDisplacement[{dist, α}]` represents a geodesic displacement of length `dist` and initial bearing `α` from a geo location. * `GeoDisplacement[{dist, α}, pathtype]` represents a displacement of length `dist` and initial bearing `α` along a path of type `pathtype`. * `GeoDisplacement[loc1, loc2, pathtype]` returns the displacement needed to reach `loc2` from `loc1` along a path of type `pathtype`. Examples [#examples] ```wolfram GeoDisplacement[{Quantity[100, "Kilometers"], 45 Degree}] ``` ```wolfram GeoGraphics[{Here, GeoDisplacement[{Quantity[500, "Miles"], 0}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoDisplacement.html) for more details. # GeoDistance `GeoDistance[{lat1, lon1}, {lat2, lon2}]` gives the geodesic distance between latitude-longitude positions on the Earth. * `GeoDistance[loc1, loc2]` gives the distance between locations specified by position objects or geographical entities. * `GeoDistance[{loc1, …, locn}]` gives the total distance from `loc1` to `locn` through all the intermediate `loci`. Examples [#examples] ```wolfram GeoDistance[{40.7, -74.0}, {51.5, -0.1}] ``` ```wolfram GeoDistance[Entity["City", {"NewYork", "NewYork", "UnitedStates"}], Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoDistance.html) for more details. # GeoDistanceList `GeoDistanceList[{loc1, loc2, …, locn}]` returns the list of geodesic distances between consecutive pairs of locations. Examples [#examples] ```wolfram GeoDistanceList[{ Entity["City", {"NewYork", "NewYork", "UnitedStates"}], Entity["City", {"Chicago", "Illinois", "UnitedStates"}], Entity["City", {"LosAngeles", "California", "UnitedStates"}] }] ``` ```wolfram GeoDistanceList[{GeoPosition[{40.7, -74.0}], GeoPosition[{34.0, -118.2}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoDistanceList.html) for more details. # GeoElevationData `GeoElevationData[]` gives the elevation above sea level at `$GeoLocation`. * `GeoElevationData[loc]` gives the elevation at the geographic location `loc`. * `GeoElevationData[{loc1, loc2}]` gives an array of elevation values within the bounding box given by `{loc1, loc2}`. * `GeoElevationData[GeoPosition[{{lat1, lon1}, {lat2, lon2}, …}]]` gives the list of elevations at the positions `{lati, loni}`. * `GeoElevationData[loc, etype]` gives the elevation of type `etype` for the location `loc`. * `GeoElevationData[loc, etype, format]` gives the elevation in the specified format. Examples [#examples] ```wolfram GeoElevationData[Entity["Mountain", {"MountEverest", "Himalaya", "Nepal"}]] ``` ```wolfram GeoElevationData[Entity["City", {"Denver", "Colorado", "UnitedStates"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoElevationData.html) for more details. # GeoGraphics `GeoGraphics[primitives, options]` represents a two-dimensional geographical image. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Examples [#examples] ```wolfram GeoGraphics[] ``` ```wolfram GeoGraphics[{Red, GeoDisk[Entity["City", {"Paris", "IleDeFrance", "France"}], Quantity[100, "Kilometers"]]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoGraphics.html) for more details. # GeoIdentify `GeoIdentify[enttype]` identifies the geographic entities of the type enttype in which the current geo location is contained. `GeoIdentify[enttype, loc]` identifies the entities in which the location loc is contained. `GeoIdentify[]` identifies the entities of any type in which the current geo location is contained. Examples [#examples] Identify the country at the current location: ```wolfram GeoIdentify["Country"] (* Entity["Country", "UnitedStates"] *) ``` Identify geographic entities at a specific location: ```wolfram GeoIdentify["City", GeoPosition[{40.7128, -74.0060}]] (* Entity["City", {"NewYork", "NewYork", "UnitedStates"}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoIdentify.html) for more details. # GeoLength `GeoLength[g]` gives the length of the geo path `g`. Examples [#examples] ```wolfram GeoLength[GeoPath[{Entity["City", {"NewYork", "NewYork", "UnitedStates"}], Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]}]] ``` ```wolfram GeoLength[GeoBoundary[Entity["Country", "France"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoLength.html) for more details. # GeoMarker `GeoMarker[]` is a `GeoGraphics` primitive that represents a marker at the current `$GeoLocation`. * `GeoMarker[loc]` is a `GeoGraphics` primitive that represents a marker at the location `loc`. * `GeoMarker[{loc1, loc2, …}]` is a `GeoGraphics` primitive that represents markers at locations `loci`. * `GeoMarker[loc, marker]` is a `GeoGraphics` primitive that represents a custom marker at the location `loc`. * `GeoMarker[{loc1, loc2, …}, marker]` is a `GeoGraphics` primitive that represents custom markers at locations `loci`. Examples [#examples] ```wolfram GeoGraphics[GeoMarker[Entity["City", {"Paris", "IleDeFrance", "France"}]]] ``` ```wolfram GeoGraphics[GeoMarker[Here, "SatelliteDish"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoMarker.html) for more details. # GeoNearest `GeoNearest[enttype, loc]` returns the geographic entity of type `enttype` closest to the geo location `loc`. * `GeoNearest[{reg1, reg2, …, regn}, loc]` returns the nearest of the `regi`. * `GeoNearest[{reg1 -> val1, reg2 -> val2, …, regn -> valn}, loc]` returns the `vali` corresponding to the nearest `regi`. * `GeoNearest[{reg1, reg2, …, regn} -> {val1, val2, …, valn}, loc]` returns the same result. * `GeoNearest[{reg1, reg2, …, regn} -> Automatic, loc]` takes the `vali` to be successive integers `i`. * `GeoNearest[spec, loc, n]` returns `n` nearest values. * `GeoNearest[spec, loc, {n, r}]` returns up to `n` matches within a radius `r` of `loc`. Examples [#examples] ```wolfram GeoNearest["City", Here] ``` ```wolfram GeoNearest["Airport", Entity["City", {"NewYork", "NewYork", "UnitedStates"}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoNearest.html) for more details. # GeoOrientationData `GeoOrientationData[date,prop]` gives the value of the property prop about the orientation of the Earth on the given date. `GeoOrientationData[date,prop,"variant"]` gives the specified variant of the property prop on the given date. Examples [#examples] Get the polar motion on a specific date: ```wolfram GeoOrientationData[Today, "PolarMotion"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoOrientationData.html) for more details. # GeoPath `GeoPath[{loc1, loc2}, pathtype]` is a `GeoGraphics` primitive that represents a path of type `pathtype` between locations `loc1` and `loc2`. * `GeoPath[{loc1, loc2, …}, pathtype]` represents a path formed by joining paths of type `pathtype` between consecutive locations `loci`. * `GeoPath[{loc1, d, α}, pathtype]` represents a path moving from location `loc1` a distance `d` with initial bearing `α`. * `GeoPath[{{loc11, loc12, …}, {loc21, …}, …}, pathtype]` represents a disjoint collection of paths of type `pathtype`. Examples [#examples] ```wolfram GeoGraphics[GeoPath[{Entity["City", {"NewYork", "NewYork", "UnitedStates"}], Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]}, "Geodesic"]] ``` ```wolfram GeoGraphics[GeoPath[{Here, Quantity[1000, "Kilometers"], 45 Degree}, "Rhumb"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoPath.html) for more details. # GeoPolygon `GeoPolygon[{loc1, …, locn}]` is a `GeoGraphics` primitive that represents a filled polygon whose boundary is formed by geodesic segments between locations `loci` and `loci+1`. * `GeoPolygon[{loc1, …, locn} -> {{q1, …, qm}, …}]` represents a geo polygon with holes `{q1, …, qm}`, …. * `GeoPolygon[{poly1, poly2, …}]` represents a collection of polygons `polyi`. * `GeoPolygon[{poly1, poly2, …}, sideness]` specifies which of the two sides of each boundary `polyi` is in the interior of the geo polygon. * `GeoPolygon[polys, sideness, pathtype]` represents a geo polygon whose boundary is formed by geo paths of type `pathtype`. Examples [#examples] ```wolfram GeoGraphics[GeoPolygon[{GeoPosition[{40, -74}], GeoPosition[{45, -73}], GeoPosition[{42, -70}]}]] ``` ```wolfram GeoGraphics[{EdgeForm[Red], FaceForm[Opacity[0.3, Blue]], GeoPolygon[Entity["Country", "France"]]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoPolygon.html) for more details. # GeoPosition `GeoPosition[{lat, lon}]` represents a geodetic position with latitude `lat` and longitude `lon`. * `GeoPosition[{lat, lon, h}]` represents a geodetic position with height `h` relative to the reference ellipsoid. * `GeoPosition[{lat, lon, h}, datum]` represents a geodetic position referring to the specified datum. * `GeoPosition[{{lat1, lon1}, {lat2, lon2}, …}, datum]` represents an array of geodetic positions. * `GeoPosition[entity]` returns the geodetic position of the specified geographical entity. Examples [#examples] ```wolfram GeoPosition[{40.7128, -74.0060}] ``` ```wolfram GeoPosition[Entity["City", {"Paris", "IleDeFrance", "France"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoPosition.html) for more details. # GeoPositionENU `GeoPositionENU[{east, north, up}, p]` represents a position with local Cartesian coordinates `{east, north, up}` in a reference system centered at the position `p`. * `GeoPositionENU[{{e1, n1, u1}, {e2, n2, u2}, …}, p]` represents an array of positions. * `GeoPositionENU[entity, p]` returns the Cartesian position with respect to `p` of the specified geographical entity. Examples [#examples] ```wolfram GeoPositionENU[{1000, 2000, 0}, GeoPosition[{40.7, -74.0}]] ``` ```wolfram GeoPosition[GeoPositionENU[{5000, 0, 0}, Here]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoPositionENU.html) for more details. # GeoPositionXYZ `GeoPositionXYZ[{x, y, z}]` represents a position in a Cartesian geocentric coordinate system. * `GeoPositionXYZ[{x, y, z}, datum]` represents a point referred to the specified datum. * `GeoPositionXYZ[{{x1, y1, z1}, {x2, y2, z2}, …}, datum]` represents an array of points in a Cartesian geocentric coordinate system. * `GeoPositionXYZ[entity]` returns the Cartesian geocentric position of the given geographical entity. Examples [#examples] ```wolfram GeoPositionXYZ[GeoPosition[{0, 0}]] ``` ```wolfram GeoPosition[GeoPositionXYZ[{6378137, 0, 0}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoPositionXYZ.html) for more details. # GeoVectorENU `GeoVectorENU[loc -> {ve, vn}]` represents a horizontal two-dimensional vector of components `ve` and `vn` in an orthonormal frame tangent to the Earth at geo location `loc`. * `GeoVectorENU[loc -> {ve, vn, vu}]` represents a three-dimensional vector of horizontal components `ve` and `vn`, and vertical component `vu` at geo location `loc`. * `GeoVectorENU[{loc1, loc2, …} -> {vec1, vec2, …}]` represents a collection of vectors `veci` at respective geo locations `loci`. * `GeoVectorENU[{loc1 -> vec1, loc2 -> vec2, …}]` represents the same collection of vectors. * `GeoVectorENU[vec]` represents a geo vector whose associated location has been implicitly specified. Examples [#examples] ```wolfram GeoVectorENU[GeoPosition[{40.7, -74.0}] -> {1, 0}] ``` ```wolfram GeoVectorPlot[GeoVectorENU[Here -> {1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoVectorENU.html) for more details. # GeoVectorPlot `GeoVectorPlot[vecs]` generates a vector plot from the field of geo vectors vecs. `GeoVectorPlot[{vecs1,vecs2,…}]` generates a separate set of vectors for each vecsi. Examples [#examples] Plot geo vectors on a map: ```wolfram GeoVectorPlot[{GeoPosition[{40, -74}] -> {1, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoVectorPlot.html) for more details. # GeoVectorXYZ `GeoVectorXYZ[loc->{vX,vY,vZ}]` represents a three-dimensional vector of Cartesian components vX, vY, vZ in an orthonormal frame parallel to the geocentric frame, at location loc. `GeoVectorXYZ[{loc1,loc2,…}->{vec1,vec2,…}]` represents a collection of vectors veci at respective geo locations loci. `GeoVectorXYZ[{loc1->vec1,loc2->vec2,…}]` represents the same collection of vectors. `GeoVectorXYZ[vec]` represents a geo vector whose associated location has been implicitly specified. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeoVectorXYZ.html) for more details. # GeologicalPeriodData `GeologicalPeriodData[entity, property]` gives the value of the specified property for the geological period entity. * `GeologicalPeriodData[{entity1, entity2, …}, property]` gives a list of property values for the specified period name entities. * `GeologicalPeriodData[entity, property, annotation]` gives the specified annotation associated with the given property. Examples [#examples] ```wolfram GeologicalPeriodData["Jurassic", "StartDate"] ``` ```wolfram GeologicalPeriodData["Cretaceous", "Duration"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeologicalPeriodData.html) for more details. # GeomagneticModelData `GeomagneticModelData[]` returns the current magnetic field data for the current location. `GeomagneticModelData[locationspec]` returns the current magnetic field data for a location. `GeomagneticModelData[datespec]` returns the magnetic field data for the specified time for the current location. `GeomagneticModelData[locationspec,datespec]` returns the magnetic field data for the specified time and location. `GeomagneticModelData[locationspec,datespec,component]` returns the component of the magnetic field for the specified time and location. Examples [#examples] ```wolfram GeomagneticModelData[Entity["City", {"Paris", "IleDeFrance", "France"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeomagneticModelData.html) for more details. # Here `Here` represents the current deduced geo location. Examples [#examples] ```wolfram Here ``` ```wolfram GeoPosition[Here] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Here.html) for more details. # Latitude `Latitude[pos]` gives the latitude in degrees of a geographic position specified by pos. `Latitude[pos,datum]` gives the latitude referring to the specified geodetic datum. Examples [#examples] Get the latitude of a city: ```wolfram Latitude[Entity["City", {"Paris", "IleDeFrance", "France"}]] (* 48.8566 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Latitude.html) for more details. # LatitudeLongitude `LatitudeLongitude[pos]` gives a list of the latitude and longitude in degrees of a geographic position specified by *pos*. * `LatitudeLongitude[pos, datum]` gives the latitude and longitude referring to the specified geodetic *datum*. Examples [#examples] ```wolfram LatitudeLongitude[Entity["City", {"NewYork", "NewYork", "UnitedStates"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LatitudeLongitude.html) for more details. # Longitude `Longitude[pos]` gives the longitude in degrees of a geographic position specified by pos. `Longitude[pos,datum]` gives the longitude referring to the specified geodetic datum. Examples [#examples] ```wolfram Longitude[Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Longitude.html) for more details. # NightHemisphere `NightHemisphere[]` is a two-dimensional GeoGraphics primitive that represents the half of the Earth currently in darkness. `NightHemisphere[datespec]` represents the night half of the Earth for the specified date. Examples [#examples] Show the current night hemisphere: ```wolfram GeoGraphics[{Gray, NightHemisphere[]}] ``` Show night hemisphere for a specific date: ```wolfram GeoGraphics[{Gray, NightHemisphere[DateObject[{2024, 6, 21, 12, 0}]]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NightHemisphere.html) for more details. # RandomGeoPosition `RandomGeoPosition[]` gives a pseudorandom geo position uniformly distributed on the surface of the Earth. * `RandomGeoPosition[{{latmin, lonmin}, {latmax, lonmax}}]` gives a pseudorandom geo position uniformly distributed in the given geo bounding box. * `RandomGeoPosition[g]` gives a pseudorandom geo position uniformly distributed in the geo region g. * `RandomGeoPosition[g, n]` gives a list of n pseudorandom geo positions uniformly distributed in the geo region g. * `RandomGeoPosition[g, {n1, n2, ...}]` gives an n1×n2×... pseudorandom geo position array. Examples [#examples] Get a random location on Earth: ```wolfram RandomGeoPosition[] ``` Random location within a bounding box: ```wolfram RandomGeoPosition[{{40, -75}, {42, -73}}] ``` Multiple random positions in a country: ```wolfram RandomGeoPosition[Entity["Country", "France"], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomGeoPosition.html) for more details. # SphericalDistance `SphericalDistance[{θ1,ϕ1},{θ2,ϕ2}]` returns the great-circle distance between points \{θ1,ϕ1} and \{θ2,ϕ2} on the surface of a unit sphere. `SphericalDistance[{θ1,1,θ1,2,…,ϕ1},{θ2,1,θ2,2,…,ϕ2}]` returns the geodesic distance between arbitrary-dimensional points on the surface of a unit hypersphere. Examples [#examples] Compute the great-circle distance on a unit sphere: ```wolfram SphericalDistance[{0, 0}, {Pi/2, 0}] (* Pi/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalDistance.html) for more details. # AbsoluteDashing ```wolfram AbsoluteDashing[{d1, d2, ...}] ``` is a graphics directive which specifies that lines which follow are to be drawn dashed, with successive segments having absolute lengths `d1`, `d2`, … (repeated cyclically). For example ```wolfram Table[Graphics[{AbsoluteDashing[{d, 15 - d}], Line[{{0, 0}, {2, 1}}]}], {d, {2, 5, 8, 12}}] ``` Supported primitives [#supported-primitives] * [Rectangle](../Graphics/Rectangle) * [Line](../Graphics/Line) * [Circle](../Graphics/Circle) * [Polygon](../Graphics/Polygon) # AbsoluteThickness ```wolfram AbsoluteThickness[n_Real] ``` is used to control the visible thickness of lines used in [Graphics](../Graphics/Graphics). The displayed is not affected by scaling or zooming the plot. Example [#example] A styled [Line](../Graphics/Line) object ```wolfram Graphics[{ AbsoluteThickness[3], Cyan, Line[{{0,0}, {1,1}}] }] ``` # AnimationFrameListener signals once the beginning of a browser's frame (depends on OS settings, hardware). It can be reloaded again after any changes of dependent dynamic symbols similar to [`requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame). Why to use * to be in sync with a beginning of native browser's frame drawing * to animate something as fast as possible * don't fire next frame, before calculations are done Therefore this provides a balanced load to the system. ```wolfram AnimationFrameListener[symbol_Offload, "Event"->event_String] ``` where `symbol` can be any dynamic symbol wrapped in [Offload](../Interpreter/Offload), that will be changed each frame, it serves the purpose of a signal, that all calculations are done. `event` is a string representation of [`EventObject`](../Misc/Events) to which a handler function, that recalculates `symbol` is assigned. Options [#options] "Event" [#event] Provides an event object in the form of a string Methods [#methods] Apply [`EventHandler`](../Misc/Events) on the `AnimationFrameListener` directly to assign a handler with a generated event UID: ```wolfram EventHandler[AnimationFrameListener[symbol_Offload], handler_] ``` where `handler` is handler function, that will be called. Example [#example] Here is an almost one-liner animation: ``` Module[{p=RandomReal[{-1,1}, {100,2}]}, Graphics[{ (*VB[*)(RGBColor[0.368417, 0.506779, 0.709798])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qKpg26anKlOv2RYbTXk7vMH9gX3S8ZYb3qm3P7AF5kRs6"*)(*]VB*), Point[p//Offload], EventHandler[AnimationFrameListener[p//Offload], Function[Null, p = (# + Norm[#] 0.01 {#[[2]], -#[[1]]}) &/@ p; ]] }, ImageSize->Small] ] ``` Here is a basic example with many points and lines animated: ```wolfram With[{pts = Unique[], event = CreateUUID[], n = Unique[]}, n = 1; EventHandler[event, Function[Null, pts = Table[{x, Sum[Cos[2 x i]/(2i+1), {i, 1, n}]/n}, {x,0,10Pi,0.1}]; n = If[n>20, 1, n + 0.1]; ]]; EventFire[event, True]; Graphics[{ Blue, Line[pts//Offload], Red, Point[pts//Offload], AnimationFrameListener[pts//Offload, "Event"->event] }, Axes->True, PlotRange->{{0,10Pi}, {-0.15,0.3}}, "TransitionType"->None] ] ``` Animation goes as fast as possible. It does not make sense to still use transition interpolation of 2D vector graphics, therefore we disabled it with `TransitionType->None`. Here we used the same symbol `pts` used for drawing our points for triggering [AnimationFrameListener](../Graphics/AnimationFrameListener). **It does not cost anything**, since it listens only for change of a symbol and does not read or decode an actual value. Here is another example with 3D graphics: ```wolfram balls = RandomReal[{-1,1}, {100,3}]; vels = RandomReal[{-1,1}, {100,3}]; EventHandler["frame", Function[Null, vels = Table[ If[Norm[balls[[i]]] < 0.01, -1, 1] vels[[i]] - 0.08 balls[[i]] , {i, Length[balls]}]; balls = Table[balls[[i]] + 0.08 vels[[i]], {i, Length[balls]}]; ]]; Graphics3D[{ Table[With[{i = i}, { RGBColor[RandomReal[{0,1}, 3]], Sphere[balls[[i]] // Offload, 0.03] } ], {i, Length[balls]}], AnimationFrameListener[balls // Offload, "Event"->"frame"] }] ``` There is also [a famous example](https://community.wolfram.com/groups/-/m/t/122095) of 1000 particles "dancing" with each other ```wolfram title="cell 1" n = 1000; r := RandomInteger[{1, n}]; f := (#/(.01 + Sqrt[#.#])) & /@ (x[[#]] - x) &; s := With[{r1 = r}, p[[r1]] = r; q[[r1]] = r]; x = RandomReal[{-1, 1}, {n, 2}]; {p, q} = RandomInteger[{1, n}, {2, n}]; ``` ```wolfram title="cell 2" EventHandler["frame", Function[Null, (* all calculations *) x = 0.995 x + 0.02 f[p] - 0.01 f[q]; If[r < 100, s]; ]]; ``` ```wolfram title="cell 3" Graphics[{ PointSize[0.007], Point[x // Offload], AnimationFrameListener[x // Offload, "Event"->"frame"] }, PlotRange -> {{-2,2}, {-2,2}}, "TransitionType"->"Linear", "TransitionDuration"->1] ``` to cancel animation - remove handler ```wolfram EventRemove["frame"] ``` and to restart - evaluate cell 2 and retrigger it using ```wolfram EventFire["frame", True]; ``` # Arrow Plots an arrow with a fixed head-size from point 1 to point 2 ```wolfram Graphics[{ Arrow[{{0,0}, {1,1}}] }] ``` How to update [#how-to-update] Fully supports. Use [Offload](../Interpreter/Offload) keyword Attach to other primitives [#attach-to-other-primitives] BezierCurve [#beziercurve] Line [#line] You can wrap it over the corresponding object to attach an arrow-marker to the end ```wolfram Arrow[Line[...], 0.04] ``` Options [#options] Not available at the moment # Arrowheads ```wolfram Arrowheads[scale_Real] ``` specifies an absolute side of an [Arrow](../Graphics/Arrow) head. The default value is `0.04` # BezierCurve ```wolfram BezierCurve[{pts__List}] ``` plots quadratic Bezier curve using every *first point* as a starting point and *forth point* as a destination. If there are more than 4 points provided, it will split them into multiple curves ```wolfram pts = {{0, 0}, {1, 1}, {2, -1}, {3, 0}, {5, 2}, {6, -1}, {7, 3}}; Graphics[{BezierCurve[pts], Green, Line[pts], Red, Point[pts]}] ``` # Circle draws a circle with a given radius `r` ```wolfram Circle[{x_,y_}, r_] ``` for example ```wolfram Graphics[Table[Circle[RandomReal[{-1,1}, 2], 1], {i,10}]] ``` Parameters [#parameters] See [Disk](../Graphics/Disk) How to update [#how-to-update] Fully support for a radius and coordinates. Use [Offload](../Interpreter/Offload) ```wolfram pt = {0,0}; EventHandler[Graphics[{ Red, Circle[pt // Offload, 0.08] }, PlotRange->{{-1,1}, {-1,1}}], { "mousemove" -> Function[xy, pt = xy] }] ``` # Directive Used for styling plots or 2D graphics ```wolfram Directive[directives___, opts___Rule] ``` The support is quite limited compared to Mathematica's implementation Directives [#directives] _RGBColor [#_rgbcolor] Options [#options] FontSize [#fontsize] FontFamily [#fontfamily] "TransitionType" [#transitiontype] "TransitionDuration" [#transitionduration] Examples [#examples] Ticks of a plot [#ticks-of-a-plot] One can provide a font-size parameters ```wolfram Plot[Sin[x], {x,0,2Pi}, FrameTicksStyle->Directive[FontSize->16], Frame->True] ``` FrameLabel style [#framelabel-style] The same is valid for the labels ```wolfram Plot[Sin[x], {x,0,10 Pi}, FrameStyle->Directive[FontSize->16], Frame->True, FrameLabel->{"x-axis", "y-axis"}] ``` Transitions [#transitions] One can specify the local transitions parameters. For example ```wolfram p1 = {0,0}; p2 = {0,0}; Graphics[{ Directive["TransitionDuration"->500], Red, Disk[p1 // Offload, 0.2], {Directive["TransitionDuration"->100], Blue, Disk[p2 // Offload, 0.2]}} , PlotRange->{{-1,1}, {-1,1}}] ``` then try ```wolfram p1 = {1,1}; p2 = {-1,-1}; ``` You will find that they are animated with a different duration. **The same applies to `TransitionType` as well** # Disk draws a filled [Circle](../Graphics/Circle) ```wolfram Disk[{x_, y_}, r_] ``` or ```wolfram Disk[{x_,y_}, r_, {start_, finish_}] ``` where `start` and `finish` are corresponding angles of a sector (used to make pie diagrams) for example ```wolfram Graphics[Table[Disk[RandomReal[{-1,1}, 2], 1], {i,10}]] ``` How to update [#how-to-update] Fully support for a radius and coordinates. Use [Offload](../Interpreter/Offload) Parameters [#parameters] RGBColor [#rgbcolor] Color of the filling and stroke (if `EdgeForm` is not specified) ```wolfram {Blue, Disk[{0,0}, 1]} ``` EdgeForm [#edgeform] Specifies the color of a stroke ```wolfram {EdgeForm[Red], Blue, Disk[{0,0}, 1]} ``` Opacity [#opacity] Defines opacity for a primitive (see [Opacity](../Graphics/Opacity)) ```wolfram {Opacity[0.5], Red, Disk[{-0.5,0}, 1], Blue, Disk[{0.5,0}, 1]} ``` Methods [#methods] EventHandler [#eventhandler] One can listen to a several events produced by this primitive using [`EventHandler`](../Misc/Events) ```wolfram EventHandler[t_Disk, {event_ -> handler_, ...}] ``` where `event` can be * `"mousemove"` detects and sends coordinates of a mouse, when it is over this element * `"drag"` makes primitive draggable and emits coordinates * `"zoom"` detects zoom / mouse-wheel * `"click"` detects mouse clicks # EdgeForm specifies stroke color for a primitive ```wolfram EdgeForm[col_RGBColor] ``` # FilledCurve ```wolfram FilledCurve[{segments__}] ``` where `segments` can be [Line](../Graphics/Line), [BezierCurve](../Graphics/BezierCurve). For example ```wolfram a = {{-1, 0}, {0, 1}, {1, 0}}; b = {{0, -(2/3)}, {-1, 0}}; Graphics[FilledCurve[{BezierCurve[a], Line[b]}]] ``` One can fill the shape defined by **components** using following pattern ```wolfram FilledCurve[{components__List}] ``` For example ```wolfram pts = {{0, 1}, {-1, -(1/2)}, {1, -(1/2)}}; Graphics[FilledCurve[{{Line[2 pts]}, {Line[pts]}}]] ``` It uses even-odd rule for filling. The intersection will not be filled. # Graphics ```wolfram Graphics[{objects__}, opts___] ``` represents a two-dimensional graphical image. This is a fundamental expression, which is produced by all 2D plotting functions ```wolfram Graphics[ Table[{Hue[t/20.0,1., 0.5], Circle[{Cos[2 Pi t/20], Sin[2 Pi t/20]}]}, {t, 20}]] ``` ``` (*VB[*)(Null)(*,*)(*"1:eJxTTMoPSmNiYGAo5gAS7kWJBRmZycVpIiARFiDhk1lcApGH85hBPBDhUZpaNGsmCKy0L2IAgw8wxgP7NEaQOjYg4ZxZlJyTimYKmMcKJALyy1OLEJIBOaXFCAcFJZZk5ucl5mSCVGaCRBAaQzJzU7EpZcRUCrYDbAYu9UxEyRG0lgWuFOaXzP9AQJ5L8IX4TgpCnFQfMJIdljSJX1CA0ih+sYe4iTEIHB5MaZyGYUDfFIIvjZ+kYxonP5cOtTIMe4hDwvcCySGeCVKEFP/4ctDlASuzwLpHfBynp4HANUpjAVs4jpZtJJZtNwesbBuUeYHudfrZMyBwZ7DnhWHeloWFOcm1Dji9MBAwHZLTHo7G8QDWnPjaA4+HdBk41OtCfOXik8GeZwZZG4G6qQtf6+3ZkG5DD/XyFF8t9oLMvhMiNPDVYi+HTF94eMYxpMZ6PToGNKBlIKR2ejNkxj6Hel2IryZ6N5jywghsQ6MFPvG1Dth0BhTTg0pzUoNBTnDOzyspys8pBrvRLTGnOBUAXPBTTA=="*)(*]VB*) ``` ```wolfram Graphics[{EdgeForm[Black], Green, Rectangle[{0, -1}, {2, 1}], Red, Disk[], Blue, Circle[{2, 0}], Yellow, Polygon[{{2, 0}, {4, 1}, {4, -1}}], Purple, Arrow[{{4, 3/2}, {0, 3/2}, {0, 0}}], Black, SVGAttribute[Line[{{-1, 0}, {4, 0}}], "stroke-dasharray"->"3"]}] ``` ``` (*VB[*)(Null)(*,*)(*"1:eJyVUstOwzAQdEJ4SSDxC3wAJz4AlUBzyQElEnc3dVKrxovWLqh/y5+AH7IhqRsJH1bayezseJzbFTR9TghRF6ZUSN83vFP9tUUKU2qudJ+F78/rgS0B3zxy6Sf2NftggpuG9CeB2VSPJQhAB3NL94Q8DDas01QOgnko7PL8b3MmeB50EjuivN+RhcEnrrYp+Tmr0a+XOTOl5Ngd+MxnhLLxnZ3QuSkvIPYDSD8R0z2mO8aL6CuBu7wOfCBx5+vB6cXO+zk1ZYEIn7NuirjQCVPNQVLB7Yhzmkj3n/Q/ESX+J8e/MqV9rRZaI1/tNPt94JrLybtMNthgjqY5xpudYO2N7TTClt2tqdpQNHZau+5+QrT3K0EaqlAuyyUViv0A52+gAQ=="*)(*]VB*) ``` Graphics objects [#graphics-objects] Please see the corresponding section in **Reference** section for expression to be used with `Graphics`. Mostly all primitives are generated by a high-order functions like [Plot](../Plotting-Functions/Plot), [ListLinePlot](../Plotting-Functions/ListLinePlot), [ListVectorPlot](../Plotting-Functions/ListVectorPlot), [BubbleChart](../Plotting-Functions/BubbleChart) and etc ``` flowchart LR; subgraph PP[High-order functions] direction LR Plot ContourPlot ListPlot BarChart VectorPlot MatrixPlot etc[...] end subgraph Primitives direction LR Point Line Arrow Polygon Rectangle Raster RGBColor PrimitivesMisc[...] end Plot --> Line Plot --> RGBColor ContourPlot --> Polygon ContourPlot --> RGBColor ListPlot --> Point ListPlot --> RGBColor BarChart --> Rectangle BarChart --> RGBColor VectorPlot --> Arrow VectorPlot --> Line VectorPlot --> RGBColor MatrixPlot --> Raster Point --> Graphics Line --> Graphics Arrow --> Graphics Polygon --> Graphics Rectangle --> Graphics Raster --> Graphics RGBColor --> Graphics PrimitivesMisc --> Graphics ``` Methods [#methods] EventHandler [#eventhandler] Attach an event handler to listen canvas events ```wolfram EventHandler[Graphics[Disk[]], {"click"->Beep}] ``` The list of available events is the same as for primitives (see [Mouse and keyboard](./../Guides/UI-Events-Capture)) * `"click"` * `"mousemove"` * etc **it is also applicable for all plotting functions** ```wolfram c = {0.,0.}; EventHandler[ Plot[x, {x,0,1}, Epilog->Point[c//Offload]], {"mousemove"->((c=#)&)} ] ``` This is also a valid form ```wolfram c = {0.,0.}; Plot[x, {x,0,1}, Epilog->{ Point[c//Offload], EventHandler[Null, {"mousemove"->((c=#)&)}] }] ``` Here it takes `Null` as a first argument, which forces it to attach handler to the nearest parent symbol, which supports it. Context symbols [#context-symbols] Here is a list of utility symbols used in `Graphics` context Graphics`DPR [#graphicsdpr] Returns device density pixel ratio (for retina-like displays it is more than `1.0`). It comes handy when working with raster graphics - [Image](../Image/Image) placed on graphics canvas. ```wolfram FrontFetch[Graphics`DPR[]] ``` Evaluate it on the frontend using [FrontFetch](../Frontend-IO/FrontFetch) or [FrontFetchAsync](../Frontend-IO/FrontFetchAsync) like functions. Options [#options] PlotRange [#plotrange] manually specifies, where the borders of the visible area (viewport) are ```wolfram PlotRange->{{-1,1}, {-1,1}} ``` If `PlotRange` is missing, WLJS Graphics will try to guess the dimensions in order to fit all objects to the screen ImageSize [#imagesize] specifies the actual size in pixels of a canvas ```wolfram ImageSize->300 or ImageSize->{300,200} ``` ImageSizeRaw [#imagesizeraw] specifies the size of drawing area in pixels considering pixel density ratio. It comes handy when combining [Graphics](../Graphics/Graphics) with [Image](../Image/Image) using [Inset](../Graphics/Inset). [HighlightImage](../Image/HighlightImage) uses this approach ImagePadding [#imagepadding] removes or adds the spacing between the plotted range and the canvas border ```wolfram title="remove any padding" ImagePadding->None ``` ```wolfram title="add to all sides" ImagePadding->10 ``` PlotRangeClipping [#plotrangeclipping] Defines if plot range has to be clipped. By the default is `True`, that hides all graphics objects outside the plotting range PlotLabel [#plotlabel] Specifies a label for a plot ```wolfram Plot[Sin[x], {x, 0, 10}, PlotLabel -> Sin[x]] ``` ```wolfram Plot[Sin[x], {x, 0, 10}, PlotLabel -> "Sin[x]", LabelStyle -> Directive[Orange, FontSize->14]] ``` Axes [#axes] Show or hide axes ```wolfram Axes->True ``` Example [#example] ```wolfram Graphics[{EdgeForm[Black], Green, Rectangle[{0, -1}, {2, 1}], Red, Disk[], Blue, Circle[{2, 0}], Yellow, Polygon[{{2, 0}, {4, 1}, {4, -1}}], Purple, Arrow[{{4, 3/2}, {0, 3/2}, {0, 0}}], Black, SVGAttribute[Line[{{-1, 0}, {4, 0}}], "stroke-dasharray"->"3"]}, Axes->True ] ``` AxesLabel [#axeslabel] Place labels on your axes ```wolfram AxesLabel -> {"xxx", "yyy"} ``` Activate `Axes` option first for example Labels **accepts only strings** or numbers unlike Mathematica, where you can put everything. Since it is translated into [`Text`](../Graphics/Text), one can use sort of TeX math input ```wolfram Graphics[Circle[], Axes->True, AxesLabel -> {"x-axis (cm^{-1})", "y-axis \\alpha"}] ``` **You can offset the labels** using the following pattern ```wolfram Graphics[Circle[], Axes->True, AxesLabel -> {{"x-axis (cm^{-1})", {-20,-20}}, "y-axis"}] ``` Ticks [#ticks] Customize ticks by providing an array of numbers for both axes ```wolfram Graphics[Circle[], Axes->True, Ticks->{{0, 0.5, 1}, {}}] ``` Or by providing as pairs `{Number, String}` one can specify the displayed text ```wolfram Graphics[Circle[], Axes->True, Ticks->{{{0, "Zero"}, {0.5, "Half"}, {1,"One"}}, {}}] ``` "Controls: [#controls] The features **allows to pan and zoom your plots**, that was never possible in Mathematica ```wolfram "Controls"->True ``` Right-click on the canvas to reset axes Frame [#frame] Turns plot into the journals-like styled graph. In general it has much more options to customize the look ```wolfram Graphics[Circle[], Axes->True, Frame->True] ``` FrameTicks [#frameticks] The same as [`Ticks`](#`Ticks`), but for this regime. FrameLabel [#framelabel] The same as [`AxesLabel`](#`AxesLabel`) ```wolfram FrameLabel->{{"yy", None}, {"xx", None}} ``` to specify **an absolute offset** for each label, provide a list instead of a string ```wolfram FrameLabel->{{{"yy", {xoffset, yoffset}}, None}, {"xx", None}} ``` FrameStyle [#framestyle] Affects the style of [`FrameLabels`](#`FrameLabels`). Use `Directive` for changing the style ```wolfram FrameStyle->Directive[FontSize->16] ``` FrameTicksStyle [#frameticksstyle] Affects the style of [`FrameTicks`](#`FrameTicks`) ```wolfram FrameTicksStyle->Directive[FontSize->16] ``` TickLabels [#ticklabels] To remove unnecessary ticks, use ```wolfram TickLabels->{{True, False}, {True, False}} ``` Epilog [#epilog] Puts any graphics object on top ```wolfram Epilog->{Red, Line[{{-1,-1}, {1,1}}]} ``` It opens up many possibilities, since it provides low-level access to the `Graphics` canvas. Example [#example-1] One can use it on a high-level function like `Plot` to add low-level primitives ```wolfram Plot[Sin[x], {x,0,Pi}, Epilog->{Red, Line[{{-1,-1}, {1,1}}]}] ``` or together with [FrontInstanceReference](../Frontend-IO/FrontInstanceReference) Prolog [#prolog] The same as [`Epilog`](#`Epilog`), but acts before plotting the data. "TransitionType" [#transitiontype] See [Transitions](#Transitions). The possible values It can also be applied locally, see [TransitionType](../Graphics/TransitionType) "Linear" [#linear] This one is used by the default For example ```wolfram title="cell 1" pt = {-1,0}; Graphics[{PointSize[0.3], Point[pt // Offload]}, ImageSize->350, PlotRange->{{-1,1}, {-1,1}}, "TransitionType"->"Linear"] ``` ```wolfram title="cell 2" pt = RandomReal[{-1,1}, 2]; ``` "CubicInOut" [#cubicinout] ```wolfram title="cell 1" pt = {-1,0}; Graphics[{PointSize[0.3], Point[pt // Offload]}, ImageSize->350, PlotRange->{{-1,1}, {-1,1}}, "TransitionType"->"CubicInOut"] ``` None [#none] No transition. Works great for fast animations "TransitionDuration" [#transitionduration] Sets the duration of any transitions of graphics objects on canvas **in milliseconds**. The default value is `300`. It can also be applied locally, see [TransitionDuration](../Graphics/TransitionDuration) Combining two graphics plots [#combining-two-graphics-plots] One can put `Graphics` into another `Graphics` canvas using [Inset](../Graphics/Inset) or merge them using `Show`. Transitions [#transitions] Updates are supported with [Offload](./../Interpreter/Offload) on the level of graphics primitives such as [Line](../Graphics/Line), [Point](../Graphics/Point), [Rectangle](../Graphics/Rectangle), [Text](../Graphics/Text) and etc... Not all primitives do support updates, please, check individually <small>Supports Offload</small> . The full reevaluation of `Graphics` does not happen, that allows to gain much more performance. However, since the dynamic binding is established between individual primitives and symbols, one can make nested constructions like this one ```wolfram radius = 1.; angle = 0.; tpos = 0. group = { LightBlue, Disk[{0,0}, radius // Offload], LightBlue, AbsoluteThickness[25], Line[{{-1,1}, {1,-1}}], Red, Directive[FontSize->24], Text["Hello World", {Offload[-0.23 + tpos],0}] }; Graphics[Rotate[group, angle // Offload], "TransitionType"->"Linear", "TransitionDuration"->100] ``` Here * an update of `angle` will not cause reevaluation of `group` * and update of `radius` will only update the radius of `Disk` * and update of `tpos` will reevaluate an expression `-0.23 + tpos` and change the text position Let us animate this example ```wolfram title="evaluate in a separate cell" Do[ radius = 1+0.5 Sin[x]; tpos = 0.5 Cos[4x]; angle = x; Pause[0.1]; , {x, 0. , 2Pi, 0.1}]; ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # GraphicsComplex ```wolfram GraphicsComplex[{pt1, pt2, ...}, data] ``` represents a graphics complex in which coordinates given as integers `i` in graphics primitives in `data` are taken to be `pti`. `GraphicsComplex` provides faster rendering for a complex primitives with many vertices and colors. It looks similar to an interfaces of OpenGL or other graphics framework, where buffers with coordinates are provided separately from the object instances. Limited functionality Supported primitives [#supported-primitives] Line [#line] ```wolfram GraphicsComplex[{{0,0}, {1,0}, {1,1}}, Line[{{1,2,3}}]] // Graphics ``` vertex colors are not supported Polygon [#polygon] Uses WebGL graphics acceleration for rendering ```wolfram GraphicsComplex[{{0,0}, {1,0}, {1,1}}, Polygon[{1,2,3}], "VertexColors"->{{1,1,0}, {0,1,1}, {0,1,1}}] // Graphics ``` Point [#point] Uses WebGL graphics acceleration for rendering ```wolfram GraphicsComplex[{{0,0}, {1,0}, {1,1}}, Point[{{1,2,3}}]] // Graphics ``` or with colors ```wolfram GraphicsComplex[{{0,0}, {1,0}, {1,1}}, Point[{{1,2,3}}], "VertexColors"->{{1,0,0}, {0,1,0}, {0,0,1}}] // Graphics ``` Arrow [#arrow] Supported Disk [#disk] Supported # GrayLevel ```wolfram GrayLevel[n_Real] ``` where `n` is in a range of `0-1` gives a corresponding gray color. # Hue ```wolfram Hue[h_, s_, l_] ``` represents color as HUE, Saturation, Brightness (**HSV**), where * `h, s, l` are in a range `[0,1]` # Inset ```wolfram Inset[expr_, opts___] ``` ```wolfram Inset[expr_, pos_List, origin: Center, opts___] ``` a graphics object, that allows to put another [Graphics](../Graphics/Graphics), [Image](../Image/Image), [EditorView](../GUI/EditorView), [CellView](../GUI/CellView) or **anything else** on the canvas. Parameters: * `pos` has to be a 2D vector, that specifies the position of the inset in the local coordination system * `origin` **is optional** and specifies the anchor: * * `"Center"` (default value) * * `"Top"` * * `"Bottom"` * * `"Left"` * * `"Right"` Options [#options] ImageSizeRaw [#imagesizeraw] Sets the raw size in pixels `{width, height}` of the container for the inner object. It sometimes comes handy when it fails to automatically guess the required size Examples [#examples] ```wolfram inset = Graphics[{ LightRed, Disk[{0,0},0.25], Black, Directive[FontSize->16], Text["Test", {0,0}, {0,0}] }, PlotRange->{{-1,1}, {-1,1}}]; Plot[x, {x,0,10}, Epilog->{Inset[inset, {5,5}]}] ``` or use place any Wolfram expression: ``` Plot[x, {x,0,10}, Epilog->{Inset[HoldForm[(*FB[*)((1)(*,*)/(*,*)(2))(*]FB*)], {5,5}, Bottom]}] ``` Transitions and updates [#transitions-and-updates] The second arguments `pos` that specifies the position of an inset does support updates. # LABColor ```wolfram LABColor[l_, a_, b_] ``` represents a color in the CIELAB color space with lightness `l` and color components `a` and `b`. example ```wolfram Graphics[{LABColor[.5, .8, .8], Disk[]}] ``` # Line the representation of a line going though the points `{x1,y1}`, `{x2,y2}` ```wolfram Line[{{x1,y1}, {x2,y2}, ...}] ``` or with multiple datasets ```wolfram Line[{list1, list2, ...}] ``` General properties [#general-properties] `Line` itself does not depend on its interpretation, you can also think about it if it was an abstract object like ```wolfram ArcLength[Line[{{0, 0}, {1, 1}}]] ``` gives ```wolfram Sqrt[2] ``` without [Graphics](../Graphics/Graphics) used here. Parameters [#parameters] There are certain parameters, that can affect the style of a line AbsoluteThickness [#absolutethickness] The default is 1 ```wolfram {AbsoluteThickness[3], Line[{{0,0}, {1,1}}]} // Graphics ``` Absolute thickness is indifferent to scaling or zooming of a graphics object. RGBColor [#rgbcolor] Specifies the color of a stroke ```wolfram {Red, Line[{{0,0}, {1,1}}]} // Graphics ``` Indexed geometry [#indexed-geometry] Using it inside [GraphicsComplex](../Graphics/GraphicsComplex) allows to specify only the indexes of vertices as arguments similar to faces like in [Indexed geometry](../Graphics/Polygon) Examples [#examples] Simple primitive [#simple-primitive] A line, that goes though list of points in 2D ```wolfram Graphics[Line[{{1, 0}, {2, 4}, {3, 0}, {4, 4}}]] ``` or styled line ```wolfram Graphics[{ AbsoluteThickness[3], Red, Line[{{1, 0}, {2, 1}, {3, 0}, {4, 1}}] }] ``` Tangent vectors along an elliptic curve ```wolfram With[{f = {Cos[x] + Sin[x], Sin[x]}}, Graphics[ Table[{LABColor[t/(2 Pi), 1, .8], Line[{f, Normalize[D[f, x]] + f}]} /. x -> t, {t, 0, 2 Pi, .1}]]] ``` Transitions and updates [#transitions-and-updates] This is a main ingredient for displaying any dynamic plots, since [Plot](../Plotting-Functions/Plot) function works only for the static data. Manipulation [#manipulation] For example a live plot of traveling wave-packet ```wolfram title="cell 1" packet[x_, t_] := Sum[Sin[- w t + w x], {w, 0,3,0.05}] / 10; line = Table[{x, packet[x, 0]}, {x, 0, 10, 0.1}]; Graphics[Line[line // Offload], Frame->True, FrameLabel->{{"amplitude"}, {"distance"}}] ``` and a [InputRange](../GUI/InputRange) to control a time variable ```wolfram title="cell 2" EventHandler[InputRange[0,5,0.5, 0], Function[t, line = Table[{x, packet[x, t]}, {x, 0, 10, 0.1}]; ]] ``` The desired result should look like Inverse kinematics (FABRIK) [#inverse-kinematics-fabrik] This is an example of implementation FABRIK algorithm Define a bunch of points connect them into a segmented line with fixed length ```wolfram chain = {Cos[#[[1]]], Sin[#[[2]]]}&/@ RandomReal[{-1,1}, {65, 2}] // Sort; lengths = Norm /@ (chain // Reverse // Differences) // Reverse; ``` the actual implementation of FABRIK ```wolfram fabrik[lengths_, target_, origin_] := Module[{buffer, prev}, buffer = Table[With[{p = chain[[-i]]}, If[i === 1, prev = target; target , prev = prev - Normalize[(prev - p)] lengths[[1-i]]; prev ] ], {i, chain // Length}] // Reverse; Table[With[{p = buffer[[i]]}, If[i === 1, prev = origin; origin , prev = prev - Normalize[(prev - p)] lengths[[i-1]]; prev ] ], {i, chain // Length}] ] ``` Dynamic visualization using lines and points ```wolfram Graphics[{ Line[chain // Offload], Red, PointSize[0.06], EventHandler[Point[{-1,-1}], {"drag"->Function[xy, chain = fabrik[lengths, xy, chain // First]]}], Blue, Point[origin // Offload] }, PlotRange->{{-2,2}, {-2,2}}, ImageSize->500, TransitionType->"Linear", TransitionDuration->30] ``` **Try to drag a red dot using mouse** The result will look like `Line` interpolates missing segments of a line, if the dataset has been updated. No actions needed form the user # Offset adds an offset to the given position in absolute units (pixels) ```wolfram Offset[{dx_,dy_}, position_] ``` sets returns coordinates in absolute units ```wolfram Offset[{ax_,ay_}] ``` Use it to set radiuses for [Disk](../Graphics/Disk) or [Circle](../Graphics/Circle) # Opacity ```wolfram Opacity[i_Real] ``` defines opacity for primitives (from 0 to 1) ```wolfram {Opacity[0.5], Red, Disk[{-0.5,0}, 1], Blue, Disk[{0.5,0}, 1]} ``` Transitions and updates [#transitions-and-updates] It also supports updates combined with some primitives ```wolfram opacity = 0.5; Graphics[{Opacity[Offload[opacity]], Red, Disk[{0,0}, 1], Blue, Opacity[Offload[1.0 - opacity]], Disk[{0,0}, 1]}] EventHandler[InputRange[0,1,0.1], Function[value, opacity = value; ]] ``` # Point ```wolfram Point[p_List | _Offload] ``` is a graphics and geometry primitive that represents a point at `p`, ```wolfram Point[{p1_List, p2_List, ...}] ``` represents collection of points ```wolfram Graphics[Point[Table[{t, Sin[t]}, {t, 0, 2 \[Pi], 2 \[Pi]/10}]]] ``` ```wolfram Graphics[ Table[{Hue[RandomReal[],1,0.5], PointSize[RandomReal[{0, 0.1}]], Point[RandomReal[1, {2}]]}, {200}]] ``` Parameters [#parameters] RGBColor [#rgbcolor] specifies colors of a points Opacity [#opacity] specifies opacity PointSize [#pointsize] absolute size of a point Methods [#methods] EventHandler [#eventhandler] One can listen to a several events produced by this primitive using [`EventHandler`](../Misc/Events) ```wolfram EventHandler[t_Point, {event_ -> handler_, ...}] ``` where `event` can be * `"mousemove"` detects and sends coordinates of a mouse, when it is over this element * `"drag"` makes primitive draggable and emits coordinates * `"zoom"` detects zoom / mouse-wheel * `"click"` detects mouse clicks Indexed geometry [#indexed-geometry] Using it inside [GraphicsComplex](../Graphics/GraphicsComplex) allows to specify only the indexes of vertices as arguments similar to faces like in [Indexed geometry](../Graphics/Polygon) Transitions and updates [#transitions-and-updates] Point primitive supports updates even if the number of points is not constant. There is [a famous example](https://community.wolfram.com/groups/-/m/t/122095) of 1000 particles "dancing" with each other ```wolfram title="cell 1" n = 1000; r := RandomInteger[{1, n}]; f := (#/(.01 + Sqrt[#.#])) & /@ (x[[#]] - x) &; s := With[{r1 = r}, p[[r1]] = r; q[[r1]] = r]; x = RandomReal[{-1, 1}, {n, 2}]; {p, q} = RandomInteger[{1, n}, {2, n}]; ``` ```wolfram title="cell 2" EventHandler["frame", Function[Null, (* all calculations *) x = 0.995 x + 0.02 f[p] - 0.01 f[q]; If[r < 100, s]; ]]; ``` ```wolfram title="cell 3" Graphics[{ PointSize[0.007], Point[x // Offload], AnimationFrameListener[x // Offload, "Event"->"frame"] }, PlotRange -> {{-2,2}, {-2,2}}, "TransitionType"->"Linear", "TransitionDuration"->1] ``` # Polygon ```wolfram Polygon[{p1, p2, ...}] ``` represents a filled polygon with points `p1`, `p2`... ```wolfram Polygon[{{p1, p2, ...}, {n1, n2, ...}}] ``` Example [#example] ```wolfram pol = Polygon[{{1, 0}, {0, Sqrt[3]}, {-1, 0}}]; Graphics[pol] ``` ```wolfram h[x_, y_] := Polygon[Table[{Cos[2 Pi k/6] + x, Sin[2 Pi k/6] + y}, {k, 6}]]; Graphics[{EdgeForm[Blue], LightBlue, Table[h[3 i + 3 ((-1)^j + 1)/4, Sqrt[3]/2 j], {i, 5}, {j, 10}]}] ``` Digital petals ```wolfram With[{d = 2 Pi/12}, Graphics[ Table[{EdgeForm[Black], Hue[(-11 + q + 10 r)/72., 1, 0.5], Polygon[{(8 - r) {Cos[d (q - 1)], Sin[d (q - 1)]}, (8 - r) {Cos[d (q + 1)], Sin[d (q + 1)]}, (10 - r) {Cos[d q], Sin[d q]}}]}, {r, 6}, {q, 12}]]] ``` Parameters [#parameters] RGBColor [#rgbcolor] filling color Opacity [#opacity] global opacity of an object EdgeForm [#edgeform] stroke color Indexed geometry [#indexed-geometry] Using [GraphicsComplex](../Graphics/GraphicsComplex) one can specify only faces with indexes for each polygon, while vertex data is stored in a separate array. For example ```wolfram GraphicsComplex[{{0,0}, {1,0}, {1,1}}, Polygon[{{1,2,3}}]] // Graphics ``` It is common use case, when vertices are colored and there are many polygons on the screen. Transitions and updates [#transitions-and-updates] It fully support updates when a `Polygon` represents 1 polygon (a set of animated polygon per 1 expression is not supported). # RGBColor represents color ```wolfram RGBColor[r_Real, g_Real, b_Real] ``` or ```wolfram RGBColor[{r_Real, g_Real, b_Real}] ``` where `r`, `g`, `b` are from `0` to `1`. # Raster ```wolfram Raster[data_] ``` represents a raster (pixel) image that can be placed inside `Graphics` `data` is usually a 2D array of grayscale values (`{{a1,a2,...},...}`), or a 2D array of color vectors (for example RGB or RGBA `{{{r1,g1,b1},{r2,g2,b2},...},...}`). ```wolfram Raster[data_, {{xmin_, ymin_}, {xmax_, ymax_}}] ``` places the raster into an explicit coordinate region (akin to [Rectangle](./Rectangle)). while exclusively for grayscale you can specify `low` and `high` values mapped to the darkest and brighest pixels: ```wolfram Raster[data_, {{xmin_, ymin_}, {xmax_, ymax_}}, {low_, high_}] ``` Examples [#examples] ArrayPlot [#arrayplot] This plotting function implicitly produces `Raster`: ```wolfram ArrayPlot[RandomReal[1, {20, 20}], ColorFunction -> "Rainbow"] ``` Grayscale matrix [#grayscale-matrix] ```wolfram data = Table[Sin[x y]^2, {y, 0, 4 Pi, 0.12}, {x, 0, 4 Pi, 0.12}]; Graphics[ Raster[data], Frame -> True, PlotRange -> {{0, Length[data[[1]]]}, {0, Length[data]}} ] ``` Colored raster (RGBA) [#colored-raster-rgba] ```wolfram rgba = Table[ {x, y, 1 - x, 0.8}, {y, 0.05, 1.0, 0.05}, {x, 0.05, 1.0, 0.05} ]; Graphics[ { EdgeForm[Black], Rectangle[{-0.2, -0.2}, {1.2, 1.2}], Raster[rgba, {{0, 0}, {1, 1}}] }, Frame -> True, ImagePadding -> 20 ] ``` Overlay raster with vector primitives [#overlay-raster-with-vector-primitives] ```wolfram img = Table[{x, 0.2 + 0.7 y, 1 - y, 1.0}, {y, 0, 1, 0.03}, {x, 0, 1, 0.03}]; Graphics[ { Raster[img, {{-2, -1}, {2, 1}}], White, AbsoluteThickness[2], Circle[{0, 0}, 0.65], Line[{{-2, 0}, {2, 0}}], Line[{{0, -1}, {0, 1}}] }, Frame -> True ] ``` Updates [#updates] `Raster` supports [Offload](./../Interpreter/Offload) method if position, scaling and array size does not change. For example: ```wolfram Refresh[Graphics[Raster[RandomReal[{0,1}, {256,256}]]], 1/30.0] ``` Here is another example with manual controls: ```wolfram rasterDensityPlotAnim[f_, {xs_, xmin_, xmax_}, {ys_, ymin_, ymax_}, {ts_, tmin_, tmax_}, OptionsPattern[]] := With[{ time = Unique[], buffer = Unique[], cf = With[{c=ColorData[OptionValue[ColorFunction]]}, (List@@c[#])&], pts = OptionValue[PlotPoints]//N, dt = (tmax-tmin)/OptionValue[PlotPoints]//N }, { raw := Table[ f /. {xs -> j, ys -> i, ts -> time} // N, {i, ymin, ymax, (ymax - ymin)/(pts - 1)}, {j, xmin, xmax, (xmax - xmin)/(pts - 1)}] }, time = tmin; buffer = Map[cf, raw // Rescale, {2}]; Graphics[{ Raster[buffer//Offload, {{xmin, xmax}, {ymin, ymax}}], EventHandler[AnimationFrameListener[buffer//Offload], Function[Null, buffer = Map[cf, raw // Rescale, {2}]; time = If[time >= tmax, tmin, time + dt]; ]] }, Frame->True] ] Options[rasterDensityPlotAnim] = {ColorFunction->"AvocadoColors", PlotPoints->100}; ``` ```wolfram rasterDensityPlotAnim[x Sin[y+t], {x, -5, 5}, {y, 0, 10}, {t, 0, 2Pi}, PlotPoints->50] ``` Using `NumericArray` may improve the performance # Rectangle ```wolfram Rectangle[{xmin_, ymin_}, {xmax_, ymax_}, opts___] ``` represents a basic rectangle ```wolfram Graphics[{Red, Rectangle[{0, 0}], Blue, Rectangle[{0.5, 0.5}]}] ``` Options [#options] RoundingRadius [#roundingradius] Accepts `_Real | _Integer` or a list of values for X and Y rounding. By the default is `0`. It uses printer points. Parameters [#parameters] RGBColor [#rgbcolor] filling color EdgeForm [#edgeform] stroke color Opacity [#opacity] global opacity of an object Methods [#methods] Area [#area] Calculates total area (symbolically as well) ```wolfram Area[Rectangle[{x1, y1}, {x2, y2}]] ``` RegionCentroid [#regioncentroid] ```wolfram RegionCentroid[Rectangle[{x1, y1}, {x2, y2}]] ``` EventHandler [#eventhandler] One can listen to a several events produced by this primitive using [`EventHandler`](../Misc/Events) ```wolfram EventHandler[t_Rectangle, {event_ -> handler_, ...}] ``` where `event` can be * `"mousemove"` detects and sends coordinates of a mouse, when it is over this element * `"drag"` makes primitive draggable and emits coordinates * `"zoom"` detects zoom / mouse-wheel * `"click"` detects mouse clicks Transitions and updates [#transitions-and-updates] It fully supports updates. Use [Offload](../Interpreter/Offload) on coordinates. Example [#example] A simple bar chart ```wolfram data = RandomReal[{3, 10}, {10, 2}]; Graphics[{ EdgeForm[Black], Blue, Table[{Blue, Rectangle[{i - .4, 0}, {i, data[[i, 1]]}], Red, Rectangle[{i + .4, 0}, {i, data[[i, 2]]}]}, {i, 10}] }, Frame -> True] ``` # Rotate ```wolfram Rotate[g_, angle_Real] ``` rotates graphics primitive or list of primitives `g` by `angle` ```wolfram Rotate[g_, angle_Real, origin_List] ``` rotates around `origin` ```wolfram Graphics[Rotate[Rectangle[{-1,-1}, {1,1}], 30 Degree]] ``` Transitions and updates [#transitions-and-updates] It support updates for `angle` variable. Graphics primitives `g` can be updated separately. `Rotate` only applies transformation on `g`. ```wolfram EventHandler[InputRange[0, 2.0 Pi, 0.1], Function[a, angle = a ]] % // EventFire; Graphics[Rotate[Rectangle[{-1,-1}, {1,1}], angle // Offload]] ``` # SVGAttribute Allows to directly set SVG attribute to a 2D graphics object ```wolfram SVGAttribute[object_, "name"->"value"] ``` **Please see the SVG** [docs](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute) for all possible attributes. In principle it should work with most 2D primitives, since all of them are SVG elements. Example [#example] If we want a dashed line ```wolfram Graphics[ SVGAttribute[ Line[{{-1,-1}, {1,1}}] , "stroke-dasharray"->"3"] ] ``` Make it blurry ```wolfram Graphics[ SVGAttribute[ SVGGroup[{ Red, Disk[{0,0}, 0.5], Blue, Line[{{-1,-1}, {1,1}}] }] , "style"->"filter: blur(10px)"] ] ``` # SVGGroup ```wolfram SVGGroup[g_] ``` represents an isolated group of 2D graphics primitives (see [Graphics](../Graphics/Graphics)). The common use case is to reset all attributes like [RGBColor](../Graphics/RGBColor), [Opacity](../Graphics/Opacity) and the rest defined in [Directive](../Graphics/Directive). Another handy property is that external attributes are applied solely to the group container, i.e. **it does not propagate deeper**. For example ```wolfram o = 0.5; {Opacity[o // Offload], SVGGroup[{ Disk[{0,0}, 2], Opacity[0.5], Red, RegularPolygon[3] }]} // Graphics ``` ```wolfram o = 0.1; ``` Here `Opacity` is applied to a container, but does not affect opacity of inner objects. Z-ordering [#z-ordering] If you dynamically add primitives to [Graphics](../Graphics/Graphics), by adding them to `SVGGroup` can help you to control z-order with respect to other groups. # Scale ```wolfram Scale[g_, scale_] ``` ```wolfram Scale[g_, scale_, center_List] ``` scales graphics primitive `g` by `scale` # Scaled ```wolfram Scaled[{xA, yA}] ``` represents scaled coordinates from `0` to `1` relative to the plot range of the [Graphics](../Graphics/Graphics) expression (even if it is `Automatic`). ```wolfram Scaled[{xD, yD}, {x0, y0}] ``` uses `x0`, `y0` as normal coordinates and adds offset in absolute `xD` and `yD`. It can be used as part of coordinates for various primitives such as [Text](../Graphics/Text), [Line](../Graphics/Line), [Point](../Graphics/Point), [Disk](../Graphics/Disk) and etc. # Show Only partially supported [wljs-graphics-d3](https://github.com/JerryI/wljs-graphics-d3) for now ```wolfram Show[g1_Graphics, g2_Graphics] _Graphics ``` combines two or more [Graphics](../Graphics/Graphics) objects Example [#example] Plot a histogram and a 2D graph ```wolfram data = RandomVariate[GammaDistribution[4, 12.5], 10^4]; hist = Histogram[data, Automatic, "ProbabilityDensity"]; pl = Plot[PDF[GammaDistribution[4, 12.5], x], {x, 0, 200}]; ``` Show them overlayed ```wolfram Show[hist, pl] ``` # StadiumShape ```wolfram StadiumShape[{{x1,y1}, {x2,y2}}, r] ``` represents a bond-like shape connecting two points defined with `xn`, `yn`. The rounding radius must be provided as `r` # Style A wrapper that can be used for [`Text`](../Graphics/Text) . The following options can be provided * `FontSize -> _Integer` - 10, 12, 14... * `FontFamily -> _String` - this is basically an SVG attribute, please see [here](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/font-family). If you have imported any font using CSS, you can also use it. See more examples @ [Text](../Graphics/Text) See also [Style](../Formatting/Style) as decoration # Text Represents an arbitrary text label placed as a [Graphics](../Graphics/Graphics) object ```wolfram Text["String", {0,0}] ``` numerical (real and complex) symbolic expressions are rendered as in the editor ```wolfram Text[1/Sqrt[2], {0,0}] ``` ```wolfram Text[Exp[2 I], {0,0}] ``` Supports styling such as `Style` and `Directive`, i.e. ```wolfram Graphics[{ Text[Style["Hello World", FontSize->14], {0,0}] }] ``` Styling options [#styling-options] The following options can be provided to [`Style`](../Graphics/Style) wrapper * `FontSize->Number` - 10, 12, 14... * `Bold` * `FontFamily->String` - this is basically an SVG attribute, please see [here](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/font-family). If you have imported any font using CSS, you can also use it. To change the color, just put in somewhere to the list ```wolfram Graphics[{ Red, Text["Hello World", {0,0}] }] ``` Methods [#methods] EventHandler [#eventhandler] One can listen to a several events produced by this primitive using [`EventHandler`](../Misc/Events) ```wolfram EventHandler[t_Text, {event_ -> handler_, ...}] ``` where `event` can be * `"mousemove"` detects and sends coordinates of a mouse, when it is over this element * `"drag"` makes primitive draggable and emits coordinates * `"zoom"` detects zoom / mouse-wheel * `"click"` detects mouse clicks Transitions and updates [#transitions-and-updates] Only strings, reals numbers or integers are supported For both the position and text content updates are supported ```wolfram txt = RandomWord[]; pos = {0,0}; Graphics[{ Red, Text[txt // Offload, pos // Offload] }] ``` ```wolfram task = SetInterval[With[{}, txt = RandomWord[]; pos = RandomReal[{-1,1}, 2]; ], 500]; SetTimeout[TaskRemove[task], 5000]; ``` use `TaskRemove[task];` **to stop an animation** Math support [#math-support] You can use **a limited Latex-math kinda mode**, that we implemented instead of full `Boxes` support as it was done in Mathematica, since it might slow down the system a lot ```wolfram Text["wavenumber (cm^{-1})", {0,0}] Text["\\alpha (cm^{-1})", {0,0}] ``` A list of features * most used Greek symbols like `alpha` and etc are supported * subscript `a_1` or `a_{hi}` * superscript `a^2` or `a^{23}` In principle, it will anyway ends up in HTML, therefore one can use any special symbol ```wolfram "I will display ❌" ``` Wolfram Language special characters [#wolfram-language-special-characters] It does support some of the WL's characters like `\[Alpha]` and others, which are compatible with unicode table ``` Text["\[Omega] (THz)", {0,0}] ``` # ToColor `ToColor[color, form]` converts color to form if form is GrayLevel, RGBColor or CMYKColor. Otherwise form\[color] is evaluated and the result is expected to be a valid color directive. Examples [#examples] Convert to RGB: ```wolfram ToColor[Hue[0.5], RGBColor] ``` Convert to grayscale: ```wolfram ToColor[Red, GrayLevel] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToColor.html) for more details. # TransitionDuration acts as an option and a context modifier for [Graphics](../Graphics/Graphics) that tells the transition duration for graphics primitives (coordinate changes, and etc) once one of dependencies has been updated **global** ```wolfram Graphics[..., "TransitionDuration"->timems_Integer] ``` **local** ```wolfram Graphics[{Directive["TransitionDuration"->timems_Integer], ...}] ``` Value `timems` is **in milliseconds**. # TransitionType acts as an option and a context modifier for [Graphics](../Graphics/Graphics) that tells the transition function for graphics primitives (coordinate changes, and etc) once one of dependencies has been updated **global** ```wolfram Graphics[..., "TransitionType"->type_String] ``` **local** ```wolfram Graphics[{Directive["TransitionType"->type_String], ...}] ``` Types [#types] "Linear" [#linear] "CubicInOut" [#cubicinout] None [#none] No transition. Works best for fast animation Example [#example] Let us see how it works with a moving object ```wolfram title="cell 1" object = {-1.,0.}; Graphics[{ {Directive["TransitionType" -> "Linear"], Disk[(object + {0,0.5}) // Offload, 0.2]}, {Directive["TransitionType" -> "CubicInOut"], Disk[(object - {0,0}) // Offload, 0.2]}, {Directive["TransitionType" -> None], Disk[(object - {0,0.5}) // Offload, 0.2]} }, PlotRange->{{-1,1}, {-1,1.5}}, "TransitionDuration"->500] ``` and then in the next cell ```wolfram object = {1.,0}; ``` # Translate ```wolfram Translate[g_, pos_List | _Offload] ``` translates graphics primitive by `pos` Transitions and updates [#transitions-and-updates] `pos` argument does support updates. Use [Offload](../Interpreter/Offload) # ZoomAt ```wolfram ZoomAt[k_, position_:{width/2,height/2}] ``` zooms `k` times at the given position `position` (in the coordinate system of the plot). `position` defines the center of view. This has to be called inside the instance of [Graphics](../Graphics/Graphics) using [FrontSubmit](../Frontend-IO/FrontSubmit) *All transition effects are applied here as well* Example [#example] Let us make a simple plot and reference it using [FrontInstanceReference](../Frontend-IO/FrontInstanceReference) ```wolfram ref = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{ref}] ``` now we can zoom it ```wolfram FrontSubmit[ZoomAt[1.2, {0.5,0.5}], ref] ``` # AbsoluteThickness ```wolfram AbsoluteThickness[thick_Real] ``` defines an thickness or various 3D primitives such as [Arrow](../Graphics3D/Arrow), [Line](../Graphics3D/Line) and etc # AnimationFrameListener the same as for [AnimationFrameListener](../Graphics/AnimationFrameListener), but in the context of 3D graphics # Arrow draws an arrow connected with a line ```wolfram Arrow[pts_List] ``` Parameters [#parameters] Thickness or AbsoluteThickness [#thickness-or-absolutethickness] controls the width of a stroke RGBColor [#rgbcolor] controls color of a stroke Example [#example] Simple broken line with an arrow on the end ```wolfram Graphics3D[Arrow[{{1, 1, -1}, {2, 2, 0}, {3, 3, -1}, {4, 4, 0}}]] ``` Dynamic updates [#dynamic-updates] It does support updates. Use [Offload](../Interpreter/Offload) Changing the length of an array of points is not supported! # Arrowheads ```wolfram Arrowheads[size_] ``` or ```wolfram Arrowheads[size_, heightOffset_] ``` defines the size of an arrow head and its position with respect to the parent line # Cuboid ```wolfram Cuboid[pmin_, pmax_] ``` draws a hypercube from `pmin` to `pmax` ```wolfram Graphics3D[ Table[{EdgeForm[Opacity[.3]], Hue[RandomReal[], 1, 0.5], Cuboid[RandomReal[4, 3]]}, {40}]] ``` Transitions and updates [#transitions-and-updates] Fully supports. Use `Offload` # Custom shader materials Using shared libraries and [WLJS Functions](frontend/Advanced/Frontend%20interpretation/WLJS%20Functions) one can define a custom vertex / fragment shaders to be used by [Graphics3D](../Graphics3D/Graphics3D) primitives. *Adapted example from [DEV.io](https://dev.to/maniflames/creating-a-custom-shader-in-threejs-3bhi)* ```js title="Javascript cell" .js function vertexShader() { return ` varying vec3 vUv; void main() { vUv = position; vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * modelViewPosition; } `; } function fragmentShader() { return ` uniform vec3 colorA; uniform vec3 colorB; varying vec3 vUv; void main() { gl_FragColor = vec4(mix(colorA, colorB, vUv.z), 1.0); } `; } let THREE; interpretate.shared.THREE.load().then(() => { THREE = interpretate.shared.THREE.THREE; }) core.CustomMaterial = async (args, env) => { let uniforms = { colorB: {type: 'vec3', value: new THREE.Color(0xACB6E5)}, colorA: {type: 'vec3', value: new THREE.Color(0x74ebd5)} } return (function() { return new THREE.ShaderMaterial({ uniforms: uniforms, fragmentShader: fragmentShader(), vertexShader: vertexShader(), }); }) } ``` Now hook it up to some basic graphics primitives ```wolfram title="WL cell" Graphics3D[{ Translate[PolyhedronData["Dodecahedron"][[1]]//N , {-2,-3,0}], MeshMaterial[CustomMaterial[]], Translate[PolyhedronData["Dodecahedron"][[1]]//N , {2,3,0}] }] ``` # Cylinder ```wolfram Cylinder[{i_List, f_List}] ``` represents a cylinder with a radius 1 ```wolfram Cylinder[{i_List, f_List}, r_] ``` represents a cylinder with a radius `r` ```wolfram Graphics3D[ Table[{Hue[RandomReal[], 1., 0.5], Cylinder[RandomReal[10, {2, 3}]]}, {20}]] ``` Parameters [#parameters] RGBColor [#rgbcolor] Methods [#methods] Volume and centroid Volume [#volume] accepts symbolic values as well ```wolfram Volume[Cylinder[{{Subscript[x, 1], Subscript[y, 1], Subscript[z, 1]}, {Subscript[x, 2], Subscript[y, 2], Subscript[z, 2]}}, r]] ``` RegionCentroid [#regioncentroid] ```wolfram RegionCentroid[ Cylinder[{{Subscript[x, 1], Subscript[y, 1], Subscript[z, 1]}, {Subscript[x, 2], Subscript[y, 2], Subscript[z, 2]}}, r]] ``` Transitions and updates [#transitions-and-updates] It does support updates for coordinates. Radius changes are not implemented! # DirectionalLight ```wolfram DirectionalLight[color_RGBColor, opts___] DirectionalLight[color_RGBColor, position_, opts___] DirectionalLight[color_RGBColor, {position_, target_}, opts___] ``` places a fake source of directional light in a 3D scene (see [Graphics3D](../Graphics3D/Graphics3D)). The default `target` is $\{0,0,0\}$. Options [#options] "Intensity" [#intensity] By the default is 10 "ShadowBias" [#shadowbias] "ShadowMapSize" [#shadowmapsize] See THREE.js docs Transitions and updates [#transitions-and-updates] `position` and `target` do support updates # Directive Used for styling plots or 3D graphics primitives ```wolfram Directive[directives___, opts___Rule] ``` Directives [#directives] _RGBColor [#_rgbcolor] Set the working color Options [#options] FontSize [#fontsize] FontFamily [#fontfamily] "Color" [#color] Accepts `_RGBColor` "Emissive" [#emissive] Accepts `_RGBColor` "EmissiveIntensity" [#emissiveintensity] Accepts `_Real` from 0 to 1 "Roughness" [#roughness] Accepts `_Real` from 0 to 1 "Metalness" [#metalness] Accepts `_Real` from 0 to 1 "Ior" [#ior] Accepts `_Real` from 0 to 100 "Transmission" [#transmission] Accepts `_Real` from 0 to 1 "Thinfilm" [#thinfilm] "MaterialThickness" [#materialthickness] "Attenuationcolor" [#attenuationcolor] Accepts `_RGBColor` "AttenuationDistance" [#attenuationdistance] "Opacity" [#opacity] Accepts `_Real` from 0 to 1 "Clearcoat" [#clearcoat] "ClearcoatRoughness" [#clearcoatroughness] "SheenColor" [#sheencolor] "SheenRoughness" [#sheenroughness] "Iridescence" [#iridescence] "IridescenceIor" [#iridescenceior] "IridescenceThickness" [#iridescencethickness] "Specularcolor" [#specularcolor] Accepts `_RGBColor` "SpecularIntensity" [#specularintensity] "Matte" [#matte] "Flatshading" [#flatshading] "Castshadow" [#castshadow] # Emissive It is considered to be removed. Please use [Directive](../Graphics3D/Directive) instead specifies weather the material emits light ```wolfram Emissive[color_RGBColor, intensity_:10] ``` example ```wolfram Graphics3D[{ {Emissive[Red], Sphere[{0,0,2}]}, {White, Sphere[]} }] ``` The best looking results can be achieved in a **Path-tracing mode** of [Graphics3D](../Graphics3D/Graphics3D). Emissive materials cannot cast light to other objects in a normal rasterization mode, use artificial light sources such as [SpotLight](../Graphics3D/SpotLight) and [PointLight](../Graphics3D/PointLight)... # GeometricTransformation ```wolfram GeometricTransformation[object_, matrix3x3_List] ``` applies **general** `matrix3x3` to each vertex of an `object`, i.e. replacing each point `p` by `matrix3x3.p` ```wolfram GeometricTransformation[object_, vector3_List] ``` applies **translation** `vector3` to each vertex of an `object` ```wolfram GeometricTransformation[object_, {matrix3_List, vector3_List}] ``` applies **transformation matrix and translation** operation `matrix3.p + vector3` `object` can be nested or group of graphics primitives as well Examples [#examples] ```wolfram Graphics3D[ GeometricTransformation[Sphere[], N@ShearingMatrix[2, {1,1,1}, {1,1,0}]] ] ``` Numerical matrixes are usually faster. Use `N` to get pure numbers Or more complicated one ```wolfram Graphics3D[ GeometricTransformation[Cuboid[{0, 0, 0}, {1.5, 1.5, .2}], Table[{RotationMatrix[a, {0, 0, 1}], {Cos[a], Sin[a], a}}, {a, 0, 4 Pi, .2}]], Boxed -> False] ``` Transitions and updates [#transitions-and-updates] It fully supports updates. See example ```wolfram title="cell 1" rot = RotationMatrix[45 Degree, {0, 0, 1}]; stair = GeometricTransformation[Cuboid[{0, 0, 0}, {1.5, 1.5, .2}], Table[{RotationMatrix[a, {0, 0, 1}], {Cos[a], Sin[a], a}}, {a, 0, 4 Pi, .2}]]; Graphics3D[GeometricTransformation[stair, rot // Offload], Boxed -> False] ``` ```wolfram title="cell 2" EventHandler[InputRange[0, 180.0 Degree, 1.0 Degree], Function[angle, rot = RotationMatrix[angle,{0, 0, 1}]]] ``` The result is following # Graphics3D ```wolfram Graphics3D[{primitives__}, opts___] ``` represents 3D graphical image. Use lines, polygons, cylinders, spheres, etc. to build up a 3D graphics scene ```wolfram Graphics3D[{Blue, Cylinder[], Red, Sphere[{0, 0, 2}], Black, Thick, Line[{{-2, 0, 2}, {2, 0, 2}, {0, 0, 4}, {-2, 0, 2}}], Yellow, Polygon[{{-3, -3, -2}, {-3, 3, -2}, {3, 3, -2}, {3, -3, -2}}], Green, Opacity[.3], Cuboid[{-2, -2, -2}, {2, 2, -1}]}] ``` ``` (*VB[*)(Null)(*,*)(*"1:eJx9UlsOgjAQrIjPeAnP4AFMxIQfEo16AcQWGgklLZpwTs8juttGAhbox6Td2c7Obru+ihMbEULUEsCXYZ7wSG32bIUxFyDgqmBjPM0BTv7OE6mQHPbEAN42EpjglSnPblQyxxb4nRqXP7B6Sa1slx7VCaQuPQU45wmVtFfNqZMXptUyoE+aNkQwfoH+7xlVSk1QIpQxNaRRzChzBxqroJ1GtTbptK30+XRtskvWHkk9F2N4BnAUaRmLbNDzG8U1VPZj6DiGukgdHyT/ZO0f1OH5kIcRL0q50eu1NT8JH9h7XAW/dc2m6rHv/GamP9oXrC+y0w=="*)(*]VB*) ``` Use plot functions to automatically create [Graphics3D](../Graphics3D/Graphics3D) from different types of data ```wolfram Plot3D[Sin[x y], {x, 0, 3}, {y, 0, 3}, ColorFunction -> "Rainbow", Mesh -> None] ``` Options [#options] ImageSize [#imagesize] Accepts `_Integer` or `{width_Integer, height_Interger}` Lighting [#lighting] Default is `True`. It sets the default ambient lighting Background [#background] Defines background color, by the default it is transparent ViewPoint [#viewpoint] ViewProjection [#viewprojection] Sets the default camera for the scene. Default value is `"Orthographic"` * `"Orthographic"` * `"Perspective"` Boxed [#boxed] Draws a wireframe box around the objects in the scene. Default is `False`. BoxRatios [#boxratios] Sets the 3D aspect ratio of the whole scene. By the default [Graphics3D](../Graphics3D/Graphics3D) does not rescale the scene. It accepts `{sx_Real, sy_Real, sz_Real}`, where `sx` are real positive numbers. "SleepAfter" [#sleepafter] Stops rendering after N milliseconds (`1000` by the default). The rendering process can be wake up by any changes in camera or scene objects. "Renderer" [#renderer] Sets the rendering engine * `"Rasterization"` **default** * `"PathTracing"` photorealistic images (high computing load to GPU). "Lightmap" [#lightmap] Sets an URL to an HDR light-map. **Currently only remote sources are supported**. "AcesToneMapping" [#acestonemapping] By the default is `False` "BackgroundAlpha" [#backgroundalpha] Sets the transparency of the background. By the default is `0` Options for "PathTracing" [#options-for-pathtracing] If [`"Renderer"`](#`"Renderer"`) is set to a photorealistic one, there are more options available to choose from "Bounces" [#bounces] Number of bounces for a ray (default is `5`) "FadeDuration" [#fadeduration] If there not enough samples, the renderer falls back to the rasterization and slowly fades into a low-res texture generated by a path-tracer. The default is `300` (milliseconds) "RenderDelay" [#renderdelay] Delay the path-tracer. The default is `100` "MinSamples" [#minsamples] The default is `5` "MultipleImportanceSampling" [#multipleimportancesampling] By the default is `False`. Set to `True` to work with [MeshFogMaterial](../Graphics3D/MeshFogMaterial), [PointLight](../Graphics3D/PointLight) and [SpotLight](../Graphics3D/SpotLight) primitives. "SamplesPerFrame" [#samplesperframe] The default is `1` "EnvironmentIntensity" [#environmentintensity] The artificial ambient lighting intensity. The default is `1` Mathematica's native renderer [#mathematicas-native-renderer] Using [MMAView](../GUI/MMAView), you can bypass the WLJS pipeline and directly render an expression as it would appear in Wolfram Mathematica **keeping interactivity intact for 3D plots** ```wolfram With[{p = Plot3D[f[x] y, {x,0,10}, {y,0,10}]}, MMAView[p] ] ``` Note, that it is important to pass it using `With`, since `MMAView` has `HoldFirst` attribute. Otherwise the direct pass will give your a static plot Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # GraphicsComplex ```wolfram GraphicsComplex[data_List, primitives_, opts___] ``` represents an efficient graphics structure for drawing complex 3D objects (or 2D - see [GraphicsComplex](../Graphics/GraphicsComplex)) storing vertices data in `data` variable. It replaces indexes found in `primitives` (can be nested) with a corresponding vertices and colors (if specified) Most plotting functions such as [ListPlot3D](../Plotting-Functions/ListPlot3D) and others use this way showing 3D graphics. The implementation of [GraphicsComplex](../Graphics3D/GraphicsComplex) is based on a low-level THREE.js buffer position [attribute](https://threejs.org/docs/#api/en/core/BufferAttribute) directly written to a GPU memory. Supported primitives [#supported-primitives] Line [#line] No restrictions ```wolfram v = PolyhedronData["Dodecahedron", "Vertices"] // N; i = PolyhedronData["Dodecahedron", "FaceIndices"]; ``` ```wolfram GraphicsComplex[v, {Black, Line[i]}] // Graphics3D ``` Polygon [#polygon] Triangles works faster than quads or pentagons ```wolfram GraphicsComplex[v, Polygon[i]] // Graphics3D ``` Non-indexed geometry [#non-indexed-geometry] One can provide only the ranges for the triangles to be rendered ```wolfram GraphicsComplex[v, Polygon[1, Length[v]]] // Graphics3D ``` it assumes you are using triangles Point [#point] Sphere [#sphere] Tube [#tube] Options [#options] "VertexColors" [#vertexcolors] Defines sets of colors used for shading vertices `"VertexColors"` is a plain list which must have the following form ```wolfram "VertexColors" ->{{r1,g1,b1}, {r2,g2,b2}, ...} ``` *Supports updates* "VertexNormals" [#vertexnormals] Defines sets of normals used for shading *Supports updates* "VertexFence" [#vertexfence] Defaults to `False`. When enabled, it sets an update barrier for all dependent primitives, ensuring they update their data **only after** the vertex data has been updated. This helps prevent desynchronization issues where the vertex buffer updates lag behind polygon or line indices (or vice versa), which can lead to visual artifacts and WebGL buffer errors. How to update things [#how-to-update-things] Fixed indexes, variable vertices [#fixed-indexes-variable-vertices] It does support updates for vertices data and colors. Use [Offload](../Interpreter/Offload) wrapper. ```wolfram title="cell 1" (* generate mesh *) proc = HardcorePointProcess[50, 0.5, 2]; reg = Rectangle[{-10, -10}, {10, 10}]; samples = RandomPointConfiguration[proc, reg]["Points"]; (* triangulate *) Needs["ComputationalGeometry`"]; triangles2[points_] := Module[{tr, triples}, tr = DelaunayTriangulation[points]; triples = Flatten[Function[{v, list}, Switch[Length[list], (* account for nodes with connectivity 2 or less *) 1, {}, 2, {Flatten[{v, list}]}, _, {v, ##} & @@@ Partition[list, 2, 1, {1, 1}] ] ] @@@ tr, 1]; Cases[GatherBy[triples, Sort], a_ /; Length[a] == 3 :> a[[1]]]] triangles = triangles2[samples]; (* sample function *) f[p_, {x_,y_,z_}] := z Exp[-(*FB[*)(((*SpB[*)Power[Norm[p - {x,y}](*|*),(*|*)2](*]SpB*))(*,*)/(*,*)(2.))(*]FB*)] (* initial data *) probe = {#[[1]], #[[2]], f[#, {10, 0, 0}]} &/@ samples // Chop; colors = With[{mm = MinMax[probe[[All,3]]]}, (Blend[{{mm[[1]], Blue}, {mm[[2]], Red}}, #[[3]]] )&/@ probe /. {RGBColor -> List} // Chop]; ``` ```wolfram title="cell 2" Graphics3D[{ GraphicsComplex[probe // Offload, {Polygon[triangles]}, "VertexColors"->Offload[colors]], EventHandler[Sphere[{0,0,0}, 0.1], {"transform"->Function[data, With[{pos = data["position"]}, probe = {#[[1]], #[[2]], f[#, pos]} &/@ samples // Chop; colors = With[{mm = MinMax[probe[[All,3]]]}, (Blend[{{mm[[1]], Blue}, {mm[[2]], Red}}, #[[3]]] )&/@ probe /. {RGBColor -> List} // Chop]; ]]}] }] ``` The result is interactive 3D plot Or the variation of it, if we add a point light source ```wolfram light = {0,0,0}; Graphics3D[{ GraphicsComplex[probe // Offload, {Polygon[triangles]}], PointLight[Red, light // Offload], EventHandler[Sphere[{0,0,0}, 0.1], {"transform"->Function[data, With[{pos = data["position"]}, probe = {#[[1]], #[[2]], f[#, pos]} &/@ samples // Chop; light = pos; ]]}] }] ``` Update indexes and vertices [#update-indexes-and-vertices] For more complicated example you can update both. Here is an example with dynamic adapter for `ParametericPlot3D` *define shapes* ```wolfram title="cell 1" sample[t_] := With[{ complex = ParametricPlot3D[ (1 - t) * { (2 + Cos[v]) * Cos[u], (2 + Cos[v]) * Sin[u], Sin[v] } + t * { 1.16^v * Cos[v] * (1 + Cos[u]), -1.16^v * Sin[v] * (1 + Cos[u]), -2 * 1.16^v * (1 + Sin[u]) + 1.0 }, {u, 0, 2\[Pi]}, {v, -\[Pi], \[Pi]}, MaxRecursion -> 2, Mesh -> None ][[1, 1]] }, { complex[[1]], Cases[complex[[2]], _Polygon, 6] // First // First, complex[[3, 2]] } ] ``` now construct the scene ```wolfram Module[{ VerticesAndNormals = {{}, {}}, indices = {} }, { EventHandler[InputRange[0,1,0.1,0], Function[value, With[{res = sample[value]}, indices = res[[2]]; VerticesAndNormals = {res[[1]], res[[3]]}; ]; ]], With[{res = sample[0.0]}, indices = res[[2]]; VerticesAndNormals = {res[[1]], res[[3]]}; ]; Graphics3D[{ SpotLight[Red, 5 {1,1,1}], SpotLight[Blue, 5 {-1,-1,1}], SpotLight[Green, 5 {1,-1,1}], PointLight[Magenta, {10,10,10}], GraphicsComplex[Offload[VerticesAndNormals[[1]]], { Polygon[Offload[indices]] }, VertexNormals->Offload[VerticesAndNormals[[2]]], "VertexFence"->True] }, Lighting->None] } // Column // Panel ] ``` Pack normals, vertices and colors to a single symbol. This will help to avoid data races. `"VertexFence"` indeed eliminates races with indices, but it is helpless against mutations of `GraphicsComplex` attributes. Non-indexed geometry [#non-indexed-geometry-1] This is a another mode of working with [Non-indexed geometry](#Non-indexed%20geometry) in `Polygon`. The benefit of this approach, you can use fixed length buffer for vertices and limit your drawing range using two arguments of Polygon. # GraphicsGroup makes a group for graphics primitives ```wolfram GraphicsGroup[p_] ``` by creating a separate mesh # HemisphereLight ```wolfram HemisphereLight[skyColor_RGBColor, groundColor_RGBColor, intensity_] ``` defines a fake hemisphere ambient light # Hue same as [Hue](../Graphics/Hue), but for `Graphics3D` primitives # Inset ```wolfram Inset[expr_, opts___] ``` ```wolfram Inset[expr_, pos_List, opts___] ``` a graphics object, that allows to put inset [Graphics](../Graphics/Graphics), [Image](../Image/Image), [EditorView](../GUI/EditorView), [CellView](../GUI/CellView) or **anything else** on the 3D scene. Parameters: * `pos` has to be a 3D vector, that specifies the position of the inset in the local coordination system Options [#options] ImageSizeRaw [#imagesizeraw] Sets the raw size in pixels `{width, height}` of the container for the inner object. It sometimes comes handy when it fails to automatically guess the required size Transitions and updates [#transitions-and-updates] The second arguments `pos` that specifies the position of an inset does support updates. # Line ```wolfram Line[{{x1_,y1_,z1_}, ..., {xn_, yn_, zn_}} | indexes_List] ``` represents a line in 3D space. ```wolfram Graphics3D[{Black,Line[{{1, 1, -1}, {2, 2, 1}, {3, 3, -1}, {4, 4, 1}}]}] ``` Parameters [#parameters] RGBColor [#rgbcolor] AbsoluteThickness [#absolutethickness] Indexed geometry [#indexed-geometry] The most efficient way of using [Line](../Graphics3D/Line) for many vertices is to wrap it into [GraphicsComplex](../Graphics3D/GraphicsComplex). It provides the list of vertices as a separate list, while `Line` contains only the indexes for a line ```wolfram v = PolyhedronData["Dodecahedron", "Vertices"] // N; i = PolyhedronData["Dodecahedron", "FaceIndices"]; GraphicsComplex[v, {Black, Line[i]}] // Graphics3D ``` Dynamic updates [#dynamic-updates] It does support updates. Use [Offload](../Interpreter/Offload) Updates of geometry using [GraphicsComplex](../Graphics3D/GraphicsComplex) is more efficient for many vertices Changing the length of an array of points is not supported! # Materials ```wolfram Graphics3D`Materials[name_String] ``` A set of prebuilt materials using [MeshPhysicalMaterial](../Graphics3D/MeshPhysicalMaterial) and [Directive](../Graphics3D/Directive) to be used in [Graphics3D](../Graphics3D/Graphics3D) Set [#set] "Glass" [#glass] Example ```wolfram Plot3D[Sin[x] Cos[y], {x,-10,10}, {y,-10,10}][[1]]; Graphics3D[{%, Graphics3D`Materials["Glass"], Sphere[{0,0,2}, 4]}, "Renderer"->"PathTracing", ImageSize->600] ``` "Iridescent" [#iridescent] Example ```wolfram Plot3D[Sin[x] Cos[y], {x,-10,10}, {y,-10,10}][[1]]; Graphics3D[{%, Graphics3D`Materials["Iridescent"], Sphere[{0,0,2}, 4]}, "Renderer"->"PathTracing", ImageSize->600] ``` # MeshFogMaterial Works only with `"Renderer"->"PathTracing"` in [Graphics3D](../Graphics3D/Graphics3D) defines a material for volumetric fog effect in [MeshMaterial](../Graphics3D/MeshMaterial) ```wolfram MeshFogMaterial[density_:0.01] ``` Enable `"MultipleImportanceSampling"` Example [#example] Define a sphere-fog and place a [SpotLight](../Graphics3D/SpotLight) to light it up from below ```wolfram Graphics3D[{ {MeshMaterial[MeshFogMaterial[0.1]], Sphere[{0,0,0},5]}, {Red, Sphere[{0,0,0}, 1]}, {SpotLight[White, -{5,5,5}]} }, "Renderer"->"PathTracing", Background->Black, "Lighting"->None, "MultipleImportanceSampling"->True] ``` # MeshLambertMaterial ```wolfram MeshLambertMaterial[] ``` A simplified Lambert model for lighting # MeshMaterial ```wolfram MeshMaterial[material_] ``` specifies the material used for 3D lighting in [Graphics3D](../Graphics3D/Graphics3D) **This is scope-type parameter** like [Opacity](../Graphics3D/Opacity), [RGBColor](../Graphics3D/RGBColor) and can be applied separately for each object. Materials [#materials] MeshPhysicalMaterial [#meshphysicalmaterial] MeshToonMaterial [#meshtoonmaterial] MeshFogMaterial [#meshfogmaterial] See more [MeshFogMaterial](../Graphics3D/MeshFogMaterial) # MeshPhongMaterial ```wolfram MeshPhongMaterial[] ``` A simplified Phong model for lighting # MeshPhysicalMaterial ```wolfram MeshPhysicalMaterial[] ``` a default material used in [MeshMaterial](../Graphics3D/MeshMaterial). The most accurate material, that can be parameterized with Roughness [#roughness] Emissive [#emissive] Metalness [#metalness] Example [#example] ```wolfram Graphics3D[{MeshMaterial[MeshPhysicalMaterial[]], Roughness[0], Sphere[], PointLight[Red, {1.5075, 4.1557, 2.6129}, "Intensity"->50], PointLight[Cyan, {-2.268, -2.144, 3.1635}, "Intensity"->50]}, "Lighting"->None] ``` # MeshToonMaterial ```wolfram MeshToonMaterial[] ``` uses lighting model for [MeshMaterial](../Graphics3D/MeshMaterial) to emulate cell-shading effect ```wolfram Graphics3D[{MeshMaterial[MeshToonMaterial[]], Roughness[0], Sphere[], PointLight[Red, {1.5075, 4.1557, 2.6129}, "Intensity"->50], PointLight[Cyan, {-2.268, -2.144, 3.1635}, "Intensity"->50]}, "Lighting"->None] ``` An effect comes better when used together with [SpotLight](../Graphics3D/SpotLight) and minimal ambient lighting # Metalness It is considered to be removed. Please use [Directive](../Graphics3D/Directive) instead specifies metallic property of a graphics primitive (see [MeshPhysicalMaterial](../Graphics3D/MeshPhysicalMaterial)) ```wolfram Metalness[i_Real] ``` where `i` can be between `0` and `1`. In real world it either `1` or `0`. An effect is more visible, when there is an HDR map is used **non-metallic** ```wolfram Graphics3D[{Metalness[0], Sphere[]}, "Lighting"->None, "Lightmap"->"https://raw.githubusercontent.com/JerryI/Mathematica-ThreeJS-graphics-engine/master/assets/PureSky.hdr"] ``` **metallic** ```wolfram Graphics3D[{Metalness[1], Sphere[]}, "Lighting"->None, "Lightmap"->"https://raw.githubusercontent.com/JerryI/Mathematica-ThreeJS-graphics-engine/master/assets/PureSky.hdr"] ``` **metallic and polished** ```wolfram Graphics3D[{Metalness[1], Roughness[0], Sphere[]}, "Lighting"->None, "Lightmap"->"https://raw.githubusercontent.com/JerryI/Mathematica-ThreeJS-graphics-engine/master/assets/PureSky.hdr"] ``` # Opacity same as [Opacity](../Graphics/Opacity), but for [Graphics3D](../Graphics3D/Graphics3D) # Point represents 3D point ```wolfram Point[{x,y,z}] ``` or set of points ```wolfram Point[p_List] ``` Parameters [#parameters] RGBColor [#rgbcolor] Opacity [#opacity] PointSize [#pointsize] Absolute size of a point can be altered using `PointSize` ```wolfram {PointSize[Small], Point[{1,1,1}]} ``` or in numbers ```wolfram {PointSize[0.01], Point[{1,1,1}]} ``` Indexed geometry [#indexed-geometry] The most efficient way of using it for constructing complex objects is to wrap it into [GraphicsComplex](../Graphics3D/GraphicsComplex) # PointLight ```wolfram PointLight[col_RGBColor, opts___] PointLight[col_RGBColor, position_, opts___] ``` represents an artificial point-light source at the given position and parameters provided by options ```wolfram Graphics3D[{Black,Polygon[ {{-5,5,-1}, {5,5,-1}, {5,-5,-1}, {-5,-5,-1}}], White, Cuboid[{-1,-1,-1}, {1,1,1}], PointLight[Red, {1.5075, 4.1557, 2.6129}, "Intensity"->100], PointLight[Cyan, {-2.4489, -1.9012, 2.8386}, "Intensity"->100]}, "Lighting"->None] ``` In the case of `"PathTracing"` renderer, point light can only work if `"MultipleImportanceSampling"` is enabled in the options of [Graphics3D](../Graphics3D/Graphics3D) Options [#options] "Intensity" [#intensity] An integer number in arbitrary units that sets the brightness of the source "Decay" [#decay] "ShadowBias" [#shadowbias] See THREE.js docs Transitions and updates [#transitions-and-updates] Only `position` field supports updates. # Polygon a 3D version of [Polygon](../Graphics/Polygon) used in [Graphics3D](../Graphics3D/Graphics3D) ```wolfram Polygon[vertices_List | {vertices__List} | faces_List] ``` represents a single or a list of polygons Types [#types] Triangle [#triangle] The most efficient one. It consists of 3 vertices ```wolfram pol = Polygon[{{1, 0, 0}, {1, 1, 1}, {0, 0, 1}}]; pol // Graphics3D ``` Quad [#quad] 4 vertices. It will be converted to the set of triangles on output Pentagon [#pentagon] 5 vertices. It will be converted to the set of triangles on output Parameters [#parameters] RGBColor [#rgbcolor] Opacity [#opacity] Indexed geometry [#indexed-geometry] The most efficient way of using [Polygon](../Graphics3D/Polygon) for constructing complex objects is to wrap it into [GraphicsComplex](../Graphics3D/GraphicsComplex). It provides the list of faces and colors of each vertex as separate lists, while `Polygon` contains only the indexes, which forms each polygon ```wolfram v = PolyhedronData["Dodecahedron", "Vertices"] // N; i = PolyhedronData["Dodecahedron", "FaceIndices"]; GraphicsComplex[v, Polygon[i]] // Graphics3D ``` Non-indexed geometry [#non-indexed-geometry] One can provide only the ranges for the triangles to be rendered ```wolfram GraphicsComplex[v, Polygon[1, Length[v]]] // Graphics3D ``` it assumes you are using triangles Dynamic updates [#dynamic-updates] It is possible only using [GraphicsComplex](../Graphics3D/GraphicsComplex) and keeping faces unchanged. # RGBColor same as [RGBColor](../Graphics/RGBColor) but for [Graphics3D](../Graphics3D/Graphics3D) # Roughness It is considered to be removed. Please use [Directive](../Graphics3D/Directive) instead sets roughness for the current material ```wolfram Roughness[i_Real] ``` where `i` is in the range of `0` and `1`. Examples [#examples] **rough material** ```wolfram Graphics3D[{White, Roughness[1], Sphere[], PointLight[Red, {-1,-3,3}]}] ``` **polished** ```wolfram Graphics3D[{White, Roughness[0], Sphere[], PointLight[Red, {-1,-3,3}]}] ``` # Shadows It is considered to be removed. Please use [Directive](../Graphics3D/Directive) instead ```wolfram Shadows[True | False] ``` a scoped parameter like [RGBColor](../Graphics3D/RGBColor) or [Opacity](../Graphics3D/Opacity), that determines if a light source can cast shadows or a primitive can receive shadows as well. See ```wolfram Graphics3D[{Shadows[shadow], ExampleData[{"Geometry3D","StanfordBunny"}][[1]], SpotLight[White, {{0., -0.4473, 0.4291}, {0,0,0}}, Pi/4], Polygon[ 0.01{{-20,20,-1}, {20,20,-1}, {20,-20,-1}, {-20,-20,-1}}]}, "Lighting"->None] /. {{shadow -> True}, {shadow -> False}} ``` # Sphere ```wolfram Sphere[c_List, radius_:1] ``` draws a sphere at coordinates `c` or list of spheres if the depth of `c` is 2. Parameters [#parameters] RGBColor [#rgbcolor] Opacity [#opacity] Roughness [#roughness] Metalness [#metalness] Emissive [#emissive] Methods [#methods] EventHandler [#eventhandler] One can listen to a several events produced by this primitive using [`EventHandler`](../Misc/Events) ```wolfram EventHandler[t_Sphere, {event_ -> handler_, ...}] ``` where `event` can be * `"transform"` makes primitive draggable and sends coordinates as association Transitions and updates [#transitions-and-updates] It supports updates even for multiple spheres ```wolfram title="cell 1" test = RandomReal[{-10,10}, {10, 3}]; Graphics3D[{Black, Sphere[Offload[test], 1]}] ``` and then try to update them ```wolfram test = RandomReal[{-10,10}, {10, 3}]; ``` the result will be following # SpotLight ```wolfram SpotLight[color_RGBColor, opts___] SpotLight[color_RGBColor, position_, opts___] SpotLight[color_RGBColor, {position_, target_}, opts___] SpotLight[color_RGBColor, {position_, target_}, angle_, opts___] ``` places a fake source of spot light in a 3D scene (see [Graphics3D](../Graphics3D/Graphics3D)). The default `target` is $\{0,0,0\}$. ```wolfram Graphics3D[{Shadows[True], Polygon[ {{-5,5,-1}, {5,5,-1}, {5,-5,-1}, {-5,-5,-1}}], White, Cuboid[{-1,-1,-1}, {1,1,1}], Directive["Shadows"->False], PointLight[Red, {1.5075, 4.1557, 2.6129}, "Intensity"->50], Directive["Shadows"->True], SpotLight[Cyan, {-2.268, -2.144, 3.1635}]}, "Lighting"->None] ``` For the best effect, use [Shadows](../Graphics3D/Shadows) set to `True` In the case of `"PathTracing"` renderer, spot light can only work properly if `"MultipleImportanceSampling"` is enabled in the options of [Graphics3D](../Graphics3D/Graphics3D) Options [#options] "Intensity" [#intensity] By the default is 100 "Decay" [#decay] "Penumbra" [#penumbra] "ShadowBias" [#shadowbias] "ShadowMapSize" [#shadowmapsize] See THREE.js docs Transitions and updates [#transitions-and-updates] `position` and `target` do support updates ```wolfram pos = {0,0,2}; handler = Function[data, pos = data]; KnotData[{"TorusKnot", {3, 5}}][[1]]; Graphics3D[{ Shadows[True], %, EventHandler[Sphere[pos, 0.1], {"drag" -> handler}], SpotLight[White, {Offload[pos], {0,0,0}}], Polygon[5{{-1,1,-1}, {1,1,-1}, {1,-1,-1}, {-1,-1,-1}}] }, "Lighting"->None, ImageSize->600] ``` # Tetrahedron ```wolfram Tetrahedron[{p1, p2, p3, p4}] ``` represents a polyhedron with 4 vertices ```wolfram Graphics3D[Tetrahedron[{{1, 1, 1}, {-1, -1, 1}, {1, -1, -1}, {-1, 1, -1}}]] ``` Parameters [#parameters] RGBColor [#rgbcolor] Methods [#methods] Volume [#volume] RegionCentroid [#regioncentroid] # Text Represents an arbitrary text label placed as a [Graphics3D](../Graphics3D/Graphics3D) object ```wolfram Text["String", {0,0,0}] ``` Supports styling such as `Style` and `Directive`, i.e. ```wolfram Graphics3D[{ Sphere[], Text[Style["Hello World", FontSize->24], {0,2, 0}] }] ``` Or using [Directive](../Graphics3D/Directive) ```wolfram Graphics3D[{ Directive[Red, FontSize->20], Text["Hey", {2,0}], Sphere[] }] ``` Styling options [#styling-options] The following options can be provided to [`Style`](../Graphics/Style) wrapper * `FontSize->Number` - 10, 12, 14... * `FontFamily->String` - this is basically an SVG attribute, please see [here](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/font-family). If you have imported any font using CSS, you can also use it. Dynamic updates [#dynamic-updates] For both the position and text content updates are supported ```wolfram txt = RandomWord[]; pos = {0,0, 1}; Graphics3D[{ Red, Sphere[], Text[txt // Offload, pos // Offload] }] ``` ```wolfram task = SetInterval[With[{}, txt = RandomWord[]; pos = RandomReal[{-1,1}, 3]; ], 500]; SetTimeout[TaskRemove[task], 5000]; ``` use `TaskRemove[task];` **to stop an animation** # Tube represents a 3D tube (acts similar to [Line](../Graphics3D/Line)) ```wolfram Tube[pts_List, radius_:1] ``` represents a 3D tube with variable radius per point in `pts` ```wolfram Tube[pts_List, radius_List] ``` Transitions and updates [#transitions-and-updates] Both `radius` and `pts` do support updates # AASTriangle `AASTriangle[α, β, a]` returns a filled triangle with angles α and β and side length a, where a is adjacent to one angle only. Example [#example] Create a triangle with angles of 30° and 60° and a side of length 2: ```wolfram Graphics[AASTriangle[30 Degree, 60 Degree, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AASTriangle.html) for more details. # ASATriangle `ASATriangle[α, c, β]` returns a filled triangle with angles α and β and side length c, where c is adjacent to both angles. Examples [#examples] Create a triangle with two angles and an included side: ```wolfram Graphics[ASATriangle[45 Degree, 2, 60 Degree]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ASATriangle.html) for more details. # AffineTransform `AffineTransform[m]` gives a `TransformationFunction` that represents an affine transform that maps r to m.r. `AffineTransform[{m, v}]` gives an affine transform that maps r to m.r + v. Examples [#examples] Create a scaling transformation: ```wolfram AffineTransform[{{2, 0}, {0, 2}}] ``` Create a transformation with translation: ```wolfram t = AffineTransform[{{{1, 0}, {0, 1}}, {1, 2}}]; t[{0, 0}] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AffineTransform.html) for more details. # AngleBisector `AngleBisector[{q1, p, q2}]` gives the bisector of the interior angle at p formed by the triangle with vertex points p, q1 and q2. `AngleBisector[{q1, p, q2}, "type"]` gives the angle bisector of the specified type. Examples [#examples] Find the angle bisector of a triangle: ```wolfram AngleBisector[{{0, 0}, {1, 0}, {0, 1}}] ``` Visualize with graphics: ```wolfram Graphics[{Triangle[{{0, 0}, {2, 0}, {1, 2}}], Red, AngleBisector[{{2, 0}, {0, 0}, {1, 2}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AngleBisector.html) for more details. # AugmentedPolyhedron `AugmentedPolyhedron[poly]` gives the augmented polyhedron poly by replacing each face by a pyramid. `AugmentedPolyhedron[poly, h]` gives the augmented polyhedron with a pyramid of height h. Examples [#examples] ```wolfram AugmentedPolyhedron[Tetrahedron[]] (* augmented tetrahedron *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AugmentedPolyhedron.html) for more details. # BSplineFunction `BSplineFunction[{pt1, pt2, ...}]` represents a B-spline function for a curve defined by the control points pti. `BSplineFunction[array]` represents a B-spline function for a surface or high-dimensional manifold. Examples [#examples] Create and evaluate a B-spline function: ```wolfram bf = BSplineFunction[{{0, 0}, {1, 2}, {2, 0}}]; bf[0.5] ``` Plot the curve: ```wolfram ParametricPlot[bf[t], {t, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BSplineFunction.html) for more details. # BSplineSurface `BSplineSurface[array]` is a graphics primitive that represents a nonuniform rational B-spline surface defined by an array of x,y,z control points. Examples [#examples] Create a B-spline surface: ```wolfram pts = Table[{i, j, Sin[i + j]}, {i, 0, 3}, {j, 0, 3}]; Graphics3D[BSplineSurface[pts]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BSplineSurface.html) for more details. # BeveledPolyhedron `BeveledPolyhedron[poly]` gives the beveled polyhedron of poly by beveling each edge. `BeveledPolyhedron[poly, l]` bevels the polyhedron by a length ratio l at its edges. Examples [#examples] Bevel a cube: ```wolfram Graphics3D[BeveledPolyhedron[Cube[]]] ``` With custom bevel ratio: ```wolfram Graphics3D[BeveledPolyhedron[Tetrahedron[], 0.3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BeveledPolyhedron.html) for more details. # BezierFunction `BezierFunction[{pt1, pt2, ...}]` represents a Bézier function for a curve defined by the control points pti. `BezierFunction[array]` represents a Bézier function for a surface or high-dimensional manifold. Examples [#examples] Create and evaluate a Bézier function: ```wolfram bf = BezierFunction[{{0, 0}, {1, 2}, {2, 0}}]; bf[0.5] (* {1., 1.} *) ``` Plot a Bézier curve: ```wolfram ParametricPlot[bf[t], {t, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BezierFunction.html) for more details. # BoundaryDiscretizeGraphics `BoundaryDiscretizeGraphics[g]` discretizes a 2D or 3D graphic g into a BoundaryMeshRegion. `BoundaryDiscretizeGraphics[g, patt]` discretizes only the elements in g that match the pattern patt. Examples [#examples] Discretize a graphics object: ```wolfram BoundaryDiscretizeGraphics[Graphics[Disk[]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BoundaryDiscretizeGraphics.html) for more details. # BoundaryDiscretizeRegion `BoundaryDiscretizeRegion[reg]` discretizes the region reg into a BoundaryMeshRegion. `BoundaryDiscretizeRegion[reg, {{xmin, xmax}, ...}]` restricts to the specified bounds. Examples [#examples] Discretize a disk: ```wolfram BoundaryDiscretizeRegion[Disk[]] ``` With bounds: ```wolfram BoundaryDiscretizeRegion[Ball[], {{-1, 1}, {-1, 1}, {-1, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BoundaryDiscretizeRegion.html) for more details. # BoundaryMesh `BoundaryMesh[mreg]` gives a BoundaryMeshRegion from a MeshRegion mreg. Examples [#examples] Create boundary mesh from region: ```wolfram mesh = MeshRegion[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}, Polygon[{1, 2, 3, 4}]]; BoundaryMesh[mesh] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BoundaryMesh.html) for more details. # BoundaryMeshRegionQ `BoundaryMeshRegionQ[reg]` yields True if the region reg is a valid BoundaryMeshRegion object and False otherwise. Examples [#examples] Test if region is a boundary mesh: ```wolfram reg = BoundaryMeshRegion[{{0, 0}, {1, 0}, {0, 1}}, Line[{1, 2, 3, 1}]]; BoundaryMeshRegionQ[reg] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BoundaryMeshRegionQ.html) for more details. # BoundedRegionQ `BoundedRegionQ[reg]` gives True if reg is a bounded region and False otherwise. Examples [#examples] Test if region is bounded: ```wolfram BoundedRegionQ[Disk[]] (* True *) ``` Unbounded region: ```wolfram BoundedRegionQ[HalfPlane[{0, 0}, {1, 0}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BoundedRegionQ.html) for more details. # CanberraDistance `CanberraDistance[u, v]` gives the Canberra distance between vectors u and v. Examples [#examples] Calculate Canberra distance: ```wolfram CanberraDistance[{1, 2, 3}, {4, 5, 6}] (* 9/10 *) ``` Distance of zero for identical vectors: ```wolfram CanberraDistance[{1, 2, 3}, {1, 2, 3}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CanberraDistance.html) for more details. # CanonicalizePolygon `CanonicalizePolygon[poly]` gives a canonical representation of the polygon poly with shared coordinates and with inner and outer boundaries. `CanonicalizePolygon[poly, "filter"]` gives a canonical representation with the specified filter. Examples [#examples] Canonicalize a polygon: ```wolfram CanonicalizePolygon[Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CanonicalizePolygon.html) for more details. # CanonicalizePolyhedron `CanonicalizePolyhedron[poly]` gives a canonical representation of the polyhedron poly with shared coordinates and with inner and outer boundaries. Examples [#examples] Canonicalize a tetrahedron: ```wolfram CanonicalizePolyhedron[Tetrahedron[]] (* Tetrahedron[...] *) ``` Canonicalize a cube: ```wolfram CanonicalizePolyhedron[Hexahedron[]] (* Hexahedron[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CanonicalizePolyhedron.html) for more details. # CanonicalizeRegion `CanonicalizeRegion[reg]` gives a canonical representation of the region reg. Examples [#examples] Canonicalize a region: ```wolfram CanonicalizeRegion[Disk[{0, 0}, 1]] ``` Simplify complex region: ```wolfram CanonicalizeRegion[RegionUnion[Disk[], Rectangle[{0, 0}, {1, 1}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CanonicalizeRegion.html) for more details. # CantorMesh `CantorMesh[n]` gives a mesh region representing the nth-step Cantor set. `CantorMesh[n, d]` gives the nth-step Cantor set in dimension d. Examples [#examples] Create a Cantor set: ```wolfram CantorMesh[3] ``` 2D Cantor dust: ```wolfram CantorMesh[3, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CantorMesh.html) for more details. # ChessboardDistance `ChessboardDistance[u, v]` gives the chessboard, Chebyshev, or sup norm distance between vectors u and v. Examples [#examples] Distance between two points: ```wolfram ChessboardDistance[{0, 0}, {3, 4}] (* 4 *) ``` Same as Chebyshev distance: ```wolfram ChessboardDistance[{1, 2, 3}, {4, 6, 5}] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChessboardDistance.html) for more details. # CircularArcThrough `CircularArcThrough[{p1, p2, ...}]` represents a circular arc passing through the points pi. `CircularArcThrough[{p1, p2, ...}, q]` represents a circular arc with center q. `CircularArcThrough[{p1, p2, ...}, q, r]` represents a circular arc with radius r. Examples [#examples] Create a circular arc through points: ```wolfram Graphics[CircularArcThrough[{{0, 0}, {1, 1}, {2, 0}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularArcThrough.html) for more details. # CircumscribedBall `CircumscribedBall[{p1, p2, ...}]` gives a ball with minimal radius that encloses the points p1, p2, .... Examples [#examples] Find the smallest ball enclosing points: ```wolfram CircumscribedBall[{{0, 0}, {1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircumscribedBall.html) for more details. # Circumsphere `Circumsphere[{p1, ..., pn+1}]` gives the sphere that circumscribes the points pi in n dimensions. `Circumsphere[poly]` gives the circumsphere of a polyhedron or polygon poly. Examples [#examples] Circumsphere of a triangle: ```wolfram Circumsphere[{{0, 0}, {1, 0}, {0.5, 1}}] (* Sphere[{0.5, 0.375}, 0.625] *) ``` Circumsphere of a tetrahedron: ```wolfram Circumsphere[{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Circumsphere.html) for more details. # CollinearPoints `CollinearPoints[{p1, p2, p3, ..., pn}]` tests whether the points p1, p2, p3, ..., pn are collinear. Examples [#examples] Test if points are collinear: ```wolfram CollinearPoints[{{0, 0}, {1, 1}, {2, 2}}] (* True *) ``` Non-collinear points: ```wolfram CollinearPoints[{{0, 0}, {1, 1}, {2, 3}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CollinearPoints.html) for more details. # ComplexRegionPlot `ComplexRegionPlot[pred, {z, zmin, zmax}]` makes a plot showing the region in the complex plane for which pred is True. `ComplexRegionPlot[{pred1, pred2, ...}, {z, zmin, zmax}]` plots regions given by multiple predicates. Examples [#examples] Plot a region in the complex plane: ```wolfram ComplexRegionPlot[Abs[z] < 1, {z, -2 - 2 I, 2 + 2 I}] ``` Plot multiple regions: ```wolfram ComplexRegionPlot[{Re[z] > 0, Im[z] > 0}, {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexRegionPlot.html) for more details. # ConcaveHullMesh `ConcaveHullMesh[{p1, p2, ...}]` gives the concave hull mesh from the points p1, p2, .... `ConcaveHullMesh[{p1, p2, ...}, α]` gives the concave hull mesh of the specified parameter α. `ConcaveHullMesh[{p1, p2, ...}, α, d]` gives the concave hull mesh of cells of dimension d. Examples [#examples] Create a concave hull mesh from random points: ```wolfram pts = RandomReal[1, {50, 2}]; ConcaveHullMesh[pts] ``` With a specified alpha parameter: ```wolfram ConcaveHullMesh[pts, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConcaveHullMesh.html) for more details. # ConstantRegionQ `ConstantRegionQ[reg]` gives `True` if the reg is a constant region and `False` otherwise. Examples [#examples] ```wolfram ConstantRegionQ[Disk[]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantRegionQ.html) for more details. # ConvexHullMesh `ConvexHullMesh[{p1, p2, ...}]` gives a BoundaryMeshRegion representing the convex hull from the points p1, p2, .... `ConvexHullMesh[mreg]` gives the convex hull of the mesh region mreg. Examples [#examples] Convex hull of random points: ```wolfram pts = RandomReal[1, {20, 2}]; ConvexHullMesh[pts] ``` 3D convex hull: ```wolfram pts3D = RandomReal[1, {30, 3}]; ConvexHullMesh[pts3D] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexHullMesh.html) for more details. # ConvexHullRegion `ConvexHullRegion[{p1,p2,…}]` gives the convex hull from the points p1, p2, …. `ConvexHullRegion[reg]` gives the convex hull of the region reg. Examples [#examples] ```wolfram ConvexHullRegion[{{0,0}, {1,0}, {0,1}, {1,1}, {0.5,0.5}}] (* Polygon[{{0,0}, {1,0}, {1,1}, {0,1}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexHullRegion.html) for more details. # ConvexPolygonQ `ConvexPolygonQ[poly]` gives True if the polygon poly is convex, and False otherwise. Examples [#examples] Check if a polygon is convex: ```wolfram ConvexPolygonQ[Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexPolygonQ.html) for more details. # ConvexPolyhedronQ `ConvexPolyhedronQ[poly]` gives True if the polyhedron poly is convex, and False otherwise. Examples [#examples] Check if a polyhedron is convex: ```wolfram ConvexPolyhedronQ[Cuboid[]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexPolyhedronQ.html) for more details. # ConvexRegionQ `ConvexRegionQ[reg]` gives True if reg is a convex region and False otherwise. Examples [#examples] Check if a region is convex: ```wolfram ConvexRegionQ[Disk[]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvexRegionQ.html) for more details. # CoordinateBounds `CoordinateBounds[coords]` gives a list \{\{xmin, xmax}, \{ymin, ymax}, ...} of the bounds in each dimension of the region defined by coords. `CoordinateBounds[coords, δ]` pads the ranges of coordinates by ±δ in each dimension. `CoordinateBounds[coords, Scaled[s]]` pads by the scaled amount s in each dimension. `CoordinateBounds[coords, {p1, p2, ...}]` pads by p1, p2, ... in successive dimensions. Examples [#examples] Get bounds of a set of points: ```wolfram CoordinateBounds[{{1, 2}, {3, 4}, {5, 6}}] (* {{1, 5}, {2, 6}} *) ``` With padding: ```wolfram CoordinateBounds[{{0, 0}, {1, 1}}, 0.5] (* {{-0.5, 1.5}, {-0.5, 1.5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoordinateBounds.html) for more details. # CoordinateBoundsArray `CoordinateBoundsArray[{{xmin, xmax}, {ymin, ymax}, ...}]` generates an array of \{x, y, ...} coordinates with integer steps in each dimension. `CoordinateBoundsArray[{xrange, yrange, ...}, d]` uses step d in each dimension. `CoordinateBoundsArray[{xrange, yrange, ...}, {dx, dy, ...}]` uses steps dx, dy, ... in successive dimensions. Examples [#examples] Generate coordinate array: ```wolfram CoordinateBoundsArray[{{0, 2}, {0, 3}}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoordinateBoundsArray.html) for more details. # CoordinateChartData `CoordinateChartData[chart, property]` gives the value of the specified property for chart. `CoordinateChartData[chart, property, {x1, x2, ..., xn}]` gives the value of the specified property for chart evaluated at the point \{x1, x2, ..., xn}. Examples [#examples] Get properties of polar coordinates: ```wolfram CoordinateChartData["Polar", "StandardName"] ``` Metric tensor for spherical coordinates: ```wolfram CoordinateChartData["Spherical", "Metric", {r, θ, φ}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoordinateChartData.html) for more details. # CoordinateTransform `CoordinateTransform[t, pt]` performs the coordinate transformation t on the point pt. `CoordinateTransform[t, {pt1, pt2, ...}]` transforms several points. Examples [#examples] Convert Cartesian to polar: ```wolfram CoordinateTransform["Cartesian" -> "Polar", {1, 1}] (* {Sqrt[2], Pi/4} *) ``` Convert spherical to Cartesian: ```wolfram CoordinateTransform["Spherical" -> "Cartesian", {1, Pi/4, Pi/4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoordinateTransform.html) for more details. # CoordinateTransformData `CoordinateTransformData[t, property]` gives the value of the specified property for the coordinate transformation t. `CoordinateTransformData[t, property, {x1, x2, ..., xn}]` gives the value of the property evaluated at the point. Examples [#examples] Get the transformation mapping from Cartesian to polar: ```wolfram CoordinateTransformData["Cartesian" -> "Polar", "Mapping", {x, y}] (* {Sqrt[x^2 + y^2], ArcTan[x, y]} *) ``` Convert a specific point: ```wolfram CoordinateTransformData["Cartesian" -> "Polar", "Mapping", {1, 1}] (* {Sqrt[2], Pi/4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoordinateTransformData.html) for more details. # CoplanarPoints `CoplanarPoints[{p1,p2,p3,p4,…,pn}]` tests whether the points p1,p2,p3,p4,…,pn are coplanar. Examples [#examples] Test if four points are coplanar: ```wolfram CoplanarPoints[{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}}] (* True *) ``` Non-coplanar points: ```wolfram CoplanarPoints[{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 0, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoplanarPoints.html) for more details. # DelaunayMesh `DelaunayMesh[{p1, p2, ...}]` gives a MeshRegion representing the Delaunay mesh from the points p1, p2, .... Examples [#examples] Create a 2D Delaunay triangulation: ```wolfram pts = RandomReal[1, {20, 2}]; DelaunayMesh[pts] ``` 3D Delaunay tetrahedralization: ```wolfram pts3D = RandomReal[1, {50, 3}]; DelaunayMesh[pts3D] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DelaunayMesh.html) for more details. # DihedralAngle `DihedralAngle[{p1, p2}, {v, w}]` gives the angle between two half-planes bounded by the line through p1 and p2 and extended in the direction v and w. Examples [#examples] Calculate a dihedral angle: ```wolfram DihedralAngle[{{0, 0, 0}, {0, 0, 1}}, {{1, 0, 0}, {0, 1, 0}}] (* Pi/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DihedralAngle.html) for more details. # DiscretizeGraphics `DiscretizeGraphics[g]` discretizes a 2D or 3D graphic g into a MeshRegion. `DiscretizeGraphics[g,patt]` discretizes only the elements in g that match the pattern patt. Examples [#examples] Discretize a disk: ```wolfram DiscretizeGraphics[Graphics[Disk[]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscretizeGraphics.html) for more details. # DiscretizeRegion `DiscretizeRegion[reg]` discretizes a region reg into a `MeshRegion`. `DiscretizeRegion[reg, {{xmin, xmax}, ...}]` restricts to the bounds \[xmin, xmax]×.... Examples [#examples] Discretize a disk: ```wolfram DiscretizeRegion[Disk[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscretizeRegion.html) for more details. # DistanceMatrix `DistanceMatrix[{u1, u2, ...}]` gives the matrix of distances between each pair of elements ui, uj. `DistanceMatrix[{u1, u2, ...}, {v1, v2, ...}]` gives the matrix of distances between each ui and vj. Examples [#examples] Distance matrix for points: ```wolfram DistanceMatrix[{{0, 0}, {1, 0}, {0, 1}}] (* {{0, 1, 1}, {1, 0, Sqrt[2]}, {1, Sqrt[2], 0}} *) ``` Between two sets: ```wolfram DistanceMatrix[{{0, 0}}, {{1, 0}, {0, 1}}] (* {{1, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DistanceMatrix.html) for more details. # DistanceTransform `DistanceTransform[image]` gives the distance transform of image, in which the value of each pixel is replaced by its distance to the nearest background pixel. `DistanceTransform[image,t]` treats values above t as foreground. Examples [#examples] ```wolfram DistanceTransform[Binarize[ExampleData[{"TestImage", "Lena"}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DistanceTransform.html) for more details. # EmptyRegion `EmptyRegion[n]` represents the empty subset of ℝ^n. Examples [#examples] Create an empty region in 2D: ```wolfram EmptyRegion[2] ``` Check if a point is in an empty region: ```wolfram RegionMember[EmptyRegion[2], {0, 0}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EmptyRegion.html) for more details. # EuclideanDistance `EuclideanDistance[u, v]` gives the Euclidean distance between vectors u and v. Examples [#examples] Calculate the distance between two points: ```wolfram EuclideanDistance[{0, 0}, {3, 4}] (* 5 *) ``` Distance in 3D: ```wolfram EuclideanDistance[{1, 2, 3}, {4, 5, 6}] (* 3 Sqrt[3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EuclideanDistance.html) for more details. # FilledTorus `FilledTorus[{x,y,z},{rinner,router}]` represents a filled torus centered at \{x,y,z} with inner radius rinner and outer radius router. Examples [#examples] ```wolfram (* Create a filled torus at origin *) Graphics3D[FilledTorus[{0, 0, 0}, {0.3, 1}]] (* Create a torus at a specific location *) Graphics3D[{Red, FilledTorus[{1, 2, 0}, {0.2, 0.8}]}] (* Multiple tori *) Graphics3D[{ Blue, FilledTorus[{0, 0, 0}, {0.5, 1.5}], Orange, FilledTorus[{3, 0, 0}, {0.3, 1}] }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FilledTorus.html) for more details. # FindCurvePath `FindCurvePath[{{x1,y1},{x2,y2},…}]` gives an ordering of the \{xi,yi} that corresponds to one or more smooth curves. Examples [#examples] Find a curve path through scattered points: ```wolfram pts = {{0, 0}, {1, 1}, {0.5, 0.5}, {2, 2}, {1.5, 1.5}}; FindCurvePath[pts] (* {{1, 3, 2, 5, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindCurvePath.html) for more details. # FindGeometricConjectures `FindGeometricConjectures[scene]` finds conjectures that appear to hold for the GeometricScene object scene and adds these conjectures to the scene object. * `FindGeometricConjectures[{scene1,scene2,…}]` finds conjectures that appear to hold for all instances scenei of a geometric scene and returns a combined scene with the conjectures added. * `FindGeometricConjectures[scenes,patt]` adds only conjectures that match the pattern patt. * `FindGeometricConjectures[scenes,patt,n]` adds only up to n conjectures. Examples [#examples] ```wolfram (* Find conjectures in a triangle scene *) scene = GeometricScene[{a, b, c}, Triangle[{a, b, c}]]; FindGeometricConjectures[scene] (* Limit to specific patterns *) FindGeometricConjectures[scene, _Equal, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGeometricConjectures.html) for more details. # FindGeometricTransform `FindGeometricTransform[pts1,pts2]` finds a geometric transformation that aligns positions specified by pts2 with pts1, returning the alignment error together with the transformation function. `FindGeometricTransform[ref,{pts1,pts2,…}]` finds geometric transformations that align each of the ptsi with ref. `FindGeometricTransform[{pts1,pts2,…}]` finds geometric transformations that align each of the ptsi with pts1. Examples [#examples] Find a transformation between two point sets: ```wolfram FindGeometricTransform[{{0, 0}, {1, 0}, {0, 1}}, {{1, 1}, {2, 1}, {1, 2}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGeometricTransform.html) for more details. # FindMeshDefects `FindMeshDefects[mreg]` finds defects in the mesh region mreg. * `FindMeshDefects[mreg,{def1,…}]` finds only the specified type of defects def1, …. * `FindMeshDefects[mreg,defects,format]` formats the results according to format specification. Examples [#examples] ```wolfram (* Find all defects in a mesh *) mesh = BoundaryMeshRegion[...]; FindMeshDefects[mesh] (* Find specific defects *) FindMeshDefects[mesh, {"DegenerateCell", "SelfIntersection"}] (* Get as associations *) FindMeshDefects[mesh, All, "Association"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMeshDefects.html) for more details. # FindRegionTransform `FindRegionTransform[reg1,reg2]` gives the transformation function that maps the region reg1 to the region reg2. Examples [#examples] ```wolfram FindRegionTransform[Disk[], Rectangle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindRegionTransform.html) for more details. # HalfPlane `HalfPlane[{p1, p2}, w]` represents the half-plane bounded by the line through p1 and p2 and extended in the direction w. * `HalfPlane[p, v, w]` represents the half-plane bounded by the line through p along v and extended in the direction w. Examples [#examples] Create a half-plane: ```wolfram HalfPlane[{{0, 0}, {1, 1}}, {0, 1}] ``` Visualize a half-plane: ```wolfram Graphics[{LightBlue, HalfPlane[{{0, 0}, {1, 0}}, {0, 1}]}] ``` Using point and direction: ```wolfram HalfPlane[{0, 0}, {1, 0}, {0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HalfPlane.html) for more details. # HalfSpace `HalfSpace[n, p]` represents the half-space of points x such that n.(x-p)≤0. `HalfSpace[n, c]` represents the half-space of points x such that n.x≤c. Examples [#examples] Define a half-space: ```wolfram hs = HalfSpace[{0, 0, 1}, {0, 0, 0}] (* HalfSpace[{0, 0, 1}, {0, 0, 0}] *) ``` Visualize a half-space: ```wolfram RegionPlot3D[HalfSpace[{1, 1, 1}, 1], {x, -2, 2}, {y, -2, 2}, {z, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HalfSpace.html) for more details. # ImplicitRegion `ImplicitRegion[cond, {x1, ..., xn}]` represents a region that satisfies the conditions cond. Examples [#examples] Unit disk: ```wolfram reg = ImplicitRegion[x^2 + y^2 <= 1, {x, y}]; RegionPlot[reg] ``` 3D sphere: ```wolfram ImplicitRegion[x^2 + y^2 + z^2 <= 1, {x, y, z}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImplicitRegion.html) for more details. # InfinitePlane `InfinitePlane[{p1, p2, p3}]` represents the plane passing through the points p1, p2, and p3. * `InfinitePlane[p, {v1, v2}]` represents the plane passing through the point p in the directions v1 and v2. Examples [#examples] ```wolfram InfinitePlane[{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}}] ``` ```wolfram Graphics3D[InfinitePlane[{0, 0, 0}, {{1, 0, 0}, {0, 1, 0}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InfinitePlane.html) for more details. # InscribedBall `InscribedBall[{p1,p2,…}]` gives the largest ball that lies inside the convex hull of the points p1,p2,…. Examples [#examples] Find the inscribed ball of a set of points: ```wolfram pts = {{0, 0}, {1, 0}, {0, 1}, {1, 1}}; InscribedBall[pts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InscribedBall.html) for more details. # ManhattanDistance `ManhattanDistance[u, v]` gives the Manhattan or "city block" distance between vectors u and v. Examples [#examples] ```wolfram ManhattanDistance[{0, 0}, {3, 4}] (* 7 *) ``` ```wolfram ManhattanDistance[{1, 2, 3}, {4, 5, 6}] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ManhattanDistance.html) for more details. # MengerMesh `MengerMesh[n]` gives a mesh region representing the nth-step Menger sponge. * `MengerMesh[n, d]` gives the nth-step Menger sponge in dimension d. Examples [#examples] Create a Menger sponge: ```wolfram MengerMesh[2] ``` 2D Sierpiński carpet: ```wolfram MengerMesh[4, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MengerMesh.html) for more details. # Midpoint `Midpoint[{p1,p2}]` gives the midpoint of the line segment connecting the points p1 and p2. `Midpoint[Line[{p1,p2}]]` gives the midpoint of a line. Examples [#examples] ```wolfram Midpoint[{{0, 0}, {2, 4}}] (* {1, 2} *) ``` ```wolfram Midpoint[Line[{{0, 0}, {10, 10}}]] (* {5, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Midpoint.html) for more details. # Parallelepiped `Parallelepiped[p, {v1, ..., vk}]` represents a parallelepiped with origin p and edge directions vi. Examples [#examples] 3D parallelepiped: ```wolfram Graphics3D[Parallelepiped[{0, 0, 0}, {{1, 0, 0}, {0.5, 1, 0}, {0, 0.5, 1}}]] ``` 2D parallelogram: ```wolfram Graphics[Parallelepiped[{0, 0}, {{1, 0}, {0.5, 1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Parallelepiped.html) for more details. # ParametricRegion `ParametricRegion[{f1, ..., fn}, {u1, ..., um}]` represents a region given by parametric functions. Examples [#examples] Circle as parametric region: ```wolfram reg = ParametricRegion[{Cos[t], Sin[t]}, {{t, 0, 2 Pi}}]; RegionPlot[reg] ``` Parametric surface: ```wolfram ParametricRegion[{u Cos[v], u Sin[v], u}, {{u, 0, 1}, {v, 0, 2 Pi}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricRegion.html) for more details. # PerpendicularBisector `PerpendicularBisector[{p1, p2}]` gives the perpendicular bisector of the line segment connecting p1 and p2. * `PerpendicularBisector[Line[{p1, p2}]]` gives the perpendicular bisector of a line segment. Examples [#examples] Find the perpendicular bisector of two points: ```wolfram PerpendicularBisector[{{0, 0}, {4, 0}}] ``` Visualize the perpendicular bisector: ```wolfram Graphics[{Line[{{0, 0}, {4, 2}}], Red, PerpendicularBisector[{{0, 0}, {4, 2}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PerpendicularBisector.html) for more details. # PlanarAngle `PlanarAngle[p -> {q1, q2}]` gives the angle between the half‐lines from p through q1 and q2. * `PlanarAngle[{q1, p, q2}]` gives the angle at p formed by the triangle with vertex points p, q1, and q2. * `PlanarAngle[..., "spec"]` gives the angle specified by "spec". Examples [#examples] ```wolfram PlanarAngle[{0, 0} -> {{1, 0}, {0, 1}}] ``` ```wolfram PlanarAngle[{{1, 0}, {0, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlanarAngle.html) for more details. # PolyhedronAngle `PolyhedronAngle[poly,p]` gives the solid angle at the point p and spanned by edges with common point p. `PolyhedronAngle[poly,e]` gives the dihedral angle between the two faces with common edge e. Examples [#examples] Find the solid angle at a vertex of a tetrahedron: ```wolfram PolyhedronAngle[Tetrahedron[], {0, 0, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyhedronAngle.html) for more details. # PolyhedronCoordinates `PolyhedronCoordinates[poly]` gives a list of coordinates in the polyhedron poly. Examples [#examples] Get the vertex coordinates of a tetrahedron: ```wolfram PolyhedronCoordinates[Tetrahedron[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyhedronCoordinates.html) for more details. # PolyhedronDecomposition `PolyhedronDecomposition[poly]` decomposes the polyhedron poly into a union of simpler polyhedra. Examples [#examples] ```wolfram PolyhedronDecomposition[Cuboid[]] ``` ```wolfram PolyhedronDecomposition[ConvexHullMesh[RandomPoint[Sphere[], 10]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyhedronDecomposition.html) for more details. # PolyhedronGenus `PolyhedronGenus[poly]` gives the genus of the polyhedron poly. The genus is a topological property that counts the number of "handles" on a surface. Examples [#examples] ```wolfram PolyhedronGenus[PolyhedronData["Cube"]] ``` ```wolfram PolyhedronGenus[PolyhedronData["Torus"]] ``` ```wolfram PolyhedronGenus[ConvexHullMesh[RandomPoint[Sphere[], 20]]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyhedronGenus.html) for more details. # RandomPoint `RandomPoint[reg]` gives a pseudorandom point uniformly distributed in the region reg. * `RandomPoint[reg, n]` gives a list of n pseudorandom points uniformly distributed in the region reg. * `RandomPoint[reg, {n1, n2, ...}]` gives an n1 × n2 × ... array of pseudorandom points. * `RandomPoint[reg, ..., {{xmin, xmax}, ...}]` restricts to the bounds \[xmin, xmax] × .... Examples [#examples] Random point in disk: ```wolfram RandomPoint[Disk[]] ``` Multiple points: ```wolfram RandomPoint[Disk[], 10] ``` In 3D region: ```wolfram RandomPoint[Ball[], 100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPoint.html) for more details. # RandomPointConfiguration `RandomPointConfiguration[pproc, reg]` generates a pseudorandom spatial point configuration from the spatial point process pproc in the observation region reg. * `RandomPointConfiguration[pproc, reg, n]` generates an ensemble of n spatial point configurations. Examples [#examples] ```wolfram RandomPointConfiguration[PoissonPointProcess[1], Rectangle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPointConfiguration.html) for more details. # RandomPolygon `RandomPolygon[n]` gives a pseudorandom simple polygon with n vertex points. * `RandomPolygon[spec]` gives a pseudorandom polygon with the specified specification spec. * `RandomPolygon[spec, k]` gives a list of k pseudorandom polygons. * `RandomPolygon[d -> spec, …]` gives a pseudorandom polygon in dimension d. Examples [#examples] ```wolfram RandomPolygon[5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPolygon.html) for more details. # RandomPolyhedron `RandomPolyhedron[spec]` gives a pseudorandom polyhedron with the specified specification spec. * `RandomPolyhedron[spec, k]` gives a list of k pseudorandom polyhedra. Examples [#examples] Generate a random polyhedron: ```wolfram RandomPolyhedron[{"ConvexHull", 10}] ``` Generate multiple random polyhedra: ```wolfram RandomPolyhedron[{"ConvexHull", 8}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPolyhedron.html) for more details. # Region `Region[reg]` represents a geometric region. * `Region[reg, options]` gives a region that uses the specified options. Examples [#examples] Create a disk region: ```wolfram Region[Disk[{0, 0}, 1]] ``` Region with styling: ```wolfram Region[Ball[], PlotTheme -> "Detailed"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Region.html) for more details. # RegionBinarize `RegionBinarize[image, marker, d]` gives a binary version of image that includes the foreground pixels of marker and also connected regions whose pixel values are within a distance d. * `RegionBinarize[image, marker, d, {t1, t2}]` grows regions in marker by adding pixels whose average intensity is also constrained within an interval \{t1, t2}. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; marker = Binarize[img, 0.8]; RegionBinarize[img, marker, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionBinarize.html) for more details. # RegionBoundary `RegionBoundary[reg]` represents the boundary of the region reg. Examples [#examples] Get the boundary of a disk: ```wolfram RegionBoundary[Disk[]] (* Circle[{0, 0}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionBoundary.html) for more details. # RegionBounds `RegionBounds[reg]` gives the bounding box for the region. Examples [#examples] Bounds of a disk: ```wolfram RegionBounds[Disk[{1, 2}, 3]] (* {{-2, 4}, {-1, 5}} *) ``` Bounds of a polygon: ```wolfram RegionBounds[Polygon[{{0, 0}, {2, 0}, {1, 3}}]] (* {{0, 2}, {0, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionBounds.html) for more details. # RegionCentroid `RegionCentroid[reg]` gives the centroid of the region. Examples [#examples] Centroid of a triangle: ```wolfram RegionCentroid[Triangle[{{0, 0}, {1, 0}, {0, 1}}]] (* {1/3, 1/3} *) ``` Centroid of a disk: ```wolfram RegionCentroid[Disk[{2, 3}, 1]] (* {2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionCentroid.html) for more details. # RegionCongruent `RegionCongruent[reg1, reg2]` tests whether the regions reg1 and reg2 are congruent. Examples [#examples] ```wolfram RegionCongruent[Disk[], Disk[{1, 1}]] ``` ```wolfram RegionCongruent[Disk[], Rectangle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionCongruent.html) for more details. # RegionConvert `RegionConvert[reg, form]` converts the region representation reg to the specified form. Examples [#examples] Convert to mesh region: ```wolfram RegionConvert[Disk[], MeshRegion] ``` Convert to boundary mesh: ```wolfram RegionConvert[Ball[], BoundaryMeshRegion] ``` Convert to implicit form: ```wolfram RegionConvert[Rectangle[], ImplicitRegion] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionConvert.html) for more details. # RegionDifference `RegionDifference[reg1, reg2]` gives the difference of regions (reg1 minus reg2). Examples [#examples] Disk with hole: ```wolfram RegionDifference[Disk[{0, 0}, 2], Disk[{0, 0}, 1]] ``` Subtract region: ```wolfram RegionDifference[Rectangle[], Disk[{0.5, 0.5}, 0.3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDifference.html) for more details. # RegionDilation `RegionDilation[reg, r]` gives the dilation of the region reg by a disk of radius r centered at the origin. * `RegionDilation[reg1, reg2]` gives the dilation of the region reg1 by the region reg2. * `RegionDilation[reg1, reg2, {u, v}]` gives the dilation of reg1 scaled by a factor u and reg2 scaled by a factor v. Region dilation is a morphological operation that expands a region by a specified amount. Examples [#examples] ```wolfram RegionDilation[Disk[], 0.5] ``` ```wolfram RegionDilation[Rectangle[], 0.2] // RegionPlot ``` ```wolfram RegionDilation[Point[{0, 0}], Disk[]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDilation.html) for more details. # RegionDimension `RegionDimension[reg]` gives the geometric dimension of the region reg. The dimension is the number of independent directions within the region. Examples [#examples] ```wolfram RegionDimension[Line[{{0, 0}, {1, 1}}]] ``` ```wolfram RegionDimension[Disk[]] ``` ```wolfram RegionDimension[Ball[{0, 0, 0}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDimension.html) for more details. # RegionDisjoint `RegionDisjoint[reg1, reg2]` returns `True` if the regions reg1 and reg2 are disjoint. * `RegionDisjoint[reg1, reg2, reg3, …]` returns `True` if the regions reg1, reg2, reg3, … are pairwise disjoint. Examples [#examples] ```wolfram RegionDisjoint[Disk[{0, 0}], Disk[{5, 5}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDisjoint.html) for more details. # RegionDistance `RegionDistance[reg, p]` gives the minimum distance from point p to the region. Examples [#examples] Distance to a disk: ```wolfram RegionDistance[Disk[{0, 0}, 1], {2, 0}] (* 1 *) ``` Distance between regions: ```wolfram RegionDistance[Disk[{0, 0}, 1], Disk[{3, 0}, 1]] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDistance.html) for more details. # RegionDistanceFunction `RegionDistanceFunction[reg, …]` represents a function whose values give the distance from a point to the region reg. Examples [#examples] ```wolfram rdf = RegionDistanceFunction[Disk[]]; rdf[{2, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionDistanceFunction.html) for more details. # RegionEmbeddingDimension `RegionEmbeddingDimension[reg]` gives the dimension of the space in which the region reg is embedded. Examples [#examples] Get the embedding dimension of a disk: ```wolfram RegionEmbeddingDimension[Disk[]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionEmbeddingDimension.html) for more details. # RegionEqual `RegionEqual[reg1, reg2]` returns `True` if the regions reg1 and reg2 are equal. * `RegionEqual[reg1, reg2, reg3, …]` returns `True` if the regions reg1, reg2, reg3, … are all equal. Examples [#examples] ```wolfram RegionEqual[Disk[], Circle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionEqual.html) for more details. # RegionErosion `RegionErosion[reg, r]` gives the erosion of the region reg by a disk of radius r centered at the origin. * `RegionErosion[reg1, reg2]` gives the erosion of the region reg1 by the region reg2. * `RegionErosion[reg1, reg2, {u, v}]` gives the erosion of reg1 scaled by a factor u and reg2 scaled by a factor v. Examples [#examples] ```wolfram RegionErosion[Disk[], 0.3] ``` ```wolfram RegionErosion[Rectangle[], Disk[{0, 0}, 0.1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionErosion.html) for more details. # RegionFarthestDistance `RegionFarthestDistance[reg1, reg2]` gives the farthest distance between points in the regions reg1 and reg2. Examples [#examples] Farthest distance between two disks: ```wolfram RegionFarthestDistance[Disk[{0, 0}], Disk[{5, 0}]] (* 7 *) ``` Farthest distance between a point and a region: ```wolfram RegionFarthestDistance[Point[{0, 0}], Rectangle[{1, 1}, {3, 3}]] ``` Between two triangles: ```wolfram RegionFarthestDistance[ Triangle[{{0, 0}, {1, 0}, {0, 1}}], Triangle[{{2, 2}, {3, 2}, {2, 3}}] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionFarthestDistance.html) for more details. # RegionFit `RegionFit[{p1, p2, ...}, "model"]` finds a geometric region "model" that best fits the points p1, p2, …. * `RegionFit[{p1, p2, ...}, "model", "prop"]` specifies what fit property "prop" should be returned. Examples [#examples] ```wolfram RegionFit[RandomPoint[Disk[], 100], "Disk"] ``` ```wolfram RegionFit[pts, "Line", "Region"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionFit.html) for more details. # RegionHausdorffDistance `RegionHausdorffDistance[reg1, reg2]` gives the Hausdorff distance between the regions reg1 and reg2. Examples [#examples] Hausdorff distance between two disks: ```wolfram RegionHausdorffDistance[Disk[{0, 0}], Disk[{3, 0}]] (* 3 *) ``` Distance between a square and a circle: ```wolfram RegionHausdorffDistance[Rectangle[], Disk[{2, 2}]] ``` Distance between two polygons: ```wolfram RegionHausdorffDistance[ Triangle[{{0, 0}, {1, 0}, {0, 1}}], Triangle[{{2, 0}, {3, 0}, {2, 1}}] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionHausdorffDistance.html) for more details. # RegionImage `RegionImage[reg]` returns a rasterized grayscale 2D or 3D image of reg. * `RegionImage[reg, {{xmin, xmax}, ...}]` restricts to the bounds \[xmin, xmax] × .... Examples [#examples] ```wolfram RegionImage[Disk[]] ``` ```wolfram RegionImage[Ball[], {{-1, 1}, {-1, 1}, {-1, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionImage.html) for more details. # RegionIntersection `RegionIntersection[reg1, reg2, ...]` gives the intersection of the regions. Examples [#examples] Intersection of disks: ```wolfram RegionIntersection[Disk[{0, 0}, 1], Disk[{0.5, 0}, 1]] ``` Intersection of ball and box: ```wolfram RegionIntersection[Ball[], Cuboid[{0, 0, 0}, {1, 1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionIntersection.html) for more details. # RegionMeasure `RegionMeasure[reg]` gives the measure (length, area, volume) of the region. Examples [#examples] Area of disk: ```wolfram RegionMeasure[Disk[]] (* Pi *) ``` Volume of ball: ```wolfram RegionMeasure[Ball[]] (* (4 Pi)/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionMeasure.html) for more details. # RegionMember `RegionMember[reg, {x, y, ...}]` gives True if the point is inside the region. Examples [#examples] Test point in disk: ```wolfram RegionMember[Disk[], {0.5, 0.5}] (* True *) RegionMember[Disk[], {2, 0}] (* False *) ``` Membership function: ```wolfram mf = RegionMember[Ball[]]; mf[{0.5, 0.5, 0.5}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionMember.html) for more details. # RegionMemberFunction `RegionMemberFunction[reg, …]` represents a function whose values give whether a point is in a region reg or not. Examples [#examples] ```wolfram rmf = RegionMemberFunction[Disk[]]; rmf[{0.5, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionMemberFunction.html) for more details. # RegionMoment `RegionMoment[reg, {i1, i2, ..., in}]` computes the polynomial moment for the region reg. Examples [#examples] Compute the zeroth moment (area) of a disk: ```wolfram RegionMoment[Disk[], {0, 0}] (* Pi *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionMoment.html) for more details. # RegionNearest `RegionNearest[reg, p]` gives a point in the region that is nearest to point p. Examples [#examples] Nearest point on circle: ```wolfram RegionNearest[Circle[{0, 0}, 1], {2, 0}] (* {1, 0} *) ``` Nearest function: ```wolfram nf = RegionNearest[Disk[]]; nf[{5, 5}] (* {1/Sqrt[2], 1/Sqrt[2]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionNearest.html) for more details. # RegionNearestFunction `RegionNearestFunction[reg, …]` represents a function whose values give the nearest point in the region reg. Examples [#examples] ```wolfram rnf = RegionNearestFunction[Disk[]]; rnf[{2, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionNearestFunction.html) for more details. # RegionProduct `RegionProduct[reg1, reg2]` represents the Cartesian product of the regions reg1 and reg2. * `RegionProduct[reg1, reg2, …]` represents the Cartesian product of the regions reg1, reg2, …. Examples [#examples] ```wolfram RegionProduct[Disk[], Line[{{0}, {1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionProduct.html) for more details. # RegionQ `RegionQ[reg]` gives True if reg is a valid region and False otherwise. Examples [#examples] Check a disk: ```wolfram RegionQ[Disk[]] (* True *) ``` Invalid region: ```wolfram RegionQ[123] (* False *) ``` Polygon: ```wolfram RegionQ[Polygon[{{0, 0}, {1, 0}, {0, 1}}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionQ.html) for more details. # RegionResize `RegionResize[reg,l]` resize the region reg to have the first side length l preserving side length ratios. `RegionResize[reg,{lmax}]` resize into a box with maximum side length lmax preserving side length ratios. `RegionResize[reg,{l1,l2,…}]` resize into a box with side lengths li. `RegionResize[reg,{{x1,min,x1,max},{x2,min,x2,max},…}]` resize into a box with corners \{x1,min,x2,min,…} and \{x1,max,x2,max,…}. Examples [#examples] ```wolfram RegionResize[Disk[], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionResize.html) for more details. # RegionSimilar `RegionSimilar[reg1, reg2]` tests whether the regions reg1 and reg2 are similar. Examples [#examples] ```wolfram RegionSimilar[Disk[], Disk[{0, 0}, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionSimilar.html) for more details. # RegionSymmetricDifference `RegionSymmetricDifference[reg1, reg2, ...]` represents the symmetric difference of the regions reg1, reg2, .... Examples [#examples] Compute the symmetric difference of two disks: ```wolfram RegionSymmetricDifference[Disk[{0, 0}], Disk[{1, 0}]] ``` Visualize the symmetric difference: ```wolfram Region[RegionSymmetricDifference[Rectangle[], Disk[{0.5, 0.5}, 0.5]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionSymmetricDifference.html) for more details. # RegionUnion `RegionUnion[reg1, reg2, ...]` gives the union of the regions. Examples [#examples] Union of disks: ```wolfram RegionUnion[Disk[{0, 0}, 1], Disk[{1, 0}, 1]] ``` Union of rectangles: ```wolfram RegionUnion[Rectangle[{0, 0}, {1, 1}], Rectangle[{0.5, 0.5}, {1.5, 1.5}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionUnion.html) for more details. # RegionWithin `RegionWithin[reg1, reg2]` returns True if reg2 is contained within reg1. Examples [#examples] Check if a smaller disk is within a larger disk: ```wolfram RegionWithin[Disk[{0, 0}, 2], Disk[{0, 0}, 1]] (* True *) ``` Check if regions do not contain each other: ```wolfram RegionWithin[Disk[{0, 0}, 1], Disk[{2, 0}, 1]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionWithin.html) for more details. # RipleyRassonRegion `RipleyRassonRegion[pdata]` gives an estimated observation based on the point data pdata. Examples [#examples] ```wolfram points = RandomPoint[Disk[], 50]; RipleyRassonRegion[points] ``` ```wolfram RipleyRassonRegion[RandomReal[1, {100, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RipleyRassonRegion.html) for more details. # RotationTransform `RotationTransform[θ]` gives a TransformationFunction that represents a rotation in 2D by θ radians about the origin. `RotationTransform[θ, p]` gives a 2D rotation about the 2D point p. `RotationTransform[θ, w]` gives a 3D rotation around the direction of the 3D vector w. `RotationTransform[θ, w, p]` gives a 3D rotation around the axis w anchored at the point p. Examples [#examples] 2D rotation: ```wolfram RotationTransform[Pi/4][{1, 0}] (* {1/Sqrt[2], 1/Sqrt[2]} *) ``` 3D rotation around z-axis: ```wolfram RotationTransform[Pi/2, {0, 0, 1}][{1, 0, 0}] (* {0, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RotationTransform.html) for more details. # SASTriangle `SASTriangle[a, γ, b]` returns a filled triangle with sides of length a and b and angle γ between them. Examples [#examples] ```wolfram Graphics[SASTriangle[1, Pi/3, 1.5]] ``` ```wolfram SASTriangle[2, Pi/4, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SASTriangle.html) for more details. # SSSTriangle `SSSTriangle[a, b, c]` returns a filled triangle with sides of lengths a, b, and c. Examples [#examples] ```wolfram Graphics[SSSTriangle[3, 4, 5]] ``` ```wolfram SSSTriangle[1, 1, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SSSTriangle.html) for more details. # ScalingTransform `ScalingTransform[{sx,sy,…}]` gives a TransformationFunction that represents scaling by a factor si along each coordinate axis from the origin. `ScalingTransform[{sx,sy,…},p]` gives scaling centered at the point p. `ScalingTransform[s,v]` gives scaling by a factor s along the direction of the vector v. `ScalingTransform[s,v,p]` gives scaling along the direction of v, centered at the point p. Examples [#examples] Scale by a factor of 2 in all directions: ```wolfram ScalingTransform[{2, 2}] ``` Apply a scaling transformation to a point: ```wolfram ScalingTransform[{2, 3}][{1, 1}] (* {2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScalingTransform.html) for more details. # ShearingTransform `ShearingTransform[θ, v, n]` gives a TransformationFunction that represents a shear by θ radians along the direction of the vector v, normal to the vector n, keeping the origin fixed. `ShearingTransform[θ, v, n, p]` gives a shear that keeps the point p fixed, rather than the origin. Examples [#examples] Apply a 2D shear: ```wolfram ShearingTransform[0.5, {1, 0}, {0, 1}][{1, 1}] (* {1.54931, 1} *) ``` Shear a rectangle: ```wolfram Graphics[{ EdgeForm[Black], GeometricTransformation[Rectangle[], ShearingTransform[0.3, {1, 0}, {0, 1}]] }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShearingTransform.html) for more details. # ShellRegion `ShellRegion[reg]` gives a solid shell of a 3D region reg. * `ShellRegion[reg, t]` gives a solid shell of reg with minimal thickness t. This function creates a hollow shell from a solid region, useful for 3D printing and visualization. Examples [#examples] ```wolfram ShellRegion[Ball[]] ``` ```wolfram ShellRegion[Cuboid[], 0.1] ``` ```wolfram RegionPlot3D[ShellRegion[Sphere[], 0.2]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShellRegion.html) for more details. # SierpinskiMesh `SierpinskiMesh[n]` gives a mesh region representing the nth-step Sierpiński triangle. * `SierpinskiMesh[n, d]` gives the nth-step Sierpiński sponge in dimension d. Examples [#examples] Create a Sierpiński triangle: ```wolfram SierpinskiMesh[4] ``` 3D Sierpiński sponge (Menger sponge): ```wolfram SierpinskiMesh[2, 3] ``` Higher resolution: ```wolfram SierpinskiMesh[6] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SierpinskiMesh.html) for more details. # SimplePolygonQ `SimplePolygonQ[poly]` gives `True` if the polygon poly is simple and `False` otherwise. Examples [#examples] ```wolfram SimplePolygonQ[Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}]] (* True *) ``` ```wolfram SimplePolygonQ[Polygon[{{0, 0}, {1, 1}, {1, 0}, {0, 1}}]] (* False, self-intersecting *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SimplePolygonQ.html) for more details. # SimplePolyhedronQ `SimplePolyhedronQ[poly]` gives `True` if the polyhedron poly is simple and `False` otherwise. Examples [#examples] ```wolfram SimplePolyhedronQ[Tetrahedron[]] ``` ```wolfram SimplePolyhedronQ[Cuboid[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SimplePolyhedronQ.html) for more details. # Simplex `Simplex[{p1, ..., pk}]` represents the simplex spanned by points pi. Examples [#examples] Create a 2D simplex (triangle): ```wolfram Graphics[Simplex[{{0, 0}, {1, 0}, {0.5, 1}}]] ``` Create a 3D simplex (tetrahedron): ```wolfram Graphics3D[Simplex[{{0, 0, 0}, {1, 0, 0}, {0.5, 1, 0}, {0.5, 0.5, 1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Simplex.html) for more details. # SnubPolyhedron `SnubPolyhedron[poly]` gives the snub polyhedron of poly by truncating some corners. Examples [#examples] Create a snub cube from a cube: ```wolfram SnubPolyhedron["Cube"] ``` Get the snub dodecahedron: ```wolfram Graphics3D[SnubPolyhedron["Dodecahedron"]] ``` Compare with the original polyhedron: ```wolfram GraphicsRow[{ Graphics3D[Polyhedron["Tetrahedron"]], Graphics3D[SnubPolyhedron["Tetrahedron"]] }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SnubPolyhedron.html) for more details. # SolidAngle `SolidAngle[p, {u1, ..., ud}]` gives the solid angle at the point p and spanned by the vectors u1, ..., ud. * `SolidAngle[p, reg]` gives the solid angle subtended by the region reg. Examples [#examples] ```wolfram SolidAngle[{0, 0, 0}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}] ``` ```wolfram SolidAngle[{0, 0, 0}, Sphere[{1, 0, 0}, 0.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolidAngle.html) for more details. # SolidRegionQ `SolidRegionQ[reg]` gives True if the 3D region reg is a solid region and False otherwise. Examples [#examples] Ball is solid: ```wolfram SolidRegionQ[Ball[]] (* True *) ``` Sphere is not solid: ```wolfram SolidRegionQ[Sphere[]] (* False *) ``` Cuboid is solid: ```wolfram SolidRegionQ[Cuboid[]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SolidRegionQ.html) for more details. # SpatialObservationRegionQ `SpatialObservationRegionQ[reg]` tests whether the geometric or geographic region *reg* can be an observation in spatial statistics. Examples [#examples] ```wolfram SpatialObservationRegionQ[Disk[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialObservationRegionQ.html) for more details. # SphericalAngle `SphericalAngle[{θ0, ϕ0} -> {{θ1, ϕ1}, {θ2, ϕ2}}]` gives the signed angle in radians between the great circles through point \{θ0, ϕ0} and points \{θ1, ϕ1} and \{θ2, ϕ2}. * `SphericalAngle[p -> {q, r}]` gives the unsigned angle for points *p*, *q*, *r* of the form \{θ1, θ2, ..., θn-1, ϕ} on an n-dimensional hypersphere. * `SphericalAngle[p -> {{q1, r1}, ..., {qn, rn}}]` gives a list of angles between the great circles from point *p* through points *qi* and *ri*. * `SphericalAngle[{p1, ..., pn} -> {{q1, r1}, ..., {qn, rn}}]` gives a list of angles between the great circles from point *pi* through points *qi* and *ri*. Examples [#examples] ```wolfram SphericalAngle[{0, 0} -> {{Pi/4, 0}, {0, Pi/4}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalAngle.html) for more details. # SphericalShell `SphericalShell[c, {rinner, router}]` represents a filled spherical shell centered at c with inner radius rinner and outer radius router. Examples [#examples] Create a spherical shell: ```wolfram Graphics3D[SphericalShell[{0, 0, 0}, {1, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalShell.html) for more details. # VoronoiMesh `VoronoiMesh[{p1, ..., pn}]` gives a MeshRegion representing the Voronoi mesh from the points p1, p2, .... * `VoronoiMesh[{p1, ..., pn}, {{xmin, xmax}, ...}]` clips the mesh to the bounds \[xmin, xmax]×.... Examples [#examples] Create a Voronoi mesh from random points: ```wolfram VoronoiMesh[RandomReal[1, {10, 2}]] ``` Clip the mesh to a specific region: ```wolfram VoronoiMesh[RandomReal[1, {20, 2}], {{0, 1}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VoronoiMesh.html) for more details. # WarpingCorrespondence `WarpingCorrespondence[s1, s2]` gives the time warping (DTW) similarity path between sequences *s1* and *s2*. * `WarpingCorrespondence[s1, s2, win]` uses a window specified by *win* for local search. Examples [#examples] ```wolfram WarpingCorrespondence[{1, 2, 3, 4}, {1, 2, 2, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WarpingCorrespondence.html) for more details. # WarpingDistance `WarpingDistance[s1, s2]` gives the dynamic time warping (DTW) distance between sequences *s1* and *s2*. * `WarpingDistance[s1, s2, win]` uses a window specified by *win* for local search. Examples [#examples] ```wolfram WarpingDistance[{1, 2, 3, 4}, {1, 2, 2, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WarpingDistance.html) for more details. # WindingCount `WindingCount[contour, p]` gives the count of the number of times a closed curve winds around a point p. Examples [#examples] ```wolfram WindingCount[Circle[], {0, 0}] ``` ```wolfram WindingCount[Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}], {0.5, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WindingCount.html) for more details. # WindingPolygon `WindingPolygon[{p1, p2, ..., pn}]` gives a polygon representing all points for which the closed contour p1, p2, ..., pn, p1 winds around at least once. * `WindingPolygon[{{p11, p12, ...}, {p21, p22, ...}, ...}]` gives a polygon from the closed contours p11, p12, ... and p21, p22, .... * `WindingPolygon[..., "wrule"]` uses the specified winding rule "wrule" to define the polygon. This function creates polygons from self-intersecting contours using winding number rules. Examples [#examples] ```wolfram WindingPolygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}] ``` ```wolfram (* Star polygon with winding *) WindingPolygon[CirclePoints[5, 2]] ``` ```wolfram Graphics[WindingPolygon[CirclePoints[{1, 0}, {1, 2}, 5]]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WindingPolygon.html) for more details. # Notebook Tools WLJS Notebook is fully accessible from the keyboard. One of the most important key combinations to know is <kbd>Ctrl-P</kbd> or <kbd>⌘-P</kbd>, which brings up the Command Palette. From here, you have access to many small helper utilities, toolboxes, shortcuts, and AI copilot: <div className="relative group"> <div className="absolute -inset-0.5 bg-gradient-to-r from-fd-primary/50 to-purple-500/50 rounded-lg blur blur-3xl opacity-5 group-hover:opacity-10 transition duration-500" /> <div className="invertColor"> <img alt="Command Palette" src={__img0} placeholder="blur" /> </div> </div> import { Share2, CircleQuestionMark } from 'lucide-react'; Most of the utilities are notebooks themselves, which are evaluated in an isolated context whenever you click on a command palette item. You can find the information on each by clicking on <span className="inline-flex"><CircleQuestionMark style={{height:"1rem"}} /></span> icon, that will open the source notebook. User's utilities are stored in `~/Documents/WLJS Notebooks/User palette/` Shortcuts [#shortcuts] Type any of those words to call the action: * **New notebook** - create a new notebook (in a new window) * **New notebook from template** - create a new notebook from a template * **Rename notebook** - rename current notebook * **Debug** - attach a debugger * **Print** - export an entire notebook to PDF Notebooks are heavily cached to avoid excessive writing to disk, therefore avoid renaming an opened notebook outside the WLJS application Utilities [#utilities] Every tool is a normal notebook, which is evaluated in the background and manipulates your working notebook, creating temporal cells whenever you call it from the palette. import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; Insert matrix [#insert-matrix] Creates a small widget in the cell below the focused one that helps to generate and insert matrices (lists of lists). <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-matrix.mp4"} /> </Accordion> </Accordions> Place a cursor to the desired place in the cell and click <small>Insert</small> on the widget. Special characters [#special-characters] Adds a toolbar to the notebook with special characters and snippets for writing nice-looking integrals, sums, and other constructs. <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-chars.mp4"} /> </Accordion> </Accordions> Select the piece of code and apply operation from the toolbar. Or place a cursor to a cell and insert a symbol/expression from the toolbar. Format text [#format-text] Adds a toolbar to the notebook for formatting code (font size, color, background, font face). The widget automatically detect the cell type (Wolfram, Markdown or HTML) of the selected text and adjust wrapping accordingly Select the piece of code and apply operation from the toolbar. Upload ASCII data file [#upload-ascii-data-file] Creates a widget with importing wizard allowing to import CSV/TSV/DAT files, strip headers and insert a file to a cell as an iconized expression Upload file [#upload-file] Basic widget for uploading files Escape string [#escape-string] A helper tool to safely insert strings containing double quotes or other "unsafe" sequences. It will prompt a user to enter text and print a cell with the result. Beautify code [#beautify-code] Formats selected code or entire Wolfram input cell and attempts to apply syntax sugar if possible. If it fails, try <small>Format code</small> instead. <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-beauty.mp4"} /> </Accordion> </Accordions> Select the code or place a cursor in the desired cell and call this tool from the command palette. Format code [#format-code] Formats selected code or entire Wolfram input cell. Action is the same as the previous one, but syntactic sugar is not applied. Find in cells [#find-in-cells] Creates a floating search window and tries to find given expression in all visible cells of the notebook. You can still use a standard search box locally in the individial cells with <kbd>Ctrl/⌘-F</kbd> Show options [#show-options] Attempts to discover the possible options of the given symbol in the cell and present them as an interactive table. <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-options.mp4"} /> </Accordion> </Accordions> Start typing: ```wolfram Plot[x, {x,0} ``` and then call this widget. It will automatically **find the unclosed bracket** and fetch the head `Plot`. Click on the desired options in the table to insert them later, once you click on the green mark icon. Notebook directory [#notebook-directory] Opens a notebook directory using OS's explorer. This will only work with WLJS desktop application Inline navigation helper (Slider) [#inline-navigation-helper-slider] A helper tool that creates a syntactic sugar inline widget on a selected number. It is used in 2D and 3D graphics or any other expression that supports [Offload](./../Interpreter/Offload) aka live-updates: <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-slider.mp4"} /> </Accordion> </Accordions> For example: select a number you want to manipulate and call this tool. It will create an inline widget with a slider. Evaluate your cell, manipulate the slider, and once you are satisfied, click on the mark icon. Check the reference for primitives, that support live updates with `Offload` Inline navigation helper (Drag) [#inline-navigation-helper-drag] A helper tool that creates a syntactic sugar inline widget on a selected pair `{x,y}` or triplet of numbers `{x,y,z}`. It is used in 2D and 3D graphics that support [Offload](./../Interpreter/Offload) aka live-updates: <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-drag.mp4"} /> </Accordion> </Accordions> For example: select a parameter's initial value you want to manipulate and call this tool. It will create an inline widget with a display and place a dragging gizmo on your 2D or 3D canvas. Evaluate your cell, drag the red dot (or 3D sphere), and once you are satisfied, click on the mark icon. If your dragging point overlaps with an object, offset the coordinates before applying this tool: ``` Text["Hello World", Offload[{-0.3,-0.3} + (*BB[*)({0,0})(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwR6dwcAAAAHdFiw="*)(*]BB*)]] ``` Apply dragging tool on highlighted list. Why we used `Offload` - check [this guide](./Dynamic). Inline navigation helper (Joystick) [#inline-navigation-helper-joystick] A helper tool that creates a syntactic sugar inline widget on a selected pair `{x,y}`. It is used in 2D and any other expression that supports [Offload](./../Interpreter/Offload) aka live-updates and accepts a pair of numbers: <Accordions> <Accordion title="Demonstration"> <LazyAutoplayVideo url={"/palette-joy.mp4"} /> </Accordion> </Accordions> For example: select a parameter's initial value you want to manipulate and call this tool. It will create an inline widget with a joystick. Evaluate your cell, manipulate the joystick, and once you are satisfied, click on the mark icon. Take a picture [#take-a-picture] Creates a widget, which uses any available video recording device to take a picture and place it as `Image` to a notebook's cell. Record voice [#record-voice] Creates a widget which uses any available audio recording device to record live audio and place it to a cell as `Audio` object. Crop image [#crop-image] Select an image or image-producing expression in your cell and call this tool. It will evaluate the selected expression and append an interactive widget allowing to do rectangular cropping. Copy InputForm [#copy-inputform] Select the code in the cell and call this tool. It will strip all syntactic sugar from it and copy the pure `InputForm` of the expression to your clipboard. Debugger [#debugger] Debugger can be called from the top <small>Misc</small> menu or from the command palette. It is a tool that attaches to a notebook and a working kernel to intercept the evaluation process and monitor symbol changes. **What it can do:** * Interrupt cell evaluation and possibly inspect the intermediate results * Track changes in symbols values * Break on assertions or symbol changes * See low-level system log **What it cannot do:** * Profile and trace evaluation * Step in / step out Let's have a look at the interface: <div className="relative group"> <div className="absolute -inset-0.5 bg-gradient-to-r from-fd-primary/50 to-purple-500/50 rounded-lg blur blur-3xl opacity-5 group-hover:opacity-10 transition duration-500" /> <div className="invertColor"> <img alt="Command Palette" src={__img1} placeholder="blur" /> </div> </div> **Inspect** is a central mode for debugging. Inspecting Mode [#inspecting-mode] It stops the current execution and allows you to interact with any other cells in the sub-session, enabling you to check the status of various symbols. You can write and evaluate other cells in `Inspect` mode. For example, evaluate this one: ```wolfram Do[k = i; Pause[1], {i, 100}]; ``` Then switch to `Inspect` mode; it will pause the evaluation. Now, you can check the state of the `k` symbol by running a new cell with: ```wolfram k ``` You can always continue execution from this mode by clicking <small>Continue</small> until the next possible break. All transitions take time and depend on the current kernel occupancy. Watching Symbols [#watching-symbols] You can add a symbol to a tracking list to monitor its `OwnValue` in real-time automatically. It won't interrupt your execution unless you enable the checkbox for that option. Live updates are supported only for assignments, i.e., when `symbol = *newValue*`. If you mutate a part of a `List`, it won't trigger an update. Breakpoints [#breakpoints] In Wolfram Language, traditional breakpoints are difficult to implement since there is no *source code file* in the classical sense. Everything is an expression, and a breakpoint must be an expression as well. There are two sources for breaking events, both of which immediately switch the kernel to <small>Inspecting Mode</small>. Asserts [#asserts] First, **enable breaking on assertions** from the dropdown menu in the top bar of the debugger. Then, whenever execution encounters `False` in an [Assert](./../Misc/Assert), it will break. For example: ```wolfram Do[k = i; If[i > 6, Assert[False, "Hey"]]; Pause[1], {i, 100}]; ``` This code will break automatically after 6 seconds. In <small>Inspect</small> mode, evaluating `k` will return `7`. If you track the `k` symbol at the same time, you will see it changing in the debugger window. Symbols [#symbols] When a symbol is assigned a new value, it generates an event in the debugger. Use the <small>Break on</small> checkbox to enable breaking. For example: ```wolfram Do[k = i; If[i > 6, test = Now]; Pause[1], {i, 100}]; ``` This code will break after 6 iterations. AI Copilot [#ai-copilot] If nothing is selected, text typed into the command palette is sent to a remote or local LLM, which **has read/write access to the whole notebook**. We use a "knowledge on demand" concept, meaning that additional notebook-specific information (like cell types) is only fetched when needed — saving tokens if your request is unrelated. Given tools are somewhat similar to VSCode Copilot: * **Create and evaluate cells** (any types) * **Read/Edit cells by lines** * **Operate in batches** * **See a notebook structure** * **See selection lines and focused cell** * **Access the knowledge library** * **Read symbols truncated documentation** * **Manage internal TODO list** * **Evaluate any WL expresson in the background** <br /> <br /> Tips [#tips] * Mention `focused cell` in the prompt to avoid model to spend tokens for searching the whole notebook. * Mention `consult docs` in the prompt for weaker models to force them checking the documentation on different cell types or features of interactive evaluation in Wolfram language cells. * In general most LLMs perform much worse in Wolfram Language coding compared to other languages. Try to formulate your task better. * Use smaller models for grammar corrections, primitive tasks, i.e. Haiku 3.0 for example Examples [#examples] Here are two notebooks for the comparison: original one with arbitrary data inside and processed by AI copilot (Anthropic Opus 4.6 model). The initial prompt: > Read carefully all cells. Improve description (add or edit markdown cells). Add a nice header to this notebook <Accordions> <Accordion title="Original"> <iframe className="rounded" src="/before_ai" width="100%" height="500px" /> </Accordion> <Accordion title="Processed"> <iframe className="rounded" src="/after_ai" width="100%" height="500px" /> </Accordion> </Accordions> Endpoints, Models, and Local LLMs [#endpoints-models-and-local-llms] There are 3 different models provided available: * OpenAI (Anything higher than gpt-4o is recommended for complex tasks) * Anthropic (Haiku 4.5, Opus 4.1 or higher are recommended for complex tasks) * Custom model provider (your local LLM for example) We recommend Anthropic models for coding in WL from our experience You will be prompted automatically for the model to pick (except for a custom provider) and API key if applicable. Model-autodiscovery feature is present. There is a dedicated section in the settings menu of WLJS Notebook to setup your local/custom model and reset existing API keys: import { Dot, Settings } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Command palette </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> AI Assistant </div> </div> </div> You can configure the following for <small>Custom Model</small>: * **Endpoint**: By default, WLJS Notebook sends requests to the address: `<endpoint>/v1/chat/completions` * **Model** * **Max tokens** * **Temperature** Local LLM [#local-llm] We recommend using the Ollama server to take advantage of locally running models. For example, the following parameters can be set initially: * **Endpoint**: `http://localhost:11434/` — the default Ollama server * **Model**: `qwen3:8b`, a small 5 GB tested model With local LLMs, the performance and quality of the AI assistant may depend on many parameters. In general, the waiting time increases significantly compared to the commertical ones. Note on cell types [#note-on-cell-types] The assistant is aware of being in a notebook environment. The following cell types are well-described in the initial system prompt: * Wolfram * JavaScript * HTML * Slides * Mermaid diagrams Additionally, differences between Wolfram Mathematica and WLJS Notebook are included to the library (on-demand). Documentation for LLM [#documentation-for-llm] If needed copilot searches the documentiation on a given symbol using LLM-friendly compilation of our entire website: [https://wljs.io/llms-full.txt](https://wljs.io/llms-full.txt) Printing option [#printing-option] Locate <small>Print</small> from the <small>File</small> menu or from the command palette to print an entire notebook as PDF. This feature requires WLJS desktop application and will not work from a web-browser Page breaks [#page-breaks] Use [Markdown cell](./../Cell-types/Markdown) with `PageBreakAbove` or `PageBreakBelow` symbols to force page breaks, i.e.: ```markdown .md <PageBreakAbove/> ``` Installing Packages [#installing-packages] How to install new packages locally? [#how-to-install-new-packages-locally] Via Command Palette [#via-command-palette] Open your notebook and **paste the GitHub link to a repo**<sup>+</sup> or **URL to `.paclet` file** to the command palette located on the top bar. <sup>+</sup> It must contain a `PacletInfo.wl` file in the root directory of the repository. Via LPM [#via-lpm] Create a new cell and insert: ```wolfram LPMRepositories[{ "Github" -> "https://github.com/user/MyLibrary" }] <<MyLibrary` ``` *or using direct link to a paclet file* ```wolfram LPMRepositories[{ "Github" -> "https://publicURL/MyLibrary.paclet" }] <<MyLibrary` ``` This will create a local folder named `wl_packages`, where installed packages will be stored. Global Installation (Classic) [#global-installation-classic] Via Paclets [#via-paclets] If the package is hosted on the Wolfram repository, then you can simply run: ```wolfram PacletInstall["Username/Paclet"] <<PacletContextName` ``` Or from a local paclet file: ```wolfram PacletInstall["path_to_it.paclet"] <<PacletContextName` ``` Namespaces [#namespaces] If you have conflicting symbol names or want to scope loaded package into an alias context: ```wolfram Needs["PacletContextName`"->"myAlias`"] ``` Settings [#settings] In the settings menu <Settings width={"1rem"} /> you can adjust **accent-colors**, **light/dark mode**, **home folder**, **backups** and many other things related to the editing and exporting. Cli [#cli] WLJS Notebook app registers (if you allowed this during the installation) a tiny CLI-tool globally in your operating system. Here is a list of commands you can use Open current folder [#open-current-folder] ```bash wljs . ``` Open a file by path [#open-a-file-by-path] ```bash wljs "full path..." ``` Execute a command [#execute-a-command] ```bash wljs -c [command] [args...] ``` This pattern sends a command to all extensions used by WLJS Notebook. The list of known commands follows share [#share] It allows to share notebooks programmatically in different forms *Export notebook to HTML* ```bash wljs -c share -i "path to wln notebook" -o "path to output file" -t html ``` *Export notebook to HTML using the same path* ```bash wljs -c share -i "path to wln notebook" -t html ``` List of supported output types: * `html` * `nb` * `md` * `mdx` Version of CLI [#version-of-cli] ```bash wljs -v ``` # Interactive evaluation and granular updates How to handle user interaction with sliders, graphics primitives and other input building blocks </Cards> import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <wljs-store kernel="/attachments/2517cc87-kernel-1138499539191000322.txt" json="/attachments/71469c7a-1428538d-8ba6-4739-b6f6-48430d6f459b.txt" /> Manipulate and Animate Functionality [#manipulate-and-animate-functionality] WLJS Notebook partially inherits a well-known killer feature of Wolfram Mathematica - [Manipulate](./../GUI/Manipulate), [Animate](./../GUI/Animate), and others, allowing interactive evaluation of arbitrary expressions: ``` Manipulate[ Plot[Sin[a x + b], {x, 0, 6}], {{a, 2, "Frequency"}, 1, 4, 1}, {{b, 0, "Phase"}, 0, 10, 1}, ContinuousAction->True ] ``` ``` (*VB[*)(FrontEndRef["ce2264d6-e74f-462b-9e17-08fcbeb7437b"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ6caGZmZpJjpppqbpOmamBkl6VqmGprrGlikJSelJpmbGJsnAQCG2BXe"*)(*]VB*) ``` Text strings or any other symbolic expressions can also be manipulated: ``` Manipulate[Column[{ Style[StringTemplate["\`\` m/s"][v], Blue], Table["🚗", {i, Floor[v/25]}] // Row }], {v,10,100}, ContinuousAction->True] ``` ``` (*VB[*)(FrontEndRef["654d9ea0-69e9-4448-abea-c729bba1ed7f"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5mapFimJhromlmmWuqamJhY6CYmpSbqJpsbWSYlJRqmppinAQCGahZA"*)(*]VB*) ``` Under the hood, it uses a diff algorithm to interpret changes between old and new expressions evaluated using corresponding parameters. Then, if possible, the expression is transformed into a more optimized one that uses [granular updates](#Granular%20Updates) instead of full re-evaluation. To publish interactive widgets on web - export a notebook to [HTML](./../Share/Standalone-HTML) or MDX `Animate` works in a similar way, but scans the parameter automatically: ``` Animate[ ParametricPlot[ReIm @ Exp[-I (\\[Phi] + \\[Gamma] I \\[Phi])], {\\[Phi],0,5Pi}, PlotLabel->StringTemplate["\\[Gamma] = \`\`"][\\[Gamma]] ] , {\\[Gamma],0,0.5}] ``` ``` (*VB[*)(FrontEndRef["ac784f29-dc89-4ee5-86a8-582b311c6466"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyabW5ikGVnqpiRbWOqapKaa6lqYJVromloYJRkbGiabmZiZAQCHwxVc"*)(*]VB*) ``` To export animations as GIF use [AnimatedImage](./../Image/AnimatedImage) . To publish live animations export a notebook to [HTML](./../Share/Standalone-HTML) or MDX For symbolic data it works too: ``` Animate[{x, (*SpB[*)Power[x(*|*),(*|*)2](*]SpB*)} // NumberForm, {x,0,10}] ``` ``` Animate[Row[{Sin[x], "==", Series[Sin[x], {x,0,n}], Invisible[1/2]}], {n, 1, 10, 1}, RefreshRate->3] ``` If you need to periodically check a symbol or re-evaluate an expression, use [Refresh](./../GUI/Refresh): ``` Refresh[Now, 1] ``` It can work for images and many other types as well utilizing the same diff algorithm of `Manipulate`: ``` img = ExampleData[{"TestImage", "Lena"}]; Refresh[(img = EdgeDetect[img] 0.05 + img; img), 0.1] ``` Syntax for `Refresh` expression differs from one used in Mathematica More specialized functions [#more-specialized-functions] We recommend using [ManipulatePlot](./../Plotting-Functions/ManipulatePlot) and [ManipulateParametricPlot](./../Plotting-Functions/ManipulateParametricPlot) for simple interactive curve plotting, since they are more optimized and do not require the diff algorithm to run: ``` ManipulatePlot[ (*TB[*)Sum[(*|*)(*FB[*)((Sin[2π(2j - 1) x])(*,*)/(*,*)(2j-1))(*]FB*)(*|*), {(*|*)j(*|*),(*|*)1.0(*|*),(*|*)n(*|*)}](*|*)(*1:eJxTTMoPSmNiYGAoZgMSwaW5TvkVmYwgPguQCCkqTQUAeAcHBQ==*)(*]TB*) , {x, -1,1}, {{n,4}, 1,7, 1}] ``` ``` (*VB[*)(FrontEndRef["4580b8e8-5239-41bc-b46e-541b291fce69"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm5haGCRZpFromhoZW+qaGCYl6yaZmKXqmgKZRpaGacmpZpYAeLYVTg=="*)(*]VB*) ``` [AnimatePlot](./../Plotting-Functions/AnimatePlot) and [AnimateParametricPlot](./../Plotting-Functions/AnimateParametericPlot) use a different strategy and precalculate all curves before animating: ``` AnimateParametricPlot[ With[{t = If[x > lim,lim,x]}, N[Exp[-(*FB[*)((1)(*,*)/(*,*)(3))(*]FB*) Floor[(*FB[*)((x)(*,*)/(*,*)(4 \\[Pi]))(*]FB*)]] ReIm[(*SpB[*)Power[I(*|*),(*|*)-t](*]SpB*) + 3 ((*SpB[*)Power[I(*|*),(*|*)t/3](*]SpB*))]] ] , {x, 0.1\`, 16 \\[Pi]}, {lim, 0.1\`, 16 \\[Pi]} ] ``` ``` (*VB[*)(FrontEndRef["7d570729-f4d3-47d7-947e-3022f973c962"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm6eYmhuYG1nqppmkGOuamKeY61qamKfqGhsYGaVZmhsnW5oZAQB2dBTQ"*)(*]VB*) ``` Granular Updates [#granular-updates] The way how you update things like points and lines on your plots, images, or bind those elements to the changes of data differs from one used in [Pluto.jl](https://plutojl.org/en/docs/bind/), [Marimo](https://docs.marimo.io/#a-reactive-programming-environment) and [Wolfram Mathematica](https://reference.wolfram.com/language/ref/Dynamic.html?q=Dynamic). If the last one uses 2-ways binding, we rely on 1-way. The key changes were made for the sake of [performance](./../Overview/###%20Performance) and simplicity. Architecture [#architecture] WLJS mostly uses retained mode for managing objects on screen, which means `Line` or `Point` has a dedicated method to update itself when the dependencies change. Not all primitives have an update method implemented—please check our symbols reference section to confirm. The dependencies are resolved and the changes are propagated by the frontend (browser), not by the evaluation kernel. To create such a dependency, you need to "offload" an expression to be executed on the frontend. For example: ``` l = 1; Graphics[{Cyan, (*BB[*)(Rectangle)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb5oDhi8sS+qB4P39gBJMR34"*)(*]BB*)[{-1, -1}, {(*BB[*)(l)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*) // Offload, 1}] }] ``` ``` (*VB[*)(Graphics[{RGBColor[0, 1, 1], Rectangle[{-1, -1}, {Offload[l], 1}]}, ImageSize -> {200, 50}])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIB4HkHAvSizIyEwuhoiA5H0yi0vSmGHyQe5Ozvk5+UWZQDZDJiOMgCjnBClITS5JzEvPSUU1IfM/EIAJNJPB7mAHEv5paTn5iSnFIIEcJENBKoNKc1LBpnvmJqanBmdWoZt+AuQQIyABAKYtMQs="*)(*]VB*) ``` Here we used [Offload](./../Interpreter/Offload) to tell Wolfram Kernel not to evaluate symbol `l` and keep it for evaluating on the frontend. In this example above the binding happens between [Rectangle](./../Graphics/Rectangle) and `l`. Nothing stops us from offloading a derived expression from the same symbol: ``` Graphics[{Pink, (*BB[*)(Disk)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb5oDhi8sS+qB4P39gBJMR34"*)(*]BB*)[{(*BB[*)(l)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*), (*BB[*)(l)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*)}//Offload, (*SpB[*)Power[(*BB[*)(l)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*)(*|*),(*|*)2](*]SpB*) // Offload] }, PlotRange->{{0,1}, {0,1}}] ``` ``` (*VB[*)(Graphics[{RGBColor[1, 0.5, 0.5], Disk[Offload[{l, l}], Offload[l^2]]}, PlotRange -> {{0, 1}, {0, 1}}, ImageSize -> 200])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWnMIB4HkHAvSizIyEwuTmOCyftkFpcg5IPcnZzzc/KLMkH6ixjA4IE9nIHQ5pJZnA2xhB1I+Kel5eQnpqCaWgySzoGQOJSyAomA/PLUIoiqTJAgwpCg0pzUYk6Qkpz8kqDEvPRUNGej8DJBTgS7m7A43GTP3MT01ODMqtTME0AeACW2OtE="*)(*]VB*) ``` Here the radius of `Disk` depends on `l^2`, therefore when `l` changes, it recalculates the derived square of this symbol. Now let's try to update our symbol: ``` l = 0.33; ``` Using a [slider](./UI-Events-Capture) we can observe the change easier: ``` EventHandler[InputRange[0,1,.1], Function[val, l=val]] ``` ``` (*VB[*)(EventObject[<|"Id" -> "f9254465-73cd-4a66-a54d-97a1a96543a4", "Initial" -> 0.5, "View" -> "13864cb4-9741-4d0f-9746-459803ffa629"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKGxpbmJkkJ5noWpqbGOqapBikgVhmuiamlhYGxmlpiWZGlgByOxTK"*)(*]VB*) ``` Here we used a built-in UI element `InputRange` with a basic event handler assigned to it, that updates our symbol with a new value. When a new value is assigned to `l` symbol, Wolfram Kernel pushes a new value using a <abbr title="Binary WebSockets">fast binary protocol</abbr> to the frontend, that updates all visible instances coupled to `l`. <Accordions> <Accordion title="Why and how this works"> When you apply `Offload`, it is effectively a `Hold` expression that keeps an expression to be evaluated on the frontend. On the frontend (browser), it is parsed and executed by the WLJS Interpreter - a subset of Wolfram Language written in Javascript. This subset includes basic math operations and some frontend-specific symbols like [Alert](./../Interpreter/Alert) or [ReadClipboard](./../Interpreter/ReadClipboard) **marked in the documentation** as <small>Frontend</small> in the heading, as well as `Table` and `With`. Whenever the interpreter sees an undefined symbol, it fetches it from Wolfram Kernel and requests tracking of changes. We call these *dynamic symbols*. Dynamic symbols, as well as `Line`, `Point`, and `Image`, are defined on both sides: frontend and kernel, and belong to a special class that can bind to each other and listen to changes. For example, even if the expression is nested: ``` x = 0.4; (*BB[*)(Line)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb5oDhi8sS+qB4P39gBJMR34"*)(*]BB*)[Offload[{{0,0}, {(*BB[*)(x)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*) + 1, 1}}]] // Graphics ``` ``` x = -0.5; ``` The changes will propagate through `List`, `Plus` to the nearest symbol that listens to changes - `Line`. However, `Graphics` itself as a symbol also belongs to the same class as `Line`, but for the moment it ignores any changes and generally does not support updates. Another example is `Image`, it does support updates and copies raw bitmap data (or preprocesses it to the right format if needed) whenever the change occurs to a GPU texture. The same `Line` or `Polygon` primitive in the context of `Graphics3D` also copies its vertices to a GPU buffer without any preprocessing allowing to have up to 1 million triangles updated with a decent FPS. Read more on how to define symbols or functions such as `Line` on the frontend in this guide: Overview of frontend symbols / function, how to define and use them </Cards> Not all expressions can be passed to *dynamic symbols*, here is a full list: * `List`, nested `List` * `Association`, nested `Association` * `Sin`, `Cos`, `Sqrt`, `Pi, `E\` basic math functions * `Integer`, `Real` * `NumericArray` * `ByteArray` * `String` Note this **does not restrict** what you can put inside `Offload`; it only limits the assignment values to *dynamic symbols*. </Accordion> </Accordions> More examples [#more-examples] The provided data does not have to be numerical, it can be textual as well. Here is an example with **text spray**: ```wolfram Module[{ text = "Hello World" }, Column[{ EventHandler[InputText[text], (text = #)&], Graphics[Table[{ RandomColor[], Rotate[ Text[text // Offload, RandomReal[{-1, 1}, 2]], RandomReal[{0, 3.14}] ] }, {40}]] }] ] ``` Demonstration: <LazyAutoplayVideo url={"/dyn_helloworld.mp4"} /> One can also stream lists and arrays. Per-element operations on `List` **do not trigger data synchronization** between Wolfram Kernel and frontend. You need to perform an assignment: ```wolfram sym[[1]] = 4.0; (* nothing happens *) sym = sym; (* update! *) ``` This example showcases a basic <abbr title="Forward-Backward ... blah....">FABRIK</abbr> solver written in 2 cells of Wolfram Language: ```wolfram ClearAll[handler]; SetAttributes[handler, HoldFirst]; handler[chain_] := Function[target, Module[{buffer = chain, origin = {-1,0}, prev = chain, lengths = Norm /@ (chain // Reverse // Differences) // Reverse}, buffer = Table[With[{p = chain[[-i]]}, If[i === 1, prev = target; target , prev = prev - Normalize[(prev - p)] lengths[[1-i]]; prev ] ] , {i, chain // Length}] // Reverse; buffer = Table[With[{p = buffer[[i]]}, If[i === 1, prev = origin; origin , prev = prev - Normalize[(prev - p)] lengths[[i-1]]; prev ] ] , {i, chain // Length}]; chain = buffer; ] ]; ``` ```wolfram chain = Table[Exp[-ϕ]{-Cos[ϕ], Sin[ϕ]}, {ϕ, 0, π - π/7, π/7.0}]; Graphics[{ Line[chain // Offload], Black, PointSize[0.04], Point[chain // Offload], Red, EventHandler[Point[chain // Last], { "drag" -> handler[chain] }] }, Axes->True, PlotRange->{{-1,0.2}, {0,0.4}} ] ``` Here is a demonstration: <LazyAutoplayVideo url={"/dyn_fabrik.mp4"} /> The beauty of this approach is that we do not need to run the update cycle continuously, but only when a user drags a control point. <Accordions> <Accordion title="Advanced: Generating curves on the frontend"> We can push `Offload` further and run a small program inside, which generates a set of points without Wolfram Kernel. The interpreter supports a small subset of Wolfram Expressions including `Table` and `With`. Let's use them inside `Offload`: ```wolfram scale = 10.0; pos = {0,0}; Graphics[ Line[Offload[ With[{p=pos, s=scale}, Table[(Exp[-a/s]{Sin[a], Cos[a]})+p, {a,0,8Pi,0.1}] ] ]] ] ``` ``` (*VB[*)(Graphics[Line[Offload[With[{p = {0, 0}, s = 10.}, Table[Exp[-a/s]*{Sin[a], Cos[a]} + p, {a, 0, 8*Pi, 0.1}]]]], ImageSize -> 270])(*,*)(*"1:eJxlUFEKwjAMrTpRf7yD4D0URFQYODbB7047F+jWsWwo3kRv4uk0Xce6zXy89uXlJU0XofKjAWMMHYK9ktdoqNmUYJfzLIYLWt2FVBg2IThGkVS8Nmj5DEVsmQtYGDYiCESB2pl1C4BOVsF/KeasiuXaaGOCEw+lsC08WWJLhETUr9V9to+sr3UpfCmqUdwqnrqL3Myv9N5CTfcA0trapDYKTare1Gk7jdJa1T5DfzbqnAf5+6Xjs7Jj/VIKnNHlkPCbCOApYE69fio4V14="*)(*]VB*) ``` Here we passed `pos` and `scale` as `p` and `s` in order to create only 2 instances of *dynamic-symbols*. Every time we change them on Wolfram Kernel, the whole curve is regenerated on the frontend: ```wolfram scale = 5.0; ``` </Accordion> </Accordions> 3D graphics features in updates are more limited compared to 2D, but you can still do many things with the simple `Offload` technique. For example, manipulate radii of [Tube](./../Graphics3D/Tube) sections: ```wolfram tube = Table[5.0, {40}]; Graphics3D[{ LABColor[0.2,0.4,0.5], Directive["Roughness"->0.0, "Ior"->5.0], Tube[ Table[20.0{-Cos[2Pi i/39.0],Cos[2Pi i/39.0],Sin[2Pi i/39.0]}, {i,1.0,Length[tube]}], Offload @ tube ] }] ``` and run the update cycle: ``` Do[ tube = Sum[ Table[.5+5. (*SpB[*)Power[Sin[(*FB[*)((i-j+k)(*,*)/(*,*)(39.0))(*]FB*) Pi i/20.0](*|*),(*|*)2](*]SpB*), {j,Length[tube]}], {k,0,3 40,40}]/2.0; Pause[0.02]; , {i, 1, 100.0, 0.25}]; ``` Here is how it looks: <LazyAutoplayVideo url={"/dyn_tube.mp4"} /> Here is another example combining [event handling](./UI-Events-Capture) and `Offload`: <Accordions> <Accordion title="Advanced: Interactive Bars with local states"> Here is an example of how you can generate multiple bars, each with its own event listener and state control: ```wolfram bar[initial_:0, dims_:{{-1,-1}, {1,1}}] := Module[{state = initial}, { LightBlue, EventHandler[Rectangle@@dims, {"mousemove" -> Function[pos, state = pos[[2]]]}], LightRed, Rectangle[{dims[[1,1]], 0}, {dims[[2,1]], Offload[state]}] } ] ``` Now, we can create any of these bars and render them on a canvas: ```wolfram Graphics[Table[Translate[bar[], {2i,0}], {i, -5,5}], PlotRange->{{-10,10}, {-1,1}}, ImagePadding->None] ``` </Accordion> </Accordions> Colors and Opacity [#colors-and-opacity] In Wolfram Language color, opacity and other directives are automatically applied to all primitives, even scoped with a `List` appearing after them, i.e.: ``` {Red, (*BB[*)(Disk[...])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVF8WDw3r5IAAwe2BfNAYM79gBQ7x14"*)(*]BB*), Blue, {(*BB[*)(Disk[...])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVF0mBw277o108QeGlfdP8eCLyzBwCCPCLr"*)(*]BB*), (*BB[*)(Line[...])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVF0mBw277o108QeGlfdP8eCLyzBwCCPCLr"*)(*]BB*)}} ``` Therefore if we use *dynamic symbols* and offload them to the frontend, there will be 2 types of binding: ``` opacity = 1.0; Graphics[{ Triangle[], (*BB[*)(Opacity)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb5oDhi8sS+qB4P39gBJMR34"*)(*]BB*)[(*BB[*)(opacity)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFDGDwwb7o7x8QeGNf9PEDCDywBwB4XSLR"*)(*]BB*) // Offload], Red, (*BB[*)(Disk)(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRAeB5AILqnMSXXKr0hjgskHleakFnMBGU6JydnpRfmleSlpzDDlQe5Ozvk5+UVFd26DgX3Rgvkg8N6+6NJFEHhoDwDL+yT7"*)(*]BB*)[{0,0}, 0.25] }] ``` from `opacity` to `Opacity` directive, and from `Disk` to `opacity`. When we update `opacity`, the whole chain will be pulled: ```wolfram opacity = RandomReal[{0,1}]; ``` To update `RGBColor` or `Hue` you need to bind them in the same way: ```wolfram color = {1.0,1.0,1.0}; Graphics[{RGBColor[color//Offload], Disk[]}] ``` For convenience, you may apply the following pattern: ```wolfram color = List@@RGBColor[Pink]; ``` ```wolfram color = List@@RGBColor[LABColor[0.6,0.5,0.5]]; ``` To stop propagation of color deeper - scope your affected primitives with a list `{}` `RGBColor`, `Hue`, and `Opacity` currently support updates only in the context of `Graphics`. Animation [#animation] Low-level animation can be done in two ways: Transitions [#transitions] This one is reserved exclusively for [Graphics](./../Graphics/Graphics) or higher-order functions like `Plot*` or `HighlightImage`, which produce `Graphics`. Any update to a primitive is interpolated on the frontend by default. You can control it with [TransitionType](./../Graphics/TransitionType) and [TransitionDuration](./../Graphics/TransitionDuration) directives, set globally as an option to `Graphics` or locally using `Directive`. Here is an example: ```wolfram pos = {-1,0}; Graphics[{ Directive["TransitionType"->None], Disk[(pos+{0,0.5})//Offload, 0.1], Directive["TransitionType"->"Linear"], Disk[(pos)//Offload, 0.1], Directive["TransitionType"->"CubicInOut"], Disk[(pos+{0,-0.5})//Offload, 0.1] }, PlotRange->{{-1,1}, {-1,1}}, "TransitionDuration"->2000 ] ``` Then update the positions instantly: ```wolfram pos = -pos; ``` <LazyAutoplayVideo url={"/dyn_balls.mp4"} /> This interpolation can also help visually if Wolfram Kernel can't keep up with updates in real-time or your animation looks choppy. Most primitive properties can be interpolated, except color and opacity. Disable interpolation by setting `"TransitionType"` to `None` if your animation has to be real-time. Otherwise it may cause more harm than use Interpolation is not available for 3D graphics, since it is too expensive in terms of computation Frames [#frames] AF is a built-in library for creating complex event-driven 2D animations in a functional style. </Cards> The naive way of animating things could be something like a loop with `Pause`: ```wolfram Do[data = animate[i]; Pause[0.01], {i, 99999}] ``` This will work. However, it is a suboptimal approach: it blocks the kernel, it is not in sync with the screen refresh (which may cause flickering), and there is no reliable way to embed it in [a presentation](./../Cell-types/Slide) or simply suspend it. To solve these issues for any type of animated graphics, use [AnimationFrameListener](./../Graphics/AnimationFrameListener). It does a few things: * It fires an event before the next paint cycle of a window * It has to be "reloaded" by a change to some symbol for the next shot * Animation stops if the app is not visible or the parent expression has been removed These lead to: * Animation does not block your basic evaluation cycle (async) * Animation will run as fast as your computation cycle allows and will not spam the computation kernel * Animation is in sync with your hardware and clamped to the maximum screen refresh rate * Animation will not run in the background by accident Here is an example with many 3D spheres animated: ```wolfram balls = RandomReal[{-1,1}, {100,3}]; vels = RandomReal[{-1,1}, {100,3}]; Graphics3D[{ Table[With[{i = i}, { RGBColor[RandomReal[{0,1}, 3]], Sphere[balls[[i]] // Offload, 0.03] } ], {i, Length[balls]}], EventHandler[AnimationFrameListener[balls // Offload], handler] }] ``` Here `balls` is passed as a dependency to `AnimationFrameListener`, acting as a trigger that signals the animation is complete and needs to fire an event handled by the `handler` function for the next frame. Let's define our basic handler function that updates the ball positions: ```wolfram handler[_] := With[{}, vels = Table[ If[Norm[balls[[i]]] < 0.01, -1, 1] vels[[i]] - 0.08 balls[[i]] , {i, Length[balls]}]; balls = Table[balls[[i]] + 0.08 vels[[i]], {i, Length[balls]}]; ] ``` To start the animation, you need to evaluate the first cell we described or kick-start it by manually triggering an update: ```wolfram balls = balls; ``` <LazyAutoplayVideo url={"/balls-300-fps-ezgif.com-crop-video.mp4"} /> To interrupt an animation, you can simply break the cycle: ```wolfram handler[_] := Null; ``` Animation can be exported in a manual sampling mode to [HTML](./../Share/Standalone-HTML) or [MDX](./../Share/Markdown-React) . GIF or video exporting option is not available out of the box - use screen recording software Here is another nice and easy example with 2D points: ```wolfram pts = RandomReal[{-1,1}, {100, 2}]; Graphics[{ Point[pts // Offload], EventHandler[AnimationFrameListener[pts//Offload], Function[Null, pts = Map[(# + 0.01 Normalize[{-1,1} #[[{2,1}]]])&, pts]; ]] }, TransitionType->None] ``` In some cases, timers can also be used. If your animation is slow and you do not need to be in sync with the screen, use [SetInterval](./../Misc/Async). Here is a previous example rewritten with timers: ```wolfram TaskRemove[task] // Quiet; Module[{ path = {{0,0}} }, task = SetInterval[ path = Append[path, Last[path] + RandomChoice[{ {0,1}, {0,-1}, {1,0}, {-1,0} }]]; , 100]; Graphics[{ Line[path//Offload] }, PlotRange->20{{-1,1},{-1,1}}, "TransitionType"->None ] ] ``` <LazyAutoplayVideo url={"/dyn_maze.mp4"} /> However, now you are responsible for stopping the `task`. Timers can run even when all notebooks are closed Combine with Animate [#combine-with-animate] You can combine the power of high-level and low-level animation methods by overriding the update function of `Animate`. For example: ```wolfram Module[{pts}, Animate[Graphics[{ Circle[{0,0},1], Red, Point[pts // Offload] }, ImageSize->Small], {t, 0, 2Pi, 0.1}, "UpdateFunction" -> Function[t, pts = {Sin[t], Cos[t]}; False ]] ] ``` Here `UpdateFunction` returns `False`, which prevents the default update cycle of `Animate` and applies only our `pts` assignment instead. As an advantage, you get UI controls for your custom animation for free. You can improve the previous example by increasing the refresh rate and disabling interpolation: ```wolfram Module[{pts}, Animate[Graphics[{ Circle[{0,0},1], Red, Point[pts // Offload] }, ImageSize->Small, "TransitionType"->None ], {t, 0, 2Pi, 0.04}, "UpdateFunction" -> Function[t, pts = {Sin[t], Cos[t]}; False ], RefreshRate->60] ] ``` How to keep and update many objects [#how-to-keep-and-update-many-objects] In the example above, we tried the ideal cases when one can substitute many data points into a single primitive. In reality, you might need to give them different properties, colors, and so on. For this, we need to address each element by index explicitly and wrap everything with `Offload`: ```wolfram pts = RandomReal[{-1,1}, {100, 2}]; Graphics[ Table[With[{i=i}, {Point[pts[[i]]] // Offload}], {i, 100}] ] ``` or like this: ```wolfram pts = RandomReal[{-1,1}, {100, 2}]; Graphics[ Table[With[{i=i}, {Point[pts[[i]] // Offload]}], {i, 100}] ] ``` In both cases we keep the expressions `pts[[1]]`, `pts[[2]]` ... to be evaluated on the frontend. <Accordions> <Accordion title="Wrong solution"> For example **not like that** ❌ ```wolfram pts = RandomReal[{-1,1}, {100, 2}]; Graphics[ Table[{Point[pts[[i]]]}, {i, 100}] // Offload ] ``` Here `Table` will run on the frontend every update leading to tons of memory leaks. </Accordion> </Accordions> We don't dynamically create points; we statically create them on Wolfram Kernel and offload the position of each point. Let's now stylize our points: ```wolfram pts = RandomReal[{-1,1}, {400, 2}]; col[r_] := With[{n=Clip[Norm[r]/2]}, RGBColor[1-n, n, n]] Graphics[ Table[With[{i=i}, {col[pts[[i]]], Point[pts[[i]]] // Offload}], {i, 400}] ] ``` ```wolfram Do[ pts = Map[(# + 0.01 Normalize[{-1,1} #[[{2,1}]]])&, pts]; Pause[1/27.0]; , {50}]; ``` <LazyAutoplayVideo url={"/dyn_multi1.mp4"} /> With **zero-cost** we can generate more points using the same `pts` using simple math operations ```wolfram pts = RandomReal[{-1,1}, {400, 2}]; col[r_] := With[{n=Clip[Norm[r]/2]}, RGBColor[1-n, n, n]] Graphics[ Table[With[{i=i}, {col[pts[[i]]], Point[1.1 pts[[i]]] // Offload, Point[pts[[i]]] // Offload}], {i, 400}] ] ``` <LazyAutoplayVideo url={"/dyn_multi2.mp4"} /> Multidimensional arrays [#multidimensional-arrays] The idea is the same; however, you have to be careful with the `Part` or `[[]]` operator. Our frontend engine does not fully support all the complex syntax of Wolfram Language. Here is a perfectly valid expression evaluated on Wolfram Kernel: ```wolfram multipts[[i,j]] ``` while for the frontend **you should do this**: ```wolfram multipts[[i]][[j]] // Offload ``` On Wolfram Kernel it is considered to be less efficient, but our Javascript implementation does the second `Part` using references only. Here is an example with a multidimensional array, where the first part stores color and the second one stores the position: ```wolfram mpts = {Clip[Norm[#]], #} &/@ RandomReal[{-1,1}, {400, 2}]; Graphics[ Table[With[{i=i}, { Hue[mpts[[i]][[1]]], Point[mpts[[i]][[2]]] } // Offload], {i, 400}], "TransitionDuration"->30 ] ``` ```wolfram Do[ mpts = Map[{ If[#[[1]]>0.95, 0, #[[1]] + 0.025], #[[2]] + 0.01 Normalize[{-1,1} #[[2, {2,1}]]] }&, mpts]; Pause[1/30.0]; , {100}]; ``` <LazyAutoplayVideo url={"/dyn_multi3.mp4"} /> How to append/remove objects [#how-to-appendremove-objects] For basic cases, `Line`, `Point`, and `Polygon` naturally support variable numbers of points or vertices: ```wolfram points = {{0,0}}; Graphics[{Point[points//Offload]}, PlotRange->{{-1,1},{-1,1}}] ``` ```wolfram Do[ points = Append[points, Last[points]+RandomReal[0.1{-1,1},2]]; Pause[0.03]; , {100}]; ``` Appending [#appending] To append new complex objects to an existing visible plot or graphical canvas (i.e., `Graphics`, `Graphics3D`), you need to reference it and submit an expression to be evaluated there as if it were present from the beginning. Expressions that support updates ( `Offload` ) can usually be appended to or removed from an existing graphical instance as well The particular context of the instance can be referenced with [FrontInstanceReference](./../Frontend-IO/FrontInstanceReference): ```wolfram ref = FrontInstanceReference[]; Plot[x, {x,0,1}, Prolog->{ ref }] ``` `ref` will point directly to what is inside `Prolog`. If any color directives are present, they will be applied automatically to the submitted expressions. To submit anything for frontend evaluation, use [FrontSubmit](./../Frontend-IO/FrontSubmit). Using the second optional argument, we specify **where** to evaluate the expression. For example, to add a red circle on our existing plot: ```wolfram FrontSubmit[{Red, Disk[{0.5,0.5}, 0.5]}, ref] ``` You can also apply specific actions using `FrontSubmit` to a plot. For example, to zoom or pan programmatically: ```wolfram FrontSubmit[ZoomAt[1.2, {0.5,0.5}], ref] ``` This specific expression [ZoomAt](./../Graphics/ZoomAt) only *lives* on frontend and has no action being evaluated on Wolfram Kernel. Here is another example, let's call it *Bubbles*: ```wolfram ref = FrontInstanceReference[]; EventHandler[Plot[x, {x,0,1}, Epilog->{ ref }], {"mousemove" -> Function[xy, FrontSubmit[{ RandomColor[], Disk[xy, {0.7, 1} RandomReal[{0.01, 0.1}]] }, ref] ]}] ``` <LazyAutoplayVideo url={"/dyn_bubbles_simple.mp4"} /> Removing [#removing] To append and remove some objects, you need to create a group first - [FrontInstanceGroup](./../Frontend-IO/FrontInstanceGroup) ```wolfram group = FrontInstanceGroup[]; Plot[x, {x,0,1}, Prolog->{ group[Disk[{0,0}, 1]] }] ``` Later to remove it use - `FrontInstanceGroupRemove` or `Delete`: ```wolfram FrontInstanceGroupRemove[group] ``` <Accordions> <Accordion title="Advanced: Pool of objects"> We can go further and animate bubbles. The problem arises when we create a bubble. In fact, we need to provide a graphical primitive (let’s say `Disk`) and a *dynamic symbol* to control its properties. Creating 1000 extra symbols is a significant overhead for the system, especially if we want to update all of them. We generally recommend using [Canvas 2D](./../Advanced/Canvas-2D/Overview) for such animations or the [FrontProxy](./../Frontend-IO/FrontProxy) abstraction for a better developer experience Let us use a limited number of dynamic symbols—buffers—and bind each animated `Disk` or bubble to one of its parts. ```wolfram cPool = Table[{0., 0.}, {i, 100}]; (* Positions *) vPool = cPool; (* Velocities *) rPool = Table[0., {i, 100}]; (* Radius or lifetime *) oPool = Table[Null, {i, 100}]; (* References to objects *) ``` The general idea is not to allocate new variables for each new object but rather to reuse objects from the pool. The graphical output remains the same: ```wolfram scene = FrontInstanceReference[]; Graphics[{White, EventHandler[Rectangle[{-1, -1}, {1, 1}], {"mousemove" -> handler[scene]}], scene}, ImagePadding -> None] ``` Our future animation loop will look like this: ```wolfram ClearAll[handler] handler[scene_] := Function[xy, If[!created[xy, scene], update[]]; ]; ``` The update function iterates over our arrays and produces new values: ```wolfram update[] := With[{}, {cPool, rPool} = Transpose[MapIndexed[Function[{a, index}, (* If the slot is not empty, recalculate *) If[oPool[[index // First]] =!= Null, If[a[[2]] <= 0.002, (* If the radius is too small, remove the object *) remove[index // First]; a , (* Otherwise, animate *) {a[[1]] + 0.05 vPool[[index // First]], 0.9 a[[2]]} ] , a ] ], {cPool, rPool} // Transpose]]; ]; ``` If the lifetime is close to zero, we need to remove the created instance and free up slots in our buffers for new objects: ```wolfram remove[index_] := ( (* Destroy the instance on the frontend *) FrontInstanceGroupRemove[oPool[[index]]]; oPool[[index]] = Null ); ``` And finally, a function to create new objects: ```wolfram created[xy_, scene_] := With[{ (* Find an empty slot *) slot = FirstPosition[oPool, Null] }, If[!MissingQ[slot], With[{s = slot // First}, (* Initialize positions, radius, etc. *) cPool[[s]] = xy; rPool[[s]] = 0.05; vPool[[s]] = RandomReal[{-1, 1}, 2]; oPool[[s]] = True; (* Update so the object doesn't appear abruptly *) update[]; (* Create an instance of Disk in the graphics *) With[{ group = FrontInstanceGroup[], o = { Hue[RandomReal[{0, 1}], 1, 1], (* Prevent double updates *) Disk[Offload[cPool[[s]]], Offload[rPool[[s]], "Static" -> True]] } }, oPool[[s]] = group; FrontSubmit[o // group, scene]; ]; ]; True , False ] ] ``` <LazyAutoplayVideo url={"/dyn_bubbles.mp4"} /> All positions and radii are stored in only two symbols, `cPool` and `rPool`. This means we only need to perform **two data transactions** with our frontend, significantly saving resources when animating objects on the screen. The payload size matters less than the number of transactions in terms of transport load </Accordion> </Accordions> How to update raster graphics [#how-to-update-raster-graphics] Advanced way of rendering raster data with Canvas API </Cards> Raster graphics is mainly rendered using the output form of the [Image](./../Image/Image) expression, which is a resource-efficient container for any image-like data with a large set of built-in methods. `Image` is immutable, but it also accepts expressions wrapped inside `Offload` to be dynamically displayed: ```wolfram testImg = ExampleData[{"TestImage", "Lena"}]//Thumbnail; imageBuffer = ImageData[testImg]; Image[imageBuffer // Offload, "Real32"] ``` By default, `ImageData` returns a float representation of pixel data, therefore we explicitly set `"Real32"`. Let's update it by applying blur to our image: ```wolfram imageBuffer = ImageData[testImg//Blur]; ``` Here is another example, where we actually generate pixel data directly on Wolfram Kernel (cloud generation) and stream it: ```wolfram ClearAll[n, k2, spectrum, im, p0, p, buffer]; n = 256; k2 = Outer[Plus, #, #] &[RotateRight[N@Range[-n, n - 1, 2]/n, n/2]^2]; spectrum = With[{d := RandomReal[NormalDistribution[], {n, n}]}, (1/n) (d + I d)/(0.000001 + k2)]; spectrum[[1, 1]] *= 0; im[p_] := Clip[Re[InverseFourier[spectrum Exp[I p]]], {0, ∞}]^0.5 p0 = p = Sqrt[k2]; ``` ```wolfram buffer = im[p0 += p]; Image[buffer // Offload, "Real32", Epilog->{ EventHandler[AnimationFrameListener[buffer // Offload], Function[Null, buffer = im[p0 += 2 p]] ] }] ``` <LazyAutoplayVideo url={"/dyn_cloud.mp4"} /> Avoid using `Real32` and untyped arrays in raster graphics The performance will not be the best in either of these cases, since floating-point arrays are resource-demanding, but for displaying color, 3 bytes is usually enough. To solve this issue, we recommend using `NumericArray` typed to `"Byte"`. For example: ```wolfram testImage = ExampleData[{"TestImage", "Lena"}]; toBuf[image_Image] := NumericArray[ImageData[image, "Byte"],"Byte"]; buffer = testImage // toBuf; Image[buffer//Offload, "Byte"] ``` and then we perform `Opening` with a provided radius ```wolfram EventHandler[InputRange[0,50,.1], Function[r, buffer = Opening[testImage, r] // toBuf; ]] ``` <LazyAutoplayVideo url={"/dyn_open.mp4"} /> Here is another example with manual pixel manipulation. First - extract raw pixel data: ```wolfram img = ImageData[ExampleData[{"TestImage", "Lena"}], "Byte"]; ``` Now we apply a mapping function to it, which stretches and shrinks pixels periodically: ```wolfram shader = Compile[{{img, _Integer, 3}, {phase, _Real}}, Module[{iter}, With[{ ysize = Length[img], xsize = Length[img[[1]]] }, Table[ iter = 1.0; Table[With[{ yr = y, xr = If[# < 1, 1, If[# > xsize, xsize, #]] &@ Round[iter] }, iter = iter + (1.0 + 0.7 Sin[6 Pi x / xsize + phase]); img[[yr, xr]] ], {x, xsize}], {y, ysize}] ] ]]; ``` Here, we use `Compile` to speed up the process since only integer arrays are involved. We do not apply any antialiasing filters; it works in the nearest neighbors approximation. Let's check the result using the original `Byte` encoding: ```wolfram Image[NumericArray[shader[img, 0], "Byte"], "Byte"] ``` Since performance of our shader function may not be great, we can use a straightforward `Do` loop: ```wolfram imageFrame = NumericArray[img, "Byte"]; Image[imageFrame // Offload, "Byte"] ``` ```wolfram Do[ imageFrame = NumericArray[shader[img, angle], "Byte"]; , {angle, 0, 4Pi, 2Pi/30.0}] ``` The resulting animation: <LazyAutoplayVideo url={"/dyn_shader.mp4"} /> Beyond visuals [#beyond-visuals] Many other expressions support live updates. Progress bar [#progress-bar] [ProgressIndicator](./../GUI/ProgressIndicator) represents a complete progress bar indicator, which can be made live using `Offload`: ```wolfram p = 0.0; ProgressIndicator[p//Offload, {0,1}] ``` ```wolfram Do[p = i; Pause[0.3];, {i,0,1.0,0.1}]; ``` You can use it together with `CellPrint` to temporarily show it while some long task is running. Here is a helper function: ```wolfram reporter[max_:1.0] := Module[{p=0.0, timer = AbsoluteTime[]}, With[{ cell = CellPrint[ProgressIndicator[p//Offload, {0,max}]] }, object["Set", val_] := With[{now = AbsoluteTime[]}, If[now - timer > 0.1, p = val; timer = now; ]; ]; object["Finished"] := ( NotebookDelete[cell]; ClearAll[object, p]; ); object ] ] ``` Now we can use it in some long-running procedure: ```wolfram Module[{bar = reporter[]}, With[{result = Table[ bar["Set", i]; Pause[0.01]; i , {i, 0, 1.0, 0.01}]}, bar["Finished"]; result ] ] ``` Text and editor views [#text-and-editor-views] To display changing textual or numerical data, use [TextView](./../GUI/TextView): ```wolfram text = ""; TextView[text // Offload] ``` ```wolfram text = RandomWord[]; ``` Here `text` can be `String`, `Real`, `Integer`, or a list of values. For dynamically rendering HTML, use [HTMLView](./../GUI/HTMLView) in the same way. In cases where you need to display changing Wolfram Expressions, use [EditorView](./../GUI/EditorView). `EditorView` accepts only strings as data input. ```wolfram text = ""; EditorView[text // Offload] ``` To get a nice-looking expression in `StandardForm` convert it to a string using `ToString`: ```wolfram Do[text = ToString[x^n, StandardForm]; Pause[0.08], {n, 1, 10}]; ``` It can be extremely powerful, since you can practically put any expression: ```wolfram text = ToString[Plot[x, {x,0,1}], StandardForm]; ``` <Accordions> <Accordion title="Advanced: Crossbar and Coordinates Field"> If you are an Origin Pro user, this is an essential tool for picking data points from your graph. Essentially, we need two things: `Line` and `TextView`: ```wolfram point = {0.,0.}; (* Plot some dummy function *) EventHandler[Plot[Sinc[x], {x,-10,10}, Epilog->{ Red, (* Crossbar *) Line[With[{p = point[[1]]}, {{p, -10}, {p, 10}} ] // Offload], Line[With[{p = point[[2]]}, {{-10, p}, {10, p}} ] // Offload] }], { "mousemove" -> Function[xy, point = xy] }] ``` This attaches an `EventHandler` to a `Graphics` expression (generated by `Plot`). Every time the user moves the mouse over it, the event handler is triggered, updating the `point` symbol, which causes the lines to update accordingly. Now, the text field: ```wolfram TextView[point // Offload] ``` The precision might be too high. We can output the values separately by using another variable or symbol: ```wolfram tp = ""; ``` ```wolfram , { "mousemove" -> Function[xy, point = xy; tp = ToString[Round[xy, 0.01]];] }] ``` ```wolfram TextView[tp // Offload] ``` <LazyAutoplayVideo url={"/dyn_cross.mp4"} /> Dynamically Appending to a Plot [#dynamically-appending-to-a-plot] One can also append it to a plot dynamically afterward using [FrontInstanceReference](./../Frontend-IO/FrontInstanceReference). Sometimes this approach is better since all variables remain scoped: ```wolfram placeCrossbar[ref_, pos_:{0.,0.}] := LeakyModule[{point = pos, text = ""}, FrontSubmit[{ Red, (* Crossbar *) Line[With[{p = point[[1]]}, {{p, -10}, {p, 10}} ] // Offload], Line[With[{p = point[[2]]}, {{-10, p}, {10, p}} ] // Offload], EventHandler[Null, { "mousemove" -> Function[xy, point = xy; text = ToString[Round[xy, 0.01]]; ] }] }, ref]; TextView[text // Offload] ] ``` Here we used `EventHandler[Null, ...]`. Since it is evaluated in the context of `Graphics` using `FrontSubmit` on the reference, it seeks the nearest parent that can emit events and automatically attaches to `Graphics`. Now, the only thing we need is to add a reference to our plot: ```wolfram (* Plot some dummy function *) ref = FrontInstanceReference[]; Plot[Sinc[x], {x,-10,10}, Epilog->{ref}] ``` After evaluation, we can append our crossbar to it: ```wolfram placeCrossbar[ref] ``` </Accordion> </Accordions> Audio stream [#audio-stream] The output form of [Audio](./../Sound/Audio) objects can be used for live raw audio streaming using `Offload` expression similar to `Image`: ```wolfram buffer = {}; Audio[buffer//Offload] ``` ``` buffer = Table[Exp[-(*FB[*)((x)(*,*)/(*,*)(100.))(*]FB*)] Sin[(*FB[*)((x)(*,*)/(*,*)(1.5))(*]FB*)], {x, 0, 100 \\[Pi], 0.1}]; ``` By default, `Audio` assumes `"Real32"` (mono) format of input data and `SampleRate` equals 44100. We recommend using typed `"SignedInteger16"` arrays for the best performance Audio objects in streaming mode can be used with `EventHandler` to track when the buffer is about to be exhausted. For example, for continuous streaming: ```wolfram buffer = {}; samplingFunction = Function[t, Exp[-Mod[t,3]/1.0]Sin[200.0 t]]; time = 0; EventHandler[Audio[buffer//Offload, "SignedInteger16", SampleRate->8000], { "More" -> Function[Null, With[{c = (1.0/8000.0) (2Pi)}, With[{sampled = 32760 Table[samplingFunction[c (i + time)], {i, 0, 4 1024 - 1}]}, buffer = NumericArray[sampled, "SignedInteger16", "ClipAndRound"]; ]; time += 4 1024; ]; ]}] ``` # Styling with HTML <wljs-store kernel="/attachments/4cd6b63a-kernel-5918612404859052916.txt" json="/attachments/01ff2267-b85c3ff2-cf11-4fd2-9c39-a851a7371de4.txt" /> You can take advantage of [HTML](./../Cell-types/HTML) and [WLX](./../Cell-types/WLX) to shape your data using all the tools of the modern web that you can imagine. HTML Cells [#html-cells] You can use basic HTML together with insets of WL using PHP-like syntax: ``` .html Current time: <b><?wsp TextString[Now] ?></b> ``` <wljs-html encoded="true"> {`%0ACurrent%20time%3A%20%3Cb%3ESat%2017%20Jan%202026%2020%3A09%3A53%3C%2Fb%3E`} </wljs-html> Let's generate some data in the form of a table. ``` data = Table[RandomWord[], {i, 4}, {j, 4}]; ``` The `wsp` template allows you to break the expressions. ``` .html <table> <?wsp Table[ ?> <tr class="bg-white border-b"> <?wsp Table[ ?> <td class="px-3 py-2"> <?wsp Item ?> </td> <?wsp , {Item, Rows}] ?> </tr> <?wsp , {Rows, data}] ?> </table> ``` <wljs-html encoded="true"> {`%0A%3Ctable%3E%0A%0A%20%20%3Ctr%20class%3D%22bg-white%20border-b%22%3E%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20terror%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20squeeze%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20trimming%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20unmovable%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%3C%2Ftr%3E%0A%0A%20%20%3Ctr%20class%3D%22bg-white%20border-b%22%3E%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20skydiver%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20typology%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20stitched%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20overfull%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%3C%2Ftr%3E%0A%0A%20%20%3Ctr%20class%3D%22bg-white%20border-b%22%3E%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20untried%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20passageway%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20denigration%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20thole%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%3C%2Ftr%3E%0A%0A%20%20%3Ctr%20class%3D%22bg-white%20border-b%22%3E%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20wormy%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20worldly-wise%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20respectability%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%20%20%3Ctd%20class%3D%22px-3%20py-2%22%3E%0A%20%20%20%20%20%20shiner%0A%20%20%20%20%3C%2Ftd%3E%20%20%20%20%0A%20%20%0A%20%20%3C%2Ftr%3E%0A%0A%3C%2Ftable%3E`} </wljs-html> In general, we recommend using the WLX component instead of HTML `wsp` templates, as it provides better readability and better integration with the Wolfram Language. WLX Cells [#wlx-cells] Wolfram Language XML Extension is a superset of HTML and WL. It requires to learn some rules before using it, but gives much more freedom to a user. The same example with time looks more natural in WLX: ``` .wlx <div> Current time: <b><Now/></b> </div> ``` ``` <div > Current time: <b >Sat 17 Jan 2026 20:35:23</b></div> ``` Make a custom layout for the table with WLX cells: ``` .wlx makeTable[data_List] := With[{ TableBody = Table[ With[{Row = Table[ <td class="px-3 py-2"> <Item/> </td> , {Item, Rows}]}, <tr class="bg-white border-b"> <Row/> </tr> ] , {Rows, data}] }, <table style="font-family: system-ui"> <TableBody/> </table> ]; makeTable[data] ``` ``` <table style="font-family: system-ui"><tr class="bg-white border-b"><td class="px-3 py-2">terror</td> <td class="px-3 py-2">squeeze</td> <td class="px-3 py-2">trimming</td> <td class="px-3 py-2">unmovable</td></tr> <tr class="bg-white border-b"><td class="px-3 py-2">skydiver</td> <td class="px-3 py-2">typology</td> <td class="px-3 py-2">stitched</td> <td class="px-3 py-2">overfull</td></tr> <tr class="bg-white border-b"><td class="px-3 py-2">untried</td> <td class="px-3 py-2">passageway</td> <td class="px-3 py-2">denigration</td> <td class="px-3 py-2">thole</td></tr> <tr class="bg-white border-b"><td class="px-3 py-2">wormy</td> <td class="px-3 py-2">worldly-wise</td> <td class="px-3 py-2">respectability</td> <td class="px-3 py-2">shiner</td></tr></table> ``` WLX cells can render many Wolfram Expressions as long as they have a defined `WLXForm`. For example, any graphics object or input slider can be shown properly: ``` GraphicsObject = Graphics[{Line@Table[ReIm@Exp[I x - 0.03 x], {x,0,40Pi,.1}]}, ImageSize->300]; ``` ``` .wlx <div class="relative"> <div class="absolute" style="filter: blur(3px)"> <GraphicsObject/> </div> <GraphicsObject/> </div> ``` ``` <div class="relative"><div class="absolute" style="filter: blur(3px)">FrontEndExecutable[025bbbf5-f5d7-4c9b-8cb3-42ccf0ff7e3b]</div>FrontEndExecutable[d511ddb3-5ad6-428c-83a5-ff53174c5c73]</div> ``` Integration with Wolfram Cells [#integration-with-wolfram-cells] To use WLX components within normal Wolfram cells, you need to use a wrapper. The most general one is [CellView](./../GUI/CellView), which allows you to create an inset of a virtual cell. For example: ``` tableComponent[data_] := CellView[Cell[makeTable[data], "Output", "wlx"]]; ``` ``` tableComponent[data] // Framed ``` ``` (*BB[*)((*VB[*)(FrontEndRef["4c5143c4-df98-40d8-9b6c-da56a68fb682"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKmySbGpoYJ5vopqRZWuiaGKRY6FommSXrpiSamiWaWaQlmVkYAQCDEBW0"*)(*]VB*))(*,*)(*"1:eJxTTMoPSmNiYGAo5gMSwSWVOakuqcn5RYkl+UUQcRYgEVSak1rMA1ZQlFngn+eZV1BaUswKFHBLzClORVUYDBYvSsxNBQuFFJWmAgAQ7xjr"*)(*]BB*) ``` Now you can freely use it as if it were a normal WL expression. Alternative Way [#alternative-way] Another way is to utilize [HTMLView](./../GUI/HTMLView) with the `WLXProcessor` preprocessor, which is slightly faster than `CellView`. ``` tableComponent[data_] := HTMLView[ makeTable[data], Prolog->HTMLView\`WLXProcessor[] ]; tableComponent[data] // Framed ``` ``` (*BB[*)((*VB[*)(FrontEndRef["7fdd8ba5-1f6d-439c-973e-c69aa673bbb7"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKm6elpFgkJZrqGqaZpeiaGFsm61qaG6fqJptZJiaamRsnJSWZAwCSLRZF"*)(*]VB*))(*,*)(*"1:eJxTTMoPSmNiYGAo5gMSwSWVOakuqcn5RYkl+UUQcRYgEVSak1rMA1ZQlFngn+eZV1BaUswKFHBLzClORVUYDBYvSsxNBQuFFJWmAgAQ7xjr"*)(*]BB*) ``` Interactive Widgets [#interactive-widgets] One can create an entire widget using only WLX cells with properly scoped dynamic symbols. For example: ``` .wlx Module[{Slider = InputRange[0.1,1,0.1,0.5], Figure, lines}, EventHandler[Slider, Function[s, lines = {#, Sinc[#/s]}& /@ Range[-5,5,0.1]]]; Slider // EventFire; Figure = Graphics[Line[lines // Offload], ImageSize->300]; <div class="flex flex-col items-center"> <div><Slider/></div> <div><Figure/></div> </div> ] ``` ``` <div class="flex flex-col items-center"><div >FrontEndExecutable[b1721958-a760-4342-b6c6-199f87faa928]</div><div >FrontEndExecutable[6ff307a7-9049-442a-9180-b5eec8302a11]</div></div> ``` Try to drag this slider. # Handling user input This section discusses how to handle user interactions with sliders, graphics primitives, and other input building blocks. A guide on interactive evaluation, updates and animation Reference on event objects </Cards> UI Elements [#ui-elements] We provide a large set of basic UI elements used for creating buttons, sliders, text fields, and more. If you need a custom element, you can create it directly in the notebook using [WLX](./../Cell-types/WLX) or [JavaScript](./../Cell-types/Javascript) cell types. Please see the guides A guide on making custom input elements using Javascript, HTML and WLX </Cards> Input elements such as [Button](./../GUI/Button), [InputRange](./../GUI/InputRange), [InputText](./../GUI/InputText), [InputFile](./../GUI/InputFile), etc., can be found in the `GUI` section of the symbols reference documentation. Each standard input element generates [`EventObject`](frontend/Reference/Misc/Events.md#`EventObject`), to which you can assign a handler function. You don't necessarily need to assign it to a variable. For example (see [InputButton](frontend/Reference/GUI/InputButton.md)): ```wolfram EventHandler[InputButton["Click"], Beep] ``` is equally valid: ```wolfram btn = InputButton["Click"]; EventHandler[btn, Beep]; btn ``` There is also a helper symbol `Button` that allows you to assign handlers implicitly: ```wolfram Button["Click", Beep[]] ``` <wljs-store kernel="/attachments/d2cc994e-kernel-3138499539191000322.txt" json="/attachments/e876a44d-1ae741de-2491-47ea-90ab-b807369d30e4.txt" /> The second argument has the `Hold` attribute. Here are some other examples with [InputRange](./../GUI/InputRange): ```wolfram EventHandler[InputRange[0, 1, 0.1], Function[value, radius = value]] % // EventFire; (* just to initialize radius symbol *) Graphics[{LightBlue, Disk[], Pink, Disk[{0,0}, radius // Offload]}] ``` ``` (*VB[*)(EventObject[<|"Id" -> "336f83ac-9d9b-4410-9d68-912362efc04e", "Initial" -> 0.5, "View" -> "adf30b2b-4369-48ec-a191-08e3e8ff65e4"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJ6akGRskGSXpmhibWeqaWKQm6yYaWhrqGlikGqdapKWZmaaaAACJ9hXa"*)(*]VB*) ``` ``` (*VB[*)(Graphics[{RGBColor[0.87, 0.94, 1], Disk[{0, 0}], RGBColor[1, 0.5, 0.5], Disk[{0, 0}, Offload[radius]]}, ImageSize -> 200, "Controls" -> False])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWnMIB4HkHAvSizIyEwuTmOByftkFpcg5IPcnZzzc/KLiq4vLrDluv7avkhknfvDKpF39pkgExHGumQWZ6cxIRuSCaQZwASmcWDNRQxg8MAezkAYgNc4sKXsQMI/LS0nPzGlmA1kWmJKZmkxQk9QaU5qMSeQ4ZmbmJ4anFmVmnkCpBlFQTDIUc75eSVF+TnFxaxAjltiTnEqAKV9QJ4="*)(*]VB*) ``` Apply `EventFire` to any `EventObject` to manually fire an event with a default value to initialize your variables, if needed. You can also add a label to an [InputRange](frontend/Reference/GUI/InputRange.md): ```wolfram InputRange[0, 1, 0.1, "Label" -> "Radius"] ``` And an initial value as the fourth argument: ```wolfram InputRange[0, 1, 0.1, 0.7, "Label" -> "Radius"] ``` Here is an example using [InputSelect](frontend/Reference/GUI/InputSelect.md): ```wolfram angle = 45 Degree; EventHandler[ InputSelect[{Pi/2 -> "90", Pi/4 -> "45", 0 -> "0"}, Pi/4], Function[value, angle = value] ] Graphics[{Rotate[Rectangle[{0,0}, {1,1}], angle // Offload]}] ``` Here is a simple text input: ```wolfram text = "Example"; EventHandler[InputText[], Function[value, text = value]] Graphics[Table[{ Hue[i/10., 1., 1.], Rotate[Text[Style[text // Offload, FontSize -> RandomInteger[{12, 24}]], RandomReal[{-1,1}, 2]], RandomChoice[{Pi, Pi/4, Pi/2, 0}]] }, {i, 10}]] ``` import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="A few more examples"> This button changes the color of the disk each time you click it: ```wolfram Module[{b = List @@ Red}, {Button["change", b = RandomReal[{0, 1}, 3]], Graphics[{RGBColor[Offload[b]], Disk[]}]}] ``` This button changes position each time you click it: ```wolfram Module[{pt = {0, 0}}, Framed@Graphics[ Inset[Button["Click Me", pt = RandomReal[{-1, 1}, 2]], Offload[pt]], PlotRange -> {{-1,1}, {-1,1}}, Controls->False]] ``` </Accordion> </Accordions> Grouping [#grouping] If you only need visual grouping, consider using [Row](./../Formatting/Row) or [Column](./../Formatting/Column): ```wolfram slider = InputRange[0, 1, 0.1]; checkbox = InputCheckbox[]; {slider, checkbox} // Column ``` To group elements both visually and at the event level, use [InputGroup](./../GUI/InputGroup): ```wolfram slider = InputRange[0, 1, 0.1]; checkbox = InputCheckbox[]; n = EvaluationNotebook[]; joined = InputGroup[<|"Checkbox" -> checkbox, "Slider" -> slider|>, "Label" -> "Group"]; EventHandler[joined, NotebookWrite[n, #]&] ``` It merges an association (as above) or a list of `EventObjects` into a new one. You do not need to assign separate `EventHandler`s - **just one** `joined` handler is enough. It fires an event preserving the original structure of the association or list: ```wolfram title="Printed cell" <|"Slider" -> 0.5, "Button" -> True|> ``` Joining Different Events [#joining-different-events] You can also merge event objects underlying UI elements using `Join`. Here’s a simple example: ```wolfram button = InputButton[] slider = InputRange[0, 1, 0.1] EventHandler[Join[button, slider], Function[data, Print[data] ]]; ``` You'll get either `True` or a number like `0.5`, depending on which element triggered the event. To distinguish between them, [use patterns](./../Misc/Events) (or topics): ```wolfram button = InputButton["Topic" -> "Button"] slider = InputRange[0, 1, 0.1, "Topic" -> "Slider"] EventHandler[Join[button, slider], {type_ :> Function[data, Print[type <> ":" <> ToString[data]] ]}]; ``` Or capture them individually: ```wolfram button = InputButton["Topic" -> "Button"] slider = InputRange[0, 1, 0.1, "Topic" -> "Slider"] EventHandler[Join[button, slider], { "Button" -> Beep, "Slider" -> Print }]; ``` The slider prints a message; the button triggers *beep*. Chaining Events [#chaining-events] Most GUI elements support chaining, where each reuses the same `EventObject`. It’s passed as the first argument: ```wolfram ev = EventObject[]; InputButton[ev, "Topic" -> "Button"] InputRange[ev, 0, 1, 0.1, "Topic" -> "Slider"] EventHandler[ev, { "Button" -> Beep, "Slider" -> Print }]; ``` With this approach, there's no need to create and join new events. This leaves a smaller footprint and reduces overhead. Dialog windows, user prompts [#dialog-windows-user-prompts] A comprehensive guide to handling dialog windows and notebook operations </Cards> 2D Graphics [#2d-graphics] Some primitives, as well as the entire canvas, support the `EventHandler` method. Let's start with the `Graphics` expression itself. Graphics as an Event Generator [#graphics-as-an-event-generator] You can attach event handlers to a `Graphics` expression, which represents the SVG container of your 2D graph. This approach offers some benefits over using [Primitives](#Primitives). For instance, events like `"mousemove"` or `"click"` are captured even if other objects are layered on top. The following event patterns are supported: * `"keydown"`: Captures keyboard input after the canvas is clicked * `"capturekeydown"`: Same as above but also prevents page scrolling * `"mousemove"`: Captures mouse movement * `"mouseup"`: Captures mouse up * `"mousedown"`: Captures mouse down * `"click"`: Captures clicks (without the Alt key) * `"altclick"`: Captures clicks with the Alt key held * `"onload"`: Fired once the canvas has loaded For example: ```wolfram pt = {}; EventHandler[ Graphics[{ PointSize[0.05], Blue, Opacity[0.5], Point[pt // Offload] }, PlotRange -> {{-1, 1}, {-1, 1}}], {"mousemove" -> Function[xy, pt = Append[pt, xy]]} ] ``` You can do the same with [Plot](./../Plotting-Functions/Plot) and many others, since they produce a `Graphics` symbol: ```wolfram pt = {}; EventHandler[Plot[x, {x,-1,1}, Epilog->{ PointSize[0.05], Blue, Opacity[0.5], Point[pt // Offload] }], {"mousemove" -> Function[xy, pt = Append[pt, xy]]}] ``` Alternative Way [#alternative-way] An alternative approach is to place the handler inside `Epilog` or `Prolog` with `Null`: ```wolfram pt = {}; Plot[x, {x,-1,1}, Epilog->{ PointSize[0.05], Blue, Opacity[0.5], Point[pt // Offload], EventHandler[Null, {"mousemove" -> Function[xy, pt = Append[pt, xy]]}] }] ``` or directly: ```wolfram pt = {}; Graphics[{ PointSize[0.05], Blue, Opacity[0.5], Point[pt // Offload], EventHandler[Null, {"mousemove" -> Function[xy, pt = Append[pt, xy]]}] }, PlotRange -> {{-1, 1}, {-1, 1}}] ``` When `EventHandler` sees `Null` as its argument, it internally attaches to the nearest parent. Similarly, you can attach handlers using `Epilog` or `Prolog`. Primitives [#primitives] Certain graphic primitives also support `EventHandler`. Some supported primitives include: * [Point](./../Graphics/Point) * [Disk](./../Graphics/Disk) * [Rectangle](./../Graphics/Rectangle) * ... They support these patterns: * `"drag"`: Makes the primitive draggable and returns coordinates * `"dragsignal"`: Captures dragging without moving the primitive itself; returns coordinates * `"dragall"`: Like `"drag"`, but also fires events at drag start and end * `"click"`: Captures clicks without the Alt key * `"altclick"`: Captures clicks with the Alt key * `"mousedown"`: Fires on mouse press * `"mouseup"`: Fires on mouse release * `"mousemove"`: Captures movement * `"mouseover"`: Captures entry into element area * `"zoom"`: Captures mouse wheel input For example, combining `"zoom"` and `"drag"`, you can create a widget for manually fitting Gaussian curves: ```wolfram getGauss[x0_, A_, width_] := ( Table[{x, A * Exp[-((x - x0)^2) / (2 * width^2)]}, {x, -1, 1, 0.01}] // Quiet ); getGauss[{x0_, A_}, width_] := getGauss[x0, A, width]; getGauss[{x0_, A_, width_}] := getGauss[x0, A, width]; ``` ```wolfram Module[{line, initial}, initial = {-0.2, 0.8, 0.1}; line = getGauss[initial]; Graphics[{ Red, PointSize[0.1], EventHandler[ Point[initial[[1 ;; 2]]], { "drag" -> Function[c, initial[[1 ;; 2]] = c; line = getGauss[initial]], "zoom" -> Function[k, initial[[3]] = k/10.0; line = getGauss[initial]] } ], Cyan, Line[line // Offload] }, PlotRange -> {{-1, 1}, {0, 1}}, Axes -> {True, False}] ] ``` *Try moving your mouse wheel on the red dot and then drag it.* You can also create a basic mouse follower using a white rectangle with a `"mousemove"` pattern: ```wolfram pt = {0, 0}; Graphics[{ White, EventHandler[ Rectangle[{-2, -2}, {2, 2}], {"mousemove" -> Function[xy, pt = xy]} ], PointSize[0.05], Cyan, Point[pt // Offload] }] ``` ``` (*VB[*)(Graphics[{GrayLevel[1], EventListener[Rectangle[{-2, -2}, {2, 2}], {"mousemove" -> "1e94315e-217b-4d61-a9e5-55993e4c7b51"}], PointSize[0.05], RGBColor[0, 1, 1], Point[Offload[pt]], ImageSize -> 250, "Controls" -> False}])(*,*)(*"1:eJxdUMtOwzAQTHkIOPARSFxzMI2pckKigoJUiSr5AidZF0uOt4rdSPAn8Af8IgdC1pZTqT6MNLPrndm9qbCQsyRJ7NkIL6ibwC5HWHVi965qKy9ifa2sC/WrUP9YQw9akSRPSL8e4akH46gVDHRBpvYCaifMVkOQ4jz1NwyDhyOdmIdDPu8/dRV7DSVNbnFvocUeytuRMcizOeOQ3rFFlWbNPUtFDjzlPM/nkNWLirPDEhtUxpXqE7rvL3o/D/I0HqBYPS5RY6cSijKLED6fx8+B0o3epNQoGksJd0dBvdlrK7ZAZup3uti0CTku0bgOtfXTn4W28A+1kmGT"*)(*]VB*) ``` Here is another example where we make an object draggable but update its position manually. This approach allows you to apply additional constraints: ```wolfram outer = RegionDifference[ Rectangle[{-1,-1}, {1,1}], RegionUnion[ Rectangle[{-0.9,-0.9}, {0.9,-0.4}] , Rectangle[{0.4,-0.9}, {0.9,0.4}] ] ]; outer = Rationalize[outer, 0]; (* WL14 bug *) RegionPlot[outer]; distanceOp = RegionDistance[outer, Translate[Rectangle[-{0.2,0.2}, {0.2,0.2}], #]]&; rect = {0.65, 0.15}; RegionPlot[outer, Epilog->{ Red, Translate[EventHandler[ Rectangle[-{0.2,0.2}, {0.2,0.2}], {"dragsignal" -> Function[target, If[distanceOp[target] > 0, rect = target] ]} ], Offload[rect]] }] ``` Image [#image] You can attach event handlers to an [Image](./../Image/Image) expression, similar to `Graphics`. The following event patterns are supported: * `"mousemove"`: Captures mouse movement * `"mouseup"`: Captures mouse up * `"mousedown"`: Captures mouse down * `"click"`: Captures clicks (without the Alt key) * `"altclick"`: Captures clicks with the Alt key held For example: ```wolfram lena = ExampleData[{"TestImage", "Lena"}]; point = {0,0}; move = Function[xy, point = xy]; EventHandler[Image[lena], {"mousemove"->move}] TextView[point // Offload] ``` ``` (*VB[*)(FrontEndRef["cba7e783-d623-455a-9472-bb6693e86d85"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKJyclmqeaWxjrppgZGeuamJom6lqamBvpJiWZmVkap1qYpViYAgCEixVb"*)(*]VB*) ``` ``` (*VB[*)(FrontEndRef["f5069ff4-e9bf-4d45-8038-baf522638ca4"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKp5kamFmmpZnoplompemapJiY6loYGFvoJiWmmRoZmRlbJCeaAACIuhWy"*)(*]VB*) ``` 3D Graphics [#3d-graphics] Currently, event listeners in [Graphics3D](./../Graphics3D/Graphics3D) are limited. Primitives [#primitives-1] The following 3D primitives support `EventHandler` methods: * [Sphere](./../Graphics3D/Sphere) The following patterns are supported: * `"drag"`: Makes the object draggable, adds guide lines, and sends the coordinates This is especially useful for dynamic lighting. For example: ```wolfram point = {1, 1, 1}; Graphics3D[{ Directive["Shadows"->True], Polygon[{{-5, 5, -1}, {5, 5, -1}, {5, -5, -1}, {-5, -5, -1}}], White, Cuboid[{-1, -1, -1}, {1, 1, 1}], Directive["Shadows"->False], PointLight[Red, {1.5075, 4.1557, 2.6129}, "Intensity"->100], Directive["Shadows"->True], SpotLight[Cyan, point // Offload], EventHandler[Sphere[point, 0.1], { "drag" -> Function[pos, point = pos] }] }, Lighting -> None] ``` This can also be applied to `Plot3D`, since it returns a `Graphics3D` expression: ```wolfram Plot3D[Sin[x] Cos[y], {x,-10,10}, {y,-10,10}, Epilog->{ Directive["Shadows"->True], SpotLight[Cyan, point // Offload], EventHandler[Sphere[point, 0.1], { "drag" -> Function[pos, point = pos] }] }, Lighting -> None] ``` ``` (*VB[*)(FrontEndRef["87832d9c-716f-4dc8-86e8-5f60b5c4b269"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW5hbGBulWCbrmhuapemapCRb6FqYpVromqaZGSSZJpskGZlZAgB92xVj"*)(*]VB*) ``` Try to grab and drag this point above. # Image3D Limited support. Only gray-scale and minimum options. Not possible to combine with `Graphics3D` ```wolfram Image3D[data_List] ``` represents a 3D image with pixel values given by the 3D array `data` ```wolfram Image3D[{image1, image2, ...}] ``` creates a 3D image from a list of 2D images. Image is rendered using **maximum intensity projection** (**MIP**) and shader code developed by [Martin Röhlig](https://observablehq.com/@mroehlig). Options [#options] ImageSize [#imagesize] Background [#background] BoxRatios [#boxratios] ColorFunction [#colorfunction] Possible Values [#possible-values] Named Palettes [#named-palettes] * `"XRay"` * `"GrayLevelOpacity"` * `"Greys"` * `"OrRd"` Color Scales [#color-scales] * `PuBu` * `BuPu` * `Oranges` * `BuGn` * `YlOrBr` * `YlGn` * `Reds` * `RdPu` * `Greens` * `YlGnBu` * `Purples` * `GnBu` * `Greys` * `YlOrRd` * `PuRd` * `Blues` * `PuBuGn` * `Viridis` Diverging Scales [#diverging-scales] * `Spectral` * `RdYlGn` * `RdBu` * `PiYG` * `PRGn` * `RdYlBu` * `BrBG` * `RdGy` * `PuOr` Categorical Palettes [#categorical-palettes] * `Set2` * `Accent` * `Set1` * `Set3` * `Dark2` * `Paired` * `Pastel2` * `Pastel1` or one can provide a pure color function similar to `Graphics`, which return color based on the input value from `0` to `1`. Examples [#examples] Generate one from random numbers ```wolfram Image3D[RandomReal[1, {5, 10, 10}]] ``` Use example data ```wolfram ExampleData[{"TestImage3D", "CTengine"}] ``` or MRT of a brain ```wolfram Image3D[ExampleData[{"TestImage3D","MRbrain"}], BoxRatios->{1,1,1/1.65}, ColorFunction->"XRay"] ``` # Alert ```wolfram Alert[message_String] ``` pops up a default alert message on the frontend Example [#example] This is purely WLJS function, which has to be called either using [FrontSubmit](../Frontend-IO/FrontSubmit) or [CreateFrontEndObject](../Frontend-Objects/CreateFrontEndObject) ```wolfram FrontSubmit[Alert["Hello World"]] ``` # FrontEditorSelected Manipulates the last selected input cell's editor ```wolfram FrontEditorSelected[op_String, arguments__, opt___] Null | _String ``` This has to be executed in WLJS interpreter, i.e. using [FrontSubmit](../Frontend-IO/FrontSubmit) or [FrontFetchAsync](../Frontend-IO/FrontFetchAsync) Methods [#methods] There are following methods available Get selected content [#get-selected-content] ```wolfram FrontEditorSelected["Get", opt___] _String ``` Returns **selected string**. For example ```wolfram With[{win = CurrentWindow[]}, EventHandler[InputButton[], Function[Null, Then[FrontFetchAsync[FrontEditorSelected["Get"], "Window"->win], Function[result, Print[result]; ] ] ]] ] ``` Insert or replace selected content [#insert-or-replace-selected-content] ```wolfram FrontEditorSelected["Set", data_String, opt___] ``` Inserts or replaces selected text with a provided string ```wolfram With[{}, EventHandler[InputButton["Replace"], Function[Null, FrontSubmit[FrontEditorSelected["Set", "Yo"]]; ] ] ] ``` Get cursor position [#get-cursor-position] ```wolfram FrontEditorSelected["Cursor", opt___] ``` Get all content from the editor [#get-all-content-from-the-editor] ```wolfram FrontEditorSelected["GetDoc", opt___] ``` Set content of the editor [#set-content-of-the-editor] ```wolfram FrontEditorSelected["SetDoc", doc_String, opt___] ``` Get UID of the last used editor [#get-uid-of-the-last-used-editor] ```wolfram FrontEditorSelected["Editor"] _String ``` See [Options](#Options) for applications. Evaluate [#evaluate] Not implemented Options [#options] "Editor" [#editor] Specify an editor, from which the all properties will be taken or modified. **By the default it takes the last editor, that a user operated** You can get an `id` or an editor using [Get UID of the last used editor](#Get%20UID%20of%20the%20last%20used%20editor) # FrontTextSelected Returns selected (anywhere) text as a string ```wolfram FrontTextSelected[] _String ``` This has to be executed in WLJS interpreter, i.e. using [FrontSubmit](../Frontend-IO/FrontSubmit) or [FrontFetchAsync](../Frontend-IO/FrontFetchAsync) This expression is similar to [FrontEditorSelected](../Interpreter/FrontEditorSelected), but reads text content from any place in WLJS Notebook # Offload Holds an expression to be evaluated on frontend (WLJS) ```wolfram Offload[expr_, opts___] ``` It has `HoldFirst` attribute. Nested `Offload` are allowed A guide on interactive evaluation, updates and animation </Cards> Options [#options] "Volatile" [#volatile] Blocks or allows updates. Only normal evaluation will be allowed if it is set to `False`. The default values is `True` In such case an expression will not be evaluated during the updates and will return undefined value. Use it only in constructions like `CompoundExpression` "Static" [#static] Prevents or allows a parent instance to listen changes of an inner expression. The default value is `False`. The typical case scenario is you don't want to create extra bondings between an objects and other dynamic symbols. Related [#related] See also [OffloadFromEventObject](../Interpreter/OffloadFromEventObject) Examples [#examples] Symbols tracking and deferred evaluation [#symbols-tracking-and-deferred-evaluation] Typical example for the dynamic evaluation ```wolfram pts = RandomReal[{-1,1}, {64, 2}]; Graphics[{PointSize[0.02], Point[pts // Offload]}, ImageSize->500] ``` Now the symbol was actually evaluated on the frontend (browser/ client) using fetched data from the server. And then, change the variable from a timer ```wolfram task = SetInterval[With[{}, pts = (# + 0.001 Sum[ (i - #)/(Norm[i - #]^3 + 0.1) - (i - #)/(Norm[i - #]^5 + 0.1) , {i, pts}]) &/@ pts; ], 100] ``` Don't forget to remove before you've closed a notebook ```wolfram TaskRemove[task] ``` Force WL Kernel to offload an expression [#force-wl-kernel-to-offload-an-expression] Looking back to the previous example, the function `RandomReal` implemented on both sides (Kernel and frontend). If you offload it to the `Point` expression ```wolfram Graphics[{PointSize[0.02], Point[RandomReal[{-1,1}, {64, 2}] // Offload]}] ``` Each time you load a notebook the distribution of the point will be different, since it reevaluate it on frontend's side each time. # OffloadFromEventObject ```wolfram Offload`FromEventObject[ev_EventObject] _Offload ``` generates a dynamic symbol (aka [Offload](../Interpreter/Offload)) from a given [`EventObject`](../Misc/Events) ([InputRange](../GUI/InputRange), [InputText](../GUI/InputText), ... etc) placing view-component of `ev` as a decoration To produce more instances, you need to call it multiple times Example [#example] It feels similar to what Mathematica's dynamic keyword produce ```wolfram title="evaluate" Offload`FromEventObject[InputRange[-1,1,0.1]] ``` **cut and paste it into** ```wolfram Rectangle[{-1,-1}, {(*here*), 1}] ``` Dev notes [#dev-notes] This is a simple combination of [Offload](../Interpreter/Offload), [`EventHandler`](../Misc/Events) and [Interpretation](../Formatting/Interpretation) # ReadClipboard ```wolfram ReadClipboard[] _String ``` returns text content of a user's clipboard. Example [#example] It is pure WLJS function, which has to be executed using [FrontFetch](../Frontend-IO/FrontFetch) or [FrontSubmit](../Frontend-IO/FrontSubmit) Read and alert [#read-and-alert] We will read it and then make a pop-up message using [Alert](../Interpreter/Alert) ```wolfram FrontSubmit[Alert[ReadClipboard[]]] ``` Read and get back to Wolfram Kernel [#read-and-get-back-to-wolfram-kernel] Here we use [FrontFetch](../Frontend-IO/FrontFetch) to get the data back to Wolfram Kernel ```wolfram FrontFetch[ReadClipboard[]] ``` # WindowScope ```wolfram WindowScope[name_String] _JSObject ``` reads out Javascript variable available from the global scope and returns it. **This is pure WLJS function** It allows another way of WL JS communication Example [#example] Read JS variable [#read-js-variable] Firstly let us create it ```js title="cell 1" .js window.variable = [0,1,2,3,4,5]; ``` now read ```wolfram FrontFetch[WindowScope["variable"]] ``` # AcyclicGraphQ `AcyclicGraphQ[g]` yields `True` if graph g has no cycles and `False` otherwise. Examples [#examples] Test for cycles: ```wolfram AcyclicGraphQ[TreeGraph[{1 -> 2, 1 -> 3}]] (* True *) AcyclicGraphQ[CycleGraph[5]] (* False *) ``` Path is acyclic: ```wolfram AcyclicGraphQ[PathGraph[Range[5]]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AcyclicGraphQ.html) for more details. # AdjacencyGraph `AdjacencyGraph[amat]` gives the graph with adjacency matrix amat. `AdjacencyGraph[{v1, v2, ...}, amat]` gives the graph with vertices vi and adjacency matrix amat. Examples [#examples] Create a graph from an adjacency matrix: ```wolfram AdjacencyGraph[{{0, 1, 1}, {1, 0, 1}, {1, 1, 0}}] ``` Create a named graph: ```wolfram AdjacencyGraph[{a, b, c}, {{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AdjacencyGraph.html) for more details. # AdjacencyList `AdjacencyList[g,v]` gives a list of vertices adjacent to vertex v. `AdjacencyList[g,patt]` gives a list of vertices adjacent to vertices that match the pattern patt. `AdjacencyList[g,patt,d]` gives a list of vertices that are at distance at most d. `AdjacencyList[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Get vertices adjacent to vertex 1 in a graph: ```wolfram AdjacencyList[Graph[{1 -> 2, 2 -> 3, 1 -> 3}], 1] (* {2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AdjacencyList.html) for more details. # AdjacencyMatrix `AdjacencyMatrix[g]` gives the adjacency matrix of graph `g`, where entry $(i,j)$ is 1 if vertices $i$ and $j$ are connected. Examples [#examples] Get adjacency matrix: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1}] AdjacencyMatrix[g] // MatrixForm (* 0 1 1 1 0 1 1 1 0 *) AdjacencyMatrix[CompleteGraph[4]] // MatrixForm ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AdjacencyMatrix.html) for more details. # BarabasiAlbertGraphDistribution `BarabasiAlbertGraphDistribution[n, k]` represents a Barabási–Albert graph distribution for n-vertex graphs where a new vertex with k edges is added at each step. Examples [#examples] Generate a scale-free network: ```wolfram RandomGraph[BarabasiAlbertGraphDistribution[100, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarabasiAlbertGraphDistribution.html) for more details. # BetweennessCentrality `BetweennessCentrality[g]` gives a list of betweenness centralities for the vertices in the graph g. `BetweennessCentrality[{v -> w, ...}]` uses rules to specify the graph. Examples [#examples] Compute betweenness centrality: ```wolfram BetweennessCentrality[CycleGraph[5]] (* {1, 1, 1, 1, 1} *) ``` ```wolfram BetweennessCentrality[StarGraph[5]] (* {6, 0, 0, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetweennessCentrality.html) for more details. # BipartiteGraphQ `BipartiteGraphQ[g]` yields `True` if the graph g is a bipartite graph and `False` otherwise. Examples [#examples] ```wolfram BipartiteGraphQ[CycleGraph[4]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BipartiteGraphQ.html) for more details. # BreadthFirstScan `BreadthFirstScan[g, s, {event1 -> f1, event2 -> f2, ...}]` performs a breadth-first scan (BFS) of the graph g starting at the vertex s and evaluates fi whenever "eventi" occurs. `BreadthFirstScan[g, {event1 -> f1, ...}]` performs a breadth-first scan of the whole graph g. Examples [#examples] BFS with vertex discovery: ```wolfram BreadthFirstScan[GridGraph[{3, 3}], 1, {"DiscoverVertex" -> Print}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BreadthFirstScan.html) for more details. # BuckyballGraph `BuckyballGraph[]` gives the buckyball graph. `BuckyballGraph[n]` gives the order‐n buckyball graph. `BuckyballGraph[n,"class"]` gives the order‐n buckyball graph of class "class". Examples [#examples] Create the standard buckyball graph: ```wolfram BuckyballGraph[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BuckyballGraph.html) for more details. # ButterflyGraph `ButterflyGraph[n]` gives the order-n butterfly graph. `ButterflyGraph[n, b]` gives the base-b order-n butterfly graph. Examples [#examples] Create a butterfly graph: ```wolfram ButterflyGraph[3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ButterflyGraph.html) for more details. # CanonicalGraph `CanonicalGraph[g]` gives a canonical form of the graph g. `CanonicalGraph[{v -> w, ...}]` uses rules to specify the graph. Examples [#examples] Get canonical form of a graph: ```wolfram CanonicalGraph[Graph[{1 -> 2, 2 -> 3, 3 -> 1}]] ``` Compare graphs: ```wolfram CanonicalGraph[CycleGraph[5]] === CanonicalGraph[Graph[{1->2, 2->3, 3->4, 4->5, 5->1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CanonicalGraph.html) for more details. # CayleyGraph `CayleyGraph[group]` returns a Cayley graph representation of a group. Examples [#examples] Create the Cayley graph of a symmetric group: ```wolfram CayleyGraph[SymmetricGroup[3]] (* Graph[...] *) ``` Cayley graph of a dihedral group: ```wolfram CayleyGraph[DihedralGroup[4]] (* Graph[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CayleyGraph.html) for more details. # ChromaticPolynomial `ChromaticPolynomial[g, k]` gives the chromatic polynomial of the graph g. `ChromaticPolynomial[{v -> w, ...}, k]` uses rules to specify the graph g. Examples [#examples] Chromatic polynomial of a complete graph: ```wolfram ChromaticPolynomial[CompleteGraph[4], k] (* k (k - 1) (k - 2) (k - 3) *) ``` Chromatic polynomial of a cycle: ```wolfram ChromaticPolynomial[CycleGraph[5], k] (* (k - 1)^5 + (k - 1) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChromaticPolynomial.html) for more details. # CirculantGraph `CirculantGraph[n, j]` gives the circulant graph with n vertices and jump j. `CirculantGraph[n, {j1, j2, ...}]` gives the circulant graph with n vertices and jumps j1, j2, .... Examples [#examples] Create a circulant graph: ```wolfram CirculantGraph[8, {1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CirculantGraph.html) for more details. # ClosenessCentrality `ClosenessCentrality[g]` gives a list of closeness centralities for the vertices in the graph g. `ClosenessCentrality[{v -> w, ...}]` uses rules to specify the graph g. Examples [#examples] Closeness centrality of a graph: ```wolfram ClosenessCentrality[CycleGraph[5]] (* {0.666667, 0.666667, 0.666667, 0.666667, 0.666667} *) ``` Star graph centrality: ```wolfram ClosenessCentrality[StarGraph[5]] (* {1., 0.571429, 0.571429, 0.571429, 0.571429} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClosenessCentrality.html) for more details. # CompleteGraph `CompleteGraph[n]` creates a complete graph $K_n$ with `n` vertices where every vertex is connected to every other. Examples [#examples] Create complete graphs: ```wolfram CompleteGraph[5] (* Complete bipartite graph K_{3,3} *) CompleteGraph[{3, 3}] (* Styled complete graph *) CompleteGraph[6, GraphStyle -> "DiagramBlue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompleteGraph.html) for more details. # CompleteGraphQ `CompleteGraphQ[g]` yields True if the graph g is a complete graph, and False otherwise. `CompleteGraphQ[g, vlist]` yields True if the subgraph induced by vlist is a complete graph. Examples [#examples] Test if a graph is complete: ```wolfram CompleteGraphQ[CompleteGraph[5]] (* True *) ``` A cycle graph is not complete: ```wolfram CompleteGraphQ[CycleGraph[5]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompleteGraphQ.html) for more details. # CompleteKaryTree `CompleteKaryTree[n]` gives the complete binary tree with n levels. `CompleteKaryTree[n, k]` gives the complete k-ary tree with n levels. Examples [#examples] Create a binary tree with 4 levels: ```wolfram CompleteKaryTree[4] (* Graph[...] *) ``` Create a ternary tree with 3 levels: ```wolfram CompleteKaryTree[3, 3] (* Graph[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompleteKaryTree.html) for more details. # ConnectedComponents `ConnectedComponents[g]` gives the connected components of graph g as lists of vertices. Examples [#examples] Find connected components: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 4 <-> 5}] ConnectedComponents[g] (* {{1, 2, 3}, {4, 5}} *) ``` Single connected graph: ```wolfram ConnectedComponents[CompleteGraph[5]] (* {{1, 2, 3, 4, 5}} *) ``` Number of components: ```wolfram Length[ConnectedComponents[g]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConnectedComponents.html) for more details. # ConnectedGraphComponents `ConnectedGraphComponents[g]` gives the connected components of the graph g. `ConnectedGraphComponents[g, {v1, v2, ...}]` gives the connected components that include at least one of the vertices v1, v2, .... `ConnectedGraphComponents[g, patt]` gives the connected components that include a vertex that matches the pattern patt. `ConnectedGraphComponents[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Get connected components as subgraphs: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 4 <-> 5}]; ConnectedGraphComponents[g] ``` Components containing specific vertices: ```wolfram ConnectedGraphComponents[g, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConnectedGraphComponents.html) for more details. # ConnectedGraphQ `ConnectedGraphQ[g]` yields `True` if graph g is connected (every vertex can reach every other vertex), and `False` otherwise. Examples [#examples] Test connectivity: ```wolfram ConnectedGraphQ[Graph[{1 <-> 2, 2 <-> 3}]] (* True *) ConnectedGraphQ[Graph[{1 <-> 2, 3 <-> 4}]] (* False - two disconnected components *) ``` Complete graphs are connected: ```wolfram ConnectedGraphQ[CompleteGraph[10]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConnectedGraphQ.html) for more details. # ConnectedMeshComponents `ConnectedMeshComponents[mr]` gives a list \{c1, c2, ...} of disjoint path connected meshed regions. Examples [#examples] Find connected components of a mesh: ```wolfram mesh = BoundaryMesh[Ball[{0, 0, 0}, 1]]; ConnectedMeshComponents[mesh] ``` Multiple disconnected regions: ```wolfram r = RegionUnion[Ball[{0, 0, 0}], Ball[{5, 0, 0}]]; ConnectedMeshComponents[BoundaryDiscretizeRegion[r]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConnectedMeshComponents.html) for more details. # CycleGraph `CycleGraph[n]` gives the cycle graph C\_n with n vertices connected in a cycle. Examples [#examples] Create cycle graphs: ```wolfram CycleGraph[6] (* Hexagonal cycle *) ``` Triangle (3-cycle): ```wolfram CycleGraph[3] ``` Edge count equals vertex count: ```wolfram EdgeCount[CycleGraph[10]] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CycleGraph.html) for more details. # DegreeCentrality `DegreeCentrality[g]` gives a list of vertex degrees for the vertices in the underlying simple graph of g. `DegreeCentrality[g, "In"]` gives a list of vertex in-degrees. `DegreeCentrality[g, "Out"]` gives a list of vertex out-degrees. Examples [#examples] Compute degree centrality: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 2 <-> 4, 3 <-> 4}]; DegreeCentrality[g] (* {1, 3, 2, 2} *) ``` For a directed graph: ```wolfram dg = Graph[{1 -> 2, 2 -> 3, 1 -> 3}]; DegreeCentrality[dg, "Out"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DegreeCentrality.html) for more details. # DirectedGraph `DirectedGraph[g]` gives a directed graph from the undirected graph g. `DirectedGraph[g, conv]` gives a directed graph using the conversion conv. Examples [#examples] Convert undirected to directed: ```wolfram DirectedGraph[Graph[{1 <-> 2, 2 <-> 3}]] ``` With specific conversion: ```wolfram DirectedGraph[CycleGraph[4], "Acyclic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectedGraph.html) for more details. # DirectedGraphQ `DirectedGraphQ[g]` yields `True` if graph g is a directed graph and `False` otherwise. Examples [#examples] Check if graph is directed: ```wolfram DirectedGraphQ[Graph[{1 -> 2, 2 -> 3}]] (* True *) DirectedGraphQ[Graph[{1 <-> 2, 2 <-> 3}]] (* False *) ``` Complete graphs are undirected: ```wolfram DirectedGraphQ[CompleteGraph[5]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectedGraphQ.html) for more details. # DominatorTreeGraph `DominatorTreeGraph[g, r]` gives the dominator tree of the directed graph g from the root vertex r. Examples [#examples] Find the dominator tree of a graph: ```wolfram DominatorTreeGraph[Graph[{1 -> 2, 1 -> 3, 2 -> 4, 3 -> 4}], 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DominatorTreeGraph.html) for more details. # EccentricityCentrality `EccentricityCentrality[g]` gives a list of eccentricity centralities for the vertices in the graph g. `EccentricityCentrality[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] Get eccentricity centrality for a graph: ```wolfram EccentricityCentrality[CycleGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EccentricityCentrality.html) for more details. # EdgeAdd `EdgeAdd[g, e]` makes a graph by adding the edge e to the graph g. `EdgeAdd[g, {e1, e2, ...}]` adds a collection of edges to g. Examples [#examples] Add an edge to a graph: ```wolfram EdgeAdd[Graph[{1 -> 2}], 2 -> 3] ``` Add multiple edges: ```wolfram EdgeAdd[CycleGraph[4], {1 -> 3, 2 -> 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeAdd.html) for more details. # EdgeBetweennessCentrality `EdgeBetweennessCentrality[g]` gives a list of betweenness centralities for the edges in the graph g. Examples [#examples] Compute edge betweenness centrality: ```wolfram EdgeBetweennessCentrality[Graph[{1 -> 2, 2 -> 3, 1 -> 3}]] ``` Identify important edges: ```wolfram g = GridGraph[{3, 3}]; EdgeBetweennessCentrality[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeBetweennessCentrality.html) for more details. # EdgeChromaticNumber `EdgeChromaticNumber[g]` gives the chromatic number for the edges of the graph g. Examples [#examples] Get edge chromatic number of a complete graph: ```wolfram EdgeChromaticNumber[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeChromaticNumber.html) for more details. # EdgeConnectivity `EdgeConnectivity[g]` gives the edge connectivity of the graph g. `EdgeConnectivity[g, s, t]` gives the s-t edge connectivity of the graph g. Examples [#examples] Edge connectivity of a graph: ```wolfram EdgeConnectivity[CompleteGraph[5]] (* 4 *) ``` Between specific vertices: ```wolfram EdgeConnectivity[GridGraph[{3, 3}], 1, 9] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeConnectivity.html) for more details. # EdgeContract `EdgeContract[g, e]` contracts the edge e of the graph g. `EdgeContract[g, {e1, e2, ...}]` contracts a collection of edges e1, e2, .... `EdgeContract[{v -> w, ...}, ...]` uses rules v->w to specify the graph g. Examples [#examples] Contract an edge: ```wolfram EdgeContract[CycleGraph[4], 1 <-> 2] (* Graph with 3 vertices *) ``` Contract multiple edges: ```wolfram EdgeContract[CompleteGraph[4], {1 <-> 2, 3 <-> 4}] (* Graph with 2 vertices *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeContract.html) for more details. # EdgeCount `EdgeCount[g]` gives the number of edges in graph g. `EdgeCount[g, patt]` counts edges matching the pattern. Examples [#examples] Count edges: ```wolfram EdgeCount[CompleteGraph[5]] (* 10 - n*(n-1)/2 for complete graph *) EdgeCount[CycleGraph[10]] (* 10 *) ``` Edge count in grid: ```wolfram EdgeCount[GridGraph[{3, 3}]] (* 12 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeCount.html) for more details. # EdgeCoverQ `EdgeCoverQ[g, elist]` yields `True` if the edge list elist is an edge cover of the graph g and `False` otherwise. Examples [#examples] Check if edges cover all vertices: ```wolfram EdgeCoverQ[CycleGraph[4], {1 <-> 2, 3 <-> 4}] (* True *) ``` Incomplete cover: ```wolfram EdgeCoverQ[PathGraph[Range[5]], {1 <-> 2}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeCoverQ.html) for more details. # EdgeCycleMatrix `EdgeCycleMatrix[g]` gives the edge cycle matrix of a graph g. Examples [#examples] Get edge cycle matrix: ```wolfram EdgeCycleMatrix[CycleGraph[4]] ``` For a complete graph: ```wolfram EdgeCycleMatrix[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeCycleMatrix.html) for more details. # EdgeDelete `EdgeDelete[g, e]` makes a graph by deleting the edge e from the graph g. `EdgeDelete[g, {e1, e2, ...}]` deletes a collection of edges from g. `EdgeDelete[g, patt]` deletes all edges matching the pattern patt. Examples [#examples] Delete a single edge: ```wolfram EdgeDelete[CompleteGraph[4], 1 <-> 2] ``` Delete multiple edges: ```wolfram EdgeDelete[CycleGraph[5], {1 <-> 2, 2 <-> 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeDelete.html) for more details. # EdgeDetect `EdgeDetect[image]` finds edges in image and returns the result as a binary image. `EdgeDetect[image, r]` finds edges at the scale of the specified pixel range r. `EdgeDetect[image, r, t]` uses a threshold t for selecting image edges. Examples [#examples] Detect edges in an image: ```wolfram EdgeDetect[ExampleData[{"TestImage", "Lena"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeDetect.html) for more details. # EdgeIndex `EdgeIndex[g, e]` gives the integer index for the edge e in the graph g. Examples [#examples] Get edge index: ```wolfram g = Graph[{a -> b, b -> c, c -> d}]; EdgeIndex[g, b -> c] (* 2 *) ``` Use with edge list: ```wolfram EdgeIndex[CompleteGraph[4], 1 <-> 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeIndex.html) for more details. # EdgeList `EdgeList[g]` gives the list of edges in graph `g`. Examples [#examples] Get edges from a graph: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1}] EdgeList[g] (* {1 <-> 2, 2 <-> 3, 1 <-> 3} *) Length[EdgeList[CompleteGraph[5]]] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeList.html) for more details. # EdgeQ `EdgeQ[g, e]` yields `True` if e is an edge in the graph g and `False` otherwise. Examples [#examples] Check if edge exists: ```wolfram g = Graph[{1 -> 2, 2 -> 3}]; EdgeQ[g, 1 -> 2] (* True *) ``` ```wolfram EdgeQ[g, 1 -> 3] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeQ.html) for more details. # EdgeRules `EdgeRules[g]` gives the list of edge rules for the graph g. Examples [#examples] Get edge rules: ```wolfram EdgeRules[Graph[{1 <-> 2, 2 <-> 3}]] (* {1 -> 2, 2 -> 3} *) ``` For a directed graph: ```wolfram EdgeRules[Graph[{1 -> 2, 2 -> 3}]] (* {1 -> 2, 2 -> 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeRules.html) for more details. # EdgeTaggedGraph `EdgeTaggedGraph[{e1, e2, ...}]` yields a graph with edges ej tagged with unique tags. `EdgeTaggedGraph[{e1, e2, ...} -> {t1, t2, ...}]` yields a graph with edges ej tagged with tj. Examples [#examples] Create edge-tagged graph: ```wolfram EdgeTaggedGraph[{1 -> 2, 2 -> 3} -> {"a", "b"}] ``` Auto-tagged edges: ```wolfram EdgeTaggedGraph[{1 <-> 2, 2 <-> 3, 1 <-> 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeTaggedGraph.html) for more details. # EdgeTaggedGraphQ `EdgeTaggedGraphQ[g]` yields True if the graph g has edges tagged and False otherwise. Examples [#examples] ```wolfram EdgeTaggedGraphQ[Graph[{1 <-> 2, 2 <-> 3}]] (* False *) ``` ```wolfram g = Graph[{Property[1 <-> 2, EdgeTags -> {"a"}], 2 <-> 3}]; EdgeTaggedGraphQ[g] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeTaggedGraphQ.html) for more details. # EdgeTags `EdgeTags[g]` gives the list of tags for all edges in the graph g. `EdgeTags[g, {u, v}]` gives the list of tags for edges between u and v. Examples [#examples] Get edge tags: ```wolfram g = EdgeTaggedGraph[{1 -> 2, 2 -> 3} -> {"a", "b"}]; EdgeTags[g] (* {"a", "b"} *) ``` Tags between specific vertices: ```wolfram EdgeTags[g, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeTags.html) for more details. # EdgeTransitiveGraphQ `EdgeTransitiveGraphQ[g]` yields `True` if the graph g is an edge-transitive graph and `False` otherwise. Examples [#examples] Check if a graph is edge-transitive: ```wolfram EdgeTransitiveGraphQ[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeTransitiveGraphQ.html) for more details. # EdgeWeightedGraphQ `EdgeWeightedGraphQ[g]` yields `True` if the graph g is an edge-weighted graph and `False` otherwise. Examples [#examples] Check if a graph has edge weights: ```wolfram EdgeWeightedGraphQ[Graph[{1 -> 2}, EdgeWeight -> {5}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EdgeWeightedGraphQ.html) for more details. # EigenvectorCentrality `EigenvectorCentrality[g]` gives a list of eigenvector centralities for the vertices in the graph g. `EigenvectorCentrality[g, "In"]` gives a list of in-centralities for a directed graph g. `EigenvectorCentrality[g, "Out"]` gives a list of out-centralities for a directed graph g. Examples [#examples] Compute eigenvector centrality: ```wolfram EigenvectorCentrality[CompleteGraph[5]] ``` For a directed graph: ```wolfram EigenvectorCentrality[Graph[{1 -> 2, 2 -> 3, 3 -> 1}], "In"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EigenvectorCentrality.html) for more details. # EmptyGraphQ `EmptyGraphQ[g]` yields `True` if g is an empty graph and `False` otherwise. Examples [#examples] Check if graph is empty: ```wolfram EmptyGraphQ[Graph[{}]] (* True *) ``` Non-empty graph: ```wolfram EmptyGraphQ[Graph[{1 -> 2}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EmptyGraphQ.html) for more details. # FindClique `FindClique[g]` finds a largest clique in the graph g. * `FindClique[g,n]` finds a clique containing at most n vertices. * `FindClique[g,{n}]` finds a clique containing exactly n vertices. * `FindClique[g,{nmin,nmax}]` finds a clique containing between nmin and nmax vertices. * `FindClique[g,nspec,s]` finds at most s cliques. * `FindClique[{g,v},…]` finds cliques that include the vertex v only. * `FindClique[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find the largest clique *) g = RandomGraph[{10, 20}]; FindClique[g] (* Find a clique of specific size *) FindClique[g, {3}] (* Find multiple cliques *) FindClique[g, Infinity, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindClique.html) for more details. # FindCycle `FindCycle[g]` finds a cycle in graph g. `FindCycle[g, k, n]` finds up to n cycles of length at most k. Examples [#examples] Find a cycle: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}] FindCycle[g] (* {{1 -> 2, 2 -> 3, 3 -> 1}} *) ``` Find triangles: ```wolfram FindCycle[CompleteGraph[5], {3}, All] (* All 3-cycles in K5 *) ``` No cycles in a tree: ```wolfram FindCycle[TreeGraph[{1 -> 2, 1 -> 3}]] (* {} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindCycle.html) for more details. # FindEdgeColoring `FindEdgeColoring[g]` finds a coloring with minimal size for the edges in the graph g. `FindEdgeColoring[g,{c1,c2,…}]` finds a coloring \{c1,c2,…,ck} for the edges in the graph g. Examples [#examples] Find edge coloring for a complete graph: ```wolfram FindEdgeColoring[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEdgeColoring.html) for more details. # FindEdgeCover `FindEdgeCover[g]` finds an edge cover of the graph g with a minimum number of edges. `FindEdgeCover[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find minimum edge cover *) g = Graph[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1}]; FindEdgeCover[g] (* Visualize the edge cover *) cover = FindEdgeCover[g]; HighlightGraph[g, cover] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEdgeCover.html) for more details. # FindEdgeCut `FindEdgeCut[g]` finds a smallest edge cut of the graph g. * `FindEdgeCut[g,s,t]` finds a smallest s-t edge cut of the graph g. * `FindEdgeCut[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find the smallest edge cut *) g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 1 <-> 4}]; FindEdgeCut[g] (* Find s-t edge cut *) FindEdgeCut[g, 1, 3] (* Visualize the cut *) cut = FindEdgeCut[g]; HighlightGraph[g, cut] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEdgeCut.html) for more details. # FindEdgeIndependentPaths `FindEdgeIndependentPaths[g,s,t,k]` finds at most k edge-independent paths from vertex s to vertex t in the graph g. `FindEdgeIndependentPaths[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find 2 edge-independent paths *) g = Graph[{1 <-> 2, 1 <-> 3, 2 <-> 4, 3 <-> 4}]; FindEdgeIndependentPaths[g, 1, 4, 2] (* Find all possible independent paths *) FindEdgeIndependentPaths[g, 1, 4, Infinity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEdgeIndependentPaths.html) for more details. # FindEulerianCycle `FindEulerianCycle[g]` finds an Eulerian cycle in the graph g. * `FindEulerianCycle[g,k]` finds at most k Eulerian cycles. * `FindEulerianCycle[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find an Eulerian cycle in a complete graph *) g = CompleteGraph[5]; FindEulerianCycle[g] (* Find multiple Eulerian cycles *) FindEulerianCycle[g, 3] (* Check if cycle exists first *) EulerianGraphQ[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEulerianCycle.html) for more details. # FindGraphCommunities `FindGraphCommunities[g]` finds communities in the graph g. `FindGraphCommunities[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find communities in a social network *) g = RandomGraph[{20, 40}]; FindGraphCommunities[g] (* Visualize communities *) communities = FindGraphCommunities[g]; CommunityGraphPlot[g, communities] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGraphCommunities.html) for more details. # FindGraphIsomorphism `FindGraphIsomorphism[g1,g2]` finds an isomorphism that maps the graph g1 to g2 by renaming vertices. * `FindGraphIsomorphism[g1,g2,n]` finds at most n isomorphisms. * `FindGraphIsomorphism[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find isomorphism between two graphs *) g1 = CycleGraph[5]; g2 = Graph[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 5, 5 -> 1}]; FindGraphIsomorphism[g1, g2] (* Find multiple isomorphisms *) FindGraphIsomorphism[g1, g2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGraphIsomorphism.html) for more details. # FindGraphPartition `FindGraphPartition[g]` gives a partition of vertices of the graph g. `FindGraphPartition[g, k]` gives a partition of vertices into k approximately equal-size parts. `FindGraphPartition[g, {n1, ..., nk}]` gives a partition of vertices into parts with sizes n1, ..., nk. `FindGraphPartition[g, {α1, ..., αk}]` gives a partition of vertices into parts with approximate size proportions α1, ..., αk. `FindGraphPartition[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram FindGraphPartition[PetersenGraph[]] (* {{1, 2, 6, 7, 9}, {3, 4, 5, 8, 10}} *) ``` ```wolfram FindGraphPartition[CompleteGraph[6], 3] (* {{1, 4}, {2, 5}, {3, 6}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGraphPartition.html) for more details. # FindHamiltonianCycle `FindHamiltonianCycle[g]` finds a Hamiltonian cycle in the graph g. * `FindHamiltonianCycle[g,k]` finds at most k Hamiltonian cycles. * `FindHamiltonianCycle[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find a Hamiltonian cycle *) g = CompleteGraph[5]; FindHamiltonianCycle[g] (* Find multiple Hamiltonian cycles *) FindHamiltonianCycle[g, 3] (* Check if cycle exists first *) HamiltonianGraphQ[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindHamiltonianCycle.html) for more details. # FindHamiltonianPath `FindHamiltonianPath[g]` finds a Hamiltonian path in the graph g with the smallest total length. `FindHamiltonianPath[g,s,t]` finds a Hamiltonian path with the smallest total length from s to t. Examples [#examples] ```wolfram (* Find a Hamiltonian path *) g = CompleteGraph[5]; FindHamiltonianPath[g] (* Find path between specific vertices *) FindHamiltonianPath[g, 1, 5] (* Visualize the path *) path = FindHamiltonianPath[g]; HighlightGraph[g, PathGraph[path]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindHamiltonianPath.html) for more details. # FindIndependentEdgeSet `FindIndependentEdgeSet[g]` finds an independent edge set of the graph g with a maximum number of edges. `FindIndependentEdgeSet[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find maximum independent edge set *) g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 4 <-> 1, 1 <-> 3}]; FindIndependentEdgeSet[g] (* Visualize the edge set *) edges = FindIndependentEdgeSet[g]; HighlightGraph[g, edges] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindIndependentEdgeSet.html) for more details. # FindIndependentVertexSet `FindIndependentVertexSet[g]` finds an independent vertex set of the graph g with a maximum number of vertices. * `FindIndependentVertexSet[g,n]` finds an independent vertex set with at most n vertices. * `FindIndependentVertexSet[g,{n}]` finds an independent vertex set with exactly n vertices. * `FindIndependentVertexSet[g,{nmin,nmax}]` finds an independent vertex set containing between nmin and nmax vertices. * `FindIndependentVertexSet[g,nspec,s]` finds at most s independent vertex sets. * `FindIndependentVertexSet[{g,v},…]` finds independent sets that include the vertex v only. * `FindIndependentVertexSet[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find maximum independent vertex set *) g = PetersenGraph[]; FindIndependentVertexSet[g] (* Find independent set of specific size *) FindIndependentVertexSet[g, {3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindIndependentVertexSet.html) for more details. # FindKClan `FindKClan[g,k]` finds a largest k-clan in the graph g. * `FindKClan[g,k,n]` finds a k-clan containing at most n vertices. * `FindKClan[g,k,{n}]` finds a k-clan containing exactly n vertices. * `FindKClan[g,k,{nmin,nmax}]` finds a k-clan containing between nmin and nmax vertices. * `FindKClan[g,k,nspec,s]` finds at most s k-clans. * `FindKClan[{g,v},k,…]` finds k-clans that include the vertex v only. * `FindKClan[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find a 2-clan *) g = RandomGraph[{10, 20}]; FindKClan[g, 2] (* Find a k-clan of specific size *) FindKClan[g, 2, {4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindKClan.html) for more details. # FindKClique `FindKClique[g,k]` finds a largest k-clique in the graph g. * `FindKClique[g,k,n]` finds a k-clique containing at most n vertices. * `FindKClique[g,k,{n}]` finds a k-clique containing exactly n vertices. * `FindKClique[g,k,{nmin,nmax}]` finds a k-clique containing between nmin and nmax vertices. * `FindKClique[g,k,nspec,s]` finds at most s k-cliques. * `FindKClique[{g,v},k,…]` finds k-cliques that include the vertex v only. * `FindKClique[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find a 2-clique *) g = RandomGraph[{10, 25}]; FindKClique[g, 2] (* Find multiple k-cliques *) FindKClique[g, 2, Infinity, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindKClique.html) for more details. # FindKClub `FindKClub[g,k]` finds a largest k-club in the graph g. Examples [#examples] ```wolfram (* Find a 2-club *) g = RandomGraph[{10, 20}]; FindKClub[g, 2] (* Find a 3-club *) FindKClub[g, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindKClub.html) for more details. # FindKPlex `FindKPlex[g,k]` finds a largest k-plex in the graph g. * `FindKPlex[g,k,n]` finds a k-plex containing at most n vertices. * `FindKPlex[g,k,{n}]` finds a k-plex containing exactly n vertices. * `FindKPlex[g,k,{nmin,nmax}]` finds a k-plex containing between nmin and nmax vertices. * `FindKPlex[g,k,nspec,s]` finds at most s k-plexes. * `FindKPlex[{g,v},k,…]` finds k-plexes that include the vertex v only. * `FindKPlex[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find a 2-plex *) g = RandomGraph[{10, 20}]; FindKPlex[g, 2] (* Find a k-plex of specific size *) FindKPlex[g, 2, {5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindKPlex.html) for more details. # FindMaximumFlow `FindMaximumFlow[g,s,t]` finds the maximum flow between source vertex s and target vertex t in a graph g. * `FindMaximumFlow[m,s,t]` finds the maximum flow between vertex indices s and t in a graph with edge capacity matrix m. * `FindMaximumFlow[data,{s1,…},{t1,…}]` finds the maximum flow between multi-sources s1, … and multi-targets t1, …. * `FindMaximumFlow[data,source,target,"property"]` returns the value of "property". * `FindMaximumFlow[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find maximum flow in a weighted graph *) g = Graph[{1 -> 2, 2 -> 3, 1 -> 3}, EdgeWeight -> {5, 3, 2}]; FindMaximumFlow[g, 1, 3] (* Get the flow graph *) FindMaximumFlow[g, 1, 3, "FlowGraph"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMaximumFlow.html) for more details. # FindMinimumCut `FindMinimumCut[g]` gives the minimum cut of the graph g. `FindMinimumCut[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find minimum cut *) g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 4 <-> 1, 1 <-> 3}]; FindMinimumCut[g] (* Visualize the cut *) cut = FindMinimumCut[g]; HighlightGraph[g, cut] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMinimumCut.html) for more details. # FindPath `FindPath[g, s, t]` finds a path between vertices s and t in graph g. `FindPath[g, s, t, k, n]` finds up to n paths of length at most k. Examples [#examples] Find any path: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 1 <-> 3}] FindPath[g, 1, 3] (* {{1, 3}} *) ``` Find multiple paths: ```wolfram FindPath[g, 1, 3, Infinity, All] (* {{1, 3}, {1, 2, 3}} *) ``` Paths of specific length: ```wolfram FindPath[g, 1, 3, {2}] (* {{1, 2, 3}} - length exactly 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPath.html) for more details. # FindPlanarColoring `FindPlanarColoring[g]` finds a coloring with minimal size for the faces of the planar graph g. `FindPlanarColoring[g,{c1,c2,…}]` finds a coloring \{c1,c2,…,ck} for the faces in the graph g. Examples [#examples] ```wolfram (* Find face coloring for a planar graph *) g = GridGraph[{3, 3}]; FindPlanarColoring[g] (* Use specific colors *) FindPlanarColoring[g, {Red, Blue, Green, Yellow}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPlanarColoring.html) for more details. # FindShortestPath `FindShortestPath[g, s, t]` finds the shortest path from source vertex s to target vertex t in graph g. Examples [#examples] Find shortest path: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 1 <-> 4}] FindShortestPath[g, 1, 3] (* {1, 2, 3} or {1, 4, 3} *) ``` In a grid: ```wolfram FindShortestPath[GridGraph[{5, 5}], 1, 25] ``` Path length: ```wolfram Length[FindShortestPath[g, 1, 3]] - 1 (* 2 edges *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindShortestPath.html) for more details. # FindSpanningTree `FindSpanningTree[g]` finds a spanning tree of graph g that connects all vertices with minimum total edge weight. Examples [#examples] Spanning tree of a complete graph: ```wolfram FindSpanningTree[CompleteGraph[5]] ``` From a grid: ```wolfram FindSpanningTree[GridGraph[{3, 3}]] (* Tree with 9 vertices, 8 edges *) ``` Minimum spanning tree with weights: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 1 <-> 3}, EdgeWeight -> {1, 2, 3}] FindSpanningTree[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindSpanningTree.html) for more details. # FindSubgraphIsomorphism `FindSubgraphIsomorphism[g1, g2]` finds a subgraph isomorphism that maps the graph g1 to a subgraph of g2 by renaming vertices. `FindSubgraphIsomorphism[g1, g2, n]` finds at most n subgraph isomorphisms. Examples [#examples] Find a triangle in a complete graph: ```wolfram FindSubgraphIsomorphism[CycleGraph[3], CompleteGraph[5]] (* {<|1 -> 1, 2 -> 2, 3 -> 3|>} *) ``` Find multiple isomorphisms: ```wolfram FindSubgraphIsomorphism[PathGraph[{1, 2}], CompleteGraph[4], 3] (* Three edge mappings *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindSubgraphIsomorphism.html) for more details. # FindVertexColoring `FindVertexColoring[g]` finds a coloring with minimal size for the vertices in the graph g. `FindVertexColoring[g, {c1, c2, ...}]` finds a coloring using the specified colors for the vertices in the graph g. Examples [#examples] Find a minimal vertex coloring: ```wolfram FindVertexColoring[PetersenGraph[]] (* {1, 2, 3, 2, 3, 1, 3, 1, 2, 1} *) ``` Use specific colors: ```wolfram FindVertexColoring[CycleGraph[4], {Red, Blue}] (* {Red, Blue, Red, Blue} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindVertexColoring.html) for more details. # FindVertexCover `FindVertexCover[g]` finds a vertex cover of the graph g with a minimum number of vertices. Examples [#examples] Find minimum vertex cover: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}] FindVertexCover[g] (* {2, 3} *) ``` For a complete graph: ```wolfram FindVertexCover[CompleteGraph[4]] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindVertexCover.html) for more details. # FindVertexCut `FindVertexCut[g]` finds a smallest vertex cut of the graph g. `FindVertexCut[g, s, t]` finds a smallest s-t vertex cut of the graph g. `FindVertexCut[{v->w, ...}, ...]` uses rules v->w to specify the graph g. Examples [#examples] Find the vertex cut of a graph: ```wolfram FindVertexCut[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindVertexCut.html) for more details. # FindVertexIndependentPaths `FindVertexIndependentPaths[g, s, t, k]` finds at most k vertex-independent paths from vertex s to vertex t in the graph g. * `FindVertexIndependentPaths[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Find vertex-independent paths in a graph: ```wolfram g = CompleteGraph[5]; FindVertexIndependentPaths[g, 1, 5, 3] ``` Highlight the paths: ```wolfram paths = FindVertexIndependentPaths[g, 1, 5, 3]; HighlightGraph[g, paths] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindVertexIndependentPaths.html) for more details. # FlowPolynomial `FlowPolynomial[g, k]` gives the flow polynomial of the graph g. * `FlowPolynomial[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Compute the flow polynomial of a graph: ```wolfram FlowPolynomial[CycleGraph[4], k] ``` Flow polynomial of a complete graph: ```wolfram FlowPolynomial[CompleteGraph[4], k] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FlowPolynomial.html) for more details. # GlobalClusteringCoefficient `GlobalClusteringCoefficient[g]` gives the global clustering coefficient of the graph `g`. * `GlobalClusteringCoefficient[{v -> w, …}]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram GlobalClusteringCoefficient[CompleteGraph[5]] ``` ```wolfram GlobalClusteringCoefficient[RandomGraph[{10, 20}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GlobalClusteringCoefficient.html) for more details. # Graph `Graph[{e1, e2, ...}]` creates a graph with specified edges. `Graph[{v1, v2, ...}, {e1, e2, ...}]` specifies both vertices and edges. Examples [#examples] Create graphs: ```wolfram (* Simple graph from edges *) Graph[{1 -> 2, 2 -> 3, 3 -> 1}] (* Undirected graph *) Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 4 <-> 1}] (* With vertex labels *) Graph[{"A" -> "B", "B" -> "C", "C" -> "A"}, VertexLabels -> "Name"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Graph.html) for more details. # Graph3D `Graph3D[g]` creates a graph with vertices and edges from the graph `g` and represented as a 3D plot. * `Graph3D[{e1, e2, …}]` creates a graph with edges `ej` and represented as a 3D plot. * `Graph3D[{v1, v2, …}, {e1, e2, …}]` creates a graph with vertices `vi` and edges `ej`. Examples [#examples] ```wolfram Graph3D[CompleteGraph[10]] ``` ```wolfram Graph3D[{1 <-> 2, 2 <-> 3, 3 <-> 4, 4 <-> 1, 1 <-> 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Graph3D.html) for more details. # GraphAssortativity `GraphAssortativity[g]` gives the assortativity coefficient of a graph g using vertex degrees. `GraphAssortativity[g,"prop"]` gives the assortativity coefficient of the graph g using vertex property "prop". `GraphAssortativity[g,{{vi1,vi2,…},…}]` gives the assortativity coefficient of the graph g with respect to the vertex partition \{\{vi1,vi2,…},…}. `GraphAssortativity[g,{v1,v2,…}->{x1,x2,…}]` gives the assortativity coefficient of the graph g using data \{x1,x2,…} for vertices \{v1,v2,…}. `GraphAssortativity[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Compute the assortativity of a random graph: ```wolfram GraphAssortativity[RandomGraph[{20, 50}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphAssortativity.html) for more details. # GraphAutomorphismGroup `GraphAutomorphismGroup[g]` gives the automorphism group of a graph `g`. * `GraphAutomorphismGroup[{v -> w, …}]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram GraphAutomorphismGroup[CycleGraph[5]] ``` ```wolfram GraphAutomorphismGroup[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphAutomorphismGroup.html) for more details. # GraphCenter `GraphCenter[g]` gives the set of vertices with minimum eccentricity (most central vertices) in graph g. Examples [#examples] Center of a path: ```wolfram GraphCenter[PathGraph[Range[5]]] (* {3} - middle vertex *) ``` Center of a cycle: ```wolfram GraphCenter[CycleGraph[6]] (* {1, 2, 3, 4, 5, 6} - all vertices *) ``` Center of a grid: ```wolfram GraphCenter[GridGraph[{3, 3}]] (* {5} - center of 3x3 grid *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphCenter.html) for more details. # GraphComplement `GraphComplement[g]` gives the graph complement of the graph g (edges become non-edges and vice versa). Examples [#examples] Complement of a cycle: ```wolfram GraphComplement[CycleGraph[5]] ``` Complement of a complete graph: ```wolfram GraphComplement[CompleteGraph[4]] (* Empty graph *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphComplement.html) for more details. # GraphData `GraphData[name]` gives a graph with the specified name. `GraphData[class]` gives a list of available named graphs in the specified class. Examples [#examples] Get a named graph: ```wolfram GraphData["PetersenGraph"] ``` List planar graphs: ```wolfram GraphData["Planar", 6] (* Named planar graphs on 6 vertices *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphData.html) for more details. # GraphDensity `GraphDensity[g]` gives the graph density of the graph `g`. * `GraphDensity[{v -> w, …}]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram GraphDensity[CompleteGraph[10]] ``` ```wolfram GraphDensity[RandomGraph[{20, 50}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDensity.html) for more details. # GraphDiameter `GraphDiameter[g]` gives the greatest distance between any pair of vertices in graph g. Examples [#examples] Diameter of a path: ```wolfram GraphDiameter[PathGraph[Range[10]]] (* 9 *) ``` Diameter of a complete graph: ```wolfram GraphDiameter[CompleteGraph[10]] (* 1 - every vertex connects directly *) ``` Diameter of a grid: ```wolfram GraphDiameter[GridGraph[{5, 5}]] (* 8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDiameter.html) for more details. # GraphDifference `GraphDifference[g1, g2]` gives the graph difference of graphs g1 and g2 (edges in g1 but not in g2). Examples [#examples] Difference of two graphs: ```wolfram g1 = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}] g2 = Graph[{2 <-> 3}] GraphDifference[g1, g2] (* Graph with edges 1 <-> 2, 3 <-> 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDifference.html) for more details. # GraphDisjointUnion `GraphDisjointUnion[g1, g2]` gives the disjoint union of graphs g1 and g2 (vertices and edges from both, kept separate). Examples [#examples] Disjoint union: ```wolfram GraphDisjointUnion[CycleGraph[3], CycleGraph[4]] (* Graph with 7 vertices, two separate components *) ``` Multiple graphs: ```wolfram GraphDisjointUnion[PathGraph[{1, 2}], PathGraph[{3, 4}], PathGraph[{5, 6}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDisjointUnion.html) for more details. # GraphDistance `GraphDistance[g, s, t]` gives the shortest path distance from vertex s to vertex t in graph g. Examples [#examples] Distance between vertices: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}] GraphDistance[g, 1, 4] (* 3 *) ``` Distances from one vertex to all others: ```wolfram GraphDistance[g, 1] (* {0, 1, 2, 3} *) ``` In a complete graph: ```wolfram GraphDistance[CompleteGraph[5], 1, 5] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDistance.html) for more details. # GraphDistanceMatrix `GraphDistanceMatrix[g]` gives the matrix of shortest path distances between all pairs of vertices. Examples [#examples] Distance matrix of a path: ```wolfram GraphDistanceMatrix[PathGraph[{1, 2, 3, 4}]] (* {{0, 1, 2, 3}, {1, 0, 1, 2}, {2, 1, 0, 1}, {3, 2, 1, 0}} *) ``` For a complete graph: ```wolfram GraphDistanceMatrix[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphDistanceMatrix.html) for more details. # GraphEmbedding `GraphEmbedding[g]` gives coordinates of the vertices of the graph `g`. * `GraphEmbedding[g, "emb"]` gives coordinates of the vertices of the graph `g` using the embedding `"emb"`. * `GraphEmbedding[g, "emb", dim]` gives coordinates in dimension `dim` of the vertices of the graph `g` using the embedding `"emb"`. Examples [#examples] ```wolfram GraphEmbedding[CompleteGraph[5]] ``` ```wolfram GraphEmbedding[PetersenGraph[5, 2], "CircularEmbedding"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphEmbedding.html) for more details. # GraphHub `GraphHub[g]` gives the set of vertices with maximum vertex degree in the underlying simple graph of `g`. * `GraphHub[g, "In"]` gives the set of vertices with maximum vertex in-degree. * `GraphHub[g, "Out"]` gives the set of vertices with maximum vertex out-degree. * `GraphHub[{v -> w, …}, …]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram GraphHub[StarGraph[10]] ``` ```wolfram GraphHub[RandomGraph[{20, 40}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphHub.html) for more details. # GraphIntersection `GraphIntersection[g1, g2]` gives the graph intersection (edges present in both g1 and g2). Examples [#examples] Intersection of two graphs: ```wolfram g1 = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}] g2 = Graph[{2 <-> 3, 3 <-> 4, 4 <-> 5}] GraphIntersection[g1, g2] (* Graph with edges 2 <-> 3, 3 <-> 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphIntersection.html) for more details. # GraphJoin `GraphJoin[g1, g2]` gives the graph join of the graphs `g1` and `g2`. Examples [#examples] ```wolfram GraphJoin[CycleGraph[4], CycleGraph[3]] ``` ```wolfram GraphJoin[PathGraph[{1, 2, 3}], PathGraph[{a, b, c}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphJoin.html) for more details. # GraphPeriphery `GraphPeriphery[g]` gives vertices that are maximally distant to at least one vertex in the graph g. `GraphPeriphery[{v -> w, ...}]` uses rules to specify the graph g. Examples [#examples] Find the periphery of a graph: ```wolfram GraphPeriphery[CycleGraph[6]] (* {1, 2, 3, 4, 5, 6} *) ``` Periphery of a path graph: ```wolfram GraphPeriphery[PathGraph[{a, b, c, d, e}]] (* {a, e} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphPeriphery.html) for more details. # GraphPower `GraphPower[g, n]` gives the graph n-th power of the graph `g`. * `GraphPower[{v -> w, …}, …]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram GraphPower[CycleGraph[10], 2] ``` ```wolfram GraphPower[PathGraph[Range[6]], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphPower.html) for more details. # GraphProduct `GraphProduct[g1, g2]` gives the Cartesian product of the graphs `g1` and `g2`. * `GraphProduct[g1, g2, "op"]` gives the product of type `"op"` for the graphs `g1` and `g2`. Examples [#examples] ```wolfram GraphProduct[PathGraph[{1, 2, 3}], PathGraph[{a, b}]] ``` ```wolfram GraphProduct[CycleGraph[4], CycleGraph[4], "Tensor"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphProduct.html) for more details. # GraphPropertyDistribution `GraphPropertyDistribution[expr, x \[Distributed] gdist]` represents the distribution of the property expr where the random variable x follows the graph distribution gdist. `GraphPropertyDistribution[expr, {x1 \[Distributed] gdist1, x2 \[Distributed] gdist2, ...}]` represents the distribution where x1, x2, ... are independent and follow the graph distributions gdist1, gdist2, .... Examples [#examples] Define a distribution of vertex counts: ```wolfram GraphPropertyDistribution[VertexCount[g], g \[Distributed] RandomGraph[{10, 20}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphPropertyDistribution.html) for more details. # GraphQ `GraphQ[g]` yields `True` if g is a valid `Graph` object and `False` otherwise. Examples [#examples] Test for graphs: ```wolfram GraphQ[Graph[{1 -> 2}]] (* True *) GraphQ[{1 -> 2}] (* False - just a list, not a Graph *) GraphQ[CompleteGraph[5]] (* True *) ``` Conditional handling: ```wolfram If[GraphQ[g], VertexCount[g], "Not a graph"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphQ.html) for more details. # GraphRadius `GraphRadius[g]` gives the minimum eccentricity of the vertices in graph g (the eccentricity of the center). Examples [#examples] Radius of a path: ```wolfram GraphRadius[PathGraph[Range[5]]] (* 2 *) ``` Radius of a complete graph: ```wolfram GraphRadius[CompleteGraph[10]] (* 1 *) ``` Relation to diameter: ```wolfram g = GridGraph[{3, 3}]; {GraphRadius[g], GraphDiameter[g]} (* {2, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphRadius.html) for more details. # GraphReciprocity `GraphReciprocity[g]` gives the reciprocity of a graph g. `GraphReciprocity[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] Compute the reciprocity of a directed graph: ```wolfram GraphReciprocity[Graph[{1 -> 2, 2 -> 1, 2 -> 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphReciprocity.html) for more details. # GraphSum `GraphSum[g1, g2]` gives the graph sum of the graphs `g1` and `g2`. Examples [#examples] ```wolfram GraphSum[PathGraph[{1, 2, 3}], PathGraph[{a, b, c}]] ``` ```wolfram GraphSum[CycleGraph[4], CycleGraph[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphSum.html) for more details. # GraphTree `GraphTree[g]` constructs a tree from the tree graph `g`. * `GraphTree[g, root]` specifies what vertex to use as the root. * `GraphTree[g, root, h]` applies `h` to each vertex to get the corresponding data and ordering of subtrees. Examples [#examples] ```wolfram GraphTree[TreeGraph[{1 -> 2, 1 -> 3, 2 -> 4, 2 -> 5}]] ``` ```wolfram GraphTree[TreeGraph[{a -> b, a -> c, b -> d}], a] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphTree.html) for more details. # GraphTriangleCount `GraphTriangleCount[g]` gives the number of triangles in the graph `g`. Examples [#examples] ```wolfram GraphTriangleCount[CompleteGraph[5]] ``` ```wolfram GraphTriangleCount[RandomGraph[{20, 50}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphTriangleCount.html) for more details. # GraphUnion `GraphUnion[g1,g2]` gives the graph union of the graphs g1 and g2. `GraphUnion[g1,g2,…]` gives the graph union of g1, g2, …. `GraphUnion[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram GraphUnion[CycleGraph[3], CycleGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphUnion.html) for more details. # GridGraph `GridGraph[{m, n}]` gives the m×n grid graph. `GridGraph[{n1, n2, ..., nk}]` gives a k-dimensional grid graph. Examples [#examples] Create 2D grid: ```wolfram GridGraph[{4, 5}] (* 4x5 grid with 20 vertices *) ``` 3D grid: ```wolfram GridGraph[{3, 3, 3}] (* 27 vertices *) ``` Vertex and edge counts: ```wolfram {VertexCount[GridGraph[{3, 4}]], EdgeCount[GridGraph[{3, 4}]]} (* {12, 17} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GridGraph.html) for more details. # HITSCentrality `HITSCentrality[g]` gives a list of authority and hub centralities for the vertices in the graph g. * `HITSCentrality[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] Compute HITS centrality for a graph: ```wolfram HITSCentrality[Graph[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 3}]] ``` For a web-like graph: ```wolfram HITSCentrality[DirectedGraph[RandomGraph[{10, 20}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HITSCentrality.html) for more details. # HamiltonianGraphQ `HamiltonianGraphQ[g]` yields `True` if the graph g is Hamiltonian (has a Hamiltonian cycle), and `False` otherwise. Examples [#examples] Test if a graph is Hamiltonian: ```wolfram HamiltonianGraphQ[CompleteGraph[5]] (* True *) ``` ```wolfram HamiltonianGraphQ[StarGraph[5]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HamiltonianGraphQ.html) for more details. # HararyGraph `HararyGraph[k,n]` generates the minimal k-connected graph on n vertices Hk,n. Examples [#examples] Generate a 3-connected Harary graph on 8 vertices: ```wolfram HararyGraph[3, 8] (* Graph[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HararyGraph.html) for more details. # HighlightGraph `HighlightGraph[g, {a1, a2, ...}]` highlights vertices, edges, or subgraphs ai of the graph g. Examples [#examples] Highlight specific vertices: ```wolfram HighlightGraph[Graph[{1 -> 2, 2 -> 3, 3 -> 1}], {1, 2}] ``` Highlight edges with style: ```wolfram HighlightGraph[CompleteGraph[5], {1 <-> 2, 2 <-> 3}, VertexLabels -> Automatic] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HighlightGraph.html) for more details. # HypercubeGraph `HypercubeGraph[n]` gives the n-dimensional hypercube graph Qₙ. Examples [#examples] 3D hypercube (cube): ```wolfram HypercubeGraph[3] ``` 4D hypercube (tesseract): ```wolfram HypercubeGraph[4] ``` Count vertices and edges: ```wolfram g = HypercubeGraph[5]; {VertexCount[g], EdgeCount[g]} (* {32, 80} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypercubeGraph.html) for more details. # IncidenceGraph `IncidenceGraph[m]` gives the graph with incidence matrix m. `IncidenceGraph[{v1,v2,…},m]` gives the graph with vertices vi and incidence matrix m. Examples [#examples] Create a graph from an incidence matrix: ```wolfram IncidenceGraph[{{1, 1, 0}, {1, 0, 1}, {0, 1, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IncidenceGraph.html) for more details. # IncidenceList `IncidenceList[g, v]` gives a list of edges incident to vertex v. * `IncidenceList[g, patt]` gives a list of edges incident to vertices that match the pattern patt. * `IncidenceList[g, patt, d]` gives a list of incident edges d steps away. * `IncidenceList[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram IncidenceList[Graph[{1 -> 2, 2 -> 3, 3 -> 1}], 2] ``` ```wolfram IncidenceList[CompleteGraph[4], 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IncidenceList.html) for more details. # IncidenceMatrix `IncidenceMatrix[g]` gives the vertex-edge incidence matrix of the graph g. * `IncidenceMatrix[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] Incidence matrix of a graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}]; IncidenceMatrix[g] ``` From edge rules: ```wolfram IncidenceMatrix[{a -> b, b -> c, c -> a}] ``` Undirected graph: ```wolfram IncidenceMatrix[CycleGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IncidenceMatrix.html) for more details. # IndependentEdgeSetQ `IndependentEdgeSetQ[g, elist]` yields `True` if the edge list elist is an independent edge set of the graph g, and `False` otherwise. Examples [#examples] ```wolfram IndependentEdgeSetQ[CompleteGraph[4], {1 <-> 2, 3 <-> 4}] ``` ```wolfram IndependentEdgeSetQ[CycleGraph[5], {1 <-> 2, 2 <-> 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndependentEdgeSetQ.html) for more details. # IndependentVertexSetQ `IndependentVertexSetQ[g, vlist]` yields `True` if the vertex list vlist is an independent vertex set in the graph g, and `False` otherwise. Examples [#examples] ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4}]; IndependentVertexSetQ[g, {1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndependentVertexSetQ.html) for more details. # IndexEdgeTaggedGraph `IndexEdgeTaggedGraph[g]` sets tags of edges in the graph g to their edge indices. `IndexEdgeTaggedGraph[g,r]` sets tags of edges to r, r+1, .... Examples [#examples] ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}]; IndexEdgeTaggedGraph[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndexEdgeTaggedGraph.html) for more details. # IndexGraph `IndexGraph[g]` replaces the vertices of the graph g by its vertex indices. * `IndexGraph[g, r]` replaces the vertices with integers r, r+1, .... * `IndexGraph[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Convert to indexed graph: ```wolfram IndexGraph[Graph[{a -> b, b -> c, c -> a}]] ``` Start from a different index: ```wolfram IndexGraph[graph, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndexGraph.html) for more details. # IsomorphicGraphQ `IsomorphicGraphQ[g1, g2]` yields `True` if graphs g1 and g2 are isomorphic, and `False` otherwise. Examples [#examples] Check isomorphism: ```wolfram IsomorphicGraphQ[CycleGraph[5], CycleGraph[5]] (* True *) ``` Non-isomorphic graphs: ```wolfram IsomorphicGraphQ[CycleGraph[4], PathGraph[Range[4]]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IsomorphicGraphQ.html) for more details. # IsomorphicSubgraphQ `IsomorphicSubgraphQ[g1, g2]` yields `True` if the graph g1 is isomorphic to a subgraph of the graph g2. This function tests for subgraph isomorphism. Examples [#examples] ```wolfram IsomorphicSubgraphQ[PathGraph[{1, 2, 3}], CompleteGraph[5]] ``` ```wolfram IsomorphicSubgraphQ[CycleGraph[3], PetersenGraph[]] ``` ```wolfram IsomorphicSubgraphQ[CompleteGraph[4], CompleteGraph[3]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IsomorphicSubgraphQ.html) for more details. # KCoreComponents `KCoreComponents[g,k]` gives the k-core components of the underlying simple graph of g. `KCoreComponents[g,k,"In"]` gives the k-core components with vertex in-degrees at least k. `KCoreComponents[g,k,"Out"]` gives the k-core components with vertex out-degrees at least k. `KCoreComponents[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram KCoreComponents[Graph[{1 -> 2, 2 -> 3, 3 -> 1}], 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KCoreComponents.html) for more details. # KEdgeConnectedComponents `KEdgeConnectedComponents[g, k]` gives the k-edge-connected components of the graph `g`. * `KEdgeConnectedComponents[g, k, {v1, v2, …}]` gives the k-edge-connected components that include at least one of the vertices `v1, v2, …`. * `KEdgeConnectedComponents[{v -> w, …}, …]` uses rules `v -> w` to specify the graph `g`. Examples [#examples] ```wolfram KEdgeConnectedComponents[RandomGraph[{10, 15}], 2] ``` ```wolfram KEdgeConnectedComponents[PetersenGraph[], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KEdgeConnectedComponents.html) for more details. # KEdgeConnectedGraphQ `KEdgeConnectedGraphQ[g,k]` yields True if the graph g is k-edge-connected and False otherwise. Examples [#examples] Check if a graph is 2-edge-connected: ```wolfram KEdgeConnectedGraphQ[CompleteGraph[5], 2] (* True *) ``` ```wolfram KEdgeConnectedGraphQ[PathGraph[{1, 2, 3}], 2] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KEdgeConnectedGraphQ.html) for more details. # KVertexConnectedComponents `KVertexConnectedComponents[g, k]` gives the k-vertex-connected components of the graph g. `KVertexConnectedComponents[g, k, {v1, v2, ...}]` gives the k-vertex-connected components that include at least one of the vertices v1, v2, …. Examples [#examples] ```wolfram KVertexConnectedComponents[PetersenGraph[], 2] ``` ```wolfram KVertexConnectedComponents[CompleteGraph[5], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KVertexConnectedComponents.html) for more details. # KVertexConnectedGraphQ `KVertexConnectedGraphQ[g, k]` yields `True` if the graph g is k-vertex-connected and `False` otherwise. Examples [#examples] Check if a graph is 2-vertex-connected: ```wolfram KVertexConnectedGraphQ[CompleteGraph[5], 2] (* True *) ``` ```wolfram KVertexConnectedGraphQ[PathGraph[{1, 2, 3}], 2] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KVertexConnectedGraphQ.html) for more details. # KaryTree `KaryTree[n]` gives a binary tree with `n` vertices. * `KaryTree[n, k]` gives a k-ary tree with `n` vertices. Examples [#examples] ```wolfram KaryTree[15] ``` ```wolfram KaryTree[31, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KaryTree.html) for more details. # KatzCentrality `KatzCentrality[g,α]` gives a list of Katz centralities for the vertices in the graph g and weight α. `KatzCentrality[g,α,β]` gives a list of Katz centralities using weight α and initial centralities β. `KatzCentrality[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Compute Katz centrality for a simple graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}]; KatzCentrality[g, 0.1] (* {1.11, 1.11, 1.11} *) ``` Use with a path graph: ```wolfram KatzCentrality[PathGraph[Range[5]], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KatzCentrality.html) for more details. # KirchhoffGraph `KirchhoffGraph[kmat]` gives the graph with Kirchhoff matrix `kmat`. * `KirchhoffGraph[{v1, v2, …}, kmat]` gives the graph with vertices `vi` and Kirchhoff matrix `kmat`. Examples [#examples] ```wolfram KirchhoffGraph[{{2, -1, -1}, {-1, 2, -1}, {-1, -1, 2}}] ``` ```wolfram KirchhoffGraph[KirchhoffMatrix[CompleteGraph[4]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KirchhoffGraph.html) for more details. # KnightTourGraph `KnightTourGraph[m, n]` gives a Knight's tour graph on an m×n chessboard. Examples [#examples] Knight tour graph on a 5×5 board: ```wolfram KnightTourGraph[5, 5] ``` Smaller board: ```wolfram KnightTourGraph[3, 4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KnightTourGraph.html) for more details. # LambdaComponents `LambdaComponents[g]` gives the lambda components of the graph g. * `LambdaComponents[g, {v1, v2, ...}]` gives the lambda components that include at least one of the vertices \{v1, v2, ...}. * `LambdaComponents[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram LambdaComponents[Graph[{1 -> 2, 2 -> 3, 3 -> 1}]] ``` ```wolfram LambdaComponents[PetersenGraph[5, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LambdaComponents.html) for more details. # LayeredGraph `LayeredGraph[g]` creates a graph with vertices and edges from the graph g represented as a layered plot. `LayeredGraph[{e1,e2,…}]` creates a graph with edges ej represented as a layered plot. `LayeredGraph[{…,w[ei],…}]` creates a graph with edges ei with features defined by the symbolic wrapper w. `LayeredGraph[…,v->pos]` places the dominant vertex v in the plot at position pos. Examples [#examples] Create a layered graph from edges: ```wolfram LayeredGraph[{1 -> 2, 2 -> 3, 1 -> 3}] ``` Create a layered graph from an existing graph: ```wolfram LayeredGraph[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LayeredGraph.html) for more details. # LayeredGraph3D `LayeredGraph3D[g]` creates a graph with vertices and edges from the graph `g` represented as a 3D layered plot. * `LayeredGraph3D[{e1, e2, …}]` creates a graph with edges `ej` represented as a 3D layered plot. * `LayeredGraph3D[{…, w[ei], …}]` creates a graph with edges `ei` with features defined by the symbolic wrapper `w`. * `LayeredGraph3D[…, v -> pos]` places the dominant vertex `v` in the plot at position `pos`. Examples [#examples] ```wolfram LayeredGraph3D[CompleteGraph[5]] ``` ```wolfram LayeredGraph3D[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LayeredGraph3D.html) for more details. # LocalClusteringCoefficient `LocalClusteringCoefficient[g]` gives the list of local clustering coefficients of all vertices in the graph g. * `LocalClusteringCoefficient[g, v]` gives the local clustering coefficient of the vertex v in the graph g. * `LocalClusteringCoefficient[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] All clustering coefficients: ```wolfram g = RandomGraph[{10, 20}]; LocalClusteringCoefficient[g] ``` For specific vertex: ```wolfram LocalClusteringCoefficient[g, 1] ``` Complete graph has coefficient 1: ```wolfram LocalClusteringCoefficient[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalClusteringCoefficient.html) for more details. # LoopFreeGraphQ `LoopFreeGraphQ[g]` yields True if the graph g has no self-loops, and False otherwise. Examples [#examples] Check if a graph has no self-loops: ```wolfram LoopFreeGraphQ[Graph[{1 -> 2, 2 -> 3}]] ``` A graph with a self-loop: ```wolfram LoopFreeGraphQ[Graph[{1 -> 1, 1 -> 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LoopFreeGraphQ.html) for more details. # LuccioSamiComponents `LuccioSamiComponents[g]` gives the Luccio–Sami components of the graph g. * `LuccioSamiComponents[g, {v1, v2, …}]` gives the components that include at least one of the vertices v1, v2, …. * `LuccioSamiComponents[{v -> w, …}, …]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1, 4 <-> 5}]; LuccioSamiComponents[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LuccioSamiComponents.html) for more details. # MatchingDissimilarity `MatchingDissimilarity[u, v]` gives the matching dissimilarity between Boolean vectors u and v. Examples [#examples] Compute matching dissimilarity: ```wolfram MatchingDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] (* 1/2 *) ``` Identical vectors: ```wolfram MatchingDissimilarity[{1, 1, 0}, {1, 1, 0}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatchingDissimilarity.html) for more details. # MixedGraphQ `MixedGraphQ[g]` yields True if the graph g is a mixed graph and False otherwise. Examples [#examples] Test a mixed graph with both directed and undirected edges: ```wolfram g = Graph[{1 <-> 2, 2 -> 3}]; MixedGraphQ[g] (* True *) ``` Test a purely undirected graph: ```wolfram MixedGraphQ[CompleteGraph[4]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MixedGraphQ.html) for more details. # MultigraphQ `MultigraphQ[g]` yields `True` if the graph g is a multigraph and `False` otherwise. Examples [#examples] ```wolfram MultigraphQ[Graph[{1 -> 2, 1 -> 2}]] ``` ```wolfram MultigraphQ[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultigraphQ.html) for more details. # NeighborhoodGraph `NeighborhoodGraph[g, v]` gives the graph neighborhood of a vertex v in the graph g. `NeighborhoodGraph[g, v, d]` gives the neighborhood up to distance d. Examples [#examples] Neighborhood of a vertex: ```wolfram NeighborhoodGraph[GridGraph[{5, 5}], 13] ``` Up to distance 2: ```wolfram NeighborhoodGraph[GridGraph[{5, 5}], 13, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NeighborhoodGraph.html) for more details. # PageRankCentrality `PageRankCentrality[g,α]` gives a list of page-rank centralities for the vertices in the graph g and weight α. `PageRankCentrality[g,α,β]` gives a list of page-rank centralities, using weight α and initial centralities β. `PageRankCentrality[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Compute page-rank centralities for a graph: ```wolfram g = RandomGraph[{10, 20}]; PageRankCentrality[g, 0.85] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PageRankCentrality.html) for more details. # PathGraph `PathGraph[{v1, v2, ...}]` creates a path graph connecting vertices in sequence. Examples [#examples] Create a path graph: ```wolfram PathGraph[{1, 2, 3, 4, 5}] (* Path: 1-2-3-4-5 *) ``` Named vertices: ```wolfram PathGraph[{"A", "B", "C", "D"}, VertexLabels -> "Name"] ``` Path length: ```wolfram EdgeCount[PathGraph[Range[10]]] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PathGraph.html) for more details. # PathGraphQ `PathGraphQ[g]` yields True if the graph g is a path and False otherwise. Examples [#examples] ```wolfram PathGraphQ[PathGraph[{1, 2, 3, 4}]] (* True *) ``` ```wolfram PathGraphQ[CycleGraph[4]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PathGraphQ.html) for more details. # PetersenGraph `PetersenGraph[n, k]` gives the generalized Petersen graph P(n, k). Examples [#examples] Classic Petersen graph: ```wolfram PetersenGraph[5, 2] ``` Different parameters: ```wolfram PetersenGraph[7, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PetersenGraph.html) for more details. # PlanarFaceList `PlanarFaceList[g]` gives the list of faces of the planar graph g. Examples [#examples] ```wolfram PlanarFaceList[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlanarFaceList.html) for more details. # PlanarGraph `PlanarGraph[{e1, e2, ...}]` yields a planar graph with edges ej. * `PlanarGraph[{v1, v2, ...}, {e1, e2, ...}]` yields a planar graph with vertices vi and edges ej. * `PlanarGraph[{..., wi[vi], ...}, {..., wj[ej], ...}]` yields a planar graph with vertex and edge properties defined by the symbolic wrappers wk. * `PlanarGraph[{vi -> vj, ...}]` uses rules vi -> vj to specify a planar graph. Examples [#examples] ```wolfram PlanarGraph[{1 <-> 2, 2 <-> 3, 3 <-> 1}] ``` ```wolfram PlanarGraph[{1 -> 2, 2 -> 3, 3 -> 4, 4 -> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlanarGraph.html) for more details. # PlanarGraphQ `PlanarGraphQ[g]` yields `True` if graph g can be drawn in a plane without edge crossings, and `False` otherwise. Examples [#examples] Test for planarity: ```wolfram PlanarGraphQ[CompleteGraph[4]] (* True - K4 is planar *) PlanarGraphQ[CompleteGraph[5]] (* False - K5 is not planar *) ``` Grid graphs are planar: ```wolfram PlanarGraphQ[GridGraph[{10, 10}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlanarGraphQ.html) for more details. # PriceGraphDistribution `PriceGraphDistribution[n, k, a]` represents a de Solla Price graph distribution for n-vertex graphs where a new vertex with k edges is added at each step, using attractiveness parameter a. Examples [#examples] ```wolfram RandomGraph[PriceGraphDistribution[100, 2, 1]] ``` ```wolfram PriceGraphDistribution[50, 3, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PriceGraphDistribution.html) for more details. # RadialityCentrality `RadialityCentrality[g]` gives a list of radiality centralities for the vertices in the graph g. `RadialityCentrality[g,"In"]` gives a list of in-centralities for a directed graph g. `RadialityCentrality[g,"Out"]` gives a list of out-centralities for a directed graph g. `RadialityCentrality[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Compute radiality centrality for a graph: ```wolfram RadialityCentrality[CycleGraph[5]] (* {3/4, 3/4, 3/4, 3/4, 3/4} *) ``` Radiality centrality for a star graph: ```wolfram RadialityCentrality[StarGraph[5]] (* {1, 5/8, 5/8, 5/8, 5/8} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RadialityCentrality.html) for more details. # RandomGraph `RandomGraph[{n,m}]` gives a pseudorandom graph with n vertices and m edges. `RandomGraph[{n,m},k]` gives a list of k pseudorandom graphs. `RandomGraph[gdist,…]` samples from the random graph distribution gdist. Examples [#examples] Create a random graph with 10 vertices and 15 edges: ```wolfram RandomGraph[{10, 15}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomGraph.html) for more details. # RandomTree `RandomTree[n]` gives a pseudorandom tree with n nodes. * `RandomTree[n, k]` gives a list of k pseudorandom trees. * `RandomTree[n, {k1, k2, ...}]` gives a k1×k2×... array of trees. Examples [#examples] Generate a random tree with 10 nodes: ```wolfram RandomTree[10] ``` Create multiple random trees: ```wolfram RandomTree[5, 3] ``` Generate a random tree with a specific distribution: ```wolfram RandomTree[12, TreeLayout -> "RadialEmbedding"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomTree.html) for more details. # ShortestPathFunction `ShortestPathFunction[type, data]` represents a function that gives the shortest path from a source vertex s to target vertex t in a graph. Examples [#examples] Find shortest paths from a single source: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 1 -> 3, 3 -> 4}]; spf = FindShortestPath[g, 1, All] ``` Get path to a specific target: ```wolfram spf[4] (* {1, 3, 4} *) ``` Use with weighted graphs: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 1 -> 3}, EdgeWeight -> {1, 1, 5}]; spf = FindShortestPath[g, 1, All]; spf[3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShortestPathFunction.html) for more details. # SimpleGraph `SimpleGraph[g]` gives the underlying simple graph from the graph g. `SimpleGraph[{v->w,…}]` uses rules v->w to specify the graph g. Examples [#examples] Get the simple graph from a multigraph: ```wolfram SimpleGraph[Graph[{1 -> 2, 1 -> 2, 2 -> 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SimpleGraph.html) for more details. # SimpleGraphQ `SimpleGraphQ[g]` yields `True` if the graph g is a simple graph and `False` otherwise. Examples [#examples] Check if a graph is simple: ```wolfram SimpleGraphQ[Graph[{1 -> 2, 2 -> 3}]] (* True *) ``` A multigraph is not simple: ```wolfram SimpleGraphQ[Graph[{1 -> 2, 1 -> 2}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SimpleGraphQ.html) for more details. # StarGraph `StarGraph[n]` gives the star graph with n vertices. Examples [#examples] Create a star graph: ```wolfram StarGraph[5] ``` With styling: ```wolfram StarGraph[7, VertexLabels -> Automatic] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StarGraph.html) for more details. # StatusCentrality `StatusCentrality[g]` gives a list of status centralities for the vertices in the graph g. * `StatusCentrality[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}]; StatusCentrality[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StatusCentrality.html) for more details. # Subgraph `Subgraph[g, {v1, v2, ...}]` gives the subgraph of the graph g generated by the vertices vi. `Subgraph[g, {e1, e2, ...}]` gives the subgraph generated by the edges ej. `Subgraph[g, patt]` gives the subgraph generated by the vertices and edges that match the pattern patt. Examples [#examples] Extract a subgraph: ```wolfram g = CompleteGraph[5]; Subgraph[g, {1, 2, 3}] ``` Subgraph by edges: ```wolfram Subgraph[CycleGraph[6], {1 <-> 2, 2 <-> 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subgraph.html) for more details. # TopologicalSort `TopologicalSort[g]` gives a list of vertices of g in topologically sorted order for a directed acyclic graph g. * `TopologicalSort[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram TopologicalSort[Graph[{1 -> 2, 2 -> 3, 1 -> 3}]] ``` ```wolfram TopologicalSort[{a -> b, b -> c, a -> c}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TopologicalSort.html) for more details. # TuranGraph `TuranGraph[n, k]` gives the k-partite Turán graph with n vertices T(n,k). Examples [#examples] Create a Turán graph: ```wolfram TuranGraph[6, 3] ``` Visualize: ```wolfram Graph[TuranGraph[8, 4]] ``` Edge count: ```wolfram EdgeCount[TuranGraph[10, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TuranGraph.html) for more details. # TuttePolynomial `TuttePolynomial[g, {x, y}]` gives the Tutte polynomial of the graph g. * `TuttePolynomial[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram TuttePolynomial[CompleteGraph[4], {x, y}] ``` ```wolfram TuttePolynomial[CycleGraph[5], {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TuttePolynomial.html) for more details. # UndirectedGraph `UndirectedGraph[g]` gives an undirected graph from the directed graph g. * `UndirectedGraph[{v -> w, ...}]` uses rules `v -> w` to specify the graph g. This function converts a directed graph to an undirected graph by removing edge direction. Examples [#examples] ```wolfram UndirectedGraph[Graph[{1 -> 2, 2 -> 3, 3 -> 1}]] ``` ```wolfram UndirectedGraph[{a -> b, b -> c, c -> d}] ``` ```wolfram g = DirectedGraph[CycleGraph[5]]; UndirectedGraph[g] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UndirectedGraph.html) for more details. # UndirectedGraphQ `UndirectedGraphQ[g]` yields `True` if the graph g is an undirected graph and `False` otherwise. Examples [#examples] Check if a graph is undirected: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3}]; UndirectedGraphQ[g] (* True *) ``` Directed graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3}]; UndirectedGraphQ[g] (* False *) ``` Convert and check: ```wolfram UndirectedGraphQ[UndirectedGraph[{1 -> 2, 2 -> 3}]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UndirectedGraphQ.html) for more details. # UnlabeledTree `UnlabeledTree[tree]` returns a tree of the same shape as tree in which the nodes and edges are displayed without labels. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], e}]; UnlabeledTree[tree] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnlabeledTree.html) for more details. # VertexAdd `VertexAdd[g, v]` makes a graph by adding the vertex v to the graph g. * `VertexAdd[g, {v1, v2, ...}]` adds a collection of vertices to g. * `VertexAdd[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram VertexAdd[Graph[{1 -> 2, 2 -> 3}], 4] ``` ```wolfram VertexAdd[CycleGraph[4], {5, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexAdd.html) for more details. # VertexChromaticNumber `VertexChromaticNumber[g]` gives the chromatic number for the vertices of the graph g. Examples [#examples] ```wolfram VertexChromaticNumber[PetersenGraph[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexChromaticNumber.html) for more details. # VertexComponent `VertexComponent[g,{v1,v2,…}]` gives the vertices in the graph g that have a path to at least one of v1, v2, …. `VertexComponent[g,{v1,v2,…},k]` gives the vertices with a path to at least one of v1, v2, … of at most length k. `VertexComponent[g,{v1,v2,…},{k}]` gives the vertices at length exactly k. `VertexComponent[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram VertexComponent[Graph[{1 -> 2, 2 -> 3, 3 -> 4}], {1}] (* {1, 2, 3, 4} *) ``` ```wolfram VertexComponent[Graph[{1 -> 2, 2 -> 3, 3 -> 4}], {1}, 2] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexComponent.html) for more details. # VertexConnectivity `VertexConnectivity[g]` gives the vertex connectivity of the graph g. * `VertexConnectivity[g, s, t]` gives the s-t vertex connectivity of the graph g. * `VertexConnectivity[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Find vertex connectivity of a graph: ```wolfram g = CompleteGraph[5]; VertexConnectivity[g] (* 4 *) ``` Connectivity between specific vertices: ```wolfram VertexConnectivity[g, 1, 3] ``` Using edge rules: ```wolfram VertexConnectivity[{1 -> 2, 2 -> 3, 3 -> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexConnectivity.html) for more details. # VertexContract `VertexContract[g,{v1,v2,…}]` contracts a collection of vertices v1, v2, … into a single vertex of the graph g. `VertexContract[g,{{v1,v2,…},…}]` contracts several collections of vertices. `VertexContract[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Contract two vertices in a graph: ```wolfram VertexContract[CompleteGraph[5], {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexContract.html) for more details. # VertexCorrelationSimilarity `VertexCorrelationSimilarity[g, u, v]` gives the correlation similarity between vertices u and v of the graph g. * `VertexCorrelationSimilarity[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram VertexCorrelationSimilarity[CompleteGraph[5], 1, 2] ``` ```wolfram VertexCorrelationSimilarity[CycleGraph[6], 1, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexCorrelationSimilarity.html) for more details. # VertexCosineSimilarity `VertexCosineSimilarity[g, u, v]` gives the cosine similarity between vertices u and v of the graph g. * `VertexCosineSimilarity[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Calculate cosine similarity between two vertices: ```wolfram g = Graph[{1 -> 2, 1 -> 3, 2 -> 3, 2 -> 4, 3 -> 4}]; VertexCosineSimilarity[g, 1, 2] ``` Compare different vertex pairs: ```wolfram VertexCosineSimilarity[g, 2, 3] ``` Using edge rules directly: ```wolfram VertexCosineSimilarity[{1 -> 2, 1 -> 3, 2 -> 3}, 1, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexCosineSimilarity.html) for more details. # VertexCount `VertexCount[g]` gives the number of vertices in graph g. `VertexCount[g, patt]` counts vertices matching the pattern. Examples [#examples] Count vertices: ```wolfram VertexCount[CompleteGraph[10]] (* 10 *) VertexCount[GridGraph[{5, 5}]] (* 25 *) ``` Count matching pattern: ```wolfram g = Graph[{1, 2, 3, "a", "b"}, {1 <-> 2}] VertexCount[g, _Integer] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexCount.html) for more details. # VertexCoverQ `VertexCoverQ[g, vlist]` yields True if the vertex list vlist is a vertex cover of the graph g, and False otherwise. Examples [#examples] Check if vertices form a cover: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}]; VertexCoverQ[g, {1, 2}] ``` Not a cover: ```wolfram VertexCoverQ[g, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexCoverQ.html) for more details. # VertexDegree `VertexDegree[g]` gives the list of vertex degrees for all vertices in graph g. `VertexDegree[g, v]` gives the degree for vertex v. Examples [#examples] Get all vertex degrees: ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 1, 1 <-> 4}] VertexDegree[g] (* {3, 2, 2, 1} *) ``` Degree of a specific vertex: ```wolfram VertexDegree[g, 1] (* 3 *) ``` Complete graph degrees: ```wolfram VertexDegree[CompleteGraph[5]] (* {4, 4, 4, 4, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexDegree.html) for more details. # VertexDelete `VertexDelete[g, v]` makes a graph by deleting the vertex v and all edges connected to v from the graph g. * `VertexDelete[g, {v1, v2, ...}]` deletes a collection of vertices from g. * `VertexDelete[g, patt]` deletes all vertices that match the pattern patt. * `VertexDelete[{v -> w, ...}, ...]` uses rules to specify the graph g. Examples [#examples] ```wolfram VertexDelete[CompleteGraph[5], 1] ``` ```wolfram VertexDelete[graph, {1, 2, 3}] ``` ```wolfram VertexDelete[g, _?OddQ] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexDelete.html) for more details. # VertexDiceSimilarity `VertexDiceSimilarity[g, u, v]` gives the Dice similarity between vertices u and v of the graph g. * `VertexDiceSimilarity[{v -> w, ...}, ...]` uses rules `v -> w` to specify the graph g. The Dice similarity measures the overlap between the neighborhoods of two vertices. Examples [#examples] ```wolfram g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 1 <-> 3}]; VertexDiceSimilarity[g, 1, 3] ``` ```wolfram VertexDiceSimilarity[CompleteGraph[5], 1, 2] ``` ```wolfram VertexDiceSimilarity[{1 -> 2, 2 -> 3, 1 -> 3}, 1, 2] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexDiceSimilarity.html) for more details. # VertexEccentricity `VertexEccentricity[g, s]` gives the length of the longest shortest path from the source s to every other vertex in the graph g. * `VertexEccentricity[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = CompleteGraph[5]; VertexEccentricity[g, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexEccentricity.html) for more details. # VertexInComponent `VertexInComponent[g, {v1, v2, ...}, k]` gives the vertices with a directed path to at least one of v1, v2, … of at most length k. * `VertexInComponent[g, {v1, v2, ...}, {k}]` gives the vertices at length exactly k. * `VertexInComponent[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram VertexInComponent[Graph[{1 -> 2, 2 -> 3, 3 -> 4}], {4}, 2] ``` ```wolfram VertexInComponent[Graph[{a -> b, b -> c, a -> c}], {c}, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexInComponent.html) for more details. # VertexInComponentGraph `VertexInComponentGraph[g, {v1, v2, ...}]` gives the subgraph of the graph g generated by the vertices that have a directed path to at least one of v1, v2, .... `VertexInComponentGraph[g, {v1, v2, ...}, k]` gives the subgraph of g generated by vertices with a directed path of at most length k to at least one of v1, v2, .... `VertexInComponentGraph[g, {v1, v2, ...}, {k}]` gives the subgraph of g generated by vertices of length exactly k. `VertexInComponentGraph[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Find the in-component subgraph: ```wolfram VertexInComponentGraph[Graph[{1 -> 2, 2 -> 3, 3 -> 4}], {4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexInComponentGraph.html) for more details. # VertexInDegree `VertexInDegree[g]` gives the list of vertex in-degrees for all vertices in the graph g. * `VertexInDegree[g, v]` gives the vertex in-degree for the vertex v. * `VertexInDegree[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram VertexInDegree[Graph[{1 -> 2, 2 -> 3, 1 -> 3}]] ``` ```wolfram VertexInDegree[Graph[{a -> b, b -> c, c -> a}], b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexInDegree.html) for more details. # VertexIndex `VertexIndex[g,v]` gives the integer index for the vertex v in the graph g. `VertexIndex[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Get the index of a vertex: ```wolfram g = Graph[{a -> b, b -> c, c -> a}]; VertexIndex[g, b] (* 2 *) ``` Using edge rules directly: ```wolfram VertexIndex[{1 -> 2, 2 -> 3}, 3] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexIndex.html) for more details. # VertexJaccardSimilarity `VertexJaccardSimilarity[g,u,v]` gives the Jaccard similarity between vertices u and v of the graph g. `VertexJaccardSimilarity[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] Compute Jaccard similarity between two vertices: ```wolfram g = Graph[{1 -> 2, 1 -> 3, 2 -> 3, 2 -> 4, 3 -> 4}]; VertexJaccardSimilarity[g, 1, 4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexJaccardSimilarity.html) for more details. # VertexList `VertexList[g]` gives the list of vertices in graph `g`. Examples [#examples] Get vertices from a graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 1}] VertexList[g] (* {1, 2, 3} *) VertexList[CompleteGraph[5]] (* {1, 2, 3, 4, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexList.html) for more details. # VertexOutComponent `VertexOutComponent[g, {v1, v2, ...}]` gives the vertices in the graph g that have a directed path from at least one of v1, v2, .... * `VertexOutComponent[g, {v1, v2, ...}, k]` gives the vertices with a directed path from at least one of v1, v2, ... of at most length k. * `VertexOutComponent[g, {v1, v2, ...}, {k}]` gives the vertices at length exactly k. * `VertexOutComponent[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Find vertices reachable from a vertex: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 1 -> 4}]; VertexOutComponent[g, {1}] (* {1, 2, 3, 4} *) ``` Limit search depth: ```wolfram VertexOutComponent[g, {1}, 1] (* {1, 2, 4} *) ``` Vertices at exact distance: ```wolfram VertexOutComponent[g, {1}, {2}] (* {3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexOutComponent.html) for more details. # VertexOutComponentGraph `VertexOutComponentGraph[g, {v1, v2, ...}]` gives the subgraph of the graph g generated by the vertices that have a directed path from at least one of v1, v2, .... `VertexOutComponentGraph[g, {v1, v2, ...}, k]` gives the subgraph of g generated by vertices with a directed path of at most length k from at least one of v1, v2, .... `VertexOutComponentGraph[g, {v1, v2, ...}, {k}]` gives the subgraph of g generated by vertices of length exactly k. `VertexOutComponentGraph[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] ```wolfram g = Graph[{1 -> 2, 2 -> 3, 3 -> 4, 1 -> 5}]; VertexOutComponentGraph[g, {1}] ``` ```wolfram VertexOutComponentGraph[g, {1}, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexOutComponentGraph.html) for more details. # VertexOutDegree `VertexOutDegree[g]` gives the list of vertex out-degrees for all vertices in the graph g. `VertexOutDegree[g, v]` gives the vertex out-degree for the vertex v. `VertexOutDegree[{v -> w, ...}, ...]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram VertexOutDegree[Graph[{1 -> 2, 2 -> 3, 1 -> 3}]] (* {2, 1, 0} *) ``` ```wolfram VertexOutDegree[Graph[{1 -> 2, 2 -> 3}], 1] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexOutDegree.html) for more details. # VertexQ `VertexQ[g, v]` yields `True` if v is a vertex in the graph g and `False` otherwise. Examples [#examples] Check if a vertex exists in a graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3}]; VertexQ[g, 2] (* True *) ``` Non-existent vertex: ```wolfram VertexQ[g, 5] (* False *) ``` With named vertices: ```wolfram g = Graph[{"a" -> "b", "b" -> "c"}]; VertexQ[g, "a"] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexQ.html) for more details. # VertexReplace `VertexReplace[g, {v1 -> w1, v2 -> w2, ...}]` replaces each vertex vi in the graph g by wi. * `VertexReplace[{v -> w, ...}, ...]` uses rules `v -> w` to specify the graph g. This function renames vertices in a graph. Examples [#examples] ```wolfram g = Graph[{1 -> 2, 2 -> 3}]; VertexReplace[g, {1 -> a, 2 -> b, 3 -> c}] ``` ```wolfram VertexReplace[CycleGraph[4], {1 -> "A", 2 -> "B", 3 -> "C", 4 -> "D"}] ``` ```wolfram VertexReplace[{1 -> 2, 2 -> 3}, {1 -> x, 3 -> z}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexReplace.html) for more details. # VertexTransitiveGraphQ `VertexTransitiveGraphQ[g]` yields `True` if the graph g is a vertex-transitive graph and `False` otherwise. A vertex-transitive graph is one where all vertices are equivalent under the graph's automorphism group. Examples [#examples] ```wolfram VertexTransitiveGraphQ[CompleteGraph[5]] ``` ```wolfram VertexTransitiveGraphQ[CycleGraph[6]] ``` ```wolfram VertexTransitiveGraphQ[PathGraph[{1, 2, 3}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexTransitiveGraphQ.html) for more details. # VertexWeightedGraphQ `VertexWeightedGraphQ[g]` yields `True` if the graph g is a vertex-weighted graph, and `False` otherwise. Examples [#examples] ```wolfram VertexWeightedGraphQ[Graph[{1 -> 2}, VertexWeight -> {1 -> 5}]] ``` ```wolfram VertexWeightedGraphQ[Graph[{a -> b, b -> c}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VertexWeightedGraphQ.html) for more details. # WattsStrogatzGraphDistribution `WattsStrogatzGraphDistribution[n, p]` represents the Watts–Strogatz graph distribution for n-vertex graphs with rewiring probability p. * `WattsStrogatzGraphDistribution[n, p, k]` represents the Watts–Strogatz graph distribution for n-vertex graphs with rewiring probability p starting from a 2k-regular graph. Examples [#examples] ```wolfram RandomGraph[WattsStrogatzGraphDistribution[20, 0.1]] ``` ```wolfram RandomGraph[WattsStrogatzGraphDistribution[50, 0.3, 3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WattsStrogatzGraphDistribution.html) for more details. # WeaklyConnectedComponents `WeaklyConnectedComponents[g]` gives the weakly connected components of the graph g. `WeaklyConnectedComponents[g, {v1, v2, ...}]` gives the weakly connected components that include at least one of the specified vertices. Examples [#examples] Find weakly connected components: ```wolfram g = Graph[{1 -> 2, 2 -> 3, 4 -> 5}]; WeaklyConnectedComponents[g] (* {{1, 2, 3}, {4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeaklyConnectedComponents.html) for more details. # WeaklyConnectedGraphComponents `WeaklyConnectedGraphComponents[g]` gives the weakly connected components of the graph g. * `WeaklyConnectedGraphComponents[g, {v1, v2, ...}]` gives the weakly connected components that include at least one of the vertices v1, v2, .... * `WeaklyConnectedGraphComponents[g, patt]` gives the connected components that include a vertex that matches the pattern patt. * `WeaklyConnectedGraphComponents[{v -> w, ...}, ...]` uses rules v -> w to specify the graph g. Examples [#examples] Find weakly connected components: ```wolfram WeaklyConnectedGraphComponents[Graph[{1 -> 2, 3 -> 4}]] ``` Components containing specific vertex: ```wolfram WeaklyConnectedGraphComponents[graph, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeaklyConnectedGraphComponents.html) for more details. # WeaklyConnectedGraphQ `WeaklyConnectedGraphQ[g]` yields True if the graph g is weakly connected, and False otherwise. Examples [#examples] Test if a graph is weakly connected: ```wolfram g = Graph[{1 -> 2, 2 -> 3}]; WeaklyConnectedGraphQ[g] (* True *) ``` Disconnected graph: ```wolfram WeaklyConnectedGraphQ[Graph[{1 -> 2, 3 -> 4}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeaklyConnectedGraphQ.html) for more details. # WeightedAdjacencyGraph `WeightedAdjacencyGraph[wmat]` gives the graph with weighted adjacency matrix wmat. * `WeightedAdjacencyGraph[{v1, v2, ...}, wmat]` gives the graph with vertices vi and weighted adjacency matrix wmat. Examples [#examples] Create a weighted graph from a matrix: ```wolfram WeightedAdjacencyGraph[{{0, 1, 2}, {1, 0, 3}, {2, 3, 0}}] ``` With named vertices: ```wolfram WeightedAdjacencyGraph[{"A", "B", "C"}, {{0, 5, 0}, {5, 0, 3}, {0, 3, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeightedAdjacencyGraph.html) for more details. # WeightedGraphQ `WeightedGraphQ[g]` yields True if the graph g is a weighted graph and False otherwise. Examples [#examples] Check if graph is weighted: ```wolfram WeightedGraphQ[Graph[{1 -> 2, 2 -> 3}, EdgeWeight -> {1, 2}]] ``` Unweighted graph: ```wolfram WeightedGraphQ[Graph[{1 -> 2, 2 -> 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeightedGraphQ.html) for more details. # WheelGraph `WheelGraph[n]` gives the wheel graph with n vertices Wn. Examples [#examples] Create a wheel graph: ```wolfram WheelGraph[6] ``` With vertex labels: ```wolfram WheelGraph[5, VertexLabels -> "Name"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WheelGraph.html) for more details. # AlphaChannel `AlphaChannel[color]` returns the opacity of color. `AlphaChannel[image]` returns the alpha channel of image. `AlphaChannel[video]` returns a video containing the alpha channel of the frames in video. Examples [#examples] Get the opacity of a color: ```wolfram AlphaChannel[RGBColor[1, 0, 0, 0.5]] (* 0.5 *) ``` Extract alpha channel from an image: ```wolfram AlphaChannel[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlphaChannel.html) for more details. # AnimatedImage Represents a collection of [Image](../Image/Image) merged into an animation ```wolfram AnimatedImage[{__Image}, opts___] ``` ```wolfram AnimatedImage[File[_String], opts___] ``` Options [#options] FrameRate [#framerate] By the default is `12` Constructor [#constructor] From GIF animation [#from-gif-animation] Import `.gif` as usual and supply to `AnimatedImage` as a list ```wolfram AnimatedImage[File["yourGif.gif"], FrameRate->24] ``` From images [#from-images] Generate raster images ```wolfram t = Table[ With[{h = h}, LinearGradientImage[Hue[# + h, .5] &, 50]], {h, 0, 1, .1}]; AnimatedImage[t, FrameRate->24] ``` or from imported GIF ```wolfram AnimatedImage[Import["anim.gif"], FrameRate->30] ``` Another example ```wolfram AnimatedImage[Rasterize[Style[#, 40]] & /@ Range[0, 9], FrameRate -> 6] ``` From Animate [#from-animate] You can wrap [Animate](../GUI/Animate), [AnimatePlot](../Plotting-Functions/AnimatePlot), [AnimateParametericPlot](../Plotting-Functions/AnimateParametericPlot) expressions with `AnimatedImage` to rasterize them into the series of images: ```wolfram AnimatedImage[AnimatePlot[Sinc[x z], {x,0,4Pi}, {z,1,5}], FrameRate->60] ``` where it is extended with options alike [Rasterize](../Image/Rasterize) Options [#options-1] * `FrameRate` playback speed (does not affect rasterization) * `"Window"` by the default is [CurrentWindow](../Frontend-IO/CurrentWindow) * `"ExposureTime"` sets waiting time before each frame is captured. By the default it is `Automatic` and the actual values is taken from the animation rate of the widget * `"Asynchronous"` sets async rasterization mode, where the constructor returns `Promise` immediately. By the default is `False`. Exporting [#exporting] You can export `AnimatedImage` as GIF using file, `ByteArray` or a string as a container: ```wolfram Export["anim.gif", AnimatedImage[...]] ``` ```wolfram ExportByteArray[AnimatedImage[...], "GIF"] ``` ```wolfram ExportString[AnimatedImage[...], {"Base64", "GIF"}] ``` Also [Video](../Video/Video) object can be directly derived from [AnimatedImage](../Image/AnimatedImage): ```wolfram Video[AnimatedImage[...]] ``` Output forms [#output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # BarcodeImage `BarcodeImage["string"]` generates a barcode image of "string" in the "QR" format. `BarcodeImage["string",format]` generates a barcode image of "string" in the specified format. `BarcodeImage["string",format,size]` attempts to generate a barcode image of the specified size. Examples [#examples] Generate a QR code: ```wolfram BarcodeImage["Hello World"] ``` Generate a barcode in a specific format: ```wolfram BarcodeImage["12345", "EAN13"] ``` Specify size: ```wolfram BarcodeImage["Test", "QR", 200] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarcodeImage.html) for more details. # BarcodeRecognize `BarcodeRecognize[image]` recognizes a barcode in image and returns it as a string. `BarcodeRecognize[image, "prop"]` returns the specified property of the barcode. `BarcodeRecognize[image, "prop", format]` recognizes barcodes of the specified format only. Examples [#examples] Recognize a barcode: ```wolfram BarcodeRecognize[barcodeImage] (* "1234567890" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarcodeRecognize.html) for more details. # BilateralFilter `BilateralFilter[data, σ, μ]` applies a bilateral filter of spatial spread σ and pixel value spread μ to data. Examples [#examples] Apply bilateral filter to an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; BilateralFilter[img, 2, 0.1] ``` Noise reduction while preserving edges: ```wolfram noisy = ImageAdd[img, RandomImage[{-0.2, 0.2}]]; BilateralFilter[noisy, 3, 0.15] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BilateralFilter.html) for more details. # Binarize `Binarize[image]` creates a binary image from image by replacing all values above a globally determined threshold with 1 and others with 0. `Binarize[image, t]` creates a binary image by replacing all values above t with 1 and others with 0. `Binarize[image, {t1, t2}]` creates a binary image by replacing all values in the range t1 through t2 with 1 and others with 0. `Binarize[image, f]` creates a binary image by replacing all channel value lists for which f\[v] yields True with 1 and others with 0. Examples [#examples] Binarize an image with automatic threshold: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Binarize[img] ``` Binarize with a specific threshold: ```wolfram Binarize[img, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Binarize.html) for more details. # Blur `Blur[image]` gives a blurred version of image. `Blur[image, r]` gives a version of image blurred over pixel radius r. Examples [#examples] Apply blur to an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Blur[img] ``` Stronger blur: ```wolfram Blur[img, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Blur.html) for more details. # BottomHatTransform `BottomHatTransform[image, ker]` gives the morphological bottom-hat transform of image with respect to structuring element ker. `BottomHatTransform[image, r]` gives the bottom-hat transform with respect to a range-r square. `BottomHatTransform[data, ...]` applies a bottom-hat transform to an array of data. Examples [#examples] Apply bottom-hat transform: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; BottomHatTransform[img, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BottomHatTransform.html) for more details. # BrightnessEqualize `BrightnessEqualize[image]` adjusts the brightness across image, correcting uneven illumination. `BrightnessEqualize[image, flatfield]` uses the correction model given by flatfield. `BrightnessEqualize[image, flatfield, darkfield]` uses the dark environment model given by darkfield. Examples [#examples] Equalize brightness: ```wolfram BrightnessEqualize[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BrightnessEqualize.html) for more details. # ChanVeseBinarize `ChanVeseBinarize[image]` finds a two-level segmentation of image by computing optimal contours around regions of consistent intensity in image. `ChanVeseBinarize[image, marker]` uses marker to create an initial contour. `ChanVeseBinarize[image, marker, {μ, ν, λ1, λ2}]` specifies the Chan–Vese weights. Examples [#examples] Binarize an image using Chan-Vese method: ```wolfram ChanVeseBinarize[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChanVeseBinarize.html) for more details. # ChromaticityPlot `ChromaticityPlot[colspace]` plots a 2D slice of the color space colspace. `ChromaticityPlot[color]` plots the specific color. `ChromaticityPlot[{col1, col2, ...}]` plots multiple colors and color spaces. Examples [#examples] Plot the sRGB color space: ```wolfram ChromaticityPlot["sRGB"] ``` Plot specific colors: ```wolfram ChromaticityPlot[{Red, Green, Blue}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChromaticityPlot.html) for more details. # Closing `Closing[image, ker]` gives the morphological closing of image with respect to the structuring element ker. `Closing[image, r]` gives the closing with respect to a range-r square. `Closing[data, ...]` applies closing to an array of data. Examples [#examples] Apply morphological closing to an image: ```wolfram Closing[img, 3] ``` With a custom structuring element: ```wolfram Closing[img, DiskMatrix[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Closing.html) for more details. # ColorBalance `ColorBalance[image]` adjusts the colors in image to achieve a balance simulating neutral lighting. `ColorBalance[image, ref]` adjusts colors so the reference color ref is mapped to white. `ColorBalance[image, ref -> target]` maps the reference color ref to target. Examples [#examples] Auto-balance an image: ```wolfram ColorBalance[img] ``` Map a specific color to white: ```wolfram ColorBalance[img, Yellow] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorBalance.html) for more details. # ColorCombine `ColorCombine[{image1,image2,…}]` creates a multichannel image by combining the sequence of channels in the imagei. `ColorCombine[{image1,image2,…},colorspace]` combines images that represent the color components specified by colorspace. Examples [#examples] Combine RGB channels: ```wolfram ColorCombine[{redChannel, greenChannel, blueChannel}, "RGB"] ``` Create an image from separate color channels: ```wolfram r = Image[RandomReal[1, {100, 100}]]; g = Image[RandomReal[1, {100, 100}]]; b = Image[RandomReal[1, {100, 100}]]; ColorCombine[{r, g, b}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorCombine.html) for more details. # ColorDetect `ColorDetect[image, cspec]` returns a mask image representing regions in image with colors within the specified color region. Examples [#examples] Detect red regions in an image: ```wolfram ColorDetect[img, Red] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorDetect.html) for more details. # ColorDistance `ColorDistance[c1, c2]` gives the approximate perceptual distance between color directives c1 and c2. `ColorDistance[list, c]` gives color distances between elements of list and c. `ColorDistance[image, c]` gives an image whose pixel values are color distances from pixels to color c. Examples [#examples] Distance between two colors: ```wolfram ColorDistance[Red, Orange] (* 0.344315 *) ``` Distance between Red and Blue: ```wolfram ColorDistance[Red, Blue] (* 0.764716 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorDistance.html) for more details. # ColorQ `ColorQ[color]` yields True if color is a valid color directive and False otherwise. Examples [#examples] Check valid colors: ```wolfram ColorQ[Red] (* True *) ``` ```wolfram ColorQ[RGBColor[0.5, 0.2, 0.8]] (* True *) ``` Invalid color: ```wolfram ColorQ["notacolor"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorQ.html) for more details. # ColorQuantize `ColorQuantize[image]` gives an approximation to image by quantizing to distinct colors. `ColorQuantize[image, n]` uses at most n distinct colors. `ColorQuantize[image, {col1, ..., coln}]` represents an image using only the specified colors. Examples [#examples] Quantize to 8 colors: ```wolfram ColorQuantize[img, 8] ``` Quantize to specific palette: ```wolfram ColorQuantize[img, {Red, Green, Blue, White, Black}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorQuantize.html) for more details. # ColorReplace `ColorReplace[image, color]` finds regions in image whose pixel values are similar to color and replaces them with transparent pixels. `ColorReplace[image, color -> replacement]` replaces all pixels with the specified replacement color. `ColorReplace[image, color -> replacement, d]` replaces pixels within distance d from color. Examples [#examples] Replace white with transparent: ```wolfram ColorReplace[img, White] ``` Replace blue with red: ```wolfram ColorReplace[img, Blue -> Red] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorReplace.html) for more details. # ColorSeparate `ColorSeparate[image]` gives a list of single-channel images corresponding to each of the color channels in image. `ColorSeparate[image, colorspace]` gives a list of images corresponding to the components of colorspace. `ColorSeparate[image, channel]` returns a single-channel image containing the specified channel. Examples [#examples] Separate RGB channels: ```wolfram {r, g, b} = ColorSeparate[img] ``` Get the red channel: ```wolfram ColorSeparate[img, "R"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorSeparate.html) for more details. # Colorize `Colorize[m]` generates an image from an integer matrix m, using colors for positive integers and black for non-positive integers. `Colorize[image]` replaces intensity values in image with pseudocolor values. Examples [#examples] Colorize a label matrix: ```wolfram Colorize[{{1, 1, 2}, {1, 2, 2}, {3, 3, 3}}] ``` Colorize a grayscale image: ```wolfram Colorize[Image[RandomReal[1, {50, 50}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Colorize.html) for more details. # ColorsNear `ColorsNear[color]` represents a region around color. `ColorsNear[color, d]` represents a region with maximum distance d around color. `ColorsNear[color, d, dfun]` uses the specified color distance function dfun. Examples [#examples] ```wolfram ColorsNear[Red, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ColorsNear.html) for more details. # ComponentMeasurements `ComponentMeasurements[{image,lmat},"prop"]` computes the property "prop" for components of image indicated by the label matrix lmat. `ComponentMeasurements[image,"prop"]` computes the property "prop" for connected components of image. `ComponentMeasurements[…,"prop",crit]` only returns measurements for components that satisfy the criterion crit. `ComponentMeasurements[…,"prop",crit,format]` formats the result according to the output specification format. Examples [#examples] ```wolfram ComponentMeasurements[Binarize[img], "Area"] (* {1 -> 245, 2 -> 132, ...} *) ``` ```wolfram ComponentMeasurements[img, {"Centroid", "BoundingBox"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComponentMeasurements.html) for more details. # ConstantImage `ConstantImage[val, size]` gives an image of the specified size with constant pixel values of val. `ConstantImage[val, size, "type"]` gives an image converted to the specified type. Examples [#examples] Create a red image: ```wolfram ConstantImage[Red, {100, 100}] ``` Create a grayscale image: ```wolfram ConstantImage[0.5, {50, 50}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantImage.html) for more details. # ContourDetect `ContourDetect[image]` gives a binary image in which white pixels correspond to the zeros and zero crossings in image. `ContourDetect[image, delta]` treats values in image that are smaller in absolute value than delta as zero. `ContourDetect[array, ...]` gives a binary sparse array in which 1 corresponds to zeros and zero crossings in array. Examples [#examples] Detect contours in an image: ```wolfram ContourDetect[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContourDetect.html) for more details. # CornerFilter `CornerFilter[image]` computes a measure for the presence of a corner for each pixel in image and returns the result as an intensity image. `CornerFilter[image,r]` detects corners at a pixel range r. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; CornerFilter[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CornerFilter.html) for more details. # CurrentImage `CurrentImage[]` returns the current image captured from a connected camera. `CurrentImage[n]` returns n sequential image frames as a list. Examples [#examples] Capture current webcam image: ```wolfram CurrentImage[] ``` Capture multiple frames: ```wolfram CurrentImage[5] (* List of 5 images *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CurrentImage.html) for more details. # CurvatureFlowFilter `CurvatureFlowFilter[image]` applies a mean curvature flow filter to image. `CurvatureFlowFilter[image, t]` specifies the amount of curvature flow time t to be applied. `CurvatureFlowFilter[image, t, k]` applies the curvature flow with a modified conductance term parametrized by k. Examples [#examples] Apply curvature flow smoothing: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; CurvatureFlowFilter[img] ``` With specified time: ```wolfram CurvatureFlowFilter[img, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CurvatureFlowFilter.html) for more details. # Dilation `Dilation[image, ker]` gives the morphological dilation of image with respect to the structuring element ker. `Dilation[image, r]` gives the dilation with respect to a range-r square. `Dilation[data, ...]` applies dilation to an array of data. Examples [#examples] Dilate an image: ```wolfram Dilation[image, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Dilation.html) for more details. # DominantColors `DominantColors[image]` returns dominant colors in image. `DominantColors[image,n]` returns at most n dominant colors in image. `DominantColors[image,n,prop]` returns the specified property prop for the regions that belong to the same dominant color. `DominantColors[image,n,prop,format]` returns the output in the specified format. `DominantColors[{image1,image2,…},…]` returns dominant colors in each imagei. Examples [#examples] Get the 3 most dominant colors in an image: ```wolfram DominantColors[img, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DominantColors.html) for more details. # Erosion `Erosion[image, ker]` gives the morphological erosion of image with respect to the structuring element ker. `Erosion[image, r]` gives the erosion with respect to a range-r square. Examples [#examples] Erode a binary image: ```wolfram img = Binarize[Import["ExampleData/lena.tif"]] Erosion[img, 2] ``` With disk structuring element: ```wolfram Erosion[img, DiskMatrix[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Erosion.html) for more details. # EstimatedBackground `EstimatedBackground[data]` estimates the background of data. `EstimatedBackground[data, σ]` tries to preserve peaks up to scale σ. Examples [#examples] Estimate background from noisy data: ```wolfram data = Table[Sin[x] + RandomReal[0.1], {x, 0, 10, 0.1}]; EstimatedBackground[data] ``` Preserve peaks with a specific scale: ```wolfram EstimatedBackground[data, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedBackground.html) for more details. # FaceAlign `FaceAlign[image]` attempts to find faces in image and align them. * `FaceAlign[image,fref]` gives aligned faces according to the face reference fref. * `FaceAlign[image,fref,size]` gives aligned faces of the specified size. * `FaceAlign[{image1,image2,…},…]` gives a list of aligned faces for all imagei. Examples [#examples] ```wolfram (* Align faces in an image *) FaceAlign[photo] (* Align to a specific size *) FaceAlign[photo, Automatic, {100, 100}] (* Align multiple images *) FaceAlign[{photo1, photo2, photo3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FaceAlign.html) for more details. # FaceRecognize `FaceRecognize[{example1->name1,example2->name2,…}]` generates a ClassifierFunction\[…] based on the face examples and names given. * `FaceRecognize[{example1,example2,…}->{name1,name2,…}]` also generates a ClassifierFunction\[…] based on the examples and names given. * `FaceRecognize[<|name1->{example11,…},name2->{example21,…},…|>]` uses an association of names with their examples. * `FaceRecognize[training,image]` attempts to find faces present in an image and classify them with the given training set. * `FaceRecognize[training,image,prop]` returns the specified property prop. Examples [#examples] ```wolfram (* Create a face recognizer from examples *) recognizer = FaceRecognize[{ photo1 -> "Alice", photo2 -> "Bob" }] (* Recognize a face in a new image *) recognizer[newPhoto] (* Get probabilities *) recognizer[newPhoto, "Probabilities"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FaceRecognize.html) for more details. # FacialFeatures `FacialFeatures[image]` returns a minimal summary of facial features for all detected faces in image. * `FacialFeatures[image,features]` returns the specified facial features. * `FacialFeatures[video,…]` finds faces in frames of video. Examples [#examples] ```wolfram (* Get basic facial features *) FacialFeatures[photo] (* Get specific features like landmarks *) FacialFeatures[photo, "Landmarks"] (* Get all available features *) FacialFeatures[photo, All] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FacialFeatures.html) for more details. # FillingTransform `FillingTransform[image]` gives a version of image with all extended minima filled. * `FillingTransform[image,marker]` fills extended minima in regions where at least one corresponding element of marker is nonzero. * `FillingTransform[image,h]` fills only extended minima of depth h or less. Examples [#examples] ```wolfram (* Fill minima in an image *) FillingTransform[image] (* Fill only shallow minima *) FillingTransform[image, 0.2] (* Use a marker image *) FillingTransform[image, markerImage] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FillingTransform.html) for more details. # FindMatchingColor `FindMatchingColor[image,color]` returns a color similar to the color that is present in image. * `FindMatchingColor[image,{color1,color2,…}]` returns a list of colors matching each colori. * `FindMatchingColor[{image1,image2,…},{color1,color2,…}]` returns lists of matching colors for all imagei. Examples [#examples] ```wolfram (* Find a matching red color in an image *) FindMatchingColor[photo, Red] (* Find matches for multiple colors *) FindMatchingColor[photo, {Red, Blue, Green}] (* Use with images for color palette extraction *) colors = FindMatchingColor[image, DominantColors[image]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindMatchingColor.html) for more details. # GaborFilter `GaborFilter[data, r, k]` filters data by convolving with a Gabor kernel of pixel radius r and wave vector k. * `GaborFilter[data, r, k, ϕ]` uses a Gabor kernel with phase shift ϕ. * `GaborFilter[data, {r, σ}, ...]` uses a Gabor kernel with radius r and standard deviation σ. Examples [#examples] Apply a Gabor filter to an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; GaborFilter[img, 10, {1, 0}] ``` Filter with a phase shift: ```wolfram GaborFilter[img, 10, {0, 1}, Pi/4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaborFilter.html) for more details. # GuidedFilter `GuidedFilter[image, guide, r, ε]` filters *image* using the guide image *guide* over range-*r* neighborhoods with pixel-value regularizer *ε*. * `GuidedFilter[image, r, ε]` filters *image* so as to reduce noise, using *image* as the guide. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; GuidedFilter[img, 5, 0.01] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GuidedFilter.html) for more details. # HighlightImage Combines raster [Image](../Image/Image) with vector [Graphics](../Graphics/Graphics) in order to annotate, overlay or highlight certain features ```wolfram HighlightImage[img_Image, roi_] ``` where `roi` can be * `{{x1,y1}, ...}` list of image positions (drawn as points) * `g_Graphics` a graphics object or list of graphics primitives * `mask_Image` a mask image The following form is also valid ```wolfram HighlightImage[img_Image, {style__, roi_}] ``` where `style` accepts the same directives as [Style](../Graphics/Style) or graphics. There are additional `style` rules * `"Blur", {"Blur", r}` There is a known bug on HI-DPI screens and specific types of images. Apply this patch to your image. ```wolfram img = Image[img, "ImageResolution"->Automatic]; ``` Examples [#examples] Highlight features ```wolfram i = (* image *) HighlightImage[i, ImageCorners[i, 1, .001, 5]] ``` Highlight multiple regions of interest ```wolfram i = (* image *); HighlightImage[i, {Blue, EdgeDetect[i], Red, ImageLines[GradientFilter[i, 2], MaxFeatures -> 10], Green, ImageKeypoints[i, MaxFeatures -> 20]}] ``` # HilbertFilter `HilbertFilter[data, ωc]` applies a Hilbert filter with a cutoff frequency ωc to an array of data. * `HilbertFilter[data, ωc, n]` uses a filter kernel of length n. * `HilbertFilter[data, ωc, n, wfun]` applies a smoothing window wfun to the filter kernel. Examples [#examples] ```wolfram data = Table[Sin[2 Pi t] + Sin[4 Pi t], {t, 0, 1, 0.01}]; HilbertFilter[data, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HilbertFilter.html) for more details. # HitMissTransform `HitMissTransform[image, ker]` gives the hit-or-miss transform of image with respect to the composite structuring element ker. * `HitMissTransform[image, {ker1, ker2, ...}]` gives the union of the hit-or-miss transforms for all the structuring elements keri. * `HitMissTransform[image, {ker1, ker2, ...}, t]` treats values above t as foreground. Examples [#examples] Detect corners: ```wolfram img = Binarize[ExampleData[{"TestImage", "Shapes"}]]; ker = {{0, 1, -1}, {1, 1, -1}, {-1, -1, -1}}; HitMissTransform[img, ker] ``` Multiple kernels: ```wolfram HitMissTransform[img, {ker1, ker2, ker3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HitMissTransform.html) for more details. # Image Represents a raster image and plots the list of pixel's colors to a canvas used in notebooks ```wolfram Image[{row1_List, row2_List..} | n_NumericArray, encoding_:"Real32"] ``` where each `row` is a list of pixel colors. It it better to pass `NumericArray` for the best performance. The following `encoding` is supported * `"Real32"` each pixel is encoded using a real value from 0 up-to 1. Corresponding `NumericArray` format is `"Real32"` (if applicable). * `"Byte"` each pixel is encoded using integer value from 0 up-to 255. Corresponding `NumericArray` format is `"UnsignedInteger8"`. * `"Bit"` each pixel is either `1` or `0` (integer). Corresponding `NumericArray` is `"UnsignedInteger8"` **The first two** can be divided into groups by pixel format * `{R,G,B}` - each pixel is a list of numbers * `{R,G}` - experimental mode with just 2 colors * `{R,G,B,A}` - each pixel is a list of numbers * `I` grayscale - each pixel is a single number Options [#options] Magnification [#magnification] Magnifies by an integer factor original pixels provided by an array ImageSize [#imagesize] Acts similar to `Magnification` and scales an image to match the width of provided size Antialiasing [#antialiasing] By the default is `True`, which forces to use bilinear approximation when an image is shown scaled. Epilog [#epilog] The same as for `Graphics`, can be used to embed [AnimationFrameListener](../Graphics/AnimationFrameListener). See examples below Methods [#methods] EventHandler [#eventhandler] The following event patterns (or topics for [`EventHandler`](../Misc/Events)) are supported: * `"mousemove"`: Captures mouse movement * `"mouseup"`: Captures mouse up * `"mousedown"`: Captures mouse down * `"click"`: Captures clicks (without the Alt key) * `"altclick"`: Captures clicks with the Alt key held ```wolfram EventHandler[Image[...], { "click" -> Print }] ``` Examples [#examples] Direct [#direct] Show multiple iterations of a cellular automaton as a binary image ```wolfram Image[CellularAutomaton[30, {{1}, 0}, 40], Magnification->4] ``` A random noise ```wolfram Image[Table[RandomInteger[{0,1}], {i, 200}, {j, 350}]] ``` adding a color ```wolfram Image[Table[RandomInteger[{0,255}, 3], {i, 200}, {j, 350}], "Byte"] ``` Use `NumericArray` to provide and handle pixel data. It has to be a nested list of lists as usual. There is a following correspondence. `Byte` and `UnsignedInteger8` combo is the most efficient. Indirect [#indirect] One can also use `Rasterize` function to show any expressions as an image ```wolfram x + y // Rasterize ``` Notes on DPR [#notes-on-dpr] `Image` is pixel-perfect. Depending on the pixel-density of the device the visible image size might differ from machine to machine. To compensate for than, one can request DPR and calculate magnification in-place ```wolfram Image[img_Image, Magnification->Offload[Graphics`DPR[]]] ``` Here ``Graphics`DPR `` will be executed on the frontend (WLJS Interpreter), there is no need in revaluation. Transitions and updates [#transitions-and-updates] It does support dynamic symbols. Clouds [#clouds] Gaussian clouds (Perlin noise) ```wolfram n = 128; k2 = Outer[Plus, #, #] &[RotateRight[N@Range[-n, n - 1, 2]/n, n/2]^2]; spectrum = With[{d := RandomReal[NormalDistribution[], {n, n}]}, (1/n) (d + I d)/(0.002 + k2)]; spectrum[[1, 1]] *= 0; im[p_] := Clip[Re[InverseFourier[spectrum Exp[I p]]], {0, ∞}]^0.5 p0 = p = Sqrt[k2]; ``` Animation ```wolfram Module[{buffer = im[p0 += p], frame = CreateUUID[]}, EventHandler[frame, (buffer = im[p0 += p])&]; Image[buffer // Offload, Magnification->2, Epilog->AnimationFrameListener[buffer // Offload, "Event"->frame] ] ] ``` GOL [#gol] ```wolfram Puffer = {{1, 4}, {2, 5}, {3, 1}, {3, 5}, {4, 2}, {4, 3}, {4, 4}, {4, 5}, {8, 1}, {9, 2}, {9, 3}, {10, 3}, {11, 3}, {12, 2}, {15, 1}, {15, 4}, {16, 5}, {17, 1}, {17, 5}, {18, 2}, {18, 3}, {18, 4}, {18, 5}}; board = NumericArray[ CellularAutomaton["GameOfLife", {SparseArray[Puffer -> 1], 0}, {{500}}] // First , "UnsignedInteger8"]; Image[board // Offload, "Bit", Magnification -> 3, Antialiasing->False] ``` and now we can run the simulation with a desired speed ```wolfram task = SetInterval[board = NumericArray[CellularAutomaton["GameOfLife", board // Normal, {{1}}] // First, "UnsignedInteger8"], 50]; SetTimeout[TaskRemove[task], 5000]; ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # Image3DProjection `Image3DProjection[image]` takes a 3D image and returns a 2D image of maximum projection onto the x-y plane. * `Image3DProjection[image, dir]` performs a projection in the direction specified by dir. * `Image3DProjection[image, dir, mode]` specifies the projection mode. Examples [#examples] Maximum intensity projection: ```wolfram img3d = ExampleData[{"TestImage3D", "CTengine"}]; Image3DProjection[img3d] ``` Projection in z direction: ```wolfram Image3DProjection[img3d, "Z"] ``` Mean projection: ```wolfram Image3DProjection[img3d, "Z", "Mean"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Image3DProjection.html) for more details. # ImageAccumulate `ImageAccumulate[image]` gives an image in which each pixel represents a sum of all pixels below and to the left of that pixel in image. This creates an integral image (summed-area table), useful for fast box filtering operations. Examples [#examples] ```wolfram ImageAccumulate[ExampleData[{"TestImage", "Lena"}]] ``` ```wolfram img = RandomImage[1, {100, 100}]; ImageAccumulate[img] ``` ```wolfram ImageAccumulate[ColorConvert[image, "Grayscale"]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAccumulate.html) for more details. # ImageAdd `ImageAdd[image,x]` adds an amount x to each channel value in image. `ImageAdd[image1,image2]` gives an image in which each pixel is the sum of the corresponding pixels in image1 and image2. `ImageAdd[image,expr1,expr2,…]` adds all expri to image, where each expri can be either an image, a number, or a color value. Examples [#examples] Brighten an image by adding a constant: ```wolfram ImageAdd[ExampleData[{"TestImage", "Lena"}], 0.2] (* Image[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAdd.html) for more details. # ImageAdjust `ImageAdjust[image]` adjusts the levels in image, rescaling them to cover the range 0 to 1. `ImageAdjust[image, {c, b, g}]` adjusts contrast c, brightness b, and gamma g. Examples [#examples] Adjust image levels: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageAdjust[img] ``` Increase contrast and brightness: ```wolfram ImageAdjust[img, {0.5, 0.2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAdjust.html) for more details. # ImageAlign `ImageAlign[ref,image]` returns a version of image that is aligned with the reference image ref. `ImageAlign[ref,{image1,…,imagen}]` gives the result of aligning each of the imagei with the reference image ref. `ImageAlign[{image1,…,imagen}]` uses image1 as the reference image. Examples [#examples] ```wolfram ImageAlign[image1, image2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAlign.html) for more details. # ImageApply `ImageApply[f, image]` applies the function f to the list of channel values for each pixel in image. `ImageApply[f, {image1, image2, ...}]` applies f to corresponding pixel values from each image. Examples [#examples] Invert an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageApply[1 - # &, img] ``` Apply to multiple images: ```wolfram ImageApply[Mean, {img, ColorNegate[img]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageApply.html) for more details. # ImageApplyIndexed `ImageApplyIndexed[f,image]` applies the function f to the list of channel values for each pixel in image, giving the row and column index of each pixel as a second argument to f. `ImageApplyIndexed[f,{image1,image2,…}]` applies f to the sequence of corresponding pixel values taken from each imagei, giving the corresponding row and column index of pixels as the last argument to f. Examples [#examples] Apply a function that uses pixel position: ```wolfram ImageApplyIndexed[#2[[1]]/100 &, Image[RandomReal[1, {100, 100}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageApplyIndexed.html) for more details. # ImageAspectRatio `ImageAspectRatio[image]` gives the ratio of height to width for image. Examples [#examples] Get aspect ratio: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageAspectRatio[img] (* 1. *) ``` Compare with dimensions: ```wolfram ImageDimensions[img] (* {512, 512} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAspectRatio.html) for more details. # ImageAssemble `ImageAssemble[{{im11, ..., im1n}, ..., {imm1, ..., immn}}]` assembles a single image from an array of images. * `ImageAssemble[{{im11, ..., im1n}, ..., {imm1, ..., immn}}, fitting]` assembles images using the fitting method. Examples [#examples] Assemble images into a grid: ```wolfram ImageAssemble[{{img1, img2}, {img3, img4}}] ``` Create a 2x2 mosaic: ```wolfram imgs = Table[ExampleData[{"TestImage", "Mandrill"}], 2, 2]; ImageAssemble[imgs] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAssemble.html) for more details. # ImageCapture `ImageCapture[]` opens a graphical user interface for capturing images from connected cameras. Examples [#examples] Open the image capture interface: ```wolfram ImageCapture[] ``` Capture with a specific device: ```wolfram ImageCapture["FaceTime HD Camera"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCapture.html) for more details. # ImageCases Uses pre-trained local neural network to categorize objects on image ```wolfram ImageCases[img_Image] ``` Example [#example] Find objects on an arbitrary image # ImageChannels `ImageChannels[image]` gives the number of channels present in the data for the Image object. Examples [#examples] RGB image channels: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageChannels[img] (* 3 *) ``` Grayscale image: ```wolfram ImageChannels[ColorConvert[img, "Grayscale"]] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageChannels.html) for more details. # ImageClip `ImageClip[image]` clips all channel values in image to lie in the default range. `ImageClip[image,{min,max}]` clips channel values to lie in the range from min to max. `ImageClip[image,{min,max},{vmin,vmax}]` gives vmin for values below min and vmax for values above max. Examples [#examples] Clip an image to a specific range: ```wolfram ImageClip[img, {0.2, 0.8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageClip.html) for more details. # ImageCollage `ImageCollage[{image1, image2, ...}]` creates a collage of images. `ImageCollage[{w1 -> image1, w2 -> image2, ...}]` creates a weighted collage. Examples [#examples] Create a simple collage: ```wolfram ImageCollage[{ExampleData[{"TestImage", "Lena"}], ExampleData[{"TestImage", "Mandrill"}]}] ``` Weighted collage: ```wolfram ImageCollage[{2 -> img1, 1 -> img2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCollage.html) for more details. # ImageColorSpace `ImageColorSpace[image]` gives the name of the color space of image. Examples [#examples] ```wolfram ImageColorSpace[ExampleData[{"TestImage", "Lena"}]] (* "RGB" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageColorSpace.html) for more details. # ImageCompose `ImageCompose[image, overlay]` gives the result of overlaying overlay onto image. `ImageCompose[image, {overlay, α}]` uses alpha blending with fraction α. Examples [#examples] Overlay an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; overlay = Image[Graphics[{Red, Disk[]}], ImageSize -> 100]; ImageCompose[img, overlay] ``` With transparency: ```wolfram ImageCompose[img, {overlay, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCompose.html) for more details. # ImageContainsQ `ImageContainsQ[image, category]` returns `True` if an instance of the specified category is detected in image. * `ImageContainsQ[image, {category1, category2, ...}]` returns `True` if at least one instance of each of the categoryi is detected in image. * `ImageContainsQ[image, category1 | category2 | ...]` returns `True` if image contains an instance of at least one of categoryi. * `ImageContainsQ[video, ...]` returns a time series of Boolean values for every frame of video. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Peppers"}]; ImageContainsQ[img, "Vegetable"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageContainsQ.html) for more details. # ImageContents `ImageContents[image]` gives a dataset of identified entities in `image`. * `ImageContents[image, category]` gives a dataset that only contains entities in the specified category. * `ImageContents[image, category, prop]` includes the properties `prop` for each identified object. * `ImageContents[video, …]` gives a time series of detected objects in frames of `video`. Examples [#examples] ```wolfram ImageContents[ExampleData[{"TestImage", "Lena"}]] ``` ```wolfram ImageContents[image, "Object", {"BoundingBox", "Probability"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageContents.html) for more details. # ImageConvolve `ImageConvolve[image, ker]` gives the convolution of image with kernel ker. Examples [#examples] Apply a blur kernel: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageConvolve[img, BoxMatrix[2]/25] ``` Sharpen with Laplacian: ```wolfram ImageConvolve[img, {{0, -1, 0}, {-1, 5, -1}, {0, -1, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageConvolve.html) for more details. # ImageCooccurrence `ImageCooccurrence[image,n]` gives the n×n co-occurrence matrix for image. `ImageCooccurrence[image,n,ker]` computes a co-occurrence matrix for arbitrary spatial relationships specified by a kernel ker. Examples [#examples] Compute a 256×256 co-occurrence matrix for an image: ```wolfram ImageCooccurrence[img, 256] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCooccurrence.html) for more details. # ImageCorners `ImageCorners[image]` finds corners in image and returns their coordinates. `ImageCorners[image, r]` finds corners at a pixel range r. Examples [#examples] Find corners in an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; corners = ImageCorners[img]; HighlightImage[img, corners] ``` With specific range: ```wolfram ImageCorners[img, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCorners.html) for more details. # ImageCorrelate `ImageCorrelate[image, ker]` gives the correlation of image with kernel ker. `ImageCorrelate[image, ker, f]` computes a generalized correlation using function f. Examples [#examples] Correlate with a kernel: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageCorrelate[img, GaussianMatrix[3]] ``` Template matching: ```wolfram template = ImageTake[img, {100, 150}, {100, 150}]; ImageCorrelate[img, template] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCorrelate.html) for more details. # ImageCorrespondingPoints `ImageCorrespondingPoints[image1, image2]` finds a set of matching interest points in image1 and image2 and returns their pixel coordinates. Examples [#examples] Find corresponding points between two images: ```wolfram img1 = ExampleData[{"TestImage", "Lena"}]; img2 = ImageRotate[img1, 0.1]; {pts1, pts2} = ImageCorrespondingPoints[img1, img2] ``` Visualize the correspondences: ```wolfram HighlightImage[img1, pts1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCorrespondingPoints.html) for more details. # ImageCrop `ImageCrop[image]` crops image by removing borders of uniform color. `ImageCrop[image, size]` crops image to the specified size. Examples [#examples] Automatic crop: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageCrop[img] ``` Crop to specific size: ```wolfram ImageCrop[img, {200, 200}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageCrop.html) for more details. # ImageData `ImageData[image]` gives the array of pixel values in an Image object. `ImageData[image, "type"]` converts pixel values to the specified type. Examples [#examples] Get pixel data: ```wolfram img = Image[{{0, 0.5, 1}, {0.3, 0.6, 0.9}}]; ImageData[img] (* {{0., 0.5, 1.}, {0.3, 0.6, 0.9}} *) ``` Get byte values: ```wolfram ImageData[img, "Byte"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageData.html) for more details. # ImageDeconvolve `ImageDeconvolve[image,ker]` gives a deconvolution of image using kernel ker. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDeconvolve.html) for more details. # ImageDemosaic `ImageDemosaic[image, cfa]` reconstructs a color image using the specified color filter array cfa. * `ImageDemosaic[image, {"cfa", {row, col}}]` aligns the pattern with the \{row, col} pixel of image. Examples [#examples] ```wolfram ImageDemosaic[rawImage, "Bayer"] ``` ```wolfram ImageDemosaic[image, {"RGGB", {1, 1}}] ``` ```wolfram ImageDemosaic[sensorData, "GRBG"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDemosaic.html) for more details. # ImageDifference `ImageDifference[image1, image2]` gives an image where each pixel is the absolute difference of the corresponding pixels in image1 and image2. Examples [#examples] Compute difference between images: ```wolfram img1 = ExampleData[{"TestImage", "Lena"}]; img2 = GaussianFilter[img1, 5]; ImageDifference[img1, img2] ``` Detect changes: ```wolfram ImageDifference[img1, ColorNegate[img1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDifference.html) for more details. # ImageDimensions `ImageDimensions[image]` gives the pixel dimensions of an Image or Image3D object image. `ImageDimensions[video]` gives the pixel dimensions of the first video track of the Video object video. Examples [#examples] ```wolfram ImageDimensions[ExampleData[{"TestImage", "Lena"}]] (* {512, 512} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDimensions.html) for more details. # ImageDisplacements `ImageDisplacements[{image1, image2, …, imagen}]` gives estimated horizontal and vertical displacements between consecutive images. * `ImageDisplacements[{image1, image2, …, imagen}, flow]` uses `flow` as an initial estimate for displacement between `image1` and `image2`. Examples [#examples] ```wolfram ImageDisplacements[{image1, image2}] ``` ```wolfram ImageDisplacements[VideoFrameList[video, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDisplacements.html) for more details. # ImageDistance `ImageDistance[image1, image2]` returns a distance measure between image1 and image2. `ImageDistance[image1, image2, pos]` places image2 centered at pos in image1. Examples [#examples] Compute image distance: ```wolfram img1 = ExampleData[{"TestImage", "Lena"}]; img2 = GaussianFilter[img1, 3]; ImageDistance[img1, img2] ``` With different metrics: ```wolfram ImageDistance[img1, img2, DistanceFunction -> MeanSquaredDistance] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageDistance.html) for more details. # ImageExposureCombine `ImageExposureCombine[{image1, image2, ...}]` combines differently exposed images of the same scene into a single image with good overall exposure. Examples [#examples] Combine exposures (HDR): ```wolfram images = {darkImg, normalImg, brightImg}; ImageExposureCombine[images] ``` Create HDR output: ```wolfram ImageExposureCombine[images, "HDR"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageExposureCombine.html) for more details. # ImageFeatureTrack `ImageFeatureTrack[{image1, image2, ..., imagen}]` tracks features from image1 through imagen. `ImageFeatureTrack[{image1, ..., imagen}, pts]` tracks from initial points pts. Examples [#examples] Track features across frames: ```wolfram frames = Table[RotationTransform[i Degree][img], {i, 0, 10}]; ImageFeatureTrack[frames] ``` Track specific points: ```wolfram ImageFeatureTrack[frames, {{100, 100}, {200, 200}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFeatureTrack.html) for more details. # ImageFileApply `ImageFileApply[f, inputfile, outputfile]` applies the function f to the list of channel values for each pixel of the image stored in inputfile and stores the result in outputfile. Examples [#examples] Invert an image file: ```wolfram ImageFileApply[1 - # &, "input.png", "output.png"] ``` Apply a grayscale transformation: ```wolfram ImageFileApply[Mean, "color.png", "gray.png"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFileApply.html) for more details. # ImageFileFilter `ImageFileFilter[f, inputfile, r, outputfile]` applies the function f to the range r neighborhood of each pixel in each channel of the image stored in inputfile and stores the result in outputfile. Examples [#examples] ```wolfram ImageFileFilter[Mean, "input.png", 2, "output.png"] ``` ```wolfram ImageFileFilter[Max, "image.tiff", 3, "filtered.tiff"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFileFilter.html) for more details. # ImageFileScan `ImageFileScan[f,inputfile]` applies the function f to the list of channel values for each pixel of the image stored in inputfile. Examples [#examples] Count pixels in an image file: ```wolfram n = 0; ImageFileScan[(n++ &), "image.png"]; n ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFileScan.html) for more details. # ImageFilter `ImageFilter[f, image, r]` applies the function f to the range-r neighborhood of each pixel in each channel of image. Examples [#examples] Apply a mean filter to an image: ```wolfram ImageFilter[Mean, image, 2] ``` Apply a custom filter function: ```wolfram ImageFilter[Max[#] - Min[#] &, image, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFilter.html) for more details. # ImageFocusCombine `ImageFocusCombine[{image1, image2, ...}]` combines differently focused images of the same scene to obtain a single well-focused image. Examples [#examples] Combine focus-stacked images: ```wolfram images = {nearFocus, midFocus, farFocus}; ImageFocusCombine[images] ``` Focus stacking for macro photography: ```wolfram ImageFocusCombine[Import /@ FileNames["focus*.jpg"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageFocusCombine.html) for more details. # ImageForestingComponents `ImageForestingComponents[image]` finds a segmentation of image, returning an integer matrix in which positive integers label different components. `ImageForestingComponents[image,marker]` tries to find a segmentation into components that include pixels indicated by marker. `ImageForestingComponents[image,marker,r]` finds components that are connected at a pixel scale given by r. `ImageForestingComponents[video,…]` computes components for each frame in video. Examples [#examples] Segment an image into components: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageForestingComponents[img] ``` Use markers for guided segmentation: ```wolfram ImageForestingComponents[img, {{100, 100} -> 1, {200, 200} -> 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageForestingComponents.html) for more details. # ImageForwardTransformation `ImageForwardTransformation[image, f]` gives an image where each pixel at position f\[\{x, y}] corresponds to position \{x, y} in the input image. `ImageForwardTransformation[image, f, size]` gives an image of the specified size. Examples [#examples] Apply a swirl transformation: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageForwardTransformation[img, {#[[1]] + 0.1 #[[2]], #[[2]]} &] ``` Polar transformation: ```wolfram ImageForwardTransformation[img, {Norm[#], ArcTan @@ #} &, {256, 256}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageForwardTransformation.html) for more details. # ImageGraphics `ImageGraphics[image]` returns the content of image in the form of scalable vector graphics. * `ImageGraphics[image, n]` uses up to n colors for the vector graphics. * `ImageGraphics[image, colors]` creates vector graphics containing the specified colors. Examples [#examples] ```wolfram ImageGraphics[ExampleData[{"TestImage", "Lena"}]] ``` ```wolfram ImageGraphics[Binarize[ExampleData[{"TestImage", "Mandrill"}]], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageGraphics.html) for more details. # ImageHistogram `ImageHistogram[image]` plots a histogram of the pixel levels for each channel in image. `ImageHistogram[image, bspec]` uses bin specification bspec. Examples [#examples] Display image histogram: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageHistogram[img] ``` With specific bins: ```wolfram ImageHistogram[img, 64] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageHistogram.html) for more details. # ImageInstanceQ `ImageInstanceQ[image, obj]` gives `True` if image appears to be an instance of the object obj, and gives `False` otherwise. * `ImageInstanceQ[image, obj, cat]` assumes that the image is of something in the category cat. Examples [#examples] Check if an image contains a specific object: ```wolfram img = ExampleData[{"TestImage", "Airplane"}]; ImageInstanceQ[img, Entity["Concept", "Airplane::9v278"]] ``` Check with a category hint: ```wolfram ImageInstanceQ[img, Entity["Concept", "Airplane::9v278"], "Vehicle"] ``` Test for a different object: ```wolfram ImageInstanceQ[img, Entity["Concept", "Cat::7865n"]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageInstanceQ.html) for more details. # ImageKeypoints `ImageKeypoints[image]` finds key features in image and returns their coordinates. `ImageKeypoints[image, prop]` gives the specified property prop for each keypoint. `ImageKeypoints[video, ...]` finds keypoints in frames of video. Examples [#examples] ```wolfram ImageKeypoints[ExampleData[{"TestImage", "Lena"}]] (* {{x1, y1}, {x2, y2}, ...} *) ``` ```wolfram ImageKeypoints[img, "Scale"] (* Scale values for each keypoint *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageKeypoints.html) for more details. # ImageLevels `ImageLevels[image]` gives a list of pixel values and counts for each channel in image. `ImageLevels[image,bspec]` bins pixel values using bin specification bspec. `ImageLevels[image,bspec,range]` gives counts for bins in the given range. Examples [#examples] Get pixel value counts: ```wolfram ImageLevels[ExampleData[{"TestImage", "Lena"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageLevels.html) for more details. # ImageLines `ImageLines[image]` finds line segments in image and returns the coordinates of their endpoints. `ImageLines[image, t]` uses threshold t for selecting lines. Examples [#examples] Detect lines in an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; lines = ImageLines[img]; HighlightImage[img, Line /@ lines] ``` With threshold: ```wolfram ImageLines[img, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageLines.html) for more details. # ImageMarker `ImageMarker[pos]` is a `HighlightImage` specification that represents a marker at position pos. * `ImageMarker[pos, marker]` represents a custom marker at position pos. * `ImageMarker[{pos1, pos2, ...}, ...]` represents multiple marker positions posi. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; HighlightImage[img, ImageMarker[{100, 100}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageMarker.html) for more details. # ImageMeasurements `ImageMeasurements[image, "prop"]` returns the value of property "prop" for the entire image. `ImageMeasurements[image, "prop", format]` returns values in the specified output format. Examples [#examples] Get mean intensity: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageMeasurements[img, "Mean"] (* 0.435 *) ``` Multiple properties: ```wolfram ImageMeasurements[img, {"Mean", "StandardDeviation", "Max"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageMeasurements.html) for more details. # ImageMesh `ImageMesh[image]` returns the foreground region in image as a `BoundaryMeshRegion` object. Examples [#examples] ```wolfram ImageMesh[Binarize[ExampleData[{"TestImage", "Lena"}]]] (* BoundaryMeshRegion[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageMesh.html) for more details. # ImageMultiply `ImageMultiply[image, x]` multiplies each channel value in image by a factor x. `ImageMultiply[image1, image2]` gives an image where each pixel is the product of corresponding pixels. Examples [#examples] Darken an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageMultiply[img, 0.5] ``` Multiply two images: ```wolfram mask = DiskMatrix[100]; ImageMultiply[img, Image[mask]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageMultiply.html) for more details. # ImagePad `ImagePad[image, m]` pads image on all sides with m background pixels. `ImagePad[image, m, padding]` uses the specified padding value or method. Examples [#examples] Add black padding: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImagePad[img, 20] ``` Add white padding: ```wolfram ImagePad[img, 20, White] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePad.html) for more details. # ImagePartition `ImagePartition[image, s]` partitions an image into an array of s×s-pixel subimages. `ImagePartition[image, {w, h}]` uses subimages of width w and height h. Examples [#examples] Partition into tiles: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; tiles = ImagePartition[img, 128]; Grid[tiles] ``` With overlap: ```wolfram ImagePartition[img, {100, 100}, {50, 50}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePartition.html) for more details. # ImagePeriodogram `ImagePeriodogram[image]` shows the squared magnitude of the discrete Fourier transform (power spectrum) of image. `ImagePeriodogram[image, n]` averages power spectra of n×n partitions. Examples [#examples] Display power spectrum: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImagePeriodogram[img] ``` With partition size: ```wolfram ImagePeriodogram[img, 64] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePeriodogram.html) for more details. # ImagePerspectiveTransformation `ImagePerspectiveTransformation[image, m]` applies a linear fractional transform specified by matrix m to pixel positions. `ImagePerspectiveTransformation[image, tf]` uses a TransformationFunction. Examples [#examples] Apply perspective transform: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImagePerspectiveTransformation[img, RotationMatrix[0.2]] ``` With size specification: ```wolfram ImagePerspectiveTransformation[img, ScalingMatrix[{1.5, 1}], {400, 400}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePerspectiveTransformation.html) for more details. # ImagePosition `ImagePosition[image]` gives an association of image positions for each identified category of objects in image. * `ImagePosition[image, obj]` gives a list of image positions for subimages identified as instances of the specified category. * `ImagePosition[video, ...]` gives a time series of detected object positions in frames of video. Examples [#examples] Find face positions: ```wolfram img = ExampleData[{"TestImage", "Crowd"}]; ImagePosition[img, "Face"] ``` All detected objects: ```wolfram ImagePosition[img] ``` Cat positions: ```wolfram ImagePosition[img, Entity["Concept", "Cat::7x3bv"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePosition.html) for more details. # ImagePyramid `ImagePyramid[image]` creates a Gaussian image pyramid formed from image. `ImagePyramid[image, pyrtype]` returns a Gaussian or Laplacian pyramid depending of the specified pyrtype. `ImagePyramid[image, pyrtype, n]` returns up to n levels of the pyramid. `ImagePyramid[image, pyrtype, {size}]` returns pyramid levels down to image dimensions given by size. `ImagePyramid[image, pyrtype, n, s]` returns a pyramid with successive levels downsampled by factor s. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePyramid.html) for more details. # ImagePyramidApply `ImagePyramidApply[f, pyr]` applies f to all images in the `ImagePyramid` object pyr. * `ImagePyramidApply[f, {pyr1, pyr2, ...}]` applies f to the sequence of corresponding levels taken from each pyri. Examples [#examples] ```wolfram pyr = ImagePyramid[ExampleData[{"TestImage", "Lena"}]]; ImagePyramidApply[ColorNegate, pyr] ``` ```wolfram ImagePyramidApply[ImageAdjust, pyr] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImagePyramidApply.html) for more details. # ImageQ `ImageQ[image]` yields `True` if image has the form of a valid Image or Image3D object, and `False` otherwise. Examples [#examples] Test for valid image: ```wolfram ImageQ[ExampleData[{"TestImage", "Lena"}]] (* True *) ``` Non-image returns False: ```wolfram ImageQ[{1, 2, 3}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageQ.html) for more details. # ImageRecolor `ImageRecolor[image, region -> color]` recolors pixels in image specified by region using the specified color. * `ImageRecolor[image, {region1 -> color1, ...}]` recolors multiple regions. * `ImageRecolor[video, ...]` recolors frames of a video. This function changes the color of selected regions in images or videos. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageRecolor[img, Rectangle[{0, 0}, {100, 100}] -> Red] ``` ```wolfram ImageRecolor[img, Disk[{128, 128}, 50] -> Blue] ``` ```wolfram ImageRecolor[img, {Disk[{50, 50}, 30] -> Green, Disk[{200, 200}, 30] -> Yellow}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageRecolor.html) for more details. # ImageReflect `ImageReflect[image]` reverses image by top-bottom mirror reflection. `ImageReflect[image, side]` reflects so the specified side goes to the opposite side. Examples [#examples] Vertical flip: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageReflect[img] ``` Horizontal flip: ```wolfram ImageReflect[img, Left] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageReflect.html) for more details. # ImageResize `ImageResize[image, width]` gives a resized version of image that is width pixels wide. `ImageResize[image, {width, height}]` resizes to exact dimensions. Examples [#examples] Resize by width: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageResize[img, 256] ``` Resize to exact dimensions: ```wolfram ImageResize[img, {200, 300}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageResize.html) for more details. # ImageRestyle `ImageRestyle[image, sample]` attempts to restyle image so as to follow the graphical style of sample. * `ImageRestyle[image, w -> sample]` uses restyle weighting w. * `ImageRestyle[image, {sample1, ...}]` attempts to restyle image using a blend of the graphical styles of the samplei. * `ImageRestyle[image, {w1 -> sample1, ...}]` uses weightings wi for the samplei. Examples [#examples] ```wolfram ImageRestyle[ExampleData[{"TestImage", "Lena"}], ExampleData[{"TestImage", "Mandrill"}]] ``` ```wolfram ImageRestyle[img, 0.5 -> styleImage] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageRestyle.html) for more details. # ImageRotate `ImageRotate[image]` rotates image by 90° about its center. `ImageRotate[image, θ]` rotates image by θ radians. Examples [#examples] Rotate 90 degrees: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageRotate[img] ``` Rotate by 45 degrees: ```wolfram ImageRotate[img, Pi/4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageRotate.html) for more details. # ImageSaliencyFilter `ImageSaliencyFilter[image]` returns a saliency map for image, highlighting visually prominent regions. Examples [#examples] Compute saliency map: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageSaliencyFilter[img] ``` Threshold saliency: ```wolfram Binarize[ImageSaliencyFilter[img], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageSaliencyFilter.html) for more details. # ImageScaled `ImageScaled[{x,y}]` gives the position of a graphical object in terms of coordinates scaled to run from 0 to 1 across the whole image region in each direction. `ImageScaled[{dx,dy},{x0,y0}]` gives a position obtained by starting at ordinary coordinates \{x0,y0}, then moving by an image-scaled offset \{dx,dy}. Examples [#examples] Place text at the center of a graphic: ```wolfram Graphics[{Circle[], Text["Center", ImageScaled[{0.5, 0.5}]]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageScaled.html) for more details. # ImageScan `ImageScan[f, image]` evaluates f applied to each pixel of image in turn. Examples [#examples] ```wolfram ImageScan[Print, Image[{{0, 1}, {1, 0}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageScan.html) for more details. # ImageStitch `ImageStitch[{image1, image2, ...}]` gives a composed image from an unordered list of imagei. * `ImageStitch[{{image11, image12, ...}, {image21, image22, ...}, ...}]` returns a stitched image from a matrix of images imageij, according to their array position. * `ImageStitch[images, canvas]` projects the stitched image onto the geometry specified by canvas. Examples [#examples] ```wolfram ImageStitch[{img1, img2, img3}] ``` ```wolfram ImageStitch[{{leftImg, rightImg}}, "Cylindrical"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageStitch.html) for more details. # ImageSubtract `ImageSubtract[image, x]` subtracts a constant amount x from each channel value in image. `ImageSubtract[image1, image2]` subtracts corresponding pixels. Examples [#examples] Darken an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageSubtract[img, 0.2] ``` Subtract two images: ```wolfram ImageSubtract[img, GaussianFilter[img, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageSubtract.html) for more details. # ImageTake `ImageTake[image, n]` gives an image consisting of the first n rows. `ImageTake[image, {row1, row2}, {col1, col2}]` gives a subimage spanning the specified rows and columns. Examples [#examples] Take first 100 rows: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageTake[img, 100] ``` Extract a region: ```wolfram ImageTake[img, {100, 200}, {150, 300}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageTake.html) for more details. # ImageTransformation `ImageTransformation[image, f]` gives an image where each pixel at position p corresponds to position f\[p] in image. `ImageTransformation[image, f, size]` gives an image of the specified size. Examples [#examples] Fisheye effect: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageTransformation[img, # (1 + 0.5 Norm[#]^2) &, DataRange -> Full] ``` Wave distortion: ```wolfram ImageTransformation[img, {#[[1]], #[[2]] + 10 Sin[#[[1]]/20]} &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageTransformation.html) for more details. # ImageTrim `ImageTrim[image, roi]` gives the smallest subimage that includes the specified region of interest roi. `ImageTrim[image, roi, r]` adds a margin of size r. Examples [#examples] Trim to bounding box: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageTrim[img, Rectangle[{100, 100}, {300, 300}]] ``` With margin: ```wolfram ImageTrim[img, Disk[{256, 256}, 100], 20] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageTrim.html) for more details. # ImageType `ImageType[image]` gives the underlying type of values used for each pixel element in the Image object. Examples [#examples] Get image type: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageType[img] (* "Byte" *) ``` Real-valued image: ```wolfram ImageType[Image[RandomReal[1, {10, 10}]]] (* "Real32" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageType.html) for more details. # ImageValue `ImageValue[image,pos]` gives the interpolated value of image at position pos. `ImageValue[image,pos,"type"]` gives the value converted to the specified type. Examples [#examples] Get the interpolated pixel value at a position: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageValue[img, {100.5, 200.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageValue.html) for more details. # ImageValuePositions `ImageValuePositions[image,val]` returns a list of pixel positions in image that exactly match the value val. `ImageValuePositions[image,val,d]` returns all pixel positions that have values within a distance d from val. Examples [#examples] Find positions of white pixels: ```wolfram img = Image[{{0, 1}, {1, 0}}]; ImageValuePositions[img, 1] (* {{1, 2}, {2, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageValuePositions.html) for more details. # ImageVectorscopePlot `ImageVectorscopePlot[image]` plots the chrominance of image. Examples [#examples] Plot the vectorscope of an image: ```wolfram ImageVectorscopePlot[ExampleData[{"TestImage", "Lena"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageVectorscopePlot.html) for more details. # ImageWaveformPlot `ImageWaveformPlot[image]` plots the waveform of image. * `ImageWaveformPlot[image, colorspace]` plots the waveform of image in colorspace. * `ImageWaveformPlot[image, channel]` plots the waveform for the specified channel. Examples [#examples] Plot the waveform of an image: ```wolfram ImageWaveformPlot[ExampleData[{"TestImage", "Mandrill"}]] ``` Plot in a specific color space: ```wolfram ImageWaveformPlot[img, "RGB"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageWaveformPlot.html) for more details. # Inpaint `Inpaint[image, region]` retouches parts of image that correspond to nonzero elements in region. Examples [#examples] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; mask = DiskMatrix[20]; Inpaint[img, mask] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inpaint.html) for more details. # KuwaharaFilter `KuwaharaFilter[data, r]` computes for each element `p` in data the variance of the values in the four `(r+1)×(r+1)` squares that have `p` as a corner, and replaces `p` with the mean of the values of the square with least variance. Examples [#examples] ```wolfram KuwaharaFilter[image, 3] ``` ```wolfram KuwaharaFilter[ExampleData[{"TestImage", "Lena"}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KuwaharaFilter.html) for more details. # LinearGradientImage ```wolfram LinearGradientImage[{__RGBColor}] ``` ```wolfram LinearGradientImage[{pos1, pos2} -> col] ``` ```wolfram LinearGradientImage[..., size] ``` generates a static [Image](../Image/Image) filled with gradient using the provided data. For example ```wolfram LinearGradientImage[{Blue, Yellow, Red}] ``` # LocalAdaptiveBinarize `LocalAdaptiveBinarize[image, r]` creates a binary image from image by replacing values above the mean of the range-r neighborhood with 1 and others with 0. * `LocalAdaptiveBinarize[image, r, {α, β, γ}]` replaces values above α μ + β σ + γ with 1 and others with 0, where μ and σ are the local mean and standard deviation. Examples [#examples] ```wolfram LocalAdaptiveBinarize[ExampleData[{"TestImage", "Lena"}], 10] ``` ```wolfram LocalAdaptiveBinarize[img, 5, {1, -0.2, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalAdaptiveBinarize.html) for more details. # MorphologicalBinarize `MorphologicalBinarize[image, {t1, t2}]` creates a binary image from image by replacing all values above the upper threshold t2 with 1, also including pixels with intensities above the lower threshold t1 that are connected to the foreground. * `MorphologicalBinarize[image, t]` uses t as the upper threshold, automatically choosing a suitable value for the lower threshold. * `MorphologicalBinarize[image]` chooses the lower and upper threshold automatically. Examples [#examples] Binarize an image with automatic thresholds: ```wolfram MorphologicalBinarize[ExampleData[{"TestImage", "Lena"}]] ``` Use a specific upper threshold: ```wolfram MorphologicalBinarize[ExampleData[{"TestImage", "Mandrill"}], 0.5] ``` Specify both thresholds: ```wolfram MorphologicalBinarize[ExampleData[{"TestImage", "Peppers"}], {0.3, 0.7}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalBinarize.html) for more details. # MorphologicalBranchPoints `MorphologicalBranchPoints[image]` gives a version of a binary image image in which white pixels represent the morphological branch points. Examples [#examples] ```wolfram img = Thinning[Binarize[ExampleData[{"TestImage", "Lena"}]]]; MorphologicalBranchPoints[img] ``` ```wolfram MorphologicalBranchPoints[SkeletonTransform[DiskMatrix[20]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalBranchPoints.html) for more details. # MorphologicalComponents `MorphologicalComponents[image]` gives an array in which each pixel of image is replaced by an integer index representing the connected foreground image component in which the pixel lies. `MorphologicalComponents[image, t]` treats values above t as foreground. `MorphologicalComponents[video, ...]` computes connected components in frames of video. Examples [#examples] Find connected components in a binary image: ```wolfram img = Binarize[ExampleData[{"TestImage", "Blobs"}]]; MorphologicalComponents[img] // Colorize ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalComponents.html) for more details. # MorphologicalEulerNumber `MorphologicalEulerNumber[image]` computes the morphological Euler number of regions in a binary image. * `MorphologicalEulerNumber[image, t]` treats values above t as foreground. The Euler number is the number of objects minus the number of holes. Examples [#examples] ```wolfram MorphologicalEulerNumber[binaryImage] ``` ```wolfram MorphologicalEulerNumber[image, 0.5] ``` ```wolfram MorphologicalEulerNumber[Binarize[img]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalEulerNumber.html) for more details. # MorphologicalGraph `MorphologicalGraph[image]` gives a graph object that represents the connectivity of the morphological branch points and endpoints of the objects in image after applying morphological thinning. Examples [#examples] ```wolfram img = Binarize[ExampleData[{"TestImage", "Lena"}]]; MorphologicalGraph[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalGraph.html) for more details. # MorphologicalPerimeter `MorphologicalPerimeter[image]` picks out the morphological perimeter of regions of foreground in *image*. * `MorphologicalPerimeter[image, t]` treats values above *t* as foreground. Examples [#examples] ```wolfram MorphologicalPerimeter[DiskMatrix[10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalPerimeter.html) for more details. # MorphologicalTransform `MorphologicalTransform[image, f]` applies the function f to the 3×3 neighborhood of each pixel in a binary image image. * `MorphologicalTransform[image, rule]` applies a morphological transformation specified by a rule number rule. * `MorphologicalTransform[image, "name"]` uses a named transformation "name". * `MorphologicalTransform[image, transformation, n]` applies n iterations of transformation on image. Examples [#examples] Skeletonize an image: ```wolfram img = Binarize[ExampleData[{"TestImage", "Shapes"}]]; MorphologicalTransform[img, "Skeleton"] ``` Custom transformation: ```wolfram MorphologicalTransform[img, If[#[[2, 2]] == 1 && Total[#, 2] > 4, 1, 0] &] ``` Multiple iterations: ```wolfram MorphologicalTransform[img, "Thin", 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorphologicalTransform.html) for more details. # NonlocalMeansFilter `NonlocalMeansFilter[image,r]` applies a nonlocal means filter to image by comparing a range r neighborhood to its nearby neighborhoods. `NonlocalMeansFilter[image,r,ns]` assumes an additive noise power value ns for comparing neighborhoods. `NonlocalMeansFilter[image,r,ns,w]` compares neighborhoods in a range w window. Examples [#examples] Apply nonlocal means filtering to denoise an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; NonlocalMeansFilter[img, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonlocalMeansFilter.html) for more details. # Opening `Opening[image, ker]` gives the morphological opening of image with respect to the structuring element ker. `Opening[image, r]` gives the opening with respect to a range-r square. `Opening[data, ...]` applies opening to an array of data. Examples [#examples] Apply morphological opening to an image: ```wolfram Opening[image, 2] ``` Opening with a disk structuring element: ```wolfram Opening[image, DiskMatrix[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Opening.html) for more details. # PeronaMalikFilter `PeronaMalikFilter[image]` applies a Perona–Malik diffusion filter to image. `PeronaMalikFilter[image,t]` specifies the amount of diffusion time t to be applied. `PeronaMalikFilter[image,t,k]` uses a conductance parameter k. `PeronaMalikFilter[image,t,k,σ]` applies a Gaussian regularization of width σ to the image gradient in the conductance function. Examples [#examples] Apply the Perona-Malik filter to an image: ```wolfram PeronaMalikFilter[img] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PeronaMalikFilter.html) for more details. # Pruning `Pruning[image]` removes the outermost branches of thin objects in image by setting their values to black. * `Pruning[image, n]` removes branches that are at most n pixels long. * `Pruning[image, {n}]` removes n pixels from each branch. * `Pruning[image, n, t]` treats values above t as foreground. Examples [#examples] ```wolfram Pruning[Thinning[Binarize[img]], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pruning.html) for more details. # RadialGradientImage `RadialGradientImage[gcol]` returns an image with values radially changing from center to corners based on gradient color gcol. `RadialGradientImage[{pos1,pos2}->gcol]` returns an image where the gradient starts at pos1 and ends at pos2. `RadialGradientImage[…,size]` returns a radial gradient image of the specified size. `RadialGradientImage[…,size,"type"]` gives an image converted to the specified type. Examples [#examples] Create a radial gradient from white to black: ```wolfram RadialGradientImage[{White, Black}] ``` Specify the size: ```wolfram RadialGradientImage[{Red, Blue}, {200, 200}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RadialGradientImage.html) for more details. # Radon `Radon[image]` gives an image representing the discrete Radon transform of image. `Radon[image,{w,h}]` specifies the width w and the height h of the resulting image. `Radon[image,{w,h},{θ1,θ2}]` computes the Radon transform only for angles from θ1 to θ2. Examples [#examples] Compute the Radon transform of an image: ```wolfram Radon[ExampleData[{"TestImage", "Lena"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Radon.html) for more details. # RadonTransform `RadonTransform[expr, {x, y}, {p, ϕ}]` gives the Radon transform of expr. Examples [#examples] Compute a Radon transform: ```wolfram RadonTransform[Exp[-x^2 - y^2], {x, y}, {p, phi}] ``` Transform a rectangle function: ```wolfram RadonTransform[Boole[Abs[x] < 1 && Abs[y] < 1], {x, y}, {p, phi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RadonTransform.html) for more details. # RandomImage `RandomImage[max]` gives an image with pseudorandom pixel values in the range 0 to *max*. * `RandomImage[{min, max}]` generates pseudorandom pixel values in the range *min* to *max*. * `RandomImage[dist]` generates pixel values using a symbolic distribution *dist*. * `RandomImage[..., size]` generates a random image of the specified *size*. * `RandomImage[..., size, "type"]` gives an image converted to the specified *type*. Examples [#examples] ```wolfram RandomImage[1, {100, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomImage.html) for more details. # Rasterize ```wolfram Rasterize[expression_, opts___] ``` rasterizes any expression into an [Image](../Image/Image) using frontend as it is rendered in a cell. Requires Desktop App for rasterizing (no available in server mode). It literally takes a screenshot of a specific area. Blocking function. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use `RasterizeAsync` instead. Options [#options] "Window" [#window] By the default it uses [CurrentWindow](../Frontend-IO/CurrentWindow). "ExposureTime" [#exposuretime] Sets the time in seconds for possible async processes to settle down on displayed expression before the rasterization. By the default is `1`. "ImageUpscaling" [#imageupscaling] Upscales the render canvas by `_Integer` times. Default value is `1` (no upscaling, it renders as it is) Application [#application] Can be used to export graphics to raster format try ```wolfram Rasterize[x+y] ``` And then you can freely export it to an image file ```wolfram Export["image.png", %] ``` # RasterizeAsync ```wolfram RasterizeAsync[expression_, opts___] _Promise ``` async version of [Rasterize](../Image/Rasterize), that returns `Promise`. Options [#options] "Window" [#window] By the default it uses [CurrentWindow](../Frontend-IO/CurrentWindow). "ExposureTime" [#exposuretime] Sets the time in seconds for possible async processes to settle down on displayed expression before the rasterization. By the default is `1`. "ImageUpscaling" [#imageupscaling] Upscales the render canvas by `_Integer` times. Default value is `1` (no upscaling, it renders as it is) # RidgeFilter `RidgeFilter[data]` computes a measure for the presence of a ridge at every position of data. * `RidgeFilter[data, σ]` uses the specified ridge scale σ. Examples [#examples] Apply ridge detection to an image: ```wolfram RidgeFilter[ExampleData[{"TestImage", "Mandrill"}]] ``` Use a specific ridge scale: ```wolfram RidgeFilter[ExampleData[{"TestImage", "Fingerprint"}], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RidgeFilter.html) for more details. # Sharpen `Sharpen[image]` gives a sharpened version of image. * `Sharpen[image, r]` gives a version of image sharpened over pixel radius r. Examples [#examples] Sharpen an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Sharpen[img] ``` With specific radius: ```wolfram Sharpen[img, 3] ``` Strong sharpening: ```wolfram Sharpen[img, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sharpen.html) for more details. # SkeletonTransform `SkeletonTransform[image]` gives the skeleton transform of image, in which the value of each skeleton pixel is its distance to the nearest background pixel. * `SkeletonTransform[image, t]` treats values above t as foreground. Examples [#examples] Compute the skeleton transform of an image: ```wolfram img = Binarize[ExampleData[{"TestImage", "Blob"}]]; SkeletonTransform[img] ``` Apply with a custom threshold: ```wolfram SkeletonTransform[ExampleData[{"TestImage", "Fingerprint"}], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SkeletonTransform.html) for more details. # Texture ```wolfram Texture[image_] ``` wraps an [Image](../Image/Image) (or any raster data) to be used as a surface texture in [Graphics](../Graphics/Graphics) and [Graphics3D](../Graphics3D/Graphics3D) primitives. Examples [#examples] Texture on a 2D polygon [#texture-on-a-2d-polygon] Only `GraphicsComplex` is suppored for texturing in the context of `Graphics` Texture a triangle using [GraphicsComplex](../Graphics/GraphicsComplex): ```wolfram img = ExampleData[{"TestImage", "Mandrill"}]; Graphics[{ Texture[img], GraphicsComplex[{{0,0},{2,0},{1,2}}, Polygon[ {1,2,3} ], VertexTextureCoordinates -> {{0,0},{1,0},{0.5,1}}] }] ``` Texture on a 3D Sphere [#texture-on-a-3d-sphere] ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Graphics3D[{ Texture[img], Sphere[] }] ``` Texture on a 3D Cube [#texture-on-a-3d-cube] ```wolfram img = ExampleData[{"TestImage", "Mandrill"}]; Graphics3D[{ Texture[img], Cuboid[] }] ``` VertexTextureCoordinates on a 3D polygon [#vertextexturecoordinates-on-a-3d-polygon] Manually control UV mapping on a 3D quad using `VertexTextureCoordinates`: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Graphics3D[{ Texture[img], Polygon[ {{-1, -1, 0}, {1, -1, 0}, {1, 1, 0}, {-1, 1, 0}} ] }] ``` Control UV mapping explicitly using [GraphicsComplex](../Graphics/GraphicsComplex): ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Graphics3D[{ Texture[img], GraphicsComplex[ {{-1, -1, 0}, {1, -1, 0}, {1, 1, 0}, {-1, 1, 0}}, Polygon[{1, 2, 3, 4}], VertexTextureCoordinates -> {{0, 1}, {0, 0}, {1, 0}, {1, 1}} ] }] ``` Plot3D with texture as PlotStyle [#plot3d-with-texture-as-plotstyle] Use a texture image as the surface colour via `PlotStyle`: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Plot3D[Sin[x] Cos[y], {x, -Pi, Pi}, {y, -Pi, Pi}, PlotStyle -> Texture[img], Mesh -> None ] ``` ParametricPlot with texture (2D) [#parametricplot-with-texture-2d] Map a texture onto a 2D parametric curve region by supplying `Texture` through `PlotStyle`: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ParametricPlot[ {(1 + 0.3 s Cos[5 t]) Cos[t], (1 + 0.3 s Sin[5 t]) Sin[t]}, {t, 0, 2 Pi}, {s, 0, 1}, PlotStyle -> Texture[img], Mesh -> None ] ``` Texture from computed image data [#texture-from-computed-image-data] Generate a procedural texture and apply it to a 3D surface: ```wolfram data = Table[{Sin[x]^2, Cos[y]^2, 0.5}, {y, 0, Pi, Pi/99}, {x, 0, Pi, Pi/99}]; img = Image[data]; Graphics3D[{ Texture[img], Sphere[] }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Texture.html) for more details. # TopHatTransform `TopHatTransform[image, ker]` gives the morphological top-hat transform of *image* with respect to structuring element *ker*. * `TopHatTransform[image, r]` gives the top-hat transform with respect to a range-*r* square. * `TopHatTransform[data, ...]` applies top-hat transform to an array of *data*. Examples [#examples] ```wolfram TopHatTransform[DiskMatrix[20], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TopHatTransform.html) for more details. # WatershedComponents `WatershedComponents[image]` computes the watershed transform of image, returning the result as an array in which positive integers label the catchment basins. * `WatershedComponents[image, marker]` uses a binary image marker to indicate regions where basins may be created. * `WatershedComponents[video, ...]` computes watershed segmentation on frames of video. Examples [#examples] ```wolfram img = GradientFilter[ExampleData[{"TestImage", "Mandrill"}], 2]; WatershedComponents[img] // Colorize ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WatershedComponents.html) for more details. # ActiveClassification `ActiveClassification[f, {conf1, conf2, ...}]` gives an object representing the result of active classification obtained by using the function f to determine classes for the example configurations confi. `ActiveClassification[f, reg]` generates configurations within the region specified by reg. `ActiveClassification[f, sampler]` generates configurations by applying the function sampler. Examples [#examples] Perform active classification with a labeling function: ```wolfram classifier = ActiveClassification[ If[#[[1]] + #[[2]] > 1, "A", "B"] &, Rectangle[] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ActiveClassification.html) for more details. # ActiveClassificationObject `ActiveClassificationObject[...]` represents the result of an `ActiveClassification` process. Examples [#examples] Create an active classification object and query its properties: ```wolfram obj = ActiveClassification[If[# > 0.5, "A", "B"] &, {0.1, 0.9}]; obj["TrainingExamples"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ActiveClassificationObject.html) for more details. # ActivePrediction `ActivePrediction[f, {conf1, conf2, ...}]` gives an object representing the result of active prediction obtained by using the function f to determine values for the example configurations confi. `ActivePrediction[f, reg]` generates configurations within the region specified by reg. `ActivePrediction[f, sampler]` generates configurations by applying the function sampler. Examples [#examples] Perform active prediction on a region: ```wolfram predictor = ActivePrediction[Sin[#] &, {0, Pi, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ActivePrediction.html) for more details. # ActivePredictionObject `ActivePredictionObject[...]` represents the result of an `ActivePrediction` process. Examples [#examples] Create an active prediction object and query its properties: ```wolfram obj = ActivePrediction[Sin[#] &, {0, Pi, 2 Pi}]; obj["TrainingExamples"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ActivePredictionObject.html) for more details. # AggregationLayer `AggregationLayer[f]` represents a layer that aggregates an array of arbitrary rank into a vector, using the function f. `AggregationLayer[f, n]` aggregates an array at level n. `AggregationLayer[f, n1;;n2]` aggregates an array at levels n1 through n2. `AggregationLayer[f, {n1, n2, …}]` aggregates an array at levels n1, n2, …. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AggregationLayer.html) for more details. # AnomalyDetection `AnomalyDetection[{example1, example2, ...}]` generates an `AnomalyDetectorFunction[...]` based on the examples given. `AnomalyDetection[LearnedDistribution[...]]` generates an anomaly detector based on the given distribution. Examples [#examples] Train an anomaly detector: ```wolfram detector = AnomalyDetection[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}]; detector[100] (* True (anomaly) *) ``` Check if a value is anomalous: ```wolfram detector[5] (* False (normal) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AnomalyDetection.html) for more details. # AnomalyDetectorFunction `AnomalyDetectorFunction[...]` represents a function generated by `AnomalyDetection` for detecting whether data is anomalous or not. Examples [#examples] Create and use an anomaly detector function: ```wolfram detector = AnomalyDetection[RandomReal[1, 100]]; detector[0.5] (* False *) detector[10] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AnomalyDetectorFunction.html) for more details. # AppendLayer `AppendLayer[]` represents a net layer that takes an input array and appends another array to it. Examples [#examples] ```wolfram AppendLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppendLayer.html) for more details. # AttentionLayer `AttentionLayer[]` represents a trainable net layer that learns to pay attention to certain portions of its input. `AttentionLayer[net]` specifies a particular net to give scores for portions of the input. `AttentionLayer[net, opts]` includes options for weight normalization, masking and other parameters. Examples [#examples] Create an attention layer: ```wolfram AttentionLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AttentionLayer.html) for more details. # AudioIdentify `AudioIdentify[audio]` yields the result of attempting to identify what audio is a recording of. `AudioIdentify[audio, category]` restricts the identification to the specified category. `AudioIdentify[audio, category, n]` gives a list of up to n possible identifications. Examples [#examples] Identify an audio sample: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioIdentify[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioIdentify.html) for more details. # BasicRecurrentLayer `BasicRecurrentLayer[n]` represents a trainable recurrent layer that takes a sequence of vectors and produces a sequence of vectors each of size n. `BasicRecurrentLayer[n, opts]` includes options for initial weights and other parameters. Examples [#examples] Create a basic recurrent layer: ```wolfram BasicRecurrentLayer[128] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BasicRecurrentLayer.html) for more details. # BatchNormalizationLayer `BatchNormalizationLayer[]` represents a trainable net layer that normalizes its input data by learning the data mean and variance. Examples [#examples] Create a batch normalization layer: ```wolfram BatchNormalizationLayer[] ``` Add to a neural network chain: ```wolfram NetChain[{LinearLayer[10], BatchNormalizationLayer[], Ramp}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BatchNormalizationLayer.html) for more details. # CTCLossLayer `CTCLossLayer[]` represents a net layer that computes the connectionist temporal classification loss by comparing a sequence of class probability vectors with a sequence of indices representing the target classes. Examples [#examples] Create a CTC loss layer: ```wolfram CTCLossLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CTCLossLayer.html) for more details. # CatenateLayer `CatenateLayer[]` represents a net layer that takes a list of input arrays and catenates them. `CatenateLayer[n]` represents a net layer that takes a list of input arrays and catenates them at level n. Examples [#examples] Create a catenate layer and apply it to arrays: ```wolfram layer = CatenateLayer[]; layer[{{1, 2}, {3, 4, 5}}] (* {1, 2, 3, 4, 5} *) ``` Catenate at a specific level: ```wolfram layer = CatenateLayer[1]; layer[{{{1, 2}}, {{3, 4}}}] (* {{1, 2}, {3, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CatenateLayer.html) for more details. # ClassifierFunction `ClassifierFunction[...]` represents a function generated by `Classify` that classifies data into classes. Examples [#examples] Create and use a classifier: ```wolfram cf = Classify[{1 -> "small", 100 -> "large"}]; cf[50] (* "large" *) ``` Get probabilities: ```wolfram cf[25, "Probabilities"] (* <|"small" -> 0.6, "large" -> 0.4|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClassifierFunction.html) for more details. # ClassifierInformation `ClassifierInformation[classifier]` generates a report giving information on the classifier function. `ClassifierInformation[classifier, prop]` gives information associated with property prop. Examples [#examples] Get information about a classifier: ```wolfram cf = Classify[{1 -> "a", 2 -> "b", 3 -> "a"}]; ClassifierInformation[cf] ``` Get specific properties: ```wolfram ClassifierInformation[cf, "Classes"] (* {"a", "b"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClassifierInformation.html) for more details. # ClassifierMeasurements `ClassifierMeasurements[classifier, testset, prop]` gives measurements associated with property prop when classifier is evaluated on testset. `ClassifierMeasurements[classifier, testset]` yields a measurement report that can be applied to any property. Examples [#examples] Measure accuracy of a classifier: ```wolfram cf = Classify[{1 -> "a", 2 -> "b", 3 -> "a"}]; ClassifierMeasurements[cf, {1.5 -> "a", 2.5 -> "b"}, "Accuracy"] (* 1. *) ``` Get a confusion matrix: ```wolfram ClassifierMeasurements[cf, testdata, "ConfusionMatrix"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClassifierMeasurements.html) for more details. # ClassifierMeasurementsObject `ClassifierMeasurementsObject[...]` represents an object generated by `ClassifierMeasurements` that can be applied to properties. Examples [#examples] Extract accuracy from a measurements object: ```wolfram cm = ClassifierMeasurements[classifier, testData]; cm["Accuracy"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClassifierMeasurementsObject.html) for more details. # Classify `Classify[{in1 -> class1, in2 -> class2, ...}]` generates a ClassifierFunction that attempts to predict class from input examples. `Classify[data, input]` attempts to predict the output associated with input from the training examples given. `Classify[data, input, prop]` computes the specified property prop relative to the prediction. Examples [#examples] Train a simple classifier: ```wolfram cf = Classify[{"cat" -> "animal", "dog" -> "animal", "apple" -> "fruit"}] cf["banana"] (* "fruit" *) ``` Get classification probabilities: ```wolfram cf["grape", "Probabilities"] (* <|"animal" -> 0.1, "fruit" -> 0.9|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Classify.html) for more details. # ClusterClassify `ClusterClassify[data]` generates a ClassifierFunction\[…] by partitioning data into clusters of similar elements. `ClusterClassify[data,n]` generates a ClassifierFunction\[…] with n clusters. Examples [#examples] Create a classifier from clustered data: ```wolfram data = {{1, 2}, {1.1, 1.9}, {5, 6}, {5.2, 5.8}}; cf = ClusterClassify[data, 2]; cf[{1, 2}] (* 1 *) ``` Classify a new point: ```wolfram cf[{5, 6}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClusterClassify.html) for more details. # ClusteringComponents `ClusteringComponents[array]` gives an array where each element is replaced by an integer index representing its cluster. `ClusteringComponents[array, n]` finds n clusters. `ClusteringComponents[image]` finds clusters of pixels with similar values in image. Examples [#examples] Cluster a list of values: ```wolfram ClusteringComponents[{1, 1.1, 5, 5.1, 10}] (* {1, 1, 2, 2, 3} *) ``` Find 2 clusters: ```wolfram ClusteringComponents[{1, 2, 10, 11, 12}, 2] (* {1, 1, 2, 2, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClusteringComponents.html) for more details. # CompiledLayer `CompiledLayer[func]` represents a net layer whose computation is defined by the compilable function func. `CompiledLayer[func, gradientfunc]` specifies a gradient propagating function allowing the layer to be used in NetTrain. Examples [#examples] Create a simple compiled layer: ```wolfram CompiledLayer[Function[x, x^2]] (* CompiledLayer[...] *) ``` Apply a compiled layer: ```wolfram layer = CompiledLayer[Function[x, Sin[x]]]; layer[{0, Pi/2, Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompiledLayer.html) for more details. # ConstantArrayLayer `ConstantArrayLayer[]` represents a layer that has no input and produces as output a constant array. `ConstantArrayLayer[opts]` includes options for initial value of the array or output size. Examples [#examples] ```wolfram ConstantArrayLayer["Array" -> {{1, 2}, {3, 4}}] ``` ```wolfram ConstantArrayLayer["Output" -> {3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantArrayLayer.html) for more details. # ConstantPlusLayer `ConstantPlusLayer[]` represents a layer that adds a learnable bias to its input. `ConstantPlusLayer[opts]` includes options for initial bias and other parameters. Examples [#examples] Create a bias layer: ```wolfram ConstantPlusLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantPlusLayer.html) for more details. # ConstantTimesLayer `ConstantTimesLayer[]` represents a layer that multiplies its input by a learnable scaling array. `ConstantTimesLayer[opts]` includes options for initial scaling and other parameters. Examples [#examples] ```wolfram ConstantTimesLayer[] ``` ```wolfram ConstantTimesLayer["Scaling" -> {1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantTimesLayer.html) for more details. # ContrastiveLossLayer `ContrastiveLossLayer[]` represents a loss layer that computes a loss based on a distance metric and a target that specifies whether the distance should be minimized or maximized. `ContrastiveLossLayer[margin]` specifies a distance above which the loss is zero for True targets. Examples [#examples] Create a contrastive loss layer: ```wolfram ContrastiveLossLayer[1.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContrastiveLossLayer.html) for more details. # ConvolutionLayer `ConvolutionLayer[n, s]` represents a trainable convolutional net layer having n output channels and using kernels of size s to compute the convolution. `ConvolutionLayer[n, {s}]` represents a layer performing one-dimensional convolutions with kernels of size s. `ConvolutionLayer[n, {h, w}]` represents a layer performing two-dimensional convolutions with kernels of size h×w. `ConvolutionLayer[n, {h, w, d}]` represents three-dimensional convolutions with kernels of size h×w×d. Examples [#examples] Create a 2D convolutional layer: ```wolfram ConvolutionLayer[32, {3, 3}] ``` Create a 1D convolutional layer: ```wolfram ConvolutionLayer[16, {5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConvolutionLayer.html) for more details. # CumulativeFeatureImpactPlot `CumulativeFeatureImpactPlot[model,data]` plots the cumulative impact of the value of each feature in data on the result of model. `CumulativeFeatureImpactPlot[model]` estimates the feature impacts using synthetic data. `CumulativeFeatureImpactPlot[model->fname,…]` plots only the impact of the specified feature fname. `CumulativeFeatureImpactPlot[model->fname->class,…]` plots only the impact on the classification class. Examples [#examples] ```wolfram CumulativeFeatureImpactPlot[classifier, testData] ``` ```wolfram CumulativeFeatureImpactPlot[predictor -> "Age"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CumulativeFeatureImpactPlot.html) for more details. # DeconvolutionLayer `DeconvolutionLayer[n, sz]` represents a trainable deconvolutional net layer having n output channels and using kernels of size sz to compute the deconvolution. `DeconvolutionLayer[n, {s}]` represents a layer performing one-dimensional deconvolutions with kernels of size s. `DeconvolutionLayer[n, {h, w}]` represents a layer performing two-dimensional deconvolutions with kernels of size h×w. `DeconvolutionLayer[n, kernel, opts]` includes options for initial kernels and other parameters. Examples [#examples] Create a 2D deconvolution layer: ```wolfram DeconvolutionLayer[32, {3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeconvolutionLayer.html) for more details. # DotLayer `DotLayer[]` represents a net layer that takes the dot product of two or more arrays. `DotLayer[{spec1, spec2, ...}]` uses given transpose specifications for the respective inputs. Examples [#examples] Create a dot product layer: ```wolfram DotLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DotLayer.html) for more details. # DotPlusLayer `DotPlusLayer[n]` is equivalent to LinearLayer\[n] and should no longer be used. Examples [#examples] ```wolfram DotPlusLayer[5] (* LinearLayer[5] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DotPlusLayer.html) for more details. # ElementwiseLayer `ElementwiseLayer[f]` represents a net layer that applies a unary function f to every element of the input array. `ElementwiseLayer["name"]` applies the function specified by "name". Examples [#examples] ```wolfram ElementwiseLayer["ReLU"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ElementwiseLayer.html) for more details. # EmbeddingLayer `EmbeddingLayer[size,n]` represents a trainable net layer that embeds integers between 1 and n into a continuous vector space of dimension size. `EmbeddingLayer[size]` leaves the n to be inferred from context. Examples [#examples] Create an embedding layer for 1000 tokens with 128-dimensional vectors: ```wolfram EmbeddingLayer[128, 1000] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EmbeddingLayer.html) for more details. # FeatureDistance `FeatureDistance[example1,example2,extractor]` gives the distance between example1 and example2 in the feature space defined by extractor. `FeatureDistance[extractor]` represents an operator form of FeatureDistance that can be applied to a pair of examples. Examples [#examples] ```wolfram (* Distance between two images in feature space *) FeatureDistance[image1, image2, "Image"] (* Distance between text *) FeatureDistance["cat", "dog", "Word"] (* Create a distance function *) distFunc = FeatureDistance["Image"]; distFunc[img1, img2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureDistance.html) for more details. # FeatureExtract `FeatureExtract[{example1,example2,…}]` extracts features for each of the examplei using a feature extractor trained on all the examplei. * `FeatureExtract[examples,extractor]` extracts features using the specified feature extractor method. * `FeatureExtract[examples,{extractor1,extractor2,…}]` extracts features by applying the extractori in sequence. * `FeatureExtract[examples,spec->ext]` uses the extractor methods specified by ext on parts of examples specified by spec. * `FeatureExtract[examples,{spec1->ext1,spec2->ext2,…}]` uses the extractor methods exti on parts of examples specified by the speci. Examples [#examples] ```wolfram (* Extract features from images *) FeatureExtract[{img1, img2, img3}] (* Use PCA for dimensionality reduction *) FeatureExtract[data, {"StandardizedVector", "PCA"}] (* Extract features from text *) FeatureExtract[{"hello", "world", "test"}, "TFIDF"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureExtract.html) for more details. # FeatureExtraction `FeatureExtraction[{example1,example2,…}]` generates a FeatureExtractorFunction\[…] trained from the examples given. * `FeatureExtraction[examples,extractor]` uses the specified feature extractor method. * `FeatureExtraction[examples,{extractor1,extractor2,…}]` applies the extractori in sequence to generate a feature extractor. * `FeatureExtraction[examples,spec->ext]` uses the extractor methods specified by ext on parts of examples specified by spec. * `FeatureExtraction[examples,{spec1->ext1,spec2->ext2,…}]` uses the extractor methods exti on parts of examples specified by the speci. * `FeatureExtraction[examples,extractor,props]` gives the feature extraction properties specified by props. Examples [#examples] ```wolfram (* Train a feature extractor on data *) extractor = FeatureExtraction[{img1, img2, img3}] (* Apply to new data *) extractor[newImage] (* Use PCA with 3 components *) FeatureExtraction[data, {"StandardizedVector", {"PCA", 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureExtraction.html) for more details. # FeatureExtractorFunction `FeatureExtractorFunction[…]` represents a feature extractor function generated by FeatureExtraction. Examples [#examples] ```wolfram (* Create a feature extractor function *) extractor = FeatureExtraction[{img1, img2, img3}] (* Apply it to new data *) extractor[newImage] (* Apply to multiple examples *) extractor[{img4, img5, img6}] (* Get properties *) extractor["FeatureTypes"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureExtractorFunction.html) for more details. # FeatureNearest `FeatureNearest[{elem1,elem2,…},x]` gives the list of elemi to which x is nearest in a computed feature space. * `FeatureNearest[{elem1->v1,elem2->v2,…},x]` gives the vi corresponding to the elemi to which x is nearest. * `FeatureNearest[{elem1,elem2,…}->{v1,v2,…},x]` gives the same result. * `FeatureNearest[{elem1,elem2,…}->prop,x]` gives the property prop for the elemi to which x is nearest. * `FeatureNearest[data,{x1,x2,…}]` effectively gives \{FeatureNearest\[data,x1],FeatureNearest\[data,x2],…}. * `FeatureNearest[data,x,n]` gives the n nearest elemi to x. * `FeatureNearest[data]` generates a NearestFunction\[…] that can be applied repeatedly to different x. Examples [#examples] ```wolfram (* Find nearest images *) FeatureNearest[{img1, img2, img3, img4}, queryImage] (* Find 3 nearest elements *) FeatureNearest[images, queryImage, 3] (* Create a nearest function *) nearFunc = FeatureNearest[images]; nearFunc[newImage] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureNearest.html) for more details. # FeatureValueDependencyPlot `FeatureValueDependencyPlot[model,data]` plots the dependency of the result of model on the value of a particular feature in data. * `FeatureValueDependencyPlot[model]` estimates the feature value dependency using synthetic data. * `FeatureValueDependencyPlot[model->fname,…]` plots only the dependency on the specified feature fname. * `FeatureValueDependencyPlot[model->fname->class,…]` plots only the dependency on the classification class. Examples [#examples] ```wolfram (* Visualize feature dependencies *) classifier = Classify[trainingData]; FeatureValueDependencyPlot[classifier, testData] (* Focus on a specific feature *) FeatureValueDependencyPlot[classifier -> "age", testData] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureValueDependencyPlot.html) for more details. # FeatureValueImpactPlot `FeatureValueImpactPlot[model,data]` plots the impact of the value of a given feature in data on the result of model. * `FeatureValueImpactPlot[model]` estimates the feature value impact using synthetic data. * `FeatureValueImpactPlot[model->fname,…]` plots only the impact of the specified feature fname. * `FeatureValueImpactPlot[model->fname->class,…]` plots only the impact on the classification class. Examples [#examples] ```wolfram (* Visualize feature impact *) classifier = Classify[trainingData]; FeatureValueImpactPlot[classifier, testData] (* Impact of a specific feature *) FeatureValueImpactPlot[classifier -> "income", testData] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FeatureValueImpactPlot.html) for more details. # FindAnomalies `FindAnomalies[{example1,example2,…}]` gives a list of the examplei that are considered anomalous with respect to the other examples. * `FindAnomalies[examples,prop]` gives the specified property related to the anomaly computation. * `FindAnomalies[examples,{prop1,prop2,…}]` gives the properties propi. * `FindAnomalies[fun,data]` finds anomalies in data using the given AnomalyDetectorFunction\[…] or LearnedDistribution\[…]. * `FindAnomalies[fun,data,props]` gives properties related to the anomaly computation. Examples [#examples] ```wolfram (* Find anomalies in numeric data *) data = {1, 2, 2, 3, 100, 2, 3, 1}; FindAnomalies[data] (* Get anomaly positions *) FindAnomalies[data, "AnomalyPositions"] (* Find anomalies in images *) FindAnomalies[imageList] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindAnomalies.html) for more details. # FindClusters `FindClusters[{e1, e2, ...}]` partitions the elements into clusters of similar elements. `FindClusters[data, n]` partitions data into n clusters. Examples [#examples] Cluster numerical data: ```wolfram FindClusters[{1, 2, 10, 11, 100, 101}] (* {{1, 2}, {10, 11}, {100, 101}} *) ``` Specify number of clusters: ```wolfram FindClusters[RandomReal[1, {20, 2}], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindClusters.html) for more details. # FindFormula `FindFormula[data]` finds a pure function that approximates data. * `FindFormula[data,x]` finds a symbolic function of the variable x that approximates data. * `FindFormula[data,x,n]` finds up to n functions that approximate data. * `FindFormula[data,x,n,prop]` returns up to n best functions associated with property prop. * `FindFormula[data,x,n,{prop1,prop2,…}]` returns up to n best functions associated with properties prop1, prop2, etc. Examples [#examples] ```wolfram (* Find a formula from data *) data = Table[{x, x^2 + 2x}, {x, 0, 5}]; FindFormula[data, x] (* Find multiple candidate formulas *) FindFormula[data, x, 3] (* Get specific properties *) FindFormula[data, x, 1, "BIC"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindFormula.html) for more details. # FindGeneratingFunction `FindGeneratingFunction[{a0,a1,…},x]` attempts to find a simple generating function in x whose nth series coefficient is an. `FindGeneratingFunction[{{n0,a0},{n1,a1},…},x]` attempts to find a simple generating function whose nith series coefficient is ai. Examples [#examples] ```wolfram (* Find generating function for Fibonacci numbers *) FindGeneratingFunction[{1, 1, 2, 3, 5, 8, 13}, x] (* Find generating function for factorial *) FindGeneratingFunction[{1, 1, 2, 6, 24, 120}, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindGeneratingFunction.html) for more details. # FindHiddenMarkovStates `FindHiddenMarkovStates[data,hmm]` finds the most likely hidden states of the HiddenMarkovProcess hmm corresponding to the emissions data. `FindHiddenMarkovStates[data,hmm,crit]` uses the given criterion crit to find the hidden states. Examples [#examples] Find hidden states from emission data: ```wolfram hmm = HiddenMarkovProcess[{0.5, 0.5}, {{0.7, 0.3}, {0.4, 0.6}}, {{0.9, 0.1}, {0.2, 0.8}}]; data = {1, 1, 2, 1, 2}; FindHiddenMarkovStates[data, hmm] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindHiddenMarkovStates.html) for more details. # FindSequenceFunction `FindSequenceFunction[{a1, a2, a3, ...}]` attempts to find a simple function that yields the sequence an when given successive integer arguments. `FindSequenceFunction[list, n]` gives the function applied to n. Examples [#examples] Find a sequence formula: ```wolfram FindSequenceFunction[{1, 4, 9, 16, 25}] (* #1^2 & *) ``` Apply to n: ```wolfram FindSequenceFunction[{1, 1, 2, 3, 5, 8}, n] (* Fibonacci[n] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindSequenceFunction.html) for more details. # FunctionLayer `FunctionLayer[f]` represents a net layer that applies function f to its input. Examples [#examples] Create a function layer that applies ReLU: ```wolfram FunctionLayer[Ramp] ``` Apply a custom function: ```wolfram layer = FunctionLayer[#^2 &]; layer[{1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FunctionLayer.html) for more details. # GatedRecurrentLayer `GatedRecurrentLayer[n]` represents a trainable recurrent layer that takes a sequence of vectors and produces a sequence of vectors each of size n. * `GatedRecurrentLayer[n, opts]` includes options for initial weights and other parameters. Examples [#examples] Create a GRU layer with 64 hidden units: ```wolfram GatedRecurrentLayer[64] ``` Use in a neural network: ```wolfram NetChain[{GatedRecurrentLayer[32], LinearLayer[10]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GatedRecurrentLayer.html) for more details. # ImageAugmentationLayer `ImageAugmentationLayer[{h, w}]` represents a net layer that applies random image transformations to produce images of height h and width w. Examples [#examples] ```wolfram ImageAugmentationLayer[{224, 224}] ``` ```wolfram ImageAugmentationLayer[{128, 128}, "Rotation" -> 15 Degree] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageAugmentationLayer.html) for more details. # ImageIdentify `ImageIdentify[image]` attempts to identify what image is a picture of. `ImageIdentify[image, category]` restricts identification to objects within the specified category. Examples [#examples] Identify an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; ImageIdentify[img] (* Entity["Concept", "Woman::..."] *) ``` Get multiple candidates: ```wolfram ImageIdentify[img, All, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ImageIdentify.html) for more details. # InstanceNormalizationLayer `InstanceNormalizationLayer[]` is equivalent to `NormalizationLayer[]`. Examples [#examples] ```wolfram InstanceNormalizationLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InstanceNormalizationLayer.html) for more details. # LinearLayer `LinearLayer[n]` represents a trainable, fully connected net layer that computes w\.x+b with output vector of size n. * `LinearLayer[{n1, n2, ...}]` represents a layer that outputs an array of dimensions n1×n2×.... * `LinearLayer[]` leaves the dimensions of the output array to be inferred from context. * `LinearLayer[n, opts]` includes options for initial weights and other parameters. Examples [#examples] Create a linear layer with 10 outputs: ```wolfram LinearLayer[10] ``` Multi-dimensional output: ```wolfram LinearLayer[{5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearLayer.html) for more details. # LocalResponseNormalizationLayer `LocalResponseNormalizationLayer[]` represents a net layer that normalizes its input by averaging across neighboring input channels. Examples [#examples] Create a local response normalization layer: ```wolfram LocalResponseNormalizationLayer[] ``` Apply to input data: ```wolfram layer = LocalResponseNormalizationLayer[]; layer[RandomReal[1, {5, 10, 10}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalResponseNormalizationLayer.html) for more details. # LongShortTermMemoryLayer `LongShortTermMemoryLayer[n]` represents a trainable recurrent layer that takes a sequence of vectors and produces a sequence of vectors, each of size n. * `LongShortTermMemoryLayer[n, opts]` includes options for weights and other parameters. Examples [#examples] Create an LSTM layer with output size 5: ```wolfram LongShortTermMemoryLayer[5] ``` Build a sequence classification network: ```wolfram net = NetChain[{LongShortTermMemoryLayer[32], SequenceLastLayer[], LinearLayer[10], SoftmaxLayer[]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongShortTermMemoryLayer.html) for more details. # NearestNeighborG `NearestNeighborG[pdata,r]` estimates the nearest neighbor function G(r) at radius r in the point data pdata. `NearestNeighborG[pproc,r]` computes G(r) for the point process pproc. `NearestNeighborG[bdata,r]` computes G(r) for binned data bdata. `NearestNeighborG[pspec]` generates the function G that can be applied repeatedly to different radii r. Examples [#examples] Estimate the nearest neighbor function for random points: ```wolfram pts = RandomReal[1, {100, 2}]; NearestNeighborG[pts, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NearestNeighborG.html) for more details. # NearestNeighborGraph `NearestNeighborGraph[{elem1,elem2,...}]` gives a graph with vertices elem1,elem2,... and edges connecting each elemi to its nearest neighbors. `NearestNeighborGraph[{elem1,elem2,...},k]` gives a graph connecting each elemi to its k nearest neighbors. `NearestNeighborGraph[{elem1,elem2,...},{k,r}]` gives a graph connecting each elemi to at most k nearest vertices within radius r of elemi. `NearestNeighborGraph[{elem1,elem2,...},{All,r}]` gives a graph connecting each elemi to all vertices within radius r of elemi. Examples [#examples] Create a nearest neighbor graph from 2D points: ```wolfram NearestNeighborGraph[RandomReal[1, {10, 2}], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NearestNeighborGraph.html) for more details. # NetAppend `NetAppend[net, layer]` appends a layer or a net onto a `NetChain`, a layer or a `NetGraph` with one output port. * `NetAppend[net, "name" -> layer]` appends a layer with a given name. * `NetAppend[net, {layer1, layer2, ...}]` appends several layers or nets. Examples [#examples] ```wolfram NetAppend[LinearLayer[10], SoftmaxLayer[]] ``` ```wolfram NetAppend[NetChain[{LinearLayer[5]}], "output" -> ReshapeLayer[{5, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetAppend.html) for more details. # NetArray `NetArray[]` represents an array in a net. `NetArray["name"]` uses "name" as an identifier to share the array in more than one layer. `NetArray[prop -> value]` specifies the property prop for the array. `NetArray[<|"Name" -> name, "Array" -> array, …|>]` specifies several properties for the array. Examples [#examples] Create a named array to share weights: ```wolfram NetArray["shared"] ``` Specify array initialization: ```wolfram NetArray["Weights", "Array" -> RandomReal[{-1, 1}, {10, 5}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetArray.html) for more details. # NetArrayLayer `NetArrayLayer[]` represents a layer that has no input and produces as output a constant array. * `NetArrayLayer[opts]` includes options for the initial value of the array or output size. This layer is useful for creating learnable constant parameters in neural networks. Examples [#examples] ```wolfram NetArrayLayer["Output" -> 3] ``` ```wolfram NetArrayLayer["Array" -> {1, 2, 3}] ``` ```wolfram NetInitialize[NetArrayLayer["Output" -> {2, 3}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetArrayLayer.html) for more details. # NetBidirectionalOperator `NetBidirectionalOperator[net]` represents a net that applies net to a sequence and to its reverse, concatenating both results into one output sequence. * `NetBidirectionalOperator[{fnet, bnet}]` uses fnet on the normal input and bnet on the reversed input. * `NetBidirectionalOperator[nets, agg]` aggregates the two output sequences using the specified aggregation function. Examples [#examples] ```wolfram NetBidirectionalOperator[LongShortTermMemoryLayer[10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetBidirectionalOperator.html) for more details. # NetChain `NetChain[{layer1, layer2, ...}]` specifies a neural net in which the output of layeri is connected to the input of layeri+1. Examples [#examples] Create a simple neural network chain: ```wolfram net = NetChain[{LinearLayer[10], Tanh, LinearLayer[5]}] ``` With named layers: ```wolfram net = NetChain[<|"fc1" -> LinearLayer[64], "relu" -> Ramp, "fc2" -> LinearLayer[10]|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetChain.html) for more details. # NetDecoder `NetDecoder["name"]` represents a decoder that takes a net representation and decodes it into an expression of a given form. * `NetDecoder[{"name", ...}]` represents a decoder with additional parameters specified. Examples [#examples] ```wolfram NetDecoder["Class", {"cat", "dog", "bird"}] ``` ```wolfram NetDecoder[{"Image", {224, 224}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetDecoder.html) for more details. # NetDelete `NetDelete[net, n]` deletes the nth layer from a `NetChain` or `NetGraph`. * `NetDelete[net, "name"]` deletes a named layer. * `NetDelete[net, {spec1, spec2, ...}]` deletes several layers simultaneously. * `NetDelete[graph, NetPort["name"]]` deletes an output or state-input port from a `NetGraph`. * `NetDelete[graph, {NetPort[name1], NetPort[name2], ...}]` deletes several output or state-input ports simultaneously. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[], Ramp, LinearLayer[]}]; NetDelete[net, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetDelete.html) for more details. # NetDrop `NetDrop[chain, n]` removes the first n layers from a `NetChain`. * `NetDrop[chain, -n]` removes the last n layers from a `NetChain`. * `NetDrop[chain, {start, end}]` drops the layers between start and end in a `NetChain`. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[], Ramp, LinearLayer[], Ramp}]; NetDrop[net, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetDrop.html) for more details. # NetEncoder `NetEncoder["name"]` represents an encoder that takes a given form of input and encodes it as an array for use in a net. * `NetEncoder[{"name", ...}]` represents an encoder with additional parameters specified. Examples [#examples] ```wolfram NetEncoder["Image"] ``` ```wolfram NetEncoder[{"Image", 224}] ``` ```wolfram NetEncoder[{"Class", {"cat", "dog", "bird"}}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetEncoder.html) for more details. # NetExternalObject `NetExternalObject[...]` represents a net model in an external framework format. This is used for importing and exporting neural network models from frameworks like ONNX. Examples [#examples] ```wolfram NetExternalObject["model.onnx"] ``` ```wolfram Import["model.onnx", "NetExternalObject"] ``` ```wolfram NetImport["external_model.onnx"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetExternalObject.html) for more details. # NetExtract `NetExtract[layer, "param"]` extracts the value of a parameter for the specified net layer. * `NetExtract[net, lspec]` extracts the layer identified by lspec from within the NetGraph or NetChain object net. * `NetExtract[net, {lspec, "param"}]` extracts the value of the parameter param from the layer identified by lspec in net. * `NetExtract[net, NetArray[spec]]` extracts the value of a shared array within a network or layer. * `NetExtract[coder, "param"]` extracts the value of a parameter for the specified NetEncoder or NetDecoder. * `NetExtract[..., {spec1, spec2, ...}]` extracts a set of elements, where each speci is a list. Examples [#examples] Extract weights from a layer: ```wolfram layer = LinearLayer[3, "Input" -> 5]; layer = NetInitialize[layer]; NetExtract[layer, "Weights"] ``` Extract a layer from a chain: ```wolfram net = NetChain[{LinearLayer[10], Ramp, LinearLayer[5]}]; NetExtract[net, 2] ``` Extract biases: ```wolfram NetExtract[NetInitialize[LinearLayer[5]], "Biases"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetExtract.html) for more details. # NetFlatten `NetFlatten[net]` collapses nested NetChain and NetGraph objects within net. * `NetFlatten[net, n]` collapses up to nesting level n. Examples [#examples] Flatten a nested network: ```wolfram NetFlatten[NetChain[{NetChain[{LinearLayer[], Ramp}], LinearLayer[]}]] ``` Flatten to specific level: ```wolfram NetFlatten[net, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetFlatten.html) for more details. # NetFoldOperator `NetFoldOperator[net]` represents a net in which net is folded over a sequence of inputs, maintaining a recurrent state. `NetFoldOperator[net,{outi->in1,…}]` represents a net in which net is folded over its inputs, maintaining a recurrent state by feeding the outi of each step back to the ini of the next step. `NetFoldOperator[net,feedback,{const1,const2,…}]` treats the inputs consti to net as being constant instead of mapped over. `NetFoldOperator[net,feedback,constants,{out1,…}]` returns the sequence of values for the specific outputs outi. Examples [#examples] Create a fold operator with a GRU: ```wolfram NetFoldOperator[GatedRecurrentLayer[10]] ``` Fold over a sequence: ```wolfram NetFoldOperator[BasicRecurrentLayer[5]][RandomReal[1, {10, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetFoldOperator.html) for more details. # NetGANOperator `NetGANOperator[{generator, discriminator}]` represents a network to perform generative adversarial network (GAN) training with a generative net generator and a classification net discriminator. * `NetGANOperator[{generator, discriminator}, loss]` specifies the loss type to be used. Examples [#examples] ```wolfram NetGANOperator[{generatorNet, discriminatorNet}] ``` ```wolfram NetGANOperator[{gen, disc}, "WassersteinLoss"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetGANOperator.html) for more details. # NetGraph `NetGraph[{layer1, layer2, ...}, {m1 -> n1, m2 -> n2, ...}]` specifies a neural net defined by a graph in which the output of layer mi is given as input to layer ni. `NetGraph[<|name1 -> layer1, name2 -> layer2, ...|>, {namem1 -> namen1, ...}]` specifies a net with explicitly named layers. `NetGraph[layer]` converts a layer or a `NetChain` into an equivalent minimal `NetGraph`. Examples [#examples] ```wolfram NetGraph[{LinearLayer[10], Ramp, LinearLayer[5]}, {1 -> 2, 2 -> 3}] (* NetGraph[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetGraph.html) for more details. # NetInformation `NetInformation[net]` gives a report about the neural network net. * `NetInformation[net, "prop"]` gives the value of property "prop" of net. * `NetInformation[{net1, net2, ...}, "prop"]` gives a list containing the result for each neti. Examples [#examples] Get information about a network: ```wolfram NetInformation[NetChain[{LinearLayer[10], Ramp}]] ``` Get specific property: ```wolfram NetInformation[NetChain[{LinearLayer[10]}], "ParameterCount"] ``` List all properties: ```wolfram NetInformation[NetChain[{LinearLayer[10]}], "Properties"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetInformation.html) for more details. # NetInitialize `NetInitialize[net]` gives a net in which all uninitialized learnable parameters have been given initial values. * `NetInitialize[net, All]` reinitializes all learnable parameters. Examples [#examples] ```wolfram NetInitialize[NetChain[{LinearLayer[10], Ramp, LinearLayer[5]}]] ``` ```wolfram NetInitialize[untrainedNet, All] ``` ```wolfram net = NetInitialize[NetChain[{5, Tanh, 3}], Method -> "Xavier"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetInitialize.html) for more details. # NetInsert `NetInsert[chain, layer, i]` inserts a layer into a NetChain before the layer at position i. * `NetInsert[chain, "name" -> layer, "pos"]` inserts a named layer into a NetChain before the layer at the given position. This function adds layers to an existing neural network chain. Examples [#examples] ```wolfram chain = NetChain[{LinearLayer[10], Ramp}]; NetInsert[chain, BatchNormalizationLayer[], 2] ``` ```wolfram NetInsert[NetChain[{LinearLayer[5], SoftmaxLayer[]}], DropoutLayer[], 2] ``` ```wolfram NetInsert[chain, "bn" -> BatchNormalizationLayer[], 2] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetInsert.html) for more details. # NetInsertSharedArrays `NetInsertSharedArrays[net]` converts all ordinary arrays in net into `NetSharedArray` objects. * `NetInsertSharedArrays[net, "prefix"]` uses a prefix for the names of all newly shared arrays. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[10], LinearLayer[5]}]; NetInsertSharedArrays[net] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetInsertSharedArrays.html) for more details. # NetJoin `NetJoin[net1, net2, ...]` connects a series of NetChain or NetGraph objects to form a single NetChain or NetGraph. Examples [#examples] Join two networks: ```wolfram NetJoin[NetChain[{LinearLayer[10]}], NetChain[{SoftmaxLayer[]}]] ``` Combine encoder and decoder: ```wolfram NetJoin[encoder, decoder] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetJoin.html) for more details. # NetMapOperator `NetMapOperator[net]` represents a net in which net is mapped over a sequence of inputs to give a sequence of outputs. Examples [#examples] ```wolfram NetMapOperator[LinearLayer[10]] ``` ```wolfram NetMapOperator[ElementwiseLayer["ReLU"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetMapOperator.html) for more details. # NetMapThreadOperator `NetMapThreadOperator[mapnet]` represents a net in which mapnet is mapped over one or more inputs to give one or more outputs. * `NetMapThreadOperator[mapnet, n]` represents a net in which mapnet is mapped over its inputs at depth n. * `NetMapThreadOperator[mapnet, <|input1 -> n1, input2 -> n2, ...|>]` represents a net in which mapnet is mapped over the input named inputi at depth ni, and all other inputs are replicated. This operator is useful for applying a neural network across sequences or batches. Examples [#examples] ```wolfram NetMapThreadOperator[LinearLayer[5]] ``` ```wolfram net = NetMapThreadOperator[LinearLayer[3], 1]; net[RandomReal[1, {4, 10}]] ``` ```wolfram NetMapThreadOperator[ElementwiseLayer["ReLU"], 2] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetMapThreadOperator.html) for more details. # NetMeasurements `NetMeasurements[net, data, measurement]` computes the requested *measurement* for the net evaluated on *data*. * `NetMeasurements[net, data, {mspec1, mspec2, ...}]` computes a list of measurements for the net evaluated on data. Examples [#examples] ```wolfram NetMeasurements[trainedNet, testData, "Accuracy"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetMeasurements.html) for more details. # NetModel `NetModel["name"]` obtains a neural net model with the specified name from the Neural Net Repository. `NetModel[{"name",param1->setting1,…}]` obtains a specified model from a parameterized family of models. `NetModel[model,"prop"]` gives property prop of the model. `NetModel[]` gives a dataset of available pre-trained neural net models. Examples [#examples] Load a pre-trained model: ```wolfram net = NetModel["LeNet Trained on MNIST Data"] ``` List available models: ```wolfram NetModel[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetModel.html) for more details. # NetNestOperator `NetNestOperator[net, n]` represents a net in which net is applied n times to the input. This operator creates a network that iteratively applies the same network multiple times. Examples [#examples] ```wolfram NetNestOperator[LinearLayer[5], 3] ``` ```wolfram op = NetNestOperator[ElementwiseLayer[Tanh], 2]; op[{1, 2, 3}] ``` ```wolfram NetNestOperator[NetChain[{LinearLayer[10], Ramp}], 4] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetNestOperator.html) for more details. # NetPairEmbeddingOperator `NetPairEmbeddingOperator[net]` represents a net that takes a pair of arrays, embeds them into a vector space using net, and outputs the distance under the embedding. * `NetPairEmbeddingOperator[net, opts]` includes options for distance function to use and other parameters. This is used for similarity learning and metric learning tasks. Examples [#examples] ```wolfram NetPairEmbeddingOperator[LinearLayer[10]] ``` ```wolfram NetPairEmbeddingOperator[NetChain[{LinearLayer[20], Ramp, LinearLayer[10]}], DistanceFunction -> CosineDistance] ``` ```wolfram NetPairEmbeddingOperator[encoder, "DistanceFunction" -> EuclideanDistance] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetPairEmbeddingOperator.html) for more details. # NetPort `NetPort["port"]` represents the specified input or output port for a complete net. `NetPort[{n,"port"}]` represents the specified port for layer number n in a NetGraph or similar construct. `NetPort[{"name","port"}]` represents the specified port for the layer with the specified name. `NetPort[spec,port]` is treated as equivalent to `NetPort[{spec,port}]`. `NetPort[{spec1,spec2,…,"port"}]` permits access to the port of nested layers in a NetGraph or a NetChain. `NetPort[All,"States"]` represents the set of all states in a net associated with recurrent layers such as `LongShortTermMemoryLayer`. Examples [#examples] ```wolfram NetPort["Input"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetPort.html) for more details. # NetPortGradient `NetPortGradient["port"]` represents the gradient of the output of a net with respect to the value of the specified input port. `NetPortGradient["param"]` represents the gradient of the output with respect to a learned parameter named param. `NetPortGradient[{layer1,layer2,…,"param"}]` represents the gradient with respect to a parameter at a specific position in a net. `NetPortGradient[All]` represents the gradients with respect to all inputs and parameters. Examples [#examples] Get gradient with respect to an input port: ```wolfram NetPortGradient["Input"] (* NetPortGradient["Input"] *) ``` Get gradients for all inputs and parameters: ```wolfram NetPortGradient[All] (* NetPortGradient[All] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetPortGradient.html) for more details. # NetPrepend `NetPrepend[net, layer]` prepends a layer or a net onto a `NetChain`, a layer or a `NetGraph` with one input port. * `NetPrepend[net, "name" -> layer]` appends a layer with a given name. * `NetPrepend[net, {layer1, layer2, ...}]` prepends several layers or nets. Examples [#examples] ```wolfram NetPrepend[LinearLayer[10], LinearLayer[5]] ``` ```wolfram NetPrepend[NetChain[{LinearLayer[10]}], ElementwiseLayer[Tanh]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetPrepend.html) for more details. # NetRename `NetRename[net, "old" -> "new"]` gives a net in which the name old for a layer is replaced with new. * `NetRename[net, NetPort["old"] -> NetPort["new"]]` gives a net in which the name old for an input or output port is replaced with new. * `NetRename[net, {rule1, rule2, ...}]` performs all renamings specified by the rulei. * `NetRename[net, f]` uses a function f to map existing layer names to new names. * `NetRename[net, rules, levelspec]` renames layers and ports nested at level levelspec. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[10], Ramp}, "layer1", "layer2"]; NetRename[net, "layer1" -> "input_layer"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetRename.html) for more details. # NetReplace `NetReplace[net, patt -> layer]` gives a net in which all layers matching patt are replaced with layer. * `NetReplace[net, {rule1, rule2, …}]` performs all replacements specified by the rulei. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[10], Tanh, LinearLayer[5]}]; NetReplace[net, Tanh -> Ramp] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetReplace.html) for more details. # NetReplacePart `NetReplacePart[layer, "array" -> value]` replaces an array within a layer, returning a new layer. * `NetReplacePart[net, "port" -> type]` returns a new layer or network in which an input or output port has the specified type. * `NetReplacePart[net, "input" -> encoder]` attaches a NetEncoder\[…] to a specified input port. * `NetReplacePart[net, "output" -> decoder]` attaches a NetDecoder\[…] to a specified output port. * `NetReplacePart[net, lspec -> layer]` returns a new NetChain or NetGraph in which the layer identified by lspec has been replaced. * `NetReplacePart[net, NetArray[name] -> value]` sets a shared array within a network or layer to a specified value. * `NetReplacePart[coder, "param" -> value]` returns a new NetEncoder\[…] or NetDecoder\[…] in which a parameter has been replaced. * `NetReplacePart[net, {lspec, pspec} -> value]` makes a replacement of a part pspec of a layer or coder lspec within a NetGraph or NetChain. * `NetReplacePart[..., {spec1 -> val1, spec2 -> val2, ...}]` makes multiple simultaneous replacements. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[10], LinearLayer[5]}]; NetReplacePart[net, "Input" -> 20] ``` ```wolfram NetReplacePart[LinearLayer[], "Weights" -> RandomReal[1, {10, 5}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetReplacePart.html) for more details. # NetSharedArray `NetSharedArray["name"]` represents an array in a net that is shared by more than one layer. Examples [#examples] Create a network with a shared array: ```wolfram net = NetGraph[ {LinearLayer[], LinearLayer[]}, {1 -> 2}, "Weights" -> NetSharedArray["sharedWeights"] ] ``` Access shared arrays in a network: ```wolfram NetExtract[trainedNet, "sharedWeights"] ``` Initialize shared arrays: ```wolfram NetInitialize[net, All, "Weights" -> NetSharedArray["w"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetSharedArray.html) for more details. # NetStateObject `NetStateObject[net]` creates an object derived from net that represents a neural net with additional stored state information that is updated when the net is applied to data. * `NetStateObject[net, seed]` initializes stored state using seed. Examples [#examples] ```wolfram NetStateObject[recurrentNet] ``` ```wolfram stateObj = NetStateObject[net, 1234]; stateObj[input] ``` ```wolfram NetStateObject[LongShortTermMemoryLayer[10]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetStateObject.html) for more details. # NetTake `NetTake[net, end]` takes only those layers up to end in a NetChain or NetGraph. * `NetTake[net, {start, end}]` takes only layers between start and end. Examples [#examples] ```wolfram NetTake[trainedNet, 5] ``` ```wolfram NetTake[net, {"input", "conv3"}] ``` ```wolfram NetTake[NetModel["ResNet-50"], {1, 10}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetTake.html) for more details. # NetTrain `NetTrain[net, {input1 -> output1, input2 -> output2, ...}]` trains the specified neural net by giving the inputi as input and minimizing the discrepancy between the outputi and the actual output of the net, using an automatically chosen loss function. * `NetTrain[net, <|port1 -> {data11, data12, ...}, port2 -> {...}, ...|>]` trains the specified net by supplying training data at the specified ports. * `NetTrain[net, "dataset"]` trains on a named dataset from the Wolfram Data Repository. * `NetTrain[net, f]` calls the function f during training to produce batches of training data. * `NetTrain[net, data, "prop"]` gives data associated with a specific property prop of the training session. * `NetTrain[net, data, All]` gives a `NetTrainResultsObject[...]` that summarizes information about the training session. Examples [#examples] ```wolfram net = NetChain[{LinearLayer[10], Ramp, LinearLayer[1]}]; trained = NetTrain[net, {Range[10] -> 1, Range[10, 20] -> 2}] ``` ```wolfram NetTrain[NetChain[{5, Ramp, 1}], data, MaxTrainingRounds -> 100] ``` ```wolfram NetTrain[net, trainingData, All]["FinalLoss"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetTrain.html) for more details. # NetTrainResultsObject `NetTrainResultsObject[...]` represents an object generated by NetTrain that contains the trained net and other information about the training process. Examples [#examples] Train and get results object: ```wolfram data = {1 -> 1, 2 -> 2, 3 -> 3}; result = NetTrain[LinearLayer[], data, All] ``` Extract the trained net: ```wolfram result["TrainedNet"] ``` Get training history: ```wolfram result["LossEvolutionPlot"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetTrainResultsObject.html) for more details. # NetUnfold `NetUnfold[fnet]` produces the elementary net of the folded net fnet, exposing the recurrent states. This is used to access the internal structure of recurrent networks. Examples [#examples] ```wolfram NetUnfold[NetFold[recurrentCell]] ``` ```wolfram NetUnfold[trainedRNN] ``` ```wolfram unfoldedNet = NetUnfold[NetModel["...RNN..."]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetUnfold.html) for more details. # NetworkPacketCapture `NetworkPacketCapture[]` creates a temporary interactive interface for capturing information on network packets transmitted or received through all network interfaces on your computer. * `NetworkPacketCapture[service]` captures only packets associated with the specified network service. * `NetworkPacketCapture[port]` captures only packets associated with the specified port. * `NetworkPacketCapture[spec]` captures only packets matching the specification spec. Examples [#examples] ```wolfram NetworkPacketCapture[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetworkPacketCapture.html) for more details. # NetworkPacketRecording `NetworkPacketRecording[t]` records information on network packets transmitted or received through all network interfaces on your computer for t seconds. `NetworkPacketRecording[t,service]` records only packets associated with the specified network service. `NetworkPacketRecording[t,port]` records only packets associated with the specified port. `NetworkPacketRecording[t,{port1,port2,…}]` records only packets associated with any of the ports porti. `NetworkPacketRecording[t,spec]` records only packets matching the specification spec. Examples [#examples] Record packets for 5 seconds: ```wolfram NetworkPacketRecording[5] ``` Record only HTTP traffic: ```wolfram NetworkPacketRecording[5, "HTTP"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetworkPacketRecording.html) for more details. # NetworkPacketTrace `NetworkPacketTrace[expr]` evaluates expr and returns information on network packets transmitted or received through all network interfaces during the evaluation. * `NetworkPacketTrace[expr, service]` records only packets associated with the specified network service. * `NetworkPacketTrace[expr, port]` records only packets associated with the specified port. * `NetworkPacketTrace[expr, {port1, port2, ...}]` records only packets associated with any of the ports. * `NetworkPacketTrace[expr, spec]` records only packets matching the specification spec. Examples [#examples] Trace network packets during a URL fetch: ```wolfram NetworkPacketTrace[URLRead["https://www.wolfram.com"]] ``` Trace only HTTP traffic: ```wolfram NetworkPacketTrace[URLRead["https://www.wolfram.com"], "HTTP"] ``` Trace packets on a specific port: ```wolfram NetworkPacketTrace[URLRead["https://www.wolfram.com"], 443] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NetworkPacketTrace.html) for more details. # PaddingLayer `PaddingLayer[{{m1,n1},{m2,n2},…}]` represents a net layer that pads an input array with mi elements at the beginning and ni elements at the end at level i of the array. Examples [#examples] Create a padding layer: ```wolfram PaddingLayer[{{1, 1}, {2, 2}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PaddingLayer.html) for more details. # ParametricRampLayer `ParametricRampLayer[]` represents a net layer that computes a leaky ReLU activation with a slope that can be learned. * `ParametricRampLayer[levels]` specifies the levels on which each dimension has a specific slope. Examples [#examples] Create a parametric ramp layer: ```wolfram ParametricRampLayer[] ``` Specify levels: ```wolfram ParametricRampLayer[{2, 3}] ``` Use in a neural network: ```wolfram NetChain[{LinearLayer[10], ParametricRampLayer[], LinearLayer[2]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricRampLayer.html) for more details. # PartLayer `PartLayer[i]` represents a net layer that gives the ith part of the input. `PartLayer[i;;j]` gives parts i through j. `PartLayer[i;;j;;k]` gives parts i through j in steps of k. `PartLayer[{spec1,spec2,…}]` takes part speci at level i in the input. Examples [#examples] Extract the second element from input: ```wolfram PartLayer[2] ``` Extract elements 2 through 4: ```wolfram PartLayer[2;;4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PartLayer.html) for more details. # PlaceholderLayer `PlaceholderLayer[]` represents a net layer whose operation is undefined. * `PlaceholderLayer["tag", assoc]` indicates a tag and information given by the association assoc. Examples [#examples] ```wolfram PlaceholderLayer[] ``` ```wolfram PlaceholderLayer["conv", <|"Input" -> {3, 28, 28}|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlaceholderLayer.html) for more details. # PoolingLayer `PoolingLayer[sz]` represents a pooling net layer using kernels of size sz. `PoolingLayer[{w}]` represents a layer performing one-dimensional pooling with kernels of size w. `PoolingLayer[{h, w}]` represents a layer performing two-dimensional pooling with kernels of size h×w. `PoolingLayer[{h, w, d}]` represents a layer performing three-dimensional pooling with kernels of size h×w×d. `PoolingLayer[kernel, stride]` represents a layer that uses stride as the step size between kernel applications. `PoolingLayer[kernel, opts]` includes options for other pooling methods, padding and other parameters. Examples [#examples] ```wolfram PoolingLayer[{2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoolingLayer.html) for more details. # Predict `Predict[{in1->out1,in2->out2,…}]` generates a PredictorFunction that attempts to predict outi from the example ini. `Predict[data,input]` attempts to predict the output associated with input from the training examples given. `Predict[data,input,prop]` computes the specified property prop relative to the prediction. Examples [#examples] Train a predictor on example data: ```wolfram p = Predict[{1 -> 1, 2 -> 4, 3 -> 9, 4 -> 16}] (* PredictorFunction[...] *) ``` Use the predictor: ```wolfram p[5] (* 25. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Predict.html) for more details. # PredictorFunction `PredictorFunction[...]` represents a function generated by `Predict` that predicts numerical values from data. Examples [#examples] Create a predictor and use it: ```wolfram p = Predict[{1 -> 2, 2 -> 4, 3 -> 6}]; p[4] (* 8. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PredictorFunction.html) for more details. # PredictorInformation `PredictorInformation[predictor]` generates a report giving information on the predictor function predictor. * `PredictorInformation[predictor, prop]` gives information for predictor associated with property prop. Examples [#examples] Get information about a predictor: ```wolfram p = Predict[trainingData]; PredictorInformation[p] ``` Get a specific property: ```wolfram PredictorInformation[p, "Method"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PredictorInformation.html) for more details. # PredictorMeasurements `PredictorMeasurements[predictor, testset, prop]` gives measurements associated with the property *prop* when *predictor* is evaluated on *testset*. * `PredictorMeasurements[predictor, testset]` yields a measurement report that can be applied to any property. * `PredictorMeasurements[data, ...]` use predictions *data* instead of a predictor. * `PredictorMeasurements[..., {prop1, prop2, ...}]` gives properties *prop1*, *prop2*, etc. Examples [#examples] ```wolfram PredictorMeasurements[trainedPredictor, testData, "RSquared"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PredictorMeasurements.html) for more details. # PredictorMeasurementsObject `PredictorMeasurementsObject[...]` represents an object generated by `PredictorMeasurements` that can be applied to properties. Examples [#examples] Get measurements from a predictor: ```wolfram predictor = Predict[{1 -> 2, 2 -> 4, 3 -> 6}]; measurements = PredictorMeasurements[predictor, {4 -> 8, 5 -> 10}] (* PredictorMeasurementsObject[...] *) measurements["RSquared"] (* 1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PredictorMeasurementsObject.html) for more details. # RandomArrayLayer `RandomArrayLayer[dist]` represents a net layer that has no input and produces a random array from the univariate distribution dist. * `RandomArrayLayer[dfunc]` uses the univariate distribution dfunc\[input] for each input value. Examples [#examples] ```wolfram RandomArrayLayer[NormalDistribution[]] ``` ```wolfram RandomArrayLayer[UniformDistribution[], "Output" -> {3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomArrayLayer.html) for more details. # ReplicateLayer `ReplicateLayer[n]` represents a net layer that takes an input of dimensions \{d1, d2, …} and replicates it n times to produce an output of dimensions \{n, d1, d2, …}. * `ReplicateLayer[{n1, n2, …, nm}]` represents a net layer that takes an input of dimensions \{d1, d2, …} and replicates it to produce an output of dimensions \{n1, n2, …, nm, d1, d2, …}. * `ReplicateLayer[dims, m]` replicates so that dims appears at position m in the list of output dimensions. Examples [#examples] ```wolfram ReplicateLayer[5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReplicateLayer.html) for more details. # ReshapeLayer `ReshapeLayer[spec]` represents a net layer that reshapes the input array according to the specification spec. Examples [#examples] ```wolfram ReshapeLayer[{2, 3}] ``` ```wolfram ReshapeLayer[{4, 4}][RandomReal[1, {2, 8}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReshapeLayer.html) for more details. # ResizeLayer `ResizeLayer[{d}]` represents a layer performing one-dimensional resizing of a two-dimensional array. `ResizeLayer[{d1, …, dn}]` represents a layer performing n-dimensional resizing of a (n+1)-dimensional array. Examples [#examples] Create a resize layer for image scaling: ```wolfram ResizeLayer[{64, 64}] ``` Apply a resize layer to an image: ```wolfram layer = ResizeLayer[{32, 32}]; layer[RandomImage[1, {100, 100}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ResizeLayer.html) for more details. # SequenceAttentionLayer `SequenceAttentionLayer[]` is equivalent to `AttentionLayer[]` with a single "Input" port instead of ports "Key" and "Value". It should no longer be used. * `SequenceAttentionLayer[net]` is equivalent to `AttentionLayer[net]` with a single "Input" port instead of ports "Key" and "Value". It should no longer be used. Examples [#examples] ```wolfram (* Use AttentionLayer[] instead *) AttentionLayer[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceAttentionLayer.html) for more details. # SequenceIndicesLayer `SequenceIndicesLayer[]` represents a net layer that produces a list of indices for an input sequence. Examples [#examples] Create a sequence indices layer: ```wolfram layer = SequenceIndicesLayer[]; layer[{a, b, c}] ``` Use in a neural network: ```wolfram NetChain[{SequenceIndicesLayer[], LinearLayer[10]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceIndicesLayer.html) for more details. # SequenceLastLayer `SequenceLastLayer[]` represents a net that takes a sequence of inputs and returns the last element of the sequence. Examples [#examples] ```wolfram net = NetChain[{LongShortTermMemoryLayer[10], SequenceLastLayer[]}]; net[RandomReal[1, {5, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceLastLayer.html) for more details. # SequenceMostLayer `SequenceMostLayer[]` represents a net that takes a sequence of inputs and removes its last element. Examples [#examples] Create a sequence most layer: ```wolfram SequenceMostLayer[] ``` Use in a neural network: ```wolfram NetChain[{SequenceMostLayer[], SummationLayer[]}] ``` Apply to sequence data: ```wolfram net = NetInitialize[SequenceMostLayer[]]; net[{{1, 2}, {3, 4}, {5, 6}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceMostLayer.html) for more details. # SequencePredict `SequencePredict[{seq1, seq2, …}]` generates a `SequencePredictorFunction[…]` based on the sequences given. * `SequencePredict[training, seq]` attempts to predict the next element in the sequence seq from the training sequences given. * `SequencePredict[training, {seq1, seq2, …}]` gives predictions for each of the sequences seqi. * `SequencePredict["name", seq]` uses the built-in sequence predictor represented by "name". * `SequencePredict[…, seq, prop]` gives the specified property of the prediction associated with seq. Examples [#examples] ```wolfram predictor = SequencePredict[{"abc", "abd", "abe"}]; predictor["ab"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequencePredict.html) for more details. # SequencePredictorFunction `SequencePredictorFunction[…]` represents a function generated by SequencePredict that predicts the next elements from a sequence. Examples [#examples] Create a sequence predictor and use it: ```wolfram p = SequencePredict[{{1, 2, 3, 4}, {2, 4, 6, 8}}] p[{1, 2, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequencePredictorFunction.html) for more details. # SequenceRestLayer `SequenceRestLayer[]` represents a net that takes a sequence of inputs and removes its first element. Examples [#examples] Create a sequence rest layer: ```wolfram SequenceRestLayer[] ``` Use in a neural network: ```wolfram NetChain[{SequenceRestLayer[], SummationLayer[]}] ``` Apply to sequence data: ```wolfram net = NetInitialize[SequenceRestLayer[]]; net[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceRestLayer.html) for more details. # SequenceReverseLayer `SequenceReverseLayer[]` represents a net that reverses the order of an input sequence. This layer is used in neural networks to reverse temporal or sequential data. Examples [#examples] ```wolfram SequenceReverseLayer[] ``` ```wolfram layer = SequenceReverseLayer[]; layer[{{1, 2, 3}, {4, 5, 6}}] ``` ```wolfram NetChain[{SequenceReverseLayer[], LongShortTermMemoryLayer[10]}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceReverseLayer.html) for more details. # SoftmaxLayer `SoftmaxLayer[]` represents a softmax net layer. * `SoftmaxLayer[n]` represents a softmax net layer that uses level n as the normalization dimension. The softmax layer normalizes inputs to a probability distribution, commonly used as the final layer in classification networks. Examples [#examples] ```wolfram SoftmaxLayer[] ``` ```wolfram layer = SoftmaxLayer[]; layer[{1, 2, 3}] ``` ```wolfram (* Softmax along a specific dimension *) SoftmaxLayer[1][{{1, 2}, {3, 4}}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SoftmaxLayer.html) for more details. # SpatialTransformationLayer `SpatialTransformationLayer[{h, w}]` represents a net layer that applies an affine transformation to an input of size c×h₀×w₀ and returns an output of size c×h×w. Examples [#examples] Create a spatial transformation layer: ```wolfram SpatialTransformationLayer[{32, 32}] ``` Use in a neural network for image transformation: ```wolfram net = NetChain[{SpatialTransformationLayer[{64, 64}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialTransformationLayer.html) for more details. # SpeechRecognize `SpeechRecognize[audio]` recognizes speech in audio and returns it as a string. * `SpeechRecognize[audio, level]` returns a list of strings at the specified structural level. * `SpeechRecognize[audio, level, prop]` returns prop for text at the given level. Examples [#examples] ```wolfram SpeechRecognize[audioObj] ``` ```wolfram SpeechRecognize[Audio["speech.wav"], "Word"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpeechRecognize.html) for more details. # SynthesizeMissingValues `SynthesizeMissingValues[{example1, example2, ...}]` replaces missing values in each example by generated values. * `SynthesizeMissingValues[dist, data]` uses the distribution dist to generate values. Examples [#examples] Fill missing values: ```wolfram SynthesizeMissingValues[{{1, 2, Missing[]}, {4, Missing[], 6}}] ``` With specific distribution: ```wolfram SynthesizeMissingValues[NormalDistribution[], {1, Missing[], 3, Missing[]}] ``` Dataset with missing values: ```wolfram SynthesizeMissingValues[Dataset[{<|"a" -> 1, "b" -> Missing[]|>}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SynthesizeMissingValues.html) for more details. # ThreadingLayer `ThreadingLayer[f]` represents a net layer that takes several input arrays and applies a function f to corresponding array elements. * `ThreadingLayer[f, bspec]` allows array shapes to be conformed according to broadcasting specification bspec. Examples [#examples] Element-wise addition: ```wolfram ThreadingLayer[Plus] ``` Element-wise multiplication: ```wolfram ThreadingLayer[Times] ``` In a network: ```wolfram net = NetChain[{LinearLayer[10], ThreadingLayer[Ramp]}]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ThreadingLayer.html) for more details. # UnitVectorLayer `UnitVectorLayer[n]` represents a net layer that transforms integers between 1 and n into n-dimensional unit vectors. `UnitVectorLayer[]` leaves the n to be inferred from context. Examples [#examples] Create a unit vector layer: ```wolfram UnitVectorLayer[5] ``` Apply to an input: ```wolfram UnitVectorLayer[5][3] (* {0., 0., 1., 0., 0.} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitVectorLayer.html) for more details. # Assert ```wolfram Assert[test] ``` represents the assertion that `test` is [True](https://reference.wolfram.com/language/ref/True.html). If assertions have been enabled, `test` is evaluated when the assertion is encountered. If `test` is not [True](https://reference.wolfram.com/language/ref/True.html), then an assertion failure is generated. ```wolfram Assert[test, tag] ``` specifies a tag that will be used to identify the assertion if it fails. Debugging [#debugging] Manual [#manual] Turn on warning messages ```wolfram On[Assert] ``` Generate a failure ```wolfram Assert[False] ``` Automatic [#automatic] Use it together with a [build-in debugger](./../Guides/Command-palette) to interrupt evaluation. # Async Reference on event objects Reference on promises </Cards> Utils [#utils] SetTimeout [#settimeout] Spawns an asynchronous task (a wrapper over `ScheduledTask`) that evaluates an expression once. ```wolfram SetTimeout[expr_, interval_Real | interval_Quantity] _TaskObject ``` This symbol has the `HoldFirst` attribute. The `interval` is specified in **milliseconds** or as a `Quantity` object. To cancel it, use: ```wolfram CancelTimeout[_TaskObject] ``` SetInterval [#setinterval] Spawns an asynchronous task (a wrapper over `ScheduledTask`) that evaluates an expression every `interval` **milliseconds**. ```wolfram SetInterval[expr_, interval_Real | interval_Quantity] _TaskObject ``` This symbol has the `HoldFirst` attribute. To cancel this task, use: ```wolfram TaskRemove[_TaskObject] ``` or ```wolfram CancelInterval[_TaskObject] ``` PauseAsync [#pauseasync] Works similarly to `Pause`, but returns a [Promise](../Misc/Promise). ```wolfram Then[PauseAsync[3], Beep]; ``` TableAsync [#tableasync] Works similarly to `Table`, but the inner expression can be an implicit `AsyncFunction`. ```wolfram n = EvaluationCell[]; TableAsync[ PauseAsync[1] // Await; i , {i,3}] // WaitAll ``` DoAsync [#doasync] Works in the same way as `TableAsync`. More [#more] There are more expressions in the standard library that support async programming patterns: * Any `EventObject`: [InputButton](../GUI/InputButton) and etc * [FrontFetchAsync](../Frontend-IO/FrontFetchAsync) * [ChoiceDialogAsync](../Frontend-IO/ChoiceDialogAsync) * [SystemDialogInputAsync](../Frontend-IO/SystemDialogInputAsync) * [`ParallelSubmitAsync`](../Misc/Parallel) * [`ParallelSubmitFunctionAsync`](../Misc/Parallel) * [ExportAsync](../Misc/ExportAsync) * [RasterizeAsync](../Image/RasterizeAsync) * **Any symbol named as** `*Async` Asynchronous Functions [#asynchronous-functions] An advanced guide on promises, async-await methods </Cards> AsyncFunction [#asyncfunction] Works similarly to `Function`. ```wolfram AsyncFunction[args, body] _Promise ``` You can use it as a normal function while utilizing the [`Await`](#`Await`) keyword. Behind the scenes, it restructures the `body` at runtime. Await [#await] Pauses execution (non-blocking to threads) until the promise is resolved and returns the result. ```wolfram Await[_ | _Promise] _ ``` If the argument is not a `Promise`, execution continues without pausing and the argument is returned unchanged. **Supported expressions:** * `Set` * `CompoundExpression` * `If` * `Module`, `With` * `_Symbol` or any other singular expressions * `TableAsync` * `DoAsync` * `PauseAsync` * Any expression that returns `Promise` or `EventObject` **Not yet supported:** * Loops: `While`, `For`, `Do` * `Await` inside the first argument of `With` * Tables and maps: `Map`, `Table` * `Return` does not work correctly inside `AsyncFunction` For example: ```wolfram btn = InputButton[] Then[AsyncFunction[x, Module[{res}, Speak["Click to start"]; btn // Await; Speak["Choose"]; res = ChoiceDialogAsync["Add 10?"] // Await; If[res, x + 10, x] ]][10], Speak]; ``` # EchoLabel ```wolfram EchoLabel[label_][expr_] ``` is operator form of `Echo` with a label. ```wolfram EchoLabel["Test"]["This is normal one"]; ``` Print to notifications: ```wolfram EchoLabel["Notification"]["This will always appear at the top"]; ``` **Warning** messages: ```wolfram EchoLabel["Warning"]["This will a warning"]; ``` **Error** message: ```wolfram EchoLabel["Error"]["This will an error"]; ``` **Spinner**: ```wolfram spinner = EchoLabel["Spinner"]["Hey. I am spinning"]; ``` ```wolfram spinner["Cancel"]; ``` **Progress bar**: ```wolfram bar = EchoLabel["ProgressBar"]["I am progressing"]; ``` ```wolfram bar["Set", 0.5]; ``` ```wolfram bar["SetMessage", "Hey!"]; ``` ```wolfram bar["Cancel"]; ``` # Events A guide on how to handle user interaction with sliders, graphics primitives and other input building blocks Reference on promises </Cards> EventObject [#eventobject] A complete representation of event-object with its initial data and possible decorative representation ```wolfram EventObject[<|"Id"->_String, "Initial"->_, "View"->_|>] ``` Actual binding happens with only `"Id"` field, therefore a string equivalent is also valid to use. To generate a new unique object, one can also use this constructor ```wolfram newEvent = EventObject[] ``` *string equivalent* ```wolfram newEvent = CreateUUID[] ``` To define `EventObject` with a provided Id ```wolfram existingEvent = EventObject["eventId"] ``` *string equivalent* ```wolfram existingEvent = "eventId" ``` "Initial" [#initial] Stores initial data, which makes sense if an event object was produced by some sliders, toggle switches or other UI elements. If an event was joined with other event, `"Initial"` data will be merged as well depending on its original structure. If an event object is used in [`EventFire`](#`EventFire`) with no data provided, `"Initial"` field will be used instead as a payload. "View" [#view] Provides a view-component which is rendered on output. Usually if it has been generated by some UI component, a button or a slider is displayed on output, that fires event using a provided `"Id"`. Inheritable properties [#inheritable-properties] There is only a single field `"Initial"` that can be merged or copied under [`EventClone`](#`EventClone`) and `Join` or [`EventJoin`](#`EventJoin`) operations. Non-inheritable properties [#non-inheritable-properties] `"Id"`, `"View"` cannot be copied under [`EventJoin`](#`EventJoin`), [`EventClone`](#`EventClone`) and `Join` operations. EventHandler [#eventhandler] Binds an event object represented as a string or [`EventObject`](#`EventObject`) or anything compatible with this type to a single or multiple handling functions (multiple - only **if patterns do not intersect**) ```wolfram EventHandler[ev_String | _EventObject, {handlers___Rule | handlers___RuleDelayed}] ``` where `handlers` is a sequence of rules (straight or delayed), which are applied to any incoming message. Each rule represents a normal WL pattern to mach a message generated by [`EventFire`](#`EventFire`). There is a simpler version as well, which is indifferent to patterns ```wolfram EventHandler[ev_String | _EventObject, handler_] ``` which is effectively ```wolfram EventHandler[ev_String | _EventObject, {_ -> handler_}] ``` **Only a single handler function can be assign to an event object per pattern**. If you need multiple handlers (chain) to be assigned to the same event and pattern - clone your event firstly using [`EventClone`](#`EventClone`) Return value [#return-value] It is optional, but any `handler` can return any non-Null expression, which will be presented as a return value of `EventFire` expression. Example [#example] The simples case scenario ```wolfram EventHandler["ev", Print]; EventFire["ev", "Hello World!"]; ``` or using different patterns ```wolfram EventHandler["ev", { "Case 1" -> Print, "Case 2" -> Echo, any_String :> Function[data, Echo[StringJoin["Undefined case: ", any]]] }]; EventFire["ev", "Case 1", "Hello World!"]; EventFire["ev", "Case 2", "Hello World!"]; EventFire["ev", "Case 3", "Hello World!"]; ``` Any Wolfram Expression is valid as a pattern EventClone [#eventclone] Clones event object and returns a new one, keeping all previous assigned handlers on another copy of it ```wolfram EventClone[ev_String | _EventObject] _EventObject ``` Multiple calls on the same `ev` makes a chain of new event objects connected to it. Once [`EventFire`](#`EventFire`) is called on `ev`, it will sequentially fire all cloned events in a chain. EventRemove [#eventremove] Removes all handlers from a given event object ```wolfram EventRemove[ev_String | _EventObject] ``` or ```wolfram Delete[ev_EventObject] ``` Remove a specific pattern: ```wolfram EventRemove[ev_String | _EventObject, pattern_] ``` is also valid. *Removing a cloned event only removes handlers from the cloned event object* EventJoin [#eventjoin] Joins two independent events into a new one merging their `"Initial"` values as well ```wolfram EventJoin[ev__String | __EventObject] _EventObject ``` however ```wolfram Join[ev__EventObject] _EventObject ``` is also valid. It does not clone original objects, i.e. after joining they become invalid EventFire [#eventfire] Fires an event with provided data and pattern ```wolfram EventFire[ev_String | _EventObject, data_] _ EventFire[ev_String | _EventObject, pattern_, data_] _ ``` or for a complete event object representation ```wolfram EventFire[ev_EventObject] _ ``` it takes `"Initial"` field as `data`. Effectively if `pattern` is not provided `"Default"` pattern is used instead. # Language LeakyModule [#leakymodule] A variation of `Module`, which comes with its own garbage collector, that prevents symbols from being garbage collected by WL ```wolfram LeakyModule[symbols_List, expr_, opts___] _ ``` The only difference compared to traditional `Module` is an optional argument * `"Garbage" :> _List` a held symbol, that points to a list. Then a user can manually purge them. AbortableTable [#abortabletable] `AbortableTable[expr, iter1, iter2, ...]` generates a list of values from expr over the given iterators. If evaluation is aborted before completion, AbortableTable returns the partial results collected up to that point instead of discarding them. For example: ```wolfram AbortableTable[ Pause[1]; i^2 , {i, 10}] ``` # Let > Written by [Leonid Shifrin](https://github.com/lshifr) ```wolfram Let[{vars__}, expr_] ``` A `With`-like construction that allows recursive assignments, like `Let*` in scheme. For example: ```wolfram Let[{ a = 1, b = a + 1 }, b ] ``` # Parallel Reference on promises </Cards> ParallelSubmitAsync [#parallelsubmitasync] Submits and expression for evaluation to any available parallel kernel and returns [Promise](../Misc/Promise) with the result ```wolfram ParallelSubmitAsync[expr_] _Promise ``` Launch parallel Kernels beforehand using `LaunchKernels[n_Integer]` ```wolfram Then[ ParallelSubmitAsync[URLRead["http://google.com"]], Function[result, Beep[]; page = result] ]; ``` The downloaded page will appear in a global symbol `page`. To share the definitions of any symbol from your main evaluation Kernel use `DistributeDefinitions[sym_ | "ContextName"]`. ParallelSubmitFunctionAsync [#parallelsubmitfunctionasync] Similar to the previous one, but allows an inner expression make callback manually ```wolfram ParallelSubmitFunctionAsync[f_, args__] _Promise ``` For example ```wolfram Then[ ParallelSubmitFunctionAsync[ Function[{url, cbk}, With[{data = URLRead["http://google.com"]}, cbk[data]; ]; ], "http://google.com" ], Function[result, Beep[]; page = result] ]; ``` # Promise Reference on event objects </Cards> The `Promise` object represents the eventual completion (or failure) of an asynchronous operation and its resulting value. Promise [#promise] A constructor and also a derived class of [`EventObject`](../Misc/Events) which **can be fired only once** (aka resolved or rejected) even before a corresponding event handler is attached ```wolfram Promise[] _Promise (* constructor *) ``` To resolve or reject a promise - use [`EventFire`](../Misc/Events) ```wolfram EventFire[p_Promise, Resolve | Reject, data_] ``` `Promise` is actively used in **async functions**. See more at [Async](../Misc/Async) Then [#then] An expression for asynchronous subscribing to promise resolution or rejection ```wolfram Then[p_Promise | _List | _, resolve_] Then[p_Promise | _List | _, resolve_, reject_] ``` where `resolve` and `reject` are any arbitrary functions, usually, non-blocking functions. The key difference between [`EventHandler`](../Misc/Events) and [`Then`](#`Then`) is that [`Then`](#`Then`) **can even be applied to already resolved** `Promise` object (after it was fired), which will cause an immediate evaluation of `resolve` or `reject` functions. Being applied to a `List` of `_Promise` objects it will wait until all of them are resolved before evaluating `resolve` function and will return the list of results. Any Wolfram Expressions, which is not a `List` of `Promise` **counts as resolved**, i.e. this is valid: ```wolfram Then[1+1, Function[result, Print]]; ``` ```wolfram p = Promise[]; Then[{1+1, p}, Function[result, Print]]; Pause[3]; EventFire[p, Resolve, 43]; ``` Example [#example] Let's try with a multiple promise events ```wolfram p1 = Promise[]; p2 = Promise[]; SetTimeout[EventFire[p1, Resolve, Null], 1000]; SetTimeout[EventFire[p2, Resolve, Null], 1500]; Then[{p1,p2,Null}, Function[Null, Echo["Resolved!"]; ]]; ``` Here `Null` as a last element of a list was used just for demonstration purposes. It can also be any non `_Promise | _List` expression. Relation to EventObject [#relation-to-eventobject] ```wolfram Then[e_EventObject, resolve_] ``` It effectively assigns an event handler to `e` and calls `resolve` on **any pattern captured**. WaitAll [#waitall] A **synchronous blocking function** to wait until a promise has resolved and returns the result ```wolfram WaitAll[p_Promise] _ ``` ```wolfram WaitAll[p_Promise, timeout_:15] _ ``` There is **a timeout of 15 seconds**, then `$Failed` is returned. `WaitAll` is a blocking function. Avoid to use in `SessionSubmit`, `BackgroundTask`, or any other event handlers or asynchronous functions! # Adjugate `Adjugate[m]` gives the adjugate (classical adjoint) of a square matrix m. Examples [#examples] Adjugate of a 2x2 matrix: ```wolfram Adjugate[{{a, b}, {c, d}}] (* {{d, -b}, {-c, a}} *) ``` Relation to inverse: ```wolfram m = {{1, 2}, {3, 4}}; Adjugate[m] == Det[m] * Inverse[m] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Adjugate.html) for more details. # AntihermitianMatrixQ `AntihermitianMatrixQ[m]` gives `True` if m is explicitly antihermitian, and `False` otherwise. Examples [#examples] Test if a matrix is antihermitian: ```wolfram AntihermitianMatrixQ[{{0, I}, {-I, 0}}] (* True *) ``` Non-antihermitian matrix: ```wolfram AntihermitianMatrixQ[{{1, 2}, {3, 4}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AntihermitianMatrixQ.html) for more details. # AntisymmetricMatrixQ `AntisymmetricMatrixQ[m]` gives `True` if m is explicitly antisymmetric, and `False` otherwise. Examples [#examples] Test if a matrix is antisymmetric: ```wolfram AntisymmetricMatrixQ[{{0, 1}, {-1, 0}}] (* True *) ``` A symmetric matrix is not antisymmetric: ```wolfram AntisymmetricMatrixQ[{{1, 2}, {2, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AntisymmetricMatrixQ.html) for more details. # ArrayFlatten `ArrayFlatten[{{m11, m12, ...}, {m21, m22, ...}, ...}]` creates a single flattened matrix from a matrix of matrices mij. `ArrayFlatten[a, r]` flattens out r pairs of levels in the array a. Examples [#examples] Flatten a block matrix: ```wolfram ArrayFlatten[{{{{1, 2}}, {{3, 4}}}, {{{5, 6}}, {{7, 8}}}}] (* {{1, 2, 3, 4}, {5, 6, 7, 8}} *) ``` Create a block diagonal matrix: ```wolfram ArrayFlatten[{{IdentityMatrix[2], 0}, {0, IdentityMatrix[3]}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayFlatten.html) for more details. # ArrayPad `ArrayPad[array, m]` gives an array with m zeros of padding on every side. `ArrayPad[array, m, padding]` uses the specified padding. `ArrayPad[array, {m, n}]` pads with m elements at the beginning and n at the end. Examples [#examples] Pad a list with zeros: ```wolfram ArrayPad[{1, 2, 3}, 2] (* {0, 0, 1, 2, 3, 0, 0} *) ``` Pad with a specific value: ```wolfram ArrayPad[{1, 2, 3}, 1, x] (* {x, 1, 2, 3, x} *) ``` Asymmetric padding: ```wolfram ArrayPad[{1, 2, 3}, {1, 3}] (* {0, 1, 2, 3, 0, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayPad.html) for more details. # ArrayQ `ArrayQ[expr]` gives `True` if expr is a full array or a `SparseArray` object, and gives `False` otherwise. `ArrayQ[expr, patt]` requires expr to be a full array with a depth that matches the pattern patt. `ArrayQ[expr, patt, test]` requires also that test yield `True` when applied to each of the array elements in expr. Examples [#examples] Check if an expression is an array: ```wolfram ArrayQ[{{1, 2}, {3, 4}}] (* True *) ``` Check for numeric arrays: ```wolfram ArrayQ[{{1, 2}, {3, a}}, _, NumericQ] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayQ.html) for more details. # ArrayReshape `ArrayReshape[list, dims]` arranges the elements of list into a rectangular array with dimensions dims. `ArrayReshape[list, dims, padding]` uses the specified padding if list does not contain enough elements. Examples [#examples] Reshape a flat list into a matrix: ```wolfram ArrayReshape[Range[6], {2, 3}] (* {{1, 2, 3}, {4, 5, 6}} *) ``` Reshape with padding: ```wolfram ArrayReshape[{1, 2, 3}, {2, 3}, 0] (* {{1, 2, 3}, {0, 0, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayReshape.html) for more details. # ArrayRules `ArrayRules[SparseArray[...]]` gives the rules \{pos1 -> val1, pos2 -> val2, ...} specifying elements in a sparse array. `ArrayRules[list]` gives rules for `SparseArray[list]`. Examples [#examples] Get rules from a sparse array: ```wolfram sa = SparseArray[{{1, 2} -> 1, {2, 1} -> 2}]; ArrayRules[sa] (* {{1, 2} -> 1, {2, 1} -> 2, {_, _} -> 0} *) ``` Convert a list to sparse array rules: ```wolfram ArrayRules[{{1, 0}, {0, 2}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayRules.html) for more details. # Band `Band[{i, j}]` represents the sequence of positions on the diagonal band that starts with \{i, j} in a sparse array. `Band[{imin, jmin, ...}, {imax, jmax, ...}]` represents the positions between \{imin, jmin, ...} and \{imax, jmax, ...}. `Band[{imin, jmin, ...}, {imax, jmax, ...}, {di, dj, ...}]` represents positions starting with \{imin, jmin, ...} and then moving with step \{di, dj, ...}. Examples [#examples] Create a diagonal matrix: ```wolfram SparseArray[Band[{1, 1}] -> {a, b, c}] (* diagonal matrix with a, b, c on the diagonal *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Band.html) for more details. # BlockDiagonalMatrix `BlockDiagonalMatrix[{d1, d2, ...}]` represents the block diagonal matrix with diagonal blocks di as a structured array. `BlockDiagonalMatrix[mat]` converts the block diagonal matrix mat to a structured array. Examples [#examples] Create a block diagonal matrix: ```wolfram BlockDiagonalMatrix[{{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}] ``` View as normal matrix: ```wolfram Normal[BlockDiagonalMatrix[{{{1, 0}, {0, 1}}, {{2}}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html) for more details. # CDFWavelet `CDFWavelet[]` represents a Cohen–Daubechies–Feauveau wavelet of type "9/7". `CDFWavelet["type"]` represents a Cohen–Daubechies–Feauveau wavelet of type "type". Examples [#examples] Create a CDF 9/7 wavelet: ```wolfram CDFWavelet[] ``` Create a CDF 5/3 wavelet: ```wolfram CDFWavelet["5/3"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CDFWavelet.html) for more details. # CauchyMatrix `CauchyMatrix[x, y]` represents the Cauchy matrix given by the generating vectors x and y as a structured array. `CauchyMatrix[x]` is equivalent to CauchyMatrix\[x, x]. `CauchyMatrix[cmat]` converts a Cauchy matrix cmat to a structured array. Examples [#examples] Create a Cauchy matrix: ```wolfram CauchyMatrix[{1, 2, 3}, {4, 5, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CauchyMatrix.html) for more details. # CharacteristicPolynomial `CharacteristicPolynomial[m, x]` gives the characteristic polynomial for the matrix m. Examples [#examples] Characteristic polynomial: ```wolfram CharacteristicPolynomial[{{1, 2}, {3, 4}}, x] (* -5 - 5 x + x^2 *) ``` Roots give eigenvalues: ```wolfram Solve[CharacteristicPolynomial[{{1, 2}, {3, 4}}, x] == 0, x] (* {{x -> (5 - Sqrt[33])/2}, {x -> (5 + Sqrt[33])/2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CharacteristicPolynomial.html) for more details. # CholeskyDecomposition `CholeskyDecomposition[m]` gives the Cholesky decomposition of a positive definite matrix m. Examples [#examples] Cholesky decomposition: ```wolfram CholeskyDecomposition[{{4, 2}, {2, 5}}] (* {{2, 1}, {0, 2}} *) ``` Verify L.L^T = M: ```wolfram l = CholeskyDecomposition[{{4, 12}, {12, 37}}]; Transpose[l] . l (* {{4, 12}, {12, 37}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CholeskyDecomposition.html) for more details. # ConjugateTranspose `ConjugateTranspose[m]` gives the conjugate transpose (Hermitian transpose) of a matrix m. Examples [#examples] Conjugate transpose of a complex matrix: ```wolfram ConjugateTranspose[{{1, 2 + I}, {3, 4 I}}] (* {{1, 3}, {2 - I, -4 I}} *) ``` For real matrices, same as transpose: ```wolfram ConjugateTranspose[{{1, 2}, {3, 4}}] (* {{1, 3}, {2, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConjugateTranspose.html) for more details. # ConstantArray `ConstantArray[c, n]` generates a list of n copies of the element c. `ConstantArray[c, {n1, n2, ...}]` generates a nested array of copies of c. Examples [#examples] Create a list of repeated elements: ```wolfram ConstantArray[x, 5] (* {x, x, x, x, x} *) ``` Create a matrix of zeros: ```wolfram ConstantArray[0, {2, 3}] (* {{0, 0, 0}, {0, 0, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConstantArray.html) for more details. # Coproduct `Coproduct[x, y, ...]` displays as x∐y∐.... Examples [#examples] Display coproduct notation: ```wolfram Coproduct[a, b, c] (* a∐b∐c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Coproduct.html) for more details. # CoreNilpotentDecomposition `CoreNilpotentDecomposition[m]` yields the core-nilpotent decomposition of a square matrix m. `CoreNilpotentDecomposition[m, format]` returns the core-nilpotent decomposition according to the specified format. Examples [#examples] Decompose a matrix: ```wolfram CoreNilpotentDecomposition[{{1, 2}, {0, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoreNilpotentDecomposition.html) for more details. # Cross `Cross[a, b]` gives the vector cross product of a and b. Examples [#examples] Cross product of 3D vectors: ```wolfram Cross[{1, 0, 0}, {0, 1, 0}] (* {0, 0, 1} *) ``` ```wolfram Cross[{1, 2, 3}, {4, 5, 6}] (* {-3, 6, -3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cross.html) for more details. # CrossingCount `CrossingCount[contour, p]` gives a count of the number of times a ray starting from the point p crosses the closed curve contour. Examples [#examples] Count ray crossings for a polygon: ```wolfram polygon = Polygon[{{0, 0}, {1, 0}, {1, 1}, {0, 1}}]; CrossingCount[polygon, {0.5, 0.5}] (* 1 - point is inside *) ``` Point outside: ```wolfram CrossingCount[polygon, {2, 2}] (* 0 - point is outside *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CrossingCount.html) for more details. # CrossingDetect `CrossingDetect[image]` gives a binary image in which white pixels correspond to the zero crossings in image. `CrossingDetect[image,delta]` treats values in image that are smaller in absolute value than delta as zero. `CrossingDetect[array,…]` gives a binary sparse array in which 1 corresponds to zero crossings in array. Examples [#examples] Detect zero crossings in an image: ```wolfram img = LaplacianGaussianFilter[ExampleData[{"TestImage", "Lena"}], 2]; CrossingDetect[img] (* Image[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CrossingDetect.html) for more details. # CrossingPolygon `CrossingPolygon[{p1,p2,…,pn}]` gives a Polygon representing all points for which a ray from the point in any direction in the plane crosses the line segments \{p1,p2},…,\{pn-1,pn},\{pn,p1} an odd number of times. `CrossingPolygon[{{p11,p12,…},{p21,p22,…},…}]` gives a Polygon from the line segments \{p11,p12},…,\{p21,p22},…. Examples [#examples] Create a crossing polygon from a list of points: ```wolfram CrossingPolygon[{{0, 0}, {1, 1}, {2, 0}, {0, 1}, {2, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CrossingPolygon.html) for more details. # Cup `Cup[x, y, ...]` displays as x⌣y⌣.... Examples [#examples] Display cup notation: ```wolfram Cup[a, b, c] (* a⌣b⌣c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cup.html) for more details. # CupCap `CupCap[x, y, ...]` displays as x≍y≍…. Examples [#examples] ```wolfram CupCap[a, b, c] (* a ≍ b ≍ c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CupCap.html) for more details. # Det `Det[m]` gives the determinant of the square matrix `m`. Examples [#examples] Compute determinants: ```wolfram Det[{{1, 2}, {3, 4}}] (* -2 *) Det[{{a, b}, {c, d}}] (* a d - b c *) (* 3x3 matrix *) Det[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Det.html) for more details. # DiscreteLyapunovSolve `DiscreteLyapunovSolve[a, c]` finds the numeric solution x of the discrete matrix equation a.x.a† - x = c. `DiscreteLyapunovSolve[a, b, c]` solves a.x.b† - x = c. `DiscreteLyapunovSolve[{a, d}, c]` solves a.x.a† - d.x.d† = c. `DiscreteLyapunovSolve[{a, d}, {b, e}, c]` solves a.x.b† - d.x.e† = c. Examples [#examples] Solve discrete Lyapunov equation: ```wolfram DiscreteLyapunovSolve[{{0.5}}, {{1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteLyapunovSolve.html) for more details. # Dot `a . b` or `Dot[a, b]` gives products of vectors, matrices, and tensors. Examples [#examples] Vector dot product: ```wolfram {1, 2, 3} . {4, 5, 6} (* 32 *) ``` Matrix multiplication: ```wolfram {{1, 2}, {3, 4}} . {{5, 6}, {7, 8}} (* {{19, 22}, {43, 50}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Dot.html) for more details. # DrazinInverse `DrazinInverse[m]` finds the Drazin generalized inverse of a square matrix m. Examples [#examples] ```wolfram DrazinInverse[{{1, 2}, {0, 0}}] (* {{1, 0}, {0, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DrazinInverse.html) for more details. # Eigensystem `Eigensystem[m]` gives a list \{values, vectors} of the eigenvalues and eigenvectors of the square matrix m. `Eigensystem[{m, a}]` gives the generalized eigenvalues and eigenvectors of m with respect to a. `Eigensystem[m, k]` gives the eigenvalues and eigenvectors for the first k eigenvalues. Examples [#examples] Eigenvalues and eigenvectors: ```wolfram Eigensystem[{{1, 2}, {3, 4}}] (* eigenvalues and corresponding eigenvectors *) ``` First k eigenvalues: ```wolfram Eigensystem[HilbertMatrix[5], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Eigensystem.html) for more details. # Eigenvalues `Eigenvalues[m]` gives a list of the eigenvalues of the square matrix m. Examples [#examples] Eigenvalues of a matrix: ```wolfram Eigenvalues[{{1, 2}, {3, 4}}] (* {(5 + Sqrt[33])/2, (5 - Sqrt[33])/2} *) ``` Numerical eigenvalues: ```wolfram Eigenvalues[{{1., 2.}, {3., 4.}}] (* {5.37228, -0.372281} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Eigenvalues.html) for more details. # Eigenvectors `Eigenvectors[m]` gives a list of the eigenvectors of the square matrix m. Examples [#examples] Eigenvectors of a matrix: ```wolfram Eigenvectors[{{1, 2}, {3, 4}}] (* {{2/(3 - Sqrt[33]), 1}, {2/(3 + Sqrt[33]), 1}} *) ``` Numerical eigenvectors: ```wolfram Eigenvectors[{{1., 2.}, {3., 4.}}] // Normalize /@ # & ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Eigenvectors.html) for more details. # EstimatorRegulator `EstimatorRegulator[sspec, {l, κ}]` gives the output feedback controller with estimator and regulator gains l and κ for the system specification sspec. `EstimatorRegulator[..., "prop"]` gives the value of the property "prop". Examples [#examples] Create an estimator-regulator: ```wolfram EstimatorRegulator[ssm, {estimatorGains, regulatorGains}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatorRegulator.html) for more details. # FourierDCT `FourierDCT[list]` finds the Fourier discrete cosine transform of a list of real numbers. `FourierDCT[list,m]` finds the Fourier discrete cosine transform of type m. Examples [#examples] ```wolfram FourierDCT[{1, 2, 3, 4}] (* {5., -2.23044, 0., -0.158384} *) ``` ```wolfram FourierDCT[{1, 0, -1, 0}, 2] (* DCT type 2 result *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierDCT.html) for more details. # FourierDCTFilter `FourierDCTFilter[image,t]` reduces noise in image by locally thresholding the discrete cosine transforms of overlapping subimages, using the hard threshold t. Examples [#examples] Reduce noise in an image: ```wolfram noisyImg = ImageAdd[ExampleData[{"TestImage", "Lena"}], RandomImage[{-0.1, 0.1}, {512, 512}]]; FourierDCTFilter[noisyImg, 0.1] (* Image[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierDCTFilter.html) for more details. # FourierDCTMatrix `FourierDCTMatrix[n]` returns an n×n discrete cosine transform matrix of type 2. * `FourierDCTMatrix[n, m]` returns an n×n discrete cosine transform matrix of type m. Examples [#examples] Create a 4×4 DCT matrix: ```wolfram FourierDCTMatrix[4] ``` Create a type 1 DCT matrix: ```wolfram FourierDCTMatrix[4, 1] // MatrixForm ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierDCTMatrix.html) for more details. # FourierDST `FourierDST[list]` finds the Fourier discrete sine transform of a list of real numbers. `FourierDST[list,m]` finds the Fourier discrete sine transform of type m. Examples [#examples] Compute the discrete sine transform: ```wolfram FourierDST[{1, 2, 3, 4}] ``` Use a specific transform type: ```wolfram FourierDST[{1, 2, 3, 4}, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierDST.html) for more details. # FourierDSTMatrix `FourierDSTMatrix[n]` returns an n×n discrete sine transform matrix of type 2. `FourierDSTMatrix[n, m]` returns an n×n discrete sine transform matrix of type m. Examples [#examples] Generate a 4×4 DST matrix: ```wolfram FourierDSTMatrix[4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierDSTMatrix.html) for more details. # FourierMatrix `FourierMatrix[n]` returns an n×n Fourier matrix. Examples [#examples] Create a 4×4 Fourier matrix: ```wolfram FourierMatrix[4] ``` Display the matrix: ```wolfram FourierMatrix[4] // MatrixForm ``` Verify orthogonality: ```wolfram FourierMatrix[4] . ConjugateTranspose[FourierMatrix[4]] // Chop ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FourierMatrix.html) for more details. # GainMargins `GainMargins[lsys]` gives the gain margins of the linear time-invariant system lsys. Examples [#examples] Compute gain margins of a transfer function: ```wolfram GainMargins[TransferFunctionModel[1/(s^2 + s + 1), s]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GainMargins.html) for more details. # HadamardMatrix `HadamardMatrix[n]` returns an n×n Hadamard matrix. Examples [#examples] ```wolfram HadamardMatrix[4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HadamardMatrix.html) for more details. # HermiteDecomposition `HermiteDecomposition[m]` gives the Hermite normal form decomposition of an integer matrix m. Examples [#examples] ```wolfram HermiteDecomposition[{{1, 2}, {3, 4}}] ``` ```wolfram HermiteDecomposition[{{2, 4, 6}, {1, 3, 5}, {0, 2, 4}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HermiteDecomposition.html) for more details. # HermitianMatrix `HermitianMatrix[hmat]` converts the Hermitian matrix hmat to a structured array. Examples [#examples] ```wolfram HermitianMatrix[{{1, 2 + I}, {2 - I, 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HermitianMatrix.html) for more details. # HermitianMatrixQ `HermitianMatrixQ[m]` gives `True` if m is explicitly Hermitian (equal to its conjugate transpose), and `False` otherwise. Examples [#examples] Test for Hermitian matrix: ```wolfram HermitianMatrixQ[{{1, I}, {-I, 2}}] (* True *) ``` Non-Hermitian matrix: ```wolfram HermitianMatrixQ[{{1, 2}, {3, 4}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HermitianMatrixQ.html) for more details. # HessenbergDecomposition `HessenbergDecomposition[m]` gives the Hessenberg decomposition of a numerical matrix m. Examples [#examples] ```wolfram HessenbergDecomposition[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] ``` ```wolfram {p, h} = HessenbergDecomposition[RandomReal[1, {4, 4}]]; p . h . ConjugateTranspose[p] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HessenbergDecomposition.html) for more details. # HilbertMatrix `HilbertMatrix[n]` gives the n×n Hilbert matrix with elements of the form 1/(i+j-1). * `HilbertMatrix[{m, n}]` gives the m×n Hilbert matrix. Examples [#examples] ```wolfram HilbertMatrix[3] ``` ```wolfram HilbertMatrix[{2, 4}] // MatrixForm ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HilbertMatrix.html) for more details. # HodgeDual `HodgeDual[tensor]` gives the Hodge dual of the tensor. `HodgeDual[tensor, dim]` dualizes tensor in the slots with dimension dim. Examples [#examples] Hodge dual in 3D: ```wolfram HodgeDual[{a, b, c}] (* {{0, c, -b}, {-c, 0, a}, {b, -a, 0}} *) ``` Dual of a 2-form: ```wolfram HodgeDual[{{0, 1}, {-1, 0}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HodgeDual.html) for more details. # IdentityMatrix `IdentityMatrix[n]` gives the n×n identity matrix. `IdentityMatrix[{m, n}]` gives an m×n identity matrix. Examples [#examples] Create a 3×3 identity matrix: ```wolfram IdentityMatrix[3] (* {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}} *) ``` Rectangular identity matrix: ```wolfram IdentityMatrix[{2, 3}] (* {{1, 0, 0}, {0, 1, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IdentityMatrix.html) for more details. # IndefiniteMatrixQ `IndefiniteMatrixQ[m]` gives `True` if m is explicitly indefinite (has both positive and negative eigenvalues), and `False` otherwise. Examples [#examples] Test for indefinite matrix: ```wolfram IndefiniteMatrixQ[{{1, 0}, {0, -1}}] (* True *) ``` Definite matrix: ```wolfram IndefiniteMatrixQ[{{1, 0}, {0, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndefiniteMatrixQ.html) for more details. # Inner `Inner[f, list1, list2, g]` is a generalization of `Dot` where `f` replaces multiplication and `g` replaces addition. Examples [#examples] Generalized inner products: ```wolfram (* Standard dot product: Inner[Times, ..., Plus] *) Inner[Times, {a, b, c}, {x, y, z}, Plus] (* a x + b y + c z *) (* Custom operations *) Inner[f, {a, b}, {x, y}, g] (* g[f[a, x], f[b, y]] *) (* Boolean inner product *) Inner[And, {True, False, True}, {True, True, False}, Or] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inner.html) for more details. # InnerPolygon `InnerPolygon[poly]` gives the inner polygon of the polygon poly. Examples [#examples] Get the inner polygon of a star: ```wolfram InnerPolygon[Polygon[CirclePoints[5]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InnerPolygon.html) for more details. # InnerPolyhedron `InnerPolyhedron[poly]` gives the inner polyhedron of the polyhedron poly. Examples [#examples] Get the inner polyhedron of a stellated shape: ```wolfram InnerPolyhedron[PolyhedronData["GreatStellatedDodecahedron"]] ``` Compute the inner polyhedron of a custom polyhedron: ```wolfram poly = ConvexHullMesh[RandomPoint[Sphere[], 20]]; InnerPolyhedron[poly] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InnerPolyhedron.html) for more details. # Inverse `Inverse[m]` gives the inverse of a square matrix `m`. Examples [#examples] Compute matrix inverse: ```wolfram m = {{1, 2}, {3, 4}} Inverse[m] (* {{-2, 1}, {3/2, -1/2}} *) (* Verify: m . Inverse[m] = Identity *) m . Inverse[m] // Simplify (* {{1, 0}, {0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inverse.html) for more details. # InverseBetaRegularized `InverseBetaRegularized[s, a, b]` gives the inverse of the regularized incomplete beta function. Examples [#examples] Compute inverse: ```wolfram InverseBetaRegularized[0.5, 2, 3] (* 0.385728 *) ``` Verify relationship: ```wolfram BetaRegularized[InverseBetaRegularized[0.5, 2, 3], 2, 3] (* 0.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseBetaRegularized.html) for more details. # InverseBilateralLaplaceTransform `InverseBilateralLaplaceTransform[expr,s,t]` gives the inverse bilateral Laplace transform of expr. `InverseBilateralLaplaceTransform[expr,{s1,s2,…,sn},{t1,t2,…,tn}]` gives the multidimensional inverse bilateral Laplace transform of expr. Examples [#examples] Compute the inverse bilateral Laplace transform: ```wolfram InverseBilateralLaplaceTransform[1/s^2, s, t] (* t HeavisideTheta[t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseBilateralLaplaceTransform.html) for more details. # InverseBilateralZTransform `InverseBilateralZTransform[expr, z, n]` gives the inverse bilateral Z transform of expr. * `InverseBilateralZTransform[expr, {z1, ..., zk}, {n1, ..., nk}]` gives the multidimensional inverse bilateral Z transform of expr. Examples [#examples] ```wolfram InverseBilateralZTransform[z/(z - 1), z, n] ``` ```wolfram InverseBilateralZTransform[1/(z - 2), z, n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseBilateralZTransform.html) for more details. # InverseCDF `InverseCDF[dist,q]` gives the inverse of the cumulative distribution function for the distribution dist as a function of the variable q. Examples [#examples] Compute the inverse CDF of a normal distribution: ```wolfram InverseCDF[NormalDistribution[0, 1], 0.95] (* 1.64485 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseCDF.html) for more details. # InverseChiSquareDistribution `InverseChiSquareDistribution[ν]` represents an inverse χ² distribution with ν degrees of freedom. * `InverseChiSquareDistribution[ν, ξ]` represents a scaled inverse χ² distribution with ν degrees of freedom and scale ξ. Examples [#examples] ```wolfram dist = InverseChiSquareDistribution[5]; Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseChiSquareDistribution.html) for more details. # InverseContinuousWaveletTransform `InverseContinuousWaveletTransform[cwd]` gives the inverse continuous wavelet transform of a `ContinuousWaveletData` object cwd. * `InverseContinuousWaveletTransform[cwd, wave]` gives the inverse transform using the wavelet wave. * `InverseContinuousWaveletTransform[cwd, wave, octvoc]` gives the inverse transform from the wavelet coefficients specified by octvoc. Examples [#examples] ```wolfram data = Table[Sin[2 Pi t] + 0.5 Sin[10 Pi t], {t, 0, 1, 0.01}]; cwd = ContinuousWaveletTransform[data]; InverseContinuousWaveletTransform[cwd] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseContinuousWaveletTransform.html) for more details. # InverseDistanceTransform `InverseDistanceTransform[image]` gives the inverse distance transform of image, returning a binary image. Examples [#examples] Apply inverse distance transform: ```wolfram dist = DistanceTransform[Binarize[img]]; InverseDistanceTransform[dist] ``` Reconstruct from distance: ```wolfram InverseDistanceTransform[Image[{{0, 1, 0}, {1, 2, 1}, {0, 1, 0}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseDistanceTransform.html) for more details. # InverseEllipticNomeQ `InverseEllipticNomeQ[q]` gives the parameter `m` corresponding to the nome `q` in an elliptic function. Examples [#examples] ```wolfram InverseEllipticNomeQ[0.1] ``` ```wolfram InverseEllipticNomeQ[EllipticNomeQ[0.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseEllipticNomeQ.html) for more details. # InverseFourier `InverseFourier[list]` finds the discrete inverse Fourier transform of a list of complex numbers. Examples [#examples] Reconstruct original signal: ```wolfram data = {1, 2, 3, 4}; ft = Fourier[data]; InverseFourier[ft] (* {1., 2., 3., 4.} *) ``` Round-trip verification: ```wolfram Chop[InverseFourier[Fourier[{1, 0, 1, 0}]]] (* {1., 0., 1., 0.} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseFourier.html) for more details. # InverseFourierCosTransform `InverseFourierCosTransform[expr, ω, t]` gives the symbolic inverse Fourier cosine transform of `expr`. * `InverseFourierCosTransform[expr, {ω1, ω2, …}, {t1, t2, …}]` gives the multidimensional inverse Fourier cosine transform of `expr`. Examples [#examples] ```wolfram InverseFourierCosTransform[1/(1 + ω^2), ω, t] ``` ```wolfram InverseFourierCosTransform[Exp[-ω], ω, t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseFourierCosTransform.html) for more details. # InverseFourierSequenceTransform `InverseFourierSequenceTransform[expr, ω, n]` gives the inverse discrete-time Fourier transform of expr. * `InverseFourierSequenceTransform[expr, {ω1, ω2, ...}, {n1, n2, ...}]` gives the multidimensional inverse Fourier sequence transform. Examples [#examples] ```wolfram InverseFourierSequenceTransform[1/(1 - a Exp[-I ω]), ω, n] ``` ```wolfram InverseFourierSequenceTransform[Sin[ω], ω, n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseFourierSequenceTransform.html) for more details. # InverseFourierSinTransform `InverseFourierSinTransform[expr, ω, t]` gives the symbolic inverse Fourier sine transform of expr. * `InverseFourierSinTransform[expr, {ω1, ω2, ...}, {t1, t2, ...}]` gives the multidimensional inverse Fourier sine transform of expr. Examples [#examples] ```wolfram InverseFourierSinTransform[1/(1 + w^2), w, t] ``` ```wolfram InverseFourierSinTransform[Exp[-w], w, t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseFourierSinTransform.html) for more details. # InverseGammaDistribution `InverseGammaDistribution[α,β]` represents an inverse gamma distribution with shape parameter α and scale parameter β. `InverseGammaDistribution[α,β,γ,μ]` represents a generalized inverse gamma distribution with shape parameters α and γ, scale parameter β, and location parameter μ. Examples [#examples] ```wolfram PDF[InverseGammaDistribution[2, 1], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseGammaDistribution.html) for more details. # InverseGammaRegularized `InverseGammaRegularized[a, s]` gives the inverse of the regularized incomplete gamma function. Examples [#examples] Compute inverse: ```wolfram InverseGammaRegularized[2, 0.5] (* 1.67835 *) ``` Verify relationship: ```wolfram GammaRegularized[2, InverseGammaRegularized[2, 0.5]] (* 0.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseGammaRegularized.html) for more details. # InverseGaussianDistribution `InverseGaussianDistribution[μ,λ]` represents an inverse Gaussian distribution with mean μ and scale parameter λ. `InverseGaussianDistribution[μ,λ,θ]` represents a generalized inverse Gaussian distribution with parameters μ, λ, and θ. Examples [#examples] Create an inverse Gaussian distribution: ```wolfram dist = InverseGaussianDistribution[1, 2] (* InverseGaussianDistribution[1, 2] *) ``` Compute the mean: ```wolfram Mean[InverseGaussianDistribution[3, 1]] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseGaussianDistribution.html) for more details. # InverseImagePyramid `InverseImagePyramid[pyr]` reconstructs an image from an `ImagePyramid` object pyr. * `InverseImagePyramid[pyr, pyrtype]` assumes the specified pyramid type. * `InverseImagePyramid[pyr, pyrtype, n]` reconstructs up to pyramid level n. * `InverseImagePyramid[pyr, pyrtype, {size}]` reconstructs up to the smallest level larger than size. Examples [#examples] ```wolfram pyr = ImagePyramid[image, "Laplacian"]; InverseImagePyramid[pyr] ``` ```wolfram InverseImagePyramid[pyramid, "Gaussian", 3] ``` ```wolfram InverseImagePyramid[pyr, "Laplacian", {256, 256}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseImagePyramid.html) for more details. # InverseJacobiCD `InverseJacobiCD[v, m]` gives the inverse Jacobi elliptic function cd⁻¹(v|m). Examples [#examples] ```wolfram InverseJacobiCD[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiCD.html) for more details. # InverseJacobiCN `InverseJacobiCN[v, m]` gives the inverse Jacobi elliptic function cn⁻¹(v|m). Examples [#examples] Evaluate the inverse Jacobi CN function: ```wolfram InverseJacobiCN[0.5, 0.3] (* 1.0472 *) ``` Symbolic evaluation: ```wolfram InverseJacobiCN[1, m] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiCN.html) for more details. # InverseJacobiCS `InverseJacobiCS[v, m]` gives the inverse Jacobi elliptic function cs⁻¹(v|m). This is the inverse of the Jacobi elliptic function `JacobiCS[u, m]`, which represents the ratio cn(u|m)/sn(u|m). Examples [#examples] ```wolfram InverseJacobiCS[2, 0.5] ``` ```wolfram N[InverseJacobiCS[1, 1/2]] ``` ```wolfram (* Verify inverse property *) JacobiCS[InverseJacobiCS[v, m], m] // Simplify ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiCS.html) for more details. # InverseJacobiDC `InverseJacobiDC[v, m]` gives the inverse Jacobi elliptic function dc⁻¹(v|m). Examples [#examples] ```wolfram InverseJacobiDC[2, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiDC.html) for more details. # InverseJacobiDN `InverseJacobiDN[v, m]` gives the inverse Jacobi elliptic function dn⁻¹(v|m). This is the inverse of the Jacobi elliptic function `JacobiDN[u, m]`. Examples [#examples] ```wolfram InverseJacobiDN[0.9, 0.5] ``` ```wolfram N[InverseJacobiDN[0.8, 1/2]] ``` ```wolfram (* Verify inverse property *) JacobiDN[InverseJacobiDN[v, m], m] // Simplify ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiDN.html) for more details. # InverseJacobiDS `InverseJacobiDS[v, m]` gives the inverse Jacobi elliptic function ds⁻¹(v|m). Examples [#examples] Evaluate the inverse Jacobi DS function: ```wolfram InverseJacobiDS[2.0, 0.5] (* 0.481212 *) ``` Symbolic form: ```wolfram InverseJacobiDS[v, m] (* InverseJacobiDS[v, m] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiDS.html) for more details. # InverseJacobiNC `InverseJacobiNC[v, m]` gives the inverse Jacobi elliptic function nc⁻¹(v|m). Examples [#examples] ```wolfram InverseJacobiNC[2, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiNC.html) for more details. # InverseJacobiND `InverseJacobiND[v,m]` gives the inverse Jacobi elliptic function nd-1(vm). Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiND.html) for more details. # InverseJacobiNS `InverseJacobiNS[v,m]` gives the inverse Jacobi elliptic function ns⁻¹(v|m). Examples [#examples] Compute the inverse Jacobi ns function: ```wolfram InverseJacobiNS[2, 1/2] (* 0.481212 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiNS.html) for more details. # InverseJacobiSC `InverseJacobiSC[v, m]` gives the inverse Jacobi elliptic function sc⁻¹(v|m). Examples [#examples] ```wolfram InverseJacobiSC[1, 0] (* Pi/4 *) ``` ```wolfram InverseJacobiSC[2, 1/2] // N (* 1.08879 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiSC.html) for more details. # InverseJacobiSD `InverseJacobiSD[v, m]` gives the inverse Jacobi elliptic function sd⁻¹(v|m). Examples [#examples] ```wolfram InverseJacobiSD[0.5, 0.3] ``` ```wolfram InverseJacobiSD[1, 0.5] // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiSD.html) for more details. # InverseJacobiSN `InverseJacobiSN[v, m]` gives the inverse Jacobi elliptic function sn⁻¹(v|m). Examples [#examples] Compute the inverse Jacobi SN: ```wolfram InverseJacobiSN[0.5, 0.3] ``` Verify the inverse: ```wolfram JacobiSN[InverseJacobiSN[0.7, 0.5], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseJacobiSN.html) for more details. # InversePermutation `InversePermutation[perm]` returns the inverse of permutation perm. Examples [#examples] Find the inverse of a permutation list: ```wolfram InversePermutation[{3, 1, 2}] (* {2, 3, 1} *) ``` Find the inverse of a cycles permutation: ```wolfram InversePermutation[Cycles[{{1, 3, 2}}]] (* Cycles[{{1, 2, 3}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InversePermutation.html) for more details. # InverseRadon `InverseRadon[image]` gives the inverse discrete Radon transform of *image*. * `InverseRadon[image, {w, h}]` specifies the width *w* and the height *h* of the resulting image. Examples [#examples] ```wolfram sinogram = Radon[DiskMatrix[10]]; InverseRadon[sinogram] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseRadon.html) for more details. # InverseRadonTransform `InverseRadonTransform[expr, {p, ϕ}, {x, y}]` gives the inverse Radon transform of expr. Examples [#examples] ```wolfram InverseRadonTransform[DiracDelta[p], {p, ϕ}, {x, y}] ``` ```wolfram InverseRadonTransform[Exp[-p^2], {p, ϕ}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseRadonTransform.html) for more details. # InverseSeries `InverseSeries[s]` gives a series for the inverse of the function represented by series s. `InverseSeries[s, x]` uses variable x in the result. Examples [#examples] Inverse series: ```wolfram s = Series[Sin[x], {x, 0, 5}]; InverseSeries[s] ``` Verify: ```wolfram Normal[InverseSeries[s]] /. x -> Sin[y] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseSeries.html) for more details. # InverseShortTimeFourier `InverseShortTimeFourier[input]` reconstructs the signal from short-time Fourier data. * `InverseShortTimeFourier[input, n]` assumes the spectrogram data was computed with partitions of length n. * `InverseShortTimeFourier[input, n, d]` assumes partitions with offset d. * `InverseShortTimeFourier[input, n, d, wfun]` assumes a smoothing window wfun was applied to each partition. Examples [#examples] Reconstruct signal from STFT: ```wolfram signal = Table[Sin[2 Pi 440 t], {t, 0, 1, 1/8000}]; stft = ShortTimeFourier[signal]; InverseShortTimeFourier[stft] ``` With partition length: ```wolfram InverseShortTimeFourier[stft, 256] ``` With offset and window: ```wolfram InverseShortTimeFourier[stft, 256, 64, HannWindow] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseShortTimeFourier.html) for more details. # InverseSpectrogram `InverseSpectrogram[data]` reconstructs the signal from the magnitude spectrogram data. * `InverseSpectrogram[img]` reconstructs the signal, assuming that the image img is the magnitude spectrogram. * `InverseSpectrogram[input, n]` assumes the spectrogram data was computed with partitions of length n. * `InverseSpectrogram[input, n, d]` assumes partitions with offset d. * `InverseSpectrogram[input, n, d, wfun]` assumes a smoothing window wfun was applied to each partition. Examples [#examples] ```wolfram audio = ExampleData[{"Audio", "Apollo11SmallStep"}]; spec = Spectrogram[audio]; InverseSpectrogram[spec] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseSpectrogram.html) for more details. # InverseSurvivalFunction `InverseSurvivalFunction[dist, q]` gives the inverse of the survival function for the distribution *dist* as a function of the variable *q*. Examples [#examples] ```wolfram InverseSurvivalFunction[NormalDistribution[], 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseSurvivalFunction.html) for more details. # InverseTransformedRegion `InverseTransformedRegion[reg, f, n]` represents the inverse transformed region \{p ∈ ℝⁿ | f(p) ∈ reg}, where `reg` is a region and `f` is a function. Examples [#examples] ```wolfram InverseTransformedRegion[Disk[], {#1^2, #2} &, 2] ``` ```wolfram InverseTransformedRegion[Rectangle[], AffineTransform[{{2, 0}, {0, 1}}], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseTransformedRegion.html) for more details. # InverseWaveletTransform `InverseWaveletTransform[dwd]` gives the inverse wavelet transform of a `DiscreteWaveletData` object dwd. * `InverseWaveletTransform[dwd, wave]` gives the inverse transform using the wavelet wave. * `InverseWaveletTransform[dwd, wave, wind]` gives the inverse transform from the wavelet coefficients specified by wind. Examples [#examples] ```wolfram data = {1, 2, 3, 4, 5, 6, 7, 8}; dwd = DiscreteWaveletTransform[data]; InverseWaveletTransform[dwd] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseWaveletTransform.html) for more details. # InverseWeierstrassP `InverseWeierstrassP[p, {g2, g3}]` gives a value of u for which the Weierstrass function ℘(u; g2, g3) is equal to p. Examples [#examples] ```wolfram InverseWeierstrassP[1, {0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseWeierstrassP.html) for more details. # InverseWishartMatrixDistribution `InverseWishartMatrixDistribution[ν,Σ]` represents an inverse Wishart matrix distribution with ν degrees of freedom and covariance matrix Σ. Examples [#examples] Create an inverse Wishart distribution: ```wolfram dist = InverseWishartMatrixDistribution[5, IdentityMatrix[2]] (* InverseWishartMatrixDistribution[5, {{1, 0}, {0, 1}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseWishartMatrixDistribution.html) for more details. # JordanDecomposition `JordanDecomposition[m]` yields the Jordan decomposition of a square matrix m as a list `{s, j}` where s is a similarity matrix and j is the Jordan canonical form. Examples [#examples] Jordan decomposition: ```wolfram {s, j} = JordanDecomposition[{{5, 4, 2, 1}, {0, 1, -1, -1}, {-1, -1, 3, 0}, {1, 1, -1, 2}}] ``` Simple case: ```wolfram JordanDecomposition[{{2, 1}, {0, 2}}] (* {{{1, 0}, {0, 1}}, {{2, 1}, {0, 2}}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JordanDecomposition.html) for more details. # KarhunenLoeveDecomposition `KarhunenLoeveDecomposition[{a1, a2, …}]` gives the Karhunen–Loeve transform `{{b1, b2, …}, m}` of the numerical arrays `{a1, a2, …}`, where `m.ai ≈ bi`. * `KarhunenLoeveDecomposition[{b1, b2, …}, m]` uses the inverse of the matrix `m` for transforming `bi` to `ai`. Examples [#examples] ```wolfram KarhunenLoeveDecomposition[RandomReal[1, {10, 5}]] ``` ```wolfram {transformed, matrix} = KarhunenLoeveDecomposition[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KarhunenLoeveDecomposition.html) for more details. # KirchhoffMatrix `KirchhoffMatrix[g]` gives the Kirchhoff matrix (Laplacian matrix) of the graph g. `KirchhoffMatrix[{v -> w, ...}]` uses rules v -> w to specify the graph g. Examples [#examples] Kirchhoff matrix of a path graph: ```wolfram KirchhoffMatrix[PathGraph[{1, 2, 3}]] // MatrixForm ``` From edge rules: ```wolfram KirchhoffMatrix[{1 -> 2, 2 -> 3, 3 -> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KirchhoffMatrix.html) for more details. # KroneckerProduct `KroneckerProduct[m1, m2, ...]` constructs the Kronecker product of the arrays m\_i. Examples [#examples] Kronecker product of two matrices: ```wolfram KroneckerProduct[{{1, 2}, {3, 4}}, {{0, 1}, {1, 0}}] // MatrixForm ``` Identity and matrix: ```wolfram KroneckerProduct[IdentityMatrix[2], {{a, b}, {c, d}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KroneckerProduct.html) for more details. # LUDecomposition `LUDecomposition[m]` generates a representation of the LU decomposition of a square matrix m. Examples [#examples] LU decomposition: ```wolfram LUDecomposition[{{1, 2}, {3, 4}}] (* {{{3, 4}, {1/3, 2/3}}, {2, 1}, 1} *) ``` LU of a 3x3 matrix: ```wolfram LUDecomposition[{{2, 1, 1}, {4, 3, 3}, {8, 7, 9}}] (* {{{8, 7, 9}, {1/4, -3/4, -5/4}, {1/2, 2/3, 2/3}}, {3, 2, 1}, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LUDecomposition.html) for more details. # LeastSquares `LeastSquares[m, b]` finds the least-squares solution `x` that minimizes $||m \cdot x - b||$. Examples [#examples] Solve overdetermined systems: ```wolfram m = {{1, 1}, {1, 2}, {1, 3}} b = {2, 3, 5} LeastSquares[m, b] (* {1/3, 3/2} *) (* Verify: m.x is closest to b *) m . % (* {11/6, 10/3, 29/6} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeastSquares.html) for more details. # LeastSquaresFilterKernel `LeastSquaresFilterKernel[{{ω1, ..., ωk-1}, {a1, ..., ak}}, n]` creates a k-band finite impulse response (FIR) filter kernel of length n designed using a least squares method, given the specified frequencies ωi and amplitudes ai. * `LeastSquaresFilterKernel[{"type", spec}, n]` uses the full filter specification \{"type", spec}. Examples [#examples] Create a lowpass filter: ```wolfram kernel = LeastSquaresFilterKernel[{"Lowpass", 0.3}, 21]; ListLinePlot[kernel] ``` Bandpass filter: ```wolfram LeastSquaresFilterKernel[{"Bandpass", {0.2, 0.4}}, 31] ``` Apply filter to data: ```wolfram ListConvolve[kernel, RandomReal[1, 100]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeastSquaresFilterKernel.html) for more details. # LinearSolve `LinearSolve[m, b]` finds a vector `x` that solves the matrix equation $m \cdot x = b$. Examples [#examples] Solve linear systems: ```wolfram m = {{1, 2}, {3, 4}} b = {5, 11} LinearSolve[m, b] (* {1, 2} *) (* Verify: m . x = b *) m . {1, 2} (* {5, 11} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearSolve.html) for more details. # LinearSolveFunction `LinearSolveFunction[dimensions, data]` represents a function for providing solutions to a matrix equation. Examples [#examples] ```wolfram lsf = LinearSolve[{{1, 2}, {3, 4}}]; lsf[{5, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LinearSolveFunction.html) for more details. # LowerTriangularMatrix `LowerTriangularMatrix[lmat]` converts the lower triangular matrix lmat to a structured array. Examples [#examples] Create a lower triangular matrix: ```wolfram LowerTriangularMatrix[{{1}, {2, 3}, {4, 5, 6}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LowerTriangularMatrix.html) for more details. # LyapunovSolve `LyapunovSolve[a,c]` finds a solution x of the matrix Lyapunov equation a.x+x.aᵀ=c. `LyapunovSolve[a,b,c]` solves a.x+x.bᵀ=c. `LyapunovSolve[{a,d},c]` solves a.x.dᵀ+d.x.aᵀ=c. `LyapunovSolve[{a,d},{b,e},c]` solves a.x.eᵀ+d.x.bᵀ=c. Examples [#examples] Solve a Lyapunov equation: ```wolfram LyapunovSolve[{{1, 2}, {0, 3}}, {{1, 0}, {0, 1}}] (* {{1/2, 1/5}, {1/5, 1/6}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LyapunovSolve.html) for more details. # Matrices `Matrices[{d1, d2}]` represents the domain of matrices of dimensions d1×d2. * `Matrices[{d1, d2}, dom]` represents the domain of matrices of dimensions d1×d2, with components in the domain dom. * `Matrices[{d1, d2}, dom, sym]` represents the subdomain of matrices d1×d2 with symmetry sym. Examples [#examples] ```wolfram Matrices[{3, 3}, Reals] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Matrices.html) for more details. # MatrixExp `MatrixExp[m]` gives the matrix exponential of m. Examples [#examples] Matrix exponential: ```wolfram MatrixExp[{{0, t}, {-t, 0}}] (* {{Cos[t], Sin[t]}, {-Sin[t], Cos[t]}} *) ``` Diagonal matrix: ```wolfram MatrixExp[{{1, 0}, {0, 2}}] (* {{E, 0}, {0, E^2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixExp.html) for more details. # MatrixFunction `MatrixFunction[f, m]` gives the matrix generated by the scalar function f at the matrix argument m. Examples [#examples] Matrix sine: ```wolfram MatrixFunction[Sin, {{0, 1}, {-1, 0}}] ``` Apply exponential: ```wolfram MatrixFunction[Exp, {{1, 0}, {0, 2}}] (* {{E, 0}, {0, E^2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixFunction.html) for more details. # MatrixLog `MatrixLog[m]` gives the matrix logarithm of a matrix m. Examples [#examples] Matrix logarithm: ```wolfram MatrixLog[{{E, 0}, {0, E^2}}] (* {{1, 0}, {0, 2}} *) ``` Verify with MatrixExp: ```wolfram MatrixExp[MatrixLog[{{2, 0}, {0, 3}}]] (* {{2, 0}, {0, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixLog.html) for more details. # MatrixNormalDistribution `MatrixNormalDistribution[Σrow, Σcol]` represents zero mean matrix normal distribution with row covariance matrix Σrow and column covariance matrix Σcol. `MatrixNormalDistribution[μ, Σrow, Σcol]` represents matrix normal distribution with mean matrix μ. Examples [#examples] Create a matrix normal distribution: ```wolfram dist = MatrixNormalDistribution[{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}] ``` Generate a random sample: ```wolfram RandomVariate[MatrixNormalDistribution[{{1, 0.5}, {0.5, 1}}, {{1, 0}, {0, 1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixNormalDistribution.html) for more details. # MatrixPlot `MatrixPlot[m]` generates a plot that gives a visual representation of the values of elements in a matrix. Examples [#examples] Visualize a matrix: ```wolfram MatrixPlot[Table[i + j, {i, 10}, {j, 10}]] ``` Identity matrix: ```wolfram MatrixPlot[IdentityMatrix[10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixPlot.html) for more details. # MatrixPower `MatrixPower[m, n]` gives the nth matrix power of the matrix m. Examples [#examples] Square a matrix: ```wolfram MatrixPower[{{1, 1}, {1, 0}}, 2] (* {{2, 1}, {1, 1}} *) ``` Fibonacci via matrix power: ```wolfram MatrixPower[{{1, 1}, {1, 0}}, 10] (* {{89, 55}, {55, 34}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixPower.html) for more details. # MatrixPropertyDistribution `MatrixPropertyDistribution[expr, x \[Distributed] mdist]` represents the distribution of the matrix property expr where the matrix-valued random variable x follows the matrix distribution mdist. * `MatrixPropertyDistribution[expr, {x1 \[Distributed] mdist1, x2 \[Distributed] mdist2, …}]` represents the distribution where x1, x2, … are independent and follow the matrix distributions mdist1, mdist2, …. Examples [#examples] ```wolfram MatrixPropertyDistribution[Det[m], m \[Distributed] WishartMatrixDistribution[5, IdentityMatrix[3]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixPropertyDistribution.html) for more details. # MatrixQ `MatrixQ[expr]` gives `True` if expr is a rectangular list of lists representing a matrix. `MatrixQ[expr, test]` gives `True` only if test yields `True` for each matrix element. Examples [#examples] Test for matrices: ```wolfram MatrixQ[{{1, 2}, {3, 4}}] (* True *) ``` Non-rectangular arrays are not matrices: ```wolfram MatrixQ[{{1, 2}, {3}}] (* False *) ``` Test for numeric matrices: ```wolfram MatrixQ[{{1, 2}, {3, 4}}, IntegerQ] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixQ.html) for more details. # MatrixRank `MatrixRank[m]` gives the rank of the matrix `m` (the number of linearly independent rows or columns). Examples [#examples] Compute matrix rank: ```wolfram MatrixRank[{{1, 2}, {3, 4}}] (* 2 *) (* Singular matrix has lower rank *) MatrixRank[{{1, 2, 3}, {2, 4, 6}, {1, 1, 1}}] (* 2 *) (* Identity matrix *) MatrixRank[IdentityMatrix[5]] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixRank.html) for more details. # MatrixSymbol `MatrixSymbol[a]` represents a matrix with name a. * `MatrixSymbol[a, {m, n}]` represents an m×n matrix. * `MatrixSymbol[a, {m, n}, dom]` represents a matrix with elements in the domain dom. * `MatrixSymbol[a, {m, n}, dom, sym]` represents a matrix with the symmetry sym. Examples [#examples] ```wolfram MatrixSymbol["A", {3, 3}] ``` ```wolfram MatrixSymbol["M", {2, 2}, Reals, "Symmetric"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixSymbol.html) for more details. # MatrixTDistribution `MatrixTDistribution[Σrow, Σcol, ν]` represents zero mean matrix t distribution with row covariance matrix `Σrow`, column covariance matrix `Σcol`, and degrees of freedom parameter `ν`. * `MatrixTDistribution[μ, Σrow, Σcol, ν]` represents matrix t distribution with mean matrix `μ`. Examples [#examples] ```wolfram MatrixTDistribution[IdentityMatrix[2], IdentityMatrix[3], 5] ``` ```wolfram RandomVariate[MatrixTDistribution[{{1, 0}, {0, 1}}, {{1}}, 10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatrixTDistribution.html) for more details. # NicholsPlot `NicholsPlot[lsys]` generates a Nichols plot of the transfer function for the system lsys. `NicholsPlot[lsys,{ωmin,ωmax}]` plots for the frequency range ωmin to ωmax. `NicholsPlot[expr,{ω,ωmin,ωmax}]` plots expr using the variable ω. Examples [#examples] Plot a Nichols chart for a transfer function: ```wolfram NicholsPlot[TransferFunctionModel[1/(s^2 + s + 1), s]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NicholsPlot.html) for more details. # Norm `Norm[v]` gives the Euclidean norm (length) of a vector. `Norm[v, p]` gives the $p$-norm. Examples [#examples] Compute norms: ```wolfram Norm[{3, 4}] (* 5 *) Norm[{1, 2, 3}] (* Sqrt[14] *) (* 1-norm (Manhattan distance) *) Norm[{1, -2, 3}, 1] (* 6 *) (* Infinity norm *) Norm[{1, -5, 3}, Infinity] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Norm.html) for more details. # Normal `Normal[expr]` converts expr to a normal expression from a variety of special forms, such as `SeriesData`, `SparseArray`, etc. Examples [#examples] Convert series to polynomial: ```wolfram Normal[Series[Sin[x], {x, 0, 5}]] (* x - x^3/6 + x^5/120 *) ``` Convert sparse array: ```wolfram Normal[SparseArray[{1 -> a, 3 -> b}, 4]] (* {a, 0, b, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Normal.html) for more details. # NormalDistribution `NormalDistribution[μ, σ]` represents a normal (Gaussian) distribution with mean `μ` and standard deviation `σ`. `NormalDistribution[]` represents the standard normal distribution. Examples [#examples] Generate random samples from a normal distribution: ```wolfram RandomVariate[NormalDistribution[0, 1], 5] (* {0.234, -1.23, 0.891, -0.456, 1.78} *) (* Compute probability density *) PDF[NormalDistribution[0, 1], 0] (* 1/Sqrt[2 Pi] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NormalDistribution.html) for more details. # NormalMatrixQ `NormalMatrixQ[m]` gives `True` if m is an explicitly normal matrix, and `False` otherwise. Examples [#examples] ```wolfram NormalMatrixQ[{{1, 0}, {0, 1}}] (* True *) ``` ```wolfram NormalMatrixQ[{{1, 2}, {0, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NormalMatrixQ.html) for more details. # NormalizationLayer `NormalizationLayer[]` represents a trainable net layer that normalizes its input data across the second and subsequent dimensions and applies an independent scaling and bias to each component of the first dimension. * `NormalizationLayer[aggregationlevels]` normalizes data across the specified aggregation levels and applies a learned scaling and bias on the remaining levels. * `NormalizationLayer[aggregationlevels, scalinglevels]` applies a learned scaling and bias at the specified scaling levels. Examples [#examples] Basic normalization: ```wolfram NormalizationLayer[] ``` Batch normalization: ```wolfram NormalizationLayer[{2, 3}] ``` Layer normalization: ```wolfram NormalizationLayer[{1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NormalizationLayer.html) for more details. # Normalize `Normalize[v]` gives the unit vector in the direction of vector `v`. For complex numbers, returns `z/Abs[z]`. Examples [#examples] Normalize vectors: ```wolfram Normalize[{3, 4}] (* {3/5, 4/5} *) Normalize[{1, 1, 1}] (* {1/Sqrt[3], 1/Sqrt[3], 1/Sqrt[3]} *) (* Verify unit length *) Norm[Normalize[{1, 2, 3}]] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Normalize.html) for more details. # NormalizedSquaredEuclideanDistance `NormalizedSquaredEuclideanDistance[u, v]` gives the normalized squared Euclidean distance between vectors u and v. Examples [#examples] Compute normalized squared distance: ```wolfram NormalizedSquaredEuclideanDistance[{1, 2, 3}, {4, 5, 6}] ``` Distance between identical vectors: ```wolfram NormalizedSquaredEuclideanDistance[{1, 1, 1}, {1, 1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NormalizedSquaredEuclideanDistance.html) for more details. # NullSpace `NullSpace[m]` gives a list of vectors that forms a basis for the null space of the matrix m. Examples [#examples] Find null space: ```wolfram NullSpace[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] (* {{1, -2, 1}} *) ``` Verify null space vector: ```wolfram {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} . {1, -2, 1} (* {0, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NullSpace.html) for more details. # NyquistPlot `NyquistPlot[lsys]` generates a Nyquist plot of the transfer function for the system *lsys*. * `NyquistPlot[lsys, {ωmin, ωmax}]` plots for the frequency range *ωmin* to *ωmax*. * `NyquistPlot[expr, {ω, ωmin, ωmax}]` plots *expr* using the variable *ω*. Examples [#examples] ```wolfram NyquistPlot[TransferFunctionModel[1/(s + 1), s]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NyquistPlot.html) for more details. # OrthogonalMatrixQ `OrthogonalMatrixQ[m]` gives `True` if m is an explicitly orthogonal matrix, and `False` otherwise. Examples [#examples] Test for orthogonal matrix: ```wolfram OrthogonalMatrixQ[{{1, 0}, {0, 1}}] (* True *) ``` Rotation matrix: ```wolfram OrthogonalMatrixQ[{{Cos[t], -Sin[t]}, {Sin[t], Cos[t]}}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrthogonalMatrixQ.html) for more details. # Orthogonalize `Orthogonalize[{v1, v2, ...}]` gives an orthonormal basis found by orthogonalizing the vectors vi. Examples [#examples] Orthonormalize vectors: ```wolfram Orthogonalize[{{1, 0, 1}, {1, 1, 0}, {0, 1, 1}}] (* {{1/Sqrt[2], 0, 1/Sqrt[2]}, {1/Sqrt[6], Sqrt[2/3], -1/Sqrt[6]}, ...} *) ``` Simple 2D example: ```wolfram Orthogonalize[{{1, 1}, {1, 0}}] (* {{1/Sqrt[2], 1/Sqrt[2]}, {1/Sqrt[2], -1/Sqrt[2]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Orthogonalize.html) for more details. # Outer `Outer[f, list1, list2, ...]` forms all combinations of elements from the lists and applies `f` to each combination. Examples [#examples] Create outer products: ```wolfram (* All pairs *) Outer[List, {a, b}, {1, 2, 3}] (* {{{a, 1}, {a, 2}, {a, 3}}, {{b, 1}, {b, 2}, {b, 3}}} *) (* Multiplication table *) Outer[Times, Range[5], Range[5]] // MatrixForm (* Tensor outer product *) Outer[Times, {1, 2}, {3, 4}] (* {{3, 4}, {6, 8}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Outer.html) for more details. # OuterPolygon `OuterPolygon[poly]` gives the outer polygon of the polygon poly. Examples [#examples] Get the outer polygon of a polygon with a hole: ```wolfram OuterPolygon[Polygon[{{{0,0},{1,0},{1,1},{0,1}},{{0.2,0.2},{0.8,0.2},{0.8,0.8},{0.2,0.8}}}]] (* Polygon[{{0,0},{1,0},{1,1},{0,1}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OuterPolygon.html) for more details. # OuterPolyhedron `OuterPolyhedron[poly]` gives the outer polyhedron of the polyhedron poly. Examples [#examples] ```wolfram OuterPolyhedron[PolyhedronData["Icosahedron"]] ``` ```wolfram Graphics3D[OuterPolyhedron[PolyhedronData["Dodecahedron"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OuterPolyhedron.html) for more details. # OutputResponse `OutputResponse[sys, u[t], {t, tmin, tmax}]` gives the numeric output response of systems model sys to the input u\[t] for tmin ≤ t ≤ tmax. * `OutputResponse[sys, {u[0], u[1], …}]` gives the output response of the discrete-time system sys to the input sequence u\[i]. * `OutputResponse[sys, u[t], t]` gives the symbolic output response of system sys to the input u\[t] as a function of time t. * `OutputResponse[sys, {u1[t], …, um[t]}, …]` gives the output response for multiple inputs ui\[t]. Examples [#examples] ```wolfram sys = TransferFunctionModel[1/(s + 1), s]; OutputResponse[sys, UnitStep[t], {t, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OutputResponse.html) for more details. # PauliMatrix `PauliMatrix[k]` gives the kth Pauli spin matrix σk. Examples [#examples] ```wolfram PauliMatrix[1] ``` ```wolfram Table[PauliMatrix[k], {k, 0, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PauliMatrix.html) for more details. # Permanent `Permanent[m]` gives the permanent of the square matrix m. Examples [#examples] Compute the permanent of a matrix: ```wolfram Permanent[{{a, b}, {c, d}}] (* a d + b c *) ``` Permanent of a numeric matrix: ```wolfram Permanent[{{1, 2}, {3, 4}}] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Permanent.html) for more details. # PositiveDefiniteMatrixQ `PositiveDefiniteMatrixQ[m]` gives `True` if m is explicitly positive definite, and `False` otherwise. Examples [#examples] Test for positive definite: ```wolfram PositiveDefiniteMatrixQ[{{2, -1}, {-1, 2}}] (* True *) ``` Not positive definite: ```wolfram PositiveDefiniteMatrixQ[{{1, 2}, {2, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositiveDefiniteMatrixQ.html) for more details. # PrincipalComponents `PrincipalComponents[matrix]` transforms elements of matrix into unscaled principal components. Examples [#examples] Compute principal components: ```wolfram data = {{1, 2}, {2, 3}, {3, 5}, {4, 6}}; PrincipalComponents[data] ``` Reduce dimensionality: ```wolfram data = RandomReal[1, {100, 5}]; pc = PrincipalComponents[data]; pc[[All, 1 ;; 2]] (* First two principal components *) ``` Analyze variance: ```wolfram Variance /@ Transpose[PrincipalComponents[RandomReal[1, {100, 3}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrincipalComponents.html) for more details. # Projection `Projection[u, v]` finds the projection of the vector u onto the vector v. Examples [#examples] Project u onto v: ```wolfram Projection[{3, 4}, {1, 0}] (* {3, 0} *) ``` 3D projection: ```wolfram Projection[{1, 2, 3}, {1, 1, 1}] (* {2, 2, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Projection.html) for more details. # PseudoInverse `PseudoInverse[m]` finds the pseudoinverse (Moore-Penrose inverse) of a rectangular matrix. Examples [#examples] Pseudoinverse of a rectangular matrix: ```wolfram PseudoInverse[{{1, 2}, {3, 4}, {5, 6}}] (* {{-4/3, -1/3, 2/3}, {13/12, 1/3, -5/12}} *) ``` For a square matrix equals inverse: ```wolfram PseudoInverse[{{1, 2}, {3, 4}}] (* {{-2, 1}, {3/2, -1/2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PseudoInverse.html) for more details. # QRDecomposition `QRDecomposition[m]` yields the QR decomposition for a numerical matrix m. The result is a list `{q, r}`, where q is unitary and r is upper-triangular. Examples [#examples] QR decomposition: ```wolfram {q, r} = QRDecomposition[{{1, 2}, {3, 4}}] (* {{{-0.316, -0.949}, {-0.949, 0.316}}, {{-3.16, -4.43}, {0, -0.632}}} *) ``` Reconstruct: ```wolfram ConjugateTranspose[q] . r (* {{1., 2.}, {3., 4.}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QRDecomposition.html) for more details. # ReflectionMatrix `ReflectionMatrix[v]` gives the matrix that represents reflection of points in a mirror normal to the vector v. Examples [#examples] ```wolfram ReflectionMatrix[{1, 0}] (* {{-1, 0}, {0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReflectionMatrix.html) for more details. # RollPitchYawMatrix `RollPitchYawMatrix[{α,β,γ}]` gives the 3D rotation matrix formed by rotating by α around the initial z axis, then by β around the initial y axis, and then by γ around the initial x axis. `RollPitchYawMatrix[{α,β,γ},{a,b,c}]` gives the 3D rotation matrix formed by rotating by α around the fixed a axis, then by β around the fixed b axis, and then by γ around the fixed c axis. Examples [#examples] Create a rotation matrix with specified angles: ```wolfram RollPitchYawMatrix[{Pi/4, Pi/6, Pi/3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RollPitchYawMatrix.html) for more details. # RotationMatrix `RotationMatrix[θ]` gives the 2D rotation matrix that rotates 2D vectors counterclockwise by θ radians. `RotationMatrix[θ, w]` gives the 3D rotation matrix for a counterclockwise rotation around the 3D vector w. `RotationMatrix[{u, v}]` gives the matrix that rotates the vector u to the direction of the vector v. Examples [#examples] 2D rotation matrix: ```wolfram RotationMatrix[Pi/4] (* {{1/Sqrt[2], -1/Sqrt[2]}, {1/Sqrt[2], 1/Sqrt[2]}} *) ``` 3D rotation around z-axis: ```wolfram RotationMatrix[Pi/2, {0, 0, 1}] (* {{0, -1, 0}, {1, 0, 0}, {0, 0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RotationMatrix.html) for more details. # RowReduce `RowReduce[m]` gives the row-reduced form of the matrix m. Examples [#examples] Row reduce a matrix: ```wolfram RowReduce[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] (* {{1, 0, -1}, {0, 1, 2}, {0, 0, 0}} *) ``` Full rank matrix: ```wolfram RowReduce[{{1, 2}, {3, 4}}] (* {{1, 0}, {0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RowReduce.html) for more details. # ScalingMatrix `ScalingMatrix[{sx, sy, ...}]` gives the matrix corresponding to scaling by a factor si along each coordinate axis. `ScalingMatrix[s, v]` gives the matrix corresponding to scaling by a factor s along the direction of the vector v. Examples [#examples] 2D scaling matrix: ```wolfram ScalingMatrix[{2, 3}] (* {{2, 0}, {0, 3}} *) ``` Uniform scaling: ```wolfram ScalingMatrix[{2, 2, 2}] (* {{2, 0, 0}, {0, 2, 0}, {0, 0, 2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScalingMatrix.html) for more details. # SchurDecomposition `SchurDecomposition[m]` yields the Schur decomposition for a numerical matrix m, given as a list `{q, t}` where q is orthonormal and t is block upper-triangular. Examples [#examples] Schur decomposition: ```wolfram {q, t} = SchurDecomposition[{{1, 2}, {0, 3}}] (* {{{1, 0}, {0, 1}}, {{1, 2}, {0, 3}}} *) ``` Reconstruct original: ```wolfram q . t . ConjugateTranspose[q] (* {{1., 2.}, {0., 3.}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SchurDecomposition.html) for more details. # ShearingMatrix `ShearingMatrix[θ, v, n]` gives the matrix corresponding to shearing by θ radians along the direction of the vector v, and normal to the vector n. Examples [#examples] ```wolfram ShearingMatrix[Pi/6, {1, 0}, {0, 1}] (* {{1, 1/Sqrt[3]}, {0, 1}} *) ``` ```wolfram ShearingMatrix[0.5, {1, 0, 0}, {0, 1, 0}] (* {{1, 0.546, 0}, {0, 1, 0}, {0, 0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShearingMatrix.html) for more details. # SmithDecomposition `SmithDecomposition[m]` gives the Smith normal form decomposition of an integer matrix m. Examples [#examples] ```wolfram SmithDecomposition[{{1, 2}, {3, 4}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmithDecomposition.html) for more details. # SparseArray `SparseArray[{pos1 -> v1, pos2 -> v2, ...}]` yields a sparse array with values at specified positions. `SparseArray[list]` yields a sparse array version of list. `SparseArray[data, dims, val]` uses val for unspecified elements. Examples [#examples] Create a sparse array with specific values: ```wolfram SparseArray[{{1, 1} -> 1, {2, 2} -> 2, {3, 3} -> 3}] (* SparseArray[..., {3, 3}] *) ``` Convert to normal array: ```wolfram Normal[SparseArray[{{1, 1} -> 1, {2, 2} -> 1}, {2, 2}]] (* {{1, 0}, {0, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SparseArray.html) for more details. # SparseArrayQ `SparseArrayQ[s]` yields `True` if s is a valid SparseArray object and `False` otherwise. Examples [#examples] Test a sparse array: ```wolfram SparseArrayQ[SparseArray[{1, 0, 0, 2}]] (* True *) ``` Test a regular list: ```wolfram SparseArrayQ[{1, 0, 0, 2}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SparseArrayQ.html) for more details. # SquareMatrixQ `SquareMatrixQ[m]` gives True if m is a square matrix, and False otherwise. Examples [#examples] ```wolfram SquareMatrixQ[{{1, 2}, {3, 4}}] (* True *) ``` ```wolfram SquareMatrixQ[{{1, 2, 3}, {4, 5, 6}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SquareMatrixQ.html) for more details. # SymmetricMatrix `SymmetricMatrix[smat]` converts the symmetric matrix smat to a structured array. Examples [#examples] Create symmetric matrix: ```wolfram m = {{1, 2, 3}, {2, 4, 5}, {3, 5, 6}}; SymmetricMatrix[m] ``` Check structure: ```wolfram StructuredArray[SymmetricMatrix, 3] ``` Normal form: ```wolfram Normal[SymmetricMatrix[m]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricMatrix.html) for more details. # SymmetricMatrixQ `SymmetricMatrixQ[m]` gives True if m is explicitly symmetric, and False otherwise. Examples [#examples] Test for symmetric matrix: ```wolfram SymmetricMatrixQ[{{1, 2}, {2, 3}}] (* True *) ``` Non-symmetric matrix: ```wolfram SymmetricMatrixQ[{{1, 2}, {3, 4}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricMatrixQ.html) for more details. # TensorContract `TensorContract[tensor,{{s11,s12},{s21,s22},…}]` yields the contraction of tensor in the pairs \{si1,si2} of slots. Examples [#examples] Contract a matrix (compute trace): ```wolfram TensorContract[{{a, b}, {c, d}}, {{1, 2}}] (* a + d *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorContract.html) for more details. # TensorDimensions `TensorDimensions[tensor]` gives the list of dimensions of tensor. Examples [#examples] Dimensions of a matrix: ```wolfram TensorDimensions[{{1, 2, 3}, {4, 5, 6}}] (* {2, 3} *) ``` Dimensions of a 3D array: ```wolfram TensorDimensions[{{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}] (* {2, 2, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorDimensions.html) for more details. # TensorExpand `TensorExpand[texpr]` expands out tensor-related products in the symbolic tensor expression *texpr*. Examples [#examples] ```wolfram TensorExpand[TensorProduct[a + b, c]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorExpand.html) for more details. # TensorProduct `TensorProduct[tensor1, tensor2, ...]` represents the tensor product of the tensori. Examples [#examples] Tensor product of two vectors: ```wolfram TensorProduct[{a, b}, {x, y}] (* {{a x, a y}, {b x, b y}} *) ``` Tensor product of vectors and matrices: ```wolfram TensorProduct[{1, 2}, {{1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorProduct.html) for more details. # TensorRank `TensorRank[tensor]` gives the rank of a tensor. Examples [#examples] Get the rank of a matrix: ```wolfram TensorRank[{{1, 2}, {3, 4}}] (* 2 *) ``` Get the rank of a vector: ```wolfram TensorRank[{1, 2, 3}] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorRank.html) for more details. # TensorReduce `TensorReduce[texpr]` attempts to return a canonical form for the symbolic tensor expression texpr. Examples [#examples] Simplify a tensor expression: ```wolfram TensorReduce[TensorProduct[a, b] + TensorProduct[b, a], Assumptions -> {a \[Element] Vectors[3], b \[Element] Vectors[3]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorReduce.html) for more details. # TensorSymmetry `TensorSymmetry[tensor]` gives the symmetry of tensor under permutations of its slots. `TensorSymmetry[tensor, slots]` gives the symmetry under permutation of the specified list of slots. Examples [#examples] Check symmetry of a symmetric matrix: ```wolfram TensorSymmetry[{{1, 2}, {2, 3}}] (* Symmetric[{1, 2}] *) ``` Antisymmetric tensor: ```wolfram TensorSymmetry[{{0, 1}, {-1, 0}}] (* Antisymmetric[{1, 2}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorSymmetry.html) for more details. # TensorTranspose `TensorTranspose[tensor, perm]` represents the tensor obtained by transposing the slots of tensor as given by the permutation perm. Examples [#examples] Transpose a 3-dimensional tensor: ```wolfram t = Array[Subscript[a, ##] &, {2, 3, 4}]; TensorTranspose[t, {3, 1, 2}] // Dimensions (* {4, 2, 3} *) ``` Simple matrix transpose: ```wolfram TensorTranspose[{{1, 2}, {3, 4}}, {2, 1}] (* {{1, 3}, {2, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorTranspose.html) for more details. # TensorWedge `TensorWedge[tensor1, tensor2, ...]` represents the antisymmetrized tensor product of the tensori. Examples [#examples] Wedge product of vectors: ```wolfram TensorWedge[{a, b}, {c, d}] (* {{0, a d - b c}, {-a d + b c, 0}} *) ``` Triple wedge product: ```wolfram TensorWedge[{1, 0, 0}, {0, 1, 0}, {0, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TensorWedge.html) for more details. # ToeplitzMatrix `ToeplitzMatrix[n]` gives the n×n Toeplitz matrix with first row and first column being successive integers. * `ToeplitzMatrix[{c1, c2, ..., cn}]` gives the Toeplitz matrix whose first column consists of entries c1, c2, .... * `ToeplitzMatrix[{c1, c2, ..., cm}, {r1, r2, ..., rn}]` gives the Toeplitz matrix with entries ci down the first column, and ri across the first row. Examples [#examples] Create a 4×4 Toeplitz matrix: ```wolfram ToeplitzMatrix[4] // MatrixForm ``` Specify the first column: ```wolfram ToeplitzMatrix[{a, b, c, d}] // MatrixForm ``` Specify both first column and first row: ```wolfram ToeplitzMatrix[{1, 2, 3}, {1, 4, 5, 6}] // MatrixForm ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToeplitzMatrix.html) for more details. # Tr `Tr[m]` gives the trace of a square matrix (sum of diagonal elements). Examples [#examples] Compute matrix trace: ```wolfram Tr[{{1, 2}, {3, 4}}] (* 5 *) Tr[IdentityMatrix[3]] (* 3 *) (* Trace with symbolic elements *) Tr[{{a, b}, {c, d}}] (* a + d *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tr.html) for more details. # Trace `Trace[expr]` generates a list of all expressions used in the evaluation of expr. `Trace[expr, form]` includes only expressions matching form. Examples [#examples] Trace an evaluation: ```wolfram Trace[2 + 3] (* {2 + 3, 5} *) ``` Trace specific operations: ```wolfram Trace[Factorial[5], Factorial] (* {{Factorial[5], 5 Factorial[4], ...}} *) ``` Trace a function call: ```wolfram f[x_] := x^2 + 1; Trace[f[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Trace.html) for more details. # TracyWidomDistribution `TracyWidomDistribution[β]` represents a Tracy–Widom distribution with Dyson index β. Examples [#examples] ```wolfram dist = TracyWidomDistribution[1]; PDF[dist, x] ``` ```wolfram Mean[TracyWidomDistribution[2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TracyWidomDistribution.html) for more details. # TradingChart `TradingChart[{{date1, {open1, high1, low1, close1, volume1}}, ...}]` makes a chart showing prices and volume for each date. * `TradingChart[{"name", daterange}]` makes a financial chart for the financial entity "name" over the daterange. * `TradingChart[{...}, {ind1, ind2, ...}]` makes a financial chart with indicators ind1, ind2, …. Examples [#examples] ```wolfram TradingChart[{"AAPL", {2020, 2021}}] ``` ```wolfram TradingChart[{"GOOG", {2021}}, {"Volume", "BollingerBands"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TradingChart.html) for more details. # TransformedRegion `TransformedRegion[reg, f]` represents the transformed region \{f(p)|p∈reg}, where reg is a region and f is a function. Examples [#examples] Scale a disk: ```wolfram TransformedRegion[Disk[], 2 # &] ``` Rotate a rectangle: ```wolfram TransformedRegion[Rectangle[], RotationTransform[Pi/4]] ``` Translate a region: ```wolfram TransformedRegion[Disk[], TranslationTransform[{1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TransformedRegion.html) for more details. # Transliterate `Transliterate["string"]` attempts to transliterate string into plain ASCII. `Transliterate["string", script]` attempts to transliterate string into the specified writing script. `Transliterate["string", script1 -> script2]` attempts to transliterate string from script1 to script2. Examples [#examples] Transliterate to ASCII: ```wolfram Transliterate["Müller"] (* "Muller" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Transliterate.html) for more details. # Transpose `Transpose[list]` transposes the first two levels in list. Examples [#examples] Transpose a matrix: ```wolfram Transpose[{{1, 2, 3}, {4, 5, 6}}] (* {{1, 4}, {2, 5}, {3, 6}} *) ``` Pairs to lists: ```wolfram Transpose[{{a, 1}, {b, 2}, {c, 3}}] (* {{a, b, c}, {1, 2, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Transpose.html) for more details. # Tree `Tree[{subtree1, subtree2, ...}]` represents a tree with a list of child subtrees subtreei. * `Tree[<|key1 -> subtree1, key2 -> subtree2, ...|>]` specifies children as an association with keys. * `Tree[data, subtrees]` represents a tree containing data in its root, with children given by subtrees. Examples [#examples] ```wolfram Tree[a, {Tree[b, {}], Tree[c, {}]}] ``` ```wolfram Tree["root", {Tree["child1", {}], Tree["child2", {}]}] ``` ```wolfram ExpressionTree[a + b * c] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tree.html) for more details. # TreeCases `TreeCases[tree, pattern]` gives a list of subtrees of tree with data matching pattern. * `TreeCases[tree, pattern, levelspec]` gives a list of all subtrees on levels specified by levelspec with data matching the pattern. * `TreeCases[tree, pattern, levelspec, n]` gives the first n subtrees with data that matches the pattern. * `TreeCases[pattern]` represents an operator form that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; TreeCases[tree, _Symbol] ``` ```wolfram TreeCases[tree, b | e] ``` ```wolfram TreeCases[tree, _, 2] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeCases.html) for more details. # TreeChildren `TreeChildren[tree]` extracts the children of the root of the `Tree` object tree. Examples [#examples] ```wolfram t = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; TreeChildren[t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeChildren.html) for more details. # TreeCount `TreeCount[tree, pattern]` gives the number of subtrees of tree whose data matches pattern. * `TreeCount[tree, pattern, levelspec]` gives the total number of subtrees with data matching pattern that appear at the levels in tree specified by levelspec. * `TreeCount[pattern]` represents an operator form of `TreeCount` that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], Tree[b, {e}]}]; TreeCount[tree, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeCount.html) for more details. # TreeData `TreeData[tree]` extracts the data in the root of the Tree object tree. Examples [#examples] Get root data: ```wolfram TreeData[Tree[a, {Tree[b, {}], Tree[c, {}]}]] ``` Access nested tree data: ```wolfram tree = Tree["root", {Tree["child1", {}]}]; TreeData[tree] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeData.html) for more details. # TreeDelete `TreeDelete[tree,pos]` deletes the subtree of tree at the position specified by pos. `TreeDelete[tree,{pos1,pos2,…}]` deletes subtrees at several positions. `TreeDelete[pos]` represents an operator form of TreeDelete that can be applied to a tree. Examples [#examples] Delete a subtree at position \{1}: ```wolfram t = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; TreeDelete[t, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeDelete.html) for more details. # TreeDepth `TreeDepth[tree]` gives the maximum level of tree. * `TreeDepth[tree, pattern]` gives the maximum level of the subtree with data matching pattern. Examples [#examples] ```wolfram TreeDepth[Tree[a, {Tree[b, {c, d}], e}]] ``` ```wolfram TreeDepth[Tree[1, {Tree[2, {3}], 4}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeDepth.html) for more details. # TreeExpression `TreeExpression[tree]` gives an expression from the structure of the `Tree` object tree. * `TreeExpression[tree, struct]` gives an expression with data and subtrees of tree interpreted as specified by struct. Examples [#examples] ```wolfram t = Tree[f, {Tree[a, {}], Tree[b, {}]}]; TreeExpression[t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeExpression.html) for more details. # TreeExtract `TreeExtract[tree,pos]` extracts the subtree of tree at the position specified by pos. `TreeExtract[tree,{pos1,pos2,...}]` extracts a list of subtrees of tree. `TreeExtract[tree,pos,h]` extracts subtrees of tree, applying h to each subtree. `TreeExtract[pos]` represents an operator form of TreeExtract that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; TreeExtract[tree, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeExtract.html) for more details. # TreeForm `TreeForm[expr]` displays expr as a tree with different levels at different depths. Examples [#examples] Visualize expression structure: ```wolfram TreeForm[a + b*c] ``` Limit depth: ```wolfram TreeForm[{{1, 2}, {3, 4}}, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeForm.html) for more details. # TreeGraph `TreeGraph[{e1, e2, ...}]` creates a tree graph from edges. The layout is optimized for tree structures. Examples [#examples] Create tree graphs: ```wolfram (* Simple tree *) TreeGraph[{1 -> 2, 1 -> 3, 2 -> 4, 2 -> 5}] (* With vertex labels *) TreeGraph[{"root" -> "child1", "root" -> "child2"}, VertexLabels -> "Name"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeGraph.html) for more details. # TreeGraphQ `TreeGraphQ[g]` yields `True` if graph g is a tree (connected and acyclic) and `False` otherwise. Examples [#examples] Test for tree: ```wolfram TreeGraphQ[TreeGraph[{1 -> 2, 1 -> 3, 2 -> 4}]] (* True *) TreeGraphQ[CycleGraph[4]] (* False - has cycle *) TreeGraphQ[Graph[{1 <-> 2, 3 <-> 4}]] (* False - not connected *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeGraphQ.html) for more details. # TreeInsert `TreeInsert[tree, child, pos]` inserts child at the position specified by pos in tree. * `TreeInsert[tree, child, {pos1, pos2, ...}]` inserts child at several positions. * `TreeInsert[child, pos]` represents an operator form of TreeInsert that can be applied to a tree. Examples [#examples] Insert a new child into a tree: ```wolfram tree = Tree[a, {Tree[b, {}], Tree[c, {}]}]; TreeInsert[tree, Tree[d, {}], {1}] ``` Insert at multiple positions: ```wolfram TreeInsert[tree, Tree[x, {}], {{1}, {2}}] ``` Using the operator form: ```wolfram TreeInsert[Tree[new, {}], {2}][tree] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeInsert.html) for more details. # TreeLeafCount `TreeLeafCount[tree]` gives the number of leaves of tree. Examples [#examples] ```wolfram TreeLeafCount[Tree[a, {Tree[b, None], Tree[c, None]}]] ``` ```wolfram TreeLeafCount[ExpressionTree[a + b + c]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeLeafCount.html) for more details. # TreeLeafQ `TreeLeafQ[tree]` gives True if tree is a Tree object with no children, and gives False otherwise. Examples [#examples] Check if a tree node is a leaf: ```wolfram TreeLeafQ[Tree[1, {}]] (* True *) TreeLeafQ[Tree[1, {Tree[2, {}]}]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeLeafQ.html) for more details. # TreeLeaves `TreeLeaves[tree]` returns the list of leaves of the tree. Examples [#examples] Get the leaves of a tree: ```wolfram TreeLeaves[Tree[a, {Tree[b, {c, d}], e}]] (* {c, d, e} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeLeaves.html) for more details. # TreeLevel `TreeLevel[tree, levelspec]` gives a list of all subtrees of tree on levels specified by levelspec. * `TreeLevel[tree, levelspec -> elem]` gives a list of the element elem of subtrees on levels specified by levelspec. * `TreeLevel[levelspec]` represents an operator form of `TreeLevel` that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; TreeLevel[tree, {2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeLevel.html) for more details. # TreeMap `TreeMap[f, tree]` applies f to the data of each subtree of tree. * `TreeMap[f, tree, levelspec]` applies f to the data of subtrees on levels of tree specified by levelspec. * `TreeMap[f, tree, levelspec -> elems]` applies f to the elements elems of subtrees on levels specified by levelspec. * `TreeMap[f]` represents an operator form of TreeMap that can be applied to a tree. Examples [#examples] Apply function to all nodes: ```wolfram TreeMap[f, Tree[a, {Tree[b, {}], Tree[c, {}]}]] ``` Map at specific level: ```wolfram TreeMap[StringLength, tree, {2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeMap.html) for more details. # TreeMapAt `TreeMapAt[f, tree, pos]` applies f to the data at the position specified by pos in tree. * `TreeMapAt[f, tree, {pos1, pos2, ...}]` applies f to the data at several positions. * `TreeMapAt[f, pos]` represents an operator form of TreeMapAt that can be applied to a tree. This function transforms data at specific positions in a tree structure. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], e}]; TreeMapAt[ToUpperCase, tree, {1}] ``` ```wolfram TreeMapAt[# + 1 &, Tree[1, {Tree[2, {3, 4}], 5}], {1, 1}] ``` ```wolfram TreeMapAt[Style[#, Red] &, {1, 2}][Tree[a, {b, c, d}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeMapAt.html) for more details. # TreeOutline `TreeOutline[tree]` gives an outline of the data in tree as a nested OpenerView. `TreeOutline[tree, pos]` gives an outline of the data in tree initially opened to the subtree at the position specified by pos. `TreeOutline[tree, {pos1, pos2, …}]` opens the outline to several positions. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeOutline.html) for more details. # TreePlot `TreePlot[g]` generates a tree plot of the graph *g*. * `TreePlot[{e1, e2, ...}]` generates a tree plot of the graph with edges *ej*. * `TreePlot[{..., w[ei], ...}]` plots *ei* with features defined by the symbolic wrapper *w*. * `TreePlot[{vi1 -> vj1, ...}]` uses rules *vi1 -> vj1* to specify the graph *g*. * `TreePlot[m]` generates a tree plot of the graph represented by the adjacency matrix *m*. * `TreePlot[..., v -> pos]` places the root *v* in the plot at position *pos*. Examples [#examples] ```wolfram TreePlot[{1 -> 2, 1 -> 3, 2 -> 4, 2 -> 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreePlot.html) for more details. # TreePosition `TreePosition[tree,pattern]` gives a list of the positions of subtrees of tree whose data matches pattern. `TreePosition[tree,pattern,levelspec]` finds only matches that appear on levels of tree specified by levelspec. `TreePosition[tree,pattern,levelspec,n]` gives the positions of the first n matches found. `TreePosition[pattern]` represents an operator form of TreePosition that can be applied to a tree. Examples [#examples] Find positions of nodes with data matching a pattern: ```wolfram t = Tree[a, {Tree[b, {Tree[c, None], Tree[d, None]}], Tree[e, None]}]; TreePosition[t, b] (* {{1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreePosition.html) for more details. # TreeQ `TreeQ[tree]` yields `True` if tree is a valid `Tree` object and `False` otherwise. Examples [#examples] Check if an expression is a valid tree: ```wolfram TreeQ[Tree[a, {Tree[b], Tree[c]}]] (* True *) ``` ```wolfram TreeQ[{1, 2, 3}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeQ.html) for more details. # TreeReplacePart `TreeReplacePart[tree, pos -> new]` gives a tree in which the subtree of tree at the position specified by pos is replaced with new. * `TreeReplacePart[tree, {pos1 -> new1, pos2 -> new2, ...}]` replaces subtrees at positions specified by posi with newi. * `TreeReplacePart[tree, {pos1, pos2, ...} -> new]` replaces all subtrees at positions specified by posi with new. * `TreeReplacePart[tree, {{pos1,1, pos1,2, ...} -> new1, ...}]` replaces subtrees at positions specified by \{posi,1, posi,2, ...} with newi. * `TreeReplacePart[pos -> new]` represents an operator form of `TreeReplacePart` that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], e}]; TreeReplacePart[tree, {1, 2} -> x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeReplacePart.html) for more details. # TreeRules `TreeRules[tree]` returns the rules associated with the Tree object tree. Examples [#examples] ```wolfram TreeRules[Tree[a, {Tree[b, {}], Tree[c, {}]}]] (* {a -> {b, c}, b -> {}, c -> {}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeRules.html) for more details. # TreeScan `TreeScan[f, tree]` evaluates f applied to the data of each subtree of tree in turn. * `TreeScan[f, tree, levelspec]` applies f to the data of subtrees on levels of tree specified by levelspec. * `TreeScan[f, tree, levelspec -> elems]` applies f to the elements elems of subtrees on levels specified by levelspec. * `TreeScan[f]` represents an operator form of `TreeScan` that can be applied to a tree. Examples [#examples] ```wolfram TreeScan[Print, Tree[1, {Tree[2], Tree[3]}]] ``` ```wolfram TreeScan[Print, tree, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeScan.html) for more details. # TreeSelect `TreeSelect[tree, crit]` picks out all subtrees treei of tree for which crit\[treei] is True. * `TreeSelect[tree, crit, n]` picks out the first n subtrees for which crit\[treei] is True. * `TreeSelect[tree, crit, levelspec, n]` picks out subtrees on levels specified by levelspec. * `TreeSelect[crit]` represents an operator form of TreeSelect that can be applied to a tree. Examples [#examples] ```wolfram tree = Tree[1, {Tree[2, {3, 4}], Tree[5, {6}]}]; TreeSelect[tree, EvenQ[TreeData[#]] &] ``` ```wolfram TreeSelect[tree, TreeLeafQ, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeSelect.html) for more details. # TreeSize `TreeSize[tree]` gives the number of subtrees of tree. Examples [#examples] ```wolfram TreeSize[Tree[a, {Tree[b, {}], Tree[c, {}]}]] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TreeSize.html) for more details. # Triangle `Triangle[{p1, p2, p3}]` represents a filled triangle with corner points p1, p2, and p3. `Triangle[{{p11, p12, p13}, ...}]` represents a collection of triangles. Examples [#examples] Draw a triangle: ```wolfram Graphics[Triangle[{{0, 0}, {1, 0}, {0.5, 1}}]] ``` Colored triangle: ```wolfram Graphics[{Blue, EdgeForm[Black], Triangle[{{0, 0}, {2, 0}, {1, 1.5}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Triangle.html) for more details. # TriangleCenter `TriangleCenter[tri, type]` gives the specified type of center for the triangle tri. * `TriangleCenter[tri]` gives the centroid of the triangle. Examples [#examples] ```wolfram TriangleCenter[Triangle[{{0, 0}, {1, 0}, {0, 1}}], "Incenter"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangleCenter.html) for more details. # TriangleConstruct `TriangleConstruct[tri, type]` gives the specified type of construct for the triangle tri. Examples [#examples] Centroid of a triangle: ```wolfram tri = Triangle[{{0, 0}, {1, 0}, {0.5, 1}}]; TriangleConstruct[tri, "Centroid"] ``` Circumcircle: ```wolfram TriangleConstruct[tri, "Circumcircle"] ``` Incircle: ```wolfram TriangleConstruct[tri, "Incircle"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangleConstruct.html) for more details. # TriangleMeasurement `TriangleMeasurement[tri, type]` gives the specified type of measurement for the triangle tri. Examples [#examples] ```wolfram TriangleMeasurement[Triangle[{{0, 0}, {1, 0}, {0, 1}}], "Area"] ``` ```wolfram TriangleMeasurement[Triangle[{{0, 0}, {3, 0}, {0, 4}}], "Perimeter"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangleMeasurement.html) for more details. # TriangleWave `TriangleWave[x]` gives a triangle wave that varies between -1 and +1 with unit period. * `TriangleWave[{min, max}, x]` gives a triangle wave that varies between min and max with unit period. Examples [#examples] ```wolfram Plot[TriangleWave[x], {x, 0, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangleWave.html) for more details. # TriangularDistribution `TriangularDistribution[{min, max}]` represents a symmetric triangular statistical distribution giving values between min and max. * `TriangularDistribution[]` represents a symmetric triangular statistical distribution giving values between 0 and 1. * `TriangularDistribution[{min, max}, c]` represents a triangular distribution with mode at c. Examples [#examples] ```wolfram dist = TriangularDistribution[{0, 10}] ``` ```wolfram Mean[dist] ``` ```wolfram RandomVariate[TriangularDistribution[], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangularDistribution.html) for more details. # TriangulateMesh `TriangulateMesh[mr]` generates a triangulation of the mesh region mr. Examples [#examples] ```wolfram TriangulateMesh[Rectangle[]] ``` ```wolfram TriangulateMesh[Disk[], MaxCellMeasure -> 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TriangulateMesh.html) for more details. # TrigExpand `TrigExpand[expr]` expands out trigonometric functions in expr. Examples [#examples] Expand a double angle: ```wolfram TrigExpand[Sin[2x]] (* 2 Cos[x] Sin[x] *) ``` Expand a sum: ```wolfram TrigExpand[Cos[a + b]] (* Cos[a] Cos[b] - Sin[a] Sin[b] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrigExpand.html) for more details. # TrigFactor `TrigFactor[expr]` factors trigonometric functions in expr. Examples [#examples] Factor a sum of sines: ```wolfram TrigFactor[Sin[x] + Sin[y]] (* 2 Cos[(x - y)/2] Sin[(x + y)/2] *) ``` Factor a difference: ```wolfram TrigFactor[Cos[x] - Cos[y]] (* -2 Sin[(x - y)/2] Sin[(x + y)/2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrigFactor.html) for more details. # TrigFactorList `TrigFactorList[expr]` factors trigonometric functions in expr, yielding a list of lists containing trigonometric monomials and exponents. Examples [#examples] ```wolfram TrigFactorList[Sin[x]^2] (* {{Sin[x], 2}} *) ``` ```wolfram TrigFactorList[Sin[x] Cos[x]] (* {{Cos[x], 1}, {Sin[x], 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrigFactorList.html) for more details. # TrigReduce `TrigReduce[expr]` rewrites products and powers of trigonometric functions in terms of trigonometric functions with combined arguments. Examples [#examples] Reduce trigonometric products: ```wolfram TrigReduce[Sin[x]^2] (* 1/2 (1 - Cos[2 x]) *) ``` Combine products: ```wolfram TrigReduce[Sin[x] Cos[y]] (* 1/2 (Sin[x - y] + Sin[x + y]) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrigReduce.html) for more details. # TrigToExp `TrigToExp[expr]` converts trigonometric functions in expr to exponentials. Examples [#examples] ```wolfram TrigToExp[Sin[x]] (* (E^(I x) - E^(-I x))/(2 I) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrigToExp.html) for more details. # TrimmedMean `TrimmedMean[list, f]` gives the mean of the elements in list after dropping a fraction f of the smallest and largest elements. * `TrimmedMean[list, {f1, f2}]` gives the mean when a fraction f1 of the smallest elements and a fraction f2 of the largest elements are removed. * `TrimmedMean[list]` gives the 5% trimmed mean `TrimmedMean[list, 0.05]`. * `TrimmedMean[dist, ...]` gives the trimmed mean of a univariate distribution dist. Examples [#examples] 5% trimmed mean (default): ```wolfram TrimmedMean[{1, 2, 3, 4, 5, 100}] ``` 10% trimmed mean: ```wolfram TrimmedMean[{1, 2, 3, 4, 5, 6, 7, 8, 9, 100}, 0.1] ``` Asymmetric trimming: ```wolfram TrimmedMean[Range[100], {0.1, 0.2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrimmedMean.html) for more details. # TrimmedVariance `TrimmedVariance[list,f]` gives the variance of the elements in list after dropping a fraction f of the smallest and largest elements. `TrimmedVariance[list,{f1,f2}]` gives the variance when a fraction f1 of the smallest elements and a fraction f2 of the largest elements are removed. `TrimmedVariance[list]` gives the 5% trimmed variance TrimmedVariance\[list,0.05]. `TrimmedVariance[dist,…]` gives the trimmed variance of a univariate distribution dist. Examples [#examples] Compute trimmed variance with 10% trimming: ```wolfram TrimmedVariance[{1, 2, 3, 4, 100}, 0.1] (* 1.25 *) ``` Default 5% trimmed variance: ```wolfram TrimmedVariance[Range[100]] (* 841.25 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrimmedVariance.html) for more details. # TropicalStormData `TropicalStormData[entity, property]` gives the value of the specified property for the tropical storm entity. `TropicalStormData[{entity1, entity2, ...}, property]` gives a list of property values for the specified tropical storm entities. `TropicalStormData[entity, property, annotation]` gives the specified annotation associated with the given property. Examples [#examples] ```wolfram TropicalStormData[Entity["TropicalStorm", "Katrina2005"], "MaximumSustainedWindSpeed"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TropicalStormData.html) for more details. # TruncateSum `TruncateSum[sexpr,n]` truncates each Sum in sexpr to have at most n terms. `TruncateSum[sexpr,{m,n,…}]` truncates each multiple Sum in sexpr using the iterative specification \{m,n,…}. Examples [#examples] Truncate an infinite sum to 5 terms: ```wolfram TruncateSum[Sum[1/n^2, {n, 1, Infinity}], 5] (* Sum[1/n^2, {n, 1, 5}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TruncateSum.html) for more details. # TruncatedDistribution `TruncatedDistribution[{xmin, xmax}, dist]` represents the distribution obtained by truncating the values of dist to lie between xmin and xmax. * `TruncatedDistribution[{{xmin, xmax}, {ymin, ymax}, ...}, dist]` represents the distribution obtained by truncating the values of the multivariate distribution dist to lie between xmin and xmax, ymin and ymax, etc. Examples [#examples] ```wolfram TruncatedDistribution[{0, Infinity}, NormalDistribution[]] ``` ```wolfram Mean[TruncatedDistribution[{0, 1}, UniformDistribution[{-1, 2}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TruncatedDistribution.html) for more details. # TruncatedPolyhedron `TruncatedPolyhedron[poly]` gives the truncated polyhedron of poly by truncating all vertices. * `TruncatedPolyhedron[poly, l]` truncates the polyhedron poly by a length ratio l at its vertices. Examples [#examples] ```wolfram TruncatedPolyhedron[PolyhedronData["Cube"]] ``` ```wolfram TruncatedPolyhedron[PolyhedronData["Tetrahedron"], 0.3] ``` ```wolfram Graphics3D[TruncatedPolyhedron[PolyhedronData["Octahedron"]]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TruncatedPolyhedron.html) for more details. # UnitaryMatrixQ `UnitaryMatrixQ[m]` gives `True` if m is a unitary matrix, and `False` otherwise. A unitary matrix satisfies m†·m = I (conjugate transpose times itself equals identity). Examples [#examples] ```wolfram UnitaryMatrixQ[{{1, 0}, {0, 1}}] ``` ```wolfram UnitaryMatrixQ[{{1, 1}, {1, -1}}/Sqrt[2]] ``` ```wolfram UnitaryMatrixQ[{{1, 2}, {3, 4}}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitaryMatrixQ.html) for more details. # UpperTriangularMatrix `UpperTriangularMatrix[umat]` converts the upper triangular matrix umat to a structured array. Examples [#examples] ```wolfram UpperTriangularMatrix[{{1, 2, 3}, {0, 4, 5}, {0, 0, 6}}] ``` ```wolfram Normal[UpperTriangularMatrix[{{1, 2}, {0, 3}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpperTriangularMatrix.html) for more details. # VandermondeMatrix `VandermondeMatrix[{x1, x2, ..., xn}]` gives an n×n Vandermonde matrix corresponding to the nodes xi. * `VandermondeMatrix[{x1, x2, ..., xn}, k]` gives an n×k Vandermonde matrix. * `VandermondeMatrix[vmat]` converts a Vandermonde matrix vmat to a structured array. Examples [#examples] ```wolfram VandermondeMatrix[{1, 2, 3}] ``` ```wolfram VandermondeMatrix[{a, b, c, d}, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VandermondeMatrix.html) for more details. # VectorAngle `VectorAngle[u, v]` gives the angle between the vectors u and v. Examples [#examples] Angle between 2D vectors: ```wolfram VectorAngle[{1, 0}, {0, 1}] (* Pi/2 *) ``` Angle between 3D vectors: ```wolfram VectorAngle[{1, 0, 0}, {1, 1, 0}] (* Pi/4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorAngle.html) for more details. # VectorAround `VectorAround[{x1, x2, ...}, {δ1, δ2, ...}]` represents a vector of uncorrelated approximate numbers or quantities with values xi and uncertainties δi. * `VectorAround[{x1, x2, ...}, {{Δ11, Δ12, ...}, {Δ12, Δ22, ...}, ...}]` represents a vector of approximate numbers or quantities with values xi and covariance matrix Δ. * `VectorAround[{x1, x2}, {{δ1, δ2}, ρ}]` represents a pair of approximate numbers or quantities with uncertainties δ1, δ2 and correlation factor ρ. * `VectorAround[{x1, x2, ...}, {{δ1, δ2, ...}, {{1, R12, ...}, {R12, 1, ...}, ...}}]` represents a vector of approximate numbers or quantities with uncertainties δi and correlation matrix R. Examples [#examples] ```wolfram VectorAround[{1, 2, 3}, {0.1, 0.2, 0.3}] ``` ```wolfram VectorAround[{5, 10}, {{0.5, 1}, 0.8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorAround.html) for more details. # VectorGreater `VectorGreater[{x, y}]` yields `True` for vectors of length n if xi > yi for all components 1 ≤ i ≤ n. `VectorGreater[{x, y}, κ]` yields `True` for x and y if x - y ∈ interior(κ), where κ is a proper convex cone. Examples [#examples] Check if one vector is componentwise greater than another: ```wolfram VectorGreater[{{3, 4, 5}, {1, 2, 3}}] (* True *) ``` ```wolfram VectorGreater[{{3, 2, 5}, {1, 2, 3}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorGreater.html) for more details. # VectorGreaterEqual `VectorGreaterEqual[{x, y}]` yields `True` for vectors of length n if xi ≥ yi for all components 1 ≤ i ≤ n. * `VectorGreaterEqual[{x, y}, κ]` yields `True` for x and y if x - y ∈ κ, where κ is a proper convex cone. Examples [#examples] ```wolfram VectorGreaterEqual[{{5, 4, 3}, {2, 3, 1}}] ``` ```wolfram VectorGreaterEqual[{{1, 2}, {3, 4}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorGreaterEqual.html) for more details. # VectorLess `x ⪡ y` or `VectorLess[{x, y}]` yields `True` for vectors of length n if xi \< yi for all components 1 ≤ i ≤ n. * `x ⪡κ y` or `VectorLess[{x, y}, κ]` yields `True` for x and y if y - x ∈ interior(κ), where κ is a proper convex cone. This provides element-wise comparison of vectors with respect to partial orderings. Examples [#examples] ```wolfram VectorLess[{{1, 2}, {3, 4}}] ``` ```wolfram VectorLess[{{1, 2, 3}, {4, 5, 6}}] ``` ```wolfram VectorLess[{{1, 1}, {2, 0}}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorLess.html) for more details. # VectorLessEqual `VectorLessEqual[{x, y}]` yields `True` for vectors of length n if xi ≤ yi for all components 1 ≤ i ≤ n. * `VectorLessEqual[{x, y}, κ]` yields `True` for x and y if y - x ∈ κ, where κ is a proper convex cone. Examples [#examples] ```wolfram VectorLessEqual[{{1, 2}, {3, 4}}] ``` ```wolfram VectorLessEqual[{{1, 2, 3}, {2, 3, 4}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorLessEqual.html) for more details. # VectorQ `VectorQ[expr]` gives `True` if expr is a list with no nested lists (a flat vector). `VectorQ[expr, test]` gives `True` only if test yields `True` for each element. Examples [#examples] Test for vectors: ```wolfram VectorQ[{1, 2, 3}] (* True *) ``` Nested lists are not vectors: ```wolfram VectorQ[{{1, 2}, {3, 4}}] (* False *) ``` Test for numeric vectors: ```wolfram VectorQ[{1, 2, 3}, NumericQ] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorQ.html) for more details. # Vectors `Vectors[d]` represents the domain of vectors of dimension d. `Vectors[d, dom]` represents the domain of vectors of dimension d, with components in the domain dom. Examples [#examples] ```wolfram Vectors[3] (* Vectors[3] *) ``` ```wolfram Vectors[3, Reals] (* Vectors[3, Reals] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Vectors.html) for more details. # Vee `Vee[x, y, ...]` displays as x⋁y⋁.... Examples [#examples] ```wolfram Vee[a, b, c] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Vee.html) for more details. # WeightedAdjacencyMatrix `WeightedAdjacencyMatrix[g]` gives the adjacency matrix of edge weights of the graph g. `WeightedAdjacencyMatrix[{v -> w, ...}]` uses rules to specify the graph g. Examples [#examples] Get the weighted adjacency matrix of a graph: ```wolfram g = Graph[{1 -> 2, 2 -> 3}, EdgeWeight -> {2, 3}]; WeightedAdjacencyMatrix[g] // MatrixForm ``` Create from explicit edges: ```wolfram WeightedAdjacencyMatrix[{1 <-> 2, 2 <-> 3, 3 <-> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeightedAdjacencyMatrix.html) for more details. # ZeroSymmetric `ZeroSymmetric[{s1, ..., sn}]` represents the symmetry of a zero tensor in the slots si. Examples [#examples] ```wolfram ZeroSymmetric[{1, 2}] ``` ```wolfram TensorSymmetry[SymmetrizedArray[{}, {3, 3}, ZeroSymmetric[{1, 2}]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ZeroSymmetric.html) for more details. # Decrypt `Decrypt["password", enc]` attempts to decrypt the encrypted object enc using the specified password. `Decrypt[keyspec, enc]` attempts to decrypt using the cryptographic key specification keyspec. `Decrypt[obj]` interactively requests a password with which to try to decrypt obj. Examples [#examples] Decrypt with a password: ```wolfram Decrypt["mypassword", encryptedData] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Decrypt.html) for more details. # DecryptFile `DecryptFile["password", file]` generates a decrypted version of a file, using the specified password. `DecryptFile["password", source, target]` generates a decrypted version of source, putting the result in target. `DecryptFile[keyspec, source, ...]` decrypts using the cryptographic key specification keyspec. Examples [#examples] Decrypt a file: ```wolfram DecryptFile["mypassword", "encrypted.dat", "decrypted.dat"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DecryptFile.html) for more details. # Encrypt `Encrypt["password", expr]` encrypts expr using the specified password, returning an encrypted object. `Encrypt[keyspec, expr]` encrypts expr using the cryptographic key specification keyspec. `Encrypt[expr]` interactively requests a password with which to encrypt expr. Examples [#examples] Encrypt data with password: ```wolfram enc = Encrypt["secret", "My private data"] (* EncryptedObject[...] *) ``` Decrypt it: ```wolfram Decrypt["secret", enc] (* "My private data" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Encrypt.html) for more details. # EncryptFile `EncryptFile["password", file]` generates an encrypted version of a file, using the specified password. `EncryptFile["password", source, target]` generates an encrypted version of source, putting the result in target. `EncryptFile[keyspec, source, ...]` encrypts using the cryptographic key specification keyspec. Examples [#examples] Encrypt a file with a password: ```wolfram EncryptFile["mypassword", "data.txt", "data.enc"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EncryptFile.html) for more details. # EncryptedObject `EncryptedObject[assoc]` represents encrypted data generated by `Encrypt`. Examples [#examples] Create encrypted object: ```wolfram enc = Encrypt["password", {1, 2, 3}] (* EncryptedObject[...] *) ``` Check properties: ```wolfram enc["Properties"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EncryptedObject.html) for more details. # ExternalFunction `ExternalFunction[sys,"f"]` represents an external function named "f" defined in the external evaluator sys. * `ExternalFunction[session,"f"]` represents an external function "f" in the specified ExternalSessionObject. * `ExternalFunction[sys,"code"]` represents an external function defined by the code fragment "code". * `ExternalFunction[obj,"method"]` represents a method bound to the ExternalObject. Examples [#examples] ```wolfram (* Create an external function from Python code *) pyAdd = ExternalFunction["Python", "lambda x, y: x + y"]; pyAdd[3, 5] (* Use a named Python function *) pyLen = ExternalFunction["Python", "len"]; pyLen["hello"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExternalFunction.html) for more details. # GenerateAsymmetricKeyPair `GenerateAsymmetricKeyPair[]` randomly generates a PrivateKey and corresponding PublicKey object for use with public-key cryptographic functions. * `GenerateAsymmetricKeyPair[type]` randomly generates private and public keys of the specified type. * `GenerateAsymmetricKeyPair[opts]` randomly generates keys using the specified options. Examples [#examples] Generate an RSA key pair: ```wolfram keys = GenerateAsymmetricKeyPair[] ``` Generate an ECC key pair: ```wolfram GenerateAsymmetricKeyPair["EllipticCurve"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GenerateAsymmetricKeyPair.html) for more details. # GenerateDerivedKey `GenerateDerivedKey[password]` generates a DerivedKey object from the password given. * `GenerateDerivedKey[password, salt]` generates a DerivedKey object from the password and salt given. Examples [#examples] Generate a derived key from a password: ```wolfram GenerateDerivedKey["mypassword"] ``` Generate with a specific salt: ```wolfram GenerateDerivedKey["mypassword", "mysalt"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GenerateDerivedKey.html) for more details. # GenerateDigitalSignature `GenerateDigitalSignature[expr, key]` generates a digital signature for expr using the specified private key. * `GenerateDigitalSignature[key]` represents an operator form that can be applied to expressions. Examples [#examples] Generate a digital signature: ```wolfram keys = GenerateAsymmetricKeyPair[]; sig = GenerateDigitalSignature["Hello", keys["PrivateKey"]] ``` Verify the signature: ```wolfram VerifyDigitalSignature[{"Hello", sig}, keys["PublicKey"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GenerateDigitalSignature.html) for more details. # GenerateSymmetricKey `GenerateSymmetricKey[]` randomly generates a SymmetricKey object suitable for use with cryptographic functions. * `GenerateSymmetricKey["password"]` derives a SymmetricKey object from the password string given. * `GenerateSymmetricKey[bytes]` generates a SymmetricKey object using the byte array directly as the key. * `GenerateSymmetricKey[DerivedKey[...]]` generates a symmetric key from a DerivedKey object. * `GenerateSymmetricKey[opts]` randomly generates a symmetric key using the specified options. Examples [#examples] Generate a random symmetric key: ```wolfram key = GenerateSymmetricKey[] ``` Generate from a password: ```wolfram GenerateSymmetricKey["mypassword"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GenerateSymmetricKey.html) for more details. # Hash `Hash[expr]` gives an integer hash code for the expression expr. `Hash[expr, type]` gives a hash digest of the specified type (e.g., "MD5", "SHA256"). Examples [#examples] Default hash: ```wolfram Hash["hello"] (* 2860851879461191 *) ``` SHA-256 hash: ```wolfram Hash["hello", "SHA256", "HexString"] (* "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hash.html) for more details. # HostLookup `HostLookup[name]` gives the IP address for the host with the specified name. `HostLookup[address]` gives the host name for the host at the specified IP address. `HostLookup[spec, prop]` gives a specified property of the host. `HostLookup[spec, All]` gives an association of properties found for the host. Examples [#examples] Look up the IP address of a host: ```wolfram HostLookup["www.wolfram.com"] (* "140.177.1.18" *) ``` Get all properties for a host: ```wolfram HostLookup["www.wolfram.com", All] (* <|"Name" -> "www.wolfram.com", "IPAddress" -> ...| *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HostLookup.html) for more details. # IPAddress `IPAddress["address"]` is a symbolic representation of an IPv4 or IPv6 IP address. Examples [#examples] Create an IPv4 address: ```wolfram IPAddress["192.168.1.1"] (* IPAddress["192.168.1.1"] *) ``` Create an IPv6 address: ```wolfram IPAddress["::1"] (* IPAddress["::1"] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IPAddress.html) for more details. # Kernels `Kernels[]` gives the list of running kernels available for parallel computing. Examples [#examples] ```wolfram Kernels[] ``` ```wolfram Length[Kernels[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Kernels.html) for more details. # KillProcess `KillProcess[proc]` kills the external process represented by the ProcessObject proc. Examples [#examples] Start and kill a process: ```wolfram proc = StartProcess[{"sleep", "100"}]; KillProcess[proc] ``` Check process status: ```wolfram proc = StartProcess[{"ls"}]; KillProcess[proc]; ProcessStatus[proc] (* "Finished" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KillProcess.html) for more details. # RunProcess `RunProcess["command"]` runs the specified external command, returning information on the outcome. `RunProcess[{"command", arg1, arg2, ...}]` runs the specified command, with command-line arguments. `RunProcess[command, "prop"]` returns only the specified property. Examples [#examples] Run a command and get output: ```wolfram RunProcess[{"echo", "Hello"}]["StandardOutput"] (* "Hello\n" *) ``` Get exit code: ```wolfram RunProcess[{"ls", "-la"}]["ExitCode"] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RunProcess.html) for more details. # StartProcess `StartProcess["executable"]` executes an external program, yielding a ProcessObject to represent the resulting subprocess. `StartProcess[{"executable", arg1, arg2, ...}]` executes an external program, passing it the specified arguments. Examples [#examples] Start a process: ```wolfram proc = StartProcess[{"sleep", "5"}] (* ProcessObject[...] *) ``` Check process status: ```wolfram ProcessStatus[proc] (* "Running" or "Finished" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StartProcess.html) for more details. # URL `URL["url"]` is a symbolic representation of a URL. Examples [#examples] ```wolfram URL["https://www.wolfram.com"] ``` ```wolfram Import[URL["https://example.com/data.json"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URL.html) for more details. # URLBuild `URLBuild["path",{param1->val1,param2->val2,...}]` builds a URL with the specified path and query parameters and values parami and vali. `URLBuild[{path1,path2,...}]` builds a URL from the path components pathi. `URLBuild[path,params]` builds a URL from a specification of a path and query parameters. `URLBuild[assoc]` builds a URL from an association of components. `URLBuild[assoc,params]` builds a URL from an association of components, plus query parameters and values. Examples [#examples] Build a URL with query parameters: ```wolfram URLBuild["https://example.com", {"name" -> "test", "id" -> 123}] (* "https://example.com?name=test&id=123" *) ``` Build a URL from path components: ```wolfram URLBuild[{"https://example.com", "api", "v1", "data"}] (* "https://example.com/api/v1/data" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLBuild.html) for more details. # URLDecode `URLDecode["string"]` decodes a URL-style percent-encoded string. Examples [#examples] Decode a URL-encoded string: ```wolfram URLDecode["Hello%20World"] (* "Hello World" *) ``` Decode special characters: ```wolfram URLDecode["test%3Dvalue%26key%3D123"] (* "test=value&key=123" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLDecode.html) for more details. # URLDispatcher `URLDispatcher[{patt1 -> content1, patt2 -> content2, ...}]` represents a dispatcher for deployed URLs that specifies that URLs with relative paths matching the string patterns patti should give content represented by contenti. Examples [#examples] ```wolfram URLDispatcher[{"/" -> "Home", "/about" -> "About Us"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLDispatcher.html) for more details. # URLDownload `URLDownload[url]` downloads the content of the specified URL to a local temporary file. * `URLDownload[{url1, url2, ...}]` downloads the contents of the specified URLs to files in a local temporary directory. * `URLDownload[url, file]` downloads to a specified file. * `URLDownload[{url1, url2, ...}, dir]` downloads to a specified directory. * `URLDownload[HTTPRequest[...], ...]` downloads the result of the specified HTTP request. * `URLDownload[{req1, req2, ...}, ...]` downloads the results of the list of HTTP requests. * `URLDownload[req, loc, "elem"]` returns only the element elem from the response. * `URLDownload[req, loc, {elem1, elem2, ...}]` returns an association of the values of the elements elemi. Examples [#examples] ```wolfram URLDownload["https://www.wolfram.com/"] ``` ```wolfram URLDownload["https://example.com/file.txt", "local.txt"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLDownload.html) for more details. # URLDownloadSubmit `URLDownloadSubmit[url, file]` submits the specified URL to be downloaded asynchronously to the file given. * `URLDownloadSubmit[url, file, {param1 -> val1, param2 -> val2, …}]` submits the specified URL, adding elements with names parami and values vali. * `URLDownloadSubmit[obj, …]` submits the cloud object obj. * `URLDownloadSubmit[HTTPRequest[…], …]` submits the specified HTTP request. Examples [#examples] ```wolfram URLDownloadSubmit["https://example.com/file.zip", "/tmp/file.zip"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLDownloadSubmit.html) for more details. # URLEncode `URLEncode["string"]` converts "string" into a URL-style, percent-encoded ASCII string. Examples [#examples] Encode a string with spaces: ```wolfram URLEncode["Hello World"] (* "Hello%20World" *) ``` Encode special characters: ```wolfram URLEncode["test=value&key=123"] (* "test%3Dvalue%26key%3D123" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLEncode.html) for more details. # URLExecute `URLExecute[url]` executes the specified URL, importing whatever result is generated. `URLExecute[url, {param1 -> val1, param2 -> val2, …}]` executes the specified URL, adding elements with names parami and values vali. `URLExecute[url, params, format]` imports the result using the specified format. `URLExecute[HTTPRequest[…], …]` executes the specified HTTP request. Examples [#examples] ```wolfram URLExecute["https://httpbin.org/get"] (* <|"args" -> <||>, "headers" -> ...| *) ``` ```wolfram URLExecute["https://httpbin.org/post", {"key" -> "value"}, "JSON"] (* <|"data" -> ...|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLExecute.html) for more details. # URLExpand `URLExpand["url"]` expands a shortened "url". Examples [#examples] ```wolfram URLExpand["https://bit.ly/3example"] ``` ```wolfram URLExpand["https://tinyurl.com/abc123"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLExpand.html) for more details. # URLFetch `URLFetch[url]` returns the contents of a URL as a string. `URLFetch[url, elements]` returns the specified elements from a URL. Examples [#examples] Fetch content from a URL: ```wolfram URLFetch["https://httpbin.org/get"] (* "{\"args\": {}, ...}" *) ``` Fetch specific elements: ```wolfram URLFetch["https://example.com", "StatusCode"] (* 200 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLFetch.html) for more details. # URLFetchAsynchronous `URLFetchAsynchronous[url, func]` performs a connection in the background, calling func when an event is raised. Examples [#examples] Fetch URL asynchronously: ```wolfram URLFetchAsynchronous["https://example.com", Print] ``` Handle response events: ```wolfram URLFetchAsynchronous[url, Function[{ev, data}, If[ev == "data", process[data]]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLFetchAsynchronous.html) for more details. # URLParse `URLParse["url"]` takes a well-formed URL and gives an association whose values correspond to the components of the URL. * `URLParse["url", "component"]` returns only the specified component. * `URLParse["url", {component1, component2, ...}]` returns only the specified component list. Examples [#examples] ```wolfram URLParse["https://example.com:8080/path?query=1#fragment"] ``` ```wolfram URLParse["https://user:pass@host.com/page", "Host"] ``` ```wolfram URLParse["https://example.com/path", {"Scheme", "Path"}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLParse.html) for more details. # URLQueryDecode `URLQueryDecode["string"]` decodes a URL-style query string into a list of key-value rules. Examples [#examples] ```wolfram URLQueryDecode["name=John&age=30"] ``` ```wolfram URLQueryDecode["key=value%20with%20spaces"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLQueryDecode.html) for more details. # URLQueryEncode `URLQueryEncode[<|key1 -> val1, key2 -> val2, ...|>]` creates a URL-style query string from an association of keys and values. * `URLQueryEncode[{param1 -> val1, param2 -> val1, ...}]` creates a query string from a list of rules. Examples [#examples] ```wolfram URLQueryEncode[<|"name" -> "John", "age" -> "30"|>] (* "name=John&age=30" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLQueryEncode.html) for more details. # URLRead `URLRead[url]` sends a request to a URL and reads back the response, returning it as a response object. `URLRead[assoc]` sends a request to a URL built from an association of components and metadata elements. `URLRead[HTTPRequest[...]]` sends a request specified by a symbolic HTTPRequest object. `URLRead[req, "elem"]` returns only the element elem from the response. Examples [#examples] Read from a URL: ```wolfram URLRead["https://httpbin.org/get"] (* HTTPResponse[...] *) ``` Get specific element: ```wolfram URLRead["https://example.com", "Body"] (* "<!doctype html>..." *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLRead.html) for more details. # URLResponseTime `URLResponseTime[url]` gives the total number of seconds to request one byte from the specified URL. `URLResponseTime[url,prop]` gives the specified timing. Examples [#examples] ```wolfram URLResponseTime["https://www.wolfram.com"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLResponseTime.html) for more details. # URLSave `URLSave["url"]` saves the content of the URL to a file in \$TemporaryDirectory. * `URLSave["url", "file"]` saves the content of the URL to a file. * `URLSave["url", "file", elements]` returns the specified elements from a URL. Examples [#examples] ```wolfram URLSave["https://www.wolfram.com"] ``` ```wolfram URLSave["https://www.wolfram.com", "page.html"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLSave.html) for more details. # URLSaveAsynchronous `URLSaveAsynchronous["url", "file", func]` performs a download to "file" in the background, calling func when an event is raised. Examples [#examples] ```wolfram URLSaveAsynchronous["https://example.com/file.zip", "local.zip", Print[#] &] ``` ```wolfram URLSaveAsynchronous[url, file, Function[{status, data}, If[status === "done", Print["Complete"]]]] ``` ```wolfram task = URLSaveAsynchronous["https://example.com/data.csv", "data.csv", callback] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLSaveAsynchronous.html) for more details. # URLShorten `URLShorten["url"]` creates a shortened URL that redirects to "url". Examples [#examples] ```wolfram URLShorten["https://www.wolfram.com/mathematica/"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLShorten.html) for more details. # URLSubmit `URLSubmit[url]` submits the specified URL to be executed asynchronously. `URLSubmit[url,{param1->val1,param2->val2,…}]` submits the specified URL, adding elements with names parami and values vali. `URLSubmit[obj,…]` submits the cloud object obj. `URLSubmit[HTTPRequest[…],…]` submits the specified HTTP request. Examples [#examples] ```wolfram URLSubmit["https://httpbin.org/get"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/URLSubmit.html) for more details. # Plotly ```wolfram Plotly[f, {x, xmin, xmax}] ``` mimics the behavior of a native [Plot](../Plotting-Functions/Plot) using a well-known [PlotlyJS](https://plotly.com/javascript/) library. It is quite limited and **does not support options**. ```wolfram Plotly[data_Association, layout_Association:Null] _PlotlyInstance ``` creates `Plotly` instance object, which **gives a direct API access to a native Plotly Javascript engine** ✨ and returns `PlotlyInstance` `data` expression contains the parameters of a default Plotly Javascript constructor This is 1:1 correspondence to a normal Plotly API. Please see [Reference](https://plotly.com/javascript/) [RGBColor](../Graphics/RGBColor) will also work normally as well as `ColorData` for coloring the plots. There is no need in JS/CSS-like color specifications Constructor [#constructor] Once called it returns `PlotlyInstance` Options [#options] ImageSize [#imagesize] Sets the image size effectively writing `width` and `height` to `layout` properties. Transitions and updates [#transitions-and-updates] It fully supports updates, but in a different way compared to other functions. Please see for that [PlotlyAddTraces](../Plotly/PlotlyAddTraces), [PlotlyAnimate](../Plotly/PlotlyAnimate) and etc. `PlotlyInstance` automatically tracks its window. Examples [#examples] Scatter plot [#scatter-plot] Adapted from [Ref](https://plotly.com/javascript/line-and-scatter/). ```wolfram trace1 = <| "x" -> {1, 2, 3, 4}, "y" -> {10, 15, 13, 17}, "mode" -> "markers", "type" -> "scatter" |>; Plotly[trace1] ``` or with colors ```wolfram trace1 = <| "y" -> Table[5, {i, 1, 40}], "mode" -> "markers", "marker" -> <| "size" -> 40, "color" -> Range[40] |> |>; Plotly[trace1] ``` Line charts [#line-charts] Adapted from [Ref](https://plotly.com/javascript/line-charts/) ```wolfram trace1 = <| "x" -> {1, 2, 3, 4}, "y" -> {10, 15, 13, 17}, "type" -> "line" |>; Plotly[trace1] ``` or an array of traces ```wolfram trace := <| "y" -> RandomReal[{-1,1}, 10], "type" -> "line" |>; Plotly[{trace, trace, trace}] ``` Bar plot [#bar-plot] Adapted from PlotlyJS ```wolfram trace = <| "x" -> {"giraffes", "orangutans", "monkeys"}, "y" -> {20, 14, 23}, "type" -> "bar" |>; Plotly[trace] ``` Pie chart [#pie-chart] Adapted from PlotlyJS ```wolfram trace = <| "values" -> {19, 26, 55}, "labels" -> {"Residential", "Non-Residential", "Utility"}, "type" -> "pie" |>; Plotly[trace] ``` Bubble chart [#bubble-chart] Adapted from PlotlyJS ```wolfram data = <| "x" -> {1, 2, 3, 4}, "y" -> {10, 11, 12, 13}, "mode" -> "markers", "marker" -> <| "size" -> {40, 60, 80, 100} |> |>; Plotly[data] ``` Heatmaps [#heatmaps] Adapted from PlotlyJS ```wolfram data = <| "z" -> Table[x y, {x,-10,10}, {y,-10,10}], "type" -> "heatmap" |>; Plotly[data] ``` Contour Plots [#contour-plots] Adapted from PlotlyJS ```wolfram data = Flatten[Table[{x,y,x y}, {x,-10,10}, {y,-10,10}],1] // Transpose; data = <| "x" -> data[[1]], "y" -> data[[2]], "z" -> data[[3]], "type" -> "contour" |>; Plotly[data] ``` Surface plot [#surface-plot] Adapted from PlotlyJS ```wolfram data = <| "z" -> Table[x y, {x,-10,10}, {y,-10,10}], "type" -> "surface" |>; Plotly[data] ``` WebGL Scatter [#webgl-scatter] A GPU accelerated scatter plot used for displaying many points ```wolfram data = RandomReal[{-1,1}, {2,100000}]; Plotly[<| "y" -> data[[2]], "x" -> data[[1]], "mode"-> "markers", "type"-> "scattergl" |>] ``` *50x zoom* Many more! [#many-more] Please visit [PlotlyJS website](https://plotly.com/javascript/) TODO [#todo] Developers notes * [ ] Integrate events system with click events and others... Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # PlotlyAddTraces ```wolfram PlotlyAddTraces[p_PlotInstance, {data_Association} | _Association, opts___] ``` appends to a plot `p` new data specified in `data`. See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. Example [#example] Plot an example data ```wolfram p = Plotly[<| "x" -> Range[100], "y" -> Table[Sin[2Pi x / 100.0], {x,100}], "mode" -> "line" |>] ``` To dynamically add new traces, we can call directly ```wolfram PlotlyAddTraces[p, <| "x" -> Range[100], "y" -> Table[Cos[4Pi x / 100.0], {x,100}] |>] ``` # PlotlyAnimate ```wolfram PlotlyAnimate[p_PlotlyInstance, data_Association, transition_Association, opts___] ``` animates efficiently any [Plotly](../Plotly/Plotly) graph with a new `data` with a specified `transition`. See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. Example [#example] An example ```wolfram p = Plotly[<| "y" -> Table[Sin[2Pi x / 100.0], {x,100}], "mode"-> "markers", "type"-> "scatter" |>] ``` ```wolfram freq = 0.5; task = SetInterval[ PlotlyAnimate[p, <| "data" -> { <|"y" -> Table[Sin[freq Pi x / 100.0], {x,100}]|> }, "trace" -> {0}, "layout" -> <||> |>, <| "transition" -> <| "duration"->30, "easing"->"linear" |>, "frame" -> <| "duration"->30 |> |> ]; freq += 0.3; , 30]; SetTimeout[TaskRemove[task], 2000]; ``` # PlotlyDeleteTraces ```wolfram PlotlyDeleteTraces[p_PlotlyInstance, traces_List, opts___] ``` removes traces listed in `traces` with indexes starting from `0` See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. # PlotlyExtendTraces ```wolfram PlotlyExtendTraces[p_PlotlyInstance, data_Association, {target_Integer}, opts___] ``` appends new points `data` to a given trace indexed by `trace` number (starting from 0) See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. Example [#example] Create a dummy plot ```wolfram p = Plotly[<| "y" -> Table[Sin[2Pi x / 100.0], {x,100}], "mode" -> "line" |>] ``` now lets add data dynamically ```wolfram task = SetInterval[ PlotlyExtendTraces[p, <| "y" -> {{RandomReal[]}} |>, {0}] , 100]; SetTimeout[TaskRemove[task], 2000]; ``` # PlotlyInstance an object generated by [Plotly](../Plotly/Plotly) # PlotlyPrependTraces the same as [PlotlyExtendTraces](../Plotly/PlotlyExtendTraces), but adds to the beginning # PlotlyReact ```wolfram PlotlyReact[p_PlotlyInstance, data_Association, opts___] ``` ```wolfram PlotlyReact[p_PlotlyInstance, {data_Association ..}, layout_Association, opts___] ``` fully recreates a graph using provided data (it is faster than reevaluation) See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) For example ```wolfram p = Plotly[<|"type"->"line", "y"->{1,2,3,4,5,6}|>] ``` And now we can update the whole graph using different data ```wolfram PlotlyReact[p, {<|"type"->"scatter", "y"->110{5,2,3,4,5,6}, "x"->{1,2,3,4,5,6}|>}]; ``` Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. # PlotlyRelayout ```wolfram PlotlyRelayout[p_PlotlyInstance, update_Association, opts___] ``` an efficient means of updating the `layout` object of an existing plot. **Mush faster than [PlotlyReact](../Plotly/PlotlyReact)** See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) For example ```wolfram p = Plotly[<|"type"->"line", "y"->{1,2,3,4,5,6}|>] ``` Change the ranges ```wolfram PlotlyRelayout[p, <|"xaxis.range" -> {0, 5}|>]; ``` Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. # PlotlyRestyle ```wolfram PlotlyRestyle[p_PlotlyInstance, update_Association, opts___] ``` ```wolfram PlotlyRestyle[p_PlotlyInstance, update_Association, trace_Integer, opts___] ``` ```wolfram PlotlyRestyle[p_PlotlyInstance, update_Association, {traces__Integer}, opts___] ``` an efficient means of changing attributes in the `data` array in an existing plot. **Mush faster than [PlotlyReact](../Plotly/PlotlyReact)** See the [official reference](https://plotly.com/javascript/plotlyjs-function-reference/) For example ```wolfram p = Plotly[<|"type"->"line", "y"->{1,2,3,4,5,6}|>] ``` Change the color of markers ```wolfram PlotlyRestyle[p, <|"opacity"->0.4, "marker.color"->"red"|>]; ``` Here is an **interactive example** ```wolfram p = Plotly[<|"type"->"line", "y"->{1,2,3,4,5,6}|>] EventHandler[InputRange[0,1,0.1,1.0], (PlotlyRestyle[p, <|"opacity"->#, "marker.color"->"red"|>])&] ``` Options [#options] "Window" [#window] By default, the `"Window"` option is set to `"Inherited"`. This setting *dynamically* uses the currently active window associated with the [`PlotlyInstance`](../Plotly/PlotlyInstance). When set to `"Inherited"`, even if a new window is opened using the same instance, it will be detected automatically. This is possible because all [`PlotlyInstance`](../Plotly/PlotlyInstance) objects perform a handshake after mounting on the page. To override this behavior, you can provide a specific [`WindowObj`](../Frontend-IO/WindowObj) as an option. # Accuracy `Accuracy[x]` gives the effective number of digits to the right of the decimal point in the number x. Examples [#examples] ```wolfram Accuracy[3.14159265358979] (* 14.5086 *) ``` ```wolfram Accuracy[N[Pi, 50]] (* 49.5086 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Accuracy.html) for more details. # Around `Around[x, δ]` represents an approximate number or quantity with a value around x and an uncertainty δ. `Around[x, {δ-, δ+}]` represents a number or quantity with a value around x and asymmetric uncertainties δ-, δ+. `Around[list]` gives an approximate object around the mean of the elements of list with an uncertainty corresponding to their standard deviation. Examples [#examples] Create a number with uncertainty: ```wolfram Around[10, 2] (* 10 ± 2 *) ``` Arithmetic with uncertainties: ```wolfram Around[10, 1] + Around[5, 0.5] (* Around[15, 1.12] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Around.html) for more details. # AroundReplace `AroundReplace[expr, {s1 -> Around[x1, δ1], s2 -> Around[x2, δ2], ...}]` propagates uncertainty in expr by replacing all occurrences of si by `Around[xi, δi]`. `AroundReplace[expr, rules, n]` propagates uncertainty in expr using a series expansion to order n. Examples [#examples] Propagate uncertainty through an expression: ```wolfram AroundReplace[x + y, {x -> Around[10, 1], y -> Around[5, 0.5]}] (* Around[15, 1.12] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AroundReplace.html) for more details. # Chop `Chop[expr]` replaces approximate real numbers in expr that are close to zero by the exact integer 0. `Chop[expr, delta]` replaces numbers smaller in absolute magnitude than delta by 0. Examples [#examples] Remove small numerical noise: ```wolfram Chop[0.00000001] (* 0 *) ``` Chop complex numbers: ```wolfram Chop[1.0 + 1.*^-12 I] (* 1. *) ``` Custom tolerance: ```wolfram Chop[0.001, 0.01] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Chop.html) for more details. # CompatibleUnitQ `CompatibleUnitQ[quantity1, quantity2]` returns True if quantity1 and quantity2 have compatible units, and False otherwise. Examples [#examples] ```wolfram CompatibleUnitQ[Quantity[1, "Meters"], Quantity[1, "Feet"]] (* True *) ``` ```wolfram CompatibleUnitQ[Quantity[1, "Meters"], Quantity[1, "Seconds"]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompatibleUnitQ.html) for more details. # EquirippleFilterKernel `EquirippleFilterKernel[{{{ωL1, ωR1}, {ωL2, ωR2}, ...}, {a1, a2, ...}}, n]` creates a finite impulse response (FIR) filter kernel of length n with an equiripple amplitude response. `EquirippleFilterKernel[{{{ωL1, ωR1}, ...}, {a1, ...}, {w1, ...}}, n]` uses relative weights wi for each frequency band. `EquirippleFilterKernel[{"type", {{{ωL1, ωR1}, ...}, ...}}, n]` creates a filter of the specified "type". Examples [#examples] Create an equiripple lowpass filter: ```wolfram EquirippleFilterKernel[{{{0, 0.3}, {0.4, 1}}, {1, 0}}, 31] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EquirippleFilterKernel.html) for more details. # ExactNumberQ `ExactNumberQ[expr]` returns `True` if expr is an exact real or complex number, and `False` otherwise. Examples [#examples] Test if a number is exact: ```wolfram ExactNumberQ[3/7] (* True *) ``` Approximate numbers return False: ```wolfram ExactNumberQ[3.14] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExactNumberQ.html) for more details. # FindDivisions `FindDivisions[{xmin,xmax},n]` finds a list of about n "nice" numbers that divide the interval around xmin to xmax into equally spaced parts. * `FindDivisions[{xmin,xmax,dx},n]` makes the parts always have lengths that are integer multiples of dx. * `FindDivisions[{xmin,xmax},{n1,n2,…}]` finds successive subdivisions into about n1, n2, … parts. * `FindDivisions[{xmin,xmax,{dx1,dx2,…}},{n1,n2,…}]` uses spacings that are forced to be multiples of dx1, dx2, …. Examples [#examples] ```wolfram (* Find 5 nice divisions for 0 to 10 *) FindDivisions[{0, 10}, 5] (* Force multiples of 0.5 *) FindDivisions[{0, 10, 0.5}, 5] (* Nested subdivisions *) FindDivisions[{0, 100}, {5, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindDivisions.html) for more details. # FindInstance `FindInstance[expr, vars]` finds an instance of vars that makes the statement expr be True. Examples [#examples] Find an integer solution: ```wolfram FindInstance[x^2 + y^2 == 25, {x, y}, Integers] (* {{x -> 0, y -> -5}} *) ``` Find multiple instances: ```wolfram FindInstance[x^2 < 10, x, Integers, 5] (* {{x -> -3}, {x -> -2}, {x -> -1}, {x -> 0}, {x -> 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindInstance.html) for more details. # FindPeaks `FindPeaks[list]` gives positions and values of the detected peaks in list. `FindPeaks[list,σ]` finds peaks that survive Gaussian blurring up to scale σ. `FindPeaks[list,σ,s]` finds peaks with minimum sharpness s. `FindPeaks[list,σ,s,t]` finds only peaks with values greater than t. `FindPeaks[list,σ,{s,σs},{t,σt}]` uses different scales for thresholding sharpness and value. Examples [#examples] Find peaks in a list: ```wolfram FindPeaks[{1, 3, 2, 5, 1, 4, 2}] (* {{2, 3}, {4, 5}, {6, 4}} *) ``` Find peaks with minimum value threshold: ```wolfram FindPeaks[{1, 3, 2, 5, 1, 4, 2}, 0, 0, 4] (* {{4, 5}, {6, 4}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPeaks.html) for more details. # FindThreshold `FindThreshold[image]` finds a global threshold value that partitions the intensity values in image into two intervals. Examples [#examples] Find an optimal threshold for an image: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; FindThreshold[img] ``` Use the threshold for binarization: ```wolfram t = FindThreshold[img]; Binarize[img, t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindThreshold.html) for more details. # FractionalPart `FractionalPart[x]` gives the fractional part of x. Examples [#examples] Fractional part of positive number: ```wolfram FractionalPart[3.7] (* 0.7 *) ``` Fractional part of negative number: ```wolfram FractionalPart[-2.3] (* -0.3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FractionalPart.html) for more details. # FrequencySamplingFilterKernel `FrequencySamplingFilterKernel[{a1, ..., ak}]` creates a finite impulse response (FIR) filter kernel using a frequency sampling method from amplitude values ai. * `FrequencySamplingFilterKernel[{a1, ..., ak}, m]` creates an FIR filter kernel of type m. Examples [#examples] Create a lowpass filter kernel: ```wolfram FrequencySamplingFilterKernel[{1, 1, 1, 0, 0, 0, 0, 0, 1, 1}] ``` Apply the filter to data: ```wolfram kernel = FrequencySamplingFilterKernel[{1, 1, 0, 0}]; ListConvolve[kernel, data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FrequencySamplingFilterKernel.html) for more details. # FromDigits `FromDigits[list]` constructs an integer from the list of its decimal digits. `FromDigits[list, b]` takes the digits to be given in base b. `FromDigits["string"]` constructs an integer from a string of digits. Examples [#examples] Construct integer from digits: ```wolfram FromDigits[{1, 2, 3, 4, 5}] (* 12345 *) ``` Convert from binary: ```wolfram FromDigits[{1, 0, 1, 0, 1, 0}, 2] (* 42 *) ``` From a string: ```wolfram FromDigits["9876"] (* 9876 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromDigits.html) for more details. # IndependentUnit `IndependentUnit[string]` represents a unit string with no relationship to other units within a Quantity. Examples [#examples] ```wolfram Quantity[5, IndependentUnit["apples"]] (* 5 apples *) ``` ```wolfram Quantity[3, IndependentUnit["widgets"]] + Quantity[2, IndependentUnit["widgets"]] (* 5 widgets *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndependentUnit.html) for more details. # IndependentUnitDimension `IndependentUnitDimension[dim]` represents the base dimension dim associated with an independent physical quantity or unit. Examples [#examples] ```wolfram IndependentUnitDimension["Length"] ``` ```wolfram UnitDimensions[Quantity[1, "Meters"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndependentUnitDimension.html) for more details. # InexactNumberQ `InexactNumberQ[expr]` returns True if expr is an inexact real or complex number, and returns False otherwise. Examples [#examples] ```wolfram InexactNumberQ[3.14] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InexactNumberQ.html) for more details. # IntegerDigits `IntegerDigits[n]` gives a list of the decimal digits in the integer n. `IntegerDigits[n, b]` gives the digits in base b. `IntegerDigits[n, b, len]` pads the list on the left with zeros to give a list of length len. Examples [#examples] Get decimal digits: ```wolfram IntegerDigits[12345] (* {1, 2, 3, 4, 5} *) ``` Binary representation: ```wolfram IntegerDigits[42, 2] (* {1, 0, 1, 0, 1, 0} *) ``` Pad to fixed length: ```wolfram IntegerDigits[42, 2, 8] (* {0, 0, 1, 0, 1, 0, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerDigits.html) for more details. # IntegerPart `IntegerPart[x]` gives the integer part of x. Examples [#examples] Integer part of positive: ```wolfram IntegerPart[3.7] (* 3 *) ``` Integer part of negative: ```wolfram IntegerPart[-3.7] (* -3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerPart.html) for more details. # IntegerPartitions `IntegerPartitions[n]` gives a list of all possible ways to partition the integer n into smaller integers. `IntegerPartitions[n, k]` gives partitions into at most k integers. `IntegerPartitions[n, {k}]` gives partitions into exactly k integers. `IntegerPartitions[n, {kmin, kmax}]` gives partitions into between kmin and kmax integers. `IntegerPartitions[n, kspec, {s1, s2, ...}]` gives partitions involving only the si. `IntegerPartitions[n, kspec, sspec, m]` limits the result to the first m partitions. Examples [#examples] ```wolfram IntegerPartitions[5] (* {{5}, {4, 1}, {3, 2}, {3, 1, 1}, {2, 2, 1}, {2, 1, 1, 1}, {1, 1, 1, 1, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerPartitions.html) for more details. # InterpolatingFunction `InterpolatingFunction[domain, table]` represents an approximate function whose values are found by interpolation. Examples [#examples] Create from NDSolve: ```wolfram sol = NDSolve[{y'[x] == y[x], y[0] == 1}, y, {x, 0, 1}]; ifun = y /. First[sol] (* InterpolatingFunction[...] *) ``` Evaluate: ```wolfram ifun[0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InterpolatingFunction.html) for more details. # InterpolatingPolynomial `InterpolatingPolynomial[{{x1, f1}, {x2, f2}, ...}, x]` constructs a polynomial in x passing through the given points. `InterpolatingPolynomial[{f1, f2, ...}, x]` uses successive integer x values. Examples [#examples] Through three points: ```wolfram InterpolatingPolynomial[{{0, 1}, {1, 3}, {2, 7}}, x] (* 1 + x + x^2 *) ``` Simplified: ```wolfram Expand[%] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InterpolatingPolynomial.html) for more details. # Interpolation `Interpolation[data]` creates an interpolating function that passes through the given data points. Examples [#examples] Create and use interpolating functions: ```wolfram data = {{0, 0}, {1, 1}, {2, 4}, {3, 9}} f = Interpolation[data] (* Evaluate at any point *) f[1.5] (* 2.25 *) (* Plot the interpolation *) Plot[f[x], {x, 0, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Interpolation.html) for more details. # Interval `Interval[{min, max}]` represents the range of values between min and max. `Interval[{min1, max1}, {min2, max2}, ...]` represents a union of ranges. Examples [#examples] Create an interval: ```wolfram Interval[{0, 1}] (* Interval[{0, 1}] *) ``` Arithmetic with intervals: ```wolfram Interval[{1, 2}] + Interval[{3, 4}] (* Interval[{4, 6}] *) ``` Interval containing a function range: ```wolfram Sin[Interval[{0, Pi}]] (* Interval[{0, 1}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Interval.html) for more details. # IntervalIntersection `IntervalIntersection[interval1, interval2, ...]` gives the interval of points common to all intervals. Examples [#examples] Find overlapping region: ```wolfram IntervalIntersection[Interval[{0, 5}], Interval[{3, 10}]] (* Interval[{3, 5}] *) ``` Non-overlapping intervals: ```wolfram IntervalIntersection[Interval[{0, 2}], Interval[{5, 10}]] (* Interval[] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntervalIntersection.html) for more details. # IntervalMemberQ `IntervalMemberQ[interval, x]` gives `True` if x lies within the interval, and `False` otherwise. `IntervalMemberQ[interval1, interval2]` gives `True` if interval2 is completely contained in interval1. Examples [#examples] Check membership: ```wolfram IntervalMemberQ[Interval[{0, 10}], 5] (* True *) ``` ```wolfram IntervalMemberQ[Interval[{0, 10}], 15] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntervalMemberQ.html) for more details. # IntervalUnion `IntervalUnion[interval1, interval2, ...]` gives an interval containing points in any of the intervals. Examples [#examples] Combine overlapping intervals: ```wolfram IntervalUnion[Interval[{0, 5}], Interval[{3, 10}]] (* Interval[{0, 10}] *) ``` Combine disjoint intervals: ```wolfram IntervalUnion[Interval[{0, 2}], Interval[{5, 10}]] (* Interval[{0, 2}, {5, 10}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntervalUnion.html) for more details. # KnownUnitQ `KnownUnitQ[expr]` returns `True` if `expr` is a canonical unit, and `False` otherwise. * `KnownUnitQ[expr, dims]` gives `True` if `expr` is a canonical unit with physical dimensions `dims`, and `False` otherwise. Examples [#examples] ```wolfram KnownUnitQ["Meters"] ``` ```wolfram KnownUnitQ["Joules", "Energy"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KnownUnitQ.html) for more details. # MachineNumberQ `MachineNumberQ[expr]` returns True if expr is a machine-precision real or complex number, and returns False otherwise. Examples [#examples] Test a machine-precision number: ```wolfram MachineNumberQ[1.5] (* True *) ``` Test an exact number: ```wolfram MachineNumberQ[3/2] (* False *) ``` Test a high-precision number: ```wolfram MachineNumberQ[N[Pi, 50]] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MachineNumberQ.html) for more details. # MachinePrecision `MachinePrecision` is a symbol used to indicate machine-number precision. Examples [#examples] Request machine precision in numerical functions: ```wolfram N[Pi, MachinePrecision] ``` Check the precision of a number: ```wolfram Precision[1.5] (* MachinePrecision *) ``` Use in NDSolve: ```wolfram NDSolve[{y'[x] == y[x], y[0] == 1}, y, {x, 0, 1}, WorkingPrecision -> MachinePrecision] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MachinePrecision.html) for more details. # N `N[expr]` gives the numerical value of expr. `N[expr, n]` attempts to give a result with n-digit precision. Examples [#examples] Numerical approximation: ```wolfram N[Pi] (* 3.14159 *) ``` With specified precision: ```wolfram N[Pi, 20] (* 3.1415926535897932385 *) ``` ```wolfram N[Sqrt[2]] (* 1.41421 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/N.html) for more details. # NArgMax `NArgMax[f, x]` gives a position xmax at which f is numerically globally maximized. `NArgMax[f, {x, y, ...}]` gives a position \{xmax, ymax, ...} at which f is maximized. `NArgMax[{f, cons}, {x, y, ...}]` gives a position maximizing f subject to constraints cons. Examples [#examples] Find maximum location: ```wolfram NArgMax[-x^2 + 4 x, x] (* 2. *) ``` With constraints: ```wolfram NArgMax[{x + y, x^2 + y^2 <= 1}, {x, y}] (* {0.707107, 0.707107} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NArgMax.html) for more details. # NArgMin `NArgMin[f, x]` gives a position xmin at which f is numerically globally minimized. `NArgMin[f, {x, y, ...}]` gives a position \{xmin, ymin, ...} at which f is minimized. `NArgMin[{f, cons}, {x, y, ...}]` gives a position minimizing f subject to constraints cons. Examples [#examples] Find minimum location: ```wolfram NArgMin[x^2 - 4 x + 5, x] (* 2. *) ``` With constraints: ```wolfram NArgMin[{x + y, x >= 0, y >= 0, x + y >= 1}, {x, y}] (* {0., 1.} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NArgMin.html) for more details. # NCaputoD `NCaputoD[f, {x, α}, x0]` gives a numerical approximation to the Caputo fractional derivative C₀Dₓᵅf(x) of order α of the function f at the point x0. Examples [#examples] Fractional derivative of sine: ```wolfram NCaputoD[Sin[x], {x, 0.5}, 1.0] ``` Half derivative of polynomial: ```wolfram NCaputoD[x^2, {x, 0.5}, 2] ``` Compare different orders: ```wolfram Table[NCaputoD[Exp[x], {x, a}, 1], {a, 0.1, 0.9, 0.2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NCaputoD.html) for more details. # NContourIntegrate `NContourIntegrate[f, z ∈ cont]` gives the numerical integral of f along the contour defined by cont in the complex plane. Examples [#examples] ```wolfram NContourIntegrate[1/z, z \[Element] Circle[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NContourIntegrate.html) for more details. # NDEigensystem `NDEigensystem[ℒ[u[x, y, ...]], u, {x, y, ...} ∈ Ω, n]` gives the n smallest magnitude eigenvalues and eigenfunctions for the linear differential operator ℒ over the region Ω. Examples [#examples] Eigenvalues of Laplacian on a disk: ```wolfram {vals, funs} = NDEigensystem[{-Laplacian[u[x, y], {x, y}], DirichletCondition[u[x, y] == 0, True]}, u, {x, y} ∈ Disk[], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NDEigensystem.html) for more details. # NDEigenvalues `NDEigenvalues[ℒ[u[x, y, ...]], u, {x, y, ...} ∈ Ω, n]` gives the n smallest magnitude eigenvalues for the linear differential operator ℒ over the region Ω. * `NDEigenvalues[{ℒ1[u, v, ...], ℒ2[u, v, ...], ...}, {u, v, ...}, {x, y, ...} ∈ Ω, n]` gives eigenvalues for the coupled differential operators over the region Ω. * `NDEigenvalues[eqns, {u, ...}, t, {x, y, ...} ∈ Ω, n]` gives the eigenvalues in the spatial variables for solutions of the coupled time-dependent differential equations eqns. Examples [#examples] ```wolfram NDEigenvalues[{-Laplacian[u[x, y], {x, y}], DirichletCondition[u[x, y] == 0, True]}, u, {x, y} \[Element] Disk[], 5] ``` ```wolfram NDEigenvalues[-u''[x], u, {x, 0, Pi}, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NDEigenvalues.html) for more details. # NDSolve `NDSolve[eqns, u, {x, xmin, xmax}]` finds a numerical solution to the ordinary differential equations eqns for the function u with independent variable x in the specified range. Examples [#examples] Solve a simple ODE numerically: ```wolfram sol = NDSolve[{y'[x] == y[x], y[0] == 1}, y, {x, 0, 5}] ``` Plot the solution: ```wolfram Plot[Evaluate[y[x] /. sol], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NDSolve.html) for more details. # NDSolveValue `NDSolveValue[eqns, expr, {x, xmin, xmax}]` gives the value of expr determined by numerical solution to differential equations. Examples [#examples] Solve ODE and get function: ```wolfram sol = NDSolveValue[{y'[x] == y[x], y[0] == 1}, y, {x, 0, 2}] sol[1.0] (* 2.718 *) ``` Plot the solution: ```wolfram Plot[sol[x], {x, 0, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NDSolveValue.html) for more details. # NIntegrate `NIntegrate[f, {x, xmin, xmax}]` gives a numerical approximation to the definite integral. Examples [#examples] Numerical integration: ```wolfram NIntegrate[Sin[x]^2, {x, 0, Pi}] (* 1.5708 *) ``` Double integral: ```wolfram NIntegrate[x y, {x, 0, 1}, {y, 0, 1}] (* 0.25 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NIntegrate.html) for more details. # NLineIntegrate `NLineIntegrate[f, {x, y, ...} ∈ curve]` computes the numerical scalar line integral of the function f\[x, y, ...] over the curve. * `NLineIntegrate[{p, q, ...}, {x, y, ...} ∈ curve]` computes the numerical vector line integral of the vector function \{p\[x, y, ...], q\[x, y, ...], ...}. Examples [#examples] ```wolfram NLineIntegrate[1, {x, y} ∈ Circle[]] ``` ```wolfram NLineIntegrate[x^2 + y^2, {x, y} ∈ Line[{{0, 0}, {1, 1}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NLineIntegrate.html) for more details. # NMaxValue `NMaxValue[f, x]` gives the global maximum value of f with respect to x. * `NMaxValue[f, {x, y, ...}]` gives the global maximum value of f with respect to x, y, .... * `NMaxValue[{f, cons}, {x, y, ...}]` gives the global maximum value of f subject to the constraints cons. * `NMaxValue[..., x ∈ reg]` constrains x to be in the region reg. Examples [#examples] Find the maximum of a function: ```wolfram NMaxValue[Sin[x] Cos[x], x] ``` Maximum with constraints: ```wolfram NMaxValue[{x^2 + y^2, x + y <= 1}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NMaxValue.html) for more details. # NMaximize `NMaximize[f, x]` searches for a global maximum in f numerically with respect to x. Examples [#examples] Global maximum: ```wolfram NMaximize[Sin[x] + Sin[2x], {x, 0, 10}] (* {1.76, {x -> 1.04}} *) ``` With constraints: ```wolfram NMaximize[{x + y, x^2 + y^2 <= 1}, {x, y}] (* {1.414, {x -> 0.707, y -> 0.707}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NMaximize.html) for more details. # NMinValue `NMinValue[f, x]` gives the global minimum value of *f* with respect to *x*. * `NMinValue[f, {x, y, ...}]` gives the global minimum value of *f* with respect to *x*, *y*, .... * `NMinValue[{f, cons}, {x, y, ...}]` gives the global minimum value of *f* subject to the constraints *cons*. * `NMinValue[..., x ∈ reg]` constrains *x* to be in the region *reg*. Examples [#examples] ```wolfram NMinValue[x^2 + y^2, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NMinValue.html) for more details. # NMinimize `NMinimize[f, x]` searches for a global minimum in f numerically with respect to x. Examples [#examples] Global minimum: ```wolfram NMinimize[Sin[x] + Sin[2x], {x, 0, 10}] (* {-1.76, {x -> 5.24}} *) ``` With constraints: ```wolfram NMinimize[{x^2 + y^2, x + y >= 1}, {x, y}] (* {0.5, {x -> 0.5, y -> 0.5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NMinimize.html) for more details. # NProduct `NProduct[f, {i, imin, imax}]` gives a numerical approximation to the product. `NProduct[f, {i, imin, imax, di}]` uses a step di in the product. Examples [#examples] Numerical product: ```wolfram NProduct[1 + 1/n^2, {n, 1, Infinity}] (* 3.67608 *) ``` Finite product: ```wolfram NProduct[n, {n, 1, 10}] (* 3.6288*10^6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NProduct.html) for more details. # NSum `NSum[f, {i, imin, imax}]` gives a numerical approximation to the sum. `NSum[f, {i, imin, imax, di}]` uses a step di in the sum. Examples [#examples] Numerical sum: ```wolfram NSum[1/n^2, {n, 1, Infinity}] (* 1.64493 *) ``` Finite sum: ```wolfram NSum[n, {n, 1, 100}] (* 5050. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NSum.html) for more details. # NSurfaceIntegrate `NSurfaceIntegrate[f, {x, y, ...} ∈ surface]` computes the numerical scalar surface integral of the function f\[x, y, ...] over the surface. * `NSurfaceIntegrate[{p, q, ...}, {x, y, ...} ∈ surface]` computes the numerical vector surface integral of the vector field \{p\[x, y, ...], q\[x, y, ...], ...}. Examples [#examples] ```wolfram NSurfaceIntegrate[1, {x, y, z} ∈ Sphere[]] ``` ```wolfram NSurfaceIntegrate[x^2 + y^2, {x, y, z} ∈ Sphere[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NSurfaceIntegrate.html) for more details. # NumericalOrder `NumericalOrder[e1, e2]` gives 1 if e1 \< e2, -1 if e1 > e2, 0 if e1 and e2 are numerically the same, and orders by type or using canonical order if e1 and e2 are not numerically comparable. Examples [#examples] ```wolfram NumericalOrder[3.5, 2.1] ``` ```wolfram NumericalOrder[Pi, 3.14] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericalOrder.html) for more details. # NumericalSort `NumericalSort[list]` sorts the elements of list into numerical order. Examples [#examples] ```wolfram NumericalSort[{3, 1, 4, 1, 5, 9, 2, 6}] ``` ```wolfram NumericalSort[{"10", "2", "1"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericalSort.html) for more details. # Overflow `Overflow[]` represents a number too large to represent explicitly on your computer system. Examples [#examples] Cause an overflow in machine arithmetic: ```wolfram 10.^1000 (* Overflow[] *) ``` Check for overflow: ```wolfram MatchQ[Overflow[], Overflow[]] (* True *) ``` Handle overflow in computations: ```wolfram Quiet[Check[10.^500, "Overflow detected"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Overflow.html) for more details. # PeakDetect `PeakDetect[list]` gives a binary list in which 1s correspond to peak positions in *list*. * `PeakDetect[list, σ]` detects peaks that survive Gaussian blurring up to scale *σ*. * `PeakDetect[list, σ, s]` detects peaks with minimum sharpness *s*. * `PeakDetect[list, σ, s, t]` detects only peaks with values greater than *t*. * `PeakDetect[list, σ, {s, σs}, {t, σt}]` uses different scales for thresholding sharpness and value. Examples [#examples] ```wolfram data = {0, 1, 3, 5, 3, 1, 0, 2, 4, 2, 0}; PeakDetect[data] (* {0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PeakDetect.html) for more details. # Precision `Precision[x]` gives the effective number of digits of precision in the number x. Examples [#examples] ```wolfram Precision[3.14159265358979] ``` ```wolfram Precision[N[Pi, 50]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Precision.html) for more details. # Quantity `Quantity[magnitude, unit]` represents a physical quantity with a numerical value and unit. Quantities support automatic unit handling in calculations. Examples [#examples] Create and work with quantities: ```wolfram Quantity[5, "Meters"] (* Arithmetic with units *) Quantity[100, "Kilometers"] / Quantity[2, "Hours"] (* Quantity[50, "Kilometers"/"Hours"] *) (* Mixed units work automatically *) Quantity[1, "Meters"] + Quantity[50, "Centimeters"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quantity.html) for more details. # QuantityArray `QuantityArray[mags,unit]` represents an array of quantities with magnitudes mags and common unit. `QuantityArray[mags,{unit1,unit2,…}]` represents an array of lists of quantities with units \{unit1,unit2,…}. `QuantityArray[quants]` converts an array of Quantity objects into a single QuantityArray object. Examples [#examples] Create a quantity array with common unit: ```wolfram QuantityArray[{1, 2, 3}, "Meters"] (* QuantityArray[{1, 2, 3}, "Meters"] *) ``` Convert an array of quantities: ```wolfram QuantityArray[{Quantity[1, "Meters"], Quantity[2, "Meters"]}] (* QuantityArray[{1, 2}, "Meters"] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityArray.html) for more details. # QuantityForm `QuantityForm[expr, form]` prints expr with all Quantity expressions using the specified unit display form form. * `QuantityForm[expr, {forms}]` prints expr using the appropriate combination of the specified unit display forms forms. Examples [#examples] Abbreviated units: ```wolfram QuantityForm[Quantity[5, "Meters"], "Abbreviation"] ``` Full names: ```wolfram QuantityForm[Quantity[10, "Kilometers/Hour"], "LongName"] ``` Multiple forms: ```wolfram QuantityForm[Quantity[9.8, "Meters/Seconds^2"], {"Abbreviation"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityForm.html) for more details. # QuantityMagnitude `QuantityMagnitude[quantity]` extracts the numerical value from a quantity. `QuantityMagnitude[quantity, unit]` gives the value in specific units. Examples [#examples] Extract numerical values: ```wolfram QuantityMagnitude[Quantity[5, "Meters"]] (* 5 *) (* Convert and extract *) QuantityMagnitude[Quantity[1, "Kilometers"], "Meters"] (* 1000 *) QuantityMagnitude[Quantity[100, "Celsius"], "Fahrenheit"] (* 212 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityMagnitude.html) for more details. # QuantityQ `QuantityQ[expr]` gives `True` if expr is a `Quantity` with valid arguments, and `False` otherwise. * `QuantityQ[expr, dims]` gives `True` if expr is a `Quantity` with physical dimensions dims, and `False` otherwise. Examples [#examples] ```wolfram QuantityQ[Quantity[5, "Meters"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityQ.html) for more details. # QuantityUnit `QuantityUnit[quantity]` returns the unit associated with the specified quantity. Examples [#examples] Extract the unit from a quantity: ```wolfram QuantityUnit[Quantity[5, "Meters"]] (* "Meters" *) ``` Get compound units: ```wolfram QuantityUnit[Quantity[60, "Miles"/"Hours"]] (* "Miles"/"Hours" *) ``` Extract from computed quantities: ```wolfram QuantityUnit[Quantity[10, "Newtons"]*Quantity[2, "Meters"]] (* "Joules" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityUnit.html) for more details. # QuantityVariable `QuantityVariable[var, "pq"]` represents a variable with the label var and the corresponding physical quantity "pq". `QuantityVariable["pq"]` represents the unlabeled physical quantity "pq". Examples [#examples] Create a velocity variable: ```wolfram QuantityVariable[v, "Speed"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityVariable.html) for more details. # QuantityVariableCanonicalUnit `QuantityVariableCanonicalUnit[quantityvariable]` returns the canonical unit associated with the specified quantityvariable. Examples [#examples] ```wolfram QuantityVariableCanonicalUnit[QuantityVariable["Length"]] ``` ```wolfram QuantityVariableCanonicalUnit[QuantityVariable["Time"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityVariableCanonicalUnit.html) for more details. # QuantityVariableDimensions `QuantityVariableDimensions[quantityvariable]` returns a list of base dimensions associated with the specified quantityvariable. Examples [#examples] Get the dimensions of a quantity variable: ```wolfram QuantityVariableDimensions["Length"] (* {"LengthUnit"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityVariableDimensions.html) for more details. # QuantityVariableIdentifier `QuantityVariableIdentifier[quantityvariable]` returns the identifier associated with the specified *quantityvariable*. Examples [#examples] ```wolfram QuantityVariableIdentifier[QuantityVariable["t", "Time"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityVariableIdentifier.html) for more details. # QuantityVariablePhysicalQuantity `QuantityVariablePhysicalQuantity[var]` returns the physical quantity associated with the quantity variable var. * `QuantityVariablePhysicalQuantity[var, type]` returns the physical quantity using the format type. This function extracts the underlying physical quantity from a `QuantityVariable`. Examples [#examples] ```wolfram QuantityVariablePhysicalQuantity[\[FormalT]] ``` ```wolfram v = QuantityVariable["velocity", "Speed"]; QuantityVariablePhysicalQuantity[v] ``` ```wolfram QuantityVariablePhysicalQuantity[QuantityVariable["m", "Mass"], "Abbreviation"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityVariablePhysicalQuantity.html) for more details. # Rationalize `Rationalize[x]` converts an approximate number x to a nearby rational with small denominator. `Rationalize[x, dx]` yields the rational number with smallest denominator that lies within dx of x. Examples [#examples] Convert to rational: ```wolfram Rationalize[0.333333] (* 1/3 *) ``` With tolerance: ```wolfram Rationalize[3.14159, 0.001] (* 22/7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rationalize.html) for more details. # Underflow `Underflow[]` represents a number too small to represent explicitly on your computer system. Examples [#examples] Cause an underflow: ```wolfram 10.^-1000 (* Underflow[] *) ``` Check for underflow: ```wolfram MatchQ[Underflow[], Underflow[]] (* True *) ``` Handle underflow in computations: ```wolfram Quiet[Check[10.^-500, "Underflow detected"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Underflow.html) for more details. # UnilateralDiscreteConvolve `UnilateralDiscreteConvolve[f, g, k, n]` gives the unilateral discrete convolution with respect to k of the expressions f and g. * `UnilateralDiscreteConvolve[f, g, {k1, ..., kp}, {n1, ..., np}]` gives the multidimensional unilateral discrete convolution. Examples [#examples] ```wolfram UnilateralDiscreteConvolve[a^k, b^k, k, n] ``` ```wolfram UnilateralDiscreteConvolve[k, k^2, k, n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnilateralDiscreteConvolve.html) for more details. # UnitConvert `UnitConvert[quantity, targetunit]` converts a quantity to the target unit. `UnitConvert[quantity]` converts to SI base units. Examples [#examples] Convert between units: ```wolfram UnitConvert[Quantity[1, "Miles"], "Kilometers"] (* Quantity[1.60934, "Kilometers"] *) UnitConvert[Quantity[100, "Celsius"], "Fahrenheit"] (* Quantity[212, "DegreesFahrenheit"] *) (* To SI base units *) UnitConvert[Quantity[1, "Horsepower"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitConvert.html) for more details. # UnitDimensions `UnitDimensions[unit]` returns a list of base dimensions associated with the specified unit. * `UnitDimensions[quantity]` returns a list of base dimensions associated with the unit of the specified quantity. Examples [#examples] Dimensions of meters: ```wolfram UnitDimensions["Meters"] (* {{"LengthUnit", 1}} *) ``` Velocity dimensions: ```wolfram UnitDimensions["Meters/Seconds"] (* {{"LengthUnit", 1}, {"TimeUnit", -1}} *) ``` From a quantity: ```wolfram UnitDimensions[Quantity[5, "Newtons"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitDimensions.html) for more details. # UnitSimplify `UnitSimplify[quantity]` simplifies the units of a quantity to a standard form. Examples [#examples] Simplify unit expressions: ```wolfram UnitSimplify[Quantity[1, "Joules"/"Seconds"]] (* Quantity[1, "Watts"] *) UnitSimplify[Quantity[1, "Kilograms" "Meters"/"Seconds"^2]] (* Quantity[1, "Newtons"] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitSimplify.html) for more details. # UnitVector `UnitVector[n, k]` gives the n-dimensional unit vector in the kth direction. `UnitVector[k]` gives a 2D unit vector in the kth direction. Examples [#examples] 2D unit vectors: ```wolfram UnitVector[1] (* {1, 0} *) UnitVector[2] (* {0, 1} *) ``` 3D unit vector: ```wolfram UnitVector[3, 2] (* {0, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitVector.html) for more details. # UnitaryMatrix `UnitaryMatrix[umat]` converts the unitary matrix umat to a structured array. Examples [#examples] Create a unitary matrix: ```wolfram UnitaryMatrix[{{1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitaryMatrix.html) for more details. # Unitize `Unitize[x]` gives 0 when x is zero, and 1 when x has any other numerical value. Examples [#examples] Unitize a number: ```wolfram Unitize[5] (* 1 *) ``` ```wolfram Unitize[0] (* 0 *) ``` Apply to a list: ```wolfram Unitize[{-3, 0, 2, 0, 5}] (* {1, 0, 1, 0, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unitize.html) for more details. # Upsample `Upsample[array, n]` returns an upsampled version of the array by inserting n-1 zeros between array elements. * `Upsample[array, n, offset]` shifts array so that its first element moves to the position offset in the resulting array. * `Upsample[array, n, offset, val]` inserts n-1 elements of value val between array elements. * `Upsample[image, ...]` upsamples an image. Examples [#examples] Upsample by factor of 3: ```wolfram Upsample[{1, 2, 3}, 3] (* {1, 0, 0, 2, 0, 0, 3, 0, 0} *) ``` With offset: ```wolfram Upsample[{1, 2}, 3, 2] (* {0, 1, 0, 0, 2, 0} *) ``` With custom fill value: ```wolfram Upsample[{1, 2, 3}, 2, 1, -1] (* {1, -1, 2, -1, 3, -1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Upsample.html) for more details. # AnimateParametericPlot Similar to [AnimatePlot](../Plotting-Functions/AnimatePlot) and [ParametricPlot](../Plotting-Functions/ParametricPlot) # AnimatePlot ```wolfram AnimatePlot[f_, {x, min, max}, {t, min, max}, opts___] ``` a animated version of [Plot](../Plotting-Functions/Plot), that samples all frames and creates live animation using them. `f` must return `_Real` or `{__Real}` (in a case of multiple curves) The output is safe for exporting as a static HTML file, since it keeps all data inside the notebook. No Wolfram Kernel is required for playing the animation. the set of parameters are not limited and accepts the following forms Options [#options] "SamplingPoints" [#samplingpoints] A number of points used in sampling. The default value is `200` It inherits some of [Graphics](../Graphics/Graphics) options as well AnimationRate [#animationrate] Specifies the number of updates *per second* "TransitionType" [#transitiontype] See [TransitionType](../Graphics/TransitionType) "TransitionDuration" [#transitionduration] See [TransitionDuration](../Graphics/TransitionDuration) ImageSize [#imagesize] Accepts `{width, height}` PlotStyle [#plotstyle] Specifies colors for each curve Epilog [#epilog] Prolog [#prolog] Appends graphics primitives to the plot. See [Graphics](../Graphics/Graphics) Example [#example] Plot the simplest sine function ```wolfram AnimatePlot[{Sin[x c], Sinc[x c]}, {x,-10,10}, {c,1,10,0.1}] ``` More examples [#more-examples] ``` AnimatePlot[(*TB[*)Sum[(*|*)(*FB[*)((Sin[2π(2j - 1) x])(*,*)/(*,*)(2j))(*]FB*)(*|*), {(*|*)j(*|*),(*|*)1.0(*|*),(*|*)n(*|*)}](*|*)(*1:eJxTTMoPSmNiYGAoZgMSwaW5TvkVmYwgPguQCCkqTQUAeAcHBQ==*)(*]TB*), {x, -1,1}, {n, 1,30, 1}] ``` Here it is important to keep `n` integer, otherwise it will be converted into a symbolic sum with `LerchPhi` function, which is not defined at some values. Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) Exporting as GIF or video [#exporting-as-gif-or-video] This feature is only available for WLJS Notebook desktop application, since we rely on our custom Electron.js renderer You can wrap it with [AnimatedImage](../Image/AnimatedImage) to rasterize frames into the series of images and export to a file as GIF or video ```wolfram Export["animation.gif", AnimatedImage @ AnimatePlot[{Sin[x c], Sinc[x c]}, {x,-10,10}, {c,1,10,0.1}] ] ``` where `AnimatedImage` can be extended with options alike [Rasterize](../Image/Rasterize) Issues [#issues] Help needed! There is no adaptive sampling implemented. # ArrayPlot `ArrayPlot[array]` generates a plot in which the values in an array are shown in a discrete array of squares. Examples [#examples] Visualize a 2D array: ```wolfram ArrayPlot[{{1, 0, 1}, {0, 1, 0}, {1, 0, 1}}] ``` Plot random data: ```wolfram ArrayPlot[RandomReal[1, {20, 20}], ColorFunction -> "Rainbow"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArrayPlot.html) for more details. # BarChart `BarChart[{y1, y2, ...}]` creates a bar chart with bar heights `y1`, `y2`, etc. Examples [#examples] Create bar charts: ```wolfram BarChart[{1, 3, 2, 5, 4}] (* With labels and colors *) BarChart[{5, 10, 15, 20}, ChartLabels -> {"Q1", "Q2", "Q3", "Q4"}, ChartStyle -> "Pastel" ] (* Grouped bar chart *) BarChart[{{1, 2, 3}, {4, 5, 6}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarChart.html) for more details. # BarLegend `BarLegend[cf]` generates a legend that identifies colors from the color function cf with an automatic range of values. `BarLegend[{cf, {min, max}}]` generates a legend that identifies colors from the color function cf with the range of values between min and max. Examples [#examples] Create a color bar legend: ```wolfram BarLegend["Rainbow"] ``` With specified range: ```wolfram BarLegend[{"TemperatureMap", {0, 100}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarLegend.html) for more details. # BubbleChart `BubbleChart[{{x1, y1, z1}, {x2, y2, z2}, ...}]` makes a bubble chart with bubbles at positions `{xi, yi}` with sizes zi. `BubbleChart[{..., wi[{xi, yi, zi}, ...], ..., wj[{xj, yj, zj}, ...], ...}]` makes a bubble chart with bubble features defined by the symbolic wrappers wk. `BubbleChart[{data1, data2, ...}]` makes a bubble chart from multiple datasets datai. Examples [#examples] ```wolfram BubbleChart[{{1, 2, 1}, {3, 4, 2}, {5, 1, 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BubbleChart.html) for more details. # BubbleChart3D `BubbleChart3D[{{x1, y1, z1, u1}, {x2, y2, z2, u2}, ...}]` makes a 3D bubble chart with bubbles at positions `{xi, yi, zi}` with sizes ui. `BubbleChart3D[{data1, data2, ...}]` makes a 3D bubble chart from multiple datasets. Examples [#examples] Create a 3D bubble chart: ```wolfram BubbleChart3D[{{1, 2, 3, 1}, {4, 5, 6, 2}, {7, 8, 9, 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BubbleChart3D.html) for more details. # BulletGauge `BulletGauge[value,reference,{min,max}]` draws a bullet gauge showing value and reference in a range of min to max. `BulletGauge[value,reference,{min,m1,m2,…,max}]` draws a bullet gauge with performance regions split at the mi. `BulletGauge[{v1,v2,…},…]` draws a bullet gauge with multiple values v1, v2, …. `BulletGauge[values,{r1,r2,…},…]` draws a bullet gauge with multiple references r1, r2, …. Examples [#examples] ```wolfram BulletGauge[75, 80, {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BulletGauge.html) for more details. # ClockGauge `ClockGauge[]` draws an analog clock face showing the local time with hours, minutes, and seconds. `ClockGauge[time]` draws an analog clock face showing the time corresponding to an AbsoluteTime, DateObject, or TimeObject specification. `ClockGauge[{h,m,s}]` draws an analog clock face showing hour h, minute m, and seconds s. `ClockGauge[{y,m,d,h,m,s}]` draws an analog clock face showing the time corresponding to the date list in a DateList specification. `ClockGauge["string"]` draws an analog clock face showing the time DateList\["string"]. Examples [#examples] Display current time: ```wolfram ClockGauge[] ``` Show a specific time: ```wolfram ClockGauge[{10, 30, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClockGauge.html) for more details. # ComplexContourPlot `ComplexContourPlot[f, {z, zmin, zmax}]` generates a filled contour plot of f as a function of z. `ComplexContourPlot[{f1, f2, ...}, {z, zmin, zmax}]` generates contour lines for f1, f2, .... `ComplexContourPlot[f == g, {z, zmin, zmax}]` plots contour lines for which f = g. Examples [#examples] Plot contours of a complex function: ```wolfram ComplexContourPlot[Abs[z^2 - 1], {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexContourPlot.html) for more details. # ComplexPlot `ComplexPlot[f, {z, zmin, zmax}]` generates a plot of Arg\[f] over the complex rectangle with corners zmin and zmax. Examples [#examples] Plot a complex function: ```wolfram ComplexPlot[z^2, {z, -2 - 2 I, 2 + 2 I}] ``` Plot with singularities: ```wolfram ComplexPlot[1/z, {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexPlot.html) for more details. # ComplexPlot3D `ComplexPlot3D[f, {z, zmin, zmax}]` generates a three-dimensional plot of Abs\[f] over the complex rectangle with corners zmin and zmax, with the surface colored by Arg\[f]. Examples [#examples] Plot the magnitude of a complex function: ```wolfram ComplexPlot3D[z^2, {z, -2 - 2 I, 2 + 2 I}] ``` Visualize a function with singularities: ```wolfram ComplexPlot3D[1/z, {z, -2 - 2 I, 2 + 2 I}] ``` Plot a more complex function: ```wolfram ComplexPlot3D[(z^2 - 1)/(z^2 + 1), {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexPlot3D.html) for more details. # ComplexStreamPlot `ComplexStreamPlot[f, {z, zmin, zmax}]` generates a streamline plot of the vector field `{Re[f], Im[f]}` over the complex rectangle with corners zmin and zmax. Examples [#examples] Plot streamlines of a complex function: ```wolfram ComplexStreamPlot[z^2, {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexStreamPlot.html) for more details. # ComplexVectorPlot `ComplexVectorPlot[f, {z, zmin, zmax}]` generates a vector plot of the vector field `{Re[f], Im[f]}` over the complex rectangle with corners zmin and zmax. `ComplexVectorPlot[{f1, f2, ...}, {z, zmin, zmax}]` plots several vector fields. Examples [#examples] Plot vectors of a complex function: ```wolfram ComplexVectorPlot[z^2, {z, -2 - 2 I, 2 + 2 I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexVectorPlot.html) for more details. # ContourPlot `ContourPlot[f, {x, xmin, xmax}, {y, ymin, ymax}]` generates a contour plot of f as a function of x and y. Examples [#examples] Contour plot of a function: ```wolfram ContourPlot[Sin[x] Sin[y], {x, -Pi, Pi}, {y, -Pi, Pi}] ``` Plot a specific contour: ```wolfram ContourPlot[x^2 + y^2 == 1, {x, -2, 2}, {y, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContourPlot.html) for more details. # ContourPlot3D `ContourPlot3D[f, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` produces a three-dimensional contour plot of f as a function of x, y, and z. `ContourPlot3D[f == g, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` plots the contour surface for which f = g. `ContourPlot3D[..., {x, y, z} ∈ reg]` takes the variables `{x, y, z}` to be in the geometric region reg. Examples [#examples] Plot a sphere surface: ```wolfram ContourPlot3D[x^2 + y^2 + z^2 == 1, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Plot multiple surfaces: ```wolfram ContourPlot3D[{x^2 + y^2 == 1, z == x}, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContourPlot3D.html) for more details. # DateListLogPlot `DateListLogPlot[{{date1, y1}, {date2, y2}, ...}]` makes a log plot with values yi at a sequence of dates. `DateListLogPlot[{y1, y2, ...}, datespec]` makes a log plot with dates at equal intervals specified by datespec. `DateListLogPlot[tseries]` plots the time series tseries. `DateListLogPlot[{data1, data2, ...}]` plots data from all the datai. Examples [#examples] Plot data with logarithmic scale: ```wolfram DateListLogPlot[{ {{2020, 1}, 10}, {{2020, 6}, 100}, {{2021, 1}, 1000} }] ``` From a time series: ```wolfram ts = TimeSeries[{1, 10, 100, 1000}, {{2020, 1, 1}, Automatic, "Month"}]; DateListLogPlot[ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateListLogPlot.html) for more details. # DateListPlot `DateListPlot[{{date1, y1}, {date2, y2}, ..., {daten, yn}}]` plots points with values yi at a sequence of dates. `DateListPlot[{y1, y2, ..., yn}, datespec]` plots points with dates at equal intervals specified by datespec. `DateListPlot[tseries]` plots the time series tseries. `DateListPlot[{data1, data2, ...}]` plots data from all the datai. Examples [#examples] Plot time series data: ```wolfram DateListPlot[{{{2020, 1}, 10}, {{2020, 6}, 15}, {{2021, 1}, 12}}] ``` From a TimeSeries object: ```wolfram ts = TimeSeries[{1, 2, 3, 4}, {{2020, 1, 1}, Automatic, "Month"}]; DateListPlot[ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateListPlot.html) for more details. # DateListStepPlot `DateListStepPlot[{{date1, y1}, {date2, y2}, …}]` plots the values yi in steps at a sequence of dates. `DateListStepPlot[{y1, y2, …}, datespec]` plots the values yi in steps with dates at equal intervals specified by datespec. `DateListStepPlot[tseries]` plots the time series tseries. `DateListStepPlot[{data1, data2, …}]` plots data from all the datai. `DateListStepPlot[…, step]` plots using steps specified by step. `DateListStepPlot[{…, w[datai], …}]` plots data datai with features defined by the symbolic wrapper w. Examples [#examples] ```wolfram DateListStepPlot[{{{2020, 1}, 10}, {{2020, 6}, 15}, {{2021, 1}, 12}}] (* Graphics[...] *) ``` ```wolfram DateListStepPlot[TimeSeries[{1, 2, 3, 4}, {{2020, 1, 1}, Automatic, "Month"}]] (* Graphics[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateListStepPlot.html) for more details. # DensityPlot `DensityPlot[f, {x, xmin, xmax}, {y, ymin, ymax}]` makes a density plot showing `f` as colors over the x-y plane. Examples [#examples] Create density plots: ```wolfram DensityPlot[Sin[x] Sin[y], {x, 0, 2 Pi}, {y, 0, 2 Pi}] (* With custom color function *) DensityPlot[x^2 - y^2, {x, -2, 2}, {y, -2, 2}, ColorFunction -> "Rainbow", PlotLegends -> Automatic ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DensityPlot.html) for more details. # DiscretePlot `DiscretePlot[f, {n, nmax}]` generates a plot of f as a function of n for n=1, ..., nmax. `DiscretePlot[f, {n, nmin, nmax}]` generates a plot when n runs from nmin to nmax. `DiscretePlot[f, {n, nmin, nmax, dn}]` uses steps dn. Examples [#examples] Plot Fibonacci numbers: ```wolfram DiscretePlot[Fibonacci[n], {n, 1, 20}] ``` With custom styling: ```wolfram DiscretePlot[n^2, {n, 1, 10}, PlotStyle -> Red, Filling -> Axis] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscretePlot.html) for more details. # FrameListVideo `FrameListVideo[{img1, img2, ...}]` generates a video containing frames img1, img2, etc. * `FrameListVideo[files]` generates a video from existing image files. Examples [#examples] Create a video from a list of images: ```wolfram frames = Table[Plot[Sin[x + t], {x, 0, 2 Pi}], {t, 0, 2 Pi, 0.2}]; FrameListVideo[frames] ``` Create a video from image files: ```wolfram FrameListVideo[FileNames["*.png", "frames/"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FrameListVideo.html) for more details. # GraphPlot `GraphPlot[g]` generates a plot of the graph g. Works with adjacency lists, rules, or matrices. Examples [#examples] Plot a simple graph: ```wolfram GraphPlot[{1 -> 2, 2 -> 3, 3 -> 1}] ``` From adjacency matrix: ```wolfram GraphPlot[{{0, 1, 1}, {1, 0, 1}, {1, 1, 0}}] ``` With styling: ```wolfram GraphPlot[{a -> b, b -> c}, VertexLabeling -> True] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphPlot.html) for more details. # GraphPlot3D `GraphPlot3D[g]` generates a 3D plot of the graph g. `GraphPlot3D[{e1, e2, …}]` generates a 3D plot of the graph with edges ei. `GraphPlot3D[{…, w[ei], …}]` plots ei with features defined by the symbolic wrapper w. `GraphPlot3D[{vi1 -> vj1, …}]` uses rules to specify the graph g. `GraphPlot3D[m]` uses the adjacency matrix m to specify the graph g. Examples [#examples] Plot a 3D graph from edges: ```wolfram GraphPlot3D[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 4}] ``` Plot a complete graph in 3D: ```wolfram GraphPlot3D[CompleteGraph[5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GraphPlot3D.html) for more details. # Histogram `Histogram[{x1, x2, ...}]` plots a histogram of the values. `Histogram[data, bspec]` uses bin width specification `bspec`. Examples [#examples] Create a histogram of random data: ```wolfram Histogram[RandomReal[1, 100]] (* With specified number of bins *) Histogram[RandomVariate[NormalDistribution[], 1000], 20] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Histogram.html) for more details. # Histogram3D `Histogram3D[{{x1, y1}, {x2, y2}, ...}]` plots a 3D histogram of the values. Examples [#examples] 3D histogram of 2D data: ```wolfram data = RandomReal[1, {1000, 2}]; Histogram3D[data] ``` With bin specification: ```wolfram Histogram3D[data, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Histogram3D.html) for more details. # HistogramList `HistogramList[{x1, x2, …}]` gives a list of bins and histogram heights of the values xi. * `HistogramList[{{x1, y1, …}, {x2, y2, …}, …}]` gives a list of bins and histogram heights of the values \{xi, yi, …}. * `HistogramList[…, bspec]` gives a list of bins and histogram heights with bins specified by bspec. * `HistogramList[…, bspec, hspec]` gives a list of bins and histogram heights with bin heights computed according to the specification hspec. Examples [#examples] ```wolfram HistogramList[{1, 2, 2, 3, 3, 3, 4, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HistogramList.html) for more details. # KagiChart `KagiChart[{{date1, p1}, {date2, p2}, ...}]` makes a Kagi chart with prices pi at date datei. `KagiChart[{"name", daterange}]` makes a Kagi chart of closing prices for the financial entity "name" over the date range daterange. `KagiChart[{...}, rt]` makes a Kagi chart with reversal threshold rt. Examples [#examples] ```wolfram KagiChart[{"AAPL", {2020, 1, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KagiChart.html) for more details. # ListAnimatePlot ```wolfram ListAnimatePlot[{{y1, y2, y3 ...}, {y1, y2, ...}}, opts___] ``` animates a list of curves, where `{yi...}` is single "frame" of sampled curve `y`. Other formats are also possible: ```wolfram ListAnimatePlot[{{{y1, y2, y3 ...}, {k1, k2, k3, ...}}, {y1, y2, ...}}, opts___] ``` where `y` and `k` are different curves animated at the same plot ```wolfram ListAnimatePlot[{{{x1, y1}, {x2, y2}, ...}, frame2, frame3, ...}, opts___] ``` where `{x1,y1}` is a points sampling a single curve ```wolfram ListAnimatePlot[{{{{x1, y1}, {x2, y2}, ...}, {{k1, l1}, {k2, l2}, ...}}, frame2, frame3, ...}, opts___] ``` where `{x1,y1}` and `{k1,l1}` are points sampling two different curves The output is safe for exporting to a static [Static HTML](frontend/Exporting/Static%20HTML) file, since it keeps all data inside the notebook. No Wolfram Kernel is required for playing the animation. Options [#options] InterpolationOrder [#interpolationorder] Sets the interpolation order (all curves are resampled). The default is `1` (linear) "SamplingPoints" [#samplingpoints] A number of points used in sampling. The default value is `200` It inherits some of [Graphics](../Graphics/Graphics) options as well AnimationRate [#animationrate] Specifies the number of updates *per second* TransitionType [#transitiontype] See [TransitionType](../Graphics/TransitionType) TransitionDuration [#transitionduration] See [TransitionDuration](../Graphics/TransitionDuration) ImageSize [#imagesize] Accepts `{width, height}` PlotStyle [#plotstyle] Specifies colors for each curve Epilog [#epilog] Prolog [#prolog] Appends graphics primitives to the plot. See [Graphics](../Graphics/Graphics) Examples [#examples] An animation of `10` frames ```wolfram ListAnimatePlot[Table[{Table[{i, Sin[i j / 10]}, {i, 0.1, 10,0.1}], Table[{i, Sinc[i j / 10]}, {i, 0.1, 10,0.1}]}, {j,10}]] ``` Issues [#issues] Help needed! There is no adaptive sampling implemented. # ListContourPlot A list version of [ContourPlot](../Plotting-Functions/ContourPlot) Example [#example] Generate contours from an array of heights ```wolfram ListContourPlot[Table[Sin[i + j^2], {i, 0, 3, 0.1}, {j, 0, 3, 0.1}]] ``` Or give explicit $x,y,z$ coordinates for the data ```wolfram data = Table[{x = RandomReal[{-2, 2}], y = RandomReal[{-2, 2}], Sin[x y]}, {1000}]; ListContourPlot[data] ``` # ListContourPlot3D `ListContourPlot3D[array]` generates a 3D contour plot from a 3D array of values. `ListContourPlot3D[{{x1, y1, z1, f1}, {x2, y2, z2, f2}, ...}]` generates a contour plot from values at specified points. Examples [#examples] Create a 3D contour plot from data: ```wolfram data = Table[x^2 + y^2 - z^2, {x, -1, 1, 0.1}, {y, -1, 1, 0.1}, {z, -1, 1, 0.1}]; ListContourPlot3D[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListContourPlot3D.html) for more details. # ListCurvePathPlot Plots a curve that corresponds to a smooth path through the specified points Example [#example] Randomly sampled points on a circle ```wolfram data = Table[{t Cos[t], t Sin[t]}, {t, RandomReal[{0, 2 Pi}, 50]}]; ListCurvePathPlot[data, Epilog->{Opacity[0.5], Line[data]}] ``` where the gray lines represent what would a simple line plot show. Neat example [#neat-example] ```wolfram ListCurvePathPlot[RandomReal[{0, 10}, {2000, 2}]] ``` # ListLinePlot Plots a line like [Plot](../Plotting-Functions/Plot) through the list of points provided ```wolfram ListLinePlot[{y1, y2, y3, ...}] ``` Options [#options] The same as for [Plot](../Plotting-Functions/Plot) Examples [#examples] Plot a list of $y$ values ```wolfram ListLinePlot[{1, 1, 2, 3, 5, 8}] ``` Add a filling under the line ```wolfram ListLinePlot[Prime[Range[25]], Filling -> Axis] ``` Random walk ```wolfram ListLinePlot[Accumulate[RandomReal[{-1, 1}, {250, 2}]]] ``` Dev notes [#dev-notes] This function does not support updates, please use raw `Graphics` or alternative way - [ListLinePlotly](../Plotly/ListLinePlotly) to animate your data. # ListLinePlot3D `ListLinePlot3D[{{x1, y1, z1}, {x2, y2, z2}, ..., {xn, yn, zn}}]` plots a curve through the 3D points \{x\_i, y\_i, z\_i}. `ListLinePlot3D[{data1, data2, ...}]` plots curves through multiple sets of \{x, y, z} points. Examples [#examples] Plot a 3D curve: ```wolfram data = Table[{Cos[t], Sin[t], t}, {t, 0, 4 Pi, 0.1}]; ListLinePlot3D[data] ``` Multiple curves: ```wolfram ListLinePlot3D[{data, RotationTransform[Pi/4, {0, 0, 1}] /@ data}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListLinePlot3D.html) for more details. # ListLogLinearPlot `ListLogLinearPlot[{y1, y2, ...}]` makes a log-linear plot of the y\_i, assumed to correspond to x coordinates 1, 2, .... `ListLogLinearPlot[{{x1, y1}, {x2, y2}, ...}]` makes a log-linear plot of the specified list of x and y values. Examples [#examples] Log-linear plot: ```wolfram ListLogLinearPlot[{10, 100, 1000, 10000}] ``` With coordinates: ```wolfram data = Table[{Exp[x], x}, {x, 1, 5}]; ListLogLinearPlot[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListLogLinearPlot.html) for more details. # ListLogLogPlot `ListLogLogPlot[{y1, y2, ...}]` makes a log-log plot with logarithmic scales on both axes. Examples [#examples] Log-log plot: ```wolfram data = Table[{n, n^2}, {n, 1, 100}]; ListLogLogPlot[data] ``` Power law data: ```wolfram ListLogLogPlot[Table[{x, x^1.5}, {x, 1, 1000, 10}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListLogLogPlot.html) for more details. # ListLogPlot `ListLogPlot[{y1, y2, ...}]` makes a log plot of the yi values with logarithmic vertical axis. Examples [#examples] Log plot of data: ```wolfram ListLogPlot[{1, 10, 100, 1000, 10000}] ``` With coordinates: ```wolfram data = Table[{x, Exp[x]}, {x, 1, 5}]; ListLogPlot[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListLogPlot.html) for more details. # ListPlot `ListPlot[{y1, ..., yn}]` plots regularly spaced points. `ListPlot[{{x1, y1}, ..., {xn, yn}}]` generates a scatter plot with specified coordinates. Examples [#examples] Plot y values: ```wolfram ListPlot[{1, 4, 9, 16, 25}] ``` Plot x-y pairs: ```wolfram ListPlot[{{0, 0}, {1, 1}, {2, 4}, {3, 9}}] ``` Multiple datasets: ```wolfram ListPlot[{Table[Sin[x], {x, 0, 10, 0.5}], Table[Cos[x], {x, 0, 10, 0.5}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListPlot.html) for more details. # ListPlot3D ```wolfram ListPlot3D[{{f11,…,f1n},…,{fm1,…,fmn}}] ``` generates a surface with height `fij` at position `{j,i}` ```wolfram ListPlot3D[{{x1,y1,f1},...,{x_k,y_k,f_k}}] ``` generates a surface with height `fi` at position `{xi,yi}`. ```wolfram ListPlot3D[{data1,data2,…}] ``` plots the surfaces corresponding to each of the `data_i`. Examples [#examples] ```wolfram ListPlot3D[{{1, 1, 1, 1}, {1, 2, 1, 2}, {1, 1, 3, 1}, {1, 2, 1, 4}}, Mesh -> All] ``` or an interpolated surface ```wolfram data = Table[Sin[j^2 + i], {i, 0, Pi, Pi/5}, {j, 0, Pi, Pi/5}]; ListPlot3D[data, Mesh -> None, InterpolationOrder -> 3, ColorFunction -> "SouthwestColors", BoxRatios->{1,1,0.5}] ``` # ListPointPlot3D `ListPointPlot3D[{{x1, y1, z1}, {x2, y2, z2}, ...}]` generates a 3D scatter plot of points with coordinates \{x\_i, y\_i, z\_i}. `ListPointPlot3D[{data1, data2, ...}]` plots several collections of points, by default in different colors. Examples [#examples] 3D scatter plot: ```wolfram points = Table[{Cos[t], Sin[t], t/10}, {t, 0, 4 Pi, 0.2}]; ListPointPlot3D[points] ``` Multiple datasets: ```wolfram ListPointPlot3D[{RandomReal[1, {50, 3}], RandomReal[{1, 2}, {50, 3}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListPointPlot3D.html) for more details. # ListPolarPlot `ListPolarPlot[{r1, r2, ...}]` plots points equally spaced in angle at radii ri. Examples [#examples] Polar plot of radii: ```wolfram ListPolarPlot[Table[Sin[3 θ], {θ, 0, 2 Pi, 0.1}]] ``` With explicit angles: ```wolfram ListPolarPlot[Table[{θ, 1 + Cos[θ]}, {θ, 0, 2 Pi, 0.1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListPolarPlot.html) for more details. # ListSliceContourPlot3D `ListSliceContourPlot3D[farr, surf]` generates a contour plot of the 3D array of values sliced to the surface surf. `ListSliceContourPlot3D[{{x1, y1, z1, f1}, ...}, surf]` generates a slice contour plot for the values f\_i at points \{x\_i, y\_i, z\_i}. Examples [#examples] Slice contour on plane: ```wolfram data = Table[x^2 + y^2 + z^2, {x, -1, 1, 0.1}, {y, -1, 1, 0.1}, {z, -1, 1, 0.1}]; ListSliceContourPlot3D[data, "CenterPlanes"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListSliceContourPlot3D.html) for more details. # ListSliceDensityPlot3D `ListSliceDensityPlot3D[farr, surf]` generates a density plot of the 3D array of values sliced to the surface surf. `ListSliceDensityPlot3D[{{x1, y1, z1, f1}, ...}, surf]` generates a slice density plot for the values f\_i at points \{x\_i, y\_i, z\_i}. Examples [#examples] Slice density on plane: ```wolfram data = Table[Sin[x + y + z], {x, -2, 2, 0.2}, {y, -2, 2, 0.2}, {z, -2, 2, 0.2}]; ListSliceDensityPlot3D[data, "CenterPlanes"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListSliceDensityPlot3D.html) for more details. # ListSliceVectorPlot3D `ListSliceVectorPlot3D[varr, surf]` generates a vector plot from a 3D array varr of vector field values over the slice surface surf. `ListSliceVectorPlot3D[..., {surf1, surf2, ...}]` generates a slice vector plot over several surfaces surf1, surf2, .... Examples [#examples] ```wolfram ListSliceVectorPlot3D[Table[{x, y, z}, {x, -1, 1, 0.2}, {y, -1, 1, 0.2}, {z, -1, 1, 0.2}], "CenterPlanes"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListSliceVectorPlot3D.html) for more details. # ListStepPlot ```wolfram ListStepPlot[{y1, y2, ...}] ``` plots the values $y_1$, $y_2$ ... in steps Examples [#examples] Using $x$ and $y$ coordinates ```wolfram ListStepPlot[Table[{Prime[n], EulerPhi[n]}, {n, 50}]] ``` # ListStreamDensityPlot `ListStreamDensityPlot[varr]` generates a stream density plot from an array varr of vector and scalar field values \{\{vx\_ij, vy\_ij}, r\_ij}. `ListStreamDensityPlot[{{{x1, y1}, {{vx1, vy1}, r1}}, ...}]` generates a stream density plot from vector and scalar field values at specified points. Examples [#examples] Stream density plot: ```wolfram data = Table[{{-y, x}, x^2 + y^2}, {x, -3, 3}, {y, -3, 3}]; ListStreamDensityPlot[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListStreamDensityPlot.html) for more details. # ListStreamPlot `ListStreamPlot[varr]` generates a stream plot from an array varr of vectors. `ListStreamPlot[{{{x1,y1},{vx1,vy1}},…}]` generates a stream plot from vectors \{vxi,vyi} given at points \{xi,yi}. `ListStreamPlot[{data1,data2,…}]` plots data for several vector fields. Examples [#examples] Create a stream plot from a vector array: ```wolfram ListStreamPlot[Table[{y, -x}, {x, -3, 3}, {y, -3, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListStreamPlot.html) for more details. # ListStreamPlot3D `ListStreamPlot3D[varr]` plots streamlines for the vector field given as a 3D array of vectors. Examples [#examples] 3D stream plot: ```wolfram data = Table[{-y, x, z}, {x, -2, 2, 0.5}, {y, -2, 2, 0.5}, {z, -2, 2, 0.5}]; ListStreamPlot3D[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListStreamPlot3D.html) for more details. # ListSurfacePlot3D `ListSurfacePlot3D[{{x1,y1,z1},{x2,y2,z2},…}]` plots a three-dimensional surface constructed to fit the specified points. Examples [#examples] Plot a surface from random 3D points: ```wolfram ListSurfacePlot3D[RandomReal[1, {100, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListSurfacePlot3D.html) for more details. # ListVectorDensityPlot `ListVectorDensityPlot[varr]` generates a vector density plot from an array varr of vector and scalar field values \{\{vx\_ij, vy\_ij}, r\_ij}. `ListVectorDensityPlot[{{{x1, y1}, {{vx1, vy1}, r1}}, ...}]` generates a vector density plot from values at specified points. Examples [#examples] Vector density plot: ```wolfram data = Table[{{-y, x}, x^2 + y^2}, {x, -3, 3}, {y, -3, 3}]; ListVectorDensityPlot[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListVectorDensityPlot.html) for more details. # ListVectorDisplacementPlot `ListVectorDisplacementPlot[{{{vx11, vy11}, ..., {vx1n, vy1n}}, ..., {{vxm1, vym1}, ..., {vxmn, vymn}}}]` generates a displacement plot from an array of vector displacements \{vxij, vyij}. * `ListVectorDisplacementPlot[{{{x1, y1}, {vx1, vy1}}, ..., {{xn, yn}, {vxn, vyn}}}]` generates a displacement plot from displacements \{vxi, vyi} at point `{xi, yi}`. * `ListVectorDisplacementPlot[{{{{vx11, vy11}, s11}, ...}, ...}]` uses the scalar values sij to color the displaced region. * `ListVectorDisplacementPlot[..., reg]` plots the displacement over the region reg. This function visualizes vector displacement fields. Examples [#examples] ```wolfram data = Table[{0.1 Sin[x], 0.1 Cos[y]}, {x, 0, 2 Pi, 0.5}, {y, 0, 2 Pi, 0.5}]; ListVectorDisplacementPlot[data] ``` ```wolfram ListVectorDisplacementPlot[RandomReal[0.1, {10, 10, 2}]] ``` ```wolfram ListVectorDisplacementPlot[Table[{0.05 x, 0.05 y}, {x, -5, 5}, {y, -5, 5}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListVectorDisplacementPlot.html) for more details. # ListVectorPlot Plot the vector field interpolated from a specified set of vectors ```wolfram ListVectorPlot[Table[{y, -x}, {x, -3, 3, 0.2}, {y, -3, 3, 0.2}]] ``` It provides the same options as [VectorPlot](../Plotting-Functions/VectorPlot) # ListVectorPlot3D `ListVectorPlot3D[varr]` generates a 3D vector plot from a 3D array of vector field values. `ListVectorPlot3D[{data1, data2, ...}]` plots data for several vector fields. Examples [#examples] 3D vector plot: ```wolfram data = Table[{-y, x, z}, {x, -2, 2, 0.5}, {y, -2, 2, 0.5}, {z, -2, 2, 0.5}]; ListVectorPlot3D[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListVectorPlot3D.html) for more details. # LogLinearPlot `LogLinearPlot[f, {x, xmin, xmax}]` generates a log-linear plot of f as a function of x from xmin to xmax. `LogLinearPlot[{f1, f2, ...}, {x, xmin, xmax}]` plots several functions fi. `LogLinearPlot[{..., w[fi], ...}, ...]` plots fi with features defined by the symbolic wrapper w. `LogLinearPlot[..., {x} ∈ reg]` takes the variable x to be in the geometric region reg. Examples [#examples] Create a log-linear plot: ```wolfram LogLinearPlot[Sin[Log[x]], {x, 1, 100}] ``` Plot multiple functions: ```wolfram LogLinearPlot[{Log[x], Log[2, x]}, {x, 1, 1000}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogLinearPlot.html) for more details. # LogLogPlot `LogLogPlot[f, {x, xmin, xmax}]` generates a log-log plot of f as a function of x from xmin to xmax. `LogLogPlot[{f1, f2, ...}, {x, xmin, xmax}]` plots several functions f\_i. Examples [#examples] Log-log plot: ```wolfram LogLogPlot[x^2, {x, 1, 100}] ``` Multiple functions: ```wolfram LogLogPlot[{x, x^2, x^3}, {x, 1, 1000}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogLogPlot.html) for more details. # LogPlot `LogPlot[f,{x,xmin,xmax}]` generates a log plot of f as a function of x from xmin to xmax. `LogPlot[{f1,f2,…},{x,xmin,xmax}]` plots several functions fi. `LogPlot[{…,w[fi],…},…]` plots fi with features defined by the symbolic wrapper w. `LogPlot[…,{x}∈reg]` takes the variable x to be in the geometric region reg. Examples [#examples] ```wolfram LogPlot[Exp[x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogPlot.html) for more details. # ManipulateParametricPlot Similar to [ManipulatePlot](../Plotting-Functions/ManipulatePlot) and [ParametricPlot](../Plotting-Functions/ParametricPlot) # ManipulatePlot ```wolfram ManipulatePlot[f_, {t, min, max}, {p1, min, max}, ..., opts___] ``` an interactive alternative to [Plot](../Plotting-Functions/Plot) and Mathematica's [Manipulate](../GUI/Manipulate), that uses input elements and [Offload](../Interpreter/Offload) technic to make a fast interactive plots of a given function `f[t, p1, p2...]` the set of parameters are not limited and accepts the following forms ```wolfram ManipulatePlot[f_, {t, min, max}, {p1}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {p1, min, max}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {p1, min, max, step}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {{p1, initial}, min, max}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {{p1, initial, label}, min, max}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {p1, values_List}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {{p1, initial}, values_List}, {p2}, ...] ``` ```wolfram ManipulatePlot[f_, {t, min, max}, {{p1, initial, label}, values_List}, {p2}, ...] ``` where `f` can return `_Real` or `{__Real}` Options [#options] "SamplingPoints" [#samplingpoints] A number of points used in sampling. The default value is `200` It inherits some of [Graphics](../Graphics/Graphics) options as well TransitionType [#transitiontype] See [TransitionType](../Graphics/TransitionType) TransitionDuration [#transitionduration] See [TransitionDuration](../Graphics/TransitionDuration) ImageSize [#imagesize] Accepts `{width, height}` PlotStyle [#plotstyle] Specifies colors for each curve Appearance [#appearance] By the default is `"Default"`. Set it to `None` to remove the frame and info boxes. "ControlsLayout" [#controlslayout] By the default is `"Vertical"`, another possible value is `"Horisontal"` Epilog [#epilog] Prolog [#prolog] Appends graphics primitives to the plot. See [Graphics](../Graphics/Graphics) "UpdateFunction" [#updatefunction] Allows to alter the data generated on update or cause user-defined side-effects. The following values are expected ```wolfram Function[input, (* side effects *) (* RETURN *) True <- accept change False <- prevent default _ <- will be written instead ] ``` This allows to add extra interactive features to your plot nicely ```wolfram Module[{label, pos}, ManipulatePlot[x w, {x,0,1}, {w,0,2}, Epilog->Text[label // Offload, pos // Offload], "UpdateFunction" -> Function[input, label = StringTemplate["w = ``"][input]; pos = {0.5, input 0.5 + 0.2}; True ] ] ] ``` "TrackedExpression" [#trackedexpression] Similar to the option of [InputRange](../GUI/InputRange). It provides an external control over the sliders. Your expression must be an array of values with a length equal to the number of controlling parameters. For example ```wolfram woo = {0.5, 0.6}; ManipulatePlot[Sin[ w x^2 + u], {x,0,10}, {w, 0, 1},{u, 0,1}, "TrackedExpression"->Offload[woo]] ``` now you can update it by setting a new value ```wolfram woo = {0.3, 0.2, 1.3} ``` Example [#example] Plot the simplest sine function ```wolfram ManipulatePlot[Sin[w z + p], {z,0,10}, {w, 0, 15.1, 1}, {p, 0, Pi, 0.1}] ``` Or give a choice to a user ```wolfram ManipulatePlot[f[w z + p], {z,0,10}, {w, 0, 15.1, 1}, {p, 0, Pi, 0.1}, {f, {Sin, Cos}}] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) Portability [#portability] It can be automatically exported to HTML or MDX in **automatic mode**. Issues [#issues] Help needed! There is no adaptive sampling implemented. # MatrixPlot Plots a 2D array with an arbitrary data inside with axes ```wolfram MatrixPlot[ Fourier[Table[ UnitStep[i, 4 - i] UnitStep[j, 7 - j], {i, -25, 25}, {j, -25, 25}]]] ``` or with a simpler example ```wolfram MatrixPlot[PauliMatrix[3]] ``` Options [#options] `ColorFunction` is not supported option for now Dev notes [#dev-notes] It produces [`Raster`](../Graphics/Raster) graphics object placed into [`Graphics`](../Graphics/Graphics) # NumberLinePlot `NumberLinePlot[{v1,v2,…}]` plots the values vi on a number line. `NumberLinePlot[pred,x]` plots a number line illustrating the region pred. `NumberLinePlot[pred,{x,xmin,xmax}]` plots the number to extend over the interval from xmin to xmax. `NumberLinePlot[{spec1,spec2,…},…]` plots several number lines. Examples [#examples] Plot values on a number line: ```wolfram NumberLinePlot[{1, 2, 5, 7}] ``` Plot a region: ```wolfram NumberLinePlot[x > 2, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberLinePlot.html) for more details. # PairedBarChart `PairedBarChart[{y1, y2, …}, {z1, z2, …}]` makes a paired bar chart with bar lengths y1, y2, … and z1, z2, …. Examples [#examples] Basic paired bar chart: ```wolfram PairedBarChart[{1, 2, 3}, {2, 3, 1}] ``` With labels: ```wolfram PairedBarChart[{1, 2, 3}, {2, 3, 1}, ChartLabels -> {"A", "B", "C"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PairedBarChart.html) for more details. # ParallelAxisPlot `ParallelAxisPlot[{{y11, ..., y1n}, ..., {ym1, ..., ymn}}]` generates a parallel axis plot for the points `{yi1, ..., yin}` using equally spaced axes. * `ParallelAxisPlot[{data1, data2, ...}]` plots several sets of points. Examples [#examples] Create a parallel axis plot: ```wolfram ParallelAxisPlot[{{1, 2, 3}, {4, 3, 2}, {2, 4, 1}}] ``` With multiple datasets: ```wolfram ParallelAxisPlot[{{{1, 2, 3}, {2, 3, 4}}, {{5, 4, 3}, {6, 5, 4}}}] ``` Visualize high-dimensional data: ```wolfram data = RandomReal[{0, 1}, {20, 5}]; ParallelAxisPlot[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelAxisPlot.html) for more details. # ParametricPlot `ParametricPlot[{fx, fy}, {u, umin, umax}]` generates a parametric plot of a curve with x and y coordinates as functions of u. Examples [#examples] Plot a circle: ```wolfram ParametricPlot[{Cos[t], Sin[t]}, {t, 0, 2 Pi}] ``` Plot a spiral: ```wolfram ParametricPlot[{t Cos[t], t Sin[t]}, {t, 0, 4 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricPlot.html) for more details. # ParametricPlot3D `ParametricPlot3D[{fx, fy, fz}, {u, umin, umax}]` produces a three-dimensional space curve parametrized by variable u. `ParametricPlot3D[{fx, fy, fz}, {u, umin, umax}, {v, vmin, vmax}]` produces a three-dimensional surface parametrized by u and v. Examples [#examples] Space curve (helix): ```wolfram ParametricPlot3D[{Cos[t], Sin[t], t/2}, {t, 0, 4 Pi}] ``` Surface (sphere): ```wolfram ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0, 2 Pi}, {v, 0, Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricPlot3D.html) for more details. # Periodogram `Periodogram[list]` plots the squared magnitude of the discrete Fourier transform (power spectrum) of list. * `Periodogram[list, n]` plots the mean of power spectra of non-overlapping partitions of length n. * `Periodogram[list, n, d]` uses partitions with offset d. * `Periodogram[list, n, d, wfun]` applies a smoothing window wfun to each partition. * `Periodogram[list, n, d, wfun, m]` pads partitions with zeros to length m prior to the computation of the transform. * `Periodogram[{list1, list2, ...}, n, d, wfun, m]` plots power spectra of several lists. * `Periodogram[audio, ...]` plots the power spectrum of audio. * `Periodogram[video, ...]` plots the power spectrum of the first audio track in video. * `Periodogram[{input1, input2, ...}, ...]` plots the power spectra of all inputi. Examples [#examples] ```wolfram Periodogram[Table[Sin[2 Pi 0.1 n], {n, 100}]] ``` ```wolfram Periodogram[RandomReal[1, 256], 64] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Periodogram.html) for more details. # PeriodogramArray `PeriodogramArray[list]` returns the squared magnitude of the discrete Fourier transform (power spectrum) of list. `PeriodogramArray[list,n]` averages the power spectra of non-overlapping partitions of length n. `PeriodogramArray[list,n,d]` uses partitions with offset d. `PeriodogramArray[list,n,d,wfun]` applies a smoothing window wfun to each partition. `PeriodogramArray[list,n,d,wfun,m]` pads partitions with zeros to length m prior to the computation of the transform. `PeriodogramArray[image,…]` returns the squared power spectrum of image. `PeriodogramArray[audio,…]` returns the squared power spectrum of audio. `PeriodogramArray[video,…]` returns the squared power spectrum of the first audio track in video. Examples [#examples] Compute the power spectrum of a simple signal: ```wolfram PeriodogramArray[{1, 2, 3, 4, 5}] (* {225., 6.88197, 1.11803, 1.11803, 6.88197} *) ``` Use partitions with averaging: ```wolfram data = Table[Sin[2 Pi n/10], {n, 100}]; PeriodogramArray[data, 20] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PeriodogramArray.html) for more details. # PieChart `PieChart[{y1, y2, ...}]` creates a pie chart with sector sizes proportional to the values. Examples [#examples] Create pie charts: ```wolfram PieChart[{1, 2, 3, 4}] (* With labels *) PieChart[{25, 35, 40}, ChartLabels -> {"Red", "Blue", "Green"}, ChartStyle -> {Red, Blue, Green} ] (* Exploded sector *) PieChart[{1, 2, Callout[3, "Largest"]}, SectorOrigin -> {Automatic, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PieChart.html) for more details. # Plot A Swiss Knife for displaying `y[x]` curves ```wolfram Plot[expr_, {variable, min, max, step}, opts__] ``` has `HoldFirst` attribute. See the list of supported options (`opts`) down below. You can zoom and pan any plots with a mouse. Right-click on the canvas to reset axes Options [#options] PlotStyle [#plotstyle] Works as in Mathematica, i.e. per element in `expr` array, supports color, opacity and etc ```wolfram Plot[Table[x^y, {y, 6}]//Evaluate, {x, 0,1}, PlotStyle->Table[Blend[{Red, Blue}, i/6], {i, 6}]] ``` AxesLabel [#axeslabel] Place labels on your axes ```wolfram Plot[Sinc[x], {x, 0, 10}, AxesLabel -> {"x", "Sinc[x]"}] ``` Labels **accepts only strings** or numbers unlike Mathematica, where you can put everything. Since it is translated into [`Text`](../Graphics/Text), one can use sort of TeX math input ```wolfram Plot[PDF[NormalDistribution[0, 1], x], {x, -10, 10}, AxesLabel -> {"wavenumber (cm^{-1})", "absorption \\alpha"}, PlotRange->Full] ``` It also supports absolute positioning using offset ```wolfram Plot[PDF[NormalDistribution[0, 1], x], {x, -10, 10}, AxesLabel -> {"wavenumber (cm^{-1})", {"absorption \\alpha", {112,0}}}, PlotRange->Full] ``` Ticks [#ticks] Customize ticks by providing an array of numbers for both axes ```wolfram Plot[x, {x, 0, 1}, Ticks->{{0, 0.5, 1}, {}}] ``` Or by providing as pairs `{Number, String}` one can specify the displayed text ```wolfram Plot[x, {x, 0, 1}, Ticks->{{{0, "Zero"}, {0.5, "Half"}, {1,"One"}}, {}}] ``` Frame [#frame] Turns plot into the journals-like styled graph. In general it has much more options to customize the look ```wolfram Plot[x, {x, 0, 1}, Frame->True] ``` FrameTicks [#frameticks] The same as [`Ticks`](#`Ticks`), but for this regime. FrameLabel [#framelabel] The same as [`AxesLabel`](#`AxesLabel`) ```wolfram Plot[x, {x, 0, 1}, Frame->True, FrameLabel->{ "x-axis", "y-axis" }] ``` one can specify an absolute offset for a label by wrapping it into a list ```wolfram Plot[x, {x, 0, 1}, Frame->True, FrameLabel->{ "x-axis", {"y-axis", {0,50}} }] ``` FrameStyle [#framestyle] Affects the style of [`FrameLabels`](#`FrameLabels`). Use `Directive` for changing the style ```wolfram Plot[x, {x, 0, 1}, Frame->True, FrameLabel->{"x-axis", "y-axis"}, FrameStyle->Directive[FontSize->16]] ``` FrameTicksStyle [#frameticksstyle] Affects the style of [`FrameTicks`](#`FrameTicks`) ```wolfram Plot[x, {x, 0, 1}, Frame->True, FrameLabel->{"x-axis", "y-axis"}, FrameTicksStyle->Directive[FontSize->16]] ``` TickLabels [#ticklabels] Since `Plot` options are hardcoded in WL core, we cannot add new options, however using trick with `Insert` any values can be provided to the resulting `Graphics` expression To remove unnecessary ticks, use ```wolfram Plot[x, {x, 0, 1}, Frame->True]; Insert[%, "TickLabels"->{{True, False}, {True, False}}, {2,-1}] ``` ClippingStyle [#clippingstyle] Show the clipped regions like the rest of the curve and colored ```wolfram Plot[Sin[x]/x^2, {x, -10, 10}, ClippingStyle -> Red] ``` Filling [#filling] Fill the area under, over of between curves ```wolfram Plot[Evaluate[Table[BesselJ[n, x], {n, 4}]], {x, 0, 10}, Filling -> Axis] ``` Possible options will be * `Bottom` * `Top` * `{1 -> {2}}` from curve 1 to 2 Baseline [#baseline] Align graphs by the $x$ axis in each plot: ```wolfram {Plot[Im[Zeta[1/2 + I t]], {t, -20, 20}, BaselinePosition -> Axis], Plot[Re[Zeta[1/2 + I t]], {t, -20, 20}, BaselinePosition -> Axis]} // Row ``` Epilog [#epilog] Puts any graphics object on top of the data plotted ```wolfram Plot[Sin[x], {x, 0, 2 Pi}, Epilog -> {PointSize[0.04], Point[{0, 0}], Point[{Pi, 0}], Point[{2 Pi, 0}]}] ``` It opens up many possibilities, since it provides low-level access to the `Graphics` canvas. Prolog [#prolog] The same as [`Epilog`](#`Epilog`), but acts before plotting the data. ExclusionsStyle [#exclusionsstyle] Use red lines to indicate the vertical asymptotes ```wolfram Plot[Tan[x], {x, 0, 10}, Exclusions -> {Cos[x] == 0}, ExclusionsStyle -> Red] ``` ImageSize [#imagesize] A common option for any graphics ```wolfram ImageSize -> Width ``` or ```wolfram ImageSize -> {Width, Height} ``` It uses pixels as units MaxReqursion [#maxreqursion] Affects the accuracy of the plot when it comes to the sudden changes of a sampled function ```wolfram Plot[Sin[1/x], {x, 0.001, 0.1}, MaxRecursion->1] ``` The lowest values is `0` Mesh [#mesh] Shows sampling points ```wolfram Plot[Sin[1/x], {x, 0.001, 0.1}, Mesh -> All] ``` PeformanceGoal [#peformancegoal] Affects the number of sampling points to reduce the load * `"Speed"` * `"Quality"` PlotPoints [#plotpoints] Change the initial sampling points * a number PlotLegends [#plotlegends] Accepts `Automatic`, `"Expressions"` or `List` of expressions to show or explicit legend function, i.e. [SwatchLegend](../Formatting/SwatchLegend), [LineLegend](../Formatting/LineLegend) or [PointLegend](../Formatting/PointLegend) ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 5}, PlotLegends -> {"Sin", "Cos"}] ``` ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 5}, PlotLegends -> {Sin, Cos}] ``` ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 5}, PlotLegends -> SwatchLegend["Expressions"]] ``` ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 5}, PlotLegends -> SwatchLegend[Automatic, {Sin, Cos}]] ``` or ``` legend = PointLegend[{Red, Green, Blue}, {"red", "green", "blue"}]; Plot[{x, (*SpB[*)Power[x(*|*),(*|*)2](*]SpB*), (*SpB[*)Power[x(*|*),(*|*)3](*]SpB*)}, {x,0,3}, PlotStyle->{(*VB[*)(RGBColor[1, 0, 0])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYgCDD/ZQBgMDnAEA4iUPRg=="*)(*]VB*), (*VB[*)(RGBColor[0, 1, 0])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYoACKOODPVwEANd+D0Y="*)(*]VB*), (*VB[*)(RGBColor[0, 0, 1])(*,*)(*"1:eJxTTMoPSmNiYGAo5gUSYZmp5S6pyflFiSX5RcEsQBHn4PCQNGaQPAeQCHJ3cs7PyS8qYoACdMYHewDM1w9G"*)(*]VB*)}, PlotLegends->legend] ``` Legend placement [#legend-placement] Use [Placed](../Formatting/Placed) to adjust the position of your legend, i.e. ```wolfram Plot[ {x,x^2}, {x,0,1}, PlotLegends->Placed[SwatchLegend[Automatic], {0.2,0.2}] ] ``` PlotRange [#plotrange] Change the lot range to show the whole area ```wolfram Plot[Sqrt[x], {x, -5, 5}, PlotRange -> Full] ``` Or a custom range ```wolfram Plot[Sqrt[x], {x, -5, 5}, PlotRange -> {{-5,5}, {0,1}}] ``` RegionFunction [#regionfunction] Show the specific area only ```wolfram Plot[Sin[x], {x, 0, 8 Pi}, RegionFunction -> Function[{x, y}, Abs[y] > 0.5]] ``` Axes [#axes] Show or hide axes of the plot ```wolfram Plot[Sinc[x], {x, 0, 10}, Axes -> False] ``` Interactivity [#interactivity] Consider to use [ManipulatePlot](../Plotting-Functions/ManipulatePlot) for manipulating parameters of a function in real time # Plot3D `Plot3D[f, {x, xmin, xmax}, {y, ymin, ymax}]` generates a three-dimensional plot of f as a function of x and y. Examples [#examples] Plot a 3D surface: ```wolfram Plot3D[Sin[x] Cos[y], {x, -Pi, Pi}, {y, -Pi, Pi}] ``` With options: ```wolfram Plot3D[x^2 + y^2, {x, -2, 2}, {y, -2, 2}, ColorFunction -> "Rainbow"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Plot3D.html) for more details. # PointFigureChart `PointFigureChart[{{date1, p1}, {date2, p2}, ...}]` makes a point and figure chart with prices pi at date datei. * `PointFigureChart[{"name", daterange}]` makes a point and figure chart of closing prices for the financial entity "name" over the date range daterange. * `PointFigureChart[{...}, s, n]` makes a point and figure chart with point and figure height s and n reversals. Examples [#examples] Create a point and figure chart: ```wolfram PointFigureChart[FinancialData["AAPL", "Jan 2023"]] ``` Specify box size and reversals: ```wolfram PointFigureChart[data, 1, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PointFigureChart.html) for more details. # PointLegend `PointLegend[{col1, ...}, {lbl1, ...}]` generates a legend that associates points of colors coli with labels lbli. * `PointLegend[{col1, ...}, Automatic]` generates a legend with placeholder labels. * `PointLegend[{lbl1, ...}]` represents a legend with inherited colors within visualization functions. Examples [#examples] ```wolfram PointLegend[{Red, Blue, Green}, {"A", "B", "C"}] ``` ```wolfram ListPlot[data, PlotLegends -> PointLegend[{"Series 1", "Series 2"}]] ``` ```wolfram PointLegend[{Red, Blue}, Automatic] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PointLegend.html) for more details. # PolarPlot `PolarPlot[r, {θ, θmin, θmax}]` generates a polar plot of a curve with radius r as a function of angle θ. `PolarPlot[{r1, r2, …}, {θ, θmin, θmax}]` makes a polar plot of curves with radius functions r1, r2, …. Examples [#examples] Plot a spiral: ```wolfram PolarPlot[θ, {θ, 0, 4 Pi}] ``` Rose curve: ```wolfram PolarPlot[Sin[3 θ], {θ, 0, Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolarPlot.html) for more details. # RadialAxisPlot `RadialAxisPlot[{y1, y2, ..., yn}]` generates a radial axis plot where the yi are displayed on radial axes equally spaced around the origin. * `RadialAxisPlot[{data1, data2, ...}]` plots several datasets datai on the axes. Examples [#examples] ```wolfram RadialAxisPlot[{1, 2, 3, 4, 5}] ``` ```wolfram RadialAxisPlot[{{1, 2, 3, 4, 5}, {2, 3, 4, 5, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RadialAxisPlot.html) for more details. # RandomImage Generates a raster [`Image`](../Image/Image) with a given size and distribution. Only `RGB` space is supported. The maximum value **is limited to `255` for each channel** ```wolfram RandomImage[255, {100, 100}, ColorSpace -> "RGB"] ``` 3D features are not supported # ReImPlot `ReImPlot[f, {x, xmin, xmax}]` generates a plot of `Re[f]` and `Im[f]` as functions of x from xmin to xmax. * `ReImPlot[{f1, f2, ...}, {x, xmin, xmax}]` plots several functions. * `ReImPlot[{..., w[fi], ...}, ...]` plots fi with features defined by the symbolic wrapper w. * `ReImPlot[..., {x} ∈ reg]` takes the variable x to be in the geometric region reg. Examples [#examples] Plot real and imaginary parts of a complex function: ```wolfram ReImPlot[Sqrt[x], {x, -2, 2}] ``` Plot multiple complex functions: ```wolfram ReImPlot[{Sqrt[x], Log[x]}, {x, -2, 2}] ``` Complex exponential function: ```wolfram ReImPlot[Exp[I x], {x, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReImPlot.html) for more details. # RectangleChart `RectangleChart[{{x1, y1}, {x2, y2}, ...}]` makes a rectangle chart with bars of width xi and height yi. `RectangleChart[{..., wi[{xi, yi}, ...], ...}]` makes a rectangle chart with bar features defined by the symbolic wrappers wk. `RectangleChart[{data1, data2, ...}]` makes a rectangle chart from multiple datasets datai. Examples [#examples] Create a simple rectangle chart: ```wolfram RectangleChart[{{1, 2}, {2, 3}, {1, 1}, {3, 2}}] ``` Multiple datasets: ```wolfram RectangleChart[{{{1, 2}, {2, 1}}, {{1, 3}, {2, 2}}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RectangleChart.html) for more details. # RegionPlot `RegionPlot[pred, {x, xmin, xmax}, {y, ymin, ymax}]` makes a plot showing the region where pred is True. Examples [#examples] Plot a circular region: ```wolfram RegionPlot[x^2 + y^2 < 1, {x, -1.5, 1.5}, {y, -1.5, 1.5}] ``` Multiple regions: ```wolfram RegionPlot[{x^2 + y^2 < 1, x + y < 0}, {x, -2, 2}, {y, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionPlot.html) for more details. # RegionPlot3D `RegionPlot3D[pred, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` makes a 3D plot showing the region where pred is True. Examples [#examples] Plot a sphere: ```wolfram RegionPlot3D[x^2 + y^2 + z^2 < 1, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Intersection of regions: ```wolfram RegionPlot3D[x^2 + y^2 < 1 && z > 0, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegionPlot3D.html) for more details. # RenkoChart `RenkoChart[{{date1, p1}, {date2, p2}, ...}]` makes a Renko chart with prices pi at date datei. * `RenkoChart[{"name", daterange}]` makes a Renko chart of closing prices for the financial entity "name" over the date range. * `RenkoChart[{...}, s]` makes a Renko chart with brick height of fraction s of the average price. Renko charts filter out minor price movements to show trends more clearly. Examples [#examples] ```wolfram RenkoChart[FinancialData["AAPL", "Jan 1, 2023"]] ``` ```wolfram RenkoChart[{"GOOG", "Jan 2023"}] ``` ```wolfram RenkoChart[stockData, 0.02] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RenkoChart.html) for more details. # RevolutionPlot3D `RevolutionPlot3D[fz, {t, tmin, tmax}]` generates a plot of the surface of revolution with height fz at radius t. * `RevolutionPlot3D[fz, {t, tmin, tmax}, {θ, θmin, θmax}]` takes the azimuthal angle θ to vary between θmin and θmax. * `RevolutionPlot3D[{fx, fz}, {t, tmin, tmax}]` generates a plot of the surface obtained by rotating the parametric curve with x, z coordinates `{fx, fz}` around the z axis. * `RevolutionPlot3D[{fx, fz}, {t, tmin, tmax}, {θ, θmin, θmax}]` takes the azimuthal angle θ to vary from θmin to θmax. * `RevolutionPlot3D[{fx, fy, fz}, {t, tmin, tmax}, ...]` plots the surface obtained by rotating the parametric curve with x, y, z coordinates `{fx, fy, fz}`. Examples [#examples] Create a simple surface of revolution: ```wolfram RevolutionPlot3D[Sin[t], {t, 0, Pi}] ``` Create a torus-like shape: ```wolfram RevolutionPlot3D[{2 + Cos[t], Sin[t]}, {t, 0, 2 Pi}] ``` Partial revolution (half surface): ```wolfram RevolutionPlot3D[t^2, {t, 0, 1}, {θ, 0, Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RevolutionPlot3D.html) for more details. # SliceContourPlot3D `SliceContourPlot3D[f,surf,{x,xmin,xmax},{y,ymin,ymax},{z,zmin,zmax}]` generates a contour plot of f over the slice surface surf as a function of x, y, and z. `SliceContourPlot3D[f,surf,{x,y,z}∈reg]` restricts the surface to be within region reg. `SliceContourPlot3D[f,{surf1,surf2,...},...]` generates contour plots over several slices. Examples [#examples] ```wolfram SliceContourPlot3D[x^2 + y^2 + z^2, "CenterPlanes", {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SliceContourPlot3D.html) for more details. # SliceDensityPlot3D `SliceDensityPlot3D[f, surf, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` generates a density plot of f over the slice surface surf as a function of x, y, and z. * `SliceDensityPlot3D[f, surf, {x, y, z} ∈ reg]` restricts the surface to be within region reg. * `SliceDensityPlot3D[f, {surf1, surf2, …}, …]` generates density plots over several slices. Examples [#examples] ```wolfram SliceDensityPlot3D[x^2 + y^2 - z^2, "CenterPlanes", {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SliceDensityPlot3D.html) for more details. # SliceVectorPlot3D `SliceVectorPlot3D[{vx, vy, vz}, surf, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` generates a vector plot of the field `{vx, vy, vz}` over the slice surface surf. * `SliceVectorPlot3D[{vx, vy, vz}, surf, {x, y, z} ∈ reg]` restricts the surface surf to be within the region reg. * `SliceVectorPlot3D[{vx, vy, vz}, {surf1, surf2, …}, …]` generates vector plots over several slice surfaces surfi. Examples [#examples] ```wolfram SliceVectorPlot3D[{y, -x, z}, "CenterPlanes", {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SliceVectorPlot3D.html) for more details. # SmoothDensityHistogram `SmoothDensityHistogram[{{x1, y1}, {x2, y2}, ...}]` plots a smooth kernel histogram of the values `{xi, yi}`. * `SmoothDensityHistogram[{{x1, y1}, {x2, y2}, ...}, espec]` plots a smooth kernel histogram with estimator specification espec. * `SmoothDensityHistogram[{{x1, y1}, {x2, y2}, ...}, espec, dfun]` plots the distribution function dfun. Examples [#examples] ```wolfram SmoothDensityHistogram[RandomReal[1, {100, 2}]] ``` ```wolfram SmoothDensityHistogram[RandomVariate[BinormalDistribution[0.5], 500]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmoothDensityHistogram.html) for more details. # SmoothHistogram `SmoothHistogram[{x1, x2, ...}]` plots a smooth kernel histogram for the PDF of the values. Examples [#examples] Smooth histogram of data: ```wolfram data = RandomVariate[NormalDistribution[], 500]; SmoothHistogram[data] ``` Multiple datasets: ```wolfram SmoothHistogram[{RandomVariate[NormalDistribution[0, 1], 500], RandomVariate[NormalDistribution[2, 1], 500]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmoothHistogram.html) for more details. # SmoothHistogram3D `SmoothHistogram3D[{{x1, y1}, {x2, y2}, ...}]` plots a 3D smooth kernel histogram of the values `{xi, yi}`. * `SmoothHistogram3D[{{x1, y1}, {x2, y2}, ...}, espec]` plots a 3D smooth kernel histogram with estimator specification espec. * `SmoothHistogram3D[{{x1, y1}, {x2, y2}, ...}, espec, dfun]` plots the distribution function dfun. * `SmoothHistogram3D[{data1, data2, ...}, ...]` plots smooth kernel histograms for multiple datasets datai. Examples [#examples] ```wolfram SmoothHistogram3D[RandomReal[1, {100, 2}]] ``` ```wolfram SmoothHistogram3D[RandomVariate[BinormalDistribution[0.5], 500]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmoothHistogram3D.html) for more details. # SphericalPlot3D `SphericalPlot3D[r, {θ, θmin, θmax}, {ϕ, ϕmin, ϕmax}]` generates a 3D plot with spherical radius r as a function of spherical coordinates θ and ϕ. `SphericalPlot3D[{r1, r2, ...}, ...]` generates a 3D spherical plot with multiple surfaces. Examples [#examples] Plot a sphere: ```wolfram SphericalPlot3D[1, {θ, 0, Pi}, {ϕ, 0, 2 Pi}] ``` Plot a more complex surface: ```wolfram SphericalPlot3D[1 + 0.5 Sin[5 θ] Sin[5 ϕ], {θ, 0, Pi}, {ϕ, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalPlot3D.html) for more details. # StackedDateListPlot `StackedDateListPlot[{{date1, y1}, {date2, y2}, ...}]` plots points with values yi at a sequence of dates. `StackedDateListPlot[{data1, data2, ...}]` plots data from all the datai. `StackedDateListPlot[tseries]` plots the time series tseries. Examples [#examples] Create a stacked date list plot: ```wolfram data1 = Table[{DatePlus[{2020, 1, 1}, i], RandomReal[10]}, {i, 0, 30}]; data2 = Table[{DatePlus[{2020, 1, 1}, i], RandomReal[10]}, {i, 0, 30}]; StackedDateListPlot[{data1, data2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StackedDateListPlot.html) for more details. # StackedListPlot `StackedListPlot[{data1, data2, ...}]` plots lines for each of the datai, with the ith curve being the accumulation of values in data1 through datai. Examples [#examples] Create a stacked list plot: ```wolfram StackedListPlot[{Range[10], Range[10, 1, -1], Table[5, 10]}] ``` With filling: ```wolfram StackedListPlot[{Range[5], Range[5, 1, -1]}, Filling -> Axis] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StackedListPlot.html) for more details. # StreamDensityPlot `StreamDensityPlot[{{vx, vy}, r}, {x, xmin, xmax}, {y, ymin, ymax}]` generates stream lines superimposed on a density plot of scalar field r. Examples [#examples] Stream with density background: ```wolfram StreamDensityPlot[{{-y, x}, x^2 + y^2}, {x, -2, 2}, {y, -2, 2}] ``` Using vector magnitude: ```wolfram StreamDensityPlot[{-y, x}, {x, -2, 2}, {y, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StreamDensityPlot.html) for more details. # StreamPlot `StreamPlot[{vx, vy}, {x, xmin, xmax}, {y, ymin, ymax}]` generates a stream plot showing flow lines of a vector field. Examples [#examples] Plot stream lines: ```wolfram (* Rotational flow *) StreamPlot[{-y, x}, {x, -2, 2}, {y, -2, 2}] (* Source/sink flow *) StreamPlot[{x, y}, {x, -2, 2}, {y, -2, 2}, StreamColorFunction -> "Rainbow" ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StreamPlot.html) for more details. # StreamPlot3D `StreamPlot3D[{vx, vy, vz}, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` plots streamlines for the 3D vector field `{vx, vy, vz}` as functions of x, y and z. `StreamPlot3D[{vx, vy, vz}, {x, y, z} ∈ reg]` takes the variables to be in the geometric region reg. Examples [#examples] Plot 3D streamlines: ```wolfram StreamPlot3D[{-y, x, 0}, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}] ``` Helical flow: ```wolfram StreamPlot3D[{-y, x, 1}, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StreamPlot3D.html) for more details. # SwatchLegend `SwatchLegend[{col1, ...}, {lbl1, ...}]` generates a legend that associates swatches of colors coli with labels lbli. * `SwatchLegend[{col1, ...}, Automatic]` generates a legend with placeholder labels for the colors coli. * `SwatchLegend[{lbl1, ...}]` represents a legend with inherited colors within visualization functions. Examples [#examples] Create a color swatch legend: ```wolfram SwatchLegend[{Red, Green, Blue}, {"Low", "Medium", "High"}] ``` Use with a plot: ```wolfram BarChart[{1, 2, 3}, ChartLegends -> SwatchLegend[{"A", "B", "C"}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SwatchLegend.html) for more details. # TimelinePlot ```wolfram TimelinePlot[{dates__}] ``` makes a timeline plot with dates Examples [#examples] A plot for a list of dates ```wolfram TimelinePlot[{DateObject[{2000, 7, 31}, "Day", "Gregorian", -6.0], DateObject[{2003, 10, 23}, "Day", "Gregorian", -6.0], DateObject[{2008, 2, 25}, "Day", "Gregorian", -6.0], DateObject[{2010, 5, 17}, "Day", "Gregorian", -6.0]}] ``` Plot date intervals ```wolfram TimelinePlot[{DateInterval[{DateObject[{2000, 7, 31}, "Day", "Gregorian", -6.0], DateObject[{2003, 10, 23}, "Day", "Gregorian", -6.0]}], DateInterval[{DateObject[{2008, 2, 25}, "Day", "Gregorian", -6.0], DateObject[{2010, 5, 17}, "Day", "Gregorian", -6.0]}]}] ``` Plot multiple sets of intervals ```wolfram TimelinePlot[{{DateInterval[{DateObject[{2003, 4, 28}, "Day", "Gregorian", -6.0], DateObject[{2013, 3, 1}, "Day", "Gregorian", -6.0]}], DateObject[{2009, 3, 27}, "Day", "Gregorian", -6.0], DateInterval[{DateObject[{2002, 12, 20}, "Day", "Gregorian", -6.0], DateObject[{2006, 9, 11}, "Day", "Gregorian", -6.0]}]}, {DateInterval[{DateObject[{2004, 1, 15}, "Day", "Gregorian", -6.0], DateObject[{2010, 9, 9}, "Day", "Gregorian", -6.0]}], DateObject[{2000, 7, 31}, "Day", "Gregorian", -6.0], DateInterval[{DateObject[{2009, 7, 27}, "Day", "Gregorian", -6.0], DateObject[{2014, 8, 6}, "Day", "Gregorian", -6.0]}]}}] ``` # VectorDensityPlot `VectorDensityPlot[{{vx, vy}, r}, {x, xmin, xmax}, {y, ymin, ymax}]` generates vectors superimposed on a density plot of scalar field r. Examples [#examples] Vector field with density: ```wolfram VectorDensityPlot[{{-y, x}, x^2 + y^2}, {x, -2, 2}, {y, -2, 2}] ``` Using magnitude as density: ```wolfram VectorDensityPlot[{x, y}, {x, -2, 2}, {y, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorDensityPlot.html) for more details. # VectorPlot `VectorPlot[{vx, vy}, {x, xmin, xmax}, {y, ymin, ymax}]` plots a 2D vector field as arrows. Examples [#examples] Plot vector fields: ```wolfram (* Simple vector field *) VectorPlot[{y, -x}, {x, -2, 2}, {y, -2, 2}] (* Gradient field *) VectorPlot[{2 x, 2 y}, {x, -2, 2}, {y, -2, 2}, VectorColorFunction -> "Rainbow" ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorPlot.html) for more details. # VectorPlot3D `VectorPlot3D[{vx, vy, vz}, {x, xmin, xmax}, {y, ymin, ymax}, {z, zmin, zmax}]` generates a 3D vector plot. Examples [#examples] 3D vector field: ```wolfram VectorPlot3D[{y, -x, z}, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}] ``` Radial field: ```wolfram VectorPlot3D[{x, y, z}, {x, -2, 2}, {y, -2, 2}, {z, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VectorPlot3D.html) for more details. # WaveletImagePlot `WaveletImagePlot[dwd]` plots the basis tree of wavelet image coefficients in the DiscreteWaveletData dwd. * `WaveletImagePlot[dwd, r]` plots coefficients up to refinement level r. * `WaveletImagePlot[dwd, r, ifunc]` applies the image function ifunc to coefficients and wavelet indexes before plotting. Examples [#examples] Plot wavelet decomposition: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; dwd = DiscreteWaveletTransform[img]; WaveletImagePlot[dwd] ``` Limited refinement level: ```wolfram WaveletImagePlot[dwd, 2] ``` With image function: ```wolfram WaveletImagePlot[dwd, 3, ImageAdjust] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletImagePlot.html) for more details. # WaveletListPlot `WaveletListPlot[dwd]` plots wavelet transform coefficients in the DiscreteWaveletData dwd. `WaveletListPlot[dwd,wind]` plots wavelet transform coefficients corresponding to the wavelet index specification wind. `WaveletListPlot[dwd,wind,func]` applies func to coefficients before plotting. `WaveletListPlot[{dwd1,dwd2,…},…]` plots wavelet transform coefficients from several DiscreteWaveletData objects dwd1, dwd2, …. Examples [#examples] Plot wavelet coefficients: ```wolfram dwd = DiscreteWaveletTransform[Table[Sin[n], {n, 128}]]; WaveletListPlot[dwd] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletListPlot.html) for more details. # WaveletMatrixPlot `WaveletMatrixPlot[dwd]` plots the basis tree of wavelet matrix coefficients in the DiscreteWaveletData dwd. * `WaveletMatrixPlot[dwd, r]` plots coefficients up to refinement level r. * `WaveletMatrixPlot[dwd, r, func]` applies func to coefficients before plotting. Examples [#examples] Create a wavelet matrix plot: ```wolfram data = Table[Sin[20 t] + Cos[5 t], {t, 0, 1, 0.001}]; dwd = DiscreteWaveletTransform[data]; WaveletMatrixPlot[dwd] ``` Plot up to a specific refinement level: ```wolfram WaveletMatrixPlot[dwd, 3] ``` Apply absolute value before plotting: ```wolfram WaveletMatrixPlot[dwd, All, Abs] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletMatrixPlot.html) for more details. # Abort `Abort[]` generates an interrupt to abort a computation. Example [#example] Abort a loop early: ```wolfram Do[ If[i > 5, Abort[]]; Print[i], {i, 10} ] (* Prints 1 through 5, then aborts *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Abort.html) for more details. # AbortKernels `AbortKernels[]` aborts evaluations running in all parallel subkernels. Examples [#examples] ```wolfram AbortKernels[] (* aborts all parallel evaluations *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbortKernels.html) for more details. # AddTo `x += dx` adds dx to x and returns the new value of x. Examples [#examples] Increment a variable by a value: ```wolfram x = 5; x += 3 (* 8 *) ``` Accumulate values in a loop: ```wolfram total = 0; Do[total += i, {i, 5}]; total (* 15 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AddTo.html) for more details. # All `All` is a setting used for certain options. In `Part` and related functions, `All` specifies all parts at a particular level. Basic Usage [#basic-usage] Extracting all elements at a specific level: ```wolfram list = {{a, b}, {c, d}, {e, f}}; list[[All, 1]] (* {a, c, e} *) ``` Using `All` to select entire rows or columns: ```wolfram matrix = {{1, 2, 3}, {4, 5, 6}}; matrix[[All, 2]] (* {2, 5} *) ``` `All` in options to apply settings to all elements: ```wolfram Plot[{Sin[x], Cos[x]}, {x, 0, 2 Pi}, PlotStyle -> All] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/All.html) for more details. # AllMatch `AllMatch[{e1, e2, ...}, form]` yields True if ei matches the pattern form for all of the ei. `AllMatch[expr, form, level]` tests parts of expr at level level. `AllMatch[form]` represents an operator form of AllMatch that can be applied to an expression. Examples [#examples] Check if all elements are positive: ```wolfram AllMatch[{1, 2, 3, 4}, _?Positive] (* True *) ``` Check if all elements are integers: ```wolfram AllMatch[{1, 2, 3.5}, _Integer] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AllMatch.html) for more details. # AllSameBy `AllSameBy[{e1, e2, ...}, f]` tests whether all the `f[ei]` are the same. `AllSameBy[f]` represents an operator form of `AllSameBy` that can be applied to an expression. Examples [#examples] Test if all elements have the same length: ```wolfram AllSameBy[{"aa", "bb", "cc"}, StringLength] (* True *) ``` Check if all numbers have the same sign: ```wolfram AllSameBy[{1, 2, 3}, Sign] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AllSameBy.html) for more details. # Alternatives `p1 | p2 | ...` is a pattern object that represents any of the patterns pi. Examples [#examples] Match multiple patterns: ```wolfram Cases[{1, "a", 2, "b", 3}, _Integer | _String] (* {1, "a", 2, "b", 3} *) ``` Use alternatives in string patterns: ```wolfram StringCases["cat dog bird", "cat" | "dog"] (* {"cat", "dog"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Alternatives.html) for more details. # Assert `Assert[test]` represents the assertion that test is `True`. If assertions are enabled and test is not `True`, an assertion failure is generated. Examples [#examples] Basic assertion: ```wolfram Assert[1 + 1 == 2] (* Null - passes silently *) ``` Failing assertion: ```wolfram Assert[1 + 1 == 3] (* Assertion failure message if assertions enabled *) ``` With tag: ```wolfram Assert[x > 0, "PositiveCheck"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Assert.html) for more details. # Attributes `Attributes[symbol]` gives the list of attributes for a symbol. Examples [#examples] Get attributes of a symbol: ```wolfram Attributes[Plus] (* {Flat, Listable, NumericFunction, OneIdentity, Orderless, Protected} *) ``` Check attributes of multiple symbols: ```wolfram Attributes[{Sin, Cos}] (* {{Listable, NumericFunction, Protected}, ...} *) ``` User-defined symbol: ```wolfram Attributes[myFunc] (* {} - no attributes by default *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Attributes.html) for more details. # Automatic `Automatic` represents an option or other value that is to be chosen automatically by a built-in function. Examples [#examples] Use Automatic for plot range: ```wolfram Plot[Sin[x], {x, 0, 2 Pi}, PlotRange -> Automatic] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Automatic.html) for more details. # Begin `Begin["context`"]\` resets the current context. Examples [#examples] Enter a private context: ```wolfram Begin["MyPackage`Private`"] (* now in MyPackage`Private` context *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Begin.html) for more details. # Blank `_` or `Blank[]` is a pattern object that can stand for any expression. `_h` or `Blank[h]` can stand for any expression with head h. Examples [#examples] Match any expression: ```wolfram MatchQ[5, _] (* True *) ``` Match specific head: ```wolfram MatchQ[5, _Integer] (* True *) MatchQ[5.0, _Integer] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Blank.html) for more details. # BlankNullSequence `___` (three underscores) or `BlankNullSequence[]` is a pattern that can stand for any sequence of zero or more expressions. Examples [#examples] Match zero or more arguments: ```wolfram f[x___] := Length[{x}] f[] (* 0 *) f[a, b, c] (* 3 *) ``` Extract first element or default: ```wolfram {1, 2, 3} /. {x_, ___} :> x (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlankNullSequence.html) for more details. # BlankSequence `__` (two underscores) or `BlankSequence[]` is a pattern that can stand for any sequence of one or more expressions. `__h` can stand for a sequence of one or more expressions with head h. Examples [#examples] Match one or more arguments: ```wolfram f[x__] := {x} f[a, b, c] (* {a, b, c} *) ``` In replacement: ```wolfram {1, 2, 3, 4} /. {__, x_} :> x (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlankSequence.html) for more details. # Block `Block[{x, y, ...}, expr]` specifies that expr is to be evaluated with local values for the symbols x, y, .... `Block[{x = x0, ...}, expr]` defines initial local values for x, .... Example [#example] Temporarily change a global variable: ```wolfram x = 10; Block[{x = 5}, x^2] (* 25 *) x (* 10 - unchanged outside Block *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Block.html) for more details. # BlockMap `BlockMap[f, list, n]` applies f to non-overlapping sublists of length n in list. `BlockMap[f, list, n, d]` applies f to sublists with offset d in list. `BlockMap[f, list, {n1, n2, ...}, ...]` applies f to blocks of size n1×n2×.... Examples [#examples] Apply function to blocks of 2: ```wolfram BlockMap[f, {a, b, c, d, e, f}, 2] (* {f[{a, b}], f[{c, d}], f[{e, f}]} *) ``` Sum pairs: ```wolfram BlockMap[Total, {1, 2, 3, 4, 5, 6}, 2] (* {3, 7, 11} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlockMap.html) for more details. # BlockRandom `BlockRandom[expr]` evaluates expr with all pseudorandom generators localized, so that uses of SeedRandom, RandomInteger, and related functions within the evaluation of expr do not affect subsequent pseudorandom sequences. Examples [#examples] Isolate random number generation: ```wolfram SeedRandom[1]; BlockRandom[SeedRandom[99]; RandomInteger[100]]; RandomInteger[100] (* Same as without BlockRandom *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlockRandom.html) for more details. # Break `Break[]` exits the nearest enclosing `Do`, `For`, `While`, or `Until` loop. Examples [#examples] Break out of a loop: ```wolfram Do[ If[i > 5, Break[]]; Print[i], {i, 1, 10} ] (* prints 1, 2, 3, 4, 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Break.html) for more details. # Check `Check[expr, failexpr]` evaluates expr, returning the result unless messages were generated, in which case it returns failexpr. Examples [#examples] Catch errors: ```wolfram Check[1/0, "Error occurred"] (* "Error occurred" *) ``` Successful evaluation: ```wolfram Check[1 + 1, "Error"] (* 2 *) ``` Check for specific messages: ```wolfram Check[Log[-1], "Invalid", {Log::argx}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Check.html) for more details. # CheckAbort `CheckAbort[expr, failexpr]` evaluates expr, returning failexpr if an abort occurs. Examples [#examples] Handle an abort: ```wolfram CheckAbort[Abort[], "Aborted!"] (* "Aborted!" *) ``` Normal evaluation without abort: ```wolfram CheckAbort[1 + 2, "Aborted"] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CheckAbort.html) for more details. # CheckAll `CheckAll[expr, f]` evaluates expr and returns `f[expr, HoldComplete[control1, ...]]` where the controli expressions are aborts, throws, or other flow control commands currently being executed (but stopped by CheckAll). Examples [#examples] Catch a thrown value: ```wolfram CheckAll[Throw[5], List] (* {Null, HoldComplete[Throw[5]]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CheckAll.html) for more details. # Clear `Clear[s1, s2, ...]` clears values and definitions for the symbols. Examples [#examples] Clear a variable: ```wolfram x = 5; Clear[x] x (* x *) ``` Clear multiple symbols: ```wolfram Clear[f, g, h] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Clear.html) for more details. # ClearAll `ClearAll[s1, s2, ...]` clears all values, definitions, attributes, defaults, options, and messages for the symbols. Examples [#examples] Clear everything about a symbol: ```wolfram f[x_] := x^2; Attributes[f] = {Listable}; ClearAll[f] (* f is now completely undefined *) ``` Clear by pattern: ```wolfram ClearAll["Global`*"] (* Clears all user-defined symbols *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClearAll.html) for more details. # ClearAttributes `ClearAttributes[symbol, attr]` removes attr from the list of attributes of the symbol. Examples [#examples] Remove Listable attribute: ```wolfram SetAttributes[f, Listable] ClearAttributes[f, Listable] Attributes[f] (* {} *) ``` Remove multiple attributes: ```wolfram ClearAttributes[g, {Flat, Orderless}] ``` Remove from multiple symbols: ```wolfram ClearAttributes[{f, g}, Listable] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClearAttributes.html) for more details. # Comap `Comap[{f1, f2, ...}, x]` gives \{f1\[x], f2\[x], ...}. `Comap[fs, x, levelspec]` applies parts of fs specified by levelspec to x. `Comap[fs]` represents an operator form of Comap that can be applied to an expression. Examples [#examples] Apply multiple functions to one argument: ```wolfram Comap[{Sin, Cos, Tan}, Pi/4] (* {1/Sqrt[2], 1/Sqrt[2], 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Comap.html) for more details. # ComapApply `ComapApply[{f1, f2, ...}, expr]` gives \{Apply\[f1, expr], Apply\[f2, expr], ...}. `ComapApply[fs]` represents an operator form of ComapApply that can be applied to an expression. Examples [#examples] Apply multiple functions to arguments: ```wolfram ComapApply[{Plus, Times}, {1, 2, 3}] (* {6, 6} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComapApply.html) for more details. # Compile `Compile[{x1, x2, ...}, expr]` creates a compiled function that evaluates expr assuming numerical values of the xi. `Compile[{{x1, t1}, ...}, expr]` assumes that xi is of a type that matches ti. `Compile[{{x1, t1, n1}, ...}, expr]` assumes that xi is a rank ni array of objects. Examples [#examples] Compile a simple function: ```wolfram cf = Compile[{x}, x^2 + Sin[x]]; cf[2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Compile.html) for more details. # Composition `Composition[f, g, h]` represents the composition of functions, applied right to left: `f[g[h[x]]]`. Examples [#examples] Compose functions: ```wolfram (* f[g[x]] *) comp = Composition[Sqrt, Abs] comp[-4] (* 2 *) (* Chain multiple functions *) Composition[Length, Flatten, Table][i, {i, 3}, {j, i}] (* 6 *) (* Using @* operator *) (Sqrt @* Abs)[-9] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Composition.html) for more details. # CompoundExpression `expr1; expr2; ...` evaluates the expri in turn, giving the last one as the result. Examples [#examples] ```wolfram a = 1; b = 2; a + b (* 3 *) ``` ```wolfram x = 5; (* no output, suppressed by trailing semicolon *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompoundExpression.html) for more details. # Condition `patt /; test` is a pattern which matches only if the evaluation of test yields True. `lhs :> rhs /; test` represents a rule which applies only if the evaluation of test yields True. `lhs := rhs /; test` is a definition to be used only if test yields True. Examples [#examples] Pattern matching with a condition: ```wolfram Cases[{1, -2, 3, -4, 5}, x_ /; x > 0] (* {1, 3, 5} *) ``` Conditional replacement rule: ```wolfram {1, -2, 3, -4} /. x_ :> x^2 /; x < 0 (* {1, 4, 3, 16} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Condition.html) for more details. # ConditionalExpression `ConditionalExpression[expr, cond]` is a symbolic construct that represents the expression expr when the condition cond is True. Examples [#examples] Create a conditional expression: ```wolfram ConditionalExpression[x^2, x > 0] ``` Solve an equation with conditions: ```wolfram Solve[x^2 == 4, x] (* {{x -> ConditionalExpression[-2, True]}, {x -> ConditionalExpression[2, True]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ConditionalExpression.html) for more details. # Conditioned `Conditioned[expr, cond]` or `expr \[Conditioned] cond` represents expr conditioned by the predicate cond. Examples [#examples] Use conditioned expression: ```wolfram Integrate[1/x, {x, 0, 1}, Assumptions -> Conditioned[a > 0, a < 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Conditioned.html) for more details. # Conjunction `Conjunction[expr, {a1, a2, ...}]` gives the conjunction of expr over all choices of the Boolean variables ai. Examples [#examples] Conjunction over Boolean variables: ```wolfram Conjunction[a || b, {a, b}] (* True *) ``` Test if expr is always true: ```wolfram Conjunction[a && !a, {a}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Conjunction.html) for more details. # Context `Context[]` gives the current context. `Context[symbol]` gives the context in which a symbol appears. Examples [#examples] Get the current context: ```wolfram Context[] (* "Global`" *) ``` Get context of a built-in symbol: ```wolfram Context[Sin] (* "System`" *) ``` Get context of a user symbol: ```wolfram Context[myVar] (* "Global`" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Context.html) for more details. # ContextToFileName `ContextToFileName["context"]` gives the string specifying the file name that is by convention associated with a particular context. Examples [#examples] Get filename for a context: ```wolfram ContextToFileName["MyPackage`"] (* "MyPackage.wl" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContextToFileName.html) for more details. # Contexts `Contexts[]` gives a list of all contexts. `Contexts["string"]` gives a list of the contexts that match the string. Examples [#examples] List all contexts matching a pattern: ```wolfram Contexts["System`*"] ``` Get all available contexts: ```wolfram Length[Contexts[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Contexts.html) for more details. # Continue `Continue[]` goes to the next iteration of the nearest enclosing `Do`, `For`, `While`, or `Until` loop. Examples [#examples] Skip even numbers: ```wolfram Do[ If[EvenQ[i], Continue[]]; Print[i], {i, 1, 6} ] (* prints 1, 3, 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Continue.html) for more details. # CriticalSection `CriticalSection[var, expr]` acquires the lock var for parallel computation, evaluates expr, then releases the lock var. `CriticalSection[{var1, var2, ...}, expr]` locks all variables vari simultaneously. Examples [#examples] Use a critical section for thread-safe operations: ```wolfram CriticalSection[lock, counter = counter + 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CriticalSection.html) for more details. # Defer `Defer[expr]` yields an object that displays as the unevaluated form of expr, but evaluates when used as input. Examples [#examples] Defer an expression: ```wolfram Defer[1 + 1] (* 1 + 1 - displays unevaluated *) ``` Copy-paste the output and it evaluates: ```wolfram (* If you copy "1 + 1" from above and evaluate: *) 1 + 1 (* 2 *) ``` Useful for generating code: ```wolfram Defer[Plot[Sin[x], {x, 0, 2 Pi}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Defer.html) for more details. # Do `Do[expr, n]` evaluates expr n times. `Do[expr, {i, imax}]` evaluates expr with the variable i successively taking on the values 1 through imax. `Do[expr, {i, imin, imax}]` starts with i=imin. `Do[expr, {i, imin, imax, di}]` uses steps di. Examples [#examples] Print numbers 1 through 5: ```wolfram Do[Print[i], {i, 5}] (* Prints 1, 2, 3, 4, 5 *) ``` Nested iteration: ```wolfram Do[Print[{i, j}], {i, 2}, {j, 2}] (* Prints {1,1}, {1,2}, {2,1}, {2,2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Do.html) for more details. # DownValues `DownValues[f]` gives a list of transformation rules corresponding to all downvalues (definitions for `f[...]`) defined for the symbol f. Examples [#examples] Get function definitions as rules: ```wolfram f[x_] := x^2; f[0] = 1; DownValues[f] (* {HoldPattern[f[0]] :> 1, HoldPattern[f[x_]] :> x^2} *) ``` Modify definitions programmatically: ```wolfram DownValues[g] = {HoldPattern[g[x_]] :> x + 1}; g[5] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DownValues.html) for more details. # Echo `Echo[expr]` prints expr and returns expr. `Echo[expr, label]` prints expr with a label prefix. `Echo[expr, label, f]` prints `f[expr]` with a label and returns expr. Examples [#examples] Print intermediate values: ```wolfram Echo[2 + 2] (* prints: 4 and returns 4 *) ``` With a label: ```wolfram Echo[{1, 2, 3}, "value: "] (* prints: value: {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Echo.html) for more details. # Enclose `Enclose[expr]` evaluates expr and returns the result, but catches any errors from `Confirm` and returns a `Failure` object. Examples [#examples] Basic error handling: ```wolfram Enclose[ x = Confirm[1/0]; x + 1 ] (* Failure[...] *) ``` Successful evaluation: ```wolfram Enclose[ x = Confirm[5]; x + 1 ] (* 6 *) ``` Handle failure: ```wolfram Enclose[computation[], "Message" &] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Enclose.html) for more details. # End `End[]` returns the present context, and reverts to the previous one. Examples [#examples] End a private context: ```wolfram Begin["MyPackage`Private`"]; (* define private functions *) End[] (* "MyPackage`Private`" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/End.html) for more details. # EndAdd `EndAdd[]` returns the present context, and reverts to the previous one, prepending the present context to `$ContextPath`. Examples [#examples] End a package definition and add to context path: ```wolfram Begin["MyPackage`"]; (* definitions *) EndAdd[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndAdd.html) for more details. # EndOfBuffer `EndOfBuffer` is a symbol that represents the end of currently available data in the buffer for a process or stream. Examples [#examples] Read until end of buffer: ```wolfram ReadString[process, EndOfBuffer] ``` Check for end of buffer: ```wolfram If[Read[stream] === EndOfBuffer, "waiting for more data"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndOfBuffer.html) for more details. # EndOfFile `EndOfFile` is a symbol returned by `Read` when it reaches the end of a file. Examples [#examples] Read until end of file: ```wolfram While[(line = Read[stream, String]) =!= EndOfFile, Print[line]] ``` Check for end of file: ```wolfram Read[stream] === EndOfFile ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndOfFile.html) for more details. # EndPackage `EndPackage[]` restores `$Context` and `$ContextPath` to their values before the preceding `BeginPackage`, and prepends the current context to `$ContextPath`. Examples [#examples] Complete a package definition: ```wolfram BeginPackage["MyPackage`"]; (* export public symbols *) Begin["`Private`"]; (* private implementations *) End[]; EndPackage[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndPackage.html) for more details. # Evaluate `Evaluate[expr]` causes expr to be evaluated even if it appears inside a function that holds its arguments. Examples [#examples] Evaluate inside Plot: ```wolfram Plot[Evaluate[Table[x^n, {n, 1, 3}]], {x, 0, 1}] ``` Force evaluation in Hold: ```wolfram Hold[Evaluate[1 + 1]] (* Hold[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Evaluate.html) for more details. # Except `Except[c]` is a pattern object that matches any expression except one that matches c. `Except[c, p]` matches any expression that matches p but not c. Examples [#examples] Match anything except a specific value: ```wolfram Cases[{1, 2, 3, a, b}, Except[2]] (* {1, 3, a, b} *) ``` Match integers except specific ones: ```wolfram Cases[{1, 2, 3, 4, 5}, Except[2 | 4, _Integer]] (* {1, 3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Except.html) for more details. # Exit `Exit[]` terminates a Wolfram Language kernel session. Examples [#examples] Exit the kernel: ```wolfram Exit[] ``` Exit with a status code: ```wolfram Exit[1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Exit.html) for more details. # Failure `Failure["tag", assoc]` represents a failure of a type indicated by tag, with details in the association. Examples [#examples] Create a failure object: ```wolfram Failure["MyError", <|"MessageTemplate" -> "Something went wrong"|>] (* Failure["MyError", <|"MessageTemplate" -> "Something went wrong"|>] *) ``` Test for failure: ```wolfram FailureQ[Failure["Error", <||>]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Failure.html) for more details. # FailureQ `FailureQ[expr]` gives `True` if expr has head `Failure` or is `$Failed` or `$Aborted`. Examples [#examples] Test for failure: ```wolfram FailureQ[$Failed] (* True *) FailureQ[Failure["Error", <||>]] (* True *) FailureQ[5] (* False *) ``` Conditional handling: ```wolfram result = computation[]; If[FailureQ[result], "Error", result] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FailureQ.html) for more details. # FilterRules `FilterRules[rules, pattern]` selects rules whose left-hand sides match the pattern. Useful for passing options to functions. Examples [#examples] Filter option rules: ```wolfram opts = {PlotRange -> All, Frame -> True, Color -> Red} (* Get only Plot options *) FilterRules[opts, Options[Plot]] (* {PlotRange -> All, Frame -> True} *) (* Filter by specific names *) FilterRules[opts, Frame] (* {Frame -> True} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FilterRules.html) for more details. # Find `Find[stream,"text"]` finds the first line in an input stream that contains the specified string. `Find[stream,{"text1","text2",…}]` finds the first line that contains any of the specified strings. Examples [#examples] ```wolfram (* Open a file and find a line *) stream = OpenRead["data.txt"]; Find[stream, "error"] Close[stream] (* Find line containing any of several strings *) stream = OpenRead["log.txt"]; Find[stream, {"warning", "error", "critical"}] Close[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Find.html) for more details. # FindList `FindList["file","text"]` gives a list of lines in the file that contain the specified string. * `FindList["file",{"text1","text2",…}]` gives a list of all lines that contain any of the specified strings. * `FindList[{"file1",…},…]` gives a list of lines containing the specified strings in any of the filei. * `FindList[files,text,n]` includes only the first n lines found. Examples [#examples] ```wolfram (* Find all lines containing "error" *) FindList["log.txt", "error"] (* Find lines with multiple patterns *) FindList["data.txt", {"warning", "error", "critical"}] (* Get only first 10 matches *) FindList["bigfile.txt", "pattern", 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindList.html) for more details. # FindRepeat `FindRepeat[list]` finds the minimal sublist or subarray that repeats to give list. `FindRepeat[list,n]` requires that the sublist be repeated at least n times in list. `FindRepeat[list,{n1,n2,…}]` requires ni to repeat at level i in list. `FindRepeat["string"]` finds the minimal substring that repeats to give string. `FindRepeat["string",n]` requires that the substring be repeated at least n times. Examples [#examples] Find the repeating pattern in a list: ```wolfram FindRepeat[{a, b, a, b, a, b}] (* {a, b} *) ``` Find the repeating substring: ```wolfram FindRepeat["abcabcabc"] (* "abc" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindRepeat.html) for more details. # FindTransientRepeat `FindTransientRepeat[list,n]` returns a pair of lists `{transient,repeat}` where the elements of repeat occur successively at least n times after the elements of the transient part of list. `FindTransientRepeat[string,n]` returns a pair of strings `{transient,repeat}`. Examples [#examples] ```wolfram FindTransientRepeat[{1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5}, 2] (* {{1, 2}, {3, 4, 5}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindTransientRepeat.html) for more details. # Flat `Flat` is an attribute that can be assigned to a symbol f to indicate that all expressions involving nested functions f should be flattened out. This property is accounted for in pattern matching. Examples [#examples] Define a flat function: ```wolfram SetAttributes[f, Flat] f[f[a, b], c] (* f[a, b, c] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Flat.html) for more details. # For `For[start, test, incr, body]` executes start, then repeatedly evaluates body and incr until test fails to give True. Example [#example] C-style for loop: ```wolfram For[i = 0, i < 5, i++, Print[i]] (* Prints 0, 1, 2, 3, 4 *) ``` Note: In Wolfram Language, `Table` or `Do` are often preferred over `For` loops. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/For.html) for more details. # ForAll `ForAll[x, expr]` represents the statement that expr is `True` for all values of x. `ForAll[x, cond, expr]` states that expr is `True` for all x satisfying condition cond. Examples [#examples] Universal quantification: ```wolfram Resolve[ForAll[x, x^2 >= 0], Reals] (* True *) ``` With a condition: ```wolfram Resolve[ForAll[x, x > 0, Log[x] < x]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ForAll.html) for more details. # FormatValues `FormatValues[f]` gives a list of transformation rules corresponding to all printing formats (values for Format\[f\[x, ...], ...], etc.) defined for the symbol f. Examples [#examples] Define a format for a symbol: ```wolfram Format[mySymbol[x_]] := Framed[x] FormatValues[mySymbol] ``` Check format values for a built-in symbol: ```wolfram FormatValues[Plus] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FormatValues.html) for more details. # FromRawPointer `FromRawPointer[p]` returns the value referred to by the pointer p for use in compiled code. * `FromRawPointer[array, offset]` returns the value of a C array at an offset. Examples [#examples] Read from a raw pointer in compiled code: ```wolfram FunctionCompile[ Function[{Typed[ptr, "RawPointer"::["Integer64"]]}, FromRawPointer[ptr] ] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromRawPointer.html) for more details. # Full `Full` is a setting used for certain options, typically indicating that a full range of values should be included. Examples [#examples] ```wolfram Plot[Sin[x], {x, 0, 2 Pi}, PlotRange -> Full] (* shows the full plot range *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Full.html) for more details. # FullDefinition `FullDefinition[symbol]` prints as the definitions given for symbol, and all symbols on which these depend. `FullDefinition["symbol"]` prints as the definitions given for the symbol named "symbol" if it exists, and all symbols on which these depend. `FullDefinition[patt]` prints as the definitions given for the symbols whose names textually match the arbitrary string pattern patt, and all symbols on which these depend. `FullDefinition[{spec1, spec2, ...}]` prints as the definitions given for the symbols that are equal to or whose names match any of the speci, and all symbols on which these depend. Examples [#examples] Define a function and show its full definition: ```wolfram f[x_] := g[x] + 1; g[x_] := x^2; FullDefinition[f] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FullDefinition.html) for more details. # Function `body &` or `Function[body]` is a pure (or "anonymous") function. The formal parameters are `#` (or `#1`), `#2`, etc. `x |-> body` or `Function[x, body]` is a pure function with a single formal parameter x. `{x1, x2, ...} |-> body` or `Function[{x1, x2, ...}, body]` is a pure function with a list of formal parameters. Examples [#examples] Create a pure function using &: ```wolfram (#^2 &) /@ {1, 2, 3, 4} (* {1, 4, 9, 16} *) ``` Using named parameters: ```wolfram Function[{x, y}, x + y][3, 4] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Function.html) for more details. # FunctionCompile `FunctionCompile[f]` generates a compiled code function from a pure function. * `FunctionCompile[{f1, f2, ...}]` generates a list of compiled code functions. * `FunctionCompile[<|k1 -> f1, k2 -> f2, ...|>]` generates an association of compiled code functions. * `FunctionCompile[defs, fspec]` uses local auxiliary definitions defs. Examples [#examples] Compile a simple function: ```wolfram cf = FunctionCompile[Function[{Typed[x, "Real64"]}, x^2 + 1]] ``` Use the compiled function: ```wolfram cf[3.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FunctionCompile.html) for more details. # Goto `Goto[tag]` scans for `Label[tag]`, and transfers control to that point. Examples [#examples] ```wolfram Module[{i = 1}, Label[start]; If[i < 5, i++; Goto[start]]; i ] ``` ```wolfram Do[If[i == 3, Goto[done]]; Print[i], {i, 5}]; Label[done]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Goto.html) for more details. # Hold `Hold[expr]` maintains expr in an unevaluated form. Examples [#examples] Prevent evaluation: ```wolfram Hold[1 + 1] (* Hold[1 + 1] *) ``` Inspect unevaluated: ```wolfram Hold[2^10] (* Hold[2^10] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hold.html) for more details. # HoldAll `HoldAll` is an attribute that specifies that all arguments to a function are to be maintained in an unevaluated form. Examples [#examples] Define function with HoldAll: ```wolfram SetAttributes[myFunc, HoldAll]; myFunc[1 + 1] (* myFunc[1 + 1] *) ``` Check attributes: ```wolfram Attributes[Function] (* {HoldAll, Protected} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldAll.html) for more details. # HoldAllComplete `HoldAllComplete` is an attribute which specifies that all arguments to a function are not to be modified or looked at in any way during evaluation. Examples [#examples] Define function with HoldAllComplete: ```wolfram SetAttributes[f, HoldAllComplete]; f[Sequence[1, 2, 3]] (* f[Sequence[1, 2, 3]] *) ``` Compare with HoldAll: ```wolfram SetAttributes[g, HoldAll]; g[Sequence[1, 2, 3]] (* g[1, 2, 3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldAllComplete.html) for more details. # HoldComplete `HoldComplete[expr]` shields expr completely from the standard Wolfram Language evaluation process, preventing even upvalues associated with expr from being used. Examples [#examples] Prevent evaluation completely: ```wolfram HoldComplete[1 + 1] (* HoldComplete[1 + 1] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldComplete.html) for more details. # HoldFirst `HoldFirst` is an attribute that specifies that the first argument to a function is to be maintained in an unevaluated form. Examples [#examples] Define function with HoldFirst: ```wolfram SetAttributes[myFunc, HoldFirst]; myFunc[1 + 1, 2 + 2] (* myFunc[1 + 1, 4] *) ``` Check attributes: ```wolfram Attributes[Set] (* {HoldFirst, Protected, SequenceHold} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldFirst.html) for more details. # HoldForm `HoldForm[expr]` prints as the expression expr, with expr maintained in an unevaluated form (unlike `Hold`, doesn't show the wrapper). Examples [#examples] Display unevaluated expression: ```wolfram HoldForm[1 + 1] (* 1 + 1 - displays without wrapper *) ``` Compare with Hold: ```wolfram Hold[2 + 3] (* Hold[2 + 3] *) HoldForm[2 + 3] (* 2 + 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldForm.html) for more details. # HoldPattern `HoldPattern[expr]` is equivalent to expr for pattern matching, but maintains expr in an unevaluated form. Examples [#examples] Match unevaluated expressions: ```wolfram Cases[{1 + 1, 2 + 2, Hold[3 + 3]}, HoldPattern[_ + _]] (* {1 + 1, 2 + 2} - matches before evaluation *) ``` Use in rules: ```wolfram {1 + 1, 2 + 3} /. HoldPattern[a_ + b_] :> {a, b} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldPattern.html) for more details. # HoldRest `HoldRest` is an attribute which specifies that all but the first argument to a function are to be maintained in an unevaluated form. Examples [#examples] Set the HoldRest attribute on a function: ```wolfram SetAttributes[f, HoldRest] f[1 + 1, 2 + 2] (* f[2, 2 + 2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoldRest.html) for more details. # If `If[condition, t, f]` gives t if condition evaluates to True, and f if it evaluates to False. `If[condition, t, f, u]` gives u if condition evaluates to neither True nor False. Examples [#examples] Simple conditional: ```wolfram If[2 > 1, "yes", "no"] (* "yes" *) ``` Conditional in a function: ```wolfram f[x_] := If[x >= 0, Sqrt[x], "undefined"] f[4] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/If.html) for more details. # IgnoringInactive `IgnoringInactive[patt]` is a pattern object that, for purposes of pattern matching, ignores occurrences of `Inactive` in both patt and the expression being matched. Examples [#examples] ```wolfram MatchQ[Inactive[Plus][1, 2], IgnoringInactive[Plus[1, 2]]] ``` ```wolfram Cases[{Inactive[f][x], g[x]}, IgnoringInactive[f[_]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IgnoringInactive.html) for more details. # Increment `x++` increases the value of x by 1, returning the old value of x. Examples [#examples] Post-increment: ```wolfram x = 5; x++ (* 5 *) x (* 6 *) ``` In a loop: ```wolfram i = 0; While[i++ < 3, Print[i]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Increment.html) for more details. # InertEvaluate `InertEvaluate[inertExpr]` evaluates an "InertExpression", returning a new "InertExpression" in compiled code. Examples [#examples] ```wolfram InertEvaluate[Inactive[Plus][1, 2]] ``` ```wolfram InertEvaluate[Inactive[Sin][Pi]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InertEvaluate.html) for more details. # InertExpression `InertExpression[expr]` creates an inert expression in compiled code. Examples [#examples] ```wolfram InertExpression[x + y] ``` ```wolfram FunctionCompile[Function[{}, InertExpression[1 + 2]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InertExpression.html) for more details. # InfiniteFuture `InfiniteFuture` returns a DateObject expression representing infinite future in time. Examples [#examples] Get the infinite future date: ```wolfram InfiniteFuture (* DateObject[{∞}] *) ``` Use in date comparisons: ```wolfram DateWithin[Now, InfiniteFuture] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InfiniteFuture.html) for more details. # InfinitePast `InfinitePast` returns a `DateObject` expression representing infinite past in time. Examples [#examples] ```wolfram InfinitePast ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InfinitePast.html) for more details. # Information `Information[expr]` gives information about the expression expr. `Information[expr, prop]` gives the value of the property prop. Examples [#examples] Get symbol information: ```wolfram Information[Sin] ``` Get specific property: ```wolfram Information[Sin, "Usage"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Information.html) for more details. # InformationData `InformationData[assoc]` is generated by Information\[expr] and handles typesetting and element extraction. Examples [#examples] ```wolfram Information[Sin] ``` ```wolfram Information[Plot, "Options"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InformationData.html) for more details. # Inherited `Inherited` represents an option value to be inherited from an enclosing style, cell, or notebook. This is used to specify that a property should take its value from the parent context rather than being explicitly set. Examples [#examples] ```wolfram Style["text", FontColor -> Inherited] ``` ```wolfram Cell["content", Background -> Inherited] ``` ```wolfram (* Use inherited option in a cell *) Cell[BoxData["x"], CellFrame -> Inherited] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inherited.html) for more details. # Initialize `Initialize[sym]` initializes the symbol sym from persistent values on the default persistence path. * `Initialize[sym, {loc1, …}]` initializes the symbol sym from persistent values on the persistence path \{loc1, …}. * `Initialize["patt"]` initializes all variables matching the string pattern "patt". Examples [#examples] ```wolfram Initialize[myVar] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Initialize.html) for more details. # InterfaceSwitched `InterfaceSwitched[<|size1 -> expr1, size2 -> expr2, ...|>]` is a construct that behaves as if it were expri when it is in an interface environment with width sizei. * `InterfaceSwitched["param", <|key1 -> expr1, key2 -> expr2, ...|>]` behaves as if it were expri when the value of the interface parameter param corresponds to keyi. Examples [#examples] Responsive content based on width: ```wolfram InterfaceSwitched[<|"Small" -> "Mobile view", "Large" -> "Desktop view"|>] ``` Switch on parameter: ```wolfram InterfaceSwitched["Theme", <|"Light" -> lightStyle, "Dark" -> darkStyle|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InterfaceSwitched.html) for more details. # IntermediateTest `IntermediateTest[input]` creates an intermediate test to determine whether input evaluates to `True`. * `IntermediateTest[input, expected]` tests whether input evaluates to expected. * `IntermediateTest[input, expected, messages]` creates a test expecting the specified message names. Examples [#examples] ```wolfram IntermediateTest[1 + 1 == 2] ``` ```wolfram IntermediateTest[Sqrt[4], 2] ``` ```wolfram IntermediateTest[1/0, ComplexInfinity, {Power::infy}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntermediateTest.html) for more details. # Label `Label[tag]` represents a point in a compound expression to which control can be transferred using `Goto`. Examples [#examples] ```wolfram Module[{i = 0}, Label[start]; i++; If[i < 5, Goto[start]]; i] ``` ```wolfram Label["myLabel"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Label.html) for more details. # LaunchKernels `LaunchKernels[]` launches all currently configured parallel subkernels. * `LaunchKernels[n]` launches n local subkernels on the current computer. * `LaunchKernels[ker]` launches the kernel specified by ker. * `LaunchKernels[{ker1, ker2, ...}]` launches the kernels keri. Examples [#examples] Launch all configured kernels: ```wolfram LaunchKernels[] ``` Launch 4 local kernels: ```wolfram LaunchKernels[4] ``` Check running kernels: ```wolfram LaunchKernels[]; Kernels[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LaunchKernels.html) for more details. # LocalEvaluate `LocalEvaluate[expr]` gives the result of evaluating expr using your current default local Wolfram Language kernel. * `LocalEvaluate[ker, expr]` gives the result of evaluating expr using the kernel specified by ker. * `LocalEvaluate[{ker1, ker2, ...}, expr]` gives a list of the results of evaluating expr using each of the kernels keri. * `LocalEvaluate[ker, expr, h]` wraps the head h around the result produced before returning it. Examples [#examples] ```wolfram LocalEvaluate[1 + 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalEvaluate.html) for more details. # LocalSubmit `LocalSubmit[expr]` submits a task to evaluate expr in a separate kernel. * `LocalSubmit[ScheduledTask[expr, spec]]` submits a task on the schedule defined by spec. Examples [#examples] ```wolfram LocalSubmit[Print["Background computation"]] ``` ```wolfram task = LocalSubmit[LongComputation[]] TaskWait[task] ``` ```wolfram LocalSubmit[ScheduledTask[UpdateData[], Quantity[1, "Hours"]]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocalSubmit.html) for more details. # Locked `Locked` is an attribute that, once assigned, prevents modification of any attributes of a symbol. Examples [#examples] Check attributes of a locked symbol: ```wolfram Attributes[Sin] (* {Listable, NumericFunction, Protected, Locked} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Locked.html) for more details. # MatchQ `MatchQ[expr, form]` returns `True` if expr matches the pattern form, and `False` otherwise. Examples [#examples] Match against a pattern: ```wolfram MatchQ[{1, 2, 3}, {__Integer}] (* True *) ``` Match head: ```wolfram MatchQ[f[x, y], _f] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatchQ.html) for more details. # MemoryAvailable `MemoryAvailable[]` gives the estimated number of bytes readily available for storing additional data in the current Wolfram Language kernel session. Examples [#examples] Check available memory: ```wolfram MemoryAvailable[] ``` Display in megabytes: ```wolfram MemoryAvailable[] / 10^6 ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MemoryAvailable.html) for more details. # MemoryConstrained `MemoryConstrained[expr, b]` evaluates expr, stopping if more than b bytes of memory are requested. `MemoryConstrained[expr, b, failexpr]` returns failexpr if the constraint is exceeded. Examples [#examples] Limit memory usage: ```wolfram MemoryConstrained[Range[10^8], 10^6] (* $Aborted - requires too much memory *) ``` Provide fallback value: ```wolfram MemoryConstrained[Range[10^8], 10^6, "Too much memory"] (* "Too much memory" *) ``` Successful within limits: ```wolfram MemoryConstrained[Range[100], 10^6] (* {1, 2, ..., 100} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MemoryConstrained.html) for more details. # MemoryInUse `MemoryInUse[]` gives the number of bytes currently being used to store all data in the current Wolfram Language kernel session. Examples [#examples] Check current memory usage: ```wolfram MemoryInUse[] (* 45678912 *) ``` Monitor memory before and after: ```wolfram before = MemoryInUse[]; data = Range[10^6]; after = MemoryInUse[]; after - before (* Bytes used by data *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MemoryInUse.html) for more details. # NHoldAll `NHoldAll` is an attribute which specifies that none of the arguments to a function should be affected by `N`. Examples [#examples] ```wolfram SetAttributes[f, NHoldAll]; N[f[Pi]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NHoldAll.html) for more details. # NHoldFirst `NHoldFirst` is an attribute which specifies that the first argument to a function should not be affected by `N`. Examples [#examples] ```wolfram SetAttributes[f, NHoldFirst] N[f[Pi, E]] ``` ```wolfram Attributes[f] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NHoldFirst.html) for more details. # NHoldRest `NHoldRest` is an attribute which specifies that all but the first argument to a function should not be affected by `N`. This attribute prevents numerical evaluation of arguments other than the first when `N` is applied. Examples [#examples] ```wolfram SetAttributes[f, NHoldRest]; N[f[1/3, 1/7]] ``` ```wolfram Attributes[Plot] ``` ```wolfram (* Compare with and without NHoldRest *) ClearAttributes[g, NHoldRest]; N[g[1/2, 1/3]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NHoldRest.html) for more details. # NValues `NValues[f]` gives a list of transformation rules corresponding to all numerical values (values for `N[f[x,…],…]`, etc.) defined for the symbol f. Examples [#examples] Get numerical values: ```wolfram NValues[Pi] ``` Define custom N value: ```wolfram N[myConst] ^= 2.71828; NValues[myConst] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NValues.html) for more details. # NameQ `NameQ["string"]` yields True if there are any symbols whose names match the string pattern given, and yields False otherwise. Examples [#examples] Check if a symbol exists: ```wolfram NameQ["Sin"] (* True *) ``` Check for a non-existent symbol: ```wolfram NameQ["NonExistentSymbol"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NameQ.html) for more details. # Names `Names["pattern"]` gives a list of the names of symbols that match the pattern. Examples [#examples] Find all symbols starting with "Plot": ```wolfram Names["Plot*"] (* {"Plot", "Plot3D", "PlotRange", ...} *) ``` List all user-defined symbols: ```wolfram Names["Global`*"] (* {"x", "f", "myVar", ...} *) ``` Find symbols matching a pattern: ```wolfram Names["*Q"] (* {"EvenQ", "OddQ", "IntegerQ", ...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Names.html) for more details. # Needs `Needs["context`"]`loads an appropriate file if the specified context is not already in`\$Packages\`. `Needs["context`", "file"]`loads file if the specified context is not already in`\$Packages\`. Examples [#examples] Load a package: ```wolfram Needs["Developer`"] ``` Load with explicit file: ```wolfram Needs["MyPackage`", "path/to/MyPackage.m"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Needs.html) for more details. # None `None` is a setting used for certain options to indicate no value or disabled feature. Examples [#examples] Disable frame on a plot: ```wolfram Plot[Sin[x], {x, 0, 2 Pi}, Frame -> None] ``` Check for None: ```wolfram result = None; result === None (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/None.html) for more details. # Off `Off[symbol::tag]` switches off a message permanently so it is no longer printed. Examples [#examples] Turn off a specific message: ```wolfram Off[General::spell1] (* Spelling warnings disabled *) ``` Turn off all messages from a symbol: ```wolfram Off[Power::infy] 1/0 (* ComplexInfinity - no message *) ``` Turn back on with On: ```wolfram On[General::spell1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Off.html) for more details. # Offset `Offset[{dx, dy}, position]` gives the position of a graphical object obtained by starting at the specified position and then moving by absolute offset \{dx, dy}. Examples [#examples] Place text with offset: ```wolfram Graphics[{Point[{0, 0}], Text["Label", Offset[{10, 5}, {0, 0}]]}] ``` Using in Inset: ```wolfram Graphics[{Circle[], Inset["Center", Offset[{0, 20}, {0, 0}]]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Offset.html) for more details. # On `On[symbol::tag]` switches on a message so that it can be printed (reverses `Off`). Examples [#examples] Re-enable a message: ```wolfram Off[General::spell1] (* ... later ... *) On[General::spell1] ``` Enable tracing: ```wolfram On[f] (* Trace evaluations of f *) ``` Enable multiple messages: ```wolfram On[Power::infy, General::argx] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/On.html) for more details. # Once `Once[expr]` evaluates expr once in each Wolfram Language session, always returning the result from the first evaluation. * `Once[expr, loc]` evaluates expr once and caches the result in persistence location loc. Examples [#examples] Evaluate an expression only once: ```wolfram Once[Print["Evaluated!"; RandomReal[]]] (* Prints "Evaluated!" only the first time *) ``` Cache result persistently: ```wolfram Once[RandomReal[], "Local"] ``` Use for expensive computations: ```wolfram data = Once[Import["https://example.com/large-dataset.csv"]]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Once.html) for more details. # OneIdentity `OneIdentity` is an attribute that can be assigned to a symbol f to indicate that f\[x], f\[f\[x]], etc. are all equivalent to x for the purpose of pattern matching. Examples [#examples] ```wolfram SetAttributes[f, OneIdentity]; MatchQ[f[x], x_] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OneIdentity.html) for more details. # OptionValue `OptionValue[name]` extracts option values inside a function defined with `OptionsPattern[]`. Examples [#examples] Define functions with options: ```wolfram Options[myFunc] = {Color -> Red, Size -> 10} myFunc[x_, OptionsPattern[]] := { OptionValue[Color], OptionValue[Size], x } myFunc[5] (* {Red, 10, 5} *) myFunc[5, Color -> Blue] (* {Blue, 10, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OptionValue.html) for more details. # Options `Options[symbol]` gives the list of default options for a function. `Options[expr]` extracts options from an expression. Examples [#examples] Inspect function options: ```wolfram (* Default options for Plot *) Options[Plot] (* {AlignmentPoint -> Center, AspectRatio -> 1/GoldenRatio, ...} *) (* Get specific option *) Options[Plot, PlotRange] (* {PlotRange -> {Full, Automatic}} *) (* Options from a graphics object *) g = Graphics[Circle[], Frame -> True] Options[g, Frame] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Options.html) for more details. # OptionsPattern `OptionsPattern[]` is a pattern object that represents a collection of options given as rules, where the values of the options can be accessed using `OptionValue`. * `OptionsPattern[f]` takes default option values from `Options[f]`. * `OptionsPattern[{opt1 -> val1, opt2 -> val2, ...}]` uses an explicit list of default option values. Examples [#examples] ```wolfram f[x_, opts : OptionsPattern[{a -> 1}]] := {x, OptionValue[a]} f[5, a -> 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OptionsPattern.html) for more details. # OutputStream `OutputStream["name", n]` is an object that represents an output stream for functions such as Write. Examples [#examples] Open and write to stream: ```wolfram stream = OpenWrite["test.txt"] (* OutputStream["test.txt", 3] *) ``` Check stream status: ```wolfram Head[stream] (* OutputStream *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OutputStream.html) for more details. # PacletFind `PacletFind["name"]` gives a list of installed paclets that match "name". `PacletFind["name" -> "version"]` gives a list of installed paclets that match "name" and "version". `PacletFind["name", <|prop1 -> val1, prop2 -> val2, ...|>]` gives a list of installed paclets that match "name" and criteria given by the propi -> vali. Examples [#examples] ```wolfram PacletFind["PacletManager"] ``` ```wolfram PacletFind["*Data*"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PacletFind.html) for more details. # PacletInstall `PacletInstall[paclet]` installs or updates paclet. * `PacletInstall[task]` waits for completion of the task started by `PacletInstallSubmit`. Examples [#examples] ```wolfram PacletInstall["DocumentationSearch"] ``` ```wolfram PacletInstall["https://example.com/MyPaclet-1.0.paclet"] ``` ```wolfram task = PacletInstallSubmit["PackageName"]; PacletInstall[task] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PacletInstall.html) for more details. # ParallelCombine `ParallelCombine[f, h[e1, e2, …], comb]` evaluates f\[h\[e1,e2,…]] in parallel by distributing parts of the computation to all parallel kernels and combining the partial results with comb. `ParallelCombine[f, h[e1, e2, …]]` is equivalent to ParallelCombine\[f,h\[e1,e2,…],h] if h has attribute Flat, and ParallelCombine\[f,h\[e1,e2,…],Join] otherwise. Examples [#examples] ```wolfram ParallelCombine[Total, Range[1000], Plus] (* 500500 *) ``` ```wolfram ParallelCombine[Map[f], {a, b, c, d, e}, Join] (* {f[a], f[b], f[c], f[d], f[e]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelCombine.html) for more details. # ParallelDo `ParallelDo[expr, {imax}]` evaluates expr in parallel imax times. `ParallelDo[expr, {i, imax}]` evaluates expr in parallel with the variable i successively taking on the values 1 through imax (in steps of 1). `ParallelDo[expr, {i, imin, imax}]` starts with i = imin. `ParallelDo[expr, {i, imin, imax, di}]` uses steps di. `ParallelDo[expr, {i, {i1, i2, ...}}]` uses the successive values i1, i2, .... `ParallelDo[expr, {i, imin, imax}, {j, jmin, jmax}, ...]` evaluates expr looping in parallel over different values of j, etc. for each i. Examples [#examples] Evaluate in parallel 10 times: ```wolfram ParallelDo[Print[$KernelID], {10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelDo.html) for more details. # ParallelEvaluate `ParallelEvaluate[expr]` evaluates the expression expr on all available parallel kernels and returns the list of results obtained. * `ParallelEvaluate[expr, kernel]` evaluates expr on the parallel kernel specified. * `ParallelEvaluate[expr, {ker1, ker2, ...}]` evaluates expr on the parallel kernels keri. * `ParallelEvaluate[expr, kernels, h]` wraps the head h around the results before returning them. Examples [#examples] ```wolfram ParallelEvaluate[$KernelID] ``` ```wolfram ParallelEvaluate[RandomReal[], Kernels[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelEvaluate.html) for more details. # ParallelMap `ParallelMap[f, expr]` applies f in parallel to each element on the first level in expr. * `ParallelMap[f, expr, levelspec]` applies f in parallel to parts of expr specified by levelspec. This function distributes computations across parallel kernels for improved performance. Examples [#examples] ```wolfram ParallelMap[FactorInteger, Range[100, 110]] ``` ```wolfram ParallelMap[N[#, 100] &, {Pi, E, GoldenRatio}] ``` ```wolfram ParallelMap[PrimeQ, Range[1000], {1}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelMap.html) for more details. # ParallelNeeds `ParallelNeeds["context`"]`evaluates`Needs\["context`"]` on all available parallel kernels. Examples [#examples] ```wolfram ParallelNeeds["ComputationalGeometry`"] ``` ```wolfram LaunchKernels[]; ParallelNeeds["Developer`"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelNeeds.html) for more details. # ParallelSubmit `ParallelSubmit[expr]` submits expr for evaluation on the next available parallel kernel and returns an EvaluationObject expression representing the submitted evaluation. * `ParallelSubmit[{var1, var2, ...}, expr]` builds a closure for the variables given before submitting expr. Examples [#examples] ```wolfram ParallelSubmit[1 + 1] ``` ```wolfram x = 5; ParallelSubmit[{x}, x^2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelSubmit.html) for more details. # ParallelTable `ParallelTable[expr,{imax}]` generates in parallel a list of imax copies of expr. `ParallelTable[expr,{i,imax}]` generates in parallel a list of the values of expr when i runs from 1 to imax. `ParallelTable[expr,{i,imin,imax}]` starts with i=imin. `ParallelTable[expr,{i,imin,imax,di}]` uses steps di. `ParallelTable[expr,{i,{i1,i2,…}}]` uses the successive values i1, i2, …. `ParallelTable[expr,{i,imin,imax},{j,jmin,jmax},…]` gives a nested list. The list associated with i is outermost. Examples [#examples] Generate a list in parallel: ```wolfram ParallelTable[i^2, {i, 10}] (* {1, 4, 9, 16, 25, 36, 49, 64, 81, 100} *) ``` Create a nested list: ```wolfram ParallelTable[i + j, {i, 3}, {j, 3}] (* {{2, 3, 4}, {3, 4, 5}, {4, 5, 6}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParallelTable.html) for more details. # Parallelize `Parallelize[expr]` evaluates expr using automatic parallelization. Examples [#examples] ```wolfram Parallelize[Table[i^2, {i, 10}]] (* {1, 4, 9, 16, 25, 36, 49, 64, 81, 100} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Parallelize.html) for more details. # Pattern `sym:obj` or `Pattern[sym, obj]` represents the pattern object obj, assigned the name sym. Examples [#examples] Named pattern: ```wolfram f[x_Integer] := x^2 f[5] (* 25 *) ``` Pattern with condition: ```wolfram g[x:_?Positive] := Sqrt[x] g[4] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pattern.html) for more details. # PatternFilling `PatternFilling[obj]` is a two-dimensional graphics directive specifying that obj should be used to fill faces of polygons and other filled graphics objects. * `PatternFilling["name"]` uses the specified pattern "name". * `PatternFilling[obj, size]` specifies the size of the object obj. * `PatternFilling[obj, size, {dx, dy}]` moves the object obj by the offset \{dx, dy}. Examples [#examples] ```wolfram Graphics[{PatternFilling["Checkerboard"], Rectangle[]}] ``` ```wolfram Graphics[{PatternFilling[Graphics[Circle[]], 20], Polygon[{{0, 0}, {1, 0}, {0.5, 1}}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PatternFilling.html) for more details. # PatternSequence `PatternSequence[p1, p2, …]` is a pattern object that represents a sequence of arguments matching p1, p2, …. Examples [#examples] ```wolfram Cases[{{1, 2, 3}, {a, b}}, {PatternSequence[x_, y_], ___}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PatternSequence.html) for more details. # PatternTest `p?test` is a pattern object that stands for any expression that matches p, and on which the application of test gives `True`. Examples [#examples] Match only integers: ```wolfram f[x_?IntegerQ] := x^2; f[5] (* 25 *) ``` Match only positive: ```wolfram g[x_?Positive] := Sqrt[x]; g[4] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PatternTest.html) for more details. # Pause `Pause[n]` pauses evaluation for at least n seconds. Examples [#examples] Pause for 2 seconds: ```wolfram Pause[2] (* Null - returns after 2 seconds *) ``` Use Pause in a loop for delayed output: ```wolfram Do[Print[i]; Pause[0.5], {i, 3}] (* Prints 1, 2, 3 with 0.5 second delays *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pause.html) for more details. # PersistenceLocation `PersistenceLocation["type"]` represents a persistence location of the given type. * `PersistenceLocation["type", base]` includes the base address for a location type that allows multiple locations. This is used with `PersistentValue` to specify where persistent data is stored. Examples [#examples] ```wolfram PersistenceLocation["Local"] ``` ```wolfram PersistenceLocation["KernelSession"] ``` ```wolfram PersistenceLocation["FrontEndSession", "custom"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PersistenceLocation.html) for more details. # PersistentObject `PersistentObject["name",loc]` represents a persistent object stored at persistence location loc. Examples [#examples] ```wolfram PersistentObject["mydata", "Local"] (* PersistentObject["mydata", "Local"] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PersistentObject.html) for more details. # PersistentObjects `PersistentObjects[]` gives all persistent objects in all locations in `$PersistencePath`. * `PersistentObjects[patt]` gives all persistent objects whose names match the string pattern patt. * `PersistentObjects[patt, loc]` gives all matching persistent objects in persistence location loc. * `PersistentObjects[patt, {loc1, ...}]` gives all matching persistent objects in all the loci. Examples [#examples] ```wolfram PersistentObjects[] ``` ```wolfram PersistentObjects["my*"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PersistentObjects.html) for more details. # PersistentSymbol `PersistentSymbol["name"]` represents the persistent symbol associated with the key "name". * `PersistentSymbol["name", loc]` represents the persistent symbol associated with name stored in persistence location loc. * `PersistentSymbol["name", {loc1, ...}]` represents the persistent symbol associated with name at the first of the locations loci at which it occurs. Examples [#examples] ```wolfram PersistentSymbol["myValue"] = 42 ``` ```wolfram PersistentSymbol["myValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PersistentSymbol.html) for more details. # PersistentValue `PersistentValue["name"]` represents the persistent value associated with the key "name". * `PersistentValue["name", loc]` represents the persistent value associated with name stored in persistence location loc. * `PersistentValue["name", {loc1, ...}]` represents the persistent value associated with name at the first of the locations loci at which it occurs. Examples [#examples] ```wolfram PersistentValue["mykey"] = 42 ``` ```wolfram PersistentValue["mykey"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PersistentValue.html) for more details. # Piecewise `Piecewise[{{val1, cond1}, {val2, cond2}, ...}]` represents a piecewise function with values in regions defined by conditions. Examples [#examples] Define piecewise functions: ```wolfram f[x_] := Piecewise[{ {x^2, x < 0}, {x, 0 <= x < 1}, {1, x >= 1} }] (* Plot it *) Plot[Piecewise[{{-x, x < 0}, {x, x >= 0}}], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Piecewise.html) for more details. # PreDecrement `--x` decreases the value of x by 1, returning the new value of x. Examples [#examples] Pre-decrement a variable: ```wolfram x = 5; --x (* 4 *) ``` The variable is modified in place: ```wolfram x (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PreDecrement.html) for more details. # PreIncrement `++x` increases the value of x by 1, returning the new value of x. Examples [#examples] ```wolfram x = 5; ++x ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PreIncrement.html) for more details. # Precedence `Precedence[sym]` returns the precedence of the output operator associated to the symbol sym. * `Precedence[boxes, fmt]` returns the precedence of the operator used in the typeset expression boxes, assuming it was typeset in the format fmt. Examples [#examples] ```wolfram Precedence[Plus] ``` ```wolfram Precedence[Times] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Precedence.html) for more details. # PreemptProtect `PreemptProtect[expr]` evaluates expr, without any interruption from preemptive evaluations. Examples [#examples] Protect critical code: ```wolfram PreemptProtect[ x = 1; y = 2; x + y ] ``` Ensure atomic operations: ```wolfram PreemptProtect[ counter++; result = Process[counter] ] ``` In parallel computing: ```wolfram PreemptProtect[ AppendTo[sharedList, newValue] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PreemptProtect.html) for more details. # Print `Print[expr]` prints expr as output. Examples [#examples] Print a message: ```wolfram Print["Hello, World!"] (* Hello, World! *) ``` Print multiple expressions: ```wolfram Print["x = ", 5] (* x = 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Print.html) for more details. # PrintTemporary `PrintTemporary[expr]` prints expr temporary and removes it from the output once the evaluation is complete Examples [#examples] Print a message: ```wolfram PrintTemporary[Red]; Pause[3]; "Done!" ``` # Protect `Protect[s1, s2, ...]` sets the attribute `Protected` for the symbols, preventing modification of their definitions. Examples [#examples] Protect a symbol: ```wolfram f[x_] := x^2; Protect[f] (* f is now protected *) f[x_] := x^3 (* Set::write: Tag f is Protected *) ``` Check if protected: ```wolfram MemberQ[Attributes[Plus], Protected] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Protect.html) for more details. # Quiet `Quiet[expr]` evaluates expr without outputting any messages generated. `Quiet[expr, {s1::t1, s2::t2, ...}]` quietens only the specified messages. Examples [#examples] Suppress all messages: ```wolfram Quiet[1/0] (* ComplexInfinity *) ``` Suppress specific messages: ```wolfram Quiet[Log[-1], {Log::argx}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quiet.html) for more details. # Quit `Quit[]` terminates a Wolfram Language kernel session. Examples [#examples] End the session: ```wolfram Quit[] ``` Exit with status code: ```wolfram Quit[1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quit.html) for more details. # ReleaseHold `ReleaseHold[expr]` removes `Hold`, `HoldForm`, `HoldPattern`, and `HoldComplete` from expr, allowing evaluation. Examples [#examples] Evaluate a held expression: ```wolfram ReleaseHold[Hold[1 + 1]] (* 2 *) ``` Release HoldForm: ```wolfram ReleaseHold[HoldForm[2^10]] (* 1024 *) ``` Nested holds: ```wolfram ReleaseHold[Hold[Hold[1 + 1]]] (* Hold[1 + 1] - removes one level *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReleaseHold.html) for more details. # Repeated `p..` or `Repeated[p]` is a pattern object that represents a sequence of one or more expressions, each matching p. `Repeated[p, max]` represents from 1 to max expressions matching p. `Repeated[p, {min, max}]` represents between min and max expressions matching p. Examples [#examples] Match one or more integers: ```wolfram Cases[{{1, 2}, {a, b}, {3}}, {_Integer ..}] (* {{1, 2}, {3}} *) ``` Match exactly two elements: ```wolfram MatchQ[{a, b}, {Repeated[_, {2}]}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Repeated.html) for more details. # RepeatedTiming `RepeatedTiming[expr]` evaluates expr repeatedly and returns a list of the average time in seconds used, together with the result obtained. `RepeatedTiming[expr, t]` does repeated evaluation for at least t seconds. Examples [#examples] ```wolfram RepeatedTiming[Sum[i, {i, 10000}]] (* {0.00012, 50005000} *) ``` ```wolfram RepeatedTiming[Prime[10000], 1] (* {2.3*10^-6, 104729} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RepeatedTiming.html) for more details. # Replace `Replace[expr, rules]` applies a rule or list of rules in an attempt to transform the entire expression expr. `Replace[expr, rules, levelspec]` applies rules to parts of expr specified by levelspec. Examples [#examples] Replace the whole expression: ```wolfram Replace[{a, b}, {a, b} -> x] (* x *) ``` Replace at specific levels: ```wolfram Replace[{a, b, c}, x_ -> f[x], {1}] (* {f[a], f[b], f[c]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Replace.html) for more details. # ReplaceAll `expr /. rules` or `ReplaceAll[expr, rules]` applies a rule or list of rules in an attempt to transform each subpart of an expression expr. Examples [#examples] Replace all occurrences: ```wolfram {a, b, a, c, a} /. a -> x (* {x, b, x, c, x} *) ``` Replace with patterns: ```wolfram {1, 2, 3, 4} /. x_?EvenQ -> x^2 (* {1, 4, 3, 16} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReplaceAll.html) for more details. # ReplaceAt `ReplaceAt[expr, rules, n]` transforms expr by replacing the nth element using rules. * `ReplaceAt[expr, rules, {i, j, ...}]` replaces the part at position \{i, j, ...}. * `ReplaceAt[expr, rules, {{i1, j1, ...}, {i2, j2, ...}, ...}]` replaces parts at several positions. * `ReplaceAt[rules, pos]` represents an operator form that can be applied to an expression. Examples [#examples] ```wolfram ReplaceAt[{a, b, c}, x_ :> x^2, 2] ``` ```wolfram ReplaceAt[{{1, 2}, {3, 4}}, x_ :> 10 x, {2, 1}] ``` ```wolfram ReplaceAt[x_ :> -x, 1][{a, b, c}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReplaceAt.html) for more details. # ReplaceList `ReplaceList[expr, rules]` attempts to transform the entire expression expr by applying a rule or list of rules in all possible ways, and returns a list of the results obtained. * `ReplaceList[expr, rules, n]` gives a list of at most n results. * `ReplaceList[rules]` is an operator form of `ReplaceList` that can be applied to an expression. Examples [#examples] ```wolfram ReplaceList[{a, b, c}, {x_, y___} -> {x, {y}}] ``` ```wolfram ReplaceList[x + y + z, a_ + b_ :> {a, b}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReplaceList.html) for more details. # Return `Return[expr]` returns the value expr from a function. `Return[]` returns `Null`. Examples [#examples] Return from a function: ```wolfram f[x_] := Module[{}, If[x < 0, Return["negative"]]; x^2 ] f[-3] (* "negative" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Return.html) for more details. # Rule `lhs -> rhs` represents a rule that transforms lhs to rhs. Examples [#examples] Simple replacement rule: ```wolfram x /. x -> 5 (* 5 *) ``` Multiple rules: ```wolfram {a, b, c} /. {a -> 1, b -> 2} (* {1, 2, c} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rule.html) for more details. # RuleCondition `RuleCondition` is an internal symbol used in pattern matching. Examples [#examples] RuleCondition is typically used internally: ```wolfram ?RuleCondition ``` It appears in transformation rules: ```wolfram Trace[Replace[{1, 2, 3}, {x_, y_, z_} :> x + y + z]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RuleCondition.html) for more details. # RuleDelayed `lhs :> rhs` represents a rule that transforms lhs to rhs, evaluating rhs only after the rule is used. Examples [#examples] Use RuleDelayed to delay evaluation: ```wolfram {x, x, x} /. x :> RandomReal[] (* {0.234, 0.891, 0.456} *) ``` Compare with Rule (immediate evaluation): ```wolfram {x, x, x} /. x -> RandomReal[] (* {0.789, 0.789, 0.789} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RuleDelayed.html) for more details. # Run `Run["command"]` runs command as an external OS command, returning the exit code. Examples [#examples] Run a command: ```wolfram Run["ls -la"] (* 0 *) ``` Exit code 0 indicates success: ```wolfram Run["echo 'Hello World'"] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Run.html) for more details. # RunThrough `RunThrough["command", expr]` executes an external command, giving the printed form of expr as input and taking the output, reading it as Wolfram Language input, and returning the result. Examples [#examples] ```wolfram RunThrough["cat", {1, 2, 3}] ``` ```wolfram RunThrough["sort", "c\nb\na"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RunThrough.html) for more details. # SameAs `SameAs[y]` is an operator form that yields `x === y` when applied to an expression x. This is useful for filtering and selecting with functional programming constructs. Examples [#examples] ```wolfram SameAs[5][5] ``` ```wolfram Select[{1, 2, 5, 3, 5}, SameAs[5]] ``` ```wolfram Cases[{a, b, a, c, a}, SameAs[a]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SameAs.html) for more details. # ScheduledTask `ScheduledTask[expr, timespec]` represents a scheduled task to be evaluated on the schedule defined by timespec. Scheduled tasks allow automatic execution of expressions at specified times or intervals. Examples [#examples] ```wolfram task = ScheduledTask[Print["Hello"], 5] ``` ```wolfram (* Run every hour *) ScheduledTask[SendMail["report"], {Hourly}] ``` ```wolfram (* Run at specific time *) ScheduledTask[Beep[], DateObject[{2024, 12, 1, 9, 0, 0}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScheduledTask.html) for more details. # ScheduledTaskActiveQ `ScheduledTaskActiveQ[obj]` yields True if obj represents an active task, and False otherwise. Examples [#examples] Check if a scheduled task is active: ```wolfram task = CreateScheduledTask[Print["Hello"], 5]; ScheduledTaskActiveQ[task] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScheduledTaskActiveQ.html) for more details. # ScheduledTaskInformation `ScheduledTaskInformation[cloudobj]` returns the properties of the ScheduledTask cloudobj. * `ScheduledTaskInformation[cloudobj, property]` returns the value of the specified property. Examples [#examples] ```wolfram ScheduledTaskInformation[task] ``` ```wolfram ScheduledTaskInformation[cloudTask, "NextEvaluationTime"] ``` ```wolfram ScheduledTaskInformation[task, "Status"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScheduledTaskInformation.html) for more details. # ScheduledTaskObject `ScheduledTaskObject[id, expr, spec, ...]` is a task object specifying future evaluation of expr according to spec. Examples [#examples] ```wolfram task = SessionSubmit[ScheduledTask[Print["Hello"], {5}]] ``` ```wolfram TaskRemove[ScheduledTaskObject[1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScheduledTaskObject.html) for more details. # ScheduledTasks `ScheduledTasks[]` returns a list of `ScheduledTaskObject` expressions that represent current tasks. Examples [#examples] ```wolfram ScheduledTasks[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScheduledTasks.html) for more details. # Sequence `Sequence[expr1, expr2, ...]` represents a sequence of arguments to be spliced automatically into any function. Examples [#examples] Splice arguments into a function: ```wolfram f[Sequence[a, b, c]] (* f[a, b, c] *) ``` Use in list construction: ```wolfram {1, Sequence[2, 3], 4} (* {1, 2, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sequence.html) for more details. # SequenceFold `SequenceFold[f, {x1, ..., xn}, {a1, a2, ...}]` gives the last element of `SequenceFoldList[f, {x1, ..., xn}, {a1, a2, ...}]`. * `SequenceFold[f, {x1, ..., xn}, {a1, a2, ...}, k]` applies f to k arguments at each step, with the first n coming from the xi or previous results, and the last k-n coming from the ai. Examples [#examples] ```wolfram SequenceFold[Plus, {0, 1}, {2, 3, 4, 5}] ``` ```wolfram SequenceFold[Times, {1, 2}, Range[3, 6]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceFold.html) for more details. # SequenceFoldList `SequenceFoldList[f, {x1, ..., xn}, {a1, a2, ...}]` gives \{x1, ..., xn, f\[x1, ..., xn, a1], f\[x2, ..., xn, f\[x1, ..., xn, a1], a2], ...}. * `SequenceFoldList[f, {x1, ..., xn}, {a1, a2, ...}, k]` applies f to k arguments at each step, with the first n coming from the xi or previous results, and the last k-n coming from the ai. Examples [#examples] Basic sequence folding: ```wolfram SequenceFoldList[Plus, {1, 2}, {3, 4, 5}] ``` With custom function: ```wolfram SequenceFoldList[#1 + #2 + #3 &, {0, 1}, {1, 1, 1, 1}] ``` Fibonacci-like sequence: ```wolfram SequenceFoldList[#1 + #2 &, {1, 1}, {0, 0, 0, 0, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceFoldList.html) for more details. # SequenceHold `SequenceHold` is an attribute that specifies that Sequence objects appearing in the arguments of a function should not automatically be flattened out. Examples [#examples] Without SequenceHold, Sequence is flattened: ```wolfram f[Sequence[a, b, c]] (* f[a, b, c] *) ``` With SequenceHold attribute: ```wolfram SetAttributes[g, SequenceHold]; g[Sequence[a, b, c]] (* g[Sequence[a, b, c]] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceHold.html) for more details. # SequenceType `SequenceType[var]` represents a type parameterized by var that refers to a sequence of zero or more types. Examples [#examples] Define a sequence type: ```wolfram SequenceType[t] ``` Use in type specifications: ```wolfram TypeSpecifier[List[SequenceType[Integer]]] ``` Pattern matching with types: ```wolfram {1, 2, 3} // TypeCheck[List[SequenceType[Integer]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceType.html) for more details. # SessionSubmit `SessionSubmit[expr]` submits an asynchronous task to evaluate expr in the current session. * `SessionSubmit[ScheduledTask[expr, spec]]` submits a task to evaluate expr in the current session on the schedule defined by spec. Examples [#examples] ```wolfram SessionSubmit[Print["Hello from background task"]] ``` ```wolfram SessionSubmit[ScheduledTask[Print[Now], {3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SessionSubmit.html) for more details. # Set `lhs = rhs` evaluates rhs and assigns the result to be the value of lhs. Examples [#examples] Assign a value: ```wolfram x = 5 x (* 5 *) ``` Multiple assignments: ```wolfram {a, b} = {1, 2} a (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Set.html) for more details. # SetAttributes `SetAttributes[symbol, attr]` adds attr to the list of attributes of the symbol. Examples [#examples] Make a function listable: ```wolfram f[x_] := x^2; SetAttributes[f, Listable] f[{1, 2, 3}] (* {1, 4, 9} *) ``` Set multiple attributes: ```wolfram SetAttributes[g, {Flat, Orderless}] ``` Make a function hold its arguments: ```wolfram SetAttributes[h, HoldAll] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SetAttributes.html) for more details. # SetCookies `SetCookies[assoc]` sets cookies with attributes specified by the association assoc, to be used by functions such as `URLExecute`. * `SetCookies[{assoc1, assoc2, ...}]` sets a list of cookies. Examples [#examples] ```wolfram SetCookies[<|"Name" -> "session", "Value" -> "abc123"|>] ``` ```wolfram SetCookies[{<|"Name" -> "user", "Value" -> "john"|>, <|"Name" -> "token", "Value" -> "xyz"|>}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SetCookies.html) for more details. # SetDelayed `lhs := rhs` assigns rhs to be the delayed value of lhs. The rhs is maintained unevaluated and evaluated afresh each time lhs appears. Examples [#examples] Define a delayed rule: ```wolfram f[x_] := x^2 f[3] (* 9 *) ``` Compare with immediate assignment: ```wolfram rand := RandomReal[] rand (* different each time *) rand (* different each time *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SetDelayed.html) for more details. # Shallow `Shallow[expr]` prints as a shallow form of expr. `Shallow[expr, depth]` prints with all parts of expr below the specified depth given in skeleton form. `Shallow[expr, {depth, length}]` also gives parts whose lengths are above the specified limit in skeleton form. Examples [#examples] Show shallow form: ```wolfram Shallow[{{{{a, b}}, c}, d}] (* {{<<1>>}, d} *) ``` Limit depth: ```wolfram Shallow[Table[i, {i, 100}], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Shallow.html) for more details. # Share `Share[expr]` changes the way expr is stored internally, to try and minimize the amount of memory used. * `Share[]` tries to minimize the memory used to store all expressions. Examples [#examples] ```wolfram data = Table[{1, 2, 3}, 1000]; Share[data] ``` ```wolfram Share[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Share.html) for more details. # Short `Short[expr]` prints as a short form of expr, less than about one line long. `Short[expr, n]` prints as a form of expr about n lines long. Examples [#examples] Shorten a long expression: ```wolfram Short[Range[100]] (* {1, 2, <<96>>, 99, 100} *) ``` Specify length: ```wolfram Short[Table[x^i, {i, 50}], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Short.html) for more details. # Skeleton `Skeleton[n]` represents a sequence of n omitted elements in an expression printed with Short or Shallow. Examples [#examples] Skeleton appears in shortened output: ```wolfram Short[Range[100]] (* {1, 2, <<96>>, 99, 100} *) ``` The \<\<96>> is a Skeleton: ```wolfram InputForm[Short[Range[10]]] (* {1, 2, Skeleton[6], 9, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Skeleton.html) for more details. # Skip `Skip[stream,type]` skips one object of the specified type in an input stream. `Skip[stream,type,n]` skips n objects of the specified type. Examples [#examples] ```wolfram str = OpenRead["file.txt"]; Skip[str, String] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Skip.html) for more details. # Slot `#` (or `#1`) represents the first argument in a pure function. `#n` represents the nth argument. `#name` accesses keys in associations. Examples [#examples] Use slots in pure functions: ```wolfram (* First argument *) (#^2 &)[5] (* 25 *) (* Multiple arguments *) (#1 + #2 &)[3, 4] (* 7 *) (* Named slots with associations *) (#name &)[<|"name" -> "Alice", "age" -> 30|>] (* "Alice" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Slot.html) for more details. # Span `i;;j` represents a span of elements from `i` to `j`. Used for extracting ranges from lists. `;;` alone means all elements. Examples [#examples] Extract ranges with span notation: ```wolfram list = {a, b, c, d, e} list[[2;;4]] (* {b, c, d} *) list[[3;;]] (* {c, d, e} *) list[[;;3]] (* {a, b, c} *) (* Every other element *) list[[1;;-1;;2]] (* {a, c, e} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Span.html) for more details. # Splice `Splice[{e1, e2, ...}]` represents an expression that will automatically be spliced into any list in which it appears as the sequence of elements ei. `Splice[{e1, e2, ...}, hpatt]` represents an expression that will automatically be spliced into any expression whose head matches the pattern hpatt. Examples [#examples] Splice elements into a list: ```wolfram {1, Splice[{2, 3}], 4} (* {1, 2, 3, 4} *) ``` Splice in function arguments: ```wolfram f[a, Splice[{b, c}], d] (* f[a, b, c, d] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Splice.html) for more details. # Stack `Stack[]` shows the current evaluation stack, giving a list of the tags associated with evaluations that are currently being done. `Stack[pattern]` gives a list of expressions currently being evaluated which match the pattern. Examples [#examples] View the stack during evaluation: ```wolfram f[x_] := g[x]; g[x_] := Stack[]; f[1] (* {f, g} *) ``` Stack with pattern matching: ```wolfram Stack[_Plus] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Stack.html) for more details. # StackBegin `StackBegin[expr]` evaluates expr, starting a fresh evaluation stack. Examples [#examples] ```wolfram StackBegin[1 + 2] ``` ```wolfram StackBegin[Stack[_]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StackBegin.html) for more details. # StackComplete `StackComplete[expr]` evaluates *expr* with intermediate expressions in evaluation chains included on the stack. Examples [#examples] ```wolfram StackComplete[Stack[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StackComplete.html) for more details. # StackInhibit `StackInhibit[expr]` evaluates expr without modifying the evaluation stack. Examples [#examples] ```wolfram StackInhibit[Stack[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StackInhibit.html) for more details. # Stub `Stub` is an attribute which specifies that if a symbol is ever used, `Needs` should automatically be called on the context of the symbol. This enables autoloading of packages when their symbols are first accessed. Examples [#examples] ```wolfram Attributes[MyPackage`myFunction] = {Stub} ``` ```wolfram (* Check if a symbol has Stub attribute *) MemberQ[Attributes[symbol], Stub] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Stub.html) for more details. # Switch `Switch[expr, form1, value1, form2, value2, ...]` evaluates expr, then returns the value corresponding to the first matching form. Examples [#examples] Switch on value: ```wolfram Switch["b", "a", 1, "b", 2, "c", 3 ] (* 2 *) ``` With default: ```wolfram Switch[5, 1, "one", 2, "two", _, "other" ] (* "other" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Switch.html) for more details. # Symbol `Symbol["name"]` refers to a symbol with the specified name, creating it if necessary. Examples [#examples] Create a symbol from a string: ```wolfram Symbol["x"] (* x *) ``` Dynamic symbol creation: ```wolfram Symbol["var" <> ToString[1]] (* var1 *) ``` Assign to dynamically created symbol: ```wolfram Symbol["myVar"] = 42; myVar (* 42 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Symbol.html) for more details. # SyntaxInformation `SyntaxInformation[f]` gives information used to generate syntax coloring and other advisories when f\[...] is entered as input. Examples [#examples] ```wolfram SyntaxInformation[Plot] ``` ```wolfram SyntaxInformation[f] = {"ArgumentsPattern" -> {_, _.}}; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SyntaxInformation.html) for more details. # SyntaxLength `SyntaxLength["string"]` finds the number of characters starting at the beginning of a string that correspond to syntactically correct input for a single Wolfram Language expression. Examples [#examples] Find the syntax length of a string: ```wolfram SyntaxLength["1+2 3+4"] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SyntaxLength.html) for more details. # SyntaxQ `SyntaxQ["string"]` returns True if the string corresponds to syntactically correct input for a single Wolfram Language expression, and returns False otherwise. `SyntaxQ["string", form]` uses interpretation rules corresponding to the specified form. Examples [#examples] Check valid syntax: ```wolfram SyntaxQ["1 + 2"] (* True *) ``` Invalid syntax: ```wolfram SyntaxQ["1 + "] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SyntaxQ.html) for more details. # SystemOpen `SystemOpen["target"]` opens the file, URL, or target with the associated system application. Examples [#examples] Open a file: ```wolfram SystemOpen["document.pdf"] ``` Open a URL in browser: ```wolfram SystemOpen["https://www.wolfram.com"] ``` Open a folder: ```wolfram SystemOpen[Directory[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SystemOpen.html) for more details. # TagSet `f /: lhs = rhs` assigns rhs to be the value of lhs, and associates the assignment with the symbol f. TagSet is used to create upvalues, associating definitions with auxiliary symbols. Examples [#examples] ```wolfram f /: g[f[x_]] := x^2 g[f[3]] ``` ```wolfram myType /: Plus[myType[a_], myType[b_]] := myType[a + b] ``` ```wolfram vec /: Dot[vec[a_], vec[b_]] := a.b ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TagSet.html) for more details. # TagSetDelayed `f/:lhs:=rhs` assigns rhs to be the delayed value of lhs, and associates the assignment with the symbol f. Examples [#examples] Define an upvalue for a symbol: ```wolfram f /: g[f[x_]] := x^2 g[f[3]] (* 9 *) ``` Associate a rule with a specific symbol: ```wolfram foo /: bar[foo] := "result" bar[foo] (* "result" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TagSetDelayed.html) for more details. # TagUnset `f /: lhs =.` removes any rules defined for lhs, associated with the symbol f. Examples [#examples] ```wolfram f /: g[f[x_]] := x^2; f /: g[f[x_]] =. ``` ```wolfram x /: h[x] = 5; x /: h[x] =. ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TagUnset.html) for more details. # TaskAbort `TaskAbort[task]` generates an interrupt to abort the current execution of a task. This stops a running task and cancels any pending executions. Examples [#examples] ```wolfram task = SessionSubmit[ScheduledTask[Print["tick"], 1]]; TaskAbort[task] ``` ```wolfram (* Abort a long-running task *) TaskAbort[$CurrentTask] ``` ```wolfram (* Check task status after abort *) task = SessionSubmit[Pause[100]]; TaskAbort[task]; TaskStatus[task] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskAbort.html) for more details. # TaskExecute `TaskExecute[task]` immediately executes an instance of the specified task, independently of any schedule given. Examples [#examples] ```wolfram task = SessionSubmit[Print["Hello"]]; TaskExecute[task] ``` ```wolfram TaskExecute[ScheduledTask[Print["Now"], 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskExecute.html) for more details. # TaskObject `TaskObject[spec]` is an object that represents a background task. Examples [#examples] Create a scheduled task: ```wolfram task = SessionSubmit[ScheduledTask[Print["Hello"], 1]] ``` Check task status: ```wolfram TaskObject[task]["TaskStatus"] ``` Stop a task: ```wolfram TaskRemove[task] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskObject.html) for more details. # TaskRemove `TaskRemove[task]` terminates and removes the specified task. Examples [#examples] Remove a scheduled task: ```wolfram task = SessionSubmit[ScheduledTask[Print["tick"], 1]]; TaskRemove[task] ``` Remove all tasks: ```wolfram TaskRemove /@ Tasks[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskRemove.html) for more details. # TaskResume `TaskResume[task]` resumes execution of the specified task. This function continues a task that was previously suspended with `TaskSuspend`. Examples [#examples] ```wolfram task = SessionSubmit[ScheduledTask[Print["tick"], 1]]; TaskSuspend[task]; TaskResume[task] ``` ```wolfram (* Resume a suspended scheduled task *) TaskResume[$ScheduledTask] ``` ```wolfram TaskResume[TaskObject[...]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskResume.html) for more details. # TaskSuspend `TaskSuspend[task]` suspends the execution of the specified task. Examples [#examples] ```wolfram task = SessionSubmit[ScheduledTask[Print["hello"], 1]]; TaskSuspend[task] (* suspends the scheduled task *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskSuspend.html) for more details. # TaskWait `TaskWait[task]` waits for the specified task to be completely finished. Examples [#examples] ```wolfram task = SessionSubmit[Pause[2]; "Done"]; TaskWait[task] task["Result"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TaskWait.html) for more details. # Tasks `Tasks[type]` gives a list of `TaskObject` expressions representing currently submitted tasks of given type. Examples [#examples] ```wolfram Tasks["Scheduled"] ``` ```wolfram Tasks["Asynchronous"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tasks.html) for more details. # TemplateApply `TemplateApply[template]` applies a template, evaluating all template elements it contains. `TemplateApply[template, args]` applies a template, using args to fill slots in the template. Examples [#examples] Apply a string template: ```wolfram TemplateApply[StringTemplate["Hello, `1`!"], {"World"}] (* "Hello, World!" *) ``` With named arguments: ```wolfram TemplateApply[StringTemplate["The `item` costs `price`."], <|"item" -> "book", "price" -> "$10"|>] (* "The book costs $10." *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateApply.html) for more details. # TemplateExpression `TemplateExpression[expr]` represents an expression held until a template is applied, and then evaluated. Examples [#examples] ```wolfram TemplateApply[ StringTemplate["Result: `x`"], <|"x" -> TemplateExpression[1 + 1]|> ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateExpression.html) for more details. # TemplateIf `TemplateIf[condition, tclause]` represents an element of a template object that inserts tclause if the condition evaluates to True. `TemplateIf[condition, tclause, fclause]` inserts fclause if the condition does not evaluate to True. Examples [#examples] ```wolfram TemplateApply[ StringTemplate["Hello, `name`! `TemplateIf[premium, \"Premium user.\"]"], <|"name" -> "Alice", "premium" -> True|> ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateIf.html) for more details. # TemplateObject `TemplateObject[expr]` represents a template object to be applied using functions like `TemplateApply`. * `TemplateObject[form, args]` yields a TemplateObject with arguments, suitable for cloud deployment or other evaluation. Examples [#examples] Create and apply a simple template: ```wolfram template = TemplateObject["Hello, `name`!"]; TemplateApply[template, <|"name" -> "World"|>] ``` Use a template with slot expressions: ```wolfram TemplateApply[TemplateObject["`1` + `2` = `3`"], {2, 3, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateObject.html) for more details. # TemplateSequence `TemplateSequence[body, list]` represents an element of a template object that yields a sequence consisting of body applied to each element in list. Examples [#examples] ```wolfram TemplateApply[TemplateSequence[TemplateSlot[1], {a, b, c}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateSequence.html) for more details. # TemplateSlot `TemplateSlot[n]` represents a template slot to be filled from the nth argument when the template is applied. `TemplateSlot[name]` represents a template slot to be filled from an element with key name in an association appearing in the first argument. Examples [#examples] Create a template with numbered slots: ```wolfram TemplateApply[StringTemplate["Hello, `1`!"], {"World"}] (* "Hello, World!" *) ``` Use named slots: ```wolfram TemplateApply[StringTemplate["Hello, `name`!"], <|"name" -> "Alice"|>] (* "Hello, Alice!" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateSlot.html) for more details. # TemplateWith `TemplateWith["name" -> value, expr]` represents an element of a template object that evaluates expr after replacing `TemplateSlot["name"]` with value. * `TemplateWith[{name1 -> value1, name2 -> value2, ...}, expr]` evaluates expr with a list of key-value pairs. Examples [#examples] ```wolfram TemplateApply[TemplateWith["x" -> 5, TemplateSlot["x"]^2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TemplateWith.html) for more details. # Temporary `Temporary` is an attribute assigned to symbols which are created as local variables by Module. Examples [#examples] Create local variables in Module: ```wolfram Module[{x, y}, Attributes[x] ] (* {Temporary} *) ``` Check attributes of a local variable: ```wolfram Module[{var}, Print[Attributes[var]]; var = 10 ] ``` Set Temporary attribute manually: ```wolfram SetAttributes[myVar, Temporary] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Temporary.html) for more details. # TerminatedEvaluation `TerminatedEvaluation["reason"]` represents an expression whose evaluation overran global kernel session limits and was terminated. Examples [#examples] A terminated evaluation result: ```wolfram (* This would appear if a computation exceeded time/memory limits *) TerminatedEvaluation["TimeExceeded"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TerminatedEvaluation.html) for more details. # Thumbnail `Thumbnail[image]` gives a thumbnail version of an image. * `Thumbnail[file]` gives a thumbnail of an image stored in a file. * `Thumbnail[url]` gives a thumbnail of an image stored at a URL. * `Thumbnail[spec, size]` gives a thumbnail with the specified maximum pixel size. Examples [#examples] Create thumbnail: ```wolfram img = ExampleData[{"TestImage", "Lena"}]; Thumbnail[img] ``` Specify size: ```wolfram Thumbnail[img, 50] ``` From URL: ```wolfram Thumbnail["https://example.com/image.png", 100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Thumbnail.html) for more details. # ToExpression `ToExpression[input]` gives the expression obtained by interpreting strings as Wolfram Language input. Examples [#examples] Convert string to expression: ```wolfram ToExpression["1 + 2 + 3"] (* 6 *) ``` Parse symbolic expression: ```wolfram ToExpression["x^2 + y"] (* x^2 + y *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToExpression.html) for more details. # ToRawPointer `ToRawPointer[]` creates a new pointer object in compiled code, suitable for use with external libraries. * `ToRawPointer[val]` creates a new object pointing to the initial value val. * `ToRawPointer[p, val]` stores val in the pointer p. * `ToRawPointer[array, offset, val]` stores val in the "CArray" array at the given offset. Examples [#examples] ```wolfram ToRawPointer[] ``` ```wolfram ToRawPointer[42] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToRawPointer.html) for more details. # TypeEvaluate `TypeEvaluate[expr]` represents a type created by evaluating expr. Examples [#examples] Create a type by evaluating an expression: ```wolfram TypeEvaluate["Integer"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TypeEvaluate.html) for more details. # TypeHint `TypeHint[expr, type]` represents an expression of a specified type when compiled and gives expr when evaluated. Examples [#examples] Hint that an expression is a real number: ```wolfram TypeHint[x + y, "Real64"] ``` Use in compiled code: ```wolfram FunctionCompile[Function[{x}, TypeHint[x^2, "Integer64"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TypeHint.html) for more details. # TypeOf `TypeOf[expr]` gives the type of expr without evaluating it. * `TypeOf[expr, Typed[x, ty]]` assumes that instances of x in expr have type ty. * `TypeOf[expr, {Typed[x1, ty1], Typed[x2, ty2], ...}]` assumes that xi has type tyi. * `TypeOf[expr, decls]` uses declarations decls. Examples [#examples] ```wolfram TypeOf[1 + 2] ``` ```wolfram TypeOf[x + 1, Typed[x, "Integer64"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TypeOf.html) for more details. # TypeSpecifier `TypeSpecifier[cons]` represents a type. * `TypeSpecifier[cons][type1, …]` or `cons::[type1, …]` represents a compound type. Examples [#examples] ```wolfram TypeSpecifier["Integer32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TypeSpecifier.html) for more details. # Typed `Typed[expr, type]` represents an expression that should be assumed to be of a specified type for compilation and other purposes. Examples [#examples] ```wolfram Typed[x, "Real64"] ``` ```wolfram FunctionCompile[Function[{Typed[x, "Integer64"]}, x + 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Typed.html) for more details. # Uncompress `Uncompress["string"]` recovers an expression from a compressed string representation generated by `Compress`. * `Uncompress["string", h]` wraps the head h around the expression produced before evaluating it. Examples [#examples] ```wolfram compressed = Compress[{1, 2, 3}]; Uncompress[compressed] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Uncompress.html) for more details. # Unevaluated `Unevaluated[expr]` represents the unevaluated form of expr when passed as an argument to a function. Examples [#examples] Pass unevaluated expression: ```wolfram Length[Unevaluated[1 + 2 + 3]] (* 3 - counts Plus arguments *) ``` Get head of unevaluated: ```wolfram Head[Unevaluated[{1, 2, 3}]] (* List *) Head[{1, 2, 3}] (* List - same result here *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unevaluated.html) for more details. # UnmanageObject `UnmanageObject[man]` takes ownership of memory wrapped in a managed object. Examples [#examples] ```wolfram obj = CreateManagedLibraryExpression["myExpr", head]; UnmanageObject[obj] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnmanageObject.html) for more details. # Unprotect `Unprotect[s1, s2, ...]` removes the attribute `Protected` from symbols, allowing modification of their definitions. Examples [#examples] Unprotect to modify a built-in: ```wolfram Unprotect[Plus] (* Now Plus can be modified *) Protect[Plus] (* Restore protection *) ``` Unprotect custom symbol: ```wolfram Unprotect[myFunc] myFunc[x_] := x^3 ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unprotect.html) for more details. # UnregisterExternalEvaluator `UnregisterExternalEvaluator[sys, evaluator]` unregisters the external evaluator referenced by evaluator for system sys so that it is not used by `ExternalEvaluate` and related functions. Examples [#examples] ```wolfram UnregisterExternalEvaluator["Python", "MyPythonEvaluator"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnregisterExternalEvaluator.html) for more details. # Unset `lhs =.` removes any rules defined for lhs. Examples [#examples] Remove a definition: ```wolfram x = 5; x (* 5 *) x =.; x (* x *) ``` Remove function definition: ```wolfram f[x_] := x^2; f[3] (* 9 *) f[x_] =.; f[3] (* f[3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unset.html) for more details. # UnsetShared `UnsetShared[s1, s2, ...]` stops the sharing of the variables or functions si among parallel kernels. * `UnsetShared[patt]` stops the sharing of all variables and functions whose names match the string pattern patt. Examples [#examples] ```wolfram UnsetShared[x] ``` ```wolfram UnsetShared["Global`*"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnsetShared.html) for more details. # Until `Until[test, body]` evaluates body and then test, repetitively, until test first gives `True`. Examples [#examples] Repeat until condition is met: ```wolfram n = 0; Until[n > 5, n++]; n (* 6 *) ``` The body is always executed at least once. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Until.html) for more details. # UpSet `lhs ^= rhs` assigns rhs to be the value of lhs, and associates the assignment with symbols that occur at level one in lhs. Examples [#examples] Associate with a symbol in an expression: ```wolfram Format[myObj[x_]] ^= Row[{"Object: ", x}]; myObj[5] (* Object: 5 *) ``` Define behavior for a head: ```wolfram f[g[x_]] ^= x^2; f[g[3]] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpSet.html) for more details. # UpSetDelayed `lhs ^:= rhs` assigns rhs to be the delayed value of lhs, and associates the assignment with symbols that occur at level one in lhs. Examples [#examples] Delayed upvalue assignment: ```wolfram Format[myType[x_]] ^:= Style[x, Red, Bold]; myType["hello"] ``` Define behavior for nested pattern: ```wolfram f[g[x_]] ^:= x + 1; f[g[5]] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpSetDelayed.html) for more details. # Update `Update[symbol]` tells the Wolfram Language that hidden changes have been made that could affect values associated with a symbol. * `Update[]` specifies that the value of any symbol could be affected. Examples [#examples] ```wolfram Update[x] ``` ```wolfram Update[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Update.html) for more details. # WaitAll `WaitAll[expr]` waits for all concurrent evaluations represented by EvaluationObject expressions in expr to finish, then returns the resulting expression obtained. Examples [#examples] Wait for parallel tasks: ```wolfram tasks = Table[ParallelSubmit[Prime[n^2]], {n, 5}]; WaitAll[tasks] ``` With SessionSubmit: ```wolfram jobs = Table[SessionSubmit[Pause[1]; i], {i, 3}]; WaitAll[jobs] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaitAll.html) for more details. # WaitAsynchronousTask `WaitAsynchronousTask[task]` waits for task to complete. Examples [#examples] ```wolfram task = StartAsynchronousTask[...]; WaitAsynchronousTask[task] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaitAsynchronousTask.html) for more details. # WaitNext `WaitNext[{eid1,eid2,…}]` waits until the first evaluation represented by any of the eidi finishes, then returns its result, the corresponding eidi, and the list of remaining eidk. `WaitNext[{eid1,eid2,…},h]` wraps the head h around the result before returning it. Examples [#examples] Wait for the first parallel evaluation to complete: ```wolfram eids = ParallelSubmit /@ {Pause[1]; 1, Pause[2]; 2}; {result, eid, rest} = WaitNext[eids] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaitNext.html) for more details. # WhenEvent `WhenEvent[event, action]` specifies an action that occurs when the event triggers it for equations in `NDSolve` and related functions. Examples [#examples] ```wolfram NDSolve[{y'[t] == y[t], y[0] == 1, WhenEvent[y[t] > 2, "StopIntegration"]}, y, {t, 0, 5}] ``` ```wolfram sol = NDSolve[{x''[t] == -x[t], x[0] == 1, x'[0] == 0, WhenEvent[x[t] == 0, x'[t] -> -0.9 x'[t]]}, x, {t, 0, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WhenEvent.html) for more details. # Which `Which[test1, value1, test2, value2, ...]` evaluates each test in turn, returning the value corresponding to the first one that yields `True`. Examples [#examples] Multiple conditions: ```wolfram x = 5; Which[ x < 0, "negative", x == 0, "zero", x > 0, "positive" ] (* "positive" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Which.html) for more details. # While `While[test, body]` evaluates test, then body, repetitively, until test first fails to give True. Example [#example] Count until a condition is met: ```wolfram n = 1; While[n < 100, n = 2*n]; n (* 128 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/While.html) for more details. # With `With[{x = x0, y = y0, ...}, expr]` specifies that all occurrences of the symbols x, y, ... in expr should be replaced by x0, y0, .... Example [#example] Define local constants: ```wolfram With[{a = 2, b = 3}, a + b] (* 5 *) ``` Useful for injecting values into held expressions: ```wolfram With[{x = 5}, Hold[x^2]] (* Hold[25] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/With.html) for more details. # WithCleanup `WithCleanup[expr,cleanup]` evaluates expr, running cleanup before returning the result, even if an abort, throw, etc. was generated during the evaluation of expr. `WithCleanup[init,expr,cleanup]` evaluates init before evaluating expr, blocking aborts, throws, etc. in both init and cleanup. Examples [#examples] Ensure cleanup runs even after an abort: ```wolfram WithCleanup[Print["Working..."], Print["Cleanup!"]] (* Working... *) (* Cleanup! *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WithCleanup.html) for more details. # Xnor `Xnor[e1, e2, ...]` is the logical XNOR (not XOR) function. It gives `True` if an even number of the ei are `True`, and the rest are `False`. Examples [#examples] Basic XNOR: ```wolfram Xnor[True, True] (* True *) Xnor[True, False] (* False *) Xnor[False, False] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Xnor.html) for more details. # Deploy to GitHub Pages You can host your interactive notebook on GitHub Pages, allowing everyone to view it, interact with sliders, and import the original notebook with a single click. Exporting [#exporting] We assume you have exported your notebook to a [standalone HTML file](./Standalone-HTML): import { Ellipsis, Dot, Share2 } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> HTML File </div> </div> </div> Exported notebooks do not require any build process — only hosting Publishing [#publishing] This process involves creating a repository, uploading your `.html` documents, and setting up GitHub Pages. Follow these steps: 1. Create a **public** repository. If you have `git` installed, run `git init` and add your HTML documents. You can organize them into folders and create navigation links using Markdown or HTML cells. Using GitHub Pages [#using-github-pages] 2. Open the repository `Settings`, navigate to `Code and automation`, and locate `Pages`. Using GitHub Actions [#using-github-actions] Alternatively, you can use GitHub Actions and explicitly select `Pages` and `Static HTML`. Here is a sample configuration file that serves static pages from the `build` folder and the `main` branch of the repository: ```yaml # Simple workflow for deploying static content to GitHub Pages name: Deploy static content to Pages on: # Runs on pushes targeting the default branch push: branches: ["main"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: contents: read pages: write id-token: write # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: group: "pages" cancel-in-progress: false jobs: # Single deploy job since we're just deploying deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Setup Pages uses: actions/configure-pages@v3 - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: # Upload entire repository path: 'build' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v2 ``` Alternative Hosting Options [#alternative-hosting-options] There are plenty of alternatives. Search for `static HTML hosting`. * [Wasmer](https://wasmer.io/) * [Cloudflare](https://pages.cloudflare.com/) * Some quick file-sharing services render HTML files by default # Embed Notebook Files This feature allows you to embed files or folders into the notebook and create a self-extracting notebook. Call <small>Embed files</small> from the top-level menu: import { Ellipsis, Dot, Share2 } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Ellipsis width={"1rem"} /> Menu </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Misc </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Embed files </div> </div> </div> This does not export anything to a new file — it modifies your current notebook by embedding the binary compressed data. Don't forget to save the notebook afterward. Upon the next fresh launch, the data is automatically unpacked and the archive is removed from the notebook. # HTML Embeddable This export option converts notebook cells into HTML web components and associated assets, making it easy to embed them in a webpage, such as your blog post or note. import { Share2, CircleQuestionMark, Dot } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>HTML Embeddable</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> HTML Embeddable </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Static / Interactive </div> </div> </div> Use cases [#use-cases] * Embed notebook cells in a blog post or webpage * Share your work on the internet with interactive components import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="Example of a basic HTML page"> <iframe className="rounded" src="https://wljsteam.github.io/web-components/" width="100%" height="500px" /> </Accordion> </Accordions> Embeddable WLJS cells provide the same features as the [standard HTML export option](./Standalone-HTML), including: Features [#features] * **Lazy Loading** - Components and dependencies load progressively, showing meaningful raw content while loading * **Graceful Degradation** - Users with JavaScript disabled still see readable code and expressions * **Interactive Content** - 2D/3D graphics, plots, manipulatable widgets, and more * **CDN-Ready** - Single script import; all dependencies load automatically * **No Build Step** - Ready to use immediately after export * **Framework Agnostic** - Life cycle managed automatically using native web components compatible with any modern web framework Export Options [#export-options] For detailed export options and modes (Static, Interactive, etc.), see the [HTML file export documentation](./Standalone-HTML). How to Use [#how-to-use] After exporting, you'll receive a folder containing HTML components and assets. Simply include the provided script in your webpage and use the custom web components. For detailed integration instructions and examples, see: <GithubInfo owner="wljsteam" repo="web-components" /> # Markdown JSX This export option converts notebook cells into HTML [web components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components) and associated assets compatible with MDX (Markdown React), making it easy to embed them in a webpage, such as your blog post or note. import { Share2, CircleQuestionMark, Dot } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>MDX</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> MDX </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Static / Interactive </div> </div> </div> Use cases [#use-cases] * Embed notebook cells in an MDX blog post or React webpage * Share your work on the internet with interactive components > The page you're looking at was designed using MDX. The entire WLJS Notebook documentation was created using the WLJS MDX exporter and Next.js React WLJS cells provide the same features as the [standard HTML export option](./Standalone-HTML), including: Features [#features] * **Lazy Loading** - Components and dependencies load progressively, showing meaningful raw content while loading * **Interactive Content** - 2D/3D graphics, plots, manipulatable widgets, and more * **CDN-Ready** - Single script import; all dependencies load automatically * **No NPM Dependencies** - Uses pure web components; no need to install any packages import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="Example of MDX blog posts (Next.js)"> <iframe className="rounded" src="https://wljsteam.github.io/web-components-mdx/" width="100%" height="500px" /> </Accordion> </Accordions> Export Options [#export-options] For detailed export options and modes (Static, Interactive, etc.), see the [HTML file export documentation](./Standalone-HTML). How to Use [#how-to-use] After exporting, you'll receive a folder containing MDX components and assets. Simply drop them into your Next.js or similar MDX-compatible project. For detailed integration instructions and examples, see: <GithubInfo owner="wljsteam" repo="web-components-mdx" /> # Markdown This export option converts notebook cells into a single markdown file. import { Share2, CircleQuestionMark, Dot, Settings } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inlineFlex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>Markdown</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Markdown </div> </div> </div> Use cases [#use-cases] * Short notes, text for LLM * Documentation The Markdown format exports all code, images, and comments, but **excludes all output cells**. Importing [#importing] Markdown file can be imported back as a normal WLJS notebooks. Simply open it using WLJS application. Bundler features [#bundler-features] External images [#external-images] Compress all external images and embed them inline to Markdown file used on slides, WLX, HTML or Markdown cells: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Export settings </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Include </div> </div> </div> # Mathematica import { Share2, CircleQuestionMark, Dot } from 'lucide-react'; Any WLJS notebook can be exported to Mathematica's native format `.nb`. Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>Mathematica</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Mathematica </div> </div> </div> Use cases [#use-cases] * Share WLJS notebooks with Mathematica users Consider the following limitations when sharing in Mathematica format: 1. **Only input cells** will be transferred. 2. Input cells will be converted to `InputForm`. 3. Markdown formatting is not fully supported in Wolfram Language text cells (only sections, titles, etc. are preserved). 4. LaTeX, Mermaid, HTML, and many other non-standard output cells will not be displayed. Importing [#importing] Simply open a `.nb` file with the WLJS application; it will be automatically converted to `.wln`. This feature is still experimental Known limitations [#known-limitations] * large notebooks **will be automatically split** to avoid performance degradation (you might see a message *content from the previous cell*); * `DynamicModule`, `Dynamic` will not render correctly; * avoid complex text formatting; * certain `Graphics` and `Graphics3D` styling options may not work; * embedded image / video / audio data inside cells will no be available # Mini apps This export option converts a notebook into a window application that uses WLJS as a runtime and works in an isolated context. import { Share2, CircleQuestionMark, Dot } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>Mini app</small>: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Mini app </div> </div> </div> Use cases [#use-cases] * Calculators and utilities * Useful tools for processing data with a GUI * Share your notebook in the form of a small app All initialization cells of the notebook are evaluated on startup, and the last input cell becomes the main window of the app. Use [WLX cells](./../Cell-types/WLX) for maximum customization You can create new windows with `CellPrint` How to Prepare a Mini App [#how-to-prepare-a-mini-app] In general, you can think of a mini app as if it were an output of a single cell [projected](./../Overview) (see <small>Project</small> feature) to a window. The following rules apply: * The default context (`$Context`) of all symbols is randomly generated and will be unique for each running instance of your app * **All initialization cells will be executed automatically** on the startup of an app * **The output of the last input cell** will be the first window of your app * An app will pick the first available computation kernel in your system Apart from that, the program for the widget is just a plain WLJS notebook. You can leave cells there for testing and debugging with no impact. Example 1 [#example-1] Let's write the simplest possible interactive widget: ``` (* make it initialization cell *) equation[x_,n_] := Sum[(Sin[2\[Pi](2j - 1) x])/(2j - 1), {j, 1, n}] ``` ``` (* make it the last input cell in the notebook *) ManipulatePlot[equation[x,n]//Re, {x, -1,1}, {n, 1,10,1}] ``` Then export it as <small>Mini app</small> and double-click the created file. You can open it anytime on any machine with WLJS Notebook installed. Example 2 [#example-2] ``` (* make it initialization cell *) newWindow = Module[{ text = "Hello World" }, Column[{ EventHandler[InputText[text], (text = #)&], Graphics[Table[{ RandomColor[], Rotate[ Text[text // Offload, RandomReal[{-1,1}, 2]], RandomReal[{0, 3.14}] ] }, {40}]] }] ]; ``` and the last input cell: ``` notebook = EvaluationNotebook[]; Button["Open window", CellPrint[newWindow, "Notebook"->notebook, "Target"->_]] ``` It will create a window with a single button that, when clicked, creates a new window with its content. # PDF You can export an entire notebook as a PDF document ready for printing. There are two ways depending on how you run WLJS Notebook: import {Tab, Tabs} from 'fumadocs-ui/components/tabs'; import { Share2, CircleQuestionMark, Dot } from 'lucide-react'; <Tabs items={['Desktop app', 'Docker / Server']}> <Tab value="Desktop app"> Navigate to the file menu and click <small>Print</small>, or locate it from the [command palette](./../Guides/Command-palette): <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Menu </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> File </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Print </div> </div> </div> </Tab> <Tab value="Docker / Server"> Export your notebook as an [HTML File](./Standalone-HTML), open it, and use the browser's native printing option. </Tab> </Tabs> Page Breaks [#page-breaks] To manually insert page breaks, use the `PageBreakAbove` or `PageBreakBelow` symbols inside [Markdown](./../Cell-types/Markdown) cells, for example: ``` .md <PageBreakAbove/> ``` Export Slides [#export-slides] This requires the WLJS Notebook desktop app, as we use a customized Chromium engine feature to produce high-quality vector-based PDFs from any Wolfram Language expression. Use the dedicated option for rendering presentations (slides) into a single PDF document: [Slides](./Slides) Export Individual Graphs and Expressions [#export-individual-graphs-and-expressions] This requires the WLJS Notebook desktop app, as we use a customized Chromium engine feature to produce high-quality vector-based PDFs from any Wolfram Language expression. To export individual expressions, use the default `Export` function with a PDF extension in the file name: ``` Plot[x, {x, 0,1}]; Export["filename.pdf", %] ``` Options [#options] For the PDF format, there are a few extra options you can provide: * `"Crop"` - by default is `True`, which trims white regions * `"Window"` - by default is `CurrentWindow[]`, which specifies the window object where to render * `"ExposureTime"` - time delay to wait before capturing (to let the layout settle), the default is 2.5 seconds * `"Landscape"` - printing mode, by default is `True` When `Export` is used with `"PDF"` it internally uses blocking functions. Avoid using it in timers like `SetTimeout`, external event handlers such as `InputButton` or `Button`, or within `AsyncFunction`. Use [ExportAsync](./../File-Operations/ExportAsync) # Slides Any presentation made with [slide cells](./../Cell-types/Slide) can be exported individually, preserving all graphics and styling in automatic mode to a PDF document. Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>Slides</small>: import { Share2, CircleQuestionMark, Dot, Settings } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Slides </div> </div> </div> Use cases [#use-cases] * Presentation format for situations where HTML format is not suitable If you're looking to export interactive slides, please use [HTML export](./Standalone-HTML). This requires the WLJS Notebook desktop app, as we use a customized Chromium engine feature to produce high-quality vector-based PDFs How to Use [#how-to-use] Evaluate your aggregation slides cell [(see Merging All Slides section)](./../Cell-types/Slide): ``` .slides Thank you for the attention ``` Run the **export option**. Presentation slides are recorded and converted to a PDF document live and automatically. Settings [#settings] Export settings are available at: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Export settings </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> General </div> </div> </div> # HTML File > Users don't need any app installed to view a WLJS notebook import { Share2, CircleQuestionMark } from 'lucide-react'; Call <small>Share</small> from the top menu or click the <span className="inline-flex"><Share2 style={{height:"1rem"}} /></span> icon and choose <small>HTML File</small>. No internet connection required Use cases [#use-cases] * Share a notebook with a colleague (no WLJS app required) * Share your work on the internet * Lecture notes & offline presentations * Make a report on data analysis, experiment * Documentation * Cross-platform personal notes Local images are embedded automatically, [NotebookStore](./../Advanced/Notebook-Operations) is preserved, and [embedded files](./Embed-Notebook-Files) are included. You can open the HTML file locally or [publish it as a webpage](./Deploy-to-Github-Pages). import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; <Accordions> <Accordion title="Example of posted notebook"> <iframe className="rounded" src="/Spiral.html" width="100%" height="500px" /> </Accordion> </Accordions> Importing [#importing] The original cell metadata is preserved, **allowing an HTML notebook to be converted back to a normal WLJS notebook** format when opened or using deep-links—click the <span className="inline-flex"><CircleQuestionMark style={{height:"1rem"}} /></span> icon in the exported HTML file: <Accordions> <Accordion title="Example"> <img alt="Example" src={__img0} /> </Accordion> </Accordions> Static Export Option [#static-export-option] The most basic export option is <small>Static</small>: import { Ellipsis, Dot } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> HTML File </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Static </div> </div> </div> What it does: * Keeps all standard plots, images, 3D graphics, and 3rd-party JavaScript assets **intact and interactive** * Keeps all outputs of all cell types, including slides * Keeps all objects in `NotebookStore` (can be used when the document is reimported) * `AnimatePlot` and `AnimateParametericPlot` will still work (since they're based on precomputed states) However: * <span className=" dark:text-red-400"> Dynamic features provided by `ManipulatePlot` , `InputRange` , `Offload` , animations made using `Animate` , `AnimationFrameListener` , or `SetInterval` **will not work** and will display the latest captured state in your HTML document. </span> This option is ideal for creating reports, compact notes for long-term storage, basic presentations, and shipping as a standalone HTML file. Interactive Export Option [#interactive-export-option] This is a dynamic version of the HTML exporter designed to recreate the full (or partial) interactivity of normal notebooks. <Accordions> <Accordion title="How it works"> It records calculated data for all possible combinations of input elements and stores them in a large compressed table. Missing values are interpolated using the IDW method. This means the output should be a pure function (in the general sense) of its state and should be fully determined by the input elements. Nevertheless, any side effects will be captured, but the final result doesn't guarantee that hysteresis-like behavior can be reproduced properly. At the frontend, we create a "fake kernel" that mimics the behavior of a real Wolfram Kernel. The notebook content doesn't know anything about the execution environment. </Accordion> </Accordions> There are two presets to choose from: Automatic [#automatic] Following the steps <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> HTML File </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Interactive </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Automatic </div> </div> </div> you get the following * Everything that <small>Static HTML</small> export option provides * `Manipulate` * `ManipulatePlot` and related symbols `Manipulate*`, which produce interactive widgets * `Animate` However: * <span className=" dark:text-red-400"> Dynamic features provided by `InputRange` , `Offload` , animations made using `AnimationFrameListener` , or `SetInterval` **will not work** and will display the latest captured state in your HTML document. </span> * <span className=" dark:text-red-400"> Missing states are interpolated using a stairstep-like method. </span> This mode is easy and optimal for most use cases that involve interactivity. Optimize the number of possible states by reducing the number of sliders and steps. For example, avoid 3 sliders with 100 steps each, as this results in 10 <sup>6</sup> combinations, which is impossible to sample. Avoid manipulated raster images and JIT failures in `Animate` and `Manipulate` . The result is a fully interactive widget that works offline without an internet connection or the Wolfram Kernel. Manual sampling [#manual-sampling] Following the steps <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Share2 width={"1rem"} /> Share </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> HTML File </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Interactive </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Manual sampling </div> </div> </div> you get the following * Everything that <small>Static HTML</small> export option provides * Dynamic features provided by `Manipulate*`, `Animate`, input elements like `InputRange`, anything with `Offload`, and animations made using `AnimationFrameListener` can be captured. * `FrontSubmit` calls caused by events can be captured. * Events generated by presentation slides can be captured. * The missing states are interpolated using IDW method. However: * <span className=" dark:text-red-400"> Dynamic features provided by `SetInterval` **will not be captured** . </span> * <span className=" dark:text-red-400"> The procedure requires manual sampling by dragging all sliders or activating other event-generating elements. </span> This method is the most comprehensive and the only way to keep your custom-made interactivity, animations like this one: <Accordions> <Accordion title="Example"> ``` length = 1; slider = InputRange[-1,1,0.1, "Label"->"Length"] EventHandler[slider, Function[l, length = l]]; Graphics[Rectangle[{-1,-1}, {length // Offload, 1}]] ``` </Accordion> </Accordions> Your dynamic system must follow a *call-and-response* architecture. This means it must generate events (via user interaction or code) and produce a response (e.g., symbol mutation or `FrontSubmit` call). How to use: import { Step, Steps } from 'fumadocs-ui/components/steps'; <Steps> <Step> Prepare the notebook [#prepare-the-notebook] Connect to the Wolfram Kernel and evaluate your expressions. Minimize the number of input elements and their states. Limit the number and complexity of dynamic symbols. </Step> <Step> Run Export [#run-export] Navigate to the export option and run it. </Step> <Step> Sampling [#sampling] **For sliders/input elements** Move each slider/input element across its full range. This is necessary, as the sampling phase will only use values observed during sniffing. For multiple inputs (2–3 sliders), move each one fully once. Cross-combinations **are not needed**—they will be resampled recursively and automatically. **For animations made with `AnimationFrameListener`** Start the animation (evaluate) and wait for the desired number of frames to be captured. **For presentation events or anything related to `FrontSubmit`** Go through slides or activate buttons/other event emitters. </Step> </Steps> Depending on what was sampled, a special sampling preset will be assigned **automatically** to process the gathered data. Here are a few examples of dynamic content for each: <Accordions> <Accordion title="State machine"> Higher-order function that generates dynamic content: ``` ManipulatePlot[f[w x], {x, -10, 10}, {w, 0, 10}, {f, {Sinc, Sin}}] ``` <LazyAutoplayVideo url={"/export-manipulate.mp4"} /> Here is an example of low-level implementation: ``` radius = 1.0; Graphics[{Hue[radius // Offload], Disk[{0, 0}, radius // Offload]}, ImageSize -> Small] EventHandler[InputRange[0, 1, 0.1], (radius = #)&] ``` Here is an example of sampling complex contntieous events on 2D canvas: ``` udata = {{-1,0}, {1,0}}; Graphics[{ Cyan, Line[udata // Offload], Red, PointSize[0.05], EventHandler[Point[{0,0.5}], { "drag" -> ((udata = generate[#, 0.1])&) }] }, PlotRange->{{-1,1}, {0,1}}, ImagePadding->None, Axes->{True, False}, ImageSize->Small] ClearAll[generate]; generate[{x_, y_}, k_] := Table[{t, y Exp[- (*FB[*)(((*SpB[*)Power[(x - t)(*|*),(*|*)2](*]SpB*))(*,*)/(*,*)(2 k))(*]FB*)]}, {t,-1,1, 0.03}] ``` <LazyAutoplayVideo url={"/export-drag.mp4"} /> Missing values will be interpolated using our own method: Categorical-Aware Inverse Distance Weighted Interpolation (IDW) with support for structured output decomposition and recomposition. This also means: the more features you sample, the more accurate the result will be for continuously changing data. Here is an example with `Animate`: ``` Animate[Row[{Sin[x], "==", Series[Sin[x], {x,0,n}], Invisible[1/2]}], {n, 1, 10, 1}, RefreshRate->3] ``` It might seem misleading, but the built-in `Animate` works similarly to `Manipulate`, but with an automatically moving single slider. Therefore, it's also suitable for the <small>State Machine</small> preset. </Accordion> <Accordion title="Animation machine"> ``` ballsteps = NDSolve[{x''[t] == 0, y''[t] == -9.8, y[0] == 6, y'[0] == 0, x[0] == 0, x'[0] == 1, a[0] == 5, WhenEvent[Mod[x[t], 1] == 0, If[a[t] > 0, a[t] -> a[t] - 1, "RemoveEvent"]], WhenEvent[ y[t] == a[t], {x'[t], y'[t]} -> .9 {x'[t], -y'[t]}]}, {x, y, a}, {t, 0, 15}, DiscreteVariables -> {a}]; trajectory = {x, y} /. ballsteps[[1]]; staircase = Plot[Clip[Floor[6 - x], {0, Infinity}], {x, -1, 15}, Filling -> 0, Exclusions -> None]; Module[{ pos = {0.,0.}, t = 0. }, Show[staircase, Graphics[{ (*VB[*)(RGBColor[1, 0, 0])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeGJAIcndyzs/JLwouTyxJzghJzS3ISSxJTWMGyXMgyRcxgMEHeyiDgQHOAAALpBNd"*)(*]VB*), Disk[pos // Offload, 0.12] }], Epilog->{ EventHandler[ AnimationFrameListener[pos // Offload], Function[Null, pos = #[t] &/@ trajectory; t = If[t >= 15.0, 0., t + 0.1]; ] ] }] ] ``` <LazyAutoplayVideo url={"/export-animation.mp4"} /> </Accordion> <Accordion title="Pavlov machine"> ``` EventHandler[InputButton[], (Sound[SoundNote["C5"]] // EmitSound)&] ``` Here is another example with `Plotly`, that internally uses `FrontSubmit`: ``` p = Plotly[{<| "values" -> {19, 26, 10}, "labels" -> {"Residential", "Non-Residential", "Utility"}, "type" -> "pie" |>}] EventHandler[InputRange[0, 100, 10], PlotlyAnimate[p, <|"data" -> {<|"values" -> {19, 26, #}|>}, "traces" -> {0} |>, <||>]& ] ``` </Accordion> </Accordions> Bundler features [#bundler-features] Modules [#modules] To reduce the output file size, you can exclude certain modules from the final bundle. It can be done from the settings menu: import { Settings } from 'lucide-react'; <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Export settings </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Exclude from bundle </div> </div> </div> For example, if you do not use 3D graphics: exclude `shared-threejs-*`, `graphics3d-*`. External images [#external-images] Compress all external images and embed them inline to HTML file used on slides, WLX, HTML or Markdown cells: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Export settings </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Include </div> </div> </div> Misc [#misc] You can enable automatic dark/light mode from the same page of the settings menu: <div class="fd-steps"> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Settings width={"1rem"} /> Settings </div> </div> <div class="fd-step py-3 items-center flex flex-row"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> Export settings </div> </div> <div class="fd-step"> <div class="flex flex-row items-center text-sm gap-x-2"> <Dot width={"1rem"} /> General </div> </div> </div> # FrontSlidesSelected ```wolfram FrontSlidesSelected[type_String, payload_] ``` an interface symbol to control current slideshow (if available) similar to [FrontEditorSelected](../Interpreter/FrontEditorSelected) in terms of API implementation. You need to call this symbol using [FrontSubmit](../Frontend-IO/FrontSubmit) `type` field reflects [RevealJS API method](https://revealjs.com/api/) and `payload` its first argument. Example [#example] To programmatically change the slide ```wolfram FrontSlidesSelected["navigateNext", 1] // FrontSubmit ``` # SlideEventListener ```wolfram SlideEventListener[opts__] ``` attaches an event listener to a current slide ```md .slide # Slide 1 --- # Slide 2 Here is will fire <SlideEventListener Id={"event"}/> ``` and then a handler on WL side ```wolfram EventHandler["event", Echo] ``` There is no restrictions on the number of attached listeners to a single slide. One can generate them on-fly from components An advanced guide on how to build live presentations with dynamic content </Cards> Options [#options] "Id" [#id] a string representation of an event identifier, that will be used Event generation [#event-generation] It fires an event for a given slide (where it is placed) when it is revealed with a topic `"Slide"` and for each slide-fragment revealed `"fragment-x"` topic / pattern. i.e. Patterns [#patterns] "Slide" [#slide] fires when a slide was revealed (even the first one) "fragment-_" [#fragment-_] where `_` is a number of a fragment revealed on a slide "Mounted" [#mounted] fires, once an HTML content for a slide is ready "Left" [#left] fires, once a user leaves the slide (goes to the next or previous one) with an integer as a payload, that gives the direction "Destroy" [#destroy] fires, once a presentation was closed for some reason Try ```wolfram EventHandler["myEvent", {any_String :> (Print[StringTemplate["::``:: ``"][any, #]]&)}]; ``` ```md .slide # 1st Slide Nothing --- # 2nd Slide A message pops up Another message <!-- .element: class="fragment" data-fragment-index="1" --> <SlideEventListener Id={"myEvent"}/> ``` Supported output forms [#supported-output-forms] * [WLXForm](../Formatting/WLXForm) # Abs `Abs[z]` gives the absolute value of the real or complex number z. Examples [#examples] Absolute value of real numbers: ```wolfram Abs[-5] (* 5 *) ``` Absolute value (modulus) of a complex number: ```wolfram Abs[3 + 4 I] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Abs.html) for more details. # AbsArg `AbsArg[z]` gives the list `{Abs[z], Arg[z]}` of the number z. Example [#example] Get the magnitude and phase of a complex number: ```wolfram AbsArg[1 + I] (* {Sqrt[2], Pi/4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AbsArg.html) for more details. # AiryAi `AiryAi[z]` gives the Airy function Ai(z). Examples [#examples] Evaluate the Airy function at a point: ```wolfram AiryAi[0] (* 1/(3^(2/3) Gamma[2/3]) *) ``` Plot the Airy function: ```wolfram Plot[AiryAi[x], {x, -10, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryAi.html) for more details. # AiryAiPrime `AiryAiPrime[z]` gives the derivative of the Airy function Ai'(z). Examples [#examples] Evaluate the derivative of the Airy function: ```wolfram AiryAiPrime[0] (* -(1/(3^(1/3) Gamma[1/3])) *) ``` Plot the derivative of Ai: ```wolfram Plot[AiryAiPrime[x], {x, -10, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryAiPrime.html) for more details. # AiryAiZero `AiryAiZero[k]` represents the kth zero of the Airy function Ai(x). `AiryAiZero[k, x0]` represents the kth zero less than x0. Examples [#examples] Get the first zero of AiryAi: ```wolfram AiryAiZero[1] (* -2.33811... *) ``` Find numerical value: ```wolfram N[AiryAiZero[1]] (* -2.33811 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryAiZero.html) for more details. # AiryBi `AiryBi[z]` gives the Airy function Bi(z). Examples [#examples] Evaluate AiryBi at a point: ```wolfram AiryBi[0] (* 1/(3^(1/6) Gamma[2/3]) *) ``` Plot the Airy Bi function: ```wolfram Plot[AiryBi[x], {x, -10, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryBi.html) for more details. # AiryBiPrime `AiryBiPrime[z]` gives the derivative of the Airy function Bi'(z). Examples [#examples] Evaluate the derivative of AiryBi: ```wolfram AiryBiPrime[0] (* 3^(1/6)/Gamma[1/3] *) ``` Plot the derivative: ```wolfram Plot[AiryBiPrime[x], {x, -10, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryBiPrime.html) for more details. # AiryBiZero `AiryBiZero[k]` represents the kth zero of the Airy function Bi(x). `AiryBiZero[k, x0]` represents the kth zero less than x0. Examples [#examples] Get the first zero of AiryBi: ```wolfram N[AiryBiZero[1]] (* -1.17371 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AiryBiZero.html) for more details. # AlternatingFactorial `AlternatingFactorial[n]` gives the alternating factorial af(n). Examples [#examples] Compute the alternating factorial: ```wolfram AlternatingFactorial[5] (* 101 *) ``` The alternating factorial is defined as the sum of alternating factorials: ```wolfram Table[AlternatingFactorial[n], {n, 1, 6}] (* {1, 1, 5, 19, 101, 619} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlternatingFactorial.html) for more details. # AngerJ `AngerJ[ν,z]` gives the Anger function Jν(z). `AngerJ[ν,μ,z]` gives the associated Anger function Jνμ(z). Examples [#examples] Evaluate the Anger function at a point: ```wolfram AngerJ[2, 1.5] (* 0.270018 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AngerJ.html) for more details. # AnglePath `AnglePath[{θ1, θ2, θ3, ...}]` gives the list of 2D coordinates corresponding to a path that starts at \{0,0}, then takes a series of steps of unit length at successive relative angles θi. `AnglePath[{{r1, θ1}, {r2, θ2}, ...}]` takes successive steps of lengths ri. `AnglePath[θ0, {step1, step2, ...}]` starts at angle θ0 with respect to the x axis. Examples [#examples] Create a simple angle path: ```wolfram AnglePath[{0, Pi/4, Pi/4, Pi/4}] ``` Plot the path: ```wolfram Graphics[Line[AnglePath[Table[Pi/6, 12]]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AnglePath.html) for more details. # AngleVector `AngleVector[θ]` gives the list representing the 2D unit vector at angle θ relative to the x axis. `AngleVector[{r, θ}]` gives the list representing the 2D vector of length r at angle θ. `AngleVector[{x, y}, θ]` gives the result of starting from the point \{x,y}, then going a unit distance at angle θ. Examples [#examples] Get a unit vector at 45 degrees: ```wolfram AngleVector[Pi/4] (* {1/Sqrt[2], 1/Sqrt[2]} *) ``` Create a vector of specific length: ```wolfram AngleVector[{3, Pi/6}] (* {3 Sqrt[3]/2, 3/2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AngleVector.html) for more details. # AppellF1 `AppellF1[a, b1, b2, c, x, y]` is the Appell hypergeometric function of two variables F1(a; b1, b2; c; x, y). Examples [#examples] Evaluate the Appell F1 function: ```wolfram AppellF1[1, 2, 3, 4, 0.5, 0.3] ``` Symbolic evaluation: ```wolfram AppellF1[a, b1, b2, c, 0, 0] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppellF1.html) for more details. # AppellF2 `AppellF2[a,b1,b2,c1,c2,x,y]` is the Appell hypergeometric function of two variables F2(a;b1,b2;c1,c2;x,y). Examples [#examples] ```wolfram AppellF2[1, 2, 3, 4, 5, 0.1, 0.2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppellF2.html) for more details. # AppellF3 `AppellF3[a1, a2, b1, b2, c, x, y]` is the Appell hypergeometric function of two variables F3(a1, a2; b1, b2; c; x, y). Examples [#examples] Evaluate the Appell F3 function: ```wolfram AppellF3[1, 2, 3, 4, 5, 0.3, 0.2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppellF3.html) for more details. # AppellF4 `AppellF4[a, b, c1, c2, x, y]` is the Appell hypergeometric function of two variables F4(a; b; c1, c2; x, y). Examples [#examples] Evaluate the Appell F4 function: ```wolfram AppellF4[1, 2, 3, 4, 0.1, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AppellF4.html) for more details. # ArcCos `ArcCos[z]` gives the arc cosine (inverse cosine) of `z`, returning a value in the range $0$ to $\pi$. Examples [#examples] Compute the arc cosine of common values: ```wolfram ArcCos[1/2] (* Pi/3 *) ArcCos[0] (* Pi/2 *) N[ArcCos[0.5]] (* 1.0472 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCos.html) for more details. # ArcCosDegrees `ArcCosDegrees[z]` gives the arc cosine in degrees of the complex number z. Examples [#examples] Get arc cosine in degrees: ```wolfram ArcCosDegrees[0.5] (* 60. *) ``` Compare with ArcCos: ```wolfram ArcCosDegrees[0] (* 90 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCosDegrees.html) for more details. # ArcCosh `ArcCosh[z]` gives the inverse hyperbolic cosine cosh⁻¹(z) of the complex number z. Examples [#examples] Evaluate the inverse hyperbolic cosine: ```wolfram ArcCosh[2] (* Log[2 + Sqrt[3]] *) ``` Numerical value: ```wolfram N[ArcCosh[2]] (* 1.31696 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCosh.html) for more details. # ArcCot `ArcCot[z]` gives the arc cotangent cot⁻¹(z) of the complex number z. Examples [#examples] Compute the arc cotangent: ```wolfram ArcCot[1] (* Pi/4 *) ``` Numerical evaluation: ```wolfram ArcCot[2.0] (* 0.463648 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCot.html) for more details. # ArcCotDegrees `ArcCotDegrees[z]` gives the arc cotangent in degrees of the complex number z. Examples [#examples] Get arc cotangent in degrees: ```wolfram ArcCotDegrees[1] (* 45 *) ``` Numerical evaluation: ```wolfram ArcCotDegrees[2.0] (* 26.5651 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCotDegrees.html) for more details. # ArcCoth `ArcCoth[z]` gives the inverse hyperbolic cotangent coth⁻¹(z) of the complex number z. Examples [#examples] Evaluate the inverse hyperbolic cotangent: ```wolfram ArcCoth[2] (* Log[3]/2 *) ``` Numerical value: ```wolfram N[ArcCoth[2]] (* 0.549306 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCoth.html) for more details. # ArcCsc `ArcCsc[z]` gives the arc cosecant csc⁻¹(z) of the complex number z. Examples [#examples] Compute the arc cosecant: ```wolfram ArcCsc[2] (* π/6 *) ``` Numerical evaluation: ```wolfram ArcCsc[2.0] (* 0.523599 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCsc.html) for more details. # ArcCscDegrees `ArcCscDegrees[z]` gives the arc cosecant in degrees of the complex number z. Examples [#examples] ```wolfram ArcCscDegrees[2] (* 30 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCscDegrees.html) for more details. # ArcCsch `ArcCsch[z]` gives the inverse hyperbolic cosecant csch⁻¹(z) of the complex number z. Examples [#examples] Evaluate the inverse hyperbolic cosecant: ```wolfram ArcCsch[1] (* Log[1 + Sqrt[2]] *) ``` Numerical value: ```wolfram N[ArcCsch[2]] (* 0.481212 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcCsch.html) for more details. # ArcSec `ArcSec[z]` gives the arc secant of the complex number z. Examples [#examples] Compute the arc secant: ```wolfram ArcSec[2] (* Pi/3 *) ``` Numerical evaluation: ```wolfram ArcSec[2.0] (* 1.0472 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSec.html) for more details. # ArcSecDegrees `ArcSecDegrees[z]` gives the arc secant in degrees of the complex number z. Examples [#examples] Get arc secant in degrees: ```wolfram ArcSecDegrees[2] (* 60 *) ``` Numerical evaluation: ```wolfram ArcSecDegrees[1.5] (* 48.1897 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSecDegrees.html) for more details. # ArcSech `ArcSech[z]` gives the inverse hyperbolic secant sech⁻¹(z) of the complex number z. Examples [#examples] Evaluate the inverse hyperbolic secant: ```wolfram ArcSech[1/2] (* Log[2 + Sqrt[3]] *) ``` Numerical value: ```wolfram N[ArcSech[0.5]] (* 1.31696 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSech.html) for more details. # ArcSin `ArcSin[z]` gives the arc sine (inverse sine) of `z`, returning a value in the range $-\frac{\pi}{2}$ to $\frac{\pi}{2}$. Examples [#examples] Compute the arc sine of common values: ```wolfram ArcSin[1/2] (* Pi/6 *) ArcSin[1] (* Pi/2 *) N[ArcSin[0.5]] (* 0.523599 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSin.html) for more details. # ArcSinDegrees `ArcSinDegrees[z]` gives the arc sine in degrees of the complex number z. Examples [#examples] Get arc sine in degrees: ```wolfram ArcSinDegrees[0.5] (* 30. *) ``` Exact value: ```wolfram ArcSinDegrees[1] (* 90 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSinDegrees.html) for more details. # ArcSinDistribution `ArcSinDistribution[{xmin, xmax}]` represents the arc sine distribution supported between xmin and xmax. `ArcSinDistribution[]` represents the arc sine distribution supported between zero and one. Examples [#examples] Create an arc sine distribution: ```wolfram dist = ArcSinDistribution[] ``` Generate random samples: ```wolfram RandomVariate[ArcSinDistribution[], 10] ``` Plot the PDF: ```wolfram Plot[PDF[ArcSinDistribution[], x], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSinDistribution.html) for more details. # ArcSinh `ArcSinh[z]` gives the inverse hyperbolic sine sinh⁻¹(z) of the complex number z. Examples [#examples] Evaluate the inverse hyperbolic sine: ```wolfram ArcSinh[1] (* Log[1 + Sqrt[2]] *) ``` Numerical value: ```wolfram N[ArcSinh[2]] (* 1.44364 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcSinh.html) for more details. # ArcTan `ArcTan[z]` gives the arc tangent (inverse tangent) of `z`. `ArcTan[x, y]` gives the arc tangent of `y/x`, taking into account which quadrant the point is in. Examples [#examples] Compute arc tangent values: ```wolfram ArcTan[1] (* Pi/4 *) (* Two-argument form for quadrant-aware computation *) ArcTan[1, 1] (* Pi/4 *) ArcTan[-1, 1] (* 3 Pi/4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcTan.html) for more details. # ArcTanDegrees `ArcTanDegrees[z]` gives the arc tangent in degrees of the complex number z. Examples [#examples] ```wolfram ArcTanDegrees[1] (* 45 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcTanDegrees.html) for more details. # ArcTanh `ArcTanh[z]` gives the inverse hyperbolic tangent tanh⁻¹(z) of the complex number z. Examples [#examples] Compute the inverse hyperbolic tangent: ```wolfram ArcTanh[0.5] (* 0.549306 *) ``` Symbolic evaluation: ```wolfram ArcTanh[0] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArcTanh.html) for more details. # Arg `Arg[z]` gives the argument of the complex number z. Examples [#examples] Get the argument of a complex number: ```wolfram Arg[1 + I] (* Pi/4 *) ``` Argument of a negative real number: ```wolfram Arg[-1] (* Pi *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Arg.html) for more details. # ArithmeticGeometricMean `ArithmeticGeometricMean[a, b]` gives the arithmetic-geometric mean of a and b. Examples [#examples] Compute the arithmetic-geometric mean: ```wolfram ArithmeticGeometricMean[1, 2] ``` Numerical evaluation: ```wolfram N[ArithmeticGeometricMean[1, 2]] (* 1.45679 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ArithmeticGeometricMean.html) for more details. # AugmentedSymmetricPolynomial `AugmentedSymmetricPolynomial[{r1, r2, ...}]` represents a formal augmented symmetric polynomial with exponents r1, r2, .... `AugmentedSymmetricPolynomial[{{r11, ..., r1n}, {r21, ..., r2n}, ...}]` represents a multivariate formal augmented symmetric polynomial. `AugmentedSymmetricPolynomial[rspec, data]` gives the augmented symmetric polynomial in data. Examples [#examples] Create an augmented symmetric polynomial: ```wolfram AugmentedSymmetricPolynomial[{2, 1}][{a, b, c}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AugmentedSymmetricPolynomial.html) for more details. # BarnesG `BarnesG[z]` gives the Barnes G-function G(z). Examples [#examples] Compute the Barnes G-function: ```wolfram BarnesG[5] (* 288 *) ``` ```wolfram N[BarnesG[2.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarnesG.html) for more details. # BattleLemarieWavelet `BattleLemarieWavelet[]` represents the Battle-Lemarié wavelet of order 3. `BattleLemarieWavelet[n]` represents the Battle-Lemarié wavelet of order n evaluated on equally spaced interval \{-10, 10}. `BattleLemarieWavelet[n, lim]` represents the Battle-Lemarié wavelet of order n evaluated on equally spaced interval \{-lim, lim}. Examples [#examples] Create wavelet: ```wolfram BattleLemarieWavelet[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BattleLemarieWavelet.html) for more details. # BellB `BellB[n]` gives the Bell number Bn. `BellB[n,x]` gives the Bell polynomial Bn(x). Examples [#examples] ```wolfram BellB[5] (* 52 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BellB.html) for more details. # BellY `BellY[n, k, {x1, ..., xn-k+1}]` gives the partial Bell polynomial Yn,k(x1, ..., xn-k+1). `BellY[n, k, m]` gives the generalized partial Bell polynomial of a matrix m. `BellY[m]` gives the generalized Bell polynomial of a matrix m. Examples [#examples] Compute a partial Bell polynomial: ```wolfram BellY[3, 2, {x1, x2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BellY.html) for more details. # BernoulliB `BernoulliB[n]` gives the Bernoulli number B\_n. `BernoulliB[n, x]` gives the Bernoulli polynomial B\_n(x). Examples [#examples] Bernoulli numbers: ```wolfram Table[BernoulliB[n], {n, 0, 6}] (* {1, -1/2, 1/6, 0, -1/30, 0, 1/42} *) ``` Bernoulli polynomial: ```wolfram BernoulliB[3, x] (* x^3 - 3*x^2/2 + x/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BernoulliB.html) for more details. # BernsteinBasis `BernsteinBasis[d, n, x]` represents the nth Bernstein basis function of degree d at x. Examples [#examples] Evaluate Bernstein basis: ```wolfram BernsteinBasis[3, 1, 0.5] (* 0.375 *) ``` Plot basis functions: ```wolfram Plot[Table[BernsteinBasis[3, n, x], {n, 0, 3}], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BernsteinBasis.html) for more details. # BesagL `BesagL[pdata, r]` estimates Besag's L function L(r) for point data pdata at radius r. `BesagL[pproc, r]` computes L(r) for the point process pproc. `BesagL[bdata, r]` computes L(r) for binned data bdata. Examples [#examples] Compute L function: ```wolfram pts = RandomPointConfiguration[PoissonPointProcess[1], Rectangle[]]; BesagL[pts, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesagL.html) for more details. # BesselI `BesselI[n, z]` gives the modified Bessel function of the first kind I\_n(z). Examples [#examples] Modified Bessel function: ```wolfram BesselI[0, 0] (* 1 *) BesselI[1, 0] (* 0 *) ``` Numerical evaluation: ```wolfram N[BesselI[0, 1]] (* 1.26607 *) N[BesselI[2, 3]] (* 2.24521 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselI.html) for more details. # BesselJ `BesselJ[n, z]` gives the Bessel function of the first kind J\_n(z). Examples [#examples] Bessel function values: ```wolfram BesselJ[0, 0] (* 1 *) BesselJ[1, 0] (* 0 *) ``` Numerical evaluation: ```wolfram N[BesselJ[0, 1]] (* 0.765198 *) N[BesselJ[1, 2]] (* 0.576725 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselJ.html) for more details. # BesselJZero `BesselJZero[n, k]` represents the kth zero of the Bessel function Jn(x). `BesselJZero[n, k, x0]` represents the kth zero greater than x0. Examples [#examples] Find zeros of Bessel J: ```wolfram N[BesselJZero[0, 1]] (* 2.40483 *) ``` ```wolfram N[BesselJZero[1, 2]] (* 7.01559 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselJZero.html) for more details. # BesselK `BesselK[n, z]` gives the modified Bessel function of the second kind K\_n(z). Examples [#examples] Modified Bessel K function: ```wolfram N[BesselK[0, 1]] (* 0.421024 *) N[BesselK[1, 2]] (* 0.139866 *) ``` Asymptotic behavior: ```wolfram N[BesselK[0, 0.1]] (* 2.42707 - large for small z *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselK.html) for more details. # BesselY `BesselY[n, z]` gives the Bessel function of the second kind Y\_n(z), also called the Neumann function. Examples [#examples] Bessel Y function: ```wolfram N[BesselY[0, 1]] (* 0.0882570 *) N[BesselY[1, 2]] (* -0.107032 *) ``` Divergent at zero: ```wolfram N[BesselY[0, 0.1]] (* -1.53424 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselY.html) for more details. # BesselYZero `BesselYZero[n, k]` represents the kth zero of the Bessel function of the second kind Yn(x). `BesselYZero[n, k, x0]` represents the kth zero greater than x0. Examples [#examples] Find zeros of Bessel Y: ```wolfram N[BesselYZero[0, 1]] (* 0.893577 *) ``` ```wolfram N[BesselYZero[1, 2]] (* 5.4297 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BesselYZero.html) for more details. # Beta `Beta[a, b]` gives the Euler beta function B(a, b). `Beta[z, a, b]` gives the incomplete beta function. Examples [#examples] Beta function: ```wolfram Beta[2, 3] (* 1/12 *) Beta[1/2, 1/2] (* Pi *) ``` Numerical evaluation: ```wolfram N[Beta[2.5, 3.5]] (* 0.0285714 *) ``` Relation to Gamma: ```wolfram Beta[a, b] == Gamma[a] Gamma[b] / Gamma[a + b] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Beta.html) for more details. # BetaBinomialDistribution `BetaBinomialDistribution[α, β, n]` represents a beta binomial mixture distribution with beta distribution parameters α and β, and n binomial trials. Examples [#examples] Create a beta binomial distribution: ```wolfram dist = BetaBinomialDistribution[2, 5, 10] ``` Compute mean and variance: ```wolfram {Mean[dist], Variance[dist]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetaBinomialDistribution.html) for more details. # BetaDistribution `BetaDistribution[α, β]` represents a continuous beta distribution with shape parameters α and β. Examples [#examples] Define a beta distribution: ```wolfram dist = BetaDistribution[2, 5] ``` Compute the mean: ```wolfram Mean[BetaDistribution[2, 5]] (* 2/7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetaDistribution.html) for more details. # BetaNegativeBinomialDistribution `BetaNegativeBinomialDistribution[α, β, n]` represents a beta negative binomial mixture distribution with beta distribution parameters α and β and n successful trials. Examples [#examples] Define a beta negative binomial distribution: ```wolfram dist = BetaNegativeBinomialDistribution[2, 3, 5] ``` Calculate moments: ```wolfram Mean[BetaNegativeBinomialDistribution[2, 3, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetaNegativeBinomialDistribution.html) for more details. # BetaPrimeDistribution `BetaPrimeDistribution[p, q]` represents a beta prime distribution with shape parameters p and q. `BetaPrimeDistribution[p, q, β]` represents a generalized beta prime distribution with scale parameter β. `BetaPrimeDistribution[p, q, α, β]` represents a generalized beta distribution of the second kind with shape parameter α. Examples [#examples] ```wolfram PDF[BetaPrimeDistribution[2, 3], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetaPrimeDistribution.html) for more details. # BetaRegularized `BetaRegularized[z, a, b]` gives the regularized incomplete beta function Iz(a,b). Examples [#examples] Compute regularized beta: ```wolfram BetaRegularized[0.5, 2, 3] (* 0.6875 *) ``` Symbolic value: ```wolfram BetaRegularized[1/2, 1, 1] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BetaRegularized.html) for more details. # Binomial `Binomial[n, m]` gives the binomial coefficient "n choose m", the number of ways to choose m items from n. Examples [#examples] Binomial coefficients: ```wolfram Binomial[5, 2] (* 10 *) Binomial[10, 5] (* 252 *) ``` Pascal's triangle row: ```wolfram Table[Binomial[4, k], {k, 0, 4}] (* {1, 4, 6, 4, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Binomial.html) for more details. # BinomialDistribution `BinomialDistribution[n, p]` represents a binomial distribution with n trials and success probability p. Examples [#examples] Random samples: ```wolfram RandomVariate[BinomialDistribution[10, 0.5], 5] (* {5, 6, 4, 5, 7} *) ``` Probability of exactly 3 successes: ```wolfram PDF[BinomialDistribution[10, 0.5], 3] (* 15/128 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinomialDistribution.html) for more details. # BinomialPointProcess `BinomialPointProcess[n, reg]` represents a binomial point process with n points in the region reg. Examples [#examples] Create a binomial point process: ```wolfram BinomialPointProcess[10, Rectangle[]] ``` Sample from the process: ```wolfram RandomPointConfiguration[BinomialPointProcess[20, Disk[]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinomialPointProcess.html) for more details. # BinomialProcess `BinomialProcess[p]` represents a binomial process with event probability p. Examples [#examples] Simulate a binomial process: ```wolfram RandomFunction[BinomialProcess[0.3], {0, 20}] ``` Plot sample paths: ```wolfram ListLinePlot[RandomFunction[BinomialProcess[0.5], {0, 50}, 5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinomialProcess.html) for more details. # CantorStaircase `CantorStaircase[x]` gives the Cantor staircase function FC(x). Examples [#examples] Plot the Cantor staircase: ```wolfram Plot[CantorStaircase[x], {x, 0, 1}] ``` Evaluate at specific points: ```wolfram CantorStaircase[1/3] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CantorStaircase.html) for more details. # CarlsonRC `CarlsonRC[x, y]` gives Carlson's elliptic integral RC(x, y). Examples [#examples] Evaluate Carlson RC: ```wolfram N[CarlsonRC[1, 2]] (* 0.785398 *) ``` Symbolic form: ```wolfram CarlsonRC[0, 1] (* Pi/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRC.html) for more details. # CarlsonRD `CarlsonRD[x, y, z]` gives the Carlson's elliptic integral RD(x, y, z). Examples [#examples] Evaluate the Carlson RD integral: ```wolfram CarlsonRD[1, 2, 3] (* 0.297238 *) ``` Numerical evaluation: ```wolfram N[CarlsonRD[0, 1, 2]] (* 1.7972 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRD.html) for more details. # CarlsonRE `CarlsonRE[x, y]` gives Carlson's elliptic integral RE(x, y). Examples [#examples] Evaluate Carlson RE: ```wolfram N[CarlsonRE[1, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRE.html) for more details. # CarlsonRF `CarlsonRF[x, y, z]` gives Carlson's elliptic integral RF(x, y, z). Examples [#examples] Evaluate Carlson RF: ```wolfram N[CarlsonRF[1, 2, 3]] (* 0.726945 *) ``` Symmetric property: ```wolfram CarlsonRF[1, 1, 1] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRF.html) for more details. # CarlsonRG `CarlsonRG[x, y, z]` gives Carlson's elliptic integral RG(x, y, z). Examples [#examples] Evaluate Carlson RG: ```wolfram N[CarlsonRG[1, 2, 3]] (* 1.24265 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRG.html) for more details. # CarlsonRJ `CarlsonRJ[x, y, z, ρ]` gives Carlson's elliptic integral RJ(x, y, z, ρ). Examples [#examples] Evaluate Carlson RJ: ```wolfram N[CarlsonRJ[1, 2, 3, 4]] (* 0.206227 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRJ.html) for more details. # CarlsonRK `CarlsonRK[x, y]` gives Carlson's elliptic integral RK(x, y). Examples [#examples] Evaluate Carlson RK: ```wolfram N[CarlsonRK[1, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRK.html) for more details. # CarlsonRM `CarlsonRM[x,y,ρ]` gives Carlson's elliptic integral RM(x,y,ρ). Examples [#examples] ```wolfram CarlsonRM[1, 2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarlsonRM.html) for more details. # CarmichaelLambda `CarmichaelLambda[n]` gives the Carmichael function λ(n). Examples [#examples] Compute the Carmichael function: ```wolfram CarmichaelLambda[12] (* 2 *) ``` Compare with Euler's totient: ```wolfram {CarmichaelLambda[100], EulerPhi[100]} (* {20, 40} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CarmichaelLambda.html) for more details. # Casoratian `Casoratian[{y1, y2, ...}, n]` gives the Casoratian determinant for the sequences y1, y2, ... depending on n. `Casoratian[eqn, y, n]` gives the Casoratian determinant for the basis of the solutions of the linear difference equation eqn involving `y[n+m]`. `Casoratian[eqns, {y1, y2, ...}, n]` gives the Casoratian determinant for the system of linear difference equations eqns. Examples [#examples] ```wolfram Casoratian[{n, n^2, n^3}, n] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Casoratian.html) for more details. # Catalan `Catalan` is Catalan's constant, with numerical value ≈ 0.915966. Examples [#examples] Numerical value: ```wolfram N[Catalan] (* 0.915966 *) ``` High precision: ```wolfram N[Catalan, 50] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Catalan.html) for more details. # CatalanNumber `CatalanNumber[n]` gives the nth Catalan number Cn. Examples [#examples] ```wolfram CatalanNumber[5] (* 42 *) ``` ```wolfram Table[CatalanNumber[n], {n, 0, 10}] (* {1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CatalanNumber.html) for more details. # Ceiling `Ceiling[x]` gives the smallest integer greater than or equal to x. `Ceiling[x, a]` gives the smallest multiple of a greater than or equal to x. Examples [#examples] Ceiling of a number: ```wolfram Ceiling[3.2] (* 4 *) Ceiling[-2.7] (* -2 *) ``` Ceiling to a multiple: ```wolfram Ceiling[17, 5] (* 20 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Ceiling.html) for more details. # CellularAutomaton `CellularAutomaton[rule,init,t]` generates a list representing the evolution of the cellular automaton with the specified rule from initial condition init for t steps. `CellularAutomaton[rule,init]` gives the result of evolving init for one step. `CellularAutomaton[rule,init,{tspec,xspec,…}]` gives only those parts of the evolution specified by tspec, xspec, etc. `CellularAutomaton[rule,init,{t,All,…}]` includes at each step all cells that could be affected over the course of t steps. `CellularAutomaton[rule]` is an operator form of CellularAutomaton that represents one step of evolution. Examples [#examples] Evolve Rule 30 for 50 steps: ```wolfram ArrayPlot[CellularAutomaton[30, {{1}, 0}, 50]] ``` One step of Rule 110: ```wolfram CellularAutomaton[110, {0, 1, 1, 0, 1}] (* {1, 1, 0, 1, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CellularAutomaton.html) for more details. # CenteredInterval `CenteredInterval[x, dx]` for real numbers x and dx gives a centered interval that contains the real interval from x-dx to x+dx. `CenteredInterval[x + I*y, dx + I*dy]` gives a centered interval that contains the complex rectangle. `CenteredInterval[c]` for an approximate number c gives a centered interval that contains all values within the error bounds of c. Examples [#examples] Create a centered interval: ```wolfram CenteredInterval[3, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CenteredInterval.html) for more details. # CepstrumArray `CepstrumArray[data]` computes the power cepstrum of data. `CepstrumArray[data, type]` computes the specified type of cepstrum of data. Examples [#examples] Compute the power cepstrum: ```wolfram CepstrumArray[{1, 2, 3, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CepstrumArray.html) for more details. # ChampernowneNumber `ChampernowneNumber[b]` gives the base-b Champernowne number. `ChampernowneNumber[]` gives the base-10 Champernowne number. Examples [#examples] The base-10 Champernowne constant: ```wolfram N[ChampernowneNumber[], 50] (* 0.12345678910111213141516171819202122232425... *) ``` Base-2 Champernowne number: ```wolfram N[ChampernowneNumber[2], 20] (* 0.86224615... *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChampernowneNumber.html) for more details. # ChebyshevDistance `ChebyshevDistance[u, v]` gives the Chebyshev or sup norm distance between vectors u and v. Examples [#examples] Chebyshev distance between two vectors: ```wolfram ChebyshevDistance[{1, 2, 3}, {4, 5, 6}] (* 3 *) ``` Maximum absolute difference: ```wolfram ChebyshevDistance[{0, 0}, {3, 4}] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChebyshevDistance.html) for more details. # ChebyshevT `ChebyshevT[n, x]` gives the Chebyshev polynomial of the first kind T\_n(x). Examples [#examples] Chebyshev T polynomials: ```wolfram ChebyshevT[0, x] (* 1 *) ChebyshevT[2, x] (* -1 + 2*x^2 *) ChebyshevT[4, x] (* 1 - 8*x^2 + 8*x^4 *) ``` Numerical value: ```wolfram ChebyshevT[3, 0.5] (* -1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChebyshevT.html) for more details. # ChebyshevU `ChebyshevU[n, x]` gives the Chebyshev polynomial of the second kind U\_n(x). Examples [#examples] Chebyshev U polynomials: ```wolfram ChebyshevU[0, x] (* 1 *) ChebyshevU[2, x] (* -1 + 4*x^2 *) ChebyshevU[3, x] (* -4*x + 8*x^3 *) ``` Numerical value: ```wolfram ChebyshevU[4, 0.5] (* -1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChebyshevU.html) for more details. # ClebschGordan `ClebschGordan[{j1, m1}, {j2, m2}, {j, m}]` gives the Clebsch–Gordan coefficient for the decomposition of |j, m〉 in terms of |j1, m1〉|j2, m2〉. Examples [#examples] ```wolfram ClebschGordan[{1, 0}, {1, 0}, {0, 0}] (* -1/Sqrt[3] *) ``` ```wolfram ClebschGordan[{1/2, 1/2}, {1/2, -1/2}, {1, 0}] (* 1/Sqrt[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ClebschGordan.html) for more details. # Clip `Clip[x]` clips `x` to the range $[-1, 1]$. `Clip[x, {min, max}]` clips to the range `[min, max]`. Examples [#examples] Clip values to a range: ```wolfram Clip[5] (* 1 *) Clip[-0.5] (* -0.5 *) Clip[15, {0, 10}] (* 10 *) (* Clip a list *) Clip[{-5, 3, 12}, {0, 10}] (* {0, 3, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Clip.html) for more details. # CoifletWavelet `CoifletWavelet[]` represents a Coiflet wavelet of order 2. `CoifletWavelet[n]` represents a Coiflet wavelet of order n. Examples [#examples] Create a Coiflet wavelet of order 4: ```wolfram CoifletWavelet[4] (* CoifletWavelet[4] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoifletWavelet.html) for more details. # ComplexInfinity `ComplexInfinity` represents a quantity with infinite magnitude, but undetermined complex phase. Examples [#examples] Division by zero gives complex infinity: ```wolfram 1/0 (* ComplexInfinity *) ``` As a limit: ```wolfram Limit[1/x, x -> 0] (* ComplexInfinity *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ComplexInfinity.html) for more details. # Conjugate `Conjugate[z]` gives the complex conjugate of the complex number z. Examples [#examples] Complex conjugate of a number: ```wolfram Conjugate[3 + 4 I] (* 3 - 4 I *) ``` Conjugate of a purely imaginary number: ```wolfram Conjugate[5 I] (* -5 I *) ``` Real numbers are unchanged: ```wolfram Conjugate[7] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Conjugate.html) for more details. # ContinuousWaveletTransform `ContinuousWaveletTransform[{x1, x2, ...}]` gives the continuous wavelet transform of a list of values xi. `ContinuousWaveletTransform[data, wave]` gives the continuous wavelet transform using the wavelet wave. `ContinuousWaveletTransform[data, wave, {noct, nvoc}]` gives the continuous wavelet transform using noct octaves with nvoc voices per octave. `ContinuousWaveletTransform[sound, ...]` gives the continuous wavelet transform of sampled sound. Examples [#examples] Transform a signal: ```wolfram signal = Table[Sin[2 Pi t] + Sin[4 Pi t], {t, 0, 10, 0.01}]; cwt = ContinuousWaveletTransform[signal]; WaveletScalogram[cwt] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContinuousWaveletTransform.html) for more details. # ContraharmonicMean `ContraharmonicMean[list]` gives the contraharmonic mean of the values in list. `ContraharmonicMean[list, p]` gives the order p Lehmer contraharmonic mean. Examples [#examples] Compute the contraharmonic mean: ```wolfram ContraharmonicMean[{1, 2, 3, 4, 5}] (* 11/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContraharmonicMean.html) for more details. # Cos `Cos[z]` gives the cosine of z. Examples [#examples] Cosine of common angles: ```wolfram Cos[Pi/3] (* 1/2 *) Cos[Pi] (* -1 *) ``` Numerical evaluation: ```wolfram Cos[1.0] (* 0.540302 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cos.html) for more details. # CosDegrees `CosDegrees[θ]` gives the cosine of θ degrees. Examples [#examples] Cosine of 60 degrees: ```wolfram CosDegrees[60] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CosDegrees.html) for more details. # CosIntegral `CosIntegral[z]` gives the cosine integral function Ci(z). Examples [#examples] ```wolfram CosIntegral[1.0] (* 0.337404 *) ``` ```wolfram N[CosIntegral[2]] (* 0.422981 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CosIntegral.html) for more details. # Cosh `Cosh[z]` gives the hyperbolic cosine of `z`, defined as $(e^z + e^{-z})/2$. Examples [#examples] Compute hyperbolic cosine values: ```wolfram Cosh[0] (* 1 *) Cosh[1.0] (* 1.54308 *) Cosh[Log[2]] (* 5/4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cosh.html) for more details. # CoshIntegral `CoshIntegral[z]` gives the hyperbolic cosine integral Chi(z). Examples [#examples] ```wolfram CoshIntegral[2.0] (* 2.45267 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoshIntegral.html) for more details. # CosineDistance `CosineDistance[u, v]` gives the angular cosine distance between vectors u and v. Examples [#examples] Compute the cosine distance between two vectors: ```wolfram CosineDistance[{1, 0}, {0, 1}] (* 1 *) ``` Parallel vectors have zero cosine distance: ```wolfram CosineDistance[{1, 2, 3}, {2, 4, 6}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CosineDistance.html) for more details. # CosineWindow `CosineWindow[x]` represents a cosine window function of x. `CosineWindow[x, α]` uses the exponent α. Examples [#examples] Plot a cosine window: ```wolfram Plot[CosineWindow[x], {x, -1, 1}] ``` Apply to signal processing: ```wolfram data = Table[Sin[2 Pi t/10], {t, 0, 99}]; ListLinePlot[data * Table[CosineWindow[t/50 - 1], {t, 0, 99}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CosineWindow.html) for more details. # Cot `Cot[z]` gives the cotangent of z. Examples [#examples] Cotangent of common angles: ```wolfram Cot[Pi/4] (* 1 *) Cot[Pi/6] (* Sqrt[3] *) ``` Numerical evaluation: ```wolfram Cot[1.0] (* 0.642093 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cot.html) for more details. # CotDegrees `CotDegrees[θ]` gives the cotangent of θ degrees. Examples [#examples] Cotangent of 45 degrees: ```wolfram CotDegrees[45] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CotDegrees.html) for more details. # Coth `Coth[z]` gives the hyperbolic cotangent of z. Examples [#examples] Hyperbolic cotangent values: ```wolfram Coth[1.0] (* 1.31304 *) ``` Symbolic evaluation: ```wolfram Coth[Log[2]] (* 5/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Coth.html) for more details. # CoulombF `CoulombF[l, η, r]` gives the regular Coulomb wavefunction Fl(η, r). Examples [#examples] Compute regular Coulomb wavefunction: ```wolfram CoulombF[0, 1, 2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoulombF.html) for more details. # CoulombG `CoulombG[l, η, r]` gives the irregular Coulomb wavefunction Gl(η, r). Examples [#examples] Compute irregular Coulomb wavefunction: ```wolfram CoulombG[0, 1, 2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoulombG.html) for more details. # CoulombH1 `CoulombH1[l, η, r]` gives the outgoing irregular Coulomb wavefunction Hl(+)(η, r). Examples [#examples] Compute outgoing Coulomb wavefunction: ```wolfram CoulombH1[0, 1, 2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoulombH1.html) for more details. # CoulombH2 `CoulombH2[l, η, r]` gives the incoming irregular Coulomb wavefunction Hl(-)(η, r). Examples [#examples] Compute incoming Coulomb wavefunction: ```wolfram CoulombH2[0, 1, 2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoulombH2.html) for more details. # Csc `Csc[z]` gives the cosecant of z. Examples [#examples] Cosecant of common angles: ```wolfram Csc[Pi/6] (* 2 *) Csc[Pi/4] (* Sqrt[2] *) ``` Numerical evaluation: ```wolfram Csc[1.0] (* 1.1884 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Csc.html) for more details. # CscDegrees `CscDegrees[θ]` gives the cosecant of θ degrees. Examples [#examples] Calculate cosecant in degrees: ```wolfram CscDegrees[30] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CscDegrees.html) for more details. # Csch `Csch[z]` gives the hyperbolic cosecant of z. Examples [#examples] Hyperbolic cosecant values: ```wolfram Csch[1.0] (* 0.850918 *) ``` Symbolic evaluation: ```wolfram Csch[Log[2]] (* 4/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Csch.html) for more details. # CubeRoot `CubeRoot[x]` gives the real-valued cube root of x. Examples [#examples] Compute the cube root of a positive number: ```wolfram CubeRoot[8] (* 2 *) ``` Compute the cube root of a negative number: ```wolfram CubeRoot[-27] (* -3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CubeRoot.html) for more details. # CycleIndexPolynomial `CycleIndexPolynomial[perm, {x1, ..., xn}]` constructs the cycle index monomial of the permutation perm in the variables xi. `CycleIndexPolynomial[group, {x1, ..., xn}]` constructs the cycle index polynomial of group in the variables xi. Examples [#examples] Cycle index of a permutation: ```wolfram CycleIndexPolynomial[Cycles[{{1, 2, 3}}], {x1, x2, x3}] (* x3 *) ``` For a symmetric group: ```wolfram CycleIndexPolynomial[SymmetricGroup[3], {x1, x2, x3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CycleIndexPolynomial.html) for more details. # DGaussianWavelet `DGaussianWavelet[]` represents a derivative of Gaussian wavelet of derivative order 2. `DGaussianWavelet[n]` represents a derivative of Gaussian wavelet of derivative order n. Examples [#examples] ```wolfram DGaussianWavelet[] (* DGaussianWavelet[2] *) ``` ```wolfram Plot[DGaussianWavelet[4][x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DGaussianWavelet.html) for more details. # DaubechiesWavelet `DaubechiesWavelet[]` represents a Daubechies wavelet of order 2. `DaubechiesWavelet[n]` represents a Daubechies wavelet of order n. Examples [#examples] Create a Daubechies wavelet of order 4: ```wolfram DaubechiesWavelet[4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DaubechiesWavelet.html) for more details. # DawsonF `DawsonF[z]` gives the Dawson integral F(z). Examples [#examples] Compute the Dawson integral: ```wolfram DawsonF[1.0] (* 0.538079506912768 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DawsonF.html) for more details. # DeBruijnGraph `DeBruijnGraph[m, n]` gives the n-dimensional De Bruijn graph with m symbols. `DeBruijnGraph[m, n, type]` gives the De Bruijn graph with connectivity given by type. Examples [#examples] Create a De Bruijn graph: ```wolfram DeBruijnGraph[2, 3] ``` Binary De Bruijn sequence graph: ```wolfram DeBruijnGraph[2, 4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeBruijnGraph.html) for more details. # DeBruijnSequence `DeBruijnSequence[list, n]` gives a de Bruijn sequence on the elements in list taken n at a time. `DeBruijnSequence[k, n]` gives a de Bruijn sequence on the elements 0, …, k-1. `DeBruijnSequence["string", n]` gives a de Bruijn sequence on the characters in "string". Examples [#examples] Generate a binary de Bruijn sequence: ```wolfram DeBruijnSequence[2, 3] (* {0, 0, 0, 1, 0, 1, 1, 1} *) ``` Generate a de Bruijn sequence on characters: ```wolfram DeBruijnSequence["ab", 2] (* {"a", "a", "b", "b"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DeBruijnSequence.html) for more details. # DedekindEta `DedekindEta[τ]` gives the Dedekind eta modular elliptic function η(τ). Examples [#examples] Compute the Dedekind eta function: ```wolfram DedekindEta[I] (* 0.768225 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DedekindEta.html) for more details. # Degree `Degree` gives the number of radians in one degree. It has a numerical value of π/180. Examples [#examples] Convert degrees to radians: ```wolfram 45 Degree (* Pi/4 *) ``` Use in trigonometric functions: ```wolfram Sin[30 Degree] (* 1/2 *) ``` Numerical value: ```wolfram N[Degree] (* 0.0174533 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Degree.html) for more details. # DirectedInfinity `DirectedInfinity[]` represents an infinite numerical quantity whose direction in the complex plane is unknown. `DirectedInfinity[z]` represents an infinite quantity that is a positive real multiple of the complex number z. Examples [#examples] Complex infinity: ```wolfram DirectedInfinity[] (* ComplexInfinity *) ``` Positive infinity: ```wolfram DirectedInfinity[1] (* Infinity *) ``` Negative infinity: ```wolfram DirectedInfinity[-1] (* -Infinity *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirectedInfinity.html) for more details. # DirichletBeta `DirichletBeta[s]` gives the Dirichlet beta function β(s). Examples [#examples] Evaluate at specific points: ```wolfram DirichletBeta[2] (* Catalan *) ``` Numerical value: ```wolfram N[DirichletBeta[3]] (* 0.968946 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletBeta.html) for more details. # DirichletEta `DirichletEta[s]` gives the Dirichlet eta function η(s). Examples [#examples] Evaluate at specific points: ```wolfram DirichletEta[2] (* Pi^2/12 *) ``` Related to Riemann zeta: ```wolfram DirichletEta[s] == (1 - 2^(1 - s)) Zeta[s] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletEta.html) for more details. # DirichletL `DirichletL[k, j, s]` gives the Dirichlet L-function L(χ, s) for the Dirichlet character χ(n) with modulus k and index j. Examples [#examples] Evaluate L-function: ```wolfram DirichletL[4, 2, 1] (* Pi/4 *) ``` Numerical evaluation: ```wolfram N[DirichletL[5, 2, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletL.html) for more details. # DirichletLambda `DirichletLambda[s]` gives the Dirichlet lambda function λ(s). Examples [#examples] Evaluate at specific points: ```wolfram DirichletLambda[2] (* Pi^2/8 *) ``` Numerical value: ```wolfram N[DirichletLambda[4]] (* 1.01467 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletLambda.html) for more details. # DiscreteWaveletPacketTransform `DiscreteWaveletPacketTransform[data]` gives the discrete wavelet packet transform (DWPT) of an array of data. `DiscreteWaveletPacketTransform[data, wave]` gives the discrete wavelet packet transform using the wavelet wave. `DiscreteWaveletPacketTransform[data, wave, r]` gives the discrete wavelet packet transform using r levels of refinement. Examples [#examples] Compute wavelet packet transform: ```wolfram DiscreteWaveletPacketTransform[{1, 2, 3, 4, 5, 6, 7, 8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteWaveletPacketTransform.html) for more details. # DiscreteWaveletTransform `DiscreteWaveletTransform[data]` gives the discrete wavelet transform (DWT) of an array of data. `DiscreteWaveletTransform[data, wave]` gives the DWT using the wavelet wave. `DiscreteWaveletTransform[data, wave, r]` gives the DWT using r levels of refinement. Examples [#examples] Basic wavelet transform: ```wolfram DiscreteWaveletTransform[{1, 2, 3, 4, 5, 6, 7, 8}] ``` With Daubechies wavelet: ```wolfram DiscreteWaveletTransform[Range[16], DaubechiesWavelet[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteWaveletTransform.html) for more details. # Divide `x/y` or `Divide[x, y]` is equivalent to x y^-1. Examples [#examples] Basic division: ```wolfram Divide[10, 2] (* 5 *) ``` Symbolic division: ```wolfram Divide[a + b, c] (* (a + b)/c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Divide.html) for more details. # DivideBy `x /= c` divides x by c and returns the new value of x. Examples [#examples] Divide and assign: ```wolfram x = 100; x /= 5 (* 20 *) ``` Successive division: ```wolfram y = 1000; y /= 10; y /= 2 (* 50 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DivideBy.html) for more details. # DivisorSigma `DivisorSigma[k, n]` gives the divisor function σk(n), the sum of the k-th powers of divisors of n. Examples [#examples] Sum of divisors (k=1): ```wolfram DivisorSigma[1, 12] (* 28 *) ``` Number of divisors (k=0): ```wolfram DivisorSigma[0, 12] (* 6 *) ``` Sum of squares of divisors: ```wolfram DivisorSigma[2, 6] (* 50 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DivisorSigma.html) for more details. # DivisorSum `DivisorSum[n,form]` represents the sum of form\[i] for all i that divide n. `DivisorSum[n,form,cond]` includes only those divisors for which cond\[i] gives True. Examples [#examples] Sum the squares of divisors: ```wolfram DivisorSum[12, #^2 &] (* 210 *) ``` Sum only odd divisors: ```wolfram DivisorSum[12, # &, OddQ] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DivisorSum.html) for more details. # Divisors `Divisors[n]` gives a list of the integers that divide n. Examples [#examples] Find all divisors: ```wolfram Divisors[24] (* {1, 2, 3, 4, 6, 8, 12, 24} *) ``` Divisors of a prime: ```wolfram Divisors[17] (* {1, 17} *) ``` Count divisors: ```wolfram Length[Divisors[100]] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Divisors.html) for more details. # E `E` is the exponential constant (base of natural logarithms), with numerical value ≃2.71828. Examples [#examples] Get the numerical value: ```wolfram N[E] (* 2.71828 *) ``` Use in exponential function: ```wolfram E^(I Pi) + 1 (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/E.html) for more details. # EllipticE `EllipticE[m]` gives the complete elliptic integral E(m). `EllipticE[ϕ, m]` gives the elliptic integral of the second kind E(ϕ|m). Examples [#examples] ```wolfram EllipticE[0.5] (* 1.35064 *) ``` ```wolfram EllipticE[Pi/4, 0.5] (* 0.748186 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticE.html) for more details. # EllipticExp `EllipticExp[u,{a,b}]` is the inverse for `EllipticLog`. It produces a list \{x,y} such that u==EllipticLog\[\{x,y},\{a,b}]. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticExp.html) for more details. # EllipticExpPrime `EllipticExpPrime[u, {a, b}]` gives the derivative of `EllipticExp[u, {a, b}]` with respect to u. Examples [#examples] Compute elliptic exponential derivative: ```wolfram EllipticExpPrime[1.5, {-1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticExpPrime.html) for more details. # EllipticF `EllipticF[ϕ, m]` gives the elliptic integral of the first kind F(ϕ|m). Examples [#examples] Evaluate an elliptic integral: ```wolfram EllipticF[Pi/4, 1/2] (* 0.804366 *) ``` Numerical evaluation: ```wolfram N[EllipticF[Pi/6, 0.3]] (* 0.525604 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticF.html) for more details. # EllipticFilterModel `EllipticFilterModel[n]` designs a lowpass elliptic filter of order n. `EllipticFilterModel[{n, ωc}]` uses the cutoff frequency ωc. `EllipticFilterModel[{"type", spec}]` designs an elliptic filter of the specified type "type", using the spec. `EllipticFilterModel[{"type", spec}, var]` expresses the model in terms of the variable var. Examples [#examples] Design a 5th order elliptic filter: ```wolfram EllipticFilterModel[5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticFilterModel.html) for more details. # EllipticK `EllipticK[m]` gives the complete elliptic integral of the first kind K(m). Examples [#examples] Evaluate complete elliptic integral: ```wolfram EllipticK[0.5] (* 1.85407 *) ``` Symbolic evaluation: ```wolfram EllipticK[0] (* Pi/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticK.html) for more details. # EllipticLog `EllipticLog[{x, y}, {a, b}]` gives the generalized logarithm associated with the elliptic curve y² = x³ + ax² + bx. Examples [#examples] Compute elliptic logarithm: ```wolfram EllipticLog[{2, 3}, {-1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticLog.html) for more details. # EllipticNomeQ `EllipticNomeQ[m]` gives the nome q corresponding to the parameter m in an elliptic function. Examples [#examples] Compute the elliptic nome: ```wolfram EllipticNomeQ[0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticNomeQ.html) for more details. # EllipticPi `EllipticPi[n, m]` gives the complete elliptic integral of the third kind Π(n|m). `EllipticPi[n, ϕ, m]` gives the incomplete elliptic integral Π(n; ϕ|m). Examples [#examples] Complete elliptic integral: ```wolfram N[EllipticPi[0.3, 0.5]] ``` Incomplete elliptic integral: ```wolfram N[EllipticPi[0.2, Pi/4, 0.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticPi.html) for more details. # EllipticReducedHalfPeriods `EllipticReducedHalfPeriods[{u, v}]` gives a reduced pair of half periods \{w, w'} corresponding to the same lattice as that of \{u, v}. Examples [#examples] Get reduced half periods: ```wolfram EllipticReducedHalfPeriods[{1, I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticReducedHalfPeriods.html) for more details. # EllipticTheta `EllipticTheta[a,u,q]` gives the theta function ϑa(u,q) (a=1,…,4). `EllipticTheta[a,q]` gives the theta constant ϑa(q)ϑa(0,q). Examples [#examples] Evaluate the first theta function: ```wolfram EllipticTheta[1, 0.5, 0.1] (* 0.478866 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EllipticTheta.html) for more details. # EmptySpaceF `EmptySpaceF[pdata, r]` estimates the empty space function F(r) for point data pdata at radius r. `EmptySpaceF[pproc, r]` computes F(r) for point process pproc. `EmptySpaceF[bdata, r]` computes F(r) for binned data bdata. `EmptySpaceF[pspec]` generates the function F that can be applied repeatedly to different radii r. Examples [#examples] Compute empty space function: ```wolfram EmptySpaceF[RandomPointConfiguration[PoissonPointProcess[1], Disk[]], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EmptySpaceF.html) for more details. # Erf `Erf[z]` gives the error function erf(z), related to the normal distribution. `Erf[z0, z1]` gives erf(z1) - erf(z0). Examples [#examples] Error function values: ```wolfram Erf[0] (* 0 *) Erf[Infinity] (* 1 *) ``` Numerical evaluation: ```wolfram N[Erf[1]] (* 0.842701 *) ``` Generalized form: ```wolfram Erf[0, 2] // N (* 0.995322 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Erf.html) for more details. # Erfc `Erfc[z]` gives the complementary error function erfc(z) = 1 - erf(z). Examples [#examples] Complementary error function: ```wolfram Erfc[0] (* 1 *) Erfc[Infinity] (* 0 *) ``` Numerical evaluation: ```wolfram N[Erfc[1]] (* 0.157299 *) ``` Relation to Erf: ```wolfram Erfc[x] + Erf[x] == 1 (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Erfc.html) for more details. # Erfi `Erfi[z]` gives the imaginary error function erf(iz)/i. Examples [#examples] Evaluate the imaginary error function: ```wolfram Erfi[1.0] (* 1.65043 *) ``` Plot the function: ```wolfram Plot[Erfi[x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Erfi.html) for more details. # EulerAngles `EulerAngles[r]` gives Euler angles \{α,β,γ} corresponding to the rotation matrix r. `EulerAngles[r,{a,b,c}]` gives Euler angles \{α,β,γ} with rotation order \{a,b,c}. Examples [#examples] Get Euler angles from a rotation matrix: ```wolfram EulerAngles[RotationMatrix[Pi/4, {0, 0, 1}]] (* {Pi/4, 0, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerAngles.html) for more details. # EulerCharacteristic `EulerCharacteristic[poly]` gives the Euler characteristic of a poly. Examples [#examples] ```wolfram EulerCharacteristic[Tetrahedron[]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerCharacteristic.html) for more details. # EulerE `EulerE[n]` gives the Euler number E\_n. `EulerE[n, x]` gives the Euler polynomial E\_n(x). Examples [#examples] Euler numbers: ```wolfram Table[EulerE[n], {n, 0, 6}] (* {1, 0, -1, 0, 5, 0, -61} *) ``` Euler polynomial: ```wolfram EulerE[2, x] (* x^2 - x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerE.html) for more details. # EulerGamma `EulerGamma` is Euler's constant γ, with numerical value ≈ 0.577216. Examples [#examples] Numerical value of Euler's constant: ```wolfram N[EulerGamma] (* 0.577216 *) ``` Use in expressions: ```wolfram Limit[Sum[1/k, {k, 1, n}] - Log[n], n -> Infinity] (* EulerGamma *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerGamma.html) for more details. # EulerMatrix `EulerMatrix[{α, β, γ}]` gives the Euler 3D rotation matrix formed by rotating by α around the current z axis, then by β around the current y axis, and then by γ around the current z axis. `EulerMatrix[{α, β, γ}, {a, b, c}]` gives the Euler 3D rotation matrix corresponding to rotations around the specified axes a, b, c. Examples [#examples] Create an Euler rotation matrix: ```wolfram EulerMatrix[{Pi/4, Pi/3, Pi/6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerMatrix.html) for more details. # EulerPhi `EulerPhi[n]` gives the Euler totient function ϕ(n), which counts integers up to n that are coprime to n. Examples [#examples] Count integers coprime to 12: ```wolfram EulerPhi[12] (* 4 *) ``` Totient values for first 10 integers: ```wolfram Table[EulerPhi[n], {n, 1, 10}] (* {1, 1, 2, 2, 4, 2, 6, 4, 6, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerPhi.html) for more details. # EulerianGraphQ `EulerianGraphQ[g]` yields `True` if the graph g is Eulerian (has an Eulerian circuit), and `False` otherwise. Examples [#examples] Test if a complete graph is Eulerian: ```wolfram EulerianGraphQ[CompleteGraph[5]] (* True *) ``` A cycle graph is always Eulerian: ```wolfram EulerianGraphQ[CycleGraph[6]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EulerianGraphQ.html) for more details. # Exp `Exp[z]` gives the exponential of z (e raised to the power z). Examples [#examples] Exponential of 1: ```wolfram Exp[1] (* E *) ``` Numerical evaluation: ```wolfram Exp[1.0] (* 2.71828 *) ``` Exponential identities: ```wolfram Exp[I Pi] (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Exp.html) for more details. # ExpGammaDistribution `ExpGammaDistribution[κ, θ, μ]` represents an exp-gamma distribution with shape parameter κ, scale parameter θ, and location parameter μ. Examples [#examples] Create an exp-gamma distribution: ```wolfram ExpGammaDistribution[2, 1, 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpGammaDistribution.html) for more details. # ExpIntegralE `ExpIntegralE[n, z]` gives the exponential integral function Eₙ(z). Examples [#examples] Compute exponential integral: ```wolfram ExpIntegralE[1, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpIntegralE.html) for more details. # ExpIntegralEi `ExpIntegralEi[z]` gives the exponential integral function Ei(z). Examples [#examples] Compute exponential integral Ei: ```wolfram ExpIntegralEi[2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpIntegralEi.html) for more details. # ExpToTrig `ExpToTrig[expr]` converts exponentials in expr to trigonometric functions. Examples [#examples] Convert exponentials to trig: ```wolfram ExpToTrig[E^(I x)] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpToTrig.html) for more details. # Expand `Expand[expr]` expands out products and positive integer powers in expr. Examples [#examples] Expand a polynomial: ```wolfram Expand[(x + y)^2] (* x^2 + 2 x y + y^2 *) ``` Expand products: ```wolfram Expand[(a + b)(c + d)] (* a c + a d + b c + b d *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Expand.html) for more details. # ExpandAll `ExpandAll[expr]` expands out all products and integer powers in any part of expr. `ExpandAll[expr, patt]` avoids expanding parts of expr that do not contain terms matching the pattern patt. Examples [#examples] ```wolfram ExpandAll[(1 + x)^2 (1 + y)^2] (* 1 + 2 x + x^2 + 2 y + 4 x y + 2 x^2 y + y^2 + 2 x y^2 + x^2 y^2 *) ``` ```wolfram ExpandAll[(a + b)^2 / (c + d)^2] (* (a^2 + 2 a b + b^2)/(c^2 + 2 c d + d^2) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpandAll.html) for more details. # ExpandDenominator `ExpandDenominator[expr]` expands out products and powers that appear as denominators in expr. Examples [#examples] Expand a denominator: ```wolfram ExpandDenominator[1/(a + b)^2] (* 1/(a^2 + 2 a b + b^2) *) ``` Only the denominator is expanded: ```wolfram ExpandDenominator[(x + y)^2/(a + b)^2] (* (x + y)^2/(a^2 + 2 a b + b^2) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpandDenominator.html) for more details. # ExpandFileName `ExpandFileName["name"]` expands name to an absolute file path for your OS. Examples [#examples] Expand home directory: ```wolfram ExpandFileName["~/Documents"] (* "/Users/username/Documents" *) ``` Expand relative path: ```wolfram ExpandFileName["./data"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpandFileName.html) for more details. # ExpandNumerator `ExpandNumerator[expr]` expands out products and powers that appear in the numerator of expr. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpandNumerator.html) for more details. # Expectation `Expectation[expr, x \[Distributed] dist]` gives the expectation of expr under the assumption that x follows the probability distribution dist. Examples [#examples] Expected value of x: ```wolfram Expectation[x, x \[Distributed] NormalDistribution[0, 1]] (* 0 *) ``` Expectation of x^2: ```wolfram Expectation[x^2, x \[Distributed] UniformDistribution[{0, 1}]] (* 1/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Expectation.html) for more details. # ExpectedValue `ExpectedValue[f, list]` gives the expected value of the pure function f with respect to the values in list. `ExpectedValue[f, dist]` gives the expected value of the pure function f with respect to the symbolic distribution dist. Examples [#examples] Expected value from a list: ```wolfram ExpectedValue[#^2 &, {1, 2, 3, 4}] (* 15/2 *) ``` Expected value from a distribution: ```wolfram ExpectedValue[x^2, NormalDistribution[0, 1], x] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExpectedValue.html) for more details. # Exponent `Exponent[expr, form]` gives the maximum power with which form appears in the expanded form of expr. Examples [#examples] Find highest power of x: ```wolfram Exponent[x^3 + 2x^2 + 5x + 1, x] (* 3 *) ``` Exponent in a product: ```wolfram Exponent[x^2 * (1 + x)^3, x] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Exponent.html) for more details. # ExponentialDistribution `ExponentialDistribution[λ]` represents an exponential distribution with rate parameter λ. Examples [#examples] Random samples: ```wolfram RandomVariate[ExponentialDistribution[1], 5] (* {0.32, 1.45, 0.78, 0.12, 2.34} *) ``` Mean is 1/λ: ```wolfram Mean[ExponentialDistribution[2]] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExponentialDistribution.html) for more details. # ExponentialMovingAverage `ExponentialMovingAverage[list, α]` gives the exponential moving average of list with smoothing constant α. Examples [#examples] Compute exponential moving average: ```wolfram ExponentialMovingAverage[{1, 2, 3, 4, 5}, 0.5] (* {1, 1.5, 2.25, 3.125, 4.0625} *) ``` Compare with different smoothing constants: ```wolfram data = {1, 3, 2, 5, 4}; {ExponentialMovingAverage[data, 0.2], ExponentialMovingAverage[data, 0.8]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExponentialMovingAverage.html) for more details. # ExponentialPowerDistribution `ExponentialPowerDistribution[κ,μ,σ]` represents an exponential power distribution with shape parameter κ, location parameter μ, and scale parameter σ. `ExponentialPowerDistribution[κ]` represents an exponential power distribution with location parameter 0 and scale parameter 1. Examples [#examples] Create an exponential power distribution and compute its mean: ```wolfram dist = ExponentialPowerDistribution[2, 0, 1]; Mean[dist] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExponentialPowerDistribution.html) for more details. # Factorial `n!` or `Factorial[n]` gives the factorial of n (the product 1×2×3×...×n). Examples [#examples] Compute factorials: ```wolfram 5! (* 120 *) 10! (* 3628800 *) ``` Factorial of zero: ```wolfram 0! (* 1 *) ``` Large factorials: ```wolfram 100! (* 93326215443944152681699238856266700490715968264381621468592963... *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Factorial.html) for more details. # Factorial2 `n!!` or `Factorial2[n]` gives the double factorial of n (product of every other number from 1 or 2 to n). Examples [#examples] Double factorial of odd numbers: ```wolfram 7!! (* 105 - equals 7×5×3×1 *) ``` Double factorial of even numbers: ```wolfram 8!! (* 384 - equals 8×6×4×2 *) ``` Compare with regular factorial: ```wolfram {5!, 5!!} (* {120, 15} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Factorial2.html) for more details. # FactorialMoment `FactorialMoment[data, r]` gives the order r factorial moment of data. `FactorialMoment[dist, r]` gives the factorial moment of the distribution dist. Examples [#examples] Factorial moment of data: ```wolfram FactorialMoment[{1, 2, 3, 4, 5}, 2] (* 6 *) ``` Factorial moment of a distribution: ```wolfram FactorialMoment[PoissonDistribution[3], 2] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorialMoment.html) for more details. # FactorialMomentGeneratingFunction `FactorialMomentGeneratingFunction[dist, t]` gives the factorial moment-generating function for the distribution dist as a function of t. Examples [#examples] Factorial MGF of Poisson distribution: ```wolfram FactorialMomentGeneratingFunction[PoissonDistribution[λ], t] (* E^(λ (-1 + t)) *) ``` For binomial distribution: ```wolfram FactorialMomentGeneratingFunction[BinomialDistribution[n, p], t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorialMomentGeneratingFunction.html) for more details. # FactorialPower `FactorialPower[x, n]` gives the falling factorial x(x-1)(x-2)...(x-n+1). `FactorialPower[x, n, h]` gives the step-h factorial power. Examples [#examples] Falling factorial: ```wolfram FactorialPower[5, 3] (* 60 - equals 5×4×3 *) ``` With step parameter: ```wolfram FactorialPower[x, 3, 2] (* x(x-2)(x-4) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FactorialPower.html) for more details. # Fibonacci `Fibonacci[n]` gives the nth Fibonacci number. `Fibonacci[n, x]` gives the Fibonacci polynomial Fₙ(x). Examples [#examples] Get Fibonacci numbers: ```wolfram Fibonacci[10] (* 55 *) ``` Generate a sequence: ```wolfram Table[Fibonacci[n], {n, 1, 10}] (* {1, 1, 2, 3, 5, 8, 13, 21, 34, 55} *) ``` A large Fibonacci number: ```wolfram Fibonacci[100] (* 354224848179261915075 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Fibonacci.html) for more details. # Fibonorial `Fibonorial[n]` gives the fibonorial n!\_F (product of the first n Fibonacci numbers). Examples [#examples] Compute the fibonorial of 5: ```wolfram Fibonorial[5] (* 30 *) ``` Compute the fibonorial of 10: ```wolfram Fibonorial[10] (* 122522400 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Fibonorial.html) for more details. # Floor `Floor[x]` gives the greatest integer less than or equal to x. `Floor[x, a]` gives the greatest multiple of a less than or equal to x. Examples [#examples] Floor of a number: ```wolfram Floor[3.7] (* 3 *) Floor[-2.3] (* -3 *) ``` Floor to a multiple: ```wolfram Floor[17, 5] (* 15 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Floor.html) for more details. # FoxHReduce `FoxHReduce[expr, x]` attempts to reduce expr to a single FoxH object as a function of x. Examples [#examples] Reduce an expression to Fox H form: ```wolfram FoxHReduce[Exp[-x], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FoxHReduce.html) for more details. # FresnelC `FresnelC[z]` gives the Fresnel cosine integral C(z). Examples [#examples] Compute Fresnel C: ```wolfram FresnelC[1.0] (* 0.779893 *) ``` Plot the function: ```wolfram Plot[FresnelC[x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FresnelC.html) for more details. # FresnelF `FresnelF[z]` gives the Fresnel auxiliary function F(z). Examples [#examples] Evaluate the Fresnel F function: ```wolfram FresnelF[2] ``` Plot the function: ```wolfram Plot[FresnelF[x], {x, 0, 5}] ``` Compute numerically: ```wolfram N[FresnelF[1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FresnelF.html) for more details. # FresnelG `FresnelG[z]` gives the Fresnel auxiliary function G(z). Examples [#examples] Evaluate the Fresnel G function: ```wolfram FresnelG[2] ``` Plot the function: ```wolfram Plot[FresnelG[x], {x, 0, 5}] ``` Compute numerically: ```wolfram N[FresnelG[1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FresnelG.html) for more details. # FresnelS `FresnelS[z]` gives the Fresnel sine integral S(z). Examples [#examples] Compute Fresnel S: ```wolfram FresnelS[1.0] (* 0.438259 *) ``` Plot the function: ```wolfram Plot[FresnelS[x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FresnelS.html) for more details. # FrobeniusNumber `FrobeniusNumber[{a1, ..., an}]` gives the Frobenius number of a1, ..., an. Examples [#examples] Find the Frobenius number for two values: ```wolfram FrobeniusNumber[{3, 5}] ``` For three values: ```wolfram FrobeniusNumber[{6, 9, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FrobeniusNumber.html) for more details. # GCD `GCD[n1, n2, ...]` gives the greatest common divisor of the integers. Examples [#examples] Find GCD of two numbers: ```wolfram GCD[12, 18] (* 6 *) ``` GCD of multiple numbers: ```wolfram GCD[24, 36, 48] (* 12 *) ``` GCD of coprime numbers: ```wolfram GCD[7, 11] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GCD.html) for more details. # GaborWavelet `GaborWavelet[]` represents a Gabor wavelet of frequency 6. * `GaborWavelet[w]` represents a Gabor wavelet of frequency w. Examples [#examples] Create a default Gabor wavelet: ```wolfram GaborWavelet[] ``` Create with custom frequency: ```wolfram GaborWavelet[4] ``` Plot the wavelet: ```wolfram Plot[Evaluate[GaborWavelet[][x]], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaborWavelet.html) for more details. # Gamma `Gamma[z]` is the Euler gamma function Γ(z). `Gamma[a, z]` is the incomplete gamma function. Examples [#examples] Gamma function values: ```wolfram Gamma[5] (* 24 - equals (5-1)! = 4! *) Gamma[1/2] (* Sqrt[Pi] *) ``` Numerical evaluation: ```wolfram N[Gamma[3.5]] (* 3.32335 *) ``` Incomplete gamma function: ```wolfram Gamma[2, 1] // N (* 0.735759 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Gamma.html) for more details. # GammaDistribution `GammaDistribution[α, β]` represents a gamma distribution with shape parameter α and scale parameter β. Examples [#examples] Generate random samples: ```wolfram RandomVariate[GammaDistribution[2, 1], 5] ``` Mean and variance: ```wolfram {Mean[GammaDistribution[α, β]], Variance[GammaDistribution[α, β]]} (* {α β, α β^2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GammaDistribution.html) for more details. # GammaRegularized `GammaRegularized[a, z]` is the regularized incomplete gamma function Q(a,z). Examples [#examples] Compute regularized gamma: ```wolfram GammaRegularized[2, 1] (* 2/E *) ``` Numerical value: ```wolfram N[GammaRegularized[3, 2]] (* 0.676676 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GammaRegularized.html) for more details. # GegenbauerC `GegenbauerC[n, m, x]` gives the Gegenbauer polynomial C\_n^(m)(x). * `GegenbauerC[n, x]` gives the renormalized form. Examples [#examples] Compute a Gegenbauer polynomial: ```wolfram GegenbauerC[3, 1, x] ``` Plot Gegenbauer polynomials: ```wolfram Plot[Table[GegenbauerC[n, 1, x], {n, 0, 4}], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GegenbauerC.html) for more details. # Glaisher `Glaisher` is Glaisher's constant with numerical value ≈1.28243. Examples [#examples] ```wolfram N[Glaisher] (* 1.28243 *) ``` ```wolfram N[Glaisher, 20] (* 1.2824271291006226369 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Glaisher.html) for more details. # GoldenAngle `GoldenAngle` is the golden angle (3-√5)π, with numerical value ≈137.5°. Examples [#examples] Get the golden angle: ```wolfram GoldenAngle (* GoldenAngle *) ``` Numerical value in radians: ```wolfram N[GoldenAngle] (* 2.39996 *) ``` Convert to degrees: ```wolfram N[GoldenAngle/Degree] (* 137.508 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GoldenAngle.html) for more details. # GoldenRatio `GoldenRatio` is the golden ratio φ = (1 + √5)/2, with numerical value ≈ 1.61803. Examples [#examples] Numerical value: ```wolfram N[GoldenRatio] (* 1.61803 *) ``` Golden ratio property: ```wolfram GoldenRatio^2 - GoldenRatio - 1 // Simplify (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GoldenRatio.html) for more details. # Groupings `Groupings[n, k]` gives a list of all possible groupings of `1, …, n` taken `k` at a time. * `Groupings[{a1, …, an}, k]` gives all possible groupings of `a1, …, an` taken `k` at a time. * `Groupings[{{a1, a2, …}, {b1, b2, …}, …}, k]` gives the combination of all possible groupings of each of the lists `ai, bi, …` taken `k` at a time. * `Groupings[aspec, f -> k]` gives all possible groupings of `aspec` taken `k` at a time with the function `f` applied at each level. * `Groupings[aspec, {f1 -> k1, f2 -> k2, …}]` gives all possible groupings in which the function `fi` is applied to `ki` elements. * `Groupings[aspec, {{f1 -> k1, m1}, {f2 -> k2, m2}, …}]` allows at most `mi` occurrences in a given grouping of `fi` applied to `ki` elements. * `Groupings[aspec, kspec, h]` wraps the function `h` around each grouping generated. Examples [#examples] ```wolfram Groupings[3, 2] ``` ```wolfram Groupings[{a, b, c}, 2] ``` ```wolfram Groupings[{x, y, z}, f -> 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Groupings.html) for more details. # Gudermannian `Gudermannian[z]` gives the Gudermannian function gd(z). Examples [#examples] Compute the Gudermannian of a value: ```wolfram Gudermannian[1.0] (* 0.865769 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Gudermannian.html) for more details. # HaarWavelet `HaarWavelet[]` represents a Haar wavelet. Examples [#examples] Perform a discrete wavelet transform using Haar wavelet: ```wolfram DiscreteWaveletTransform[{1, 2, 3, 4, 5, 6, 7, 8}, HaarWavelet[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HaarWavelet.html) for more details. # HankelH1 `HankelH1[n, z]` gives the Hankel function of the first kind $H_n^{(1)}(z)$. Examples [#examples] ```wolfram HankelH1[0, 1.0] (* 0.765198 + 0.088257 I *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HankelH1.html) for more details. # HankelH2 `HankelH2[n, z]` gives the Hankel function of the second kind $H_n^{(2)}(z)$. Examples [#examples] Compute Hankel H2: ```wolfram HankelH2[0, 1.0] (* 0.765198 - 0.088257 I *) ``` Plot the real part: ```wolfram Plot[Re[HankelH2[0, x]], {x, 0.1, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HankelH2.html) for more details. # HankelMatrix `HankelMatrix[n]` gives the n×n Hankel matrix with first row and first column being successive integers. * `HankelMatrix[{c1, c2, ..., cn}]` gives the Hankel matrix whose first column consists of entries c1, c2, .... * `HankelMatrix[{c1, c2, ..., cm}, {r1, r2, ..., rn}]` gives the Hankel matrix with entries ci down the first column, and ri across the last row. Examples [#examples] Create a 4×4 Hankel matrix: ```wolfram HankelMatrix[4] ``` Create a Hankel matrix with custom first column: ```wolfram HankelMatrix[{a, b, c, d}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HankelMatrix.html) for more details. # HankelTransform `HankelTransform[expr, r, s]` gives the Hankel transform of order 0 for expr. `HankelTransform[expr, r, s, ν]` gives the Hankel transform of order ν for expr. Examples [#examples] ```wolfram HankelTransform[r^2 Exp[-r], r, s] (* (2 (4 - s^2))/(1 + s^2)^(5/2) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HankelTransform.html) for more details. # HarmonicNumber `HarmonicNumber[n]` gives the nth harmonic number Hn. `HarmonicNumber[n,r]` gives the harmonic number Hn(r) of order r. Examples [#examples] Compute the 10th harmonic number: ```wolfram HarmonicNumber[10] (* 7381/2520 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HarmonicNumber.html) for more details. # Haversine `Haversine[z]` gives the haversine function hav(z) = (1 - cos(z))/2. Examples [#examples] Compute haversine: ```wolfram Haversine[Pi] (* 1 *) ``` Haversine of 0: ```wolfram Haversine[0] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Haversine.html) for more details. # HermiteH `HermiteH[n, x]` gives the Hermite polynomial H\_n(x), used in quantum mechanics and probability. Examples [#examples] Hermite polynomials: ```wolfram HermiteH[0, x] (* 1 *) HermiteH[2, x] (* -2 + 4*x^2 *) HermiteH[3, x] (* -12*x + 8*x^3 *) ``` Numerical value: ```wolfram HermiteH[4, 2] (* 76 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HermiteH.html) for more details. # HeunB `HeunB[q, α, γ, δ, ϵ, z]` gives the bi-confluent Heun function. Examples [#examples] ```wolfram HeunB[1, 2, 3, 4, 5, 0.5] ``` ```wolfram Plot[HeunB[1, 1, 1, 1, 1, x], {x, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunB.html) for more details. # HeunBPrime `HeunBPrime[q, α, γ, δ, ϵ, z]` gives the z-derivative of the HeunB function. Examples [#examples] ```wolfram HeunBPrime[1, 2, 3, 4, 5, 0.5] ``` ```wolfram Plot[HeunBPrime[1, 1, 1, 1, 1, x], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunBPrime.html) for more details. # HeunC `HeunC[q, α, γ, δ, ϵ, z]` gives the confluent Heun function. Examples [#examples] ```wolfram HeunC[1, 2, 3, 4, 5, 0.5] ``` ```wolfram Plot[HeunC[1, 1, 1, 1, 1, x], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunC.html) for more details. # HeunCPrime `HeunCPrime[q,α,γ,δ,ϵ,z]` gives the z-derivative of the HeunC function. Examples [#examples] Evaluate the derivative of HeunC: ```wolfram HeunCPrime[1, 2, 1, 1, 1, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunCPrime.html) for more details. # HeunD `HeunD[q, α, γ, δ, ϵ, z]` gives the double-confluent Heun function. Examples [#examples] Evaluate at a point: ```wolfram HeunD[1, 2, 0.5, 0.5, 0.5, 0.3] ``` Symbolic form: ```wolfram HeunD[q, a, g, d, e, z] ``` Plot the function: ```wolfram Plot[HeunD[1, 1, 0.5, 0.5, 0.5, x], {x, 0, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunD.html) for more details. # HeunDPrime `HeunDPrime[q, α, γ, δ, ϵ, z]` gives the z-derivative of the `HeunD` function. Examples [#examples] Evaluate the derivative of HeunD: ```wolfram HeunDPrime[1, 2, 3, 4, 5, 0.5] ``` Symbolic derivative: ```wolfram HeunDPrime[q, a, g, d, e, z] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunDPrime.html) for more details. # HeunG `HeunG[a, q, α, β, γ, δ, z]` gives the general Heun function. Examples [#examples] ```wolfram HeunG[0.5, 1, 2, 3, 4, 5, 0.25] ``` ```wolfram Plot[HeunG[0.5, 1, 1, 1, 1, 1, x], {x, 0, 0.4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunG.html) for more details. # HeunGPrime `HeunGPrime[a, q, α, β, γ, δ, z]` gives the z-derivative of the `HeunG` function. Examples [#examples] ```wolfram HeunGPrime[2, 1, 1, 1, 1, 1, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunGPrime.html) for more details. # HeunT `HeunT[q, α, γ, δ, ϵ, z]` gives the tri-confluent Heun function. Examples [#examples] ```wolfram HeunT[1, 2, 3, 4, 5, 0.5] ``` ```wolfram Plot[HeunT[1, 1, 1, 1, 1, x], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunT.html) for more details. # HeunTPrime `HeunTPrime[q, α, γ, δ, ϵ, z]` gives the z-derivative of the HeunT function. Examples [#examples] ```wolfram HeunTPrime[1, 2, 1/2, 1/3, 1/4, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeunTPrime.html) for more details. # HilbertCurve `HilbertCurve[n]` gives the line segments representing the nth-step Hilbert curve. * `HilbertCurve[n, d]` gives the nth-step Hilbert curve in dimension `d`. Examples [#examples] ```wolfram Graphics[HilbertCurve[3]] ``` ```wolfram Graphics3D[HilbertCurve[2, 3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HilbertCurve.html) for more details. # HurwitzLerchPhi `HurwitzLerchPhi[z,s,a]` gives the Hurwitz–Lerch transcendent Φ(z,s,a). Examples [#examples] Evaluate the Hurwitz-Lerch transcendent: ```wolfram HurwitzLerchPhi[1/2, 2, 1] (* Pi^2/12 - Log[2]^2/2 *) ``` Numerical evaluation: ```wolfram N[HurwitzLerchPhi[0.5, 2, 3]] (* 0.138629 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HurwitzLerchPhi.html) for more details. # HurwitzZeta `HurwitzZeta[s, a]` gives the Hurwitz zeta function ζ(s, a). Examples [#examples] Compute Hurwitz zeta: ```wolfram HurwitzZeta[2, 1] (* Pi^2/6 - same as Zeta[2] *) ``` Numerical evaluation: ```wolfram HurwitzZeta[3, 0.5] // N (* 8.66905 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HurwitzZeta.html) for more details. # Hyperfactorial `Hyperfactorial[n]` gives the hyperfactorial function H(n). Examples [#examples] Compute hyperfactorial: ```wolfram Hyperfactorial[5] ``` Numerical value: ```wolfram N[Hyperfactorial[10]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hyperfactorial.html) for more details. # Hypergeometric0F1 `Hypergeometric0F1[a, z]` is the confluent hypergeometric function $_0F_1(;a;z)$. Examples [#examples] Compute the function: ```wolfram Hypergeometric0F1[2, 1.0] (* 1.59064 *) ``` Relation to Bessel functions: ```wolfram Hypergeometric0F1[1, -x^2/4] // FullSimplify (* BesselJ[0, x] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric0F1.html) for more details. # Hypergeometric0F1Regularized `Hypergeometric0F1Regularized[a, z]` is the regularized confluent hypergeometric function ₀F₁(;a;z)/Γ(a). Examples [#examples] ```wolfram Hypergeometric0F1Regularized[2, 1] ``` ```wolfram Plot[Hypergeometric0F1Regularized[3, x], {x, -10, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric0F1Regularized.html) for more details. # Hypergeometric1F1 `Hypergeometric1F1[a, b, z]` is the Kummer confluent hypergeometric function $_1F_1(a;b;z)$. Examples [#examples] Compute the function: ```wolfram Hypergeometric1F1[1, 2, 1.0] (* 1.71828 *) ``` Special values: ```wolfram Hypergeometric1F1[1, 1, z] (* E^z *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric1F1.html) for more details. # Hypergeometric1F1Regularized `Hypergeometric1F1Regularized[a, b, z]` is the regularized confluent hypergeometric function ₁F₁(a; b; z)/Γ(b). Examples [#examples] ```wolfram Hypergeometric1F1Regularized[1, 2, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric1F1Regularized.html) for more details. # Hypergeometric2F1 `Hypergeometric2F1[a, b, c, z]` is the hypergeometric function 2F1(a,b;c;z). Examples [#examples] ```wolfram Hypergeometric2F1[1, 2, 3, 0.5] (* 1.54518 *) ``` ```wolfram Hypergeometric2F1[1/2, 1/2, 1, z] (* represents the complete elliptic integral *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric2F1.html) for more details. # Hypergeometric2F1Regularized `Hypergeometric2F1Regularized[a, b, c, z]` is the regularized hypergeometric function 2F1(a, b; c; z)/Γ(c). Examples [#examples] ```wolfram Hypergeometric2F1Regularized[1, 2, 3, 0.5] ``` ```wolfram Plot[Hypergeometric2F1Regularized[1, 1, 2, x], {x, 0, 0.9}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Hypergeometric2F1Regularized.html) for more details. # HypergeometricDistribution `HypergeometricDistribution[n, nsucc, ntot]` represents a hypergeometric distribution for n draws from a population of ntot with nsucc successes. Examples [#examples] Create a hypergeometric distribution: ```wolfram dist = HypergeometricDistribution[10, 30, 100]; Mean[dist] (* 3 *) ``` Probability of exactly 5 successes: ```wolfram PDF[HypergeometricDistribution[10, 30, 100], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypergeometricDistribution.html) for more details. # HypergeometricPFQ `HypergeometricPFQ[{a1,…,ap},{b1,…,bq},z]` is the generalized hypergeometric function pFq(a;b;z). Examples [#examples] Evaluate a generalized hypergeometric function: ```wolfram HypergeometricPFQ[{1, 2}, {3}, 0.5] (* 1.54518 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypergeometricPFQ.html) for more details. # HypergeometricPFQRegularized `HypergeometricPFQRegularized[{a1,…,ap},{b1,…,bq},z]` is the regularized generalized hypergeometric function pFq(a;b;z)/(Γ(b1)…Γ(bq)). Examples [#examples] Evaluate a regularized hypergeometric function: ```wolfram HypergeometricPFQRegularized[{1, 2}, {3}, 0.5] ``` Compare with the non-regularized form: ```wolfram HypergeometricPFQ[{1, 2}, {3}, 0.5] / Gamma[3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypergeometricPFQRegularized.html) for more details. # HypergeometricU `HypergeometricU[a, b, z]` is the Tricomi confluent hypergeometric function U(a, b, z). Examples [#examples] Compute the function: ```wolfram HypergeometricU[1, 2, 1.0] (* 0.596347 *) ``` Asymptotic behavior: ```wolfram Series[HypergeometricU[a, b, z], {z, Infinity, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypergeometricU.html) for more details. # I `I` represents the imaginary unit $\sqrt{-1}$. Examples [#examples] Use in complex numbers: ```wolfram (2 + 3 I) * (1 - I) (* 5 + I *) ``` Square of I: ```wolfram I^2 (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/I.html) for more details. # Im `Im[z]` gives the imaginary part of the complex number z. Examples [#examples] Get imaginary part: ```wolfram Im[3 + 4 I] (* 4 *) ``` Imaginary part of real number: ```wolfram Im[5] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Im.html) for more details. # Indeterminate `Indeterminate` is a symbol that represents a numerical quantity whose magnitude cannot be determined. Examples [#examples] ```wolfram 0/0 ``` ```wolfram Infinity - Infinity ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Indeterminate.html) for more details. # Infinity `Infinity` or `∞` is a symbol that represents a positive infinite quantity. Examples [#examples] Use in limits: ```wolfram Limit[1/x, x -> 0, Direction -> -1] (* Infinity *) ``` In sums: ```wolfram Sum[1/n^2, {n, 1, Infinity}] (* Pi^2/6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Infinity.html) for more details. # InverseErf `InverseErf[s]` gives the inverse error function, solving for z in s = erf(z). Examples [#examples] Compute inverse: ```wolfram InverseErf[0.5] (* 0.476936 *) ``` Verify relationship: ```wolfram Erf[InverseErf[0.8]] (* 0.8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseErf.html) for more details. # InverseErfc `InverseErfc[s]` gives the inverse complementary error function, solving for z in s = erfc(z). Examples [#examples] Compute inverse: ```wolfram InverseErfc[0.5] (* 0.476936 *) ``` Verify relationship: ```wolfram Erfc[InverseErfc[1.5]] (* 1.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseErfc.html) for more details. # InverseGudermannian `InverseGudermannian[z]` gives the inverse Gudermannian function gd⁻¹(z). Examples [#examples] Compute the inverse Gudermannian: ```wolfram InverseGudermannian[Pi/4] ``` Verify the inverse: ```wolfram Gudermannian[InverseGudermannian[0.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseGudermannian.html) for more details. # InverseHaversine `InverseHaversine[z]` gives the inverse haversine function hav⁻¹(z). Examples [#examples] Compute inverse: ```wolfram InverseHaversine[0.5] (* 1.5708 *) ``` Verify relationship: ```wolfram Haversine[InverseHaversine[0.25]] (* 0.25 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InverseHaversine.html) for more details. # JacobiAmplitude `JacobiAmplitude[u, m]` gives the amplitude am(u|m) for Jacobi elliptic functions. Examples [#examples] ```wolfram JacobiAmplitude[1, 0.5] ``` ```wolfram Plot[JacobiAmplitude[u, 0.8], {u, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiAmplitude.html) for more details. # JacobiCD `JacobiCD[u,m]` gives the Jacobi elliptic function cd(u|m). Examples [#examples] Evaluate the Jacobi CD function: ```wolfram JacobiCD[0.5, 0.3] (* 0.938791 *) ``` Plot the function: ```wolfram Plot[JacobiCD[x, 0.5], {x, 0, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiCD.html) for more details. # JacobiCN `JacobiCN[u, m]` gives the Jacobi elliptic function cn(u|m). Examples [#examples] ```wolfram JacobiCN[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiCN.html) for more details. # JacobiCS `JacobiCS[u, m]` gives the Jacobi elliptic function cs(u|m). Examples [#examples] ```wolfram JacobiCS[0, 0.5] (* ComplexInfinity *) ``` ```wolfram N[JacobiCS[1.0, 0.5]] (* 0.740839 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiCS.html) for more details. # JacobiDC `JacobiDC[u, m]` gives the Jacobi elliptic function dc(u|m). Examples [#examples] Evaluate a Jacobi DC function: ```wolfram JacobiDC[0.5, 0.3] (* 1.03819 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiDC.html) for more details. # JacobiDN `JacobiDN[u, m]` gives the Jacobi elliptic function dn(u|m). Examples [#examples] Compute Jacobi DN: ```wolfram JacobiDN[0.5, 0.3] ``` Plot the function: ```wolfram Plot[JacobiDN[x, 0.5], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiDN.html) for more details. # JacobiDS `JacobiDS[u, m]` gives the Jacobi elliptic function ds(u|m). Examples [#examples] ```wolfram JacobiDS[0, 0.5] (* ComplexInfinity *) ``` ```wolfram N[JacobiDS[1, 0.5]] (* 1.02881 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiDS.html) for more details. # JacobiEpsilon `JacobiEpsilon[u, m]` gives the Jacobi epsilon function ℰ(u|m). The Jacobi epsilon function is related to elliptic integrals and is used in the theory of elliptic functions. Examples [#examples] ```wolfram JacobiEpsilon[0.5, 0.3] ``` ```wolfram N[JacobiEpsilon[1, 1/2]] ``` ```wolfram Plot[JacobiEpsilon[u, 0.5], {u, 0, 4}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiEpsilon.html) for more details. # JacobiNC `JacobiNC[u, m]` gives the Jacobi elliptic function nc(u|m). Examples [#examples] ```wolfram JacobiNC[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiNC.html) for more details. # JacobiND `JacobiND[u, m]` gives the Jacobi elliptic function nd(u|m). Examples [#examples] ```wolfram JacobiND[0.5, 0.3] ``` ```wolfram Plot[JacobiND[u, 0.5], {u, 0, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiND.html) for more details. # JacobiNS `JacobiNS[u, m]` gives the Jacobi elliptic function ns(u|m). Examples [#examples] Evaluate at a point: ```wolfram JacobiNS[0.5, 0.3] ``` Plot the function: ```wolfram Plot[JacobiNS[u, 0.5], {u, 0, 4}] ``` Symbolic value: ```wolfram JacobiNS[0, m] (* ComplexInfinity *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiNS.html) for more details. # JacobiP `JacobiP[n, a, b, x]` gives the Jacobi polynomial $P_n^{(a,b)}(x)$. Examples [#examples] Jacobi polynomial: ```wolfram JacobiP[3, 1, 2, x] ``` Evaluate at a point: ```wolfram JacobiP[4, 0, 0, 0.5] // N (* -0.289063 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiP.html) for more details. # JacobiSC `JacobiSC[u, m]` gives the Jacobi elliptic function sc(u|m). Examples [#examples] Evaluate at a point: ```wolfram JacobiSC[0.5, 0.3] ``` Plot the function: ```wolfram Plot[JacobiSC[u, 0.5], {u, 0, 4}] ``` Relation to other Jacobi functions: ```wolfram JacobiSC[u, m] == JacobiSN[u, m]/JacobiCN[u, m] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiSC.html) for more details. # JacobiSD `JacobiSD[u, m]` gives the Jacobi elliptic function sd(u|m). Examples [#examples] ```wolfram JacobiSD[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiSD.html) for more details. # JacobiSN `JacobiSN[u, m]` gives the Jacobi elliptic function sn(u|m). Examples [#examples] ```wolfram JacobiSN[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiSN.html) for more details. # JacobiSymbol `JacobiSymbol[n, m]` gives the Jacobi symbol (n/m). Examples [#examples] Compute Jacobi symbol: ```wolfram JacobiSymbol[3, 7] (* -1 *) ``` For prime modulus (Legendre symbol): ```wolfram JacobiSymbol[2, 11] (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiSymbol.html) for more details. # JacobiZN `JacobiZN[u, m]` gives the Jacobi zeta function zn(u|m). The Jacobi zeta function is related to incomplete elliptic integrals and is useful in the theory of elliptic functions. Examples [#examples] ```wolfram JacobiZN[0.5, 0.3] ``` ```wolfram N[JacobiZN[1, 1/2]] ``` ```wolfram Plot[JacobiZN[u, 0.5], {u, 0, 4}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiZN.html) for more details. # JacobiZeta `JacobiZeta[φ, m]` gives the Jacobi zeta function Z(φ|m). Examples [#examples] Compute Jacobi zeta: ```wolfram JacobiZeta[Pi/4, 0.5] (* 0.159213 *) ``` Plot the function: ```wolfram Plot[JacobiZeta[x, 0.5], {x, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JacobiZeta.html) for more details. # K `K` is a default generic name for a summation index in a symbolic sum. Examples [#examples] K appears as a summation index: ```wolfram Sum[f[k], {k, 1, n}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/K.html) for more details. # KelvinBei `KelvinBei[z]` gives the Kelvin function bei(z). `KelvinBei[n, z]` gives the Kelvin function bei\_n(z). Examples [#examples] Compute Kelvin bei: ```wolfram KelvinBei[2.0] (* 0.249218 *) ``` Plot: ```wolfram Plot[KelvinBei[x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KelvinBei.html) for more details. # KelvinBer `KelvinBer[z]` gives the Kelvin function ber(z). `KelvinBer[n, z]` gives the Kelvin function ber\_n(z). Examples [#examples] Compute Kelvin ber: ```wolfram KelvinBer[2.0] (* 0.754321 *) ``` Plot: ```wolfram Plot[KelvinBer[x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KelvinBer.html) for more details. # KelvinKei `KelvinKei[z]` gives the Kelvin function kei(z). `KelvinKei[n, z]` gives the Kelvin function kein(z). Examples [#examples] Evaluate the Kelvin kei function: ```wolfram KelvinKei[2.0] (* 0.11903 *) ``` Plot the function: ```wolfram Plot[KelvinKei[x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KelvinKei.html) for more details. # KelvinKer `KelvinKer[z]` gives the Kelvin function ker(z). `KelvinKer[n, z]` gives the Kelvin function ker\_n(z). Examples [#examples] Compute Kelvin ker: ```wolfram KelvinKer[2.0] (* -0.04166 *) ``` Plot: ```wolfram Plot[KelvinKer[x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KelvinKer.html) for more details. # Khinchin `Khinchin` is Khinchin's constant, with numerical value ≈ 2.68545. Examples [#examples] ```wolfram N[Khinchin, 50] ``` ```wolfram Khinchin // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Khinchin.html) for more details. # KleinInvariantJ `KleinInvariantJ[τ]` gives the Klein invariant modular elliptic function J(τ). Examples [#examples] Evaluate at a complex value: ```wolfram KleinInvariantJ[I] // N (* 1. *) ``` Plot the real part: ```wolfram Plot3D[Re[KleinInvariantJ[x + I y]], {x, -1, 1}, {y, 0.5, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KleinInvariantJ.html) for more details. # KochCurve `KochCurve[n]` gives the line segments representing the nth-step Koch curve. * `KochCurve[n, {θ1, θ2, …}]` takes a series of steps of unit length at successive relative angles `θi`. * `KochCurve[n, {{r1, θ1}, {r2, θ2}, …}]` takes successive steps of lengths proportional to `ri`. Examples [#examples] ```wolfram Graphics[KochCurve[4]] ``` ```wolfram Graphics[KochCurve[3, {60 Degree, -120 Degree, 60 Degree, 0}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KochCurve.html) for more details. # KroneckerDelta `KroneckerDelta[n1, n2, ...]` gives the Kronecker delta δ\_\{n1 n2 ...}, equal to 1 if all the n\_i are equal, and 0 otherwise. Examples [#examples] Equal arguments: ```wolfram KroneckerDelta[3, 3] (* 1 *) ``` Unequal arguments: ```wolfram KroneckerDelta[1, 2] (* 0 *) ``` Multiple arguments: ```wolfram KroneckerDelta[5, 5, 5] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KroneckerDelta.html) for more details. # KroneckerSymbol `KroneckerSymbol[n, m]` gives the Kronecker symbol (n/m). Examples [#examples] Compute the Kronecker symbol: ```wolfram KroneckerSymbol[2, 5] (* -1 *) ``` Another example: ```wolfram KroneckerSymbol[3, 7] (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KroneckerSymbol.html) for more details. # LCM `LCM[n1, n2, ...]` gives the least common multiple of the integers. Examples [#examples] Find LCM of two numbers: ```wolfram LCM[4, 6] (* 12 *) ``` LCM of multiple numbers: ```wolfram LCM[3, 4, 5] (* 60 *) ``` LCM of coprime numbers: ```wolfram LCM[7, 11] (* 77 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LCM.html) for more details. # LameC `LameC[ν, j, z, m]` gives the jth Lamé function Ec\_ν^(j)(z|m) of order ν with elliptic parameter m. Examples [#examples] ```wolfram LameC[2, 1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameC.html) for more details. # LameCPrime `LameCPrime[ν,j,z,m]` gives the z-derivative of the jth Lamé function Ecν(j)(zm) of order ν with elliptic parameter m. Examples [#examples] Evaluate the derivative of a Lamé function: ```wolfram LameCPrime[2, 1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameCPrime.html) for more details. # LameEigenvalueA `LameEigenvalueA[ν,j,m]` gives the jth Lamé eigenvalue aν(j)(m) of order ν with elliptic parameter m for the function LameC\[ν,j,z,m]. Examples [#examples] Compute a Lamé eigenvalue: ```wolfram LameEigenvalueA[2, 1, 0.5] (* 1.5 *) ``` Evaluate symbolically: ```wolfram LameEigenvalueA[1, 1, m] (* 1 + m *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameEigenvalueA.html) for more details. # LameEigenvalueB `LameEigenvalueB[ν, j, m]` gives the jth Lamé eigenvalue b\_ν^\{(j)}(m) of order ν with elliptic parameter m for the Lamé function `LameS[ν, j, z, m]`. Examples [#examples] ```wolfram LameEigenvalueB[2, 1, 0.5] ``` ```wolfram Table[LameEigenvalueB[3, j, 0.3], {j, 1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameEigenvalueB.html) for more details. # LameS `LameS[ν,j,z,m]` gives the jth Lamé function Esν(j)(zm) of order ν with elliptic parameter m. Examples [#examples] ```wolfram LameS[2, 1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameS.html) for more details. # LameSPrime `LameSPrime[ν,j,z,m]` gives the z-derivative of the jth Lamé function Esν(j)(zm) of order ν with elliptic parameter m. Examples [#examples] ```wolfram LameSPrime[2, 1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LameSPrime.html) for more details. # LerchPhi `LerchPhi[z, s, a]` gives the Lerch transcendent Φ(z, s, a). Examples [#examples] Evaluate the Lerch transcendent: ```wolfram LerchPhi[0.5, 2, 1] // N (* 1.64493 *) ``` Relation to Riemann zeta: ```wolfram LerchPhi[1, s, 1] == Zeta[s] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LerchPhi.html) for more details. # LeviCivitaTensor `LeviCivitaTensor[d]` gives the d-dimensional Levi-Civita totally antisymmetric tensor. Examples [#examples] 3D Levi-Civita tensor: ```wolfram LeviCivitaTensor[3] ``` 2D case: ```wolfram LeviCivitaTensor[2] // Normal (* {{0, 1}, {-1, 0}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeviCivitaTensor.html) for more details. # LiftingWaveletTransform `LiftingWaveletTransform[data]` gives the lifting wavelet transform (LWT) of an array of data. * `LiftingWaveletTransform[data, wave]` gives the lifting wavelet transform using the wavelet wave. * `LiftingWaveletTransform[data, wave, r]` gives the lifting wavelet transform using r levels of refinement. Examples [#examples] ```wolfram data = Table[Sin[x], {x, 0, 2 Pi, 0.1}]; LiftingWaveletTransform[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LiftingWaveletTransform.html) for more details. # LiouvilleLambda `LiouvilleLambda[n]` gives the Liouville function λ(n). Examples [#examples] Calculate the Liouville function: ```wolfram LiouvilleLambda[12] (* 1 *) ``` For prime numbers, λ(p) = -1: ```wolfram LiouvilleLambda[7] (* -1 *) ``` Table of Liouville values: ```wolfram Table[LiouvilleLambda[n], {n, 1, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LiouvilleLambda.html) for more details. # Log `Log[z]` gives the natural logarithm of z (logarithm to base e). `Log[b, z]` gives the logarithm to base b. Examples [#examples] Natural logarithm: ```wolfram Log[E] (* 1 *) Log[E^2] (* 2 *) ``` Logarithm with a base: ```wolfram Log[10, 1000] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Log.html) for more details. # Log10 `Log10[x]` gives the base-10 logarithm of x. Examples [#examples] ```wolfram Log10[1000] (* 3 *) ``` ```wolfram Log10[100.0] (* 2. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Log10.html) for more details. # Log2 `Log2[x]` gives the base-2 logarithm of x. Examples [#examples] ```wolfram Log2[8] (* 3 *) ``` ```wolfram Log2[1024] (* 10 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Log2.html) for more details. # LogBarnesG `LogBarnesG[z]` gives the logarithm of the Barnes G-function log G(z). Examples [#examples] Compute the log Barnes G: ```wolfram LogBarnesG[5] ``` Numerical evaluation: ```wolfram N[LogBarnesG[3.5]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogBarnesG.html) for more details. # LogGamma `LogGamma[z]` gives the logarithm of the gamma function log Γ(z). Examples [#examples] Compute log gamma: ```wolfram LogGamma[5] (* Log[24] *) ``` Numerical value: ```wolfram LogGamma[10.0] (* 12.8018 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogGamma.html) for more details. # LogGammaDistribution `LogGammaDistribution[α, β, μ]` represents a log-gamma distribution with shape parameters α and β and location parameter μ. Examples [#examples] ```wolfram dist = LogGammaDistribution[2, 1, 0]; PDF[dist, x] ``` ```wolfram RandomVariate[LogGammaDistribution[1, 2, 0], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogGammaDistribution.html) for more details. # LogIntegral `LogIntegral[z]` gives the logarithmic integral function li(z). Examples [#examples] Compute log integral: ```wolfram LogIntegral[10.0] (* 6.16554 *) ``` Plot: ```wolfram Plot[LogIntegral[x], {x, 2, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogIntegral.html) for more details. # LogLikelihood `LogLikelihood[dist, {x1, x2, ...}]` gives the log‐likelihood function for observations x1, x2, … from the distribution dist. * `LogLikelihood[proc, {{t1, x1}, {t2, x2}, ...}]` gives the log-likelihood function for the observations xi at time ti from the process proc. * `LogLikelihood[proc, {path1, path2, ...}]` gives the log-likelihood function for the observations from path1, path2, … from the process proc. Examples [#examples] ```wolfram LogLikelihood[NormalDistribution[μ, σ], {1, 2, 3, 4}] ``` ```wolfram LogLikelihood[PoissonDistribution[λ], {0, 1, 2, 1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogLikelihood.html) for more details. # LogLogisticDistribution `LogLogisticDistribution[γ, σ]` represents a log-logistic distribution with shape parameter γ and scale parameter σ. Examples [#examples] ```wolfram dist = LogLogisticDistribution[2, 1]; PDF[dist, x] ``` ```wolfram RandomVariate[LogLogisticDistribution[3, 2], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogLogisticDistribution.html) for more details. # LogMultinormalDistribution `LogMultinormalDistribution[μ, Σ]` represents a log-multinormal distribution with parameters μ and Σ. Examples [#examples] ```wolfram dist = LogMultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}]; RandomVariate[dist, 5] ``` ```wolfram Mean[LogMultinormalDistribution[{1, 2}, IdentityMatrix[2]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogMultinormalDistribution.html) for more details. # LogNormalDistribution `LogNormalDistribution[μ, σ]` represents a lognormal distribution derived from a normal distribution with mean μ and standard deviation σ. Examples [#examples] ```wolfram Mean[LogNormalDistribution[0, 1]] (* Sqrt[E] *) ``` ```wolfram RandomVariate[LogNormalDistribution[0, 0.5], 5] (* {1.23, 0.87, 1.56, 0.92, 1.12} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogNormalDistribution.html) for more details. # LogRankTest `LogRankTest[{data1, data2, ...}]` tests for equal hazard rates among the datai using a log-rank type test. * `LogRankTest[{data1, data2, ...}, wspec]` performs a weighted log-rank test with weights wspec. * `LogRankTest[{data1, ...}, wspec, "property"]` returns the value of "property". Examples [#examples] Compare survival data: ```wolfram data1 = {1, 2, 3, 5, 7}; data2 = {2, 4, 6, 8, 10}; LogRankTest[{data1, data2}] ``` Get p-value: ```wolfram LogRankTest[{data1, data2}, Automatic, "PValue"] ``` Weighted test: ```wolfram LogRankTest[{data1, data2}, "Prentice"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogRankTest.html) for more details. # LogSeriesDistribution `LogSeriesDistribution[θ]` represents a logarithmic series distribution with parameter θ. Examples [#examples] ```wolfram dist = LogSeriesDistribution[0.5]; PDF[dist, k] ``` ```wolfram RandomVariate[LogSeriesDistribution[0.8], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogSeriesDistribution.html) for more details. # LogicalExpand `LogicalExpand[expr]` expands out logical combinations of equations, inequalities, and other functions. Examples [#examples] Expand logical expression: ```wolfram LogicalExpand[(a || b) && c] (* (a && c) || (b && c) *) ``` With inequalities: ```wolfram LogicalExpand[Abs[x] < 1] (* -1 < x < 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogicalExpand.html) for more details. # LogisticDistribution `LogisticDistribution[μ,β]` represents a logistic distribution with mean μ and scale parameter β. `LogisticDistribution[]` represents a logistic distribution with mean 0 and scale parameter 1. Examples [#examples] Create a logistic distribution and compute its variance: ```wolfram dist = LogisticDistribution[0, 1]; Variance[dist] (* π^2/3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogisticDistribution.html) for more details. # LogisticSigmoid `LogisticSigmoid[z]` gives the logistic sigmoid function. Examples [#examples] ```wolfram LogisticSigmoid[0] ``` ```wolfram Plot[LogisticSigmoid[x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LogisticSigmoid.html) for more details. # LucasL `LucasL[n]` gives the Lucas number Ln. `LucasL[n,x]` gives the Lucas polynomial Ln(x). Examples [#examples] Compute the 10th Lucas number: ```wolfram LucasL[10] (* 123 *) ``` Get a Lucas polynomial: ```wolfram LucasL[4, x] (* 2 + 4 x^2 + x^4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LucasL.html) for more details. # MandelbrotSetDistance `MandelbrotSetDistance[c]` estimates the distance from c to the nearest point in the Mandelbrot set. `MandelbrotSetDistance[c, "Interior"]` estimates the distance from c to the nearest point in the complement of the Mandelbrot set. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MandelbrotSetDistance.html) for more details. # MandelbrotSetIterationCount `MandelbrotSetIterationCount[c]` returns the number of iterations of the function f(z) = z² + c, beginning with z₀ = 0, that are needed to determine whether c is in the Mandelbrot set. Examples [#examples] Count iterations for a point: ```wolfram MandelbrotSetIterationCount[0.3 + 0.5 I] ``` Point in the set: ```wolfram MandelbrotSetIterationCount[0] (* Infinity *) ``` Create Mandelbrot visualization: ```wolfram DensityPlot[MandelbrotSetIterationCount[x + I y], {x, -2, 1}, {y, -1.5, 1.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MandelbrotSetIterationCount.html) for more details. # MandelbrotSetMemberQ `MandelbrotSetMemberQ[z]` returns True if z is in the Mandelbrot set, and False otherwise. Examples [#examples] Check if a point is in the Mandelbrot set: ```wolfram MandelbrotSetMemberQ[0] (* True *) ``` ```wolfram MandelbrotSetMemberQ[2 + 2 I] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MandelbrotSetMemberQ.html) for more details. # MandelbrotSetPlot `MandelbrotSetPlot[{zmin, zmax}]` plots the portion of the Mandelbrot set inside the rectangle with corners zmin and zmax. `MandelbrotSetPlot[]` plots the Mandelbrot set over a default rectangle. Examples [#examples] Plot the Mandelbrot set: ```wolfram MandelbrotSetPlot[] ``` Zoom into a region: ```wolfram MandelbrotSetPlot[{-0.5 + 0.5 I, 0.5 + I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MandelbrotSetPlot.html) for more details. # MangoldtLambda `MangoldtLambda[n]` gives the von Mangoldt function Λ(n). Examples [#examples] The von Mangoldt function for a prime power: ```wolfram MangoldtLambda[8] (* Log[2] *) ``` For a non-prime-power: ```wolfram MangoldtLambda[6] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MangoldtLambda.html) for more details. # MarcumQ `MarcumQ[m, a, b]` gives Marcum's Q function Q\_m(a, b). * `MarcumQ[m, a, b0, b1]` gives Marcum's Q function Q\_m(a, b0) - Q\_m(a, b1). Examples [#examples] ```wolfram MarcumQ[1, 2, 3] ``` ```wolfram MarcumQ[2, 1.5, 0.5, 2.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MarcumQ.html) for more details. # MathieuC `MathieuC[a, q, z]` gives the even Mathieu function with characteristic value a and parameter q. Examples [#examples] ```wolfram MathieuC[1, 0.5, 0.3] ``` ```wolfram Plot[MathieuC[1, 0.5, z], {z, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuC.html) for more details. # MathieuCPrime `MathieuCPrime[a, q, z]` gives the derivative with respect to z of the even Mathieu function with characteristic value a and parameter q. Examples [#examples] ```wolfram MathieuCPrime[1, 0.5, 0.3] ``` ```wolfram Plot[MathieuCPrime[1, 1, z], {z, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuCPrime.html) for more details. # MathieuCharacteristicA `MathieuCharacteristicA[r, q]` gives the characteristic value $a_r$ for even Mathieu functions with characteristic exponent r and parameter q. Examples [#examples] ```wolfram MathieuCharacteristicA[0, 1] ``` ```wolfram MathieuCharacteristicA[2, 0.5] // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuCharacteristicA.html) for more details. # MathieuCharacteristicB `MathieuCharacteristicB[r, q]` gives the characteristic value br for odd Mathieu functions with characteristic exponent r and parameter q. Examples [#examples] ```wolfram MathieuCharacteristicB[1, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuCharacteristicB.html) for more details. # MathieuCharacteristicExponent `MathieuCharacteristicExponent[a, q]` gives the characteristic exponent `r` for Mathieu functions with characteristic value `a` and parameter `q`. Examples [#examples] ```wolfram MathieuCharacteristicExponent[1, 0.5] ``` ```wolfram Plot[MathieuCharacteristicExponent[a, 1], {a, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuCharacteristicExponent.html) for more details. # MathieuGroupM11 `MathieuGroupM11[]` represents the sporadic simple Mathieu group M11. Examples [#examples] Get the order of the Mathieu group M11: ```wolfram GroupOrder[MathieuGroupM11[]] (* 7920 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuGroupM11.html) for more details. # MathieuGroupM12 `MathieuGroupM12[]` represents the sporadic simple Mathieu group M12. Examples [#examples] ```wolfram MathieuGroupM12[] ``` ```wolfram GroupOrder[MathieuGroupM12[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuGroupM12.html) for more details. # MathieuGroupM22 `MathieuGroupM22[]` represents the sporadic simple Mathieu group M22. Examples [#examples] ```wolfram MathieuGroupM22[] ``` ```wolfram GroupOrder[MathieuGroupM22[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuGroupM22.html) for more details. # MathieuGroupM23 `MathieuGroupM23[]` represents the sporadic simple Mathieu group M₂₃. M₂₃ is one of the 26 sporadic simple groups, with order 10200960. Examples [#examples] ```wolfram MathieuGroupM23[] ``` ```wolfram GroupOrder[MathieuGroupM23[]] ``` ```wolfram GroupGenerators[MathieuGroupM23[]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuGroupM23.html) for more details. # MathieuGroupM24 `MathieuGroupM24[]` represents the sporadic simple Mathieu group M24. Examples [#examples] Create the group: ```wolfram MathieuGroupM24[] ``` Group order: ```wolfram GroupOrder[MathieuGroupM24[]] (* 244823040 *) ``` Group elements: ```wolfram GroupElements[MathieuGroupM24[], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuGroupM24.html) for more details. # MathieuS `MathieuS[a, q, z]` gives the odd Mathieu function with characteristic value a and parameter q. Examples [#examples] Compute Mathieu S function: ```wolfram MathieuS[1, 0.5, Pi/4] ``` Plot the function: ```wolfram Plot[MathieuS[1, 2, z], {z, 0, 2 Pi}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuS.html) for more details. # MathieuSPrime `MathieuSPrime[a, q, z]` gives the derivative with respect to *z* of the odd Mathieu function with characteristic value *a* and parameter *q*. Examples [#examples] ```wolfram MathieuSPrime[1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MathieuSPrime.html) for more details. # Max `Max[x1, x2, ...]` yields the numerically largest of the xi. `Max[{x1, x2, ...}, {y1, ...}, ...]` yields the largest element of any of the lists. Examples [#examples] Maximum of numbers: ```wolfram Max[3, 1, 4, 1, 5, 9] (* 9 *) ``` Maximum of a list: ```wolfram Max[{-5, 3, 7, -2}] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Max.html) for more details. # MaxDate `MaxDate[{date1, date2, ...}]` gives the latest date of the dates. * `MaxDate[interval]` gives the endpoint of the date interval. * `MaxDate[interval, gran]` gives the endpoint of interval as specified by granularity gran. Examples [#examples] Find the latest date: ```wolfram MaxDate[{DateObject[{2020, 1, 1}], DateObject[{2023, 6, 15}], DateObject[{2021, 12, 31}]}] ``` Get the end of a date interval: ```wolfram MaxDate[DateInterval[{DateObject[{2020, 1, 1}], DateObject[{2023, 12, 31}]}]] ``` With granularity: ```wolfram MaxDate[DateInterval[{DateObject[{2020, 1}], DateObject[{2023, 6}]}], "Month"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MaxDate.html) for more details. # MaxDetect `MaxDetect[image]` gives a binary image in which white pixels correspond to constant extended maxima in image. * `MaxDetect[image, h]` finds extended maxima where the range of values is not greater than h. * `MaxDetect[data, ...]` applies maxima detection to an array of data. Examples [#examples] ```wolfram MaxDetect[ExampleData[{"TestImage", "Lena"}]] ``` ```wolfram MaxDetect[image, 0.1] ``` ```wolfram MaxDetect[GaussianFilter[img, 5]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MaxDetect.html) for more details. # MaximalBy `MaximalBy[data, f]` returns a list of the elements e\_i of data for which the value of f\[e\_i] is maximal. `MaximalBy[data, f, n]` returns a list of the elements corresponding to the n largest f\[e\_i]. `MaximalBy[f]` represents an operator form of `MaximalBy` that can be applied to an expression. Examples [#examples] Find maximal elements: ```wolfram MaximalBy[{1, -2, 3, -4}, Abs] (* {-4} *) ``` Find elements with longest length: ```wolfram MaximalBy[{"a", "bb", "ccc", "dd"}, StringLength] (* {"ccc"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MaximalBy.html) for more details. # Maximize `Maximize[f, x]` maximizes f symbolically with respect to x. Examples [#examples] Symbolic maximum: ```wolfram Maximize[-x^2 + 4x + 5, x] (* {9, {x -> 2}} *) ``` With constraints: ```wolfram Maximize[{x + y, x^2 + y^2 <= 1}, {x, y}] (* {Sqrt[2], {x -> 1/Sqrt[2], y -> 1/Sqrt[2]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Maximize.html) for more details. # MaxwellDistribution `MaxwellDistribution[σ]` represents a Maxwell distribution with scale parameter σ. Examples [#examples] ```wolfram dist = MaxwellDistribution[1]; Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MaxwellDistribution.html) for more details. # MeijerGReduce `MeijerGReduce[expr, x]` attempts to reduce expr to a single MeijerG object as a function of x. Examples [#examples] ```wolfram MeijerGReduce[Exp[-x], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeijerGReduce.html) for more details. # MersennePrimeExponent `MersennePrimeExponent[n]` gives the nth Mersenne prime exponent. Examples [#examples] First Mersenne prime exponent: ```wolfram MersennePrimeExponent[1] (* 2 *) ``` First few exponents: ```wolfram Table[MersennePrimeExponent[n], {n, 1, 5}] (* {2, 3, 5, 7, 13} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MersennePrimeExponent.html) for more details. # MersennePrimeExponentQ `MersennePrimeExponentQ[n]` returns True if n is a Mersenne prime exponent, and False otherwise. Examples [#examples] Test known exponents: ```wolfram MersennePrimeExponentQ[7] (* True, since 2^7 - 1 = 127 is prime *) ``` Non-exponent: ```wolfram MersennePrimeExponentQ[8] (* False *) ``` First several exponents: ```wolfram Select[Range[100], MersennePrimeExponentQ] (* {2, 3, 5, 7, 13, 17, 19, 31, 61, 89} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MersennePrimeExponentQ.html) for more details. # MexicanHatWavelet `MexicanHatWavelet[]` represents the Mexican hat wavelet of width 1. * `MexicanHatWavelet[σ]` represents the Mexican hat wavelet of width σ. Examples [#examples] ```wolfram MexicanHatWavelet[] ``` ```wolfram Plot[Evaluate@MexicanHatWavelet[][x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MexicanHatWavelet.html) for more details. # MeyerWavelet `MeyerWavelet[]` represents the Meyer wavelet of order 3. `MeyerWavelet[n]` represents the Meyer wavelet of order n evaluated on the equally spaced interval \{-10,10}. `MeyerWavelet[n,lim]` represents the Meyer wavelet of order n evaluated on the equally spaced interval \{-lim,lim}. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeyerWavelet.html) for more details. # Min `Min[x1, x2, ...]` yields the numerically smallest of the xi. `Min[{x1, x2, ...}, {y1, ...}, ...]` yields the smallest element of any of the lists. Examples [#examples] Minimum of numbers: ```wolfram Min[3, 1, 4, 1, 5, 9] (* 1 *) ``` Minimum of a list: ```wolfram Min[{-5, 3, 7, -2}] (* -5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Min.html) for more details. # MinLimit `MinLimit[f, x -> x*]` gives the min limit as x approaches x\*. * `MinLimit[f, {x1 -> x1*, ..., xn -> xn*}]` gives the nested min limit. * `MinLimit[f, {x1, ..., xn} -> {x1*, ..., xn*}]` gives the multivariate min limit. Examples [#examples] ```wolfram MinLimit[Sin[x]/x, x -> 0] ``` ```wolfram MinLimit[x^2 + y, {x -> 0, y -> 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinLimit.html) for more details. # MinMax `MinMax[list]` gives the list `{Min[list], Max[list]}`. `MinMax[list, δ]` gives `{Min[list] - δ, Max[list] + δ}`. Examples [#examples] Get minimum and maximum: ```wolfram MinMax[{3, 1, 4, 1, 5, 9, 2, 6}] (* {1, 9} *) ``` With padding: ```wolfram MinMax[{1, 5, 3}, 2] (* {-1, 7} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinMax.html) for more details. # MinStableDistribution `MinStableDistribution[μ, σ, ξ]` represents a generalized minimum extreme value distribution with location parameter μ, scale parameter σ, and shape parameter ξ. Examples [#examples] ```wolfram dist = MinStableDistribution[0, 1, 0.5]; Mean[dist] ``` ```wolfram RandomVariate[MinStableDistribution[0, 1, 0], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinStableDistribution.html) for more details. # MinValue `MinValue[f,x]` gives the minimum value of f with respect to x. `MinValue[f,{x,y,…}]` gives the exact minimum value of f with respect to x, y, …. `MinValue[{f,cons},{x,y,…}]` gives the minimum value of f subject to the constraints cons. `MinValue[…,x∈rdom]` constrains x to be in the region or domain rdom. `MinValue[…,…,dom]` constrains variables to the domain dom, typically Reals or Integers. Examples [#examples] Find the minimum value of a function: ```wolfram MinValue[x^2 + 2x + 1, x] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinValue.html) for more details. # MinimalBy `MinimalBy[data, f]` returns a list of the elements e\_i of data for which the value of f is minimal. `MinimalBy[data, f, n]` returns a list of the elements corresponding to the n smallest f\[e\_i]. `MinimalBy[f]` represents an operator form of `MinimalBy` that can be applied to an expression. Examples [#examples] Find minimal elements: ```wolfram MinimalBy[{1, -2, 3, -4}, Abs] (* {1} *) ``` Find elements with shortest length: ```wolfram MinimalBy[{"a", "bb", "ccc", "dd"}, StringLength] (* {"a"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinimalBy.html) for more details. # MinimalPolynomial `MinimalPolynomial[s, x]` gives the minimal polynomial in x for which the algebraic number s is a root. * `MinimalPolynomial[u, x]` gives the minimal polynomial of the finite field element u over p. * `MinimalPolynomial[u, x, k]` gives the minimal polynomial of u over the p^k-element subfield of the ambient field of u. * `MinimalPolynomial[u, x, emb]` gives the minimal polynomial of u relative to the finite field embedding emb. Examples [#examples] ```wolfram MinimalPolynomial[Sqrt[2], x] ``` ```wolfram MinimalPolynomial[2^(1/3) + Sqrt[3], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinimalPolynomial.html) for more details. # Minimize `Minimize[f, x]` minimizes f symbolically with respect to x. Examples [#examples] Symbolic minimum: ```wolfram Minimize[x^2 - 4x + 5, x] (* {1, {x -> 2}} *) ``` With constraints: ```wolfram Minimize[{x + y, x >= 0, y >= 0, x + y >= 1}, {x, y}] (* {1, {x -> 0, y -> 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Minimize.html) for more details. # MinimumTimeIncrement `MinimumTimeIncrement[tseries]` gives the minimum time increment in the time series tseries. Examples [#examples] ```wolfram ts = TimeSeries[{1, 2, 4, 7}, {0, 1, 3, 4}]; MinimumTimeIncrement[ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinimumTimeIncrement.html) for more details. # MinorPlanetData `MinorPlanetData[entity, property]` gives the value of the specified property for the minor planet entity. * `MinorPlanetData[{entity1, entity2, ...}, property]` gives a list of property values for the specified minor planet entities. * `MinorPlanetData[entity, property, annotation]` gives the specified annotation associated with the given property. Examples [#examples] Get orbital period of Ceres: ```wolfram MinorPlanetData[Entity["MinorPlanet", "Ceres"], "OrbitalPeriod"] ``` Query multiple asteroids: ```wolfram MinorPlanetData[{Entity["MinorPlanet", "Ceres"], Entity["MinorPlanet", "Vesta"]}, "Mass"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinorPlanetData.html) for more details. # Minors `Minors[m]` gives the minors of a matrix m. `Minors[m, k]` gives the kth minors. Examples [#examples] Minors of a matrix: ```wolfram Minors[{{a, b}, {c, d}}] (* {{a d - b c}} *) ``` 2x2 minors of a 3x3 matrix: ```wolfram Minors[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, 2] (* {{-3, -6, -3}, {-6, -12, -6}, {-3, -6, -3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Minors.html) for more details. # Minus `-x` is the arithmetic negation of x. Examples [#examples] Negate a number: ```wolfram -5 (* -5 *) ``` Negate an expression: ```wolfram -(a + b) (* -a - b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Minus.html) for more details. # MinusPlus `MinusPlus[x]` displays as ∓x. * `MinusPlus[x, y, …]` displays as x∓y∓…. Examples [#examples] ```wolfram MinusPlus[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MinusPlus.html) for more details. # MittagLefflerE `MittagLefflerE[α, z]` gives the Mittag–Leffler function $E_α(z)$. * `MittagLefflerE[α, β, z]` gives the generalized Mittag–Leffler function $E_{α,β}(z)$. Examples [#examples] ```wolfram MittagLefflerE[1, 1] ``` ```wolfram MittagLefflerE[0.5, 1.0, 0.5] // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MittagLefflerE.html) for more details. # Mod `Mod[m, n]` gives the remainder on division of m by n. Examples [#examples] Modulo operation: ```wolfram Mod[17, 5] (* 2 *) ``` ```wolfram Mod[10, 3] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Mod.html) for more details. # ModularInverse `ModularInverse[k, n]` gives the modular inverse of k modulo n. The modular inverse of k modulo n is an integer m such that k\*m ≡ 1 (mod n). It exists only when `GCD[k, n] == 1`. Examples [#examples] ```wolfram ModularInverse[3, 7] ``` ```wolfram (* Verify: 3 * 5 = 15 ≡ 1 (mod 7) *) Mod[3 * ModularInverse[3, 7], 7] ``` ```wolfram ModularInverse[17, 100] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ModularInverse.html) for more details. # ModularLambda `ModularLambda[τ]` gives the modular lambda elliptic function λ(τ). Examples [#examples] ```wolfram ModularLambda[I] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ModularLambda.html) for more details. # MoebiusMu `MoebiusMu[n]` gives the Möbius function μ(n). Examples [#examples] Möbius function values: ```wolfram MoebiusMu[6] (* 1 *) MoebiusMu[4] (* 0 *) MoebiusMu[30] (* -1 *) ``` The Möbius function is 0 if n has a squared prime factor. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MoebiusMu.html) for more details. # MorletWavelet `MorletWavelet[]` represents a Morlet wavelet. Examples [#examples] Create a Morlet wavelet: ```wolfram MorletWavelet[] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MorletWavelet.html) for more details. # Multinomial `Multinomial[n1, n2, ...]` gives the multinomial coefficient (n1+n2+...)! / (n1! n2! ...). Examples [#examples] Multinomial coefficient: ```wolfram Multinomial[2, 3, 4] (* 1260 *) ``` Equivalent to binomial for two arguments: ```wolfram Multinomial[3, 2] (* 10 - same as Binomial[5, 3] *) ``` Counting permutations with repetition: ```wolfram Multinomial[2, 2, 2] (* 90 - ways to arrange AABBCC *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Multinomial.html) for more details. # MultinomialDistribution `MultinomialDistribution[n,{p1,p2,…,pm}]` represents a multinomial distribution with n trials and probabilities pi. Examples [#examples] Create a multinomial distribution: ```wolfram dist = MultinomialDistribution[10, {0.2, 0.3, 0.5}] ``` Compute the mean: ```wolfram Mean[MultinomialDistribution[10, {0.2, 0.3, 0.5}]] (* {2, 3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultinomialDistribution.html) for more details. # NevilleThetaC `NevilleThetaC[z, m]` gives the Neville theta function ϑc(z|m). Examples [#examples] ```wolfram NevilleThetaC[0.5, 0.3] ``` ```wolfram Plot3D[NevilleThetaC[x + I y, 0.5], {x, -2, 2}, {y, -2, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NevilleThetaC.html) for more details. # NevilleThetaD `NevilleThetaD[z, m]` gives the Neville theta function ϑd(z|m). Examples [#examples] ```wolfram NevilleThetaD[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NevilleThetaD.html) for more details. # NevilleThetaN `NevilleThetaN[z, m]` gives the Neville theta function θₙ(z|m). Examples [#examples] Compute Neville theta N: ```wolfram NevilleThetaN[0.5, 0.3] ``` Plot the function: ```wolfram Plot[NevilleThetaN[z, 0.5], {z, 0, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NevilleThetaN.html) for more details. # NevilleThetaS `NevilleThetaS[z, m]` gives the Neville theta function ϑs(z|m). Examples [#examples] ```wolfram NevilleThetaS[0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NevilleThetaS.html) for more details. # NextPrime `NextPrime[x]` gives the smallest prime above *x*. * `NextPrime[x, k]` gives the *k*th-next prime above *x*. Examples [#examples] ```wolfram NextPrime[100] (* 101 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NextPrime.html) for more details. # NullRawPointerQ `NullRawPointerQ[ptr]` gives True if ptr is a null pointer, and False otherwise. Examples [#examples] ```wolfram NullRawPointerQ[ToRawPointer[]] ``` ```wolfram NullRawPointerQ[ptr] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NullRawPointerQ.html) for more details. # OwenT `OwenT[x, a]` gives Owen's T function T(x, a). Examples [#examples] Compute Owen's T function: ```wolfram OwenT[1, 0.5] ``` Numerical evaluation: ```wolfram N[OwenT[2, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OwenT.html) for more details. # PairCorrelationG `PairCorrelationG[pdata, r]` estimates the pair correlation function g(r) for point data pdata at radius r. * `PairCorrelationG[pproc, r]` computes g(r) for the point process pproc. * `PairCorrelationG[bdata, r]` computes g(r) for binned data bdata. * `PairCorrelationG[pspec]` generates the function g that can be applied repeatedly to different radii r. Examples [#examples] ```wolfram PairCorrelationG[RandomPointConfiguration[PoissonPointProcess[1], Rectangle[]], 0.5] ``` ```wolfram PairCorrelationG[PointProcessEstimator[pts, Rectangle[]], 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PairCorrelationG.html) for more details. # ParabolicCylinderD `ParabolicCylinderD[ν, z]` gives the parabolic cylinder function Dν(z). Examples [#examples] ```wolfram ParabolicCylinderD[2, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParabolicCylinderD.html) for more details. # PaulWavelet `PaulWavelet[]` represents a Paul wavelet of order 4. * `PaulWavelet[n]` represents a Paul wavelet of order n. Examples [#examples] Default Paul wavelet: ```wolfram PaulWavelet[] ``` Order 8 Paul wavelet: ```wolfram PaulWavelet[8] ``` Plot the wavelet: ```wolfram WaveletPsi[PaulWavelet[], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PaulWavelet.html) for more details. # PeanoCurve `PeanoCurve[n]` gives the line segments representing the nth-step Peano curve. Examples [#examples] Draw a Peano curve: ```wolfram Graphics[PeanoCurve[3]] ``` Higher order curve: ```wolfram Graphics[{Thick, PeanoCurve[4]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PeanoCurve.html) for more details. # Pi `Pi` is π, with numerical value ≈ 3.14159. Examples [#examples] Numerical value: ```wolfram N[Pi] (* 3.14159 *) ``` Use in calculations: ```wolfram Sin[Pi] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pi.html) for more details. # PillaiTrace `PillaiTrace[m1, m2]` gives Pillai's trace for the matrices m1 and m2. Examples [#examples] Compute Pillai's trace for two matrices: ```wolfram m1 = {{1, 2}, {3, 4}}; m2 = {{5, 6}, {7, 8}}; PillaiTrace[m1, m2] ``` Use in MANOVA analysis: ```wolfram PillaiTrace[hypothesisMatrix, errorMatrix] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PillaiTrace.html) for more details. # PillaiTraceTest `PillaiTraceTest[m1, m2]` tests whether the matrices *m1* and *m2* are independent. * `PillaiTraceTest[..., "property"]` returns the value of *"property"*. Examples [#examples] ```wolfram m1 = RandomReal[1, {10, 3}]; m2 = RandomReal[1, {10, 3}]; PillaiTraceTest[m1, m2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PillaiTraceTest.html) for more details. # PlanckRadiationLaw `PlanckRadiationLaw[temperature, λ]` returns the spectral radiance for the specified temperature and wavelength λ. * `PlanckRadiationLaw[temperature, f]` returns the spectral radiance for the specified temperature and frequency f. * `PlanckRadiationLaw[temperature, property]` returns the value of the property for the specified temperature. * `PlanckRadiationLaw[temperature, {λ1, λ2}]` returns the integrated result over the wavelength range λ1 to λ2. * `PlanckRadiationLaw[temperature, {f1, f2}]` returns the integrated result over the frequency range f1 to f2. Examples [#examples] ```wolfram PlanckRadiationLaw[5800, Quantity[500, "Nanometers"]] ``` ```wolfram PlanckRadiationLaw[Quantity[6000, "Kelvins"], "PeakWavelength"] ``` ```wolfram Plot[PlanckRadiationLaw[5800, Quantity[λ, "Nanometers"]], {λ, 100, 2000}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlanckRadiationLaw.html) for more details. # Plus `x + y + z` represents a sum of terms. Examples [#examples] Arithmetic addition: ```wolfram 2 + 3 + 5 (* 10 *) ``` Symbolic addition: ```wolfram a + b + a (* 2a + b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Plus.html) for more details. # PlusMinus `PlusMinus[x]` displays as ±x. * `PlusMinus[x, y, ...]` displays as x±y±.... Examples [#examples] Display plus-minus notation: ```wolfram PlusMinus[5] ``` Multiple arguments: ```wolfram PlusMinus[a, b, c] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PlusMinus.html) for more details. # Pochhammer `Pochhammer[a, n]` gives the Pochhammer symbol (a)\_n = a(a+1)(a+2)...(a+n-1), also called the rising factorial. Examples [#examples] Pochhammer symbol: ```wolfram Pochhammer[3, 4] (* 360 - equals 3*4*5*6 *) ``` Relation to Gamma: ```wolfram Pochhammer[a, n] == Gamma[a + n]/Gamma[a] (* True *) ``` Useful in series expansions: ```wolfram Pochhammer[1/2, 3] (* 15/8 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pochhammer.html) for more details. # PolyGamma `PolyGamma[z]` gives the digamma function ψ(z). `PolyGamma[n, z]` gives the nth derivative of the digamma function ψ^(n)(z). Examples [#examples] ```wolfram PolyGamma[1] (* -EulerGamma *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyGamma.html) for more details. # PolyLog `PolyLog[n, z]` gives the polylogarithm function Li\_n(z). Examples [#examples] Polylogarithm values: ```wolfram PolyLog[2, 1] (* Pi^2/6 *) PolyLog[2, -1] (* -Pi^2/12 *) ``` Numerical evaluation: ```wolfram N[PolyLog[3, 1/2]] (* 0.537214 *) ``` Dilogarithm (n=2): ```wolfram PolyLog[2, 1/2] // N (* 0.582241 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyLog.html) for more details. # Power `x^y` gives x to the power y. Examples [#examples] Exponentiation: ```wolfram 2^10 (* 1024 *) ``` Fractional powers: ```wolfram 8^(1/3) (* 2 *) ``` Symbolic: ```wolfram x^2 * x^3 (* x^5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Power.html) for more details. # PowerDistribution `PowerDistribution[k, a]` represents a power distribution with domain parameter k and shape parameter a. Examples [#examples] ```wolfram dist = PowerDistribution[2, 3] ``` ```wolfram Mean[dist] ``` ```wolfram RandomVariate[PowerDistribution[1, 2], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerDistribution.html) for more details. # PowerExpand `PowerExpand[expr]` expands all powers of products and powers. `PowerExpand[expr, {x1, x2, ...}]` expands only with respect to the variables xi. Examples [#examples] Expand a power of a product: ```wolfram PowerExpand[(a b)^n] (* a^n b^n *) ``` Expand a logarithm: ```wolfram PowerExpand[Log[x y]] (* Log[x] + Log[y] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerExpand.html) for more details. # PowerMod `PowerMod[a, b, m]` gives a^b mod m efficiently. `PowerMod[a, -1, m]` finds the modular inverse of a modulo m. Examples [#examples] Compute power modulo: ```wolfram PowerMod[2, 10, 1000] (* 24 *) ``` Modular inverse: ```wolfram PowerMod[3, -1, 7] (* 5 *) ``` Verify the inverse: ```wolfram Mod[3 * 5, 7] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerMod.html) for more details. # PowerModList `PowerModList[a, s/r, m]` gives a list of all x modulo m for which x^r ≡ a^s mod m. Examples [#examples] ```wolfram PowerModList[2, 1/2, 17] ``` ```wolfram PowerModList[1, 1/3, 13] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerModList.html) for more details. # PowerRange `PowerRange[b]` generates the list \{1, 10, 100, …, max}, where max is the largest power of 10 that does not exceed b. `PowerRange[a, b]` generates the list \{a, 10a, 100a, …, max}, with successive elements increasing by factors of 10. `PowerRange[a, b, r]` uses factors of r instead of 10. Examples [#examples] Powers of 10: ```wolfram PowerRange[1000] (* {1, 10, 100, 1000} *) ``` Powers of 2: ```wolfram PowerRange[1, 100, 2] (* {1, 2, 4, 8, 16, 32, 64} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerRange.html) for more details. # PowerSpectralDensity `PowerSpectralDensity[data, ω]` estimates the power spectral density for data. * `PowerSpectralDensity[data, ω, sspec]` estimates the power spectral density for data with smoothing specification sspec. * `PowerSpectralDensity[tproc, ω]` represents the power spectral density of a time series process tproc. The power spectral density describes how the power of a signal is distributed across frequencies. Examples [#examples] ```wolfram data = Table[Sin[2 Pi 0.1 t] + RandomReal[], {t, 100}]; PowerSpectralDensity[data, 0.1] ``` ```wolfram Periodogram[data] ``` ```wolfram PowerSpectralDensity[ARProcess[{0.5}, 1], \[Omega]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerSpectralDensity.html) for more details. # PowerSymmetricPolynomial `PowerSymmetricPolynomial[r]` represents a formal power symmetric polynomial with exponent r. * `PowerSymmetricPolynomial[{r1, r2, ...}]` represents a multivariate formal power symmetric polynomial with exponents r1, r2, .... * `PowerSymmetricPolynomial[rspec, data]` gives the power symmetric polynomial in data. Examples [#examples] Create a power symmetric polynomial: ```wolfram PowerSymmetricPolynomial[2] ``` Evaluate a power symmetric polynomial on data: ```wolfram PowerSymmetricPolynomial[2, {a, b, c}] (* a^2 + b^2 + c^2 *) ``` Multivariate power symmetric polynomial: ```wolfram PowerSymmetricPolynomial[{1, 2}, {a, b, c}] (* (a + b + c)(a^2 + b^2 + c^2) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PowerSymmetricPolynomial.html) for more details. # Prime `Prime[n]` gives the nth prime number. Examples [#examples] Get the 10th prime: ```wolfram Prime[10] (* 29 *) ``` First 10 primes: ```wolfram Table[Prime[n], {n, 1, 10}] (* {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} *) ``` The 100th prime: ```wolfram Prime[100] (* 541 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Prime.html) for more details. # PrimeNu `PrimeNu[n]` gives the number of distinct primes ν(n) in n. Examples [#examples] ```wolfram PrimeNu[60] ``` ```wolfram Table[PrimeNu[n], {n, 1, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimeNu.html) for more details. # PrimeOmega `PrimeOmega[n]` gives the number of prime factors counting multiplicities Ω(n) in n. Examples [#examples] Count prime factors with multiplicity: ```wolfram PrimeOmega[12] (* 3 - because 12 = 2*2*3 *) ``` Compare with PrimeNu (distinct factors): ```wolfram PrimeOmega[100] (* 4 - because 100 = 2^2 * 5^2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimeOmega.html) for more details. # PrimePi `PrimePi[x]` gives the number of primes π(x) less than or equal to x. Examples [#examples] Count primes up to 100: ```wolfram PrimePi[100] (* 25 *) ``` Count primes up to 1000: ```wolfram PrimePi[1000] (* 168 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimePi.html) for more details. # PrimePowerQ `PrimePowerQ[expr]` yields True if expr is a power of a prime number, and yields False otherwise. Examples [#examples] Test if a number is a prime power: ```wolfram PrimePowerQ[8] (* True *) ``` Test a non-prime power: ```wolfram PrimePowerQ[12] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimePowerQ.html) for more details. # PrimeQ `PrimeQ[n]` yields `True` if n is a prime number, and `False` otherwise. Examples [#examples] Test if a number is prime: ```wolfram PrimeQ[17] (* True *) ``` ```wolfram PrimeQ[15] (* False *) ``` Find primes up to 30: ```wolfram Select[Range[30], PrimeQ] (* {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimeQ.html) for more details. # PrimeZetaP `PrimeZetaP[s]` gives prime zeta function P(s). Examples [#examples] Evaluate prime zeta function: ```wolfram PrimeZetaP[2] ``` Numerical value: ```wolfram N[PrimeZetaP[2]] (* 0.452247 *) ``` Plot the function: ```wolfram Plot[PrimeZetaP[s], {s, 1.1, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrimeZetaP.html) for more details. # Primes `Primes` represents the domain of prime numbers, as in x∈Primes. Examples [#examples] Test if a number is prime: ```wolfram 7 ∈ Primes (* True *) ``` Find primes in a range: ```wolfram Select[Range[20], # ∈ Primes &] (* {2, 3, 5, 7, 11, 13, 17, 19} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Primes.html) for more details. # ProductLog `ProductLog[z]` gives the principal solution for w in z = w\*e^w (Lambert W function). `ProductLog[k, z]` gives the kth solution. Examples [#examples] Principal branch: ```wolfram ProductLog[1] (* 0.567143 *) ``` Verify solution: ```wolfram w = ProductLog[1]; w Exp[w] (* 1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProductLog.html) for more details. # QuartileSkewness `QuartileSkewness[data]` gives the coefficient of quartile skewness for the elements in list. `QuartileSkewness[data,{{a,b},{c,d}}]` uses the quantile definition specified by parameters a, b, c, d. `QuartileSkewness[dist]` gives the coefficient of quartile skewness for the distribution dist. Examples [#examples] Compute the quartile skewness of a dataset: ```wolfram QuartileSkewness[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuartileSkewness.html) for more details. # Quotient `Quotient[m, n]` gives the integer quotient of m and n. Examples [#examples] Integer division: ```wolfram Quotient[17, 5] (* 3 *) ``` ```wolfram Quotient[100, 7] (* 14 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quotient.html) for more details. # QuotientRemainder `QuotientRemainder[m, n]` gives a list of the quotient and remainder from division of m by n. Examples [#examples] Get quotient and remainder: ```wolfram QuotientRemainder[17, 5] (* {3, 2} *) ``` This means 17 = 5 × 3 + 2. ```wolfram QuotientRemainder[100, 7] (* {14, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuotientRemainder.html) for more details. # RamanujanTau `RamanujanTau[n]` gives the Ramanujan τ function τ(n). Examples [#examples] First few values: ```wolfram Table[RamanujanTau[n], {n, 1, 10}] (* {1, -24, 252, -1472, 4830, ...} *) ``` Verify the first value: ```wolfram RamanujanTau[1] (* 1 *) ``` Famous value at n=2: ```wolfram RamanujanTau[2] (* -24 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RamanujanTau.html) for more details. # RamanujanTauL `RamanujanTauL[s]` gives the Ramanujan tau Dirichlet L-function L(s). Examples [#examples] Evaluate the Ramanujan tau L-function: ```wolfram RamanujanTauL[2] // N (* 0.0393407 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RamanujanTauL.html) for more details. # RamanujanTauTheta `RamanujanTauTheta[t]` gives the Ramanujan tau theta function θ(t). Examples [#examples] Evaluate the Ramanujan tau theta function: ```wolfram RamanujanTauTheta[0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RamanujanTauTheta.html) for more details. # RamanujanTauZ `RamanujanTauZ[t]` gives the Ramanujan tau Z-function Z(t). Examples [#examples] ```wolfram RamanujanTauZ[2.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RamanujanTauZ.html) for more details. # Re `Re[z]` gives the real part of the complex number z. Examples [#examples] Get the real part of a complex number: ```wolfram Re[3 + 4 I] (* 3 *) ``` Real part of a purely imaginary number: ```wolfram Re[5 I] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Re.html) for more details. # ReIm `ReIm[z]` gives the list \{Re\[z], Im\[z]} of the number z. Examples [#examples] ```wolfram ReIm[3 + 4 I] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReIm.html) for more details. # Real `Real` is the head used for real (floating-point) numbers. Examples [#examples] Check head of a real number: ```wolfram Head[3.14] (* Real *) ``` Pattern matching: ```wolfram MatchQ[2.718, _Real] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Real.html) for more details. # RealAbs `RealAbs[x]` gives the absolute value of the real number x. Examples [#examples] Get the absolute value of a negative number: ```wolfram RealAbs[-5] (* 5 *) ``` RealAbs works with symbolic expressions: ```wolfram RealAbs[-x] /. x -> 3 (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RealAbs.html) for more details. # RealExponent `RealExponent[x]` gives log₁₀(|x|). * `RealExponent[x, b]` gives log\_b(|x|). Examples [#examples] ```wolfram RealExponent[1000] ``` ```wolfram RealExponent[8, 2] ``` ```wolfram RealExponent[100, 10] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RealExponent.html) for more details. # RealSign `RealSign[x]` gives -1, 0, or 1 depending on whether x is negative, zero, or positive. Examples [#examples] Get sign: ```wolfram RealSign[-5] (* -1 *) ``` ```wolfram RealSign[0] (* 0 *) ``` ```wolfram RealSign[3.14] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RealSign.html) for more details. # RealValuedNumberQ `RealValuedNumberQ[expr]` returns True if expr is a number with a real value and False otherwise. Examples [#examples] ```wolfram RealValuedNumberQ[3.14] ``` ```wolfram RealValuedNumberQ[2 + 3 I] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RealValuedNumberQ.html) for more details. # RealValuedNumericQ `RealValuedNumericQ[expr]` gives True if expr is a real-valued numeric quantity, and False otherwise. Examples [#examples] Check real-valued numbers: ```wolfram RealValuedNumericQ[3.14] (* True *) ``` ```wolfram RealValuedNumericQ[2 + 3 I] (* False *) ``` ```wolfram RealValuedNumericQ[Pi] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RealValuedNumericQ.html) for more details. # Reals `Reals` represents the domain of real numbers, as in x∈Reals. Examples [#examples] Solve over the reals: ```wolfram Solve[x^2 == 2, x, Reals] (* {{x -> -Sqrt[2]}, {x -> Sqrt[2]}} *) ``` Test membership: ```wolfram Element[Pi, Reals] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Reals.html) for more details. # RecurrenceFilter `RecurrenceFilter[{α,β},x]` filters x using a linear recurrence equation with coefficients α and β. `RecurrenceFilter[tf,x]` uses a discrete-time filter defined by the TransferFunctionModel tf. `RecurrenceFilter[…,x,{y0,y-1,…}]` uses a specified list \{y0,y-1,…} as the initial condition. `RecurrenceFilter[…,image]` filters image. `RecurrenceFilter[…,sound]` filters sampled sound object. Examples [#examples] Apply a simple recurrence filter: ```wolfram RecurrenceFilter[{{1}, {0.5}}, {1, 0, 0, 0, 0}] (* {1., 0.5, 0.25, 0.125, 0.0625} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RecurrenceFilter.html) for more details. # RegularlySampledQ `RegularlySampledQ[tseries]` gives `True` if tseries is a regular time series, and `False` otherwise. Examples [#examples] ```wolfram ts = TimeSeries[{1, 2, 3}, {0, 1, 2}]; RegularlySampledQ[ts] ``` ```wolfram ts2 = TimeSeries[{1, 2, 3}, {0, 1, 3}]; RegularlySampledQ[ts2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegularlySampledQ.html) for more details. # RepeatingElement `RepeatingElement[spec]` represents an arbitrarily repeated type of element in an interpreter, API or form specification. * `RepeatingElement[spec, max]` represents an element that can appear at most max times. * `RepeatingElement[spec, {min, max}]` represents an element that can appear between min and max times. * `RepeatingElement[spec, {n, {min, max}}]` represents an element that initially appears n times in a form. * `RepeatingElement[spec, {{i, n}, {min, max}}]` represents an element where i takes successive values. Examples [#examples] ```wolfram FormObject[{"names" -> RepeatingElement["String", 3]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RepeatingElement.html) for more details. # Rescale `Rescale[x, {min, max}]` rescales `x` from the range `[min, max]` to `[0, 1]`. `Rescale[x, {min, max}, {ymin, ymax}]` rescales to `[ymin, ymax]`. Examples [#examples] Rescale values: ```wolfram Rescale[5, {0, 10}] (* 0.5 *) Rescale[5, {0, 10}, {0, 100}] (* 50 *) (* Rescale a list to 0-1 *) data = {10, 20, 30, 40, 50} Rescale[data] (* {0., 0.25, 0.5, 0.75, 1.} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rescale.html) for more details. # RescalingTransform `RescalingTransform[{{xmin, xmax}, {ymin, ymax}, ...}, {{xpmin, xpmax}, ...}]` gives a TransformationFunction that rescales the region with coordinate ranges xmin to xmax, etc. to the region with coordinate ranges xpmin to xpmax, etc. * `RescalingTransform[{{xmin, xmax}, {ymin, ymax}, ...}]` gives a TransformationFunction that rescales to the unit square, cube, etc. Examples [#examples] Rescale to unit square: ```wolfram RescalingTransform[{{0, 10}, {0, 20}}] ``` Rescale from one range to another: ```wolfram transform = RescalingTransform[{{0, 100}}, {{0, 1}}]; transform[{50}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RescalingTransform.html) for more details. # RiemannR `RiemannR[x]` gives the Riemann prime counting function R(x). Examples [#examples] ```wolfram RiemannR[100] ``` ```wolfram Plot[{RiemannR[x], PrimePi[x]}, {x, 2, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiemannR.html) for more details. # RiemannSiegelTheta `RiemannSiegelTheta[t]` gives the Riemann–Siegel function ϑ(t). Examples [#examples] ```wolfram RiemannSiegelTheta[10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiemannSiegelTheta.html) for more details. # RiemannSiegelZ `RiemannSiegelZ[t]` gives the Riemann–Siegel function Z(t). Examples [#examples] Evaluate at a point: ```wolfram RiemannSiegelZ[10] ``` Plot the function: ```wolfram Plot[RiemannSiegelZ[t], {t, 0, 50}] ``` Find zeros (related to zeta zeros): ```wolfram Table[RiemannSiegelZ[t], {t, 14, 15, 0.1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiemannSiegelZ.html) for more details. # RiemannXi `RiemannXi[s]` gives the Riemann xi function ξ(s). Examples [#examples] Compute Riemann xi: ```wolfram RiemannXi[1/2 + 14.1 I] ``` Plot the function: ```wolfram Plot[RiemannXi[1/2 + I t], {t, 0, 50}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiemannXi.html) for more details. # RipleyK `RipleyK[pdata,r]` estimates Ripley's K function K(r) at radius r for point data pdata. `RipleyK[pproc,r]` computes K(r) for the point process pproc. `RipleyK[bdata,r]` computes K(r) for binned data bdata. `RipleyK[pspec]` generates the function K that can be applied repeatedly at different radii r. Examples [#examples] ```wolfram RipleyK[RandomReal[1, {100, 2}], 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RipleyK.html) for more details. # RootMeanSquare `RootMeanSquare[list]` gives the root mean square of values in list. `RootMeanSquare[dist]` gives the root mean square of the distribution dist. Examples [#examples] ```wolfram RootMeanSquare[{1, 2, 3, 4, 5}] (* Sqrt[11] *) ``` ```wolfram RootMeanSquare[{-2, 2, -2, 2}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootMeanSquare.html) for more details. # RootOfUnityQ `RootOfUnityQ[a]` yields True if a is a root of unity, and yields False otherwise. Examples [#examples] ```wolfram RootOfUnityQ[Exp[2 Pi I/5]] ``` ```wolfram RootOfUnityQ[Sqrt[2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootOfUnityQ.html) for more details. # RootTree `RootTree[tree]` returns the root node of tree as a `Tree` object. * `RootTree[tree, n]` returns a `Tree` object containing the nodes of tree down to level n. Examples [#examples] ```wolfram tree = Tree[a, {Tree[b, {c, d}], Tree[e, {f}]}]; RootTree[tree, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RootTree.html) for more details. # Round `Round[x]` gives the integer closest to x. `Round[x, a]` rounds to the nearest multiple of a. Examples [#examples] Round a number: ```wolfram Round[3.7] (* 4 *) Round[3.2] (* 3 *) ``` Round to a multiple: ```wolfram Round[17, 5] (* 15 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Round.html) for more details. # RudinShapiro `RudinShapiro[n]` gives the nth term in the Rudin–Shapiro sequence. Examples [#examples] ```wolfram Table[RudinShapiro[n], {n, 0, 15}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RudinShapiro.html) for more details. # SawtoothWave `SawtoothWave[x]` gives a sawtooth wave that varies from 0 to 1 with unit period. `SawtoothWave[{min, max}, x]` gives a sawtooth wave that varies from min to max with unit period. Examples [#examples] Plot a basic sawtooth wave: ```wolfram Plot[SawtoothWave[x], {x, 0, 3}] ``` Sawtooth wave with custom range: ```wolfram Plot[SawtoothWave[{-1, 1}, x], {x, 0, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SawtoothWave.html) for more details. # ScorerGi `ScorerGi[z]` gives the Scorer function Gi(z). Examples [#examples] Evaluate the Scorer Gi function: ```wolfram ScorerGi[1.5] ``` Plot the Scorer Gi function: ```wolfram Plot[ScorerGi[x], {x, -10, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScorerGi.html) for more details. # ScorerGiPrime `ScorerGiPrime[z]` gives the derivative of the Scorer function Gi′(z). Examples [#examples] ```wolfram ScorerGiPrime[1.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScorerGiPrime.html) for more details. # ScorerHi `ScorerHi[z]` gives the Scorer function Hi(z). Examples [#examples] Evaluate at a point: ```wolfram ScorerHi[1.0] ``` Plot the function: ```wolfram Plot[ScorerHi[x], {x, -10, 5}] ``` Symbolic value: ```wolfram ScorerHi[0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScorerHi.html) for more details. # ScorerHiPrime `ScorerHiPrime[z]` gives the derivative of the Scorer function Hi′(z). Examples [#examples] Evaluate the derivative at a point: ```wolfram ScorerHiPrime[1.0] (* 0.326643 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ScorerHiPrime.html) for more details. # Sec `Sec[z]` gives the secant of z. Examples [#examples] Compute secant: ```wolfram Sec[0] (* 1 *) ``` Secant at an angle: ```wolfram Sec[Pi/4] (* Sqrt[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sec.html) for more details. # SecDegrees `SecDegrees[θ]` gives the secant of θ degrees. This is equivalent to `Sec[θ Degree]` but more convenient for degree input. Examples [#examples] ```wolfram SecDegrees[60] ``` ```wolfram SecDegrees[45] ``` ```wolfram Plot[SecDegrees[x], {x, -80, 80}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SecDegrees.html) for more details. # Sech `Sech[z]` gives the hyperbolic secant of z. Examples [#examples] Compute hyperbolic secant: ```wolfram Sech[0] (* 1 *) ``` Symbolic evaluation: ```wolfram Sech[Log[2]] (* 4/5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sech.html) for more details. # SechDistribution `SechDistribution[μ, σ]` represents the hyperbolic secant distribution with location parameter μ and scale parameter σ. * `SechDistribution[]` represents the hyperbolic secant distribution with location parameter 0 and scale parameter 1. The hyperbolic secant distribution is a symmetric, continuous probability distribution. Examples [#examples] ```wolfram dist = SechDistribution[0, 1]; PDF[dist, x] ``` ```wolfram Mean[SechDistribution[2, 3]] ``` ```wolfram RandomVariate[SechDistribution[], 5] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SechDistribution.html) for more details. # SecondOrderConeOptimization `SecondOrderConeOptimization[f, cons, vars]` finds values of variables vars that minimize the linear objective f subject to second-order cone and/or linear constraints cons. * `SecondOrderConeOptimization[c, {{a1, b1, α1, β1}, ..., {ak, bk, αk, βk}}]` finds a vector x that minimizes c.x subject to the constraints. * `SecondOrderConeOptimization[c, ..., {dom1, dom2, ...}]` takes xi to be in the domain domi, where domi is `Integers` or `Reals`. * `SecondOrderConeOptimization[..., "prop"]` specifies what solution property "prop" should be returned. Examples [#examples] ```wolfram SecondOrderConeOptimization[{1, 0}, {{{{1, 0}}, {0}, {0, 1}, 1}}, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SecondOrderConeOptimization.html) for more details. # SectorChart `SectorChart[{{x1, y1}, {x2, y2}, ...}]` makes a sector chart with sector angles proportional to xi and radii yi. `SectorChart[{data1, data2, ...}]` makes a sector chart from multiple datasets. Examples [#examples] Create a sector chart: ```wolfram SectorChart[{{1, 1}, {2, 2}, {3, 1}}] ``` With labels: ```wolfram SectorChart[{{1, 1}, {2, 2}, {3, 3}}, ChartLabels -> {"A", "B", "C"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SectorChart.html) for more details. # ShannonWavelet `ShannonWavelet[]` represents the Shannon wavelet evaluated on the equally spaced interval \{-10, 10}. * `ShannonWavelet[lim]` represents the Shannon wavelet evaluated on the equally spaced interval \{-lim, lim}. Examples [#examples] ```wolfram ShannonWavelet[] ``` ```wolfram Plot[ShannonWavelet[][x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShannonWavelet.html) for more details. # ShiftRegisterSequence `ShiftRegisterSequence[n]` gives a complete maximum-length sequence for a size n linear-feedback shift register. * `ShiftRegisterSequence[{n, {tap1, tap2, ...}}]` gives the complete sequence for a linear-feedback shift register with size n and taps at positions tapi. * `ShiftRegisterSequence[poly]` gives the sequence for a linear-feedback shift register with feedback polynomial poly. * `ShiftRegisterSequence[{n, {tap1, tap2, ...}, f}]` gives the sequence for a shift register with feedback function f. * `ShiftRegisterSequence[spec, s]` gives the first s elements of the shift register sequence. * `ShiftRegisterSequence[spec, init, s]` gives the shift register sequence starting from state init. Examples [#examples] ```wolfram ShiftRegisterSequence[4] ``` ```wolfram ShiftRegisterSequence[{3, {1, 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShiftRegisterSequence.html) for more details. # ShortTimeFourier `ShortTimeFourier[data]` returns the short-time Fourier transform (STFT) of data as a ShortTimeFourierData object. `ShortTimeFourier[data,n]` uses partitions of length n. `ShortTimeFourier[data,n,d]` uses partitions with offset d. `ShortTimeFourier[data,n,d,wfun]` applies a smoothing window wfun to each partition. `ShortTimeFourier[data,n,d,wfun,m]` pads partitions with zeros to length m prior to the computation of the transform. Examples [#examples] Compute the short-time Fourier transform: ```wolfram data = Table[Sin[n/10] + Sin[n/20], {n, 1000}]; stft = ShortTimeFourier[data] (* ShortTimeFourierData[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShortTimeFourier.html) for more details. # SiegelTheta `SiegelTheta[Ω, s]` gives the Siegel theta function with Riemann modular matrix Ω and vector s. `SiegelTheta[{ν1, ν2}, Ω, s]` gives the Siegel theta function with characteristics ν1 and ν2. Examples [#examples] Compute a Siegel theta function: ```wolfram SiegelTheta[{{I}}, {0}] (* 1.08643 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SiegelTheta.html) for more details. # SierpinskiCurve `SierpinskiCurve[n]` gives the line segments representing the nth-step Sierpiński curve. Examples [#examples] First few iterations: ```wolfram Graphics[SierpinskiCurve[3]] ``` Higher resolution: ```wolfram Graphics[SierpinskiCurve[5], AspectRatio -> Automatic] ``` Animate the curve development: ```wolfram Table[Graphics[SierpinskiCurve[n]], {n, 1, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SierpinskiCurve.html) for more details. # Sign `Sign[x]` gives $-1$, $0$, or $1$ depending on whether `x` is negative, zero, or positive. Examples [#examples] Get the sign of numbers: ```wolfram Sign[-5] (* -1 *) Sign[0] (* 0 *) Sign[3.14] (* 1 *) (* Apply to a list *) Sign[{-2, 0, 5}] (* {-1, 0, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sign.html) for more details. # Sin `Sin[z]` gives the sine of z. Examples [#examples] Sine of common angles: ```wolfram Sin[Pi/6] (* 1/2 *) Sin[Pi/2] (* 1 *) ``` Numerical evaluation: ```wolfram Sin[1.0] (* 0.841471 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sin.html) for more details. # SinDegrees `SinDegrees[θ]` gives the sine of θ degrees. Examples [#examples] ```wolfram SinDegrees[30] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SinDegrees.html) for more details. # SinIntegral `SinIntegral[z]` gives the sine integral function Si(z). Examples [#examples] Evaluate at a numeric value: ```wolfram SinIntegral[2.0] (* 1.60541 *) ``` Plot the function: ```wolfram Plot[SinIntegral[x], {x, -10, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SinIntegral.html) for more details. # Sinc `Sinc[z]` gives sinc(z). Examples [#examples] Compute the sinc function: ```wolfram Sinc[Pi] (* 0 *) ``` Plot the sinc function: ```wolfram Plot[Sinc[x], {x, -10, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sinc.html) for more details. # SinghMaddalaDistribution `SinghMaddalaDistribution[q, a, b]` represents the Singh–Maddala distribution with shape parameters q and a and scale parameter b. The Singh–Maddala distribution (also known as the Burr Type XII distribution) is used in economics for modeling income distributions. Examples [#examples] ```wolfram dist = SinghMaddalaDistribution[2, 3, 1]; PDF[dist, x] ``` ```wolfram Mean[SinghMaddalaDistribution[3, 2, 1]] ``` ```wolfram RandomVariate[SinghMaddalaDistribution[2, 2, 1], 5] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SinghMaddalaDistribution.html) for more details. # SingularValueDecomposition `SingularValueDecomposition[m]` gives the singular value decomposition for a numerical matrix m as a list `{u, σ, v}`, where m = u.σ.ConjugateTranspose\[v]. Examples [#examples] SVD of a matrix: ```wolfram {u, s, v} = SingularValueDecomposition[{{1, 2}, {3, 4}}] (* {{{-0.404, -0.915}, {-0.915, 0.404}}, {{5.46, 0}, {0, 0.366}}, ...} *) ``` Reconstruct the original matrix: ```wolfram u . s . ConjugateTranspose[v] (* {{1., 2.}, {3., 4.}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SingularValueDecomposition.html) for more details. # SingularValueList `SingularValueList[m]` gives a list of the nonzero singular values of a matrix m. Examples [#examples] Singular values: ```wolfram SingularValueList[{{1, 2}, {3, 4}}] (* {5.465, 0.366} *) ``` Get k largest: ```wolfram SingularValueList[{{1, 2, 3}, {4, 5, 6}}, 1] (* {9.508} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SingularValueList.html) for more details. # SingularValues `SingularValues[m]` gives the singular value decomposition for a numerical matrix m. The result is a list \{u, w, v}, where w is the list of singular values, and m can be written as ConjugateTranspose\[u].DiagonalMatrix\[w].v. Examples [#examples] ```wolfram SingularValues[{{1, 2}, {3, 4}}] ``` ```wolfram {u, w, v} = SingularValues[RandomReal[1, {3, 3}]]; w ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SingularValues.html) for more details. # Sinh `Sinh[z]` gives the hyperbolic sine of `z`, defined as $(e^z - e^{-z})/2$. Examples [#examples] Compute hyperbolic sine values: ```wolfram Sinh[0] (* 0 *) Sinh[1.0] (* 1.1752 *) Sinh[Log[2]] (* 3/4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sinh.html) for more details. # SinhIntegral `SinhIntegral[z]` gives the hyperbolic sine integral function Shi(z). Examples [#examples] Evaluate at a numeric value: ```wolfram SinhIntegral[2.0] (* 2.50157 *) ``` Plot the function: ```wolfram Plot[SinhIntegral[x], {x, -5, 5}] (* Graphics[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SinhIntegral.html) for more details. # SixJSymbol `SixJSymbol[{j1, j2, j3}, {j4, j5, j6}]` gives the values of the Wigner 6-j symbol. Examples [#examples] ```wolfram SixJSymbol[{1, 1, 1}, {1, 1, 1}] (* 1/6 *) ``` ```wolfram SixJSymbol[{2, 2, 2}, {2, 2, 2}] (* 1/14 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SixJSymbol.html) for more details. # SmallCircle `SmallCircle[x, y, …]` displays as x∘y∘…. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmallCircle.html) for more details. # SpatialJ `SpatialJ[pdata, r]` estimates the J function J(r) for point data *pdata* at radius *r*. * `SpatialJ[pproc, r]` computes J(r) for the point process *pproc*. * `SpatialJ[bdata, r]` computes J(r) for binned data *bdata*. * `SpatialJ[pspec]` generates the function J that can be applied repeatedly to different radii *r*. Examples [#examples] ```wolfram pts = SpatialPointData[RandomPoint[Disk[], 100]]; SpatialJ[pts, 0.1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialJ.html) for more details. # SpatialMedian `SpatialMedian[{x1, x2, ...}]` gives the spatial median of the elements xi. * `SpatialMedian[data]` gives the spatial median for several different forms of data. Examples [#examples] ```wolfram SpatialMedian[{{0, 0}, {1, 0}, {0, 1}, {1, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialMedian.html) for more details. # SphericalBesselJ `SphericalBesselJ[n, z]` gives the spherical Bessel function of the first kind jₙ(z). Examples [#examples] Evaluate the spherical Bessel function: ```wolfram SphericalBesselJ[0, 1.0] ``` Plot spherical Bessel functions for different orders: ```wolfram Plot[{SphericalBesselJ[0, x], SphericalBesselJ[1, x], SphericalBesselJ[2, x]}, {x, 0, 15}, PlotLegends -> {"j0", "j1", "j2"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalBesselJ.html) for more details. # SphericalBesselY `SphericalBesselY[n, z]` gives the spherical Bessel function of the second kind yn(z). Examples [#examples] ```wolfram SphericalBesselY[2, 1.5] ``` ```wolfram Plot[SphericalBesselY[1, x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalBesselY.html) for more details. # SphericalHankelH1 `SphericalHankelH1[n, z]` gives the spherical Hankel function of the first kind h\_n^(1)(z). Examples [#examples] Evaluate the spherical Hankel function: ```wolfram SphericalHankelH1[1, 2.0] ``` Symbolic expression: ```wolfram SphericalHankelH1[0, z] ``` Plot the function: ```wolfram Plot[{Re[SphericalHankelH1[1, x]], Im[SphericalHankelH1[1, x]]}, {x, 0.1, 10}, PlotLegends -> {"Re", "Im"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalHankelH1.html) for more details. # SphericalHankelH2 `SphericalHankelH2[n, z]` gives the spherical Hankel function of the second kind h\_n^(2)(z). Examples [#examples] ```wolfram SphericalHankelH2[0, 1.0] ``` ```wolfram SphericalHankelH2[2, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalHankelH2.html) for more details. # SphericalHarmonicY `SphericalHarmonicY[l, m, θ, ϕ]` gives the spherical harmonic Ylm(θ,ϕ). Examples [#examples] ```wolfram SphericalHarmonicY[2, 1, θ, ϕ] (* -1/2 Sqrt[15/(2 π)] Cos[θ] Sin[θ] E^(I ϕ) *) ``` ```wolfram SphericalHarmonicY[1, 0, Pi/4, 0] (* Sqrt[3/(4 π)] Cos[Pi/4] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SphericalHarmonicY.html) for more details. # SpheroidalEigenvalue `SpheroidalEigenvalue[n, m, γ]` gives the spheroidal eigenvalue with degree n and order m. Spheroidal eigenvalues appear in the solution of the Helmholtz equation in spheroidal coordinates. Examples [#examples] ```wolfram SpheroidalEigenvalue[2, 0, 1] ``` ```wolfram N[SpheroidalEigenvalue[3, 1, 0.5]] ``` ```wolfram Table[SpheroidalEigenvalue[n, 0, 1], {n, 0, 4}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalEigenvalue.html) for more details. # SpheroidalJoiningFactor `SpheroidalJoiningFactor[n, m, γ]` gives the spheroidal joining factor with degree n and order m. Examples [#examples] ```wolfram SpheroidalJoiningFactor[2, 0, 1.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalJoiningFactor.html) for more details. # SpheroidalPS `SpheroidalPS[n, m, γ, z]` gives the angular spheroidal function PSn,m(γ, z) of the first kind. Examples [#examples] ```wolfram SpheroidalPS[2, 1, 0.5, 0.3] ``` ```wolfram Plot[SpheroidalPS[2, 0, 1, x], {x, -1, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalPS.html) for more details. # SpheroidalPSPrime `SpheroidalPSPrime[n, m, γ, z]` gives the derivative with respect to z of the angular spheroidal function PS\_n,m(γ, z) of the first kind. Examples [#examples] ```wolfram SpheroidalPSPrime[2, 1, 0.5, 0.3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalPSPrime.html) for more details. # SpheroidalQS `SpheroidalQS[n, m, γ, z]` gives the angular spheroidal function QS\_n,m(γ,z) of the second kind. This is a special function used in solving wave equations in spheroidal coordinates. Examples [#examples] ```wolfram SpheroidalQS[2, 1, 1.0, 0.5] ``` ```wolfram Plot[SpheroidalQS[2, 0, 1, x], {x, -1, 1}] ``` ```wolfram N[SpheroidalQS[3, 1, 2, 0.3]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalQS.html) for more details. # SpheroidalQSPrime `SpheroidalQSPrime[n,m,γ,z]` gives the derivative with respect to z of the angular spheroidal function QSn,m(γ,z) of the second kind. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalQSPrime.html) for more details. # SpheroidalRadialFactor `SpheroidalRadialFactor[n, m, c]` gives the spheroidal radial factor with degree n and order m. Examples [#examples] Compute spheroidal radial factor: ```wolfram SpheroidalRadialFactor[2, 1, 0.5] ``` Numerical evaluation: ```wolfram N[SpheroidalRadialFactor[3, 2, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalRadialFactor.html) for more details. # SpheroidalS1 `SpheroidalS1[n, m, γ, z]` gives the radial spheroidal function S\_\{n,m}^\{(1)}(γ, z) of the first kind. Examples [#examples] ```wolfram SpheroidalS1[2, 1, 0.5, 0.3] ``` ```wolfram Plot[SpheroidalS1[2, 0, 1, x], {x, 1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalS1.html) for more details. # SpheroidalS2 `SpheroidalS2[n, m, γ, z]` gives the radial spheroidal function of the second kind. Examples [#examples] Evaluate a spheroidal function of the second kind: ```wolfram SpheroidalS2[2, 1, 0.5, 1.5] (* -0.326547 *) ``` Plot the function: ```wolfram Plot[SpheroidalS2[2, 0, 1, z], {z, 1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpheroidalS2.html) for more details. # Sqrt `Sqrt[z]` gives the square root of z. Examples [#examples] Exact square roots: ```wolfram Sqrt[16] (* 4 *) Sqrt[2] (* Sqrt[2] - kept symbolic *) ``` Numerical evaluation: ```wolfram Sqrt[2.0] (* 1.41421 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Sqrt.html) for more details. # SquareWave `SquareWave[x]` gives a square wave that alternates between +1 and -1 with unit period. `SquareWave[{y1, y2}, x]` gives a square wave that alternates between y1 and y2 with unit period. Examples [#examples] Plot a square wave: ```wolfram Plot[SquareWave[x], {x, 0, 3}] ``` Square wave alternating between 0 and 5: ```wolfram Plot[SquareWave[{0, 5}, x], {x, 0, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SquareWave.html) for more details. # StationaryWaveletPacketTransform `StationaryWaveletPacketTransform[data]` gives the stationary wavelet packet transform (SWPT) of an array of data. `StationaryWaveletPacketTransform[data,wave]` gives the stationary wavelet packet transform using the wavelet wave. `StationaryWaveletPacketTransform[data,wave,r]` gives the stationary wavelet packet transform using r levels of refinement. Examples [#examples] Compute the stationary wavelet packet transform: ```wolfram data = Table[Sin[x], {x, 0, 2 Pi, 0.1}]; StationaryWaveletPacketTransform[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StationaryWaveletPacketTransform.html) for more details. # StationaryWaveletTransform `StationaryWaveletTransform[data]` gives the stationary wavelet transform (SWT) of an array of data. `StationaryWaveletTransform[data, wave]` gives the stationary wavelet transform using the wavelet wave. `StationaryWaveletTransform[data, wave, r]` gives the stationary wavelet transform using r levels of refinement. Examples [#examples] ```wolfram StationaryWaveletTransform[{1, 2, 3, 4, 5, 6, 7, 8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StationaryWaveletTransform.html) for more details. # StieltjesGamma `StieltjesGamma[n]` gives the Stieltjes constant γn. `StieltjesGamma[n, a]` gives the generalized Stieltjes constant γn(a). Examples [#examples] The Euler-Mascheroni constant: ```wolfram StieltjesGamma[0] (* EulerGamma *) ``` Higher Stieltjes constants: ```wolfram N[StieltjesGamma[1]] (* -0.0728158 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StieltjesGamma.html) for more details. # StirlingS1 `StirlingS1[n, m]` gives the Stirling number of the first kind, related to permutations with cycles. Examples [#examples] Stirling numbers of the first kind: ```wolfram Table[StirlingS1[4, k], {k, 0, 4}] (* {0, 6, -11, 6, -1} *) ``` Single value: ```wolfram StirlingS1[5, 2] (* 50 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StirlingS1.html) for more details. # StirlingS2 `StirlingS2[n, m]` gives the Stirling number of the second kind, the number of ways to partition n elements into m non-empty subsets. Examples [#examples] Stirling numbers of the second kind: ```wolfram Table[StirlingS2[4, k], {k, 0, 4}] (* {0, 1, 7, 6, 1} *) ``` Partition count: ```wolfram StirlingS2[5, 3] (* 25 - ways to partition 5 elements into 3 groups *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StirlingS2.html) for more details. # StruveH `StruveH[n, z]` gives the Struve function Hₙ(z). Examples [#examples] Compute Struve H function: ```wolfram StruveH[1, 2.5] ``` Plot the function: ```wolfram Plot[StruveH[0, x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StruveH.html) for more details. # StruveL `StruveL[n, z]` gives the modified Struve function Ln(z). Examples [#examples] Evaluate the modified Struve function: ```wolfram StruveL[0, 1.5] (* 0.802738 *) ``` Plot the function: ```wolfram Plot[StruveL[1, x], {x, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StruveL.html) for more details. # Subfactorial `Subfactorial[n]` gives the number of permutations of n objects that leave no object fixed (derangements). Examples [#examples] Number of derangements: ```wolfram Subfactorial[4] (* 9 *) ``` Subfactorial sequence: ```wolfram Table[Subfactorial[n], {n, 0, 6}] (* {1, 0, 1, 2, 9, 44, 265} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subfactorial.html) for more details. # Subtract `x-y` is equivalent to `x+(-1*y)`. Examples [#examples] ```wolfram Subtract[10, 3] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Subtract.html) for more details. # Surd `Surd[x, n]` gives the real-valued nth root of x. Examples [#examples] ```wolfram Surd[-8, 3] (* -2 *) ``` ```wolfram Surd[27, 3] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Surd.html) for more details. # SymletWavelet `SymletWavelet[]` represents the Symlet wavelet of order 4. * `SymletWavelet[n]` represents the Symlet wavelet of order n. Examples [#examples] Default Symlet wavelet: ```wolfram SymletWavelet[] ``` Symlet of order 8: ```wolfram SymletWavelet[8] ``` Plot the wavelet: ```wolfram WaveletPsi[SymletWavelet[4], {x, 0, 8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymletWavelet.html) for more details. # SymmetricPolynomial `SymmetricPolynomial[k, {x1, ..., xn}]` gives the kth elementary symmetric polynomial in the variables x1, ..., xn. Examples [#examples] Get the 2nd elementary symmetric polynomial: ```wolfram SymmetricPolynomial[2, {a, b, c}] (* a b + a c + b c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricPolynomial.html) for more details. # SymmetricReduction `SymmetricReduction[f, {x1, …, xn}]` gives a pair of polynomials \{p, q} in x1, …, xn such that f == p + q, where p is the symmetric part and q is the remainder. * `SymmetricReduction[f, {x1, …, xn}, {s1, …, sn}]` gives the pair \{p, q} with the elementary symmetric polynomials in p replaced by s1, …, sn. Examples [#examples] ```wolfram SymmetricReduction[x^2 + y^2 + x*y, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SymmetricReduction.html) for more details. # Tan `Tan[z]` gives the tangent of z. Examples [#examples] Tangent of an angle: ```wolfram Tan[Pi/4] (* 1 *) ``` Numerical evaluation: ```wolfram N[Tan[1]] (* 1.5574 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tan.html) for more details. # TanDegrees `TanDegrees[θ]` gives the tangent of θ degrees. Examples [#examples] ```wolfram TanDegrees[45] ``` ```wolfram TanDegrees[30] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TanDegrees.html) for more details. # Tanh `Tanh[z]` gives the hyperbolic tangent of `z`, defined as $\sinh(z)/\cosh(z)$. Examples [#examples] Compute hyperbolic tangent values: ```wolfram Tanh[0] (* 0 *) Tanh[1.0] (* 0.761594 *) (* Tanh approaches 1 for large positive values *) Tanh[10.0] (* 0.999999996 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Tanh.html) for more details. # ThreeJSymbol `ThreeJSymbol[{j1, m1}, {j2, m2}, {j3, m3}]` gives the values of the Wigner 3-j symbol. Examples [#examples] Compute a 3-j symbol: ```wolfram ThreeJSymbol[{1, 0}, {1, 0}, {1, 0}] (* 0 *) ``` ```wolfram ThreeJSymbol[{1, 1}, {1, -1}, {1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ThreeJSymbol.html) for more details. # ThueMorse `ThueMorse[n]` gives the nth term in the Thue–Morse sequence. Examples [#examples] ```wolfram Table[ThueMorse[n], {n, 0, 15}] (* {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ThueMorse.html) for more details. # Times `x * y * z` or `x y z` represents a product of terms. Examples [#examples] Arithmetic multiplication: ```wolfram 2 * 3 * 4 (* 24 *) ``` Symbolic multiplication: ```wolfram a b c (* a b c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Times.html) for more details. # TimesBy `x *= c` multiplies x by c and returns the new value of x. Examples [#examples] Multiply a variable by a value: ```wolfram x = 5; x *= 3; x (* 15 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimesBy.html) for more details. # TuringMachine `TuringMachine[rule, init, t]` generates a list representing the evolution of the Turing machine with the specified rule from initial condition init for t steps. * `TuringMachine[rule, init]` gives the result of evolving init for one step. * `TuringMachine[rule]` is an operator form of `TuringMachine` that corresponds to one step of evolution. Examples [#examples] ```wolfram ArrayPlot[TuringMachine[2506, {{1}, 0}, 50]] ``` ```wolfram TuringMachine[2506, {{1, 0, 1}, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TuringMachine.html) for more details. # WaveletBestBasis `WaveletBestBasis[dwd]` computes a best basis representation in the `DiscreteWaveletData` object dwd. * `WaveletBestBasis[dwd, cspec]` computes a best basis representation using the cost specification cspec. Examples [#examples] ```wolfram dwd = DiscreteWaveletPacketTransform[{1, 2, 3, 4, 5, 6, 7, 8}]; WaveletBestBasis[dwd] ``` ```wolfram WaveletBestBasis[dwd, "Entropy"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletBestBasis.html) for more details. # WaveletFilterCoefficients `WaveletFilterCoefficients[wave, filt]` gives the filter coefficients for the symbolic wavelet wave of type filt. Examples [#examples] Get lowpass filter coefficients for Daubechies wavelet: ```wolfram WaveletFilterCoefficients[DaubechiesWavelet[4], "PrimalLowpass"] ``` Get highpass filter coefficients: ```wolfram WaveletFilterCoefficients[HaarWavelet[], "PrimalHighpass"] ``` All filter types: ```wolfram WaveletFilterCoefficients[DaubechiesWavelet[2], #] & /@ {"PrimalLowpass", "PrimalHighpass", "DualLowpass", "DualHighpass"} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletFilterCoefficients.html) for more details. # WaveletMapIndexed `WaveletMapIndexed[f, wd]` applies the function f to the arrays of coefficients and indices of a `ContinuousWaveletData` or `DiscreteWaveletData` object. * `WaveletMapIndexed[f, dwd, wind]` applies f to the `DiscreteWaveletData` coefficients specified by wind. * `WaveletMapIndexed[f, cwd, octvoc]` applies f to the `ContinuousWaveletData` coefficients specified by octvoc. Examples [#examples] ```wolfram dwd = DiscreteWaveletTransform[{1, 2, 3, 4, 5, 6, 7, 8}]; WaveletMapIndexed[Abs, dwd] ``` ```wolfram WaveletMapIndexed[# * 2 &, dwd, {1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletMapIndexed.html) for more details. # WaveletPhi `WaveletPhi[wave, x]` gives the scaling function ϕ(x) for the symbolic wavelet wave evaluated at x. * `WaveletPhi[wave]` gives the scaling function as a pure function. Examples [#examples] ```wolfram WaveletPhi[HaarWavelet[], x] ``` ```wolfram Plot[WaveletPhi[DaubechiesWavelet[4], x], {x, 0, 7}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletPhi.html) for more details. # WaveletPsi `WaveletPsi[wave, x]` gives the wavelet function ψ(x) for the symbolic wavelet wave evaluated at x. * `WaveletPsi[wave]` gives the wavelet function as a pure function. Examples [#examples] ```wolfram WaveletPsi[HaarWavelet[], 0.5] ``` ```wolfram Plot[WaveletPsi[DaubechiesWavelet[4], x], {x, 0, 7}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletPsi.html) for more details. # WaveletThreshold `WaveletThreshold[dwd]` thresholds the detail wavelet coefficients in the `DiscreteWaveletData` object dwd. * `WaveletThreshold[dwd, tspec]` thresholds the coefficients using the thresholding specification tspec. * `WaveletThreshold[dwd, tspec, wind]` thresholds the wavelet coefficients given by the wavelet indices wind. Examples [#examples] ```wolfram data = {1, 2, 3, 4, 5, 6, 7, 8}; dwd = DiscreteWaveletTransform[data]; WaveletThreshold[dwd] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaveletThreshold.html) for more details. # WeberE `WeberE[ν, z]` gives the Weber function Eν(z). * `WeberE[ν, μ, z]` gives the associated Weber function Eνμ(z). Examples [#examples] Weber function at a point: ```wolfram WeberE[1, 2.5] ``` Plot the Weber function: ```wolfram Plot[WeberE[0, x], {x, 0, 10}] ``` Associated Weber function: ```wolfram WeberE[1, 2, 3.0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeberE.html) for more details. # WeierstrassE1 `WeierstrassE1[{g2,g3}]` gives the value e1 of the Weierstrass elliptic function ℘ at the half-period ω1(g2,g3). Examples [#examples] Compute e1 for given invariants: ```wolfram WeierstrassE1[{4, 0}] (* 1 *) ``` Numerical evaluation: ```wolfram N[WeierstrassE1[{1, 2}]] (* -0.6299... *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassE1.html) for more details. # WeierstrassE2 `WeierstrassE2[{g2, g3}]` gives the value e₂ of the Weierstrass elliptic function ℘ at the half-period ω₂(g2, g3). Examples [#examples] Compute the Weierstrass e2 value: ```wolfram WeierstrassE2[{1, 0}] ``` Use with specific invariants: ```wolfram WeierstrassE2[{4, 0}] // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassE2.html) for more details. # WeierstrassE3 `WeierstrassE3[{g2, g3}]` gives the value $e_3$ of the Weierstrass elliptic function ℘ at the half-period $ω_3(g_2, g_3)$. Examples [#examples] ```wolfram WeierstrassE3[{1, 0}] ``` ```wolfram WeierstrassE3[{4, 0}] // N ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassE3.html) for more details. # WeierstrassEta1 `WeierstrassEta1[{g2, g3}]` gives the value η1 of the Weierstrass zeta function ζ at the half-period ω1(g2, g3). Examples [#examples] ```wolfram WeierstrassEta1[{1, 0}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassEta1.html) for more details. # WeierstrassEta2 `WeierstrassEta2[{g2, g3}]` gives the value η₂ of the Weierstrass zeta function ζ at the half-period ω₂(g₂, g₃). Examples [#examples] Compute eta2 for specific invariants: ```wolfram WeierstrassEta2[{4, 5}] ``` Relation to half-periods: ```wolfram {g2, g3} = {1, 0}; eta2 = WeierstrassEta2[{g2, g3}]; omega2 = WeierstrassHalfPeriods[{g2, g3}][[2]] ``` Numerical value: ```wolfram N[WeierstrassEta2[{1, 2}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassEta2.html) for more details. # WeierstrassEta3 `WeierstrassEta3[{g2,g3}]` gives the value η3 of the Weierstrass zeta function ζ at the half-period ω3(g2,g3). Examples [#examples] Compute eta3 for given invariants: ```wolfram WeierstrassEta3[{4, 0}] (* Complex result *) ``` Numerical evaluation: ```wolfram N[WeierstrassEta3[{1, 2}]] (* Numerical result *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassEta3.html) for more details. # WeierstrassHalfPeriodW1 `WeierstrassHalfPeriodW1[{g2, g3}]` gives the half-period ω1 for Weierstrass elliptic functions corresponding to the invariants \{g2, g3}. Examples [#examples] ```wolfram WeierstrassHalfPeriodW1[{1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassHalfPeriodW1.html) for more details. # WeierstrassHalfPeriodW2 `WeierstrassHalfPeriodW2[{g2,g3}]` gives the half-period ω2 for the Weierstrass elliptic functions corresponding to the invariants \{g2,g3}. Examples [#examples] Compute the half-period ω2: ```wolfram WeierstrassHalfPeriodW2[{1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassHalfPeriodW2.html) for more details. # WeierstrassHalfPeriodW3 `WeierstrassHalfPeriodW3[{g2, g3}]` gives the half-period ω3 for the Weierstrass elliptic functions corresponding to the invariants \{g2, g3}. Examples [#examples] Compute the half-period: ```wolfram WeierstrassHalfPeriodW3[{1, 0}] (* 1.8541 + 1.8541 I *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassHalfPeriodW3.html) for more details. # WeierstrassHalfPeriods `WeierstrassHalfPeriods[{g2,g3}]` gives the half‐periods \{ω1,ω3} for Weierstrass elliptic functions corresponding to the invariants \{g2,g3}. Examples [#examples] ```wolfram WeierstrassHalfPeriods[{1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassHalfPeriods.html) for more details. # WeierstrassInvariantG2 `WeierstrassInvariantG2[{ω, ω′}]` gives the invariant g2 for the Weierstrass elliptic functions corresponding to the half-periods \{ω, ω′}. Examples [#examples] ```wolfram WeierstrassInvariantG2[{1, I}] ``` ```wolfram WeierstrassInvariantG2[{1/2, 1/2 + I/2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassInvariantG2.html) for more details. # WeierstrassInvariantG3 `WeierstrassInvariantG3[{ω,ω′}]` gives the invariant g3 for the Weierstrass elliptic functions corresponding to the half‐periods \{ω,ω′}. Examples [#examples] Compute the g3 invariant: ```wolfram WeierstrassInvariantG3[{1, I}] (* 140 WeierstrassZeta[{1, I}]^6/27 - ... *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassInvariantG3.html) for more details. # WeierstrassInvariants `WeierstrassInvariants[{ω1, ω3}]` gives the invariants \{g2, g3} for Weierstrass elliptic functions corresponding to the half‐periods \{ω1, ω3}. Examples [#examples] ```wolfram WeierstrassInvariants[{1, I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassInvariants.html) for more details. # WeierstrassP `WeierstrassP[u, {g2, g3}]` gives the Weierstrass elliptic function ℘(u; g2, g3). Examples [#examples] Evaluate Weierstrass P function: ```wolfram WeierstrassP[0.5, {1, 2}] (* 3.40975 *) ``` Symbolic form: ```wolfram WeierstrassP[z, {g2, g3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassP.html) for more details. # WeierstrassPPrime `WeierstrassPPrime[u,{g2,g3}]` gives the derivative of the Weierstrass elliptic function ℘(u;g2,g3). Examples [#examples] Compute the derivative of the Weierstrass P function: ```wolfram WeierstrassPPrime[0.5, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassPPrime.html) for more details. # WeierstrassSigma `WeierstrassSigma[u,{g2,g3}]` gives the Weierstrass sigma function σ(u;g2,g3). Examples [#examples] Compute the Weierstrass sigma function: ```wolfram WeierstrassSigma[0.5, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassSigma.html) for more details. # WeierstrassZeta `WeierstrassZeta[u,{g2,g3}]` gives the Weierstrass zeta function ζ(u;g2,g3). Examples [#examples] Evaluate the Weierstrass zeta function: ```wolfram WeierstrassZeta[0.5, {1, 2}] (* 1.94773 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeierstrassZeta.html) for more details. # WhittakerM `WhittakerM[k,m,z]` gives the Whittaker function $M_{k,m}(z)$. Examples [#examples] Evaluate the Whittaker M function: ```wolfram WhittakerM[1, 0.5, 2.0] (* 2.71828 *) ``` Plot the function: ```wolfram Plot[WhittakerM[0.5, 0.25, x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WhittakerM.html) for more details. # WhittakerW `WhittakerW[k, m, z]` gives the Whittaker function $W_{k,m}(z)$. Examples [#examples] Evaluate the Whittaker W function: ```wolfram WhittakerW[1, 0.5, 2.0] (* 0.27067 *) ``` Plot the function: ```wolfram Plot[WhittakerW[0.5, 0.25, x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WhittakerW.html) for more details. # WignerD `WignerD[{j, m1, m2}, ψ, θ, ϕ]` gives the Wigner D-function. `WignerD[{j, m1, m2}, θ, ϕ]` gives the Wigner D-function with ψ=0. `WignerD[{j, m1, m2}, θ]` gives the Wigner D-function with ψ=0 and ϕ=0. Examples [#examples] Compute a Wigner D-function: ```wolfram WignerD[{2, 1, 0}, Pi/4] (* -Sqrt[3/8] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WignerD.html) for more details. # WilksW `WilksW[m1, m2]` gives Wilks's W for the matrices m1 and m2. Examples [#examples] ```wolfram m1 = {{2, 1}, {1, 3}}; m2 = {{5, 2}, {2, 4}}; WilksW[m1, m2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WilksW.html) for more details. # WinsorizedVariance `WinsorizedVariance[list, f]` gives the variance of the elements in list after replacing the fraction f of the smallest and largest elements by the remaining extreme values. * `WinsorizedVariance[list, {f1, f2}]` gives the variance when the fraction f1 of the smallest elements and the fraction f2 of the largest elements are replaced by the remaining extreme values. * `WinsorizedVariance[list]` gives the 5% winsorized variance `WinsorizedVariance[list, 0.05]`. * `WinsorizedVariance[dist, ...]` gives the winsorized variance of a univariate distribution dist. Winsorization is a robust statistical technique that reduces the influence of outliers. Examples [#examples] ```wolfram WinsorizedVariance[{1, 2, 3, 4, 5, 6, 7, 8, 9, 100}] ``` ```wolfram WinsorizedVariance[{1, 2, 3, 4, 5, 6, 7, 8, 9, 100}, 0.1] ``` ```wolfram WinsorizedVariance[NormalDistribution[], 0.1] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WinsorizedVariance.html) for more details. # Wronskian `Wronskian[{y1, y2, ...}, x]` gives the Wronskian determinant for the functions y1, y2, … depending on x. * `Wronskian[eqn, y, x]` gives the Wronskian determinant for the basis of the solutions of the linear differential equation eqn with dependent variable y and independent variable x. * `Wronskian[eqns, {y1, y2, ...}, x]` gives the Wronskian determinant for the system of linear differential equations eqns. Examples [#examples] ```wolfram Wronskian[{Sin[x], Cos[x]}, x] ``` ```wolfram Wronskian[{Exp[x], Exp[2 x], Exp[3 x]}, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Wronskian.html) for more details. # ZernikeR `ZernikeR[n, m, r]` gives the radial Zernike polynomial $R_n^m(r)$. Examples [#examples] Evaluate a Zernike polynomial: ```wolfram ZernikeR[4, 2, r] (* 4 r^4 - 3 r^2 *) ``` Numerical evaluation: ```wolfram ZernikeR[3, 1, 0.5] (* -0.125 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ZernikeR.html) for more details. # Zeta `Zeta[s]` gives the Riemann zeta function ζ(s). `Zeta[s, a]` gives the generalized Hurwitz zeta function. Examples [#examples] Riemann zeta values: ```wolfram Zeta[2] (* Pi^2/6 *) Zeta[4] (* Pi^4/90 *) ``` Numerical evaluation: ```wolfram N[Zeta[3]] (* 1.20206 - Apéry's constant *) ``` Generalized zeta: ```wolfram Zeta[2, 1/2] // N (* 4.9348 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Zeta.html) for more details. # ZetaZero `ZetaZero[k]` represents the kth zero of the Riemann zeta function on the critical line. `ZetaZero[k, t]` represents the kth zero with imaginary part greater than t. Examples [#examples] ```wolfram N[ZetaZero[1]] (* 0.5 + 14.1347 I *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ZetaZero.html) for more details. # ARCHProcess `ARCHProcess[κ, {α1, ..., αq}]` represents an autoregressive conditionally heteroscedastic process of order q, driven by a standard white noise. `ARCHProcess[κ, {α1, ..., αq}, init]` represents an ARCH process with initial data init. Examples [#examples] Create an ARCH(1) process: ```wolfram proc = ARCHProcess[0.1, {0.5}] ``` Simulate the process: ```wolfram RandomFunction[ARCHProcess[0.1, {0.3}], {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ARCHProcess.html) for more details. # AndersonDarlingTest `AndersonDarlingTest[data]` tests whether data is normally distributed using the Anderson-Darling test. `AndersonDarlingTest[data, dist]` tests whether data is distributed according to dist using the Anderson-Darling test. `AndersonDarlingTest[data, dist, "property"]` returns the value of "property". Examples [#examples] Test for normality: ```wolfram data = RandomVariate[NormalDistribution[], 100]; AndersonDarlingTest[data] (* p-value *) ``` Test against a specific distribution: ```wolfram AndersonDarlingTest[data, ExponentialDistribution[1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AndersonDarlingTest.html) for more details. # AutocorrelationTest `AutocorrelationTest[data]` tests whether the data is autocorrelated. `AutocorrelationTest[data,k]` tests whether the data is autocorrelated up to lag k. `AutocorrelationTest[data,k,"property"]` returns the value of "property" for a given model. Examples [#examples] Test for autocorrelation in data: ```wolfram data = RandomReal[1, 100]; AutocorrelationTest[data] ``` Get the p-value: ```wolfram AutocorrelationTest[data, 5, "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AutocorrelationTest.html) for more details. # BaringhausHenzeTest `BaringhausHenzeTest[data]` tests whether data follows a MultinormalDistribution using the Baringhaus–Henze test. `BaringhausHenzeTest[data, MultinormalDistribution[μ, Σ]]` tests whether data follows the distribution with mean vector μ and covariance matrix Σ. `BaringhausHenzeTest[data, "property"]` returns the value of "property". Examples [#examples] Test multivariate data for normality: ```wolfram data = RandomVariate[MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}], 100]; BaringhausHenzeTest[data] ``` Get the p-value: ```wolfram BaringhausHenzeTest[data, "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BaringhausHenzeTest.html) for more details. # BarlowProschanImportance `BarlowProschanImportance[rdist]` gives the Barlow–Proschan importances for all components in the ReliabilityDistribution rdist. `BarlowProschanImportance[fdist]` gives the Barlow–Proschan importances for all components in the FailureDistribution fdist. Examples [#examples] Compute component importance: ```wolfram rdist = ReliabilityDistribution[a && b, {{a, 0.9}, {b, 0.8}}]; BarlowProschanImportance[rdist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BarlowProschanImportance.html) for more details. # BatesDistribution `BatesDistribution[n]` represents the distribution of a mean of n random variables uniformly distributed from 0 to 1. `BatesDistribution[n, {min, max}]` represents the distribution of a mean of n random variables uniformly distributed from min to max. Examples [#examples] Sample from a Bates distribution: ```wolfram RandomVariate[BatesDistribution[10], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BatesDistribution.html) for more details. # BayesianMaximization `BayesianMaximization[f, {conf1, conf2, ...}]` gives an object representing the result of Bayesian maximization over the function f over the configurations confi. `BayesianMaximization[f, reg]` maximizes over the region represented by the region specification reg. `BayesianMaximization[f, sampler]` maximizes over configurations obtained by applying the function sampler. Examples [#examples] Maximize a function using Bayesian optimization: ```wolfram BayesianMaximization[-((#x - 2)^2 + (#y - 3)^2) &, {"x" -> {-5, 5}, "y" -> {-5, 5}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BayesianMaximization.html) for more details. # BayesianMaximizationObject `BayesianMaximizationObject[...]` represents the result of a Bayesian maximization process. Examples [#examples] Perform Bayesian maximization: ```wolfram result = BayesianMaximization[-#^2 &, {-10, 10}] (* BayesianMaximizationObject[...] *) ``` Extract the maximum: ```wolfram result["MaximumConfiguration"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BayesianMaximizationObject.html) for more details. # BayesianMinimization `BayesianMinimization[f,{conf1,conf2,…}]` gives an object representing the result of Bayesian minimization of the function f over the configurations confi. `BayesianMinimization[f,reg]` minimizes over the region represented by the region specification reg. `BayesianMinimization[f,sampler]` minimizes over configurations obtained by applying the function sampler. `BayesianMinimization[f,{conf1,conf2,…}->nsampler]` applies the function nsampler to successively generate configurations starting from the confi. Examples [#examples] Minimize a function using Bayesian optimization: ```wolfram BayesianMinimization[(#x - 2)^2 + (#y - 3)^2 &, {"x" -> {-5, 5}, "y" -> {-5, 5}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BayesianMinimization.html) for more details. # BayesianMinimizationObject `BayesianMinimizationObject[…]` represents the result of a Bayesian minimization process. Examples [#examples] Perform Bayesian minimization: ```wolfram result = BayesianMinimization[#^2 &, {-10, 10}] (* BayesianMinimizationObject[...] *) ``` Extract the minimum: ```wolfram result["MinimumConfiguration"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BayesianMinimizationObject.html) for more details. # BeckmannDistribution `BeckmannDistribution[μ1, μ2, σ1, σ2]` represents the Beckmann distribution with means μ1 and μ2 and standard deviations σ1 and σ2. `BeckmannDistribution[μ1, μ2, σ1, σ2, ρ]` represents the Beckmann distribution with means μ1 and μ2, standard deviations σ1 and σ2, and correlation ρ. Examples [#examples] Sample from a Beckmann distribution: ```wolfram RandomVariate[BeckmannDistribution[0, 0, 1, 1], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BeckmannDistribution.html) for more details. # BenfordDistribution `BenfordDistribution[b]` represents a Benford distribution with base parameter b. Examples [#examples] Sample from Benford distribution in base 10: ```wolfram RandomVariate[BenfordDistribution[10], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BenfordDistribution.html) for more details. # BeniniDistribution `BeniniDistribution[α,β,σ]` represents a Benini distribution with shape parameters α and β and scale parameter σ. Examples [#examples] ```wolfram BeniniDistribution[1, 2, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BeniniDistribution.html) for more details. # BenktanderGibratDistribution `BenktanderGibratDistribution[a, b]` represents a Benktander distribution of type I with parameters a and b. Examples [#examples] Create distribution: ```wolfram dist = BenktanderGibratDistribution[1, 0.5]; PDF[dist, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BenktanderGibratDistribution.html) for more details. # BenktanderWeibullDistribution `BenktanderWeibullDistribution[a, b]` represents a Benktander distribution of type II with parameters a and b. Examples [#examples] Create distribution: ```wolfram dist = BenktanderWeibullDistribution[1, 0.5]; PDF[dist, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BenktanderWeibullDistribution.html) for more details. # BernoulliDistribution `BernoulliDistribution[p]` represents a Bernoulli distribution with probability parameter p. Examples [#examples] Coin flip simulation: ```wolfram RandomVariate[BernoulliDistribution[0.5], 10] (* {0, 1, 1, 0, 1, 0, 0, 1, 1, 0} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BernoulliDistribution.html) for more details. # BernoulliGraphDistribution `BernoulliGraphDistribution[n, p]` represents a Bernoulli graph distribution for n-vertex graphs with edge probability p. Examples [#examples] Generate a random graph with 10 vertices and 50% edge probability: ```wolfram RandomGraph[BernoulliGraphDistribution[10, 0.5]] (* Graph[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BernoulliGraphDistribution.html) for more details. # BernoulliProcess `BernoulliProcess[p]` represents a Bernoulli process with event probability p. Examples [#examples] Simulate a Bernoulli process: ```wolfram RandomFunction[BernoulliProcess[0.3], {0, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BernoulliProcess.html) for more details. # BinnedVariogramList `BinnedVariogramList[{loc1 -> val1, loc2 -> val2, ...}]` computes a variogram using binned values. `BinnedVariogramList[{loc1, loc2, ...} -> {val1, val2, ...}]` generates the same result. `BinnedVariogramList[..., spec]` allows binning spec to be specified as given in HistogramList. Examples [#examples] Compute binned variogram: ```wolfram data = {{0, 0} -> 1, {1, 0} -> 2, {0, 1} -> 1.5}; BinnedVariogramList[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BinnedVariogramList.html) for more details. # BirnbaumImportance `BirnbaumImportance[rdist, t]` gives the Birnbaum importances for all components in the ReliabilityDistribution rdist at time t. `BirnbaumImportance[fdist, t]` gives the Birnbaum importances for all components in the FailureDistribution fdist at time t. Examples [#examples] Calculate component importance: ```wolfram rdist = ReliabilityDistribution[a && b, {{a, 0.9}, {b, 0.8}}]; BirnbaumImportance[rdist, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BirnbaumImportance.html) for more details. # BirnbaumSaundersDistribution `BirnbaumSaundersDistribution[α, λ]` represents the Birnbaum–Saunders distribution with shape parameter α and scale parameter λ. Examples [#examples] Define a Birnbaum-Saunders distribution: ```wolfram dist = BirnbaumSaundersDistribution[0.5, 1] ``` Calculate the mean: ```wolfram Mean[BirnbaumSaundersDistribution[0.5, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BirnbaumSaundersDistribution.html) for more details. # BiweightLocation `BiweightLocation[list]` gives the value of the biweight location estimator of the elements in list. `BiweightLocation[list, c]` gives the value of the biweight location estimator with scaling parameter c. Examples [#examples] Robust location estimate: ```wolfram BiweightLocation[{1, 2, 3, 4, 100}] ``` Compare with median: ```wolfram {BiweightLocation[{1, 2, 3, 4, 100}], Median[{1, 2, 3, 4, 100}]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BiweightLocation.html) for more details. # BiweightMidvariance `BiweightMidvariance[list]` gives the value of the biweight midvariance of the elements in list. `BiweightMidvariance[list, c]` gives the value of the biweight midvariance with scaling parameter c. Examples [#examples] Robust variance estimate: ```wolfram BiweightMidvariance[{1, 2, 3, 4, 100}] ``` Compare with standard variance: ```wolfram {BiweightMidvariance[{1, 2, 3, 4, 5}], Variance[{1, 2, 3, 4, 5}]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BiweightMidvariance.html) for more details. # BlomqvistBetaTest `BlomqvistBetaTest[v1, v2]` tests whether the vectors v1 and v2 are independent. `BlomqvistBetaTest[m1, m2]` tests whether the matrices m1 and m2 are independent. `BlomqvistBetaTest[..., "property"]` returns the value of "property". Examples [#examples] Test independence: ```wolfram BlomqvistBetaTest[{1, 2, 3, 4}, {2, 4, 6, 8}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BlomqvistBetaTest.html) for more details. # BorelTannerDistribution `BorelTannerDistribution[α, n]` represents a Borel–Tanner distribution with shape parameters α and n. Examples [#examples] Define a Borel-Tanner distribution: ```wolfram dist = BorelTannerDistribution[0.5, 3] ``` Calculate the mean: ```wolfram Mean[BorelTannerDistribution[0.5, 3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BorelTannerDistribution.html) for more details. # BrayCurtisDistance `BrayCurtisDistance[u, v]` gives the Bray–Curtis distance between vectors u and v. Examples [#examples] Calculate Bray-Curtis distance: ```wolfram BrayCurtisDistance[{1, 2, 3}, {4, 5, 6}] (* 3/7 *) ``` Identical vectors have zero distance: ```wolfram BrayCurtisDistance[{1, 2, 3}, {1, 2, 3}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BrayCurtisDistance.html) for more details. # CategoricalDistribution `CategoricalDistribution[{c1, c2, ...}]` represents a uniform categorical distribution over classes c1, c2, etc. `CategoricalDistribution[{c1, c2, ...}, {w1, w2, ...}]` represents a categorical distribution over classes ci with weights wi. `CategoricalDistribution[{{a1, a2, ...}, {b1, b2, ...}, ...}]` represents a uniform multivariate categorical distribution over the Cartesian product domain. Examples [#examples] Create a uniform categorical distribution: ```wolfram dist = CategoricalDistribution[{"a", "b", "c"}]; RandomVariate[dist, 5] (* {"b", "a", "c", "a", "b"} *) ``` Create a weighted categorical distribution: ```wolfram dist = CategoricalDistribution[{"red", "green", "blue"}, {0.5, 0.3, 0.2}]; PDF[dist, "red"] (* 0.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CategoricalDistribution.html) for more details. # CauchyDistribution `CauchyDistribution[a, b]` represents a Cauchy distribution with location parameter a and scale parameter b. `CauchyDistribution[]` represents a Cauchy distribution with location parameter 0 and scale parameter 1. Examples [#examples] Create and sample from a Cauchy distribution: ```wolfram dist = CauchyDistribution[0, 1]; RandomVariate[dist, 5] (* {-0.234, 1.85, -0.523, 0.771, -3.14} *) ``` Plot the probability density function: ```wolfram Plot[PDF[CauchyDistribution[0, 1], x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CauchyDistribution.html) for more details. # CensoredDistribution `CensoredDistribution[{xmin, xmax}, dist]` represents the distribution of values that come from dist and are censored to be between xmin and xmax. `CensoredDistribution[{{xmin, xmax}, {ymin, ymax}, ...}, dist]` represents the distribution of values from a multivariate distribution dist censored to specified ranges. Examples [#examples] Create a censored normal distribution between 0 and 2: ```wolfram dist = CensoredDistribution[{0, 2}, NormalDistribution[1, 1]]; Mean[dist] (* 1.0 *) ``` Sample from a censored distribution: ```wolfram RandomVariate[CensoredDistribution[{0, Infinity}, NormalDistribution[]], 5] (* {0.42, 1.21, 0.05, 0.87, 0.33} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CensoredDistribution.html) for more details. # CentralMoment `CentralMoment[data, r]` gives the order r central moment of data. `CentralMoment[data, {r1, ..., rm}]` gives the multivariate central moment of order \{r1, ..., rm}. `CentralMoment[dist, r]` gives the central moment of the distribution dist. Examples [#examples] Compute the second central moment (variance): ```wolfram CentralMoment[{1, 2, 3, 4, 5}, 2] (* 2 *) ``` Third central moment of a distribution: ```wolfram CentralMoment[NormalDistribution[0, 1], 3] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CentralMoment.html) for more details. # CentralMomentGeneratingFunction `CentralMomentGeneratingFunction[dist, t]` gives the central moment-generating function for the distribution dist as a function of t. `CentralMomentGeneratingFunction[dist, {t1, t2, ...}]` gives the central moment-generating function for a multivariate distribution. Examples [#examples] Central moment-generating function for a normal distribution: ```wolfram CentralMomentGeneratingFunction[NormalDistribution[μ, σ], t] (* E^((σ^2*t^2)/2) *) ``` For a Poisson distribution: ```wolfram CentralMomentGeneratingFunction[PoissonDistribution[λ], t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CentralMomentGeneratingFunction.html) for more details. # ChiDistribution `ChiDistribution[ν]` represents a chi distribution with ν degrees of freedom. Examples [#examples] Create a chi distribution and compute the mean: ```wolfram Mean[ChiDistribution[4]] (* (2 Sqrt[2/Pi] Gamma[5/2])/Gamma[2] *) ``` Sample from a chi distribution: ```wolfram RandomVariate[ChiDistribution[3], 5] (* {1.92, 2.15, 1.78, 2.33, 1.64} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChiDistribution.html) for more details. # ChiSquareDistribution `ChiSquareDistribution[ν]` represents a chi-square distribution with ν degrees of freedom. Examples [#examples] Create a chi-square distribution and compute statistics: ```wolfram Mean[ChiSquareDistribution[5]] (* 5 *) ``` Sample from a chi-square distribution: ```wolfram RandomVariate[ChiSquareDistribution[10], 5] (* {8.2, 11.5, 9.7, 12.1, 7.3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ChiSquareDistribution.html) for more details. # CircularOrthogonalMatrixDistribution `CircularOrthogonalMatrixDistribution[n]` represents a circular orthogonal matrix distribution with matrix dimensions \{n, n}. Examples [#examples] Sample a random orthogonal matrix: ```wolfram RandomVariate[CircularOrthogonalMatrixDistribution[3]] (* {{...}, {...}, {...}} *) ``` Verify orthogonality: ```wolfram m = RandomVariate[CircularOrthogonalMatrixDistribution[2]]; Chop[m . ConjugateTranspose[m]] (* IdentityMatrix[2] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularOrthogonalMatrixDistribution.html) for more details. # CircularQuaternionMatrixDistribution `CircularQuaternionMatrixDistribution[n]` represents a circular quaternion matrix distribution with matrix dimensions \{2n, 2n} over the field of complex numbers. Examples [#examples] Sample a random quaternion matrix: ```wolfram RandomVariate[CircularQuaternionMatrixDistribution[2]] (* {{...}, {...}, {...}, {...}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularQuaternionMatrixDistribution.html) for more details. # CircularRealMatrixDistribution `CircularRealMatrixDistribution[n]` represents a circular real matrix distribution with matrix dimensions \{n, n}. Examples [#examples] Sample a random real matrix: ```wolfram RandomVariate[CircularRealMatrixDistribution[3]] (* {{...}, {...}, {...}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularRealMatrixDistribution.html) for more details. # CircularSymplecticMatrixDistribution `CircularSymplecticMatrixDistribution[n]` represents a circular symplectic matrix distribution with matrix dimensions \{2n, 2n} over the field of complex numbers. Examples [#examples] Sample a random symplectic matrix: ```wolfram RandomVariate[CircularSymplecticMatrixDistribution[2]] (* {{...}, {...}, {...}, {...}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularSymplecticMatrixDistribution.html) for more details. # CircularUnitaryMatrixDistribution `CircularUnitaryMatrixDistribution[n]` represents a circular unitary matrix distribution with matrix dimensions \{n, n}. Examples [#examples] Sample a random unitary matrix: ```wolfram m = RandomVariate[CircularUnitaryMatrixDistribution[3]]; Chop[m . ConjugateTranspose[m]] (* IdentityMatrix[3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CircularUnitaryMatrixDistribution.html) for more details. # CompoundPoissonDistribution `CompoundPoissonDistribution[λ,dist]` represents a compound Poisson distribution with rate parameter λ and jump size distribution dist. Examples [#examples] Create a compound Poisson distribution: ```wolfram dist = CompoundPoissonDistribution[3, ExponentialDistribution[1]] ``` Compute the mean: ```wolfram Mean[CompoundPoissonDistribution[3, ExponentialDistribution[1]]] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompoundPoissonDistribution.html) for more details. # CompoundPoissonProcess `CompoundPoissonProcess[λ, jdist]` represents a compound Poisson process with rate parameter λ and jump size distribution jdist. Examples [#examples] Create a compound Poisson process: ```wolfram proc = CompoundPoissonProcess[2, ExponentialDistribution[1]] ``` Sample a path: ```wolfram RandomFunction[CompoundPoissonProcess[1, NormalDistribution[]], {0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompoundPoissonProcess.html) for more details. # CompoundRenewalProcess `CompoundRenewalProcess[rdist, jdist]` represents a compound renewal process with renewal-time distribution rdist and jump size distribution jdist. Examples [#examples] Create a compound renewal process: ```wolfram proc = CompoundRenewalProcess[ExponentialDistribution[1], NormalDistribution[]] ``` Sample a path: ```wolfram RandomFunction[CompoundRenewalProcess[ExponentialDistribution[2], UniformDistribution[]], {0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CompoundRenewalProcess.html) for more details. # ContinuousMarkovProcess `ContinuousMarkovProcess[i0, q]` represents a continuous-time finite-state Markov process with transition rate matrix q and initial state i0. `ContinuousMarkovProcess[p0, q]` represents a Markov process with initial state probability vector p0. `ContinuousMarkovProcess[..., m, μ]` represents a Markov process with transition matrix m and transition rates μ. `ContinuousMarkovProcess[..., g]` represents a Markov process with transition rate matrix from the graph g. Examples [#examples] Two-state continuous Markov process: ```wolfram proc = ContinuousMarkovProcess[1, {{-1, 1}, {2, -2}}]; RandomFunction[proc, {0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ContinuousMarkovProcess.html) for more details. # CopulaDistribution `CopulaDistribution[ker, {dist1, dist2, ...}]` represents a copula distribution with kernel distribution ker and marginal distributions dist1, dist2, .... Examples [#examples] Create a Gaussian copula: ```wolfram CopulaDistribution["Gaussian", {NormalDistribution[], ExponentialDistribution[1]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CopulaDistribution.html) for more details. # CorrelationDistance `CorrelationDistance[u, v]` gives the correlation coefficient distance between vectors u and v. Examples [#examples] Compute correlation distance: ```wolfram CorrelationDistance[{1, 2, 3}, {4, 5, 6}] (* 0 *) ``` Uncorrelated vectors: ```wolfram CorrelationDistance[{1, 0, -1}, {1, 2, 1}] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CorrelationDistance.html) for more details. # CorrelationFunction `CorrelationFunction[data, hspec]` estimates the correlation function at lags hspec from data. `CorrelationFunction[proc, hspec]` represents the correlation function at lags hspec for the random process proc. `CorrelationFunction[proc, s, t]` represents the correlation function at times s and t for the random process proc. Examples [#examples] Estimate correlation from data: ```wolfram data = RandomReal[1, 100]; CorrelationFunction[data, {1, 2, 3}] ``` Correlation function of a process: ```wolfram CorrelationFunction[WienerProcess[], s, t] (* Min[s, t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CorrelationFunction.html) for more details. # CorrelationTest `CorrelationTest[{{x1, y1}, {x2, y2}, ...}]` tests whether the correlation coefficient for a bivariate population is zero. `CorrelationTest[{{x1, y1}, {x2, y2}, ...}, ρ0]` tests whether the correlation coefficient is ρ0. `CorrelationTest[..., "property"]` returns the value of "property". Examples [#examples] Test correlation significance: ```wolfram CorrelationTest[{{1, 2}, {2, 4}, {3, 5}, {4, 8}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CorrelationTest.html) for more details. # CovarianceFunction `CovarianceFunction[data, hspec]` estimates the covariance function at lags hspec from data. `CovarianceFunction[proc, hspec]` represents the covariance function at lags hspec for the random process proc. `CovarianceFunction[proc, s, t]` represents the covariance function at times s and t for the random process proc. Examples [#examples] Estimate covariance from data: ```wolfram data = RandomReal[1, 100]; CovarianceFunction[data, {1, 2, 3}] ``` Covariance function of a Wiener process: ```wolfram CovarianceFunction[WienerProcess[], s, t] (* Min[s, t] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CovarianceFunction.html) for more details. # CoxIngersollRossProcess `CoxIngersollRossProcess[μ, σ, θ, x0]` represents a Cox–Ingersoll–Ross process with long‐term mean μ, volatility σ, speed of adjustment θ, and initial condition x0. Examples [#examples] Create a CIR process: ```wolfram CoxIngersollRossProcess[0.05, 0.1, 0.5, 0.03] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoxIngersollRossProcess.html) for more details. # CoxModel `CoxModel[...]` represents the symbolic proportional hazards model obtained from CoxModelFit. Examples [#examples] Fit a Cox model and get properties: ```wolfram data = {{1, 0}, {2, 1}, {3, 0}, {4, 1}}; model = CoxModelFit[data]; model["HazardRatio"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoxModel.html) for more details. # CoxModelFit `CoxModelFit[{e1, ..., en}]` constructs a model of the baseline hazard h0(t) for events times ei. `CoxModelFit[{{{ξ11, ..., ξ1p}, ..., {ξn1, ..., ξnp}}, {e1, ..., en}}, {f1, ..., fm}, {x1, ..., xp}]` constructs a Cox model of the form h0(t) exp(β1 f1 + ... + βm fm), where the fi depend on the xk. Examples [#examples] Fit a Cox proportional hazards model: ```wolfram times = {1, 2, 3, 4, 5}; CoxModelFit[times] ``` With covariates: ```wolfram data = {{{0.5}, {1.2}, {0.8}}, {1, 2, 3}}; CoxModelFit[data, x, {x}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoxModelFit.html) for more details. # CoxianDistribution `CoxianDistribution[{α1, ..., αm-1}, {λ1, ..., λm}]` represents an m-phase Coxian distribution with phase probabilities αi and rates λi. Examples [#examples] Create a Coxian distribution: ```wolfram CoxianDistribution[{0.5}, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CoxianDistribution.html) for more details. # CramerVonMisesTest `CramerVonMisesTest[data]` tests whether data is normally distributed using the Cramér–von Mises test. `CramerVonMisesTest[data, dist]` tests whether data is distributed according to dist using the Cramér–von Mises test. `CramerVonMisesTest[data, dist, "property"]` returns the value of "property". Examples [#examples] Test for normality: ```wolfram data = RandomVariate[NormalDistribution[], 100]; CramerVonMisesTest[data] ``` Test against a specific distribution: ```wolfram CramerVonMisesTest[data, UniformDistribution[{0, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CramerVonMisesTest.html) for more details. # CriticalityFailureImportance `CriticalityFailureImportance[rdist, t]` gives the criticality failure importances for all components in the ReliabilityDistribution rdist at time t. `CriticalityFailureImportance[fdist, t]` gives the criticality failure importances for all components in the FailureDistribution fdist at time t. Examples [#examples] Calculate criticality failure importance: ```wolfram rdist = ReliabilityDistribution[a && b, {{a, 0.9}, {b, 0.8}}]; CriticalityFailureImportance[rdist, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CriticalityFailureImportance.html) for more details. # CriticalitySuccessImportance `CriticalitySuccessImportance[rdist, t]` gives the criticality success importances for all components in the ReliabilityDistribution rdist at time t. `CriticalitySuccessImportance[fdist, t]` gives the criticality success importances for all components in the FailureDistribution fdist at time t. Examples [#examples] Calculate criticality success importance: ```wolfram rdist = ReliabilityDistribution[a || b, {{a, 0.9}, {b, 0.8}}]; CriticalitySuccessImportance[rdist, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CriticalitySuccessImportance.html) for more details. # Cumulant `Cumulant[data, r]` gives the rth cumulant κr of data. `Cumulant[data, {r1, ..., rm}]` gives the multivariate cumulant of order \{r1, ..., rm} κr1, ..., rm of data. `Cumulant[dist, r]` gives the rth cumulant of the distribution dist. `Cumulant[r]` represents the rth formal cumulant. Examples [#examples] Compute the third cumulant: ```wolfram Cumulant[{1, 2, 3, 4, 5}, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cumulant.html) for more details. # CumulantGeneratingFunction `CumulantGeneratingFunction[dist, t]` gives the cumulant-generating function for the distribution dist as a function of the variable t. `CumulantGeneratingFunction[dist, {t1, t2, ...}]` gives the cumulant-generating function for the multivariate distribution dist as a function of the variables t1, t2, .... Examples [#examples] Cumulant generating function of normal distribution: ```wolfram CumulantGeneratingFunction[NormalDistribution[μ, σ], t] (* μ t + (σ^2 t^2)/2 *) ``` For Poisson distribution: ```wolfram CumulantGeneratingFunction[PoissonDistribution[λ], t] (* λ (E^t - 1) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CumulantGeneratingFunction.html) for more details. # DagumDistribution `DagumDistribution[p,a,b]` represents a Dagum distribution with shape parameters p and a and scale parameter b. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DagumDistribution.html) for more details. # DataDistribution `DataDistribution[ddist, ...]` represents a probability distribution of type ddist, estimated from a set of data. Examples [#examples] Estimate distribution from data: ```wolfram data = RandomVariate[NormalDistribution[], 1000]; dist = SmoothKernelDistribution[data] (* DataDistribution["Smooth Kernel", ...] *) ``` Use the estimated distribution: ```wolfram PDF[dist, 0] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DataDistribution.html) for more details. # DateDistribution `DateDistribution[dist, dunit, dorig]` represents a distribution dist of dates with date scale unit dunit and date origin dorig. Examples [#examples] Create a date distribution: ```wolfram DateDistribution[NormalDistribution[0, 1], "Day", DateObject[{2020, 1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DateDistribution.html) for more details. # DavisDistribution `DavisDistribution[b,n,μ]` represents a Davis distribution with scale parameter b, shape parameter n, and location parameter μ. Examples [#examples] Create a Davis distribution: ```wolfram dist = DavisDistribution[1, 2, 0]; Mean[dist] ``` Sample from the distribution: ```wolfram RandomVariate[DavisDistribution[1, 2, 0], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DavisDistribution.html) for more details. # DegreeGraphDistribution `DegreeGraphDistribution[dlist]` represents a degree graph distribution with vertex degree dlist. Examples [#examples] Sample a random graph with given degree sequence: ```wolfram RandomGraph[DegreeGraphDistribution[{2, 2, 2, 2}]] ``` Generate graphs with specified degrees: ```wolfram graphs = RandomGraph[DegreeGraphDistribution[{3, 3, 2, 2, 2, 2}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DegreeGraphDistribution.html) for more details. # DensityHistogram `DensityHistogram[{{x1, y1}, {x2, y2}, ...}]` plots a density histogram of the values `{xi, yi}`. `DensityHistogram[data, bspec]` plots a density histogram with bins specified by bspec. `DensityHistogram[data, bspec, hspec]` computes bin densities according to hspec. Examples [#examples] Create a 2D density histogram: ```wolfram data = RandomReal[{0, 1}, {1000, 2}]; DensityHistogram[data] ``` With specified bin count: ```wolfram DensityHistogram[data, 20, ColorFunction -> "Rainbow"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DensityHistogram.html) for more details. # DesignMatrix `DesignMatrix[{{x11, x12, ..., y1}, {x21, x22, ..., y2}, ...}, {f1, f2, ...}, {x1, x2, ...}]` constructs the design matrix for the linear model β₀ + β₁f₁ + β₂f₂ + .... Examples [#examples] ```wolfram DesignMatrix[{{1, 1}, {2, 2}, {3, 4}}, {x, x^2}, x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DesignMatrix.html) for more details. # DirichletDistribution `DirichletDistribution[{α1, ..., αk+1}]` represents a Dirichlet distribution of dimension k with shape parameters αi. Examples [#examples] Create a Dirichlet distribution: ```wolfram dist = DirichletDistribution[{1, 2, 3}] ``` Generate random samples: ```wolfram RandomVariate[DirichletDistribution[{1, 1, 1}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DirichletDistribution.html) for more details. # DiscreteMarkovProcess `DiscreteMarkovProcess[i0, m]` represents a discrete-time, finite-state Markov process with transition matrix m and initial state i0. `DiscreteMarkovProcess[p0, m]` represents a Markov process with initial state probability vector p0. `DiscreteMarkovProcess[..., g]` represents a Markov process with transition matrix from the graph g. Examples [#examples] Create a simple two-state Markov process: ```wolfram DiscreteMarkovProcess[1, {{0.5, 0.5}, {0.3, 0.7}}] (* DiscreteMarkovProcess[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteMarkovProcess.html) for more details. # DiscreteUniformDistribution `DiscreteUniformDistribution[{imin, imax}]` represents a discrete uniform distribution over integers from imin to imax. `DiscreteUniformDistribution[{{imin, imax}, {jmin, jmax}, ...}]` represents a multivariate discrete uniform distribution. Examples [#examples] Roll a die: ```wolfram RandomVariate[DiscreteUniformDistribution[{1, 6}], 10] ``` Mean of uniform distribution: ```wolfram Mean[DiscreteUniformDistribution[{1, 100}]] (* 101/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DiscreteUniformDistribution.html) for more details. # DistributionFitTest `DistributionFitTest[data]` tests whether data is normally distributed. `DistributionFitTest[data, dist]` tests whether data is distributed according to dist. `DistributionFitTest[data, dist, "property"]` returns the value of "property". Examples [#examples] Test for normality: ```wolfram data = RandomVariate[NormalDistribution[], 100]; DistributionFitTest[data] (* p-value *) ``` Test against specific distribution: ```wolfram DistributionFitTest[data, ExponentialDistribution[1], "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DistributionFitTest.html) for more details. # EditDistance `EditDistance[u,v]` gives the edit or Levenshtein distance between strings, vectors or biomolecular sequences u and v. Examples [#examples] Find the edit distance between two strings: ```wolfram EditDistance["kitten", "sitting"] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EditDistance.html) for more details. # EmpiricalDistribution `EmpiricalDistribution[{x1, x2, ...}]` represents an empirical distribution based on the data values xi. `EmpiricalDistribution[{{x1, y1, ...}, {x2, y2, ...}, ...}]` represents a multivariate empirical distribution. `EmpiricalDistribution[{w1, w2, ...} -> {d1, d2, ...}]` represents an empirical distribution where data values di occur with weights wi. Examples [#examples] Create an empirical distribution from data: ```wolfram EmpiricalDistribution[{1, 2, 2, 3, 3, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EmpiricalDistribution.html) for more details. # Entropy `Entropy[list]` gives the base E information entropy of the values in list. `Entropy[k, list]` gives the base k information entropy. Examples [#examples] ```wolfram Entropy[{a, b, a, c, b, a}] (* Log[6] - 2/3 Log[3] *) ``` ```wolfram Entropy[2, {1, 1, 0, 1, 0}] (* Entropy in bits *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Entropy.html) for more details. # ErlangB `ErlangB[c, a]` computes the Erlang B loss probability for an M/M/c/c queue. Examples [#examples] Compute Erlang B probability: ```wolfram ErlangB[10, 8] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ErlangB.html) for more details. # ErlangC `ErlangC[c, a]` computes the Erlang C probability for nonzero waiting time in an M/M/c queue. Examples [#examples] Compute Erlang C probability: ```wolfram ErlangC[10, 8] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ErlangC.html) for more details. # ErlangDistribution `ErlangDistribution[k, λ]` represents the Erlang distribution with shape parameter k and rate λ. Examples [#examples] Create Erlang distribution: ```wolfram dist = ErlangDistribution[3, 1] ``` Generate random samples: ```wolfram RandomVariate[ErlangDistribution[5, 2], 10] ``` Mean of Erlang distribution: ```wolfram Mean[ErlangDistribution[k, λ]] (* k/λ *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ErlangDistribution.html) for more details. # EstimatedDistribution `EstimatedDistribution[data, dist]` estimates the parametric distribution dist from data. Examples [#examples] Estimate normal parameters: ```wolfram data = RandomVariate[NormalDistribution[5, 2], 1000]; EstimatedDistribution[data, NormalDistribution[μ, σ]] (* NormalDistribution[5.02, 1.98] *) ``` Estimate exponential: ```wolfram data = RandomVariate[ExponentialDistribution[0.5], 500]; EstimatedDistribution[data, ExponentialDistribution[λ]] (* ExponentialDistribution[0.51] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedDistribution.html) for more details. # EstimatedPointNormals `EstimatedPointNormals[{p1,p2,...}]` estimates normal vectors for the points p1, p2, .... `EstimatedPointNormals[mreg]` estimates normal vectors for the vertices of the mesh region mreg. Examples [#examples] ```wolfram pts = RandomPoint[Sphere[], 100]; EstimatedPointNormals[pts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedPointNormals.html) for more details. # EstimatedPointProcess `EstimatedPointProcess[pdata, pproc]` estimates the parametric point process pproc from point data pdata. `EstimatedPointProcess[pdata, pproc, {{p, p0}, {q, q0}, ...}]` estimates the parameters p, q, ... with starting values p0, q0, .... Examples [#examples] Estimate a Poisson point process: ```wolfram EstimatedPointProcess[data, PoissonPointProcess[λ]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedPointProcess.html) for more details. # EstimatedProcess `EstimatedProcess[data,proc]` estimates the parametric process proc from data. `EstimatedProcess[data,proc,{{p,p0},{q,q0},…}]` estimates the parameters p, q, … with starting values p0, q0, …. `EstimatedProcess[data,proc,iproc]` estimates process proc with starting values taken from the instantiated process iproc. Examples [#examples] Estimate an AR process from data: ```wolfram data = RandomFunction[ARProcess[{0.5}, 1], {0, 100}]; EstimatedProcess[data, ARProcess[{a}, v]] (* ARProcess[{0.498...}, 1.02...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedProcess.html) for more details. # EstimatedVariogramModel `EstimatedVariogramModel[{loc1 -> val1, loc2 -> val2, ...}]` estimates the best variogram function from values vali given at locations loci. `EstimatedVariogramModel[{loc1, loc2, ...} -> {val1, val2, ...}]` generates the same result. `EstimatedVariogramModel[..., "model"]` estimates the best parameters of the variogram function specified by "model". `EstimatedVariogramModel[..., {"model", params}]` estimates the non-numeric parameters in params. Examples [#examples] Estimate a variogram from spatial data: ```wolfram data = {{0, 0} -> 1.2, {1, 0} -> 1.5, {0, 1} -> 1.3, {1, 1} -> 1.8}; EstimatedVariogramModel[data] ``` Use a specific variogram model: ```wolfram EstimatedVariogramModel[data, "Spherical"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EstimatedVariogramModel.html) for more details. # EventSeries `EventSeries[{{t1, v1}, {t2, v2}, ...}]` represents a series of events given as time-value pairs \{ti, vi}. `EventSeries[{v1, v2, ...}, tspec]` represents a series of events with values vi at times specified by tspec. Examples [#examples] ```wolfram EventSeries[{{0, "start"}, {1, "middle"}, {2, "end"}}] ``` ```wolfram EventSeries[{1, 0, 1, 0}, {0, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EventSeries.html) for more details. # ExtremeValueDistribution `ExtremeValueDistribution[α, β]` represents an extreme value distribution with location parameter α and scale parameter β. `ExtremeValueDistribution[]` represents an extreme value distribution with location 0 and scale 1. Examples [#examples] Generate random samples: ```wolfram RandomVariate[ExtremeValueDistribution[0, 1], 5] ``` Compute the mean: ```wolfram Mean[ExtremeValueDistribution[0, 1]] (* EulerGamma *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ExtremeValueDistribution.html) for more details. # FRatioDistribution `FRatioDistribution[n,m]` represents an F-ratio distribution with n numerator and m denominator degrees of freedom. Examples [#examples] Create an F-distribution with 5 and 10 degrees of freedom: ```wolfram dist = FRatioDistribution[5, 10]; Mean[dist] (* 5/4 *) ``` Plot the PDF: ```wolfram Plot[PDF[FRatioDistribution[5, 10], x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FRatioDistribution.html) for more details. # FailureDistribution `FailureDistribution[bexpr,{{x1,dist1},{x2,dist2},…}]` represents the failure distribution for a system with events xi having reliability distribution disti where the top event occurs when the Boolean expression bexpr is True and event xi has occurred when xi is True. Examples [#examples] ```wolfram (* Series system: fails if any component fails *) FailureDistribution[x1 || x2, { {x1, ExponentialDistribution[1/100]}, {x2, ExponentialDistribution[1/200]} }] (* Parallel system: fails only if all fail *) FailureDistribution[x1 && x2, { {x1, WeibullDistribution[2, 100]}, {x2, WeibullDistribution[2, 150]} }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FailureDistribution.html) for more details. # FindDistribution `FindDistribution[data]` finds a simple functional form to fit the distribution of data. * `FindDistribution[data,n]` finds up to n best distributions. * `FindDistribution[data,n,prop]` returns up to n best distributions associated with property prop. * `FindDistribution[data,n,{prop1,prop2,…}]` returns up to n best distributions associated with properties prop1, prop2, etc. Examples [#examples] ```wolfram (* Find best fitting distribution *) data = RandomVariate[NormalDistribution[0, 1], 1000]; FindDistribution[data] (* Find top 3 distributions *) FindDistribution[data, 3] (* Get specific properties *) FindDistribution[data, 1, "AIC"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindDistribution.html) for more details. # FindDistributionParameters `FindDistributionParameters[data,dist]` finds the parameter estimates for the distribution dist from data. `FindDistributionParameters[data,dist,{{p,p0},{q,q0},…}]` finds the parameters p, q, … with starting values p0, q0, …. Examples [#examples] ```wolfram (* Fit a normal distribution to data *) data = RandomVariate[NormalDistribution[5, 2], 100]; FindDistributionParameters[data, NormalDistribution[m, s]] (* Fit with starting values *) FindDistributionParameters[data, NormalDistribution[m, s], {{m, 4}, {s, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindDistributionParameters.html) for more details. # FindFit `FindFit[data, expr, params, vars]` finds parameter values that make `expr` best fit the data. Examples [#examples] Fit data to a nonlinear model: ```wolfram data = Table[{x, 3 Exp[-0.5 x] + RandomReal[0.1]}, {x, 0, 5, 0.5}] (* Fit exponential decay *) FindFit[data, a Exp[-b x], {a, b}, x] (* {a -> 3.02, b -> 0.498} *) (* Use the result *) model = a Exp[-b x] /. % ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindFit.html) for more details. # FindPointProcessParameters `FindPointProcessParameters[pdata,pproc]` estimates the parameters of the point process pproc from point data pdata. `FindPointProcessParameters[pdata,pproc,{{p,p0},{q,q0},…}]` estimates the parameters p, q, … with starting values p0, q0, …. Examples [#examples] ```wolfram (* Estimate parameters of a Poisson process *) data = RandomPointConfiguration[PoissonPointProcess[5], Rectangle[]]; FindPointProcessParameters[data, PoissonPointProcess[lambda]] (* With starting values *) FindPointProcessParameters[data, PoissonPointProcess[lambda], {{lambda, 3}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPointProcessParameters.html) for more details. # FindProcessParameters `FindProcessParameters[data, proc]` finds the parameter estimates for the process proc from data. * `FindProcessParameters[data, proc, {{p, p0}, {q, q0}, ...}]` finds the parameters p, q, … with starting values p0, q0, … . Examples [#examples] Estimate parameters of an AR process from sample data: ```wolfram data = RandomFunction[ARProcess[{0.5, -0.3}, 1], {1, 100}]; FindProcessParameters[data, ARProcess[{a, b}, σ]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindProcessParameters.html) for more details. # FisherHypergeometricDistribution `FisherHypergeometricDistribution[n,nsucc,ntot,w]` represents a Fisher noncentral hypergeometric distribution. Examples [#examples] Create a Fisher hypergeometric distribution: ```wolfram dist = FisherHypergeometricDistribution[10, 30, 50, 2] ``` Compute the mean: ```wolfram Mean[FisherHypergeometricDistribution[10, 30, 50, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FisherHypergeometricDistribution.html) for more details. # FisherZDistribution `FisherZDistribution[n, m]` represents a Fisher z distribution with n numerator and m denominator degrees of freedom. Examples [#examples] Create a Fisher z distribution: ```wolfram dist = FisherZDistribution[5, 10] ``` Compute the mean: ```wolfram Mean[FisherZDistribution[5, 10]] ``` Plot the probability density function: ```wolfram Plot[PDF[FisherZDistribution[5, 10], x], {x, -3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FisherZDistribution.html) for more details. # Fit `Fit[data, {f1, f2, ...}, x]` finds a least-squares fit of the form $a_1 f_1 + a_2 f_2 + ...$ to the data. Examples [#examples] Fit data to polynomial models: ```wolfram data = {{1, 1.2}, {2, 3.9}, {3, 9.1}, {4, 15.8}} (* Linear fit *) Fit[data, {1, x}, x] (* -2.25 + 4.63 x *) (* Quadratic fit *) Fit[data, {1, x, x^2}, x] (* 0.05 + 0.02 x + 1.0 x^2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Fit.html) for more details. # FittedModel `FittedModel[...]` represents the symbolic fitted model obtained from functions like `LinearModelFit`. Examples [#examples] ```wolfram model = LinearModelFit[{{1, 2}, {2, 4}, {3, 5}}, x, x] (* FittedModel[...] *) model["BestFit"] (* 0.666667 + 1.5 x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FittedModel.html) for more details. # FractionalBrownianMotionProcess `FractionalBrownianMotionProcess[μ, σ, h]` represents fractional Brownian motion process with drift μ, volatility σ, and Hurst index h. * `FractionalBrownianMotionProcess[h]` represents fractional Brownian motion process with drift 0, volatility 1, and Hurst index h. Examples [#examples] Create a fractional Brownian motion with Hurst index 0.7: ```wolfram proc = FractionalBrownianMotionProcess[0.7]; RandomFunction[proc, {0, 1, 0.01}] ``` Simulate multiple paths: ```wolfram RandomFunction[FractionalBrownianMotionProcess[0, 1, 0.3], {0, 1, 0.01}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FractionalBrownianMotionProcess.html) for more details. # FractionalGaussianNoiseProcess `FractionalGaussianNoiseProcess[μ,σ,h]` represents a fractional Gaussian noise process with drift μ, volatility σ, and Hurst index h. `FractionalGaussianNoiseProcess[h]` represents a fractional Gaussian noise process with drift 0, volatility 1, and Hurst index h. Examples [#examples] Create a fractional Gaussian noise process with Hurst index 0.7: ```wolfram FractionalGaussianNoiseProcess[0.7] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FractionalGaussianNoiseProcess.html) for more details. # FrechetDistribution `FrechetDistribution[α, β]` represents the Fréchet distribution with shape parameter α and scale parameter β. `FrechetDistribution[α, β, μ]` includes a location parameter μ. Examples [#examples] Generate random samples: ```wolfram RandomVariate[FrechetDistribution[2, 1], 5] ``` Compute mean: ```wolfram Mean[FrechetDistribution[3, 1]] (* Gamma[1 - 1/3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FrechetDistribution.html) for more details. # FussellVeselyImportance `FussellVeselyImportance[rdist, t]` gives the Fussell–Vesely importances for all components in the ReliabilityDistribution rdist at time t. * `FussellVeselyImportance[fdist, t]` gives the Fussell–Vesely importances for all components in the FailureDistribution fdist at time t. Examples [#examples] Calculate Fussell-Vesely importance for a reliability system: ```wolfram rdist = ReliabilityDistribution[a && b, {a, b}]; FussellVeselyImportance[rdist, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FussellVeselyImportance.html) for more details. # GARCHProcess `GARCHProcess[κ,{α1,…,αq},{β1,…,βp}]` represents a generalized autoregressive conditionally heteroscedastic process of orders p and q, driven by a standard white noise. `GARCHProcess[κ,{α1,…,αq},{β1,…,βp},init]` represents a GARCH process with initial data init. Examples [#examples] Create a GARCH(1,1) process: ```wolfram proc = GARCHProcess[0.1, {0.2}, {0.7}] ``` Simulate the process: ```wolfram RandomFunction[GARCHProcess[0.1, {0.2}, {0.7}], {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GARCHProcess.html) for more details. # GaussianOrthogonalMatrixDistribution `GaussianOrthogonalMatrixDistribution[σ, n]` represents a Gaussian orthogonal matrix distribution with n×n dimensions and scale parameter σ. `GaussianOrthogonalMatrixDistribution[n]` uses unit scale parameter. Examples [#examples] Generate a random orthogonal matrix: ```wolfram RandomVariate[GaussianOrthogonalMatrixDistribution[3]] ``` With scale parameter: ```wolfram RandomVariate[GaussianOrthogonalMatrixDistribution[2, 4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaussianOrthogonalMatrixDistribution.html) for more details. # GaussianSymplecticMatrixDistribution `GaussianSymplecticMatrixDistribution[σ, n]` represents a Gaussian symplectic matrix distribution with matrix dimensions \{2n, 2n} over the field of complex numbers and scale parameter σ. `GaussianSymplecticMatrixDistribution[n]` represents a Gaussian symplectic matrix distribution with unit scale parameter. Examples [#examples] Sample a random matrix from the distribution: ```wolfram RandomVariate[GaussianSymplecticMatrixDistribution[2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaussianSymplecticMatrixDistribution.html) for more details. # GaussianUnitaryMatrixDistribution `GaussianUnitaryMatrixDistribution[σ, n]` represents a Gaussian unitary matrix distribution with matrix dimensions \{n, n} and scale parameter σ. * `GaussianUnitaryMatrixDistribution[n]` represents a Gaussian unitary matrix distribution with unit scale parameter. Examples [#examples] Create a Gaussian unitary matrix distribution: ```wolfram dist = GaussianUnitaryMatrixDistribution[3] ``` Sample a random unitary matrix: ```wolfram RandomVariate[GaussianUnitaryMatrixDistribution[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaussianUnitaryMatrixDistribution.html) for more details. # GaussianWindow `GaussianWindow[x]` represents a Gaussian window function of x. * `GaussianWindow[x, σ]` uses standard deviation σ. Examples [#examples] Evaluate the Gaussian window: ```wolfram GaussianWindow[0.5] ``` Plot the window function: ```wolfram Plot[GaussianWindow[x], {x, -0.5, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GaussianWindow.html) for more details. # GeometricAssertion `GeometricAssertion[obj, prop]` represents the assertion that the geometric object `obj` satisfies `prop`. * `GeometricAssertion[{obj1, obj2, …}, prop]` represents the assertion that the `obji` satisfy `prop`. * `GeometricAssertion[objs, prop1, prop2, …]` represents the assertion that `objs` satisfies each of the `propi`. Examples [#examples] ```wolfram GeometricAssertion[Triangle[{a, b, c}], "Equilateral"] ``` ```wolfram GeometricAssertion[{Line[{a, b}], Line[{c, d}]}, "Parallel"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricAssertion.html) for more details. # GeometricBrownianMotionProcess `GeometricBrownianMotionProcess[μ, σ, x0]` represents a geometric Brownian motion process with drift μ, volatility σ, and initial value x0. Examples [#examples] Define a geometric Brownian motion process: ```wolfram proc = GeometricBrownianMotionProcess[0.1, 0.2, 100] ``` Simulate a sample path: ```wolfram RandomFunction[proc, {0, 1, 0.01}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html) for more details. # GeometricDistribution `GeometricDistribution[p]` represents a geometric distribution with probability parameter p. Examples [#examples] Generate random samples: ```wolfram RandomVariate[GeometricDistribution[0.3], 5] (* {1, 4, 0, 2, 1} *) ``` Mean of the distribution: ```wolfram Mean[GeometricDistribution[p]] (* (1 - p)/p *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricDistribution.html) for more details. # GeometricMean `GeometricMean[data]` gives the geometric mean of the values in data. Examples [#examples] Geometric mean of a list: ```wolfram GeometricMean[{2, 4, 8}] (* 4 *) ``` Compared to arithmetic mean: ```wolfram {GeometricMean[{1, 9}], Mean[{1, 9}]} (* {3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricMean.html) for more details. # GeometricScene `GeometricScene[{p1, p2, …}, {hyp1, hyp2, …}]` represents an abstract 2D geometric scene defined by the hypotheses `hypi` in terms of the symbolic points `pi`. * `GeometricScene[{{p1, p2, …}, {k1, k2, …}}, hyps]` represents a scene whose hypotheses depend on the symbolic scalar quantities `ki`. * `GeometricScene[{{p1 -> {x1, y1}, …}, {k1 -> v1, …}}, hyps]` represents a specific instance with explicit values for all points and scalar quantities. * `GeometricScene[params, hyps, {con1, con2, …}]` represents a scene together with some conclusions `coni` about it. * `GeometricScene[{{{p1 -> {x1, y1}, …}, {k1 -> v1, …}}, …}, hyps]` represents a collection of specific instances of the same scene. * `GeometricScene[{scene1, scene2, …}]` combines several scene instances into one scene object. Examples [#examples] ```wolfram GeometricScene[{a, b, c}, {Triangle[{a, b, c}], GeometricAssertion[Triangle[{a, b, c}], "Equilateral"]}] ``` ```wolfram RandomInstance[GeometricScene[{a, b, c, d}, {Quadrilateral[{a, b, c, d}]}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricScene.html) for more details. # GeometricStep `GeometricStep[{hyp1, hyp2, …}]` gives a symbolic representation of a step in the definition of a geometric scene, in which the hypotheses `hypi` are introduced. * `GeometricStep[hyps, label]` labels the step with `label` when displaying an instance of the geometric scene. Examples [#examples] ```wolfram GeometricStep[{Triangle[{a, b, c}]}] ``` ```wolfram GeometricStep[{GeometricAssertion[Triangle[{a, b, c}], "Isosceles"]}, "Step 2"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricStep.html) for more details. # GeometricTest `GeometricTest[obj, prop]` tests whether the geometric object `obj` satisfies `prop`. * `GeometricTest[{obj1, obj2, …}, prop]` tests whether the `obji` satisfy `prop`. * `GeometricTest[objs, prop1, prop2, …]` tests whether `objs` satisfy each of the `propi`. Examples [#examples] ```wolfram GeometricTest[Triangle[{{0, 0}, {1, 0}, {1/2, Sqrt[3]/2}}], "Equilateral"] ``` ```wolfram GeometricTest[{Line[{{0, 0}, {1, 1}}], Line[{{0, 1}, {1, 2}}]}, "Parallel"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GeometricTest.html) for more details. # GompertzMakehamDistribution `GompertzMakehamDistribution[λ, ξ]` represents a Gompertz distribution with scale parameter `λ` and frailty parameter `ξ`. * `GompertzMakehamDistribution[λ, ξ, θ, α]` represents a Gompertz–Makeham distribution with parameters `λ`, `ξ`, `θ`, and `α`. Examples [#examples] ```wolfram dist = GompertzMakehamDistribution[1, 2]; PDF[dist, x] ``` ```wolfram Mean[GompertzMakehamDistribution[0.1, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GompertzMakehamDistribution.html) for more details. # GoodmanKruskalGammaTest `GoodmanKruskalGammaTest[v1, v2]` tests whether the vectors `v1` and `v2` are independent. * `GoodmanKruskalGammaTest[…, "property"]` returns the value of `"property"`. Examples [#examples] ```wolfram GoodmanKruskalGammaTest[{1, 2, 3, 4, 5}, {2, 4, 5, 7, 9}] ``` ```wolfram GoodmanKruskalGammaTest[{1, 2, 3, 4}, {4, 3, 2, 1}, "TestStatistic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GoodmanKruskalGammaTest.html) for more details. # GumbelDistribution `GumbelDistribution[α, β]` represents a Gumbel distribution with location parameter α and scale parameter β. `GumbelDistribution[]` represents a standard Gumbel distribution with location 0 and scale 1. Examples [#examples] Generate random samples: ```wolfram RandomVariate[GumbelDistribution[0, 1], 5] ``` Mean of the distribution: ```wolfram Mean[GumbelDistribution[0, 1]] (* EulerGamma *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GumbelDistribution.html) for more details. # HalfNormalDistribution `HalfNormalDistribution[θ]` represents a half-normal distribution with scale inversely proportional to parameter θ. Examples [#examples] Create a half-normal distribution: ```wolfram dist = HalfNormalDistribution[1] ``` Plot the probability density: ```wolfram Plot[PDF[HalfNormalDistribution[1], x], {x, 0, 5}] ``` Generate random samples: ```wolfram RandomVariate[HalfNormalDistribution[2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HalfNormalDistribution.html) for more details. # HammingDistance `HammingDistance[u, v]` gives the Hamming distance between strings or vectors u and v (the number of positions at which they differ). Examples [#examples] Distance between strings: ```wolfram HammingDistance["karolin", "kathrin"] (* 3 *) ``` Distance between lists: ```wolfram HammingDistance[{1, 0, 1, 1}, {1, 1, 1, 0}] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HammingDistance.html) for more details. # HarmonicMean `HarmonicMean[data]` gives the harmonic mean of the values in data. Examples [#examples] Compute the harmonic mean: ```wolfram HarmonicMean[{1, 2, 4}] (* 12/7 *) ``` Numerical result: ```wolfram N[HarmonicMean[{1, 2, 4}]] (* 1.71429 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HarmonicMean.html) for more details. # HazardFunction `HazardFunction[dist, x]` gives the hazard function for the distribution dist evaluated at x. * `HazardFunction[dist, {x1, x2, ...}]` gives the multivariate hazard function for the distribution dist evaluated at \{x1, x2, ...}. * `HazardFunction[dist]` gives the hazard function as a pure function. Examples [#examples] Compute the hazard function: ```wolfram HazardFunction[ExponentialDistribution[1], x] ``` Plot the hazard function: ```wolfram Plot[HazardFunction[WeibullDistribution[2, 1], t], {t, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HazardFunction.html) for more details. # HiddenMarkovProcess `HiddenMarkovProcess[i0, m, em]` represents a discrete-time, finite-state hidden Markov process with transition matrix m, emission matrix em, and initial hidden state i0. `HiddenMarkovProcess[p0, m, ...]` uses initial hidden state probability vector p0. Examples [#examples] Simple HMM with 2 hidden states: ```wolfram proc = HiddenMarkovProcess[{0.5, 0.5}, {{0.7, 0.3}, {0.4, 0.6}}, {{0.9, 0.1}, {0.2, 0.8}}]; RandomFunction[proc, {0, 10}] ``` Get the transition matrix: ```wolfram MarkovProcessProperties[proc, "TransitionMatrix"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HiddenMarkovProcess.html) for more details. # HistogramDistribution `HistogramDistribution[{x1, x2, …}]` represents the probability distribution corresponding to a histogram of the data values `xi`. * `HistogramDistribution[{{x1, y1, …}, {x2, y2, …}, …}]` represents a multivariate histogram distribution based on data values `{xi, yi, …}`. * `HistogramDistribution[…, bspec]` represents a histogram distribution with bins specified by `bspec`. Examples [#examples] ```wolfram HistogramDistribution[RandomReal[1, 100]] ``` ```wolfram PDF[HistogramDistribution[{1, 2, 2, 3, 3, 3}], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HistogramDistribution.html) for more details. # HjorthDistribution `HjorthDistribution[m, s, f]` represents the Hjorth distribution with location parameter m, scale parameter s, and shape parameter f. Examples [#examples] Plot the PDF of a Hjorth distribution: ```wolfram Plot[PDF[HjorthDistribution[0, 1, 2], x], {x, 0, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HjorthDistribution.html) for more details. # HoeffdingDTest `HoeffdingDTest[v1, v2]` tests whether the vectors v1 and v2 are independent. * `HoeffdingDTest[..., "property"]` returns the value of "property". Examples [#examples] Test independence: ```wolfram v1 = RandomReal[1, 100]; v2 = RandomReal[1, 100]; HoeffdingDTest[v1, v2] ``` Get p-value: ```wolfram HoeffdingDTest[v1, v2, "PValue"] ``` Test statistic: ```wolfram HoeffdingDTest[v1, v2, "TestStatistic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoeffdingDTest.html) for more details. # HotellingTSquareDistribution `HotellingTSquareDistribution[p, m]` represents Hotelling's T² distribution with dimensionality parameter p and m degrees of freedom. Examples [#examples] ```wolfram dist = HotellingTSquareDistribution[3, 10]; Mean[dist] ``` ```wolfram PDF[HotellingTSquareDistribution[2, 5], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HotellingTSquareDistribution.html) for more details. # HoytDistribution `HoytDistribution[q, ω]` represents a Hoyt distribution with shape parameter q and spread parameter ω. Examples [#examples] ```wolfram Mean[HoytDistribution[0.5, 1]] ``` ```wolfram RandomVariate[HoytDistribution[0.7, 2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HoytDistribution.html) for more details. # HyperbolicDistribution `HyperbolicDistribution[α, β, δ, μ]` represents a hyperbolic distribution with location parameter μ, scale parameter δ, shape parameter α, and skewness parameter β. * `HyperbolicDistribution[λ, α, β, δ, μ]` represents a generalized hyperbolic distribution with shape parameter λ. Examples [#examples] ```wolfram dist = HyperbolicDistribution[2, 0, 1, 0]; PDF[dist, x] ``` ```wolfram RandomVariate[HyperbolicDistribution[1, 0.5, 1, 0], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HyperbolicDistribution.html) for more details. # HyperexponentialDistribution `HyperexponentialDistribution[{α1, ..., αm}, {λ1, ..., λm}]` represents an m-phase hyperexponential distribution with phase probabilities αi and rates λi. Examples [#examples] ```wolfram dist = HyperexponentialDistribution[{0.3, 0.7}, {1, 5}] ``` ```wolfram Mean[HyperexponentialDistribution[{0.5, 0.5}, {2, 3}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HyperexponentialDistribution.html) for more details. # HypoexponentialDistribution `HypoexponentialDistribution[{λ1,…,λm}]` represents an m-phase hypoexponential distribution with rates λ1, …, λm. Examples [#examples] Create a hypoexponential distribution: ```wolfram dist = HypoexponentialDistribution[{1, 2, 3}] (* HypoexponentialDistribution[{1, 2, 3}] *) ``` Calculate the mean: ```wolfram Mean[HypoexponentialDistribution[{1, 2, 3}]] (* 11/6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypoexponentialDistribution.html) for more details. # HypothesisTestData `HypothesisTestData[…]` represents hypothesis test data such as generated by DistributionFitTest, AndersonDarlingTest, etc. Examples [#examples] Get detailed hypothesis test data: ```wolfram data = RandomVariate[NormalDistribution[], 100]; htd = DistributionFitTest[data, NormalDistribution[], "HypothesisTestData"]; htd["TestStatistic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HypothesisTestData.html) for more details. # IndependenceTest `IndependenceTest[v1,v2]` tests whether the vectors v1 and v2 are independent. `IndependenceTest[m1,m2]` tests whether the matrices m1 and m2 are independent. `IndependenceTest[…,"property"]` returns the value of "property". Examples [#examples] ```wolfram IndependenceTest[{1,2,3,4,5}, {2,4,6,8,10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IndependenceTest.html) for more details. # InhomogeneousPoissonProcess `InhomogeneousPoissonProcess[λ[t], t]` represents an inhomogeneous Poisson process with intensity `λ[t]` given as a function of `t`. Examples [#examples] ```wolfram InhomogeneousPoissonProcess[1 + Sin[t], t] ``` ```wolfram RandomFunction[InhomogeneousPoissonProcess[1 + 0.5 Cos[t], t], {0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InhomogeneousPoissonProcess.html) for more details. # InterquartileRange `InterquartileRange[data]` gives the difference between the upper and lower quartiles for the elements in data. * `InterquartileRange[data, {{a, b}, {c, d}}]` uses the quantile definition specified by parameters a, b, c, d. * `InterquartileRange[dist]` gives the difference between the upper and lower quartiles for the distribution dist. Examples [#examples] Compute the interquartile range of data: ```wolfram InterquartileRange[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}] ``` For a distribution: ```wolfram InterquartileRange[NormalDistribution[0, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InterquartileRange.html) for more details. # ItoProcess `ItoProcess[{a, b}, x, t]` represents an Ito process x(t), where dx(t) = a(t,x(t))dt + b(t,x(t))·dw(t). `ItoProcess[{a, b, c}, x, t]` represents an Ito process y(t) = c(t,x(t)), where dx(t) = a(t,x(t))dt + b(t,x(t))·dw(t). `ItoProcess[..., {x, x0}, {t, t0}]` uses initial condition x(t0) = x0. `ItoProcess[..., ..., ..., Σ]` uses a Wiener process w(t), with covariance Σ. `ItoProcess[proc]` converts proc to a standard Ito process whenever possible. `ItoProcess[sdeqns, expr, x, t, w, dproc]` represents an Ito process specified by a stochastic differential equation sdeqns, output expression expr, with state x and time t, driven by w following the process dproc. Examples [#examples] Define a geometric Brownian motion: ```wolfram proc = ItoProcess[{\[Mu] x[t], \[Sigma] x[t]}, x[t], {x, 1}, t] ``` Simulate the process: ```wolfram RandomFunction[proc /. {\[Mu] -> 0.1, \[Sigma] -> 0.2}, {0, 1, 0.01}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ItoProcess.html) for more details. # JaccardDissimilarity `JaccardDissimilarity[u, v]` gives the Jaccard dissimilarity between Boolean vectors u and v. Examples [#examples] ```wolfram JaccardDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JaccardDissimilarity.html) for more details. # JarqueBeraALMTest `JarqueBeraALMTest[data]` tests whether data is normally distributed using the Jarque–Bera ALM test. * `JarqueBeraALMTest[data, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = RandomVariate[NormalDistribution[], 100]; JarqueBeraALMTest[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JarqueBeraALMTest.html) for more details. # JohnsonDistribution `JohnsonDistribution["SB", γ, δ, μ, σ]` represents a bounded Johnson distribution with shape parameters *γ*, *δ*, location parameter *μ*, and scale parameter *σ*. * `JohnsonDistribution["SL", γ, δ, μ, σ]` represents a semi-bounded Johnson distribution. * `JohnsonDistribution["SU", γ, δ, μ, σ]` represents an unbounded Johnson distribution. * `JohnsonDistribution["SN", γ, δ, μ, σ]` represents a normal Johnson distribution. Examples [#examples] ```wolfram PDF[JohnsonDistribution["SU", 0, 1, 0, 1], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/JohnsonDistribution.html) for more details. # KDistribution `KDistribution[ν, w]` represents a K distribution with shape parameters ν and w. Examples [#examples] Create a K distribution: ```wolfram dist = KDistribution[2, 1]; PDF[dist, x] ``` Sample from the distribution: ```wolfram RandomVariate[KDistribution[3, 2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KDistribution.html) for more details. # KendallTauTest `KendallTauTest[v1,v2]` tests whether the vectors v1 and v2 are independent. `KendallTauTest[m1,m2]` tests whether the matrices m1 and m2 are independent. `KendallTauTest[…,"property"]` returns the value of "property". Examples [#examples] Test independence of two vectors: ```wolfram KendallTauTest[{1, 2, 3, 4}, {2, 4, 6, 8}] (* 0.00833333 *) ``` Get the test statistic: ```wolfram KendallTauTest[{1, 2, 3}, {3, 2, 1}, "TestStatistic"] (* -1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KendallTauTest.html) for more details. # KernelMixtureDistribution `KernelMixtureDistribution[{x1, x2, …}]` represents a kernel mixture distribution based on the data values `xi`. * `KernelMixtureDistribution[{{x1, y1, …}, {x2, y2, …}, …}]` represents a multivariate kernel mixture distribution based on data values `{xi, yi, …}`. * `KernelMixtureDistribution[…, bw]` represents a kernel mixture distribution with bandwidth `bw`. * `KernelMixtureDistribution[…, bw, ker]` represents a kernel mixture distribution with bandwidth `bw` and smoothing kernel `ker`. Examples [#examples] ```wolfram KernelMixtureDistribution[RandomReal[1, 100]] ``` ```wolfram PDF[KernelMixtureDistribution[{1, 2, 2, 3}], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KernelMixtureDistribution.html) for more details. # KolmogorovSmirnovTest `KolmogorovSmirnovTest[data]` tests whether `data` is normally distributed using the Kolmogorov–Smirnov test. * `KolmogorovSmirnovTest[data, dist]` tests whether `data` is distributed according to `dist` using the Kolmogorov–Smirnov test. * `KolmogorovSmirnovTest[data, dist, "property"]` returns the value of `"property"`. Examples [#examples] ```wolfram KolmogorovSmirnovTest[RandomReal[1, 100]] ``` ```wolfram KolmogorovSmirnovTest[RandomVariate[NormalDistribution[], 100], NormalDistribution[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KolmogorovSmirnovTest.html) for more details. # KuiperTest `KuiperTest[data]` tests whether `data` is normally distributed using the Kuiper test. * `KuiperTest[data, dist]` tests whether `data` is distributed according to `dist` using the Kuiper test. * `KuiperTest[data, dist, "property"]` returns the value of `"property"`. Examples [#examples] ```wolfram KuiperTest[RandomReal[1, 100]] ``` ```wolfram KuiperTest[RandomVariate[UniformDistribution[], 100], UniformDistribution[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KuiperTest.html) for more details. # KumaraswamyDistribution `KumaraswamyDistribution[α, β]` represents a Kumaraswamy distribution with shape parameters α and β. Examples [#examples] Define a Kumaraswamy distribution: ```wolfram dist = KumaraswamyDistribution[2, 5] ``` Compute the mean: ```wolfram Mean[KumaraswamyDistribution[2, 5]] // N (* 0.396825 *) ``` Plot the PDF: ```wolfram Plot[PDF[KumaraswamyDistribution[2, 5], x], {x, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/KumaraswamyDistribution.html) for more details. # Kurtosis `Kurtosis[data]` gives the coefficient of kurtosis for the elements in `data`. * `Kurtosis[dist]` gives the coefficient of kurtosis for the distribution `dist`. Examples [#examples] ```wolfram Kurtosis[{1, 2, 3, 4, 5}] ``` ```wolfram Kurtosis[NormalDistribution[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Kurtosis.html) for more details. # LandauDistribution `LandauDistribution[μ, σ]` represents a Landau distribution with location parameter μ and scale parameter σ. * `LandauDistribution[]` represents a Landau distribution with location parameter 0 and scale parameter 1. Examples [#examples] ```wolfram dist = LandauDistribution[0, 1]; PDF[dist, x] ``` ```wolfram RandomVariate[LandauDistribution[2, 0.5], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LandauDistribution.html) for more details. # LaplaceDistribution `LaplaceDistribution[μ, β]` represents a Laplace double-exponential distribution with mean μ and scale parameter β. `LaplaceDistribution[]` represents a Laplace double-exponential distribution with mean 0 and scale parameter 1. Examples [#examples] Define a Laplace distribution: ```wolfram dist = LaplaceDistribution[0, 1] ``` Compute the mean and variance: ```wolfram {Mean[dist], Variance[dist]} (* {0, 2} *) ``` Plot the PDF: ```wolfram Plot[PDF[LaplaceDistribution[0, 1], x], {x, -5, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LaplaceDistribution.html) for more details. # LearnDistribution `LearnDistribution[{example1,example2,…}]` generates a LearnedDistribution\[…] that attempts to represent an underlying distribution for the examples given. Examples [#examples] Learn a distribution from data: ```wolfram data = RandomVariate[NormalDistribution[], 1000]; LearnDistribution[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LearnDistribution.html) for more details. # LearnedDistribution `LearnedDistribution[...]` represents a distribution generated by `LearnDistribution`. Examples [#examples] Learn a distribution from data: ```wolfram data = RandomReal[NormalDistribution[], 1000]; dist = LearnDistribution[data] ``` Sample from learned distribution: ```wolfram RandomVariate[dist, 10] ``` Plot PDF: ```wolfram SmoothHistogram[RandomVariate[dist, 1000]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LearnedDistribution.html) for more details. # LevyDistribution `LevyDistribution[μ, σ]` represents a Lévy distribution with location parameter `μ` and dispersion parameter `σ`. Examples [#examples] ```wolfram LevyDistribution[0, 1] ``` ```wolfram PDF[LevyDistribution[0, 1], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LevyDistribution.html) for more details. # LindleyDistribution `LindleyDistribution[δ]` represents a Lindley distribution with shape parameter δ. Examples [#examples] Create a Lindley distribution: ```wolfram LindleyDistribution[2] (* LindleyDistribution[2] *) ``` Compute the mean: ```wolfram Mean[LindleyDistribution[2]] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LindleyDistribution.html) for more details. # LocationEquivalenceTest `LocationEquivalenceTest[{data1, data2, ...}]` tests whether the means or medians of the *datai* are equal. * `LocationEquivalenceTest[{data1, ...}, "property"]` returns the value of *"property"*. Examples [#examples] ```wolfram LocationEquivalenceTest[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocationEquivalenceTest.html) for more details. # LocationTest `LocationTest[data]` tests whether the mean or median of the data is zero. * `LocationTest[{data1, data2}]` tests whether the means or medians of data1 and data2 are equal. * `LocationTest[dspec, μ0]` tests a location measure against μ0. * `LocationTest[dspec, μ0, "property"]` returns the value of "property". Examples [#examples] Test if mean is zero: ```wolfram LocationTest[{1.2, -0.5, 0.8, -0.3, 1.1}] ``` Compare two datasets: ```wolfram LocationTest[{{1, 2, 3}, {4, 5, 6}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LocationTest.html) for more details. # LongestCommonSequence `LongestCommonSequence[s1, s2]` finds the longest sequence of contiguous or disjoint elements common to the strings, lists or biomolecular sequences s1 and s2. Examples [#examples] ```wolfram LongestCommonSequence["abcdefg", "bdfijk"] ``` ```wolfram LongestCommonSequence[{1, 2, 3, 4, 5}, {2, 4, 6}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestCommonSequence.html) for more details. # LongestCommonSequencePositions `LongestCommonSequencePositions[s1, s2]` finds the longest sequence of contiguous or disjoint elements common to the strings, lists or biomolecular sequences s1 and s2 and returns their positions. Examples [#examples] Find common subsequence positions in strings: ```wolfram LongestCommonSequencePositions["ABCDEF", "ACDF"] (* {{1, 3, 4, 6}, {1, 2, 3, 4}} *) ``` For lists: ```wolfram LongestCommonSequencePositions[{a, b, c, d}, {b, c, e, d}] ``` Compare sequences: ```wolfram s1 = "GCTAGC"; s2 = "GCTAAGC"; LongestCommonSequencePositions[s1, s2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestCommonSequencePositions.html) for more details. # LongestCommonSubsequence `LongestCommonSubsequence[s1, s2]` finds the longest contiguous subsequence of elements common to the strings, biomolecular sequences or lists *s1* and *s2*. Examples [#examples] ```wolfram LongestCommonSubsequence["abcdefg", "cdefgh"] (* "cdefg" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestCommonSubsequence.html) for more details. # LongestCommonSubsequencePositions `LongestCommonSubsequencePositions[s1, s2]` finds the longest contiguous subsequence of elements common to the strings or lists s1 and s2 and returns their positions \{pos1, pos2} in s1 and s2. Examples [#examples] ```wolfram LongestCommonSubsequencePositions["abcdefg", "xyzcdewq"] (* {{3, 5}, {4, 6}} *) ``` ```wolfram LongestCommonSubsequencePositions[{a, b, c, d}, {x, b, c, y}] (* {{2, 3}, {2, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestCommonSubsequencePositions.html) for more details. # LongestOrderedSequence `LongestOrderedSequence[list]` finds the longest ordered sequence of contiguous or disjoint elements in `list`. * `LongestOrderedSequence[list, p]` finds the longest ordered sequence using the ordering function `p`. Examples [#examples] ```wolfram LongestOrderedSequence[{3, 1, 4, 1, 5, 9, 2, 6}] ``` ```wolfram LongestOrderedSequence[{5, 3, 8, 1, 9}, Greater] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LongestOrderedSequence.html) for more details. # MAProcess `MAProcess[{b1, ..., bq}, v]` represents a moving-average process of order *q* with normal white noise variance *v*. * `MAProcess[{b1, ..., bq}, Σ]` represents a vector MA process with multinormal white noise covariance matrix *Σ*. * `MAProcess[{b1, ..., bq}, v, init]` represents an MA process with initial data *init*. * `MAProcess[c, ...]` represents an MA process with a constant *c*. Examples [#examples] ```wolfram RandomFunction[MAProcess[{0.5, 0.3}, 1], {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MAProcess.html) for more details. # MannWhitneyTest `MannWhitneyTest[{data1, data2}]` tests whether the medians of data1 and data2 are equal. * `MannWhitneyTest[dspec, μ0]` tests the median difference against μ0. * `MannWhitneyTest[dspec, μ0, "property"]` returns the value of "property". Examples [#examples] ```wolfram MannWhitneyTest[{{1, 2, 3, 4}, {3, 4, 5, 6}}] ``` ```wolfram MannWhitneyTest[{{1, 2, 3}, {4, 5, 6}}, 0, "TestStatistic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MannWhitneyTest.html) for more details. # MarchenkoPasturDistribution `MarchenkoPasturDistribution[λ, σ]` represents a Marchenko–Pastur distribution with asymptotic ratio λ and scale parameter σ. * `MarchenkoPasturDistribution[λ]` represents a Marchenko–Pastur distribution with unit scale parameter. Examples [#examples] Create a Marchenko-Pastur distribution: ```wolfram dist = MarchenkoPasturDistribution[0.5, 1]; PDF[dist, x] ``` Sample from the distribution: ```wolfram RandomVariate[MarchenkoPasturDistribution[0.3], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MarchenkoPasturDistribution.html) for more details. # MardiaCombinedTest `MardiaCombinedTest[data]` tests whether data follows a `MultinormalDistribution` using the Mardia combined test. * `MardiaCombinedTest[data, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = RandomVariate[MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}], 100]; MardiaCombinedTest[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MardiaCombinedTest.html) for more details. # MardiaKurtosisTest `MardiaKurtosisTest[data]` tests whether data follows a MultinormalDistribution using the Mardia kurtosis test. * `MardiaKurtosisTest[data, "property"]` returns the value of "property". Examples [#examples] Test multivariate normality: ```wolfram data = RandomVariate[MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}], 100]; MardiaKurtosisTest[data] ``` Get p-value: ```wolfram MardiaKurtosisTest[data, "PValue"] ``` Test statistic: ```wolfram MardiaKurtosisTest[data, "TestStatistic"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MardiaKurtosisTest.html) for more details. # MardiaSkewnessTest `MardiaSkewnessTest[data]` tests whether data follows a `MultinormalDistribution` using the Mardia skewness test. * `MardiaSkewnessTest[data, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = RandomVariate[MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}], 100]; MardiaSkewnessTest[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MardiaSkewnessTest.html) for more details. # MarginalDistribution `MarginalDistribution[dist,k]` represents a univariate marginal distribution of the kth coordinate from the multivariate distribution dist. `MarginalDistribution[dist,{k1,k2,...}]` represents a multivariate marginal distribution of the `{k1,k2,...}` coordinates. Examples [#examples] ```wolfram dist = MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}]; MarginalDistribution[dist, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MarginalDistribution.html) for more details. # MarkovProcessProperties `MarkovProcessProperties[mproc]` gives a summary of properties for the finite state Markov process mproc. * `MarkovProcessProperties[mproc, "property"]` gives the specified "property" for the process mproc. This function provides analytical properties of discrete and continuous-time Markov chains. Examples [#examples] ```wolfram proc = DiscreteMarkovProcess[1, {{0.5, 0.5}, {0.3, 0.7}}]; MarkovProcessProperties[proc] ``` ```wolfram MarkovProcessProperties[proc, "StationaryDistribution"] ``` ```wolfram MarkovProcessProperties[proc, "CommunicatingClasses"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MarkovProcessProperties.html) for more details. # MeixnerDistribution `MeixnerDistribution[a, b, m, d]` represents a Meixner distribution with location parameter m, scale parameter a, skew parameter b, and shape parameter d. Examples [#examples] ```wolfram dist = MeixnerDistribution[1, 0.5, 0, 1]; Mean[dist] ``` ```wolfram RandomVariate[MeixnerDistribution[1, 0, 0, 1], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MeixnerDistribution.html) for more details. # MixtureDistribution `MixtureDistribution[{w1, ..., wn}, {dist1, ..., distn}]` represents a mixture distribution whose CDF is given as a sum of the CDFs of the component distributions disti, each with weight wi. Examples [#examples] ```wolfram dist = MixtureDistribution[{1, 2}, {NormalDistribution[0, 1], NormalDistribution[5, 1]}] RandomVariate[dist, 5] (* samples from the mixture *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MixtureDistribution.html) for more details. # Moment `Moment[data, r]` gives the order r moment μ\_r of data. `Moment[dist, r]` gives the moment of the distribution dist. Examples [#examples] Compute moment of data: ```wolfram Moment[{1, 2, 3, 4, 5}, 2] (* 11 *) ``` Moment of a distribution: ```wolfram Moment[NormalDistribution[0, 1], 2] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Moment.html) for more details. # MomentConvert `MomentConvert[mexpr, form]` converts the moment expression mexpr to the specified form. Examples [#examples] Convert to central moments: ```wolfram MomentConvert[Moment[2], CentralMoment] ``` Convert to cumulants: ```wolfram MomentConvert[Moment[3], Cumulant] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MomentConvert.html) for more details. # MomentEvaluate `MomentEvaluate[mexpr, dist]` evaluates formal moments in the moment expression mexpr on the distribution dist. * `MomentEvaluate[mexpr, list]` evaluates formal moments and formal sample moments in mexpr on the data list. * `MomentEvaluate[mexpr, dist, list]` evaluates formal moments on the distribution dist and formal sample moments on the data list. Examples [#examples] Evaluate moment expression: ```wolfram MomentEvaluate[Moment[1], NormalDistribution[]] (* 0 *) ``` On data: ```wolfram MomentEvaluate[SampleMoment[2], {1, 2, 3, 4, 5}] ``` Mixed evaluation: ```wolfram MomentEvaluate[Moment[2] - SampleMoment[2], NormalDistribution[], data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MomentEvaluate.html) for more details. # MomentGeneratingFunction `MomentGeneratingFunction[dist, t]` gives the moment-generating function for the distribution dist as a function of the variable t. * `MomentGeneratingFunction[dist, {t1, t2, ...}]` gives the moment-generating function for the multivariate distribution dist as a function of the variables t1, t2, .... Examples [#examples] ```wolfram MomentGeneratingFunction[NormalDistribution[μ, σ], t] ``` ```wolfram MomentGeneratingFunction[ExponentialDistribution[λ], t] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MomentGeneratingFunction.html) for more details. # MomentOfInertia `MomentOfInertia[reg, pt, v]` computes the moment of inertia for the region reg rotating around an axis through the point pt in direction v. `MomentOfInertia[reg]` computes the moment of inertia matrix for the region reg relative to the center of mass. `MomentOfInertia[reg, pt]` computes the moment of inertia matrix relative to the point pt. Examples [#examples] Compute the moment of inertia matrix for a disk: ```wolfram MomentOfInertia[Disk[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MomentOfInertia.html) for more details. # MovingAverage `MovingAverage[list, r]` gives the moving average of list, computed by averaging runs of r elements. * `MovingAverage[list, {w1, w2, ..., wr}]` gives the moving average of list, computed with weights wi. Examples [#examples] ```wolfram MovingAverage[{1, 2, 3, 4, 5, 6, 7}, 3] ``` ```wolfram MovingAverage[Range[10], {1, 2, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MovingAverage.html) for more details. # MovingMap `MovingMap[f,data,w]` applies f to size w windows in the specified data. `MovingMap[f,data,wspec]` uses windows specified by wspec. `MovingMap[f,data,wspec,padding]` pads data using padding. Examples [#examples] Compute a moving average: ```wolfram MovingMap[Mean, {1, 2, 3, 4, 5, 6}, 3] (* {2, 3, 4, 5} *) ``` Apply a function to sliding windows: ```wolfram MovingMap[Total, Range[10], 4] (* {10, 14, 18, 22, 26, 30, 34} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MovingMap.html) for more details. # MovingMedian `MovingMedian[list, r]` gives the moving median of list, computed using spans of r elements. Examples [#examples] ```wolfram MovingMedian[{1, 2, 3, 4, 5, 6, 7}, 3] (* {2, 3, 4, 5, 6} *) ``` ```wolfram MovingMedian[{1, 5, 2, 8, 3}, 3] (* {2, 5, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MovingMedian.html) for more details. # MoyalDistribution `MoyalDistribution[μ, σ]` represents a Moyal distribution with location parameter μ and scale parameter σ. * `MoyalDistribution[]` represents a Moyal distribution with location parameter 0 and scale parameter 1. Examples [#examples] Create a Moyal distribution: ```wolfram dist = MoyalDistribution[0, 1]; PDF[dist, x] ``` Sample from the distribution: ```wolfram RandomVariate[MoyalDistribution[2, 0.5], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MoyalDistribution.html) for more details. # MultinormalDistribution `MultinormalDistribution[Σ]` represents a multivariate normal distribution with zero mean and covariance matrix Σ. `MultinormalDistribution[μ, Σ]` represents a multivariate normal (Gaussian) distribution with mean vector μ and covariance matrix Σ. Examples [#examples] Define a bivariate normal: ```wolfram dist = MultinormalDistribution[{0, 0}, {{1, 0.5}, {0.5, 1}}] ``` Sample from it: ```wolfram RandomVariate[MultinormalDistribution[{1, 2}, IdentityMatrix[2]], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultinormalDistribution.html) for more details. # MultivariateHypergeometricDistribution `MultivariateHypergeometricDistribution[n, {m1, m2, ..., mk}]` represents a multivariate hypergeometric distribution with n draws without replacement from a collection containing mi objects of type i. Examples [#examples] Create a multivariate hypergeometric distribution: ```wolfram dist = MultivariateHypergeometricDistribution[5, {10, 15, 20}]; Mean[dist] ``` Sample from the distribution: ```wolfram RandomVariate[MultivariateHypergeometricDistribution[10, {5, 5, 5}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultivariateHypergeometricDistribution.html) for more details. # MultivariatePoissonDistribution `MultivariatePoissonDistribution[μ0, {μ1, μ2, ...}]` represents a multivariate Poisson distribution with mean vector \{μ0 + μ1, μ0 + μ2, ...}. Examples [#examples] ```wolfram dist = MultivariatePoissonDistribution[1, {2, 3}] ``` ```wolfram Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultivariatePoissonDistribution.html) for more details. # MultivariateTDistribution `MultivariateTDistribution[Σ, ν]` represents the multivariate Student t distribution with scale matrix Σ and degrees of freedom parameter ν. * `MultivariateTDistribution[μ, Σ, ν]` represents the multivariate Student t distribution with location μ, scale matrix Σ, and ν degrees of freedom. Examples [#examples] ```wolfram dist = MultivariateTDistribution[{{1, 0.5}, {0.5, 1}}, 5]; PDF[dist, {x, y}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultivariateTDistribution.html) for more details. # NBodySimulation `NBodySimulation[law, {state1, ..., staten}, t]` generates a simulation of the motion of a system of n bodies with initial states statei, governed by the specified potential or force law, over a length of time t. `NBodySimulation[law, <|body1 -> state1, ..., bodyn -> staten|>, t]` generates a simulation of the motion of a system of n bodies with names bodyi. Examples [#examples] Simulate two bodies under gravitational attraction: ```wolfram NBodySimulation[ "InverseSquare", {<|"Mass" -> 1, "Position" -> {0, 0}, "Velocity" -> {0, 0.5}|>, <|"Mass" -> 1, "Position" -> {1, 0}, "Velocity" -> {0, -0.5}|>}, 10 ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NBodySimulation.html) for more details. # NExpectation `NExpectation[expr, x \[Distributed] dist]` gives the numerical expectation of expr under the assumption that x follows the probability distribution dist. `NExpectation[expr, {x1, x2, ...} \[Distributed] dist]` gives the numerical expectation of expr under the assumption that \{x1, x2, ...} follows the multivariate distribution dist. `NExpectation[expr, {x1 \[Distributed] dist1, x2 \[Distributed] dist2, ...}]` gives the numerical expectation of expr under the assumption that x1, x2, ... are independent and follow the distributions dist1, dist2, .... `NExpectation[expr \[Conditioned] pred, ...]` gives the numerical conditional expectation of expr given pred. Examples [#examples] ```wolfram NExpectation[x^2, x \[Distributed] NormalDistribution[]] (* 1. *) ``` ```wolfram NExpectation[x + y, {x \[Distributed] UniformDistribution[], y \[Distributed] UniformDistribution[]}] (* 1. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NExpectation.html) for more details. # NProbability `NProbability[pred,x\[Distributed]dist]` gives the numerical probability for an event that satisfies the predicate pred under the assumption that x follows the probability distribution dist. `NProbability[pred,{x1,x2,…}\[Distributed]dist]` gives the numerical probability that an event satisfies pred under the assumption that \{x1,x2,…} follows the multivariate distribution dist. `NProbability[pred,{x1\[Distributed]dist1,x2\[Distributed]dist2,…}]` gives the numerical probability that an event satisfies pred under the assumption that x1, x2, … are independent and follow the distributions dist1, dist2, …. `NProbability[pred1\[Conditioned]pred2,…]` gives the numerical conditional probability of pred1 given pred2. Examples [#examples] Compute probability numerically: ```wolfram NProbability[x > 1, x \[Distributed] NormalDistribution[]] (* 0.158655 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NProbability.html) for more details. # NakagamiDistribution `NakagamiDistribution[μ,ω]` represents a Nakagami distribution with shape parameter μ and spread parameter ω. Examples [#examples] Create a Nakagami distribution: ```wolfram dist = NakagamiDistribution[2, 1] ``` Compute the mean: ```wolfram Mean[NakagamiDistribution[2, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NakagamiDistribution.html) for more details. # NeedlemanWunschSimilarity `NeedlemanWunschSimilarity[u, v]` gives a number representing the Needleman–Wunsch similarity between strings, vectors, or biomolecular sequences u and v. Examples [#examples] ```wolfram NeedlemanWunschSimilarity["ACGT", "ACTT"] ``` ```wolfram NeedlemanWunschSimilarity[{1, 2, 3}, {1, 3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NeedlemanWunschSimilarity.html) for more details. # NegativeBinomialDistribution `NegativeBinomialDistribution[n, p]` represents a negative binomial distribution with parameters n and p. Examples [#examples] ```wolfram NegativeBinomialDistribution[5, 0.5] ``` ```wolfram Mean[NegativeBinomialDistribution[10, 0.3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeBinomialDistribution.html) for more details. # NegativeMultinomialDistribution `NegativeMultinomialDistribution[n, p]` represents a negative multinomial distribution with parameter n and failure probability vector p. Examples [#examples] ```wolfram dist = NegativeMultinomialDistribution[5, {0.2, 0.3, 0.1}]; Mean[dist] ``` ```wolfram RandomVariate[NegativeMultinomialDistribution[3, {0.4, 0.3}], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeMultinomialDistribution.html) for more details. # NoncentralBetaDistribution `NoncentralBetaDistribution[α, β, δ]` represents a noncentral beta distribution with shape parameters α, β and noncentrality parameter δ. Examples [#examples] Create a noncentral beta distribution: ```wolfram dist = NoncentralBetaDistribution[2, 3, 1]; PDF[dist, x] ``` Sample from the distribution: ```wolfram RandomVariate[NoncentralBetaDistribution[2, 5, 2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NoncentralBetaDistribution.html) for more details. # NoncentralChiSquareDistribution `NoncentralChiSquareDistribution[ν, λ]` represents a noncentral χ² distribution with *ν* degrees of freedom and noncentrality parameter *λ*. Examples [#examples] ```wolfram PDF[NoncentralChiSquareDistribution[3, 2], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NoncentralChiSquareDistribution.html) for more details. # NoncentralFRatioDistribution `NoncentralFRatioDistribution[n, m, λ]` represents a noncentral F-ratio distribution with n numerator degrees of freedom, m denominator degrees of freedom, and numerator noncentrality parameter λ. * `NoncentralFRatioDistribution[n, m, λ, η]` represents a doubly noncentral F-ratio distribution with numerator noncentrality parameter λ and denominator noncentrality parameter η. Examples [#examples] ```wolfram dist = NoncentralFRatioDistribution[5, 10, 2]; Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NoncentralFRatioDistribution.html) for more details. # NoncentralStudentTDistribution `NoncentralStudentTDistribution[ν, δ]` represents a noncentral Student t distribution with ν degrees of freedom and noncentrality parameter δ. Examples [#examples] ```wolfram dist = NoncentralStudentTDistribution[5, 2]; PDF[dist, x] ``` ```wolfram RandomVariate[NoncentralStudentTDistribution[10, 1], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NoncentralStudentTDistribution.html) for more details. # NonlinearModelFit `NonlinearModelFit[data, form, params, x]` fits data to a nonlinear model with statistical analysis. Examples [#examples] Fit to exponential model: ```wolfram data = Table[{x, 5 Exp[-x/3] + RandomReal[0.2]}, {x, 0, 10, 0.5}] nlm = NonlinearModelFit[data, a Exp[-x/b], {a, b}, x] (* Best fit function *) nlm["BestFit"] (* Parameter table with statistics *) nlm["ParameterTable"] (* Plot fit with data *) Show[ListPlot[data], Plot[nlm[x], {x, 0, 10}, PlotStyle -> Red]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonlinearModelFit.html) for more details. # OrderDistribution `OrderDistribution[{dist, n}, k]` represents the kth-order statistics distribution for n observations from the distribution dist. * `OrderDistribution[{dist, n}, {k1, k2, ...}]` represents the joint (k1,k2,...)th-order statistics distribution. * `OrderDistribution[{dist1, ..., distn}, ...]` represents the order statistics for independent distributions. * `OrderDistribution[mdist, ...]` represents the order statistics for multivariate distribution mdist. Examples [#examples] ```wolfram OrderDistribution[{NormalDistribution[], 10}, 5] ``` ```wolfram Mean[OrderDistribution[{UniformDistribution[], 5}, 3]] ``` ```wolfram PDF[OrderDistribution[{ExponentialDistribution[1], 3}, 1], x] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrderDistribution.html) for more details. # OrnsteinUhlenbeckProcess `OrnsteinUhlenbeckProcess[μ,σ,θ]` represents a stationary Ornstein–Uhlenbeck process with long-term mean μ, volatility σ, and mean reversion speed θ. `OrnsteinUhlenbeckProcess[μ,σ,θ,x0]` represents an Ornstein–Uhlenbeck process with initial condition x0. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrnsteinUhlenbeckProcess.html) for more details. # PDF `PDF[dist, x]` gives the probability density function for distribution dist evaluated at x. Examples [#examples] PDF of normal distribution: ```wolfram PDF[NormalDistribution[0, 1], 0] (* 1/Sqrt[2 Pi] *) ``` PDF as a pure function: ```wolfram pdf = PDF[NormalDistribution[0, 1]]; pdf[1.0] (* 0.2419 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PDF.html) for more details. # PERTDistribution `PERTDistribution[{min, max}, c]` represents a PERT distribution with range *min* to *max* and mode at *c*. * `PERTDistribution[{min, max}, c, λ]` represents a modified PERT distribution with shape parameter *λ*. Examples [#examples] ```wolfram PDF[PERTDistribution[{0, 10}, 5], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PERTDistribution.html) for more details. # PairedTTest `PairedTTest[data]` tests whether the mean of data is zero. * `PairedTTest[{data1, data2}]` tests whether the mean of data1 – data2 is zero. * `PairedTTest[dspec, μ0]` tests a location measure against μ0. * `PairedTTest[dspec, μ0, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = {{1.2, 1.5}, {2.1, 2.3}, {1.8, 2.0}}; PairedTTest[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PairedTTest.html) for more details. # PairedZTest `PairedZTest[data]` tests whether the mean of the data is zero. * `PairedZTest[{data1, data2}]` tests whether the means of data1 and data2 are equal. * `PairedZTest[dspec, σ]` tests for zero or equal means assuming a population variance σ. * `PairedZTest[dspec, σ, μ0]` tests the mean against μ0. * `PairedZTest[dspec, σ, μ0, "property"]` returns the value of "property". Examples [#examples] ```wolfram PairedZTest[{1, 2, 3, 4, 5}] ``` ```wolfram PairedZTest[{{1, 2, 3}, {2, 3, 4}}] ``` ```wolfram PairedZTest[data, 1, 0, "PValue"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PairedZTest.html) for more details. # ParameterMixtureDistribution `ParameterMixtureDistribution[dist[θ], θ \[Distributed] wdist]` represents a parameter mixture distribution where the parameter θ is distributed according to the weight distribution wdist. * `ParameterMixtureDistribution[dist[θ1, θ2, ...], {θ1 \[Distributed] wdist1, θ2 \[Distributed] wdist2, ...}]` represents a parameter mixture distribution where each parameter has its own weight distribution. Examples [#examples] ```wolfram dist = ParameterMixtureDistribution[ NormalDistribution[μ, 1], μ \[Distributed] NormalDistribution[0, 1] ] ``` ```wolfram Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParameterMixtureDistribution.html) for more details. # ParetoDistribution `ParetoDistribution[k, α]` represents a Pareto distribution with minimum value parameter *k* and shape parameter *α*. * `ParetoDistribution[k, α, μ]` represents a Pareto type II distribution with location parameter *μ*. * `ParetoDistribution[k, α, γ, μ]` represents a Pareto type IV distribution with shape parameter *γ*. Examples [#examples] ```wolfram PDF[ParetoDistribution[1, 2], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParetoDistribution.html) for more details. # ParetoPickandsDistribution `ParetoPickandsDistribution[μ,σ,ξ]` gives a Pareto–Pickands distribution with location parameter μ, scale parameter σ and shape parameter ξ. `ParetoPickandsDistribution[ξ]` gives the standard Pareto–Pickands distribution with zero location and unit scale parameters. Examples [#examples] Create a standard Pareto-Pickands distribution: ```wolfram dist = ParetoPickandsDistribution[0.5] ``` Compute the mean of a distribution: ```wolfram Mean[ParetoPickandsDistribution[0, 1, 0.25]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParetoPickandsDistribution.html) for more details. # PascalDistribution `PascalDistribution[n, p]` represents a Pascal distribution with parameters n and p. Examples [#examples] ```wolfram dist = PascalDistribution[5, 0.3]; Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PascalDistribution.html) for more details. # PearsonChiSquareTest `PearsonChiSquareTest[data]` tests whether data is normally distributed using the Pearson χ² test. * `PearsonChiSquareTest[data, dist]` tests whether data is distributed according to dist using the Pearson χ² test. * `PearsonChiSquareTest[data, dist, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = RandomVariate[NormalDistribution[], 100]; PearsonChiSquareTest[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PearsonChiSquareTest.html) for more details. # PearsonCorrelationTest `PearsonCorrelationTest[v1,v2]` tests whether the vectors v1 and v2 are linearly independent. `PearsonCorrelationTest[…,"property"]` returns the value of "property". Examples [#examples] Test correlation between two vectors: ```wolfram v1 = {1, 2, 3, 4, 5}; v2 = {2, 4, 5, 4, 5}; PearsonCorrelationTest[v1, v2] (* True *) ``` Get the p-value: ```wolfram PearsonCorrelationTest[v1, v2, "PValue"] (* 0.0417 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PearsonCorrelationTest.html) for more details. # PearsonDistribution `PearsonDistribution[a1, a0, b2, b1, b0]` represents a distribution of the Pearson family with parameters a1, a0, b2, b1, and b0. * `PearsonDistribution[type, a1, a0, b2, b1, b0]` represents a Pearson distribution of given type. Examples [#examples] ```wolfram dist = PearsonDistribution[1, 0, 1, 0, 1]; PDF[dist, x] ``` ```wolfram RandomVariate[PearsonDistribution[0, 0, 1, 0, 1], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PearsonDistribution.html) for more details. # PoissonConsulDistribution `PoissonConsulDistribution[μ,λ]` represents a Poisson–Consul distribution with parameters μ and λ. Examples [#examples] Create a Poisson-Consul distribution and compute mean: ```wolfram dist = PoissonConsulDistribution[5, 0.2]; Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoissonConsulDistribution.html) for more details. # PoissonDistribution `PoissonDistribution[μ]` represents a Poisson distribution with mean μ. Examples [#examples] Random samples: ```wolfram RandomVariate[PoissonDistribution[5], 10] (* {4, 6, 5, 3, 7, 5, 4, 6, 5, 3} *) ``` Probability mass function: ```wolfram PDF[PoissonDistribution[3], 2] (* 9 E^-3 / 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoissonDistribution.html) for more details. # PoissonPDEComponent `PoissonPDEComponent[vars, pars]` yields a Poisson PDE term ∇²u - f with model variables vars and model parameters pars. Examples [#examples] Create a Poisson equation component: ```wolfram PoissonPDEComponent[{u[x, y], {x, y}}, <|"LoadValue" -> 1|>] ``` Solve Poisson's equation on a disk: ```wolfram eqn = PoissonPDEComponent[{u[x, y], {x, y}}, <|"LoadValue" -> 1|>]; NDSolveValue[{eqn == 0, DirichletCondition[u[x, y] == 0, True]}, u, {x, y} \[Element] Disk[]] ``` Visualize the solution: ```wolfram sol = NDSolveValue[{eqn == 0, DirichletCondition[u[x, y] == 0, True]}, u, {x, y} \[Element] Disk[]]; Plot3D[sol[x, y], {x, y} \[Element] Disk[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoissonPDEComponent.html) for more details. # PoissonProcess `PoissonProcess[μ]` represents a Poisson process with rate μ. Examples [#examples] Create a Poisson process with rate 2: ```wolfram PoissonProcess[2] (* PoissonProcess[2] *) ``` Simulate random values: ```wolfram RandomFunction[PoissonProcess[2], {0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoissonProcess.html) for more details. # PoissonWindow `PoissonWindow[x]` represents a Poisson window function of x. * `PoissonWindow[x, α]` uses the parameter α. Poisson windows are used in signal processing for spectral analysis. Examples [#examples] ```wolfram PoissonWindow[0.5] ``` ```wolfram Plot[PoissonWindow[x], {x, -1, 1}] ``` ```wolfram Plot[PoissonWindow[x, 2], {x, -1, 1}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PoissonWindow.html) for more details. # PolyaAeppliDistribution `PolyaAeppliDistribution[θ, p]` represents a Pólya–Aeppli distribution with shape parameters θ and p. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PolyaAeppliDistribution.html) for more details. # Probability `Probability[pred, x \[Distributed] dist]` gives the probability for an event that satisfies the predicate pred. Examples [#examples] Probability x > 0 for normal: ```wolfram Probability[x > 0, x \[Distributed] NormalDistribution[0, 1]] (* 1/2 *) ``` Probability of range: ```wolfram Probability[0 < x < 1, x \[Distributed] UniformDistribution[{0, 2}]] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Probability.html) for more details. # ProbabilityDistribution `ProbabilityDistribution[pdf, {x, xmin, xmax}]` represents the continuous distribution with PDF pdf in the variable x where the pdf is taken to be zero for x \< xmin and x > xmax. `ProbabilityDistribution[pdf, {x, xmin, xmax, 1}]` represents the discrete distribution with PDF pdf in the variable x where the pdf is taken to be zero for x \< xmin and x > xmax. `ProbabilityDistribution[pdf, {x, ...}, {y, ...}, ...]` represents a multivariate distribution with PDF pdf in the variables x, y, ..., etc. `ProbabilityDistribution[{"CDF", cdf}, ...]` represents a probability distribution with CDF given by cdf. `ProbabilityDistribution[{"SF", sf}, ...]` represents a probability distribution with survival function given by sf. `ProbabilityDistribution[{"HF", hf}, ...]` represents a probability distribution with hazard function given by hf. Examples [#examples] ```wolfram dist = ProbabilityDistribution[2 x, {x, 0, 1}] Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProbabilityDistribution.html) for more details. # ProbabilityPlot `ProbabilityPlot[list]` generates a plot of the CDF of list against the CDF of a normal distribution. Examples [#examples] P-P plot: ```wolfram data = RandomVariate[NormalDistribution[], 100]; ProbabilityPlot[data] ``` Compare to specific distribution: ```wolfram ProbabilityPlot[data, UniformDistribution[]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProbabilityPlot.html) for more details. # ProbabilityScalePlot `ProbabilityScalePlot[{x1, x2, ...}]` generates a normal probability plot of the samples. Examples [#examples] Probability scale plot: ```wolfram data = RandomVariate[NormalDistribution[], 100]; ProbabilityScalePlot[data] ``` For different distribution: ```wolfram ProbabilityScalePlot[data, "Exponential"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProbabilityScalePlot.html) for more details. # QnDispersion `QnDispersion[list]` gives the Qn statistic of the elements in list. `QnDispersion[list,c]` gives the Qn statistic with a scaling factor c. Examples [#examples] Compute the Qn dispersion of a list: ```wolfram QnDispersion[{1, 2, 3, 4, 5, 100}] (* 2.21914 *) ``` Compare with standard deviation (Qn is more robust to outliers): ```wolfram StandardDeviation[{1, 2, 3, 4, 5, 100}] (* 39.0128 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QnDispersion.html) for more details. # Quantile `Quantile[data, p]` gives the `p`th quantile of `data`. `Quantile[data, {p1, p2, ...}]` gives a list of quantiles. Examples [#examples] Compute quantiles of a list: ```wolfram (* Median is the 0.5 quantile *) Quantile[{1, 2, 3, 4, 5}, 0.5] (* 3 *) (* Multiple quantiles *) Quantile[{1, 2, 3, 4, 5}, {0.25, 0.5, 0.75}] (* {2, 3, 4} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quantile.html) for more details. # QuantilePlot `QuantilePlot[list]` generates a plot of quantiles of list against the quantiles of a normal distribution. Examples [#examples] Q-Q plot against normal: ```wolfram data = RandomVariate[NormalDistribution[], 100]; QuantilePlot[data] ``` Compare to specific distribution: ```wolfram QuantilePlot[data, ExponentialDistribution[1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantilePlot.html) for more details. # QuantityDistribution `QuantityDistribution[dist, unit]` represents a distribution dist of quantities with unit specified by unit. * `QuantityDistribution[dist, {unit1, unit2, ...}]` represents a multivariate distribution with units \{unit1, unit2, …}. Examples [#examples] ```wolfram dist = QuantityDistribution[NormalDistribution[0, 1], "Meters"]; RandomVariate[dist] ``` ```wolfram Mean[QuantityDistribution[UniformDistribution[{0, 10}], "Seconds"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuantityDistribution.html) for more details. # QuartileDeviation `QuartileDeviation[data]` gives the quartile deviation or semi-interquartile range of the elements in data. * `QuartileDeviation[data, {{a, b}, {c, d}}]` uses the quantile definition specified by parameters a, b, c, d. * `QuartileDeviation[dist]` gives the quartile deviation or semi-interquartile range of the distribution dist. Examples [#examples] ```wolfram QuartileDeviation[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}] ``` ```wolfram QuartileDeviation[NormalDistribution[0, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuartileDeviation.html) for more details. # Quartiles `Quartiles[data]` gives the \{Q1, Q2, Q3} quantile estimates of the elements in data. `Quartiles[dist]` gives the quartiles of the distribution dist. Examples [#examples] Get quartiles: ```wolfram Quartiles[{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}] (* {3, 11/2, 8} *) ``` For a distribution: ```wolfram Quartiles[NormalDistribution[0, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Quartiles.html) for more details. # QueueingNetworkProcess `QueueingNetworkProcess[γ, r, μ, c]` represents an open (Jackson) queueing network process with arrival vector γ, routing probability matrix r, service vector μ, and service channel vector c. * `QueueingNetworkProcess[γ, r, μ, c, k]` represents a closed (Gordon–Newell) queueing network process with k jobs in the system. Examples [#examples] Open queueing network: ```wolfram QueueingNetworkProcess[{0.5, 0.3}, {{0, 0.5}, {0.5, 0}}, {1, 1}, {1, 1}] ``` Mean queue lengths: ```wolfram qnp = QueueingNetworkProcess[{1}, {{0}}, {2}, {1}]; Mean[qnp] ``` Closed queueing network with 5 jobs: ```wolfram QueueingNetworkProcess[{0, 0}, {{0, 1}, {1, 0}}, {2, 3}, {1, 1}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QueueingNetworkProcess.html) for more details. # QueueingProcess `QueueingProcess[λ,μ]` represents an M/M/1 queue with arrival rate λ and service rate μ. `QueueingProcess[λ,sdist]` represents an M/G/1 queue with arrival rate λ and service distribution sdist. `QueueingProcess[adist,μ]` represents a G/M/1 queue with arrival distribution adist and service rate μ. `QueueingProcess[adist,sdist]` represents a G/G/1 queue with arrival distribution adist and service distribution sdist. `QueueingProcess[…,…,c]` represents a queueing process with c service channels. `QueueingProcess[…,…,c,k]` represents a queueing process with system capacity k. `QueueingProcess[…,…,c,k,x0]` represents a queueing process with initial state x0. Examples [#examples] ```wolfram QueueingProcess[2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QueueingProcess.html) for more details. # Random `Random[]` gives a uniformly distributed pseudorandom Real in the range 0 to 1. * `Random[type, range]` gives a pseudorandom number of the specified type, lying in the specified range. Possible types are: `Integer`, `Real` and `Complex`. The default range is 0 to 1. You can give the range `{min, max}` explicitly; a range specification of max is equivalent to `{0, max}`. **Note:** `Random` is deprecated; use `RandomReal`, `RandomInteger`, or `RandomComplex` instead. Examples [#examples] ```wolfram Random[] ``` ```wolfram Random[Integer, 100] ``` ```wolfram Random[Real, {-1, 1}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Random.html) for more details. # RandomChoice `RandomChoice[{e1, e2, ...}]` gives a pseudorandom choice of one of the ei. `RandomChoice[list, n]` gives a list of n pseudorandom choices (with replacement). Examples [#examples] Random choice from a list: ```wolfram RandomChoice[{"apple", "banana", "cherry"}] (* "banana" *) ``` Multiple random choices: ```wolfram RandomChoice[{1, 2, 3, 4, 5}, 3] (* {2, 5, 2} *) ``` Weighted choices: ```wolfram RandomChoice[{3, 1} -> {"heads", "tails"}, 5] (* {"heads", "heads", "tails", "heads", "heads"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomChoice.html) for more details. # RandomColor `RandomColor[]` gives a pseudorandom color directive in the RGBColor space. `RandomColor[n]` gives n pseudorandom colors. Examples [#examples] Generate a random color: ```wolfram RandomColor[] (* RGBColor[0.372, 0.827, 0.153] *) ``` Generate multiple random colors: ```wolfram RandomColor[5] (* {RGBColor[...], RGBColor[...], ...} *) ``` Generate colors from a specific color scheme: ```wolfram RandomColor["SunsetColors", 3] (* {RGBColor[...], ...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomColor.html) for more details. # RandomComplex `RandomComplex[]` gives a pseudorandom complex number with real and imaginary parts in the range 0 to 1. `RandomComplex[{zmin, zmax}]` gives a pseudorandom complex number in the rectangle with corners given by zmin and zmax. `RandomComplex[range, n]` gives a list of n pseudorandom complex numbers. Examples [#examples] Random complex number: ```wolfram RandomComplex[] (* 0.472 + 0.831 I *) ``` In a specific range: ```wolfram RandomComplex[{-1 - I, 1 + I}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomComplex.html) for more details. # RandomDate `RandomDate[]` gives a pseudorandom date in the current calendar year. * `RandomDate[{datemin, datemax}]` gives a pseudorandom date between the dates datemin and datemax. * `RandomDate[date]` gives a pseudorandom date between the start and end of the calendar period date. * `RandomDate[quantity]` gives a pseudorandom date between now and the time quantity duration from now. * `RandomDate[range, n]` gives a list of n pseudorandom dates. Examples [#examples] ```wolfram RandomDate[] ``` ```wolfram RandomDate[{DateObject[{2020, 1, 1}], DateObject[{2023, 12, 31}]}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomDate.html) for more details. # RandomEntity `RandomEntity[spec]` gives a pseudorandom entity with a type determined by the specification *spec*. * `RandomEntity[spec, n]` gives a list of *n* pseudorandom entities. Examples [#examples] ```wolfram RandomEntity["Country"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomEntity.html) for more details. # RandomFunction `RandomFunction[proc,{tmin,tmax}]` generates a pseudorandom function from the process proc from tmin to tmax. `RandomFunction[proc,{tmin,tmax,dt}]` generates a pseudorandom function from tmin to tmax in steps of dt. `RandomFunction[proc,…,n]` generates an ensemble of n pseudorandom functions. Examples [#examples] Generate a Wiener process: ```wolfram RandomFunction[WienerProcess[], {0, 10}] ``` Generate multiple paths: ```wolfram RandomFunction[WienerProcess[], {0, 1, 0.01}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomFunction.html) for more details. # RandomGeneratorState `RandomGeneratorState[...]` gives a representation of the internal state of a pseudorandom generator. Examples [#examples] Get the current random generator state: ```wolfram state = $RandomGeneratorState ``` Restore a previous state: ```wolfram SeedRandom[state] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomGeneratorState.html) for more details. # RandomInstance `RandomInstance[expr]` finds a random instance of an expression such as a geometric scene or biomolecular sequence. * `RandomInstance[expr, n]` finds n instances. Examples [#examples] Generate a random instance of a geometric scene: ```wolfram RandomInstance[GeometricScene[{a, b, c}, {Triangle[{a, b, c}]}]] ``` Get multiple random instances: ```wolfram RandomInstance[GeometricScene[{a, b, c}, {Triangle[{a, b, c}]}], 3] ``` Random DNA sequence matching a pattern: ```wolfram RandomInstance[BioSequence["DNA", "ATCG" ~~ ___ ~~ "GCTA"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomInstance.html) for more details. # RandomInteger `RandomInteger[{imin, imax}]` gives a pseudorandom integer in the range imin to imax. `RandomInteger[imax]` gives a pseudorandom integer in the range 0 to imax. `RandomInteger[range, n]` gives a list of n pseudorandom integers. Examples [#examples] Random integer from 1 to 10: ```wolfram RandomInteger[{1, 10}] (* 7 *) ``` List of random integers: ```wolfram RandomInteger[100, 5] (* {42, 87, 13, 56, 91} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomInteger.html) for more details. # RandomPermutation `RandomPermutation[n]` gives a pseudorandom permutation of length n. `RandomPermutation[gr]` gives a pseudorandom permutation in the permutation group gr. `RandomPermutation[n, k]` gives a list of k pseudorandom permutations. Examples [#examples] Random permutation: ```wolfram RandomPermutation[5] (* Cycles[{{1, 3, 5, 2}}] *) ``` Multiple permutations: ```wolfram RandomPermutation[4, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPermutation.html) for more details. # RandomPrime `RandomPrime[{imin, imax}]` gives a pseudorandom prime in the range imin to imax. `RandomPrime[imax]` gives a random prime from 2 to imax. `RandomPrime[range, n]` gives a list of n random primes. Examples [#examples] Random prime up to 100: ```wolfram RandomPrime[100] (* 47 *) ``` Random primes in a range: ```wolfram RandomPrime[{100, 200}, 5] (* {103, 179, 127, 191, 157} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomPrime.html) for more details. # RandomReal `RandomReal[]` gives a pseudorandom real number in the range 0 to 1. `RandomReal[{xmin, xmax}]` gives a pseudorandom real in the specified range. `RandomReal[range, n]` gives a list of n pseudorandom reals. Examples [#examples] Random number between 0 and 1: ```wolfram RandomReal[] (* 0.472... *) ``` Random number in a range: ```wolfram RandomReal[{10, 20}] (* 15.3... *) ``` List of random numbers: ```wolfram RandomReal[1, 5] (* {0.23..., 0.87..., 0.12..., 0.56..., 0.91...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomReal.html) for more details. # RandomSample `RandomSample[{e1, e2, ...}, n]` gives a pseudorandom sample of n elements (without replacement). `RandomSample[{e1, e2, ...}]` gives a pseudorandom permutation of the elements. Examples [#examples] Random sample without replacement: ```wolfram RandomSample[{1, 2, 3, 4, 5}, 3] (* {3, 5, 1} *) ``` Random permutation: ```wolfram RandomSample[{a, b, c, d}] (* {c, a, d, b} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomSample.html) for more details. # RandomTime `RandomTime[]` gives a pseudorandom time of day. * `RandomTime[{timemin, timemax}]` gives a pseudorandom time between the times timemin and timemax. * `RandomTime[time]` gives a pseudorandom time between the start and end of the time period time. * `RandomTime[quantity]` gives a pseudorandom time between now and the time quantity duration from now. * `RandomTime[range, n]` gives a list of n pseudorandom times. Examples [#examples] ```wolfram RandomTime[] ``` ```wolfram RandomTime[{TimeObject[{9, 0}], TimeObject[{17, 0}]}, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomTime.html) for more details. # RandomVariate `RandomVariate[dist]` gives a pseudorandom variate from the symbolic distribution dist. `RandomVariate[dist, n]` gives a list of n variates. Examples [#examples] Sample from a normal distribution: ```wolfram RandomVariate[NormalDistribution[]] (* 0.543821 *) ``` Generate multiple samples from an exponential distribution: ```wolfram RandomVariate[ExponentialDistribution[1], 5] (* {0.234, 1.872, 0.651, 2.103, 0.412} *) ``` Sample from a Poisson distribution: ```wolfram RandomVariate[PoissonDistribution[3], 4] (* {2, 4, 3, 1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomVariate.html) for more details. # RandomWalkProcess `RandomWalkProcess[p]` represents a random walk on a line with the probability of a positive unit step *p* and the probability of a negative unit step 1-*p*. * `RandomWalkProcess[p, q]` represents a random walk with the probability of a positive unit step *p*, the probability of a negative unit step *q*, and the probability of a zero step 1-*p*-*q*. Examples [#examples] ```wolfram RandomFunction[RandomWalkProcess[0.5], {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomWalkProcess.html) for more details. # RandomWord `RandomWord[]` gives a pseudorandom commonly used word. * `RandomWord[n]` gives a list of n pseudorandom words. * `RandomWord[type]` gives a pseudorandom word of the specified type. * `RandomWord[type, n]` gives a list of n pseudorandom words of the specified type. Examples [#examples] Single random word: ```wolfram RandomWord[] ``` Multiple random words: ```wolfram RandomWord[5] ``` Random nouns: ```wolfram RandomWord["Noun", 5] ``` Random adjectives: ```wolfram RandomWord["Adjective", 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RandomWord.html) for more details. # RarerProbability `RarerProbability[dist, example]` computes the probability for distribution dist to generate a sample that has a lower or equal PDF than example. * `RarerProbability[dist, {ex1, ex2, ...}]` computes the rarer probability for each exi. Examples [#examples] ```wolfram RarerProbability[NormalDistribution[], 2] ``` ```wolfram RarerProbability[PoissonDistribution[3], {0, 1, 5, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RarerProbability.html) for more details. # RayleighDistribution `RayleighDistribution[σ]` represents the Rayleigh distribution with scale parameter σ. Examples [#examples] ```wolfram Mean[RayleighDistribution[1]] ``` ```wolfram RandomVariate[RayleighDistribution[2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RayleighDistribution.html) for more details. # ReliabilityDistribution `ReliabilityDistribution[bexpr, {{x1, dist1}, {x2, dist2}, ...}]` represents the reliability distribution for a system with components xi having reliability distribution disti, where the whole system is working when the Boolean expression bexpr is `True`, and component xi is working when xi is `True`. This is used for reliability analysis of systems with multiple components. Examples [#examples] ```wolfram (* Series system - all must work *) ReliabilityDistribution[a && b, {{a, ExponentialDistribution[1]}, {b, ExponentialDistribution[2]}}] ``` ```wolfram (* Parallel system - at least one must work *) ReliabilityDistribution[a || b, {{a, ExponentialDistribution[1]}, {b, ExponentialDistribution[1]}}] ``` ```wolfram Mean[ReliabilityDistribution[x1 && x2, {{x1, WeibullDistribution[2, 1]}, {x2, WeibullDistribution[2, 1]}}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ReliabilityDistribution.html) for more details. # RiceDistribution `RiceDistribution[α, β]` represents a Rice distribution with shape parameters α and β. * `RiceDistribution[m, α, β]` represents a Norton–Rice distribution with parameters m, α, and β. Examples [#examples] ```wolfram dist = RiceDistribution[1, 2]; Mean[dist] ``` ```wolfram RandomVariate[RiceDistribution[0.5, 1], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiceDistribution.html) for more details. # RiskAchievementImportance `RiskAchievementImportance[rdist, t]` gives the risk achievement importances for all components in the `ReliabilityDistribution` rdist at time t. * `RiskAchievementImportance[fdist, t]` gives the risk achievement importances for all components in the `FailureDistribution` fdist at time t. Examples [#examples] ```wolfram RiskAchievementImportance[ReliabilityDistribution[a && b, {a, b}], 1] ``` ```wolfram RiskAchievementImportance[rdist, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiskAchievementImportance.html) for more details. # RiskReductionImportance `RiskReductionImportance[rdist, t]` gives the risk reduction importances for all components in the `ReliabilityDistribution` rdist at time t. `RiskReductionImportance[fdist, t]` gives the risk reduction importances for all components in the `FailureDistribution` fdist at time t. Examples [#examples] ```wolfram RiskReductionImportance[ReliabilityDistribution[a && b, {a \[Distributed] ExponentialDistribution[1], b \[Distributed] ExponentialDistribution[2]}], 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RiskReductionImportance.html) for more details. # RogersTanimotoDissimilarity `RogersTanimotoDissimilarity[u,v]` gives the Rogers–Tanimoto dissimilarity between Boolean vectors u and v. Examples [#examples] Compute dissimilarity between two Boolean vectors: ```wolfram RogersTanimotoDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] (* 1/2 *) ``` Identical vectors have zero dissimilarity: ```wolfram RogersTanimotoDissimilarity[{1, 0, 1}, {1, 0, 1}] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RogersTanimotoDissimilarity.html) for more details. # RussellRaoDissimilarity `RussellRaoDissimilarity[u, v]` gives the Russell–Rao dissimilarity between Boolean vectors u and v. Examples [#examples] Calculate dissimilarity between Boolean vectors: ```wolfram RussellRaoDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] ``` Identical vectors have zero dissimilarity: ```wolfram RussellRaoDissimilarity[{1, 1, 1}, {1, 1, 1}] (* 0 *) ``` Compare with other dissimilarity measures: ```wolfram {RussellRaoDissimilarity[{1, 0, 1}, {1, 1, 0}], JaccardDissimilarity[{1, 0, 1}, {1, 1, 0}]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RussellRaoDissimilarity.html) for more details. # SARIMAProcess `SARIMAProcess[{a1, ..., ap}, d, {b1, ..., bq}, {s, {α1, ..., αm}, δ, {β1, ..., βr}}, v]` represents a seasonal integrated autoregressive moving-average process with ARIMA coefficients, seasonal order s, and variance v. * `SARIMAProcess[..., Σ]` represents a vector SARIMA process with covariance matrix Σ. * `SARIMAProcess[..., init]` represents a SARIMA process with initial data init. * `SARIMAProcess[c, ...]` represents a SARIMA process with constant c. Examples [#examples] ```wolfram SARIMAProcess[{0.5}, 1, {0.3}, {12, {0.2}, 1, {0.1}}, 1] ``` ```wolfram RandomFunction[SARIMAProcess[...], {0, 100}] ``` ```wolfram TimeSeriesModelFit[data, "SARIMA"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SARIMAProcess.html) for more details. # SARMAProcess `SARMAProcess[{a1,…,ap},{b1,…,bq},{s,{α1,…,αm},{β1,…,βr}},v]` represents a weakly stationary seasonal autoregressive moving-average process with ARMA coefficients ai and bj, seasonal order s, seasonal ARMA coefficients αi and βj, and normal white noise with variance v. `SARMAProcess[{a1,…,ap},{b1,…,bq},{s,{α1,…,αm},{β1,…,βr}},Σ]` represents a weakly stationary vector SARMA process driven by normal white noise, with covariance matrix Σ. `SARMAProcess[{a1,…,ap},{b1,…,bq},{{s1,…},{α1,…,αm},{β1,…,βr}},Σ]` represents a weakly stationary vector SARMA process with multiple seasonal orders si. `SARMAProcess[{a1,…,ap},{b1,…,bq},{s,{α1,…,αm},{β1,…,βr}},v,init]` represents a SARMA process with initial data init. `SARMAProcess[c,…]` represents a SARMA process with a constant c. Examples [#examples] Create a simple SARMA process: ```wolfram proc = SARMAProcess[{0.5}, {}, {12, {0.3}, {}}, 1] ``` Simulate from a SARMA process: ```wolfram RandomFunction[SARMAProcess[{0.5}, {}, {12, {0.3}, {}}, 1], {0, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SARMAProcess.html) for more details. # SeedRandom `SeedRandom[s]` resets the pseudorandom generator using s as a seed. `SeedRandom[]` resets using the time of day and session attributes. Examples [#examples] Set a fixed seed for reproducibility: ```wolfram SeedRandom[42]; RandomReal[] (* 0.370286... *) ``` Same seed gives same results: ```wolfram SeedRandom[42]; RandomInteger[100] (* 37 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SeedRandom.html) for more details. # ShapiroWilkTest `ShapiroWilkTest[data]` tests whether data is normally distributed using the Shapiro–Wilk test. * `ShapiroWilkTest[data, "property"]` returns the value of "property". Examples [#examples] ```wolfram data = RandomVariate[NormalDistribution[], 50]; ShapiroWilkTest[data] ``` ```wolfram ShapiroWilkTest[data, "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShapiroWilkTest.html) for more details. # ShiftedGompertzDistribution `ShiftedGompertzDistribution[λ, ξ]` represents a shifted Gompertz distribution with scale parameter λ and shape parameter ξ. Examples [#examples] Create distribution: ```wolfram dist = ShiftedGompertzDistribution[1, 2]; ``` Plot PDF: ```wolfram Plot[PDF[ShiftedGompertzDistribution[1, 2], x], {x, 0, 5}] ``` Mean and variance: ```wolfram {Mean[dist], Variance[dist]} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ShiftedGompertzDistribution.html) for more details. # SkellamDistribution `SkellamDistribution[μ1, μ2]` represents a Skellam distribution with shape parameters μ1 and μ2. Examples [#examples] Create a Skellam distribution: ```wolfram dist = SkellamDistribution[5, 3] ``` Compute the mean: ```wolfram Mean[SkellamDistribution[5, 3]] (* 2 *) ``` Generate random samples: ```wolfram RandomVariate[SkellamDistribution[5, 3], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SkellamDistribution.html) for more details. # SkewNormalDistribution `SkewNormalDistribution[μ, σ, α]` represents a skew-normal distribution with shape parameter α, location parameter μ, and scale parameter σ. Examples [#examples] Create a skew-normal distribution: ```wolfram dist = SkewNormalDistribution[0, 1, 2] ``` Plot the probability density: ```wolfram Plot[PDF[SkewNormalDistribution[0, 1, 2], x], {x, -4, 4}] ``` Generate random samples: ```wolfram RandomVariate[SkewNormalDistribution[0, 1, 5], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SkewNormalDistribution.html) for more details. # Skewness `Skewness[data]` gives the coefficient of skewness estimate for the elements in data. * `Skewness[dist]` gives the coefficient of skewness for the distribution dist. Examples [#examples] Skewness of data: ```wolfram Skewness[{1, 2, 3, 4, 5, 10}] ``` Skewness of a distribution: ```wolfram Skewness[NormalDistribution[0, 1]] (* 0 *) ``` Positively skewed distribution: ```wolfram Skewness[ExponentialDistribution[1]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Skewness.html) for more details. # SliceDistribution `SliceDistribution[proc, t]` represents the distribution of the process state at time t. * `SliceDistribution[proc, {t1, ..., tk}]` represents the joint distribution of process states at times t1 \< ... \< tk. Examples [#examples] Distribution at a specific time: ```wolfram proc = WienerProcess[]; SliceDistribution[proc, 1] ``` Joint distribution at multiple times: ```wolfram SliceDistribution[proc, {1, 2, 3}] ``` Sample from slice distribution: ```wolfram RandomVariate[SliceDistribution[WienerProcess[], 2], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SliceDistribution.html) for more details. # SmithWatermanSimilarity `SmithWatermanSimilarity[u, v]` gives a number representing the Smith–Waterman similarity between strings, vectors or bio sequences u and v. Examples [#examples] ```wolfram SmithWatermanSimilarity["kitten", "sitting"] ``` ```wolfram SmithWatermanSimilarity[{1, 2, 3}, {2, 3, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmithWatermanSimilarity.html) for more details. # SmoothKernelDistribution `SmoothKernelDistribution[{x1, x2, ...}]` represents a smooth kernel distribution based on the data values xi. `SmoothKernelDistribution[..., bw]` represents a smooth kernel distribution with bandwidth bw. `SmoothKernelDistribution[..., bw, ker]` represents a smooth kernel distribution with bandwidth bw and smoothing kernel ker. Examples [#examples] Create a kernel density estimate: ```wolfram data = RandomVariate[NormalDistribution[], 100]; dist = SmoothKernelDistribution[data]; PDF[dist, 0] ``` Plot the estimated PDF: ```wolfram Plot[PDF[dist, x], {x, -4, 4}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmoothKernelDistribution.html) for more details. # SmoothPointDensity `SmoothPointDensity[pdata]` estimates the point density function μ(x) for point data pdata. `SmoothPointDensity[pdata, bw]` estimates the density for point data pdata with bandwidth bw. `SmoothPointDensity[pdata, bw, ker]` estimates the density for point data pdata with bandwidth bw and smoothing kernel ker. `SmoothPointDensity[bdata, ...]` estimates the point density function μ(x) for binned data bdata. `SmoothPointDensity[pproc, ...]` computes the density function μ(x) for point process pproc. Examples [#examples] ```wolfram pts = RandomPointConfiguration[PoissonPointProcess[100], Rectangle[]]; SmoothPointDensity[pts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmoothPointDensity.html) for more details. # SnDispersion `SnDispersion[list]` gives the Sn statistic of the elements in list. * `SnDispersion[list, c]` gives the Sn statistic with scaling factor c. Examples [#examples] ```wolfram SnDispersion[{1, 2, 3, 4, 5, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SnDispersion.html) for more details. # SokalSneathDissimilarity `SokalSneathDissimilarity[u, v]` gives the Sokal–Sneath dissimilarity between Boolean vectors u and v. This is a measure of dissimilarity between binary vectors used in clustering and classification. Examples [#examples] ```wolfram SokalSneathDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] ``` ```wolfram SokalSneathDissimilarity[{True, False, True}, {False, False, True}] ``` ```wolfram DistanceMatrix[data, DistanceFunction -> SokalSneathDissimilarity] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SokalSneathDissimilarity.html) for more details. # SpatialEstimate `SpatialEstimate[{loc1 -> val1, loc2 -> val2, ...}]` creates a spatial prediction from values vali given at locations loci. * `SpatialEstimate[{loc1, loc2, ...} -> {val1, val2, ...}]` generates the same result. Examples [#examples] Create a spatial estimate: ```wolfram SpatialEstimate[{{0, 0} -> 1, {1, 0} -> 2, {0, 1} -> 3}] ``` Predict at a new location: ```wolfram estimate = SpatialEstimate[data]; estimate[{0.5, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialEstimate.html) for more details. # SpatialEstimatorFunction `SpatialEstimatorFunction[...]` represents a function generated by `SpatialEstimate` and predicts spatial field values from locations. Examples [#examples] ```wolfram data = {{0, 0} -> 1, {1, 0} -> 2, {0, 1} -> 3}; estimator = SpatialEstimate[data] ``` ```wolfram estimator[{0.5, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialEstimatorFunction.html) for more details. # SpatialGraphDistribution `SpatialGraphDistribution[n,r]` represents a spatial distribution for graphs with n vertices uniformly distributed over the unit square and edges between vertices that are at distance at most r. `SpatialGraphDistribution[n,r,d]` represents a spatial distribution for graphs with vertices uniformly distributed over the d-dimensional unit square. `SpatialGraphDistribution[n,r,dist]` represents a spatial distribution for graphs with vertices distributed according to the probability distribution dist. `SpatialGraphDistribution[n,r,reg]` represents a spatial distribution for graphs with vertices uniformly distributed in the region reg. Examples [#examples] Generate a random spatial graph: ```wolfram RandomGraph[SpatialGraphDistribution[20, 0.3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialGraphDistribution.html) for more details. # SpatialPointSelect `SpatialPointSelect[spdata, crit]` selects a subset of the `SpatialPointData` *spdata* according to *crit*. Examples [#examples] ```wolfram pts = SpatialPointData[RandomPoint[Disk[], 100]]; SpatialPointSelect[pts, RegionMember[Rectangle[]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialPointSelect.html) for more details. # SpatialRandomnessTest `SpatialRandomnessTest[pdata]` tests whether the point collection pdata is distributed uniformly over the observation region. `SpatialRandomnessTest[pdata,"property"]` returns the value of "property". Examples [#examples] Test spatial randomness of points: ```wolfram pts = RandomReal[1, {50, 2}]; SpatialRandomnessTest[pts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpatialRandomnessTest.html) for more details. # SpearmanRankTest `SpearmanRankTest[v1, v2]` tests whether the vectors v1 and v2 are independent. * `SpearmanRankTest[m1, m2]` tests whether the matrices m1 and m2 are independent. * `SpearmanRankTest[…, "property"]` returns the value of "property". Examples [#examples] ```wolfram v1 = {1, 2, 3, 4, 5}; v2 = {5, 6, 7, 8, 7}; SpearmanRankTest[v1, v2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpearmanRankTest.html) for more details. # SplicedDistribution `SplicedDistribution[{w1, w2, ..., wn}, {c0, c1, ..., cn}, {dist1, dist2, ..., distn}]` represents the distribution obtained by splicing the distributions dist1, dist2, … truncated on the intervals \{c0, c1}, \{c1, c2}, … with weights w1, w2, …. Examples [#examples] ```wolfram dist = SplicedDistribution[{1, 1}, {0, 1, 2}, {UniformDistribution[], NormalDistribution[1.5, 0.2]}]; PDF[dist, x] ``` ```wolfram RandomVariate[SplicedDistribution[{1, 1}, {0, 1, 2}, {UniformDistribution[], UniformDistribution[{1, 2}]}], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SplicedDistribution.html) for more details. # SquaredEuclideanDistance `SquaredEuclideanDistance[u, v]` gives the squared Euclidean distance between vectors u and v. This is equivalent to `EuclideanDistance[u, v]^2` but more efficient. Examples [#examples] ```wolfram SquaredEuclideanDistance[{1, 2, 3}, {4, 5, 6}] ``` ```wolfram SquaredEuclideanDistance[{0, 0}, {3, 4}] ``` ```wolfram DistanceMatrix[data, DistanceFunction -> SquaredEuclideanDistance] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SquaredEuclideanDistance.html) for more details. # StableDistribution `StableDistribution[type,α,β,μ,σ]` represents the stable distribution Stype with index of stability α, skewness parameter β, location parameter μ, and scale parameter σ. Examples [#examples] Create a stable distribution and sample from it: ```wolfram dist = StableDistribution[1, 1.5, 0, 0, 1]; RandomVariate[dist, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StableDistribution.html) for more details. # StandardDeviation `StandardDeviation[data]` gives the sample standard deviation estimate of the elements in `data`. `StandardDeviation[dist]` gives the standard deviation of the distribution `dist`. Examples [#examples] Compute standard deviation of a list: ```wolfram StandardDeviation[{1, 2, 3, 4, 5}] (* Sqrt[5/2] *) (* Standard deviation of a distribution *) StandardDeviation[NormalDistribution[0, 2]] (* 2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StandardDeviation.html) for more details. # StationaryDistribution `StationaryDistribution[proc]` represents the stationary distribution of the process proc, when it exists. Examples [#examples] Stationary distribution of a Markov process: ```wolfram mp = DiscreteMarkovProcess[{1, 0}, {{0.5, 0.5}, {0.3, 0.7}}]; StationaryDistribution[mp] ``` Generate from stationary distribution: ```wolfram RandomVariate[StationaryDistribution[mp], 5] ``` Stationary probability: ```wolfram PDF[StationaryDistribution[mp], 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StationaryDistribution.html) for more details. # StratonovichProcess `StratonovichProcess[{a, b}, x, t]` represents a Stratonovich process x(t), where dx(t) = a(t,x(t))dt + b(t,x(t)) ∘ dw(t). * `StratonovichProcess[{a, b, c}, x, t]` represents a Stratonovich process y(t) = c(t,x(t)). * `StratonovichProcess[..., ..., {x, x0}, {t, t0}]` represents a Stratonovich process with initial condition x(t0) = x0. * `StratonovichProcess[..., ..., ..., Σ]` uses a Wiener process w(t) with covariance Σ. * `StratonovichProcess[proc]` converts proc to a standard Stratonovich process whenever possible. * `StratonovichProcess[sdeqns, expr, x, t, w, dproc]` represents a Stratonovich process specified by a stochastic differential equation sdeqns. Stratonovich processes use a different stochastic calculus convention than Itô processes. Examples [#examples] ```wolfram StratonovichProcess[{x[t], 1}, x[t], t] ``` ```wolfram proc = StratonovichProcess[{-x[t], x[t]}, x[t], t]; RandomFunction[proc, {0, 1, 0.01}] ``` ```wolfram StratonovichProcess[{0, x[t]}, x[t], t, {x, 1}, {t, 0}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StratonovichProcess.html) for more details. # StructuralImportance `StructuralImportance[rdist]` gives the structural importances for all components in the `ReliabilityDistribution` rdist. * `StructuralImportance[fdist]` gives the structural importances for all components in the `FailureDistribution` fdist. * `StructuralImportance[bexpr, {x1, x2, ...}]` gives the structural importance for the components x1, x2, ... in the Boolean expression bexpr. Examples [#examples] ```wolfram StructuralImportance[a && (b || c), {a, b, c}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StructuralImportance.html) for more details. # StudentTDistribution `StudentTDistribution[ν]` represents a standard Student *t* distribution with *ν* degrees of freedom. * `StudentTDistribution[μ, σ, ν]` represents a Student *t* distribution with location parameter *μ*, scale parameter *σ*, and *ν* degrees of freedom. Examples [#examples] ```wolfram PDF[StudentTDistribution[5], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StudentTDistribution.html) for more details. # SurvivalDistribution `SurvivalDistribution[{e1, e2, …}]` represents a survival distribution with event times ei. * `SurvivalDistribution[{cw1, cw2, …} -> {e1, e2, …}]` represents a survival distribution where events ei occur with censor weights cwi. Examples [#examples] ```wolfram SurvivalDistribution[{1, 2, 3, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurvivalDistribution.html) for more details. # SurvivalFunction `SurvivalFunction[dist,x]` gives the survival function for the distribution dist evaluated at x. `SurvivalFunction[dist,{x1,x2,…}]` gives the multivariate survival function for the distribution dist evaluated at \{x1,x2,…}. `SurvivalFunction[dist]` gives the survival function as a pure function. Examples [#examples] Compute the survival function for an exponential distribution: ```wolfram SurvivalFunction[ExponentialDistribution[1], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurvivalFunction.html) for more details. # SurvivalModel `SurvivalModel[...]` represents the symbolic survival model obtained from functions like SurvivalModelFit. Examples [#examples] Fit a survival model: ```wolfram data = {{1, 1}, {2, 0}, {3, 1}, {5, 1}}; model = SurvivalModelFit[data] ``` Get survival function: ```wolfram model["SurvivalFunction"] ``` Plot survival curve: ```wolfram Plot[model["SurvivalFunction"][t], {t, 0, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurvivalModel.html) for more details. # SurvivalModelFit `SurvivalModelFit[{e1, e2, ...}]` creates a survival model for event times ei. Examples [#examples] ```wolfram model = SurvivalModelFit[{1, 2, 3, 5, 7, 10}] ``` ```wolfram model["SurvivalFunction"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SurvivalModelFit.html) for more details. # SuzukiDistribution `SuzukiDistribution[μ, ν]` represents the Suzuki distribution with shape parameters μ and ν. The Suzuki distribution is used to model fading in wireless communications. Examples [#examples] ```wolfram dist = SuzukiDistribution[1, 2] ``` ```wolfram Mean[SuzukiDistribution[1, 1]] ``` ```wolfram Plot[PDF[SuzukiDistribution[1, 2], x], {x, 0, 5}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SuzukiDistribution.html) for more details. # TTest `TTest[data]` tests whether the mean of data is zero. * `TTest[{data1, data2}]` tests whether the means of data1 and data2 are equal. * `TTest[dspec, μ0]` tests the mean against μ0. * `TTest[dspec, μ0, "property"]` returns the value of "property". Examples [#examples] Test if mean is zero: ```wolfram TTest[{1.2, -0.5, 0.8, 1.1, -0.3}] ``` Compare two samples: ```wolfram TTest[{{1, 2, 3, 4}, {3, 4, 5, 6}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TTest.html) for more details. # TelegraphProcess `TelegraphProcess[μ]` represents a telegraph process with rate μ. A telegraph process switches between two states at random times determined by a Poisson process. Examples [#examples] ```wolfram TelegraphProcess[1] ``` ```wolfram RandomFunction[TelegraphProcess[2], {0, 10}] ``` ```wolfram Mean[TelegraphProcess[0.5]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TelegraphProcess.html) for more details. # TimeDistribution `TimeDistribution[dist, tunit]` represents a linear distribution of time of day according to dist with time scale unit tunit originating at midnight. * `TimeDistribution[dist, tunit, torig]` represents a linear distribution of time of day with time origin at torig. Examples [#examples] Create a time distribution: ```wolfram dist = TimeDistribution[NormalDistribution[12, 2], "Hour"] ``` Generate random times: ```wolfram RandomVariate[TimeDistribution[UniformDistribution[], "Hour"]] ``` Distribution centered at noon: ```wolfram TimeDistribution[NormalDistribution[0, 1], "Hour", TimeObject[{12, 0}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeDistribution.html) for more details. # TimeSeries `TimeSeries[{{t1, v1}, {t2, v2}, ...}]` represents a time series specified by time-value pairs \{ti, vi}. `TimeSeries[{v1, v2, ...}, tspec]` represents a time series with values vi at times specified by tspec. Examples [#examples] Create a simple time series: ```wolfram TimeSeries[{{0, 1}, {1, 3}, {2, 2}, {3, 5}}] (* TimeSeries[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeries.html) for more details. # TimeSeriesAggregate `TimeSeriesAggregate[tseries, dt]` computes the mean value of tseries over non-overlapping windows of width dt. `TimeSeriesAggregate[tseries, dt, f]` applies the function f to the values of tseries in non-overlapping windows of width dt. Examples [#examples] Aggregate a time series by computing means: ```wolfram ts = TimeSeries[{1, 2, 3, 4, 5, 6}, {0, 6}]; TimeSeriesAggregate[ts, 2] ``` Use a custom aggregation function: ```wolfram TimeSeriesAggregate[ts, 2, Max] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesAggregate.html) for more details. # TimeSeriesForecast `TimeSeriesForecast[tproc, data, k]` gives the k-step-ahead forecast beyond data according to the time series process tproc. * `TimeSeriesForecast[tsmod, k]` gives the k-step-ahead forecast for `TimeSeriesModel` tsmod. Examples [#examples] ```wolfram TimeSeriesForecast[ARProcess[{0.5}, 1], {1, 2, 3, 4, 5}, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesForecast.html) for more details. # TimeSeriesInsert `TimeSeriesInsert[tseries, {t, v}]` inserts a value v at time t in the time series tseries. * `TimeSeriesInsert[tseries1, tseries2]` inserts the time-value pairs from tseries2 into tseries1. Examples [#examples] ```wolfram ts = TimeSeries[{{1, 10}, {2, 20}, {3, 30}}]; TimeSeriesInsert[ts, {2.5, 25}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesInsert.html) for more details. # TimeSeriesInvertibility `TimeSeriesInvertibility[tproc]` gives conditions for the time series process tproc to be invertible. Examples [#examples] ```wolfram TimeSeriesInvertibility[ARMAProcess[{0.5}, {0.3}, 1]] ``` ```wolfram TimeSeriesInvertibility[MAProcess[{a}, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesInvertibility.html) for more details. # TimeSeriesMap `TimeSeriesMap[f, tseries]` applies f to the values in tseries. Examples [#examples] Apply a function to time series values: ```wolfram ts = TimeSeries[{1, 2, 3, 4, 5}]; TimeSeriesMap[#^2 &, ts] ``` Take the logarithm of values: ```wolfram TimeSeriesMap[Log, ts] ``` Apply a smoothing function: ```wolfram TimeSeriesMap[MovingAverage[#, 3] &, ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesMap.html) for more details. # TimeSeriesMapThread `TimeSeriesMapThread[f, tseries]` gives \{\{t1, f\[t1, x1]}, \{t2, f\[t2, x2]}, …} for the time series tseries. * `TimeSeriesMapThread[f, tseries, {{a1, a2, …}, {b1, b2, …}, …}]` gives \{\{t1, f\[t1, x1, a1, b1, …]}, \{t2, f\[t2, x2, a2, b2, …]}, …} for the time series tseries. Examples [#examples] ```wolfram ts = TimeSeries[{1, 2, 3, 4}, {0, 3}]; TimeSeriesMapThread[{#1, #2^2} &, ts] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesMapThread.html) for more details. # TimeSeriesModel `TimeSeriesModel[...]` represents the symbolic time series model obtained from `TimeSeriesModelFit`. This object contains fitted model parameters and can be used for forecasting. Examples [#examples] ```wolfram model = TimeSeriesModelFit[data] model["BestFit"] ``` ```wolfram TimeSeriesForecast[model, {10}] ``` ```wolfram model["Properties"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesModel.html) for more details. # TimeSeriesModelFit `TimeSeriesModelFit[data]` constructs a time series model for data from an automatically selected model family. `TimeSeriesModelFit[data,mspec]` constructs a time series model for data from a model family specified by mspec. Examples [#examples] ```wolfram TimeSeriesModelFit[{1, 2, 4, 7, 11, 16}] (* TimeSeriesModel[...] *) ``` ```wolfram TimeSeriesModelFit[data, "ARMA"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesModelFit.html) for more details. # TimeSeriesResample `TimeSeriesResample[tseries]` uniformly resamples tseries according to its minimum time increment. `TimeSeriesResample[tseries, rspec]` resamples tseries according to rspec. Examples [#examples] Resample a time series uniformly: ```wolfram ts = TimeSeries[{{0, 1}, {1, 3}, {4, 2}}]; TimeSeriesResample[ts] ``` Resample with specified step: ```wolfram TimeSeriesResample[ts, {0, 4, 0.5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesResample.html) for more details. # TimeSeriesRescale `TimeSeriesRescale[tseries, {tmin, tmax}]` rescales the times in time series tseries to run from tmin to tmax. * `TimeSeriesRescale[tseries, {tmin, tmax, tu}]` rescales times in units of tu including "Month", "Quarter", or "Year". Examples [#examples] ```wolfram ts = TimeSeries[{1, 2, 3, 4, 5}]; TimeSeriesRescale[ts, {0, 10}] ``` ```wolfram TimeSeriesRescale[ts, {DateObject[{2020, 1, 1}], DateObject[{2020, 12, 31}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesRescale.html) for more details. # TimeSeriesShift `TimeSeriesShift[tseries, shift]` shifts the time series tseries to the left or right according to shift. Examples [#examples] Shift a time series forward by 5 units: ```wolfram ts = TimeSeries[{1, 2, 3, 4, 5}]; TimeSeriesShift[ts, 5] ``` Shift backward by 2 units: ```wolfram TimeSeriesShift[TimeSeries[Range[10]], -2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesShift.html) for more details. # TimeSeriesThread `TimeSeriesThread[f,{tseries1,tseries2,…}]` combines the tseriesi using the function f. Examples [#examples] Combine two time series by adding their values: ```wolfram ts1 = TimeSeries[{1, 2, 3}, {0, 2}]; ts2 = TimeSeries[{4, 5, 6}, {0, 2}]; TimeSeriesThread[Plus, {ts1, ts2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesThread.html) for more details. # TimeSeriesWindow `TimeSeriesWindow[tseries,{tmin,tmax}]` gives the elements of the time series tseries that fall between tmin and tmax. `TimeSeriesWindow[tseries,windowspec]` gives the elements of the time series tseries that satisfy the window specification windowspec. Examples [#examples] Extract a window from a time series: ```wolfram ts = TimeSeries[{1, 2, 3, 4, 5}, {0, 4}]; TimeSeriesWindow[ts, {1, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TimeSeriesWindow.html) for more details. # TsallisQExponentialDistribution `TsallisQExponentialDistribution[λ, q]` represents a Tsallis q-exponential distribution with scale inversely proportional to parameter λ. Examples [#examples] Create distribution: ```wolfram dist = TsallisQExponentialDistribution[1, 1.5]; ``` Plot PDF: ```wolfram Plot[PDF[TsallisQExponentialDistribution[1, 1.5], x], {x, 0, 5}] ``` Random samples: ```wolfram RandomVariate[TsallisQExponentialDistribution[2, 1.3], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TsallisQExponentialDistribution.html) for more details. # TsallisQGaussianDistribution `TsallisQGaussianDistribution[μ,β,q]` represents a Tsallis q-Gaussian distribution with mean μ, scale parameter β, and deformation parameter q. `TsallisQGaussianDistribution[q]` represents a Tsallis q-Gaussian distribution with mean 0 and scale parameter 1. Examples [#examples] ```wolfram PDF[TsallisQGaussianDistribution[1.5], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TsallisQGaussianDistribution.html) for more details. # TukeyLambdaDistribution `TukeyLambdaDistribution[λ]` represents Tukey's lambda distribution with shape parameter *λ*. * `TukeyLambdaDistribution[λ, μ, σ]` represents Tukey's lambda distribution with location parameter *μ* and scale parameter *σ*. * `TukeyLambdaDistribution[{λ1, λ2}, μ, {σ1, σ2}]` represents the generalized Tukey's lambda distribution with location parameter *μ*, scale parameters *σ1* and *σ2*, and shape parameters *λ1* and *λ2*. Examples [#examples] ```wolfram PDF[TukeyLambdaDistribution[0.5], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TukeyLambdaDistribution.html) for more details. # UniformDistribution `UniformDistribution[{min, max}]` represents a continuous uniform distribution between min and max. `UniformDistribution[]` gives values between 0 and 1. Examples [#examples] Random samples: ```wolfram RandomVariate[UniformDistribution[{0, 10}], 5] (* {3.2, 7.8, 1.5, 9.2, 4.6} *) ``` Mean and variance: ```wolfram Mean[UniformDistribution[{0, 1}]] (* 1/2 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UniformDistribution.html) for more details. # UniformGraphDistribution `UniformGraphDistribution[n, m]` represents a uniform graph distribution on n-vertex, m-edge graphs. Examples [#examples] ```wolfram RandomGraph[UniformGraphDistribution[5, 7]] (* Graph[{1, 2, 3, 4, 5}, {...}] *) ``` ```wolfram Table[RandomGraph[UniformGraphDistribution[6, 8]], 3] (* {Graph[...], Graph[...], Graph[...]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UniformGraphDistribution.html) for more details. # UniformPolyhedron `UniformPolyhedron["name"]` gives the uniform polyhedron with the given name. * `UniformPolyhedron[{n, m}]` gives the uniform polyhedron with n sides of each face and m faces meeting at each vertex point. * `UniformPolyhedron[{r, θ, ϕ}, ...]` rescales the uniform polyhedron by a factor r and rotates by an angle θ with respect to the z axis and angle ϕ with respect to the y axis. * `UniformPolyhedron[{x, y, z}, {r, θ, ϕ}, ...]` centers the uniform polyhedron at \{x, y, z}. Examples [#examples] Create a dodecahedron: ```wolfram UniformPolyhedron["Dodecahedron"] ``` Create by face/vertex specification: ```wolfram UniformPolyhedron[{5, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UniformPolyhedron.html) for more details. # UniformSumDistribution `UniformSumDistribution[n]` represents the distribution of a sum of n random variables uniformly distributed from 0 to 1. * `UniformSumDistribution[n, {min, max}]` represents the sum of n uniform random variables from min to max. Also known as the Irwin-Hall distribution. Examples [#examples] ```wolfram UniformSumDistribution[3] ``` ```wolfram Mean[UniformSumDistribution[10]] ``` ```wolfram Plot[PDF[UniformSumDistribution[5], x], {x, 0, 5}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UniformSumDistribution.html) for more details. # UnitRootTest `UnitRootTest[data]` tests whether data came from an autoregressive time series process with unit root. * `UnitRootTest[data, model, "property"]` returns the value of "property" for a given model. A unit root indicates a non-stationary time series. Examples [#examples] ```wolfram data = Accumulate[RandomVariate[NormalDistribution[], 100]]; UnitRootTest[data] ``` ```wolfram UnitRootTest[RandomReal[1, 100]] ``` ```wolfram UnitRootTest[data, Automatic, "PValue"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnitRootTest.html) for more details. # Variance `Variance[data]` gives the sample variance estimate of the elements in `data`. `Variance[dist]` gives the variance of the distribution `dist`. Examples [#examples] Compute variance of a list: ```wolfram Variance[{1, 2, 3, 4, 5}] (* 5/2 *) (* Variance of a distribution *) Variance[NormalDistribution[0, 2]] (* 4 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Variance.html) for more details. # VarianceEquivalenceTest `VarianceEquivalenceTest[{data1,data2,…}]` tests whether the variances of the datai are equal. `VarianceEquivalenceTest[{data1,…},"property"]` returns the value of "property". Examples [#examples] Test if two samples have equal variances: ```wolfram data1 = RandomVariate[NormalDistribution[0, 1], 50]; data2 = RandomVariate[NormalDistribution[0, 2], 50]; VarianceEquivalenceTest[{data1, data2}] ``` Get the p-value: ```wolfram VarianceEquivalenceTest[{data1, data2}, "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VarianceEquivalenceTest.html) for more details. # VarianceGammaDistribution `VarianceGammaDistribution[λ, α, β, μ]` represents a variance-gamma distribution with location parameter μ, skewness parameter β, and shape parameters λ and α. Examples [#examples] Create distribution: ```wolfram dist = VarianceGammaDistribution[1, 2, 0, 0]; ``` Plot PDF: ```wolfram Plot[PDF[VarianceGammaDistribution[1, 2, 0, 0], x], {x, -5, 5}] ``` Random samples: ```wolfram RandomVariate[VarianceGammaDistribution[1, 2, 0.5, 0], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VarianceGammaDistribution.html) for more details. # VariogramModel `VariogramModel["model", {params}]` represents the function for the variogram model specified by "model". Examples [#examples] Create a spherical variogram model: ```wolfram VariogramModel["Spherical", {1, 10}] ``` Plot a variogram model: ```wolfram Plot[VariogramModel["Gaussian", {1, 5}][h], {h, 0, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VariogramModel.html) for more details. # VoigtDistribution `VoigtDistribution[δ, σ]` represents Voigt distribution with parameters δ and σ. Examples [#examples] ```wolfram dist = VoigtDistribution[1, 2] ``` ```wolfram Plot[PDF[dist, x], {x, -10, 10}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VoigtDistribution.html) for more details. # VonMisesDistribution `VonMisesDistribution[μ, κ]` represents a von Mises distribution with mean μ and concentration κ. Examples [#examples] Create a von Mises distribution: ```wolfram dist = VonMisesDistribution[0, 2] ``` Plot the probability density: ```wolfram Plot[PDF[VonMisesDistribution[0, 2], x], {x, -Pi, Pi}] ``` Generate random samples: ```wolfram RandomVariate[VonMisesDistribution[Pi/2, 5], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VonMisesDistribution.html) for more details. # WakebyDistribution `WakebyDistribution[α, β, γ, δ, μ]` represents Wakeby distribution with shape parameters β and δ, scale parameters α and γ, and location parameter μ. Examples [#examples] Create a Wakeby distribution: ```wolfram WakebyDistribution[1, 0.5, 1, 0.5, 0] (* WakebyDistribution[1, 0.5, 1, 0.5, 0] *) ``` Generate random samples: ```wolfram RandomVariate[WakebyDistribution[1, 0.5, 1, 0.5, 0], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WakebyDistribution.html) for more details. # WalleniusHypergeometricDistribution `WalleniusHypergeometricDistribution[n, nsucc, ntot, w]` represents a Wallenius noncentral hypergeometric distribution. Examples [#examples] ```wolfram dist = WalleniusHypergeometricDistribution[10, 30, 100, 2] ``` ```wolfram Mean[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WalleniusHypergeometricDistribution.html) for more details. # WaringYuleDistribution `WaringYuleDistribution[α]` represents the Yule distribution with shape parameter α. * `WaringYuleDistribution[α, β]` represents the Waring distribution with shape parameters α and β. Examples [#examples] ```wolfram Mean[WaringYuleDistribution[3]] ``` ```wolfram RandomVariate[WaringYuleDistribution[2, 5], 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WaringYuleDistribution.html) for more details. # WatsonUSquareTest `WatsonUSquareTest[data]` tests whether data is normally distributed using the Watson U² test. `WatsonUSquareTest[data,dist]` tests whether data is distributed according to dist using the Watson U² test. `WatsonUSquareTest[data,dist,"property"]` returns the value of "property". Examples [#examples] Test if data follows a uniform distribution: ```wolfram WatsonUSquareTest[{0.1, 0.3, 0.5, 0.7, 0.9}, UniformDistribution[]] ``` Get the p-value: ```wolfram WatsonUSquareTest[RandomReal[1, 100], UniformDistribution[], "PValue"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WatsonUSquareTest.html) for more details. # WeakStationarity `WeakStationarity[proc]` gives conditions for the process proc to be weakly stationary. Examples [#examples] ```wolfram WeakStationarity[ARProcess[{a}, 1]] ``` ```wolfram WeakStationarity[ARMAProcess[{0.5}, {0.3}, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeakStationarity.html) for more details. # WeibullDistribution `WeibullDistribution[α,β]` represents a Weibull distribution with shape parameter α and scale parameter β. `WeibullDistribution[α,β,μ]` represents a Weibull distribution with shape parameter α, scale parameter β, and location parameter μ. Examples [#examples] ```wolfram PDF[WeibullDistribution[2, 1], x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WeibullDistribution.html) for more details. # WienerProcess `WienerProcess[μ, σ]` represents a Wiener process with a drift μ and volatility σ. * `WienerProcess[]` represents a standard Wiener process with drift 0 and volatility 1. Examples [#examples] ```wolfram proc = WienerProcess[] ``` ```wolfram RandomFunction[WienerProcess[], {0, 1, 0.01}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WienerProcess.html) for more details. # WignerSemicircleDistribution `WignerSemicircleDistribution[r]` represents a Wigner semicircle distribution with radius r centered at the origin. * `WignerSemicircleDistribution[a, r]` represents a Wigner semicircle distribution with radius r centered at a. Examples [#examples] ```wolfram dist = WignerSemicircleDistribution[2] ``` ```wolfram Plot[PDF[dist, x], {x, -3, 3}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WignerSemicircleDistribution.html) for more details. # WilksWTest `WilksWTest[m1, m2]` tests whether the matrices m1 and m2 are independent. `WilksWTest[..., "property"]` returns the value of "property". Examples [#examples] Test independence of two matrices: ```wolfram WilksWTest[{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WilksWTest.html) for more details. # WinsorizedMean `WinsorizedMean[list, f]` gives the mean of the elements in list after replacing the fraction f of the smallest and largest elements by the remaining extreme values. * `WinsorizedMean[list, {f1, f2}]` gives the mean when the fraction f1 of the smallest elements and the fraction f2 of the largest elements are replaced. * `WinsorizedMean[list]` gives the 5% winsorized mean WinsorizedMean\[list, 0.05]. * `WinsorizedMean[dist, ...]` gives the winsorized mean of a univariate distribution dist. Examples [#examples] ```wolfram WinsorizedMean[{1, 2, 3, 4, 100}, 0.2] ``` ```wolfram WinsorizedMean[{1, 2, 3, 4, 5, 6, 7, 8, 9, 100}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WinsorizedMean.html) for more details. # WishartMatrixDistribution `WishartMatrixDistribution[ν, Σ]` represents a Wishart matrix distribution with ν degrees of freedom and covariance matrix Σ. Examples [#examples] ```wolfram dist = WishartMatrixDistribution[5, IdentityMatrix[3]] ``` ```wolfram RandomVariate[dist] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WishartMatrixDistribution.html) for more details. # YuleDissimilarity `YuleDissimilarity[u, v]` gives the Yule dissimilarity between Boolean vectors u and v. Examples [#examples] ```wolfram YuleDissimilarity[{1, 0, 1, 1}, {1, 1, 0, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/YuleDissimilarity.html) for more details. # ZipfDistribution `ZipfDistribution[ρ]` represents a zeta distribution with parameter ρ. `ZipfDistribution[n, ρ]` represents a Zipf distribution with range n. Examples [#examples] Sample from Zipf distribution: ```wolfram RandomVariate[ZipfDistribution[2], 10] (* {1, 1, 2, 1, 1, 3, 1, 1, 1, 2} *) ``` Probability mass function: ```wolfram PDF[ZipfDistribution[100, 1], k] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ZipfDistribution.html) for more details. # Audio `Audio[file]` represents audio stored in the given file. `Audio[url]` represents audio stored in the given URL. `Audio[data]` represents audio with samples given by the array data. `Audio[data, format, opts]` represents audio stored as format, where format: * `"SignedInteger8"` - `data` must be an array of signed 8 bit values * `"SignedInteger16"` - `data` must be an array of signed 16 bit values * `"Real32"` - `data` is a floating point array from -1.0 to 1.0 `Audio[SoundNote[...]]` samples `SoundNote` into an audio `Audio[Video[...]]` extracts audio track from video object Any improted audio files are represented as `Audio`. Options [#options] SampleRate [#samplerate] Sets the sample rate of `Audio` object. Examples [#examples] Create audio from a sine wave: ```wolfram Audio[Table[Sin[440 * 2 Pi * t], {t, 0, 1, 1/44100}]] ``` Methods [#methods] See all `Audio*` symbols in this reference section. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Audio.html) for more details. Updates and streaming [#updates-and-streaming] As many WLJS primitives `Audio` supports real-time streaming of data using [Offload](./../Interpreter/Offload) expression: ```wolfram buffer = {}; Audio[buffer//Offload, "Real32"] ``` The following formats are supported for streaming: * \`"Real32", mono * \`"SignedInteger16", mono with `SampleRate` option: * 8000 * 16000 * 44100 To push a new chunk of data to the buffer - simply assign an array: ```wolfram buffer = Table[Exp[-x/100.0]Sin[x/1.5], {x,0,100Pi, 0.1}]; ``` We recommend to use typed arrays such as `NumericArray` for the best performance You can assign an event handler to detect, when the buffer is about to be finished to push a new chunk of data: ```wolfram buffer = {}; samplingFunction = Function[t, Exp[-Mod[t,3]/1.0]Sin[200.0 t]]; time = 0; EventHandler[Audio[buffer//Offload, "Real32", SampleRate->8000], {"More" -> Function[Null, With[{c = (1.0/8000.0) (2Pi)}, With[{sampled = Table[samplingFunction[c (i + time)], {i, 0, 4 1024 - 1}]}, buffer = NumericArray[sampled, "Real32"]; ]; time += 4 1024; ]; ]}] ``` # AudioAmplify `AudioAmplify[audio, s]` multiplies all samples of audio by a factor s. `AudioAmplify[video, s]` amplifies the first audio track in video. Examples [#examples] Double the volume of audio: ```wolfram AudioAmplify[Audio[...], 2] (* Audio[...] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioAmplify.html) for more details. # AudioBlockMap `AudioBlockMap[f, audio, dur]` applies f to non-overlapping partitions of length dur in audio. `AudioBlockMap[f, audio, {dur, offset}]` applies f to partitions with offset offset in audio. `AudioBlockMap[f, audio, {dur, offset, wfun}]` applies f after applying wfun to partitions in audio. Examples [#examples] Apply function to audio blocks: ```wolfram AudioBlockMap[Mean, audio, Quantity[0.1, "Seconds"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioBlockMap.html) for more details. # AudioChannelCombine `AudioChannelCombine[{audio1, audio2, ...}]` creates a multichannel audio object by combining the sequence of channels in audioi. Examples [#examples] Combine mono audio into stereo: ```wolfram mono = ExampleData[{"Audio", "Bird"}]; stereo = AudioChannelCombine[{mono, AudioDelay[mono, Quantity[0.05, "Seconds"]]}]; ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioChannelCombine.html) for more details. # AudioChannelMix `AudioChannelMix[audio]` mixes channels of audio by averaging and returns a center-panned stereo audio object. `AudioChannelMix[audio, desttype]` mixes audio channels into the specified desttype. `AudioChannelMix[video, ...]` mixes audio channels of video. Examples [#examples] Mix multichannel audio to mono: ```wolfram audio = ExampleData[{"Audio", "Apollo11"}]; AudioChannelMix[audio, "Mono"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioChannelMix.html) for more details. # AudioChannelSeparate `AudioChannelSeparate[audio]` gives a list of Audio objects, each of which represents one channel of audio. `AudioChannelSeparate[audio, channel]` returns the specified channel from audio. Examples [#examples] ```wolfram audio = ExampleData[{"Audio", "Apollo11"}]; AudioChannelSeparate[audio] ``` ```wolfram AudioChannelSeparate[audio, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioChannelSeparate.html) for more details. # AudioChannels `AudioChannels[audio]` returns the number of channels in the Audio object audio. `AudioChannels[video]` returns the number of channels of the first audio track of video. Examples [#examples] Get the number of audio channels: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioChannels[audio] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioChannels.html) for more details. # AudioData `AudioData[audio]` gives an array of audio samples. `AudioData[audio, "type"]` gives an array of audio samples converted to the specified "type". Examples [#examples] Get audio samples as a list: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; data = AudioData[audio]; Length[data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioData.html) for more details. # AudioDelay `AudioDelay[audio, delay]` creates audio by adding repeated decaying echos to audio spaced by the specified delay. `AudioDelay[audio, delay, feedback]` uses the specified feedback as the amount of signal to preserve during each repetition. `AudioDelay[audio, delay, feedback, mix]` uses mix to control the ratio between original and delayed audio. Examples [#examples] Add an echo effect: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioDelay[audio, Quantity[0.3, "Seconds"], 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioDelay.html) for more details. # AudioDelete `AudioDelete[audio, t]` deletes the first t seconds of audio. `AudioDelete[audio, -t]` deletes the last t seconds of audio. `AudioDelete[audio, {t1, t2}]` deletes from time t1 to time t2, returning the remaining audio as a single Audio object. Examples [#examples] Delete the first 2 seconds: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioDelete[audio, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioDelete.html) for more details. # AudioFade `AudioFade[audio]` returns audio in which the beginning and end of audio are faded. `AudioFade[audio, t]` fades the first and last t seconds of audio. `AudioFade[audio, {t1, t2}]` fades t1 seconds at the beginning and t2 seconds at the end. Examples [#examples] Apply fade effect: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioFade[audio, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioFade.html) for more details. # AudioFrequencyShift `AudioFrequencyShift[audio, freq]` gives audio by shifting the spectrum of audio by freq. `AudioFrequencyShift[audio, freq, mix]` uses mix to control the ratio between the original and shifted audio. Examples [#examples] Shift audio frequency: ```wolfram audio = AudioGenerator["Sin", 1]; AudioFrequencyShift[audio, 100] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioFrequencyShift.html) for more details. # AudioGenerator `AudioGenerator[model]` generates one second of audio of a given model. `AudioGenerator[model,t]` generates t seconds of audio. `AudioGenerator[model,t,"type"]` generates audio samples of the specified "type". Examples [#examples] Generate a sine wave: ```wolfram AudioGenerator["Sin", 2] ``` Generate white noise: ```wolfram AudioGenerator["WhiteNoise", 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioGenerator.html) for more details. # AudioInsert `AudioInsert[audio, t -> new]` inserts the audio signal new at time t. `AudioInsert[audio, {t1, t2, ...} -> new]` inserts the same audio at multiple positions. `AudioInsert[audio, {t1 -> new1, ...}]` inserts multiple audio signals at different positions. Examples [#examples] Insert audio at a specific time: ```wolfram audio = AudioGenerator["Sin", 2]; insert = AudioGenerator["WhiteNoise", 0.5]; AudioInsert[audio, 1 -> insert] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioInsert.html) for more details. # AudioIntervals `AudioIntervals[audio]` returns audible intervals of audio. `AudioIntervals[audio, crit]` returns intervals of audio for which the criterion crit is satisfied. `AudioIntervals[audio, crit, mindur]` returns only intervals larger than the given duration mindur. Examples [#examples] Find audible intervals: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioIntervals[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioIntervals.html) for more details. # AudioJoin `AudioJoin[audio1, audio2, ...]` or `AudioJoin[{audio1, audio2, ...}]` concatenates all audioi and returns an audio object. `AudioJoin[{audio1, t1}, {audio2, t2}, ...]` inserts ti seconds of silence after each audioi. Examples [#examples] Concatenate audio files: ```wolfram a1 = AudioGenerator["Sin", 1]; a2 = AudioGenerator["WhiteNoise", 1]; AudioJoin[a1, a2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioJoin.html) for more details. # AudioLength `AudioLength[audio]` returns the number of samples in the Audio object audio. Examples [#examples] Get the number of samples: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioLength[audio] (* 132300 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioLength.html) for more details. # AudioLocalMeasurements `AudioLocalMeasurements[audio, "prop"]` computes the property "prop" locally for partitions of audio. `AudioLocalMeasurements[audio, {prop1, prop2, ...}]` computes several properties. `AudioLocalMeasurements[audio, "prop", format]` returns the measurements in the specified output format. Examples [#examples] Compute local RMS amplitude: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioLocalMeasurements[audio, "RMSAmplitude"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioLocalMeasurements.html) for more details. # AudioLoudness `AudioLoudness[audio]` computes the loudness of audio according to the EBU momentary definition. `AudioLoudness[audio, def]` computes the loudness according to the definition def. `AudioLoudness[video, ...]` computes the loudness of the first audio track in video. Examples [#examples] Measure audio loudness: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioLoudness[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioLoudness.html) for more details. # AudioMeasurements `AudioMeasurements[audio,"prop"]` computes the property "prop" for the entire audio. `AudioMeasurements[audio,{prop1,prop2,…}]` computes several properties "propi". `AudioMeasurements[audio,"prop",format]` returns the values in the specified output format. `AudioMeasurements[{audio1,audio2,…},…]` returns measurements for all audioi. `AudioMeasurements[video,…]` returns measurements for the first audio track in video. Examples [#examples] Get the duration of an audio: ```wolfram AudioMeasurements[ExampleData[{"Audio", "Violin"}], "Duration"] (* Quantity[...] *) ``` Get multiple properties: ```wolfram AudioMeasurements[ExampleData[{"Audio", "Violin"}], {"Duration", "RMSAmplitude"}] (* <|"Duration" -> ..., "RMSAmplitude" -> ...|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioMeasurements.html) for more details. # AudioNormalize `AudioNormalize[audio]` normalizes audio so that the maximum absolute value of its samples is 1. `AudioNormalize[audio, model]` normalizes the audio signal based on the specified model. `AudioNormalize[video]` normalizes the first audio track in video. Examples [#examples] Normalize audio volume: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioNormalize[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioNormalize.html) for more details. # AudioPad `AudioPad[audio,t]` adds t seconds of silence to the end of audio. `AudioPad[audio,{t1,t2}]` adds t1 seconds of silence to the beginning and t2 seconds to the end of audio. `AudioPad[audio,tspec,padding]` pads using the value or method specified by padding. Examples [#examples] ```wolfram AudioPad[ExampleData[{"Audio", "Violin"}], 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioPad.html) for more details. # AudioPan `AudioPan[audio]` returns a center-panned stereo audio object from a mono audio. `AudioPan[audio, pan]` returns a stereo audio object after panning left and right channels using the specified pan. `AudioPan[video, ...]` pans the first audio track in video. Examples [#examples] Pan audio to the left: ```wolfram audio = AudioGenerator["Sin", 1]; AudioPan[audio, -0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioPan.html) for more details. # AudioPartition `AudioPartition[audio, dur]` partitions an audio object into non-overlapping segments of duration dur. `AudioPartition[audio, dur, offset]` generates segments with specified offset. Examples [#examples] Partition audio into 1-second segments: ```wolfram AudioPartition[audio, Quantity[1, "Seconds"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioPartition.html) for more details. # AudioPitchShift `AudioPitchShift[audio, r]` applies pitch shifting to audio by the ratio r, shifting every frequency f to r\*f. `AudioPitchShift[video, r]` applies pitch shifting to the first audio track in video. Examples [#examples] Shift pitch up by an octave: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioPitchShift[audio, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioPitchShift.html) for more details. # AudioPlot `AudioPlot[audio]` plots the waveform of audio. `AudioPlot[{audio1, audio2, ...}]` plots waveforms of all audioi. `AudioPlot[video]` plots the waveform of the first audio track in video. Examples [#examples] Plot audio waveform: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioPlot[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioPlot.html) for more details. # AudioQ `AudioQ[audio]` yields True if audio has the form of a valid Audio object, and False otherwise. Examples [#examples] Test for valid audio: ```wolfram AudioQ[ExampleData[{"Audio", "Bird"}]] (* True *) ``` ```wolfram AudioQ["not audio"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioQ.html) for more details. # AudioReplace `AudioReplace[audio,{t1,t2}->new]` replaces the audio signal between t1 and t2 with the new signal new. `AudioReplace[audio,{{t11,t12},…}->new]` replaces multiple intervals with the same audio new. `AudioReplace[audio,{{t11,t12}->new1,…}]` replaces multiple intervals. `AudioReplace[audio,{t1,t2}->new,fitting]` uses the specified fitting method. Examples [#examples] ```wolfram AudioReplace[audio, {1, 2} -> newAudio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioReplace.html) for more details. # AudioResample `AudioResample[audio, sr]` resamples audio to have the sample rate of sr. `AudioResample[video, sr]` resamples the first audio track in video to have the sample rate of sr. Examples [#examples] Resample audio to 22050 Hz: ```wolfram audio = ExampleData[{"Audio", "Flute"}]; AudioResample[audio, 22050] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioResample.html) for more details. # AudioReverb `AudioReverb[audio]` adds reverberation to audio. `AudioReverb[audio, model]` adds reverberation following the room model. `AudioReverb[audio, model, mix]` controls the mix ratio between original and reverberated audio. Examples [#examples] Add reverb effect: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioReverb[audio, "LargeHall"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioReverb.html) for more details. # AudioReverse `AudioReverse[audio]` reverses audio so that the signal is played backward. `AudioReverse[video]` reverses the first audio track in video. Examples [#examples] Reverse audio playback: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioReverse[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioReverse.html) for more details. # AudioSampleRate `AudioSampleRate[audio]` returns the sample rate of the Audio object audio. `AudioSampleRate[video]` returns the sample rate of the first audio track of video. Examples [#examples] Get sample rate: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioSampleRate[audio] (* 44100 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioSampleRate.html) for more details. # AudioSpectralMap `AudioSpectralMap[f,audio]` transforms audio by applying the function f to its short-time Fourier transform. `AudioSpectralMap[f,{audio1,…}]` applies the function f to the list of short-time Fourier transforms of all audioi. `AudioSpectralMap[f,video]` transforms the first audio track in video. Examples [#examples] Apply a spectral transformation to audio: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioSpectralMap[Abs, audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioSpectralMap.html) for more details. # AudioSpectralTransformation `AudioSpectralTransformation[f, audio]` returns a modified version of audio by applying a time-frequency transformation f to its short-time Fourier transform. `AudioSpectralTransformation[f, video]` transforms the first audio track in video. Examples [#examples] Apply spectral transformation: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioSpectralTransformation[# &, audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioSpectralTransformation.html) for more details. # AudioSplit `AudioSplit[audio, t]` splits audio at time t. `AudioSplit[audio, {t1, t2, ...}]` splits audio at times ti. Examples [#examples] Split audio at 2 seconds: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioSplit[audio, 2] (* {Audio[...], Audio[...]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioSplit.html) for more details. # AudioTimeStretch `AudioTimeStretch[audio,r]` applies time stretching to audio by the specified factor r. `AudioTimeStretch[video,r]` applies time stretching to the first audio track in video. Examples [#examples] Stretch audio to twice its duration: ```wolfram AudioTimeStretch[audio, 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioTimeStretch.html) for more details. # AudioTrackApply `AudioTrackApply[f, video]` applies the function f to the first audio track of the Video object video. Examples [#examples] Apply a function to video's audio track: ```wolfram video = Video["example.mp4"]; AudioTrackApply[AudioReverse, video] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioTrackApply.html) for more details. # AudioTrim `AudioTrim[audio]` trims silence from the beginning and end of audio. `AudioTrim[audio, t]` returns the first t seconds of audio. `AudioTrim[audio, -t]` returns the last t seconds of audio. `AudioTrim[audio, {t1, t2}]` returns audio starting at time t1 and ending at time t2. Examples [#examples] Trim audio to a specific interval: ```wolfram audio = ExampleData[{"Audio", "Bird"}]; AudioTrim[audio, {1, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AudioTrim.html) for more details. # Cepstrogram `Cepstrogram[data]` plots the array of power cepstra computed on each partition of data. `Cepstrogram[data, n]` uses partitions of length n. `Cepstrogram[data, n, d]` uses partitions with offset d. `Cepstrogram[data, n, d, wfun]` applies a smoothing window wfun to each partition. `Cepstrogram[data, n, d, wfun, m]` pads partitions with zeros to length m prior to the computation of the transform. Examples [#examples] Plot a cepstrogram of audio data: ```wolfram Cepstrogram[audio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Cepstrogram.html) for more details. # CepstrogramArray `CepstrogramArray[data]` computes an array of cepstra on data. `CepstrogramArray[data, n]` uses partitions of length n. `CepstrogramArray[data, n, d]` uses partitions with offset d. `CepstrogramArray[data, n, d, wfun]` applies a smoothing window wfun to each partition. `CepstrogramArray[data, n, d, wfun, m]` pads partitions with zeros to length m prior to the computation of the transform. Examples [#examples] Compute cepstrogram of audio: ```wolfram audio = ExampleData[{"Audio", "Violin"}]; CepstrogramArray[audio] ``` With specific partition size: ```wolfram CepstrogramArray[audio, 1024, 512] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CepstrogramArray.html) for more details. # Duration `Duration[expr]` returns the duration of expr. `Duration[expr, unit]` returns the result in the specified unit. Examples [#examples] Get the duration of an audio object: ```wolfram audio = ExampleData[{"Audio", "Apollo11SmallStep"}]; Duration[audio] (* 5.4 seconds *) ``` Get duration in a specific unit: ```wolfram Duration[audio, "Milliseconds"] (* 5400. *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Duration.html) for more details. # EmitSound ```wolfram EmitSound[_Audio | _Sound, opts___] ``` emits (without output or any widgets) a [Sound](../Sound/Sound) or plays [Audio](../Sound/Audio) object. Options [#options] "Window" [#window] The same as in [FrontSubmit](../Frontend-IO/FrontSubmit). By the default is [CurrentWindow](../Frontend-IO/CurrentWindow) If you want to continuously stream raw sound data, consider to use a low-level streamer [PCMPlayer](../Sound/PCMPlayer) # ListPlay `ListPlay[{a1, a2, ...}]` creates an object that plays as a sound whose amplitude is given by the sequence of levels ai. Examples [#examples] Play a waveform: ```wolfram ListPlay[Table[Sin[2 Pi n/100], {n, 0, 8000}]] ``` Random noise: ```wolfram ListPlay[RandomReal[{-1, 1}, 44100]] ``` Imported audio samples: ```wolfram ListPlay[AudioData[ExampleData[{"Audio", "Bird"}]][[1]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ListPlay.html) for more details. # PCMPlayer ```wolfram PCMPlayer[data_List | _Offload, type_String, opts___] ``` creates a static or dynamic sound emitter. The following data `type`s are supported * `"Real32"` * `"SignedInteger32"` * `"SignedInteger16"` * `"SignedInteger8"` where `data` is 1D list of numerical data or [Offload](../Interpreter/Offload) ed symbol with numerical data. Or also it can also play a regular `Audio` object ```wolfram PCMPlayer[a_Audio] ``` Options [#options] SampleRate [#samplerate] The default is `44100` "AutoPlay" [#autoplay] The default is `True` "Event" [#event] An `uid` of event to be fired, when a buffer is about to end. It can be used to feed new data to a player aka streaming. "TimeAhead" [#timeahead] The time is milliseconds, which is offset from the end of the sound buffer and used to fire `"Event"` "GUI" [#gui] By the default is `True`. If set to `False` it won't render anything to the DOM, which makes it great when placed inside `Epilog` or `Prolog` of some other object. Transitions and updates [#transitions-and-updates] Use `Offload` to feed on data argument to a player in realtime. Streaming [#streaming] The simples example with streaming will look like this ```wolfram music = Import[...]; (* extract R channel *) data = AudioData[music, "SignedInteger16"] // First; buffer = {}; index = 1; EventHandler["bufferEnds", {"More" -> Function[Null, index += 100000; If[index > Length[data], Print["End"]; Return[]]; buffer = data[[index ;; Min[index + 100000 - 1, Length[data]]]] ], "Stop" -> Function[Null, index = 1; ]}]; PCMPlayer[buffer // Offload, "SignedInteger16", "Event"->"bufferEnds"] ``` # PitchRecognize `PitchRecognize[audio]` recognizes the main pitch in audio, returning it as a TimeSeries object. * `PitchRecognize[audio, spec]` returns the main pitch processed according to the specified spec. * `PitchRecognize[video, ...]` recognizes the main pitch in the first audio track in video. Examples [#examples] Recognize pitch from audio: ```wolfram audio = ExampleData[{"Audio", "Apollo11SmallStep"}]; PitchRecognize[audio] ``` Get pitch as frequency values: ```wolfram PitchRecognize[audio, "Frequencies"] ``` Plot pitch over time: ```wolfram ListLinePlot[PitchRecognize[audio]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PitchRecognize.html) for more details. # Play `Play[f, {t, tmin, tmax}]` creates an object that plays as a sound whose amplitude is given by f as a function of time t in seconds between tmin and tmax. Examples [#examples] Play a sine wave: ```wolfram Play[Sin[440 * 2 Pi * t], {t, 0, 1}] ``` Frequency sweep: ```wolfram Play[Sin[2 Pi * t * (200 + 200 t)], {t, 0, 2}] ``` Amplitude modulation: ```wolfram Play[Sin[2 Pi * 440 * t] * Exp[-t], {t, 0, 2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Play.html) for more details. # SampledSoundList ```wolfram SampledSoundList[{buffer__Real}, sampleRate_Integer:8000] ``` represents a buffer for PCM-encoded sound wave, where sampled sound data is stored in `buffer` as a plain sequence of real numbers in the range from `0` to `1`. Methods [#methods] Sound [#sound] Plays or emits a sound stored in `SampledSoundList` ```wolfram Sound[ SampledSoundList[ Table[Sin[2 \[Pi] 50 t], {t, 0, 1, 1./2000}], 8000 ] ] ``` # Sound ```wolfram Sound[primitives_] ``` represents sound as a concept composed from `primitives`. Draws a player widget once appears in the output form - [StandardForm](../Formatting/StandardForm) `primitives` can be a simple primitive or a `List` of primitives played sequentially Primitives [#primitives] SoundNote [#soundnote] SampledSoundList [#sampledsoundlist] Examples [#examples] Play chord composed from [SoundNote](../Sound/SoundNote) ```wolfram Sound[SoundNote[{"E", "G#", "B"}]] ``` Play D Major scale up and down doubled in up-octave ```wolfram major = {2,2,1,2,2,2}; SoundNote[{#, # + 12}] &/@ Accumulate[Join[{2}, major, -major]] // Sound ``` Emit sound without a widget [#emit-sound-without-a-widget] It is possible to play the sound programmatically without a widget using [FrontSubmit](../Frontend-IO/FrontSubmit) ```wolfram EventHandler[InputButton[], Function[Null, FrontSubmit[Sound[SoundNote[RandomInteger[{0, 12}]]]] ]] ``` or **use [EmitSound](../Sound/EmitSound)** If you want to continuously stream raw sound data, consider to use [PCMPlayer](../Sound/PCMPlayer) # SoundNote ```wolfram SoundNote[note_String, duration_:1] ``` represents a single note, where `note` can be `"C"`, `"C#"`, ... and etc. `duration` is given in seconds. To specify octave place a number as a first character, i.e. `"C4"` ```wolfram SoundNote[note_Integer, duration_:1] ``` represents a note, where `note` is a semitone integer, i.e. C4 is `0`, C#4 is `1` and etc. ```wolfram SoundNote[{notes__}, duration_:1] ``` represents a group (vertical in the timeline) of `notes`, which can be a chord for example E Major ```wolfram SoundNote[{"E", "G#", "B"}] ``` Methods [#methods] Sound [#sound] To play or emit sound wrap a list of `SoundNote` or a single one into [Sound](../Sound/Sound) ```wolfram SoundNote[{"E", "G#", "B"}] // Sound ``` # Speak `Speak[expr]` speaks a spoken representation of the expression expr. Examples [#examples] ```wolfram Speak["Hello, World!"] ``` ```wolfram Speak[2 + 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Speak.html) for more details. # SpeakerMatchQ `SpeakerMatchQ[audio,ref]` gives True if speaker features in audio match the one from reference ref and returns False otherwise. `SpeakerMatchQ[{audio1,audio2,…},ref]` gives a list of results for each of audioi. `SpeakerMatchQ[ref]` represents an operator form of SpeakerMatchQ that can be applied to an audio object. Examples [#examples] Check if audio matches a reference speaker: ```wolfram SpeakerMatchQ[audioSample, referenceAudio] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpeakerMatchQ.html) for more details. # Spectrogram `Spectrogram[list]` plots the spectrogram of list. * `Spectrogram[list, n]` uses partitions of length n. * `Spectrogram[list, n, d]` uses partitions with offset d. * `Spectrogram[list, n, d, wfun]` applies a smoothing window wfun to each partition. * `Spectrogram[list, n, d, wfun, m]` pads partitions with zeros to length m prior to the computation of the transform. * `Spectrogram[audio, ...]` plots the spectrogram of audio. * `Spectrogram[video]` plots the spectrogram of the first audio track in video. Examples [#examples] ```wolfram Spectrogram[Table[Sin[2 Pi t (1 + t/10)], {t, 0, 10, 0.001}]] ``` ```wolfram Spectrogram[ExampleData[{"Sound", "Bird"}]] ``` ```wolfram Spectrogram[data, 256, 128, HammingWindow] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Spectrogram.html) for more details. # SpectrogramArray `SpectrogramArray[list]` returns the spectrogram data of list. * `SpectrogramArray[list, n]` uses partitions of length n. * `SpectrogramArray[list, n, d]` uses partitions with offset d. * `SpectrogramArray[list, n, d, wfun]` applies a smoothing window wfun to each partition. * `SpectrogramArray[list, n, d, wfun, m]` pads partitions with zeros to length m prior to the computation of the transform. * `SpectrogramArray[audio, ...]` returns spectrogram data of audio. * `SpectrogramArray[video]` returns the spectrogram data of the first audio track in video. Examples [#examples] Get spectrogram data from a signal: ```wolfram data = Table[Sin[100 t] + Sin[200 t], {t, 0, 1, 0.001}]; SpectrogramArray[data] ``` With specified partition length: ```wolfram SpectrogramArray[data, 128] ``` Apply a Hamming window: ```wolfram SpectrogramArray[data, 256, 64, HammingWindow] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpectrogramArray.html) for more details. # SpeechCases `SpeechCases[audio, form]` gives a list of cases of text identified as being of type form that appear in the transcription of audio. * `SpeechCases[audio, {form1, form2, ...}]` gives an association of results for all the types. * `SpeechCases[audio, formspec -> prop]` gives the specified property for each result found. * `SpeechCases[audio, formspec -> {prop1, prop2, ...}]` gives a list of properties for each result found. * `SpeechCases[audio, spec, n]` gives the first n cases found. Examples [#examples] Find numbers mentioned in speech: ```wolfram SpeechCases[audio, "Number"] ``` Find dates and times: ```wolfram SpeechCases[audio, {"Date", "Time"}] ``` Get positions of entities in transcription: ```wolfram SpeechCases[audio, "Person" -> "Position"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpeechCases.html) for more details. # SpeechInterpreter `SpeechInterpreter[form]` represents an interpreter object that can be applied to a speech input to try to interpret it as an object of the specified form. * `SpeechInterpreter[form, test]` returns the interpreted object only if applying test to it yields True; otherwise, it returns a Failure object. * `SpeechInterpreter[form, test, fail]` returns the result of applying the function fail if the test fails. Examples [#examples] Interpret speech as a number: ```wolfram interp = SpeechInterpreter["Number"]; interp[audio] ``` With validation: ```wolfram SpeechInterpreter["Integer", Positive] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpeechInterpreter.html) for more details. # SpeechSynthesize `SpeechSynthesize[expr]` synthesizes the contents of expr as an Audio object. * `SpeechSynthesize[expr, voice]` uses the specified voice to synthesize the speech signal. This function converts text to speech using text-to-speech synthesis. Examples [#examples] ```wolfram SpeechSynthesize["Hello, world!"] ``` ```wolfram SpeechSynthesize["The answer is forty-two.", "Male"] ``` ```wolfram audio = SpeechSynthesize["Welcome to Wolfram Language"]; audio ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpeechSynthesize.html) for more details. # OverlayVideo `OverlayVideo[background, o]` gives the result of overlaying o onto a background video or image background. * `OverlayVideo[background, {o1, o2, ...}]` gives the result of overlaying o1, o2, .... * `OverlayVideo[background, {interval1 -> o1, ...}]` overlays each oi during the time interval intervali. Examples [#examples] Overlay an image on a video: ```wolfram OverlayVideo[video, logo] ``` Overlay during a specific time interval: ```wolfram OverlayVideo[video, {{Quantity[2, "Seconds"], Quantity[5, "Seconds"]} -> watermark}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OverlayVideo.html) for more details. # SnippetsVideo `SnippetsVideo[video, n]` returns a summary video based on *n* snippets from *video*. * `SnippetsVideo[video, timespec]` returns a summary video based on snippets taken at times specified by *timespec*. Examples [#examples] ```wolfram SnippetsVideo[Video["example.mp4"], 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SnippetsVideo.html) for more details. # Video Limited support ```wolfram Video[file_String] _Video ``` represents a video object in Kernel. Example ```wolfram Video["ExampleData/Caminandes.mp4"] ``` Supported output forms [#supported-output-forms] * [StandardForm](../Formatting/StandardForm) * [WLXForm](../Formatting/WLXForm) # VideoCombine `VideoCombine[{obj1, obj2, ...}]` creates a multi-track video by combining all audio, video and subtitle tracks in all *obji*. Examples [#examples] ```wolfram VideoCombine[{Video["video.mp4"], Audio["audio.wav"]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoCombine.html) for more details. # VideoDelete `VideoDelete[video, t]` deletes the first t seconds of video. * `VideoDelete[video, -t]` deletes the last t seconds of video. * `VideoDelete[video, {t1, t2}]` deletes from time t1 to time t2, returning the remaining video as a single `Video` object. * `VideoDelete[video, {{t11, t12}, …}]` deletes multiple time intervals. Examples [#examples] ```wolfram VideoDelete[video, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoDelete.html) for more details. # VideoExtractFrames `VideoExtractFrames[video,t]` extracts a frame at time t from video. `VideoExtractFrames[video,tspec]` extracts video frames at time specification tspec. Examples [#examples] Extract a frame at 5 seconds: ```wolfram VideoExtractFrames[video, Quantity[5, "Seconds"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoExtractFrames.html) for more details. # VideoExtractTracks `VideoExtractTracks[video]` returns a list of video, audio and subtitle tracks of video. * `VideoExtractTracks[video, "type"]` returns tracks from video of a given "type". * `VideoExtractTracks[video, trackspec]` returns tracks specified by trackspec. This function extracts individual media tracks from a video file. Examples [#examples] ```wolfram VideoExtractTracks[Video["ExampleData/Caminandes.mp4"]] ``` ```wolfram VideoExtractTracks[Video["ExampleData/Caminandes.mp4"], "Audio"] ``` ```wolfram VideoExtractTracks[Video["ExampleData/Caminandes.mp4"], "Video"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoExtractTracks.html) for more details. # VideoFrameFold `VideoFrameFold[f, img0, video]` gives a video whose frames are \{f\[img0, img1], f\[f\[img0, img1], img2], …}, where imgi are frames of video. * `VideoFrameFold[f, video]` assumes the first frame to be the initial frame. * `VideoFrameFold[f, img0, video, n]` uses partitions of n frames of the video for each step. * `VideoFrameFold[f, img0, video, n, d]` uses partitions of n frames with offset of d frames for each step. Examples [#examples] ```wolfram VideoFrameFold[ImageAdd, video] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoFrameFold.html) for more details. # VideoFrameList `VideoFrameList[video, n]` gives a list of n images extracted from video. * `VideoFrameList[video, spec]` gives a list of frames extracted based on spec. This function extracts frames from a video at specified intervals or positions. Examples [#examples] ```wolfram VideoFrameList[Video["ExampleData/Caminandes.mp4"], 5] ``` ```wolfram VideoFrameList[Video["ExampleData/Caminandes.mp4"], {0, 1, 2}] ``` ```wolfram VideoFrameList[Video["ExampleData/Caminandes.mp4"], 10] // Length ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoFrameList.html) for more details. # VideoFrameMap `VideoFrameMap[f, video]` applies f to each frame of the `Video` object video, returning a new `Video` object. * `VideoFrameMap[f, video, n]` applies f to overlapping partitions of n video frames. * `VideoFrameMap[f, video, n, d]` applies f to partitions with offset d. * `VideoFrameMap[f, {video1, video2, …}, …]` applies f to a list of inputs extracted from each videoi. Examples [#examples] ```wolfram VideoFrameMap[ImageAdjust, video] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoFrameMap.html) for more details. # VideoGenerator `VideoGenerator[imagespec]` generates a video with frames generated from imagespec. * `VideoGenerator[<|"Image" -> imagespec, "Audio" -> audiospec|>]` returns a video with audio data generated from audioexpr. * `VideoGenerator[..., dur]` generates a video of duration dur. Examples [#examples] ```wolfram VideoGenerator[RandomImage[], 5] ``` ```wolfram VideoGenerator[Table[Graphics[{Hue[t], Disk[]}], {t, 0, 1, 0.1}], 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoGenerator.html) for more details. # VideoInsert `VideoInsert[video, t -> new]` inserts the video new at time t. * `VideoInsert[video, {t1, t2, ...} -> new]` inserts the same video at multiple positions. * `VideoInsert[video, {t1 -> new1, ...}]` inserts multiple videos at different positions. Examples [#examples] Insert at time t: ```wolfram VideoInsert[video1, Quantity[5, "Seconds"] -> video2] ``` Multiple insertions: ```wolfram VideoInsert[mainVideo, { Quantity[2, "Seconds"] -> clip1, Quantity[8, "Seconds"] -> clip2 }] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoInsert.html) for more details. # VideoIntervals `VideoIntervals[video, crit]` returns time intervals of video for which the criterion crit is satisfied. * `VideoIntervals[video, crit, n]` evaluates criterion crit on partitions of n video frames. * `VideoIntervals[video, crit, n, d]` evaluates crit on partitions with offset d. * `VideoIntervals[{video1, video2, ...}, crit, ...]` applies crit to a list of inputs extracted from each videoi. Examples [#examples] ```wolfram VideoIntervals[video, ImageQ] ``` ```wolfram VideoIntervals[video, Mean[#] > 0.5 &, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoIntervals.html) for more details. # VideoJoin `VideoJoin[video1, video2, ...]` concatenates all videoi and returns a video object. Examples [#examples] Concatenate two videos: ```wolfram VideoJoin[video1, video2] ``` Join multiple video clips: ```wolfram VideoJoin[clip1, clip2, clip3, clip4] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoJoin.html) for more details. # VideoMap `VideoMap[f, video]` applies f to partial video and audio data corresponding to one frame of video, returning a new video. * `VideoMap[f, video, n]` applies f to data corresponding to overlapping partitions of n video frames. * `VideoMap[f, video, n, d]` applies f to partitions with offset d. * `VideoMap[f, {video1, video2, ...}, ...]` applies f to a list of inputs extracted from each videoi. Examples [#examples] ```wolfram VideoMap[ImageAdjust, video] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoMap.html) for more details. # VideoMapList `VideoMapList[f, video]` applies f to a chunk of data corresponding to one frame from the Video object video, returning a list of results. * `VideoMapList[f, video, n]` applies f to overlapping partitions corresponding to n video frames. * `VideoMapList[f, video, n, d]` applies f to partitions with offset d. * `VideoMapList[f, {video1, video2, ...}, ...]` applies f to a list of inputs extracted from each videoi. Examples [#examples] Extract brightness from each frame: ```wolfram VideoMapList[ImageMeasurements[#, "MeanIntensity"] &, Video["ExampleData/sampleVideo.mp4"]] ``` Process multiple frames at once: ```wolfram VideoMapList[Total, video, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoMapList.html) for more details. # VideoMapTimeSeries `VideoMapTimeSeries[f, video]` applies f to each frame of the Video object video, returning a time series. * `VideoMapTimeSeries[f, video, n]` applies f to overlapping partitions of n video frames. * `VideoMapTimeSeries[f, video, n, d]` applies f to partitions with offset d. * `VideoMapTimeSeries[f, {video1, video2, ...}, ...]` applies f to a list of inputs extracted from each videoi. Examples [#examples] Extract brightness over time: ```wolfram VideoMapTimeSeries[ImageMeasurements[#, "MeanIntensity"] &, video] ``` Process multiple frames at once: ```wolfram VideoMapTimeSeries[Mean, video, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoMapTimeSeries.html) for more details. # VideoQ `VideoQ[video]` yields `True` if video has the form of a valid `Video` object, and `False` otherwise. Examples [#examples] ```wolfram VideoQ[Video["test.mp4"]] ``` ```wolfram VideoQ["not a video"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoQ.html) for more details. # VideoReplace `VideoReplace[video, {t1, t2} -> new]` replaces the video between t1 and t2 with the new video new. * `VideoReplace[video, {{t11, t12}, ...} -> new]` replaces multiple intervals with the same video new. * `VideoReplace[video, {{t11, t12} -> new1, ...}]` replaces multiple intervals. * `VideoReplace[video, ..., durfitting]` uses the specified durfitting method to replace an interval of a different duration. Examples [#examples] Replace a section of video: ```wolfram VideoReplace[video, {Quantity[2, "Seconds"], Quantity[5, "Seconds"]} -> newClip] ``` Replace multiple intervals: ```wolfram VideoReplace[video, {{Quantity[1, "Seconds"], Quantity[2, "Seconds"]} -> clip1, {Quantity[5, "Seconds"], Quantity[7, "Seconds"]} -> clip2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoReplace.html) for more details. # VideoSplit `VideoSplit[video, t]` splits video at time t. * `VideoSplit[video, {t1, t2, ...}]` splits video at times ti. Examples [#examples] Split a video at 5 seconds: ```wolfram VideoSplit[Video["ExampleData/sampleVideo.mp4"], Quantity[5, "Seconds"]] ``` Split at multiple time points: ```wolfram VideoSplit[video, {Quantity[2, "Seconds"], Quantity[5, "Seconds"]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoSplit.html) for more details. # VideoTimeStretch `VideoTimeStretch[video,spec]` applies time stretching to video using the specified spec. Examples [#examples] Slow down a video by 2x: ```wolfram VideoTimeStretch[video, 2] ``` Speed up a video: ```wolfram VideoTimeStretch[video, 0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoTimeStretch.html) for more details. # VideoTranscode `VideoTranscode[video, "format"]` converts video to the specified format. * `VideoTranscode[video, service]` converts video to the specification recommended by the specified service. * `VideoTranscode[{v1, v2, ...}, ...]` converts all vi videos to have conforming properties with respect to the given specification. Examples [#examples] ```wolfram VideoTranscode[Video["input.avi"], "MP4"] ``` ```wolfram VideoTranscode[Video["input.mov"], "YouTube"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoTranscode.html) for more details. # VideoTranscribe `VideoTranscribe[video]` recognizes speech in an audio track and adds it to video as a subtitle track. Examples [#examples] ```wolfram VideoTranscribe[Video["speech.mp4"]] ``` ```wolfram VideoTranscribe[video, Language -> "French"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoTranscribe.html) for more details. # VideoTrim `VideoTrim[video,t]` returns the first t seconds of video. `VideoTrim[video,-t]` returns the last t seconds of video. `VideoTrim[video,{t1,t2}]` returns video starting at time t1 and ending at time t2 of video. `VideoTrim[video,{{t11,t12},…}]` returns a list of video objects for all given intervals \{ti1,ti2}. Examples [#examples] Get the first 5 seconds of a video: ```wolfram VideoTrim[video, 5] ``` Extract a specific time range: ```wolfram VideoTrim[video, {10, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VideoTrim.html) for more details. # Alphabet `Alphabet[]` gives a list of the lowercase letters a through z in the English alphabet. `Alphabet[type]` gives the alphabet for the specified language or class. Examples [#examples] English alphabet: ```wolfram Alphabet[] (* {"a", "b", "c", ..., "z"} *) ``` Greek alphabet: ```wolfram Alphabet["Greek"] (* {"α", "β", "γ", ..., "ω"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Alphabet.html) for more details. # AlphabeticOrder `AlphabeticOrder["string1", "string2"]` gives 1 if "string1" appears before "string2" in alphabetical order, -1 if it is after, and 0 if it is identical. `AlphabeticOrder["string1", "string2", lang]` uses an ordering suitable for the language lang. `AlphabeticOrder[lang]` represents an operator form that compares strings when applied to "string1", "string2". Examples [#examples] Compare two strings: ```wolfram AlphabeticOrder["apple", "banana"] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlphabeticOrder.html) for more details. # AlphabeticSort `AlphabeticSort[list]` sorts the elements of list into alphabetical order. `AlphabeticSort[list, lang]` sorts using an ordering suitable for the language lang. Examples [#examples] Sort strings alphabetically: ```wolfram AlphabeticSort[{"banana", "apple", "cherry"}] (* {"apple", "banana", "cherry"} *) ``` Sort using German locale: ```wolfram AlphabeticSort[{"Äpfel", "Birne", "Apfel"}, "German"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AlphabeticSort.html) for more details. # Antonyms `Antonyms["word"]` returns the antonyms associated with the specified word. Examples [#examples] Find antonyms of a word: ```wolfram Antonyms["hot"] (* {"cold", "cool", ...} *) ``` Get antonyms for multiple words: ```wolfram Antonyms /@ {"big", "fast", "happy"} ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Antonyms.html) for more details. # BaseDecode `BaseDecode["string"]` decodes the Base64 data contained in a string and returns the result as a byte array. `BaseDecode["string", "encoding"]` decodes using the string using the specified encoding. Examples [#examples] Decode Base64: ```wolfram BaseDecode["SGVsbG8="] (* ByteArray[{72, 101, 108, 108, 111}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BaseDecode.html) for more details. # BaseEncode `BaseEncode[ba]` encodes the byte array ba as a Base64 string. `BaseEncode[ba, "encoding"]` encodes using the specified encoding. Examples [#examples] Encode to Base64: ```wolfram BaseEncode[ByteArray[{72, 101, 108, 108, 111}]] (* "SGVsbG8=" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BaseEncode.html) for more details. # Capitalize `Capitalize[string]` yields a string in which the first character has been made uppercase. `Capitalize[string, scheme]` gives a string capitalized using the specified capitalization scheme. Examples [#examples] Capitalize first letter: ```wolfram Capitalize["hello world"] (* "Hello world" *) ``` Title case: ```wolfram Capitalize["hello world", "TitleCase"] (* "Hello World" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Capitalize.html) for more details. # Character `Character` represents a single character in `Read`. Examples [#examples] Read a single character from a stream: ```wolfram stream = StringToStream["Hello"]; Read[stream, Character] (* "H" *) ``` Read multiple characters: ```wolfram stream = StringToStream["ABC"]; Table[Read[stream, Character], 3] (* {"A", "B", "C"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Character.html) for more details. # CharacterCounts `CharacterCounts["string"]` gives an association whose keys are the distinct characters in string, and whose values give the number of times those characters appear. `CharacterCounts["string", n]` gives counts of distinct n-grams consisting of runs of n characters. Examples [#examples] Count characters in a string: ```wolfram CharacterCounts["hello"] (* <|"h" -> 1, "e" -> 1, "l" -> 2, "o" -> 1|> *) ``` Count bigrams: ```wolfram CharacterCounts["banana", 2] (* <|"ba" -> 1, "an" -> 2, "na" -> 2|> *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CharacterCounts.html) for more details. # CharacterName `CharacterName["c"]` gives the name of the character c. `CharacterName[n]` gives the name of the character with character code n. `CharacterName[c, "type"]` gives a name of the specified type. Examples [#examples] Get the name of a character: ```wolfram CharacterName["A"] (* "LatinCapitalLetterA" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CharacterName.html) for more details. # CharacterNormalize `CharacterNormalize["text", form]` converts the characters in text to the specified normalization form. Examples [#examples] Normalize text to NFC form: ```wolfram CharacterNormalize["café", "NFC"] (* "café" *) ``` Normalize to decomposed form: ```wolfram CharacterNormalize["naïve", "NFD"] (* "naïve" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CharacterNormalize.html) for more details. # CharacterRange `CharacterRange["c1", "c2"]` yields a list of the characters in the range from c1 to c2. `CharacterRange[n1, n2]` yields a list of the characters with character codes in the range n1 to n2. Examples [#examples] Range of uppercase letters: ```wolfram CharacterRange["A", "Z"] (* {"A", "B", "C", ..., "Z"} *) ``` Range using character codes: ```wolfram CharacterRange[97, 102] (* {"a", "b", "c", "d", "e", "f"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/CharacterRange.html) for more details. # Characters `Characters["string"]` gives a list of the characters in a string. Examples [#examples] Split into characters: ```wolfram Characters["Hello"] (* {"H", "e", "l", "l", "o"} *) ``` Count characters: ```wolfram Length[Characters["example"]] (* 7 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Characters.html) for more details. # Compress `Compress[expr]` gives a compressed representation of expr as a string. Examples [#examples] Compress an expression: ```wolfram Compress[Range[1000]] (* "1:eJxTTMoPSmNkYG..." *) ``` Decompress back: ```wolfram Uncompress[Compress[{1, 2, 3}]] (* {1, 2, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Compress.html) for more details. # Decapitalize `Decapitalize[string]` yields a string in which the first character has been made lowercase. Examples [#examples] Lowercase the first character: ```wolfram Decapitalize["Hello World"] (* "hello World" *) ``` With all-caps input: ```wolfram Decapitalize["HELLO"] (* "hELLO" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Decapitalize.html) for more details. # DictionaryLookup `DictionaryLookup[patt]` finds all words in an English dictionary that match the string pattern patt. `DictionaryLookup[patt,n]` gives only the first n words found. `DictionaryLookup[{"lang",patt}]` finds words in the language specified by lang. Examples [#examples] Find words matching a pattern: ```wolfram DictionaryLookup["test*"] (* {"test", "testament", "testify", ...} *) ``` Find words in a specific language: ```wolfram DictionaryLookup[{"German", "Hund*"}] (* {"Hund", "Hunde", ...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DictionaryLookup.html) for more details. # DictionaryWordQ `DictionaryWordQ["word"]` tests whether "word" is a recognized dictionary word. Examples [#examples] Check if a word is in the dictionary: ```wolfram DictionaryWordQ["hello"] (* True *) ``` Check a non-word: ```wolfram DictionaryWordQ["asdfgh"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DictionaryWordQ.html) for more details. # DigitCharacter `DigitCharacter` represents a digit character 0–9 in StringExpression. Examples [#examples] Match all digits in a string: ```wolfram StringCases["abc123def456", DigitCharacter] (* {"1", "2", "3", "4", "5", "6"} *) ``` Match sequences of digits: ```wolfram StringCases["abc123def456", DigitCharacter ..] (* {"123", "456"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DigitCharacter.html) for more details. # DigitQ `DigitQ[string]` yields `True` if all characters in the string are digits 0-9, and `False` otherwise. Examples [#examples] Test digit strings: ```wolfram DigitQ["12345"] (* True *) ``` ```wolfram DigitQ["12.34"] (* False *) ``` ```wolfram DigitQ["abc"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DigitQ.html) for more details. # Encode `Encode["source", "dest"]` writes an encoded version of the file source to the file dest. `Encode["source", "dest", "key"]` produces an encoded file that must be read using `Get["dest", "key"]`. Examples [#examples] Encode a source file: ```wolfram Encode["mycode.m", "mycode.mx"] ``` Encode with password: ```wolfram Encode["secret.m", "secret.mx", "mypassword"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Encode.html) for more details. # EndOfLine `EndOfLine` represents the end of a line in a string for purposes of matching in `StringExpression`. Examples [#examples] Match at end of line: ```wolfram StringCases["line1\nline2\n", __ ~~ EndOfLine] (* {"line1", "line2"} *) ``` Replace end of lines: ```wolfram StringReplace["abc\ndef", EndOfLine -> ";"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndOfLine.html) for more details. # EndOfString `EndOfString` represents the end of a string for purposes of matching in `StringExpression`. Examples [#examples] Match at end of string: ```wolfram StringMatchQ["hello world", __ ~~ "world" ~~ EndOfString] (* True *) ``` Anchor pattern to end: ```wolfram StringCases["abc123", DigitCharacter .. ~~ EndOfString] (* {"123"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EndOfString.html) for more details. # FromCharacterCode `FromCharacterCode[n]` gives a string consisting of the character with integer code n. `FromCharacterCode[{n1, n2, ...}]` gives a string consisting of the sequence of characters. Examples [#examples] Single character: ```wolfram FromCharacterCode[65] (* "A" *) ``` String from codes: ```wolfram FromCharacterCode[{72, 101, 108, 108, 111}] (* "Hello" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromCharacterCode.html) for more details. # FromEntity `FromEntity[entity]` returns a Wolfram Language object corresponding to an entity. Examples [#examples] Convert a country entity to a geographic region: ```wolfram FromEntity[Entity["Country", "France"]] ``` Convert a color entity: ```wolfram FromEntity[Entity["Color", "Red"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromEntity.html) for more details. # FromLetterNumber `FromLetterNumber[n]` gives the lowercase letter at position n in the English alphabet. `FromLetterNumber[n,alpha]` gives the letter at position n in the alphabet specified by alpha. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromLetterNumber.html) for more details. # FromRomanNumeral `FromRomanNumeral["string"]` gives the integer corresponding to the Roman numeral "string". Examples [#examples] ```wolfram FromRomanNumeral["MMXXVI"] (* 2026 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FromRomanNumeral.html) for more details. # HexadecimalCharacter `HexadecimalCharacter` represents a hexadecimal digit character 0–9, a–f, A–F in StringExpression. Examples [#examples] Match hex digits: ```wolfram StringMatchQ["A", HexadecimalCharacter] (* True *) ``` Extract hex characters: ```wolfram StringCases["Color: #FF00AA", HexadecimalCharacter] (* {"F", "F", "0", "0", "A", "A"} *) ``` Match hex string: ```wolfram StringMatchQ["deadbeef", HexadecimalCharacter ..] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HexadecimalCharacter.html) for more details. # InterpretTemplate `InterpretTemplate` is an experimental function used for interpreting Mathematica input. Examples [#examples] ```wolfram InterpretTemplate["1 + 2"] ``` ```wolfram InterpretTemplate[template, data] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/InterpretTemplate.html) for more details. # Interpreter `Interpreter[form]` represents an interpreter object that can interpret input as an object of the specified form. `Interpreter[form, test]` validates with the test function. Examples [#examples] Interpret a date: ```wolfram Interpreter["Date"]["January 1, 2020"] (* DateObject[{2020, 1, 1}] *) ``` Number interpretation: ```wolfram Interpreter["Number"]["42.5"] (* 42.5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Interpreter.html) for more details. # LanguageIdentify `LanguageIdentify["string"]` attempts to determine what human language text in `string` is in, predominantly. * `LanguageIdentify[audio]` performs language identification in audio recording `audio`. * `LanguageIdentify[video]` performs language identification of the audio track in `video`. Examples [#examples] ```wolfram LanguageIdentify["Bonjour, comment allez-vous?"] ``` ```wolfram LanguageIdentify["Guten Tag, wie geht es Ihnen?"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LanguageIdentify.html) for more details. # LetterCharacter `LetterCharacter` represents a letter character in `StringExpression`. Examples [#examples] Match any letter character: ```wolfram StringMatchQ["abc", LetterCharacter ..] (* True *) ``` Find all letters in a string: ```wolfram StringCases["a1b2c3", LetterCharacter] (* {"a", "b", "c"} *) ``` Replace letters: ```wolfram StringReplace["Hello123", LetterCharacter -> "X"] (* "XXXXX123" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LetterCharacter.html) for more details. # LetterNumber `LetterNumber["c"]` gives the position of the character c in the English alphabet. `LetterNumber["c",alpha]` gives the position of c in the alphabet specified by alpha. `LetterNumber["string",…]` gives a list of the positions of characters in string. Examples [#examples] Get the position of a letter: ```wolfram LetterNumber["d"] (* 4 *) ``` Get positions for a string: ```wolfram LetterNumber["hello"] (* {8, 5, 12, 12, 15} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LetterNumber.html) for more details. # LetterQ `LetterQ[string]` yields `True` if all the characters in the string are letters, and `False` otherwise. Examples [#examples] Check if all characters are letters: ```wolfram LetterQ["Hello"] (* True *) ``` String with numbers: ```wolfram LetterQ["Hello123"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LetterQ.html) for more details. # LowerCaseQ `LowerCaseQ[string]` yields `True` if all the characters in the string are lowercase letters, and yields `False` otherwise. Examples [#examples] ```wolfram LowerCaseQ["hello"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LowerCaseQ.html) for more details. # MatchLocalNameQ `MatchLocalNameQ` is an internal symbol. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MatchLocalNameQ.html) for more details. # Pluralize `Pluralize["noun"]` gives the plural form of the English word "noun". * `Pluralize["noun", n]` gives the inflected form of "noun" for n instances. * `Pluralize[{"singular", "plural"}, n]` inflects using the specified forms. * `Pluralize[spec, list]` uses the length of list to determine the inflection to use. Examples [#examples] ```wolfram Pluralize["cat"] ``` ```wolfram Pluralize["mouse", 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Pluralize.html) for more details. # PrintableASCIIQ `PrintableASCIIQ[string]` yields `True` if the string contains only printable ASCII characters, and yields `False` otherwise. Printable ASCII characters are those with codes 32-126 (space through tilde). Examples [#examples] ```wolfram PrintableASCIIQ["Hello, World!"] ``` ```wolfram PrintableASCIIQ["Hello\nWorld"] ``` ```wolfram PrintableASCIIQ["café"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PrintableASCIIQ.html) for more details. # PunctuationCharacter `PunctuationCharacter` represents a punctuation character in `StringExpression`. Examples [#examples] ```wolfram StringMatchQ["!", PunctuationCharacter] ``` ```wolfram StringCases["Hello, World!", PunctuationCharacter] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PunctuationCharacter.html) for more details. # RegularExpression `RegularExpression["regex"]` represents the generalized regular expression specified by the string "regex". Examples [#examples] Match digits in a string: ```wolfram StringCases["abc123def", RegularExpression["[0-9]+"]] (* {"123"} *) ``` Replace using regex: ```wolfram StringReplace["hello world", RegularExpression["\\s+"] -> "-"] (* "hello-world" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RegularExpression.html) for more details. # RemoveDiacritics `RemoveDiacritics[string]` replaces characters in string that have diacritics by their base ASCII characters, when possible. Examples [#examples] Remove diacritics from text: ```wolfram RemoveDiacritics["café"] (* "cafe" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RemoveDiacritics.html) for more details. # RomanNumeral `RomanNumeral[n]` gives a string corresponding to the Roman numeral form of the integer n. Examples [#examples] Convert integer to Roman numeral: ```wolfram RomanNumeral[42] (* "XLII" *) ``` Convert multiple values: ```wolfram Table[{i, RomanNumeral[i]}, {i, 1, 10}] (* {{1, "I"}, {2, "II"}, {3, "III"}, ...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RomanNumeral.html) for more details. # SemanticImportString `SemanticImportString["string"]` attempts to import a string semantically to give a Dataset object. * `SemanticImportString["string", type]` attempts to interpret all elements in the string as being of the specified type. * `SemanticImportString["string", {type1, type2, ...}]` attempts to interpret elements in successive columns as being of the specified types. * `SemanticImportString["string", <|col1 -> type1, col2 -> type2, ...|>]` attempts to interpret elements in the named columns as being of the specified types. * `SemanticImportString["string", typespec, form]` puts the result in the specified form. Examples [#examples] Import CSV data from a string: ```wolfram SemanticImportString["name,age\nAlice,30\nBob,25"] ``` Specify column types: ```wolfram SemanticImportString["Alice,30\nBob,25", {"String", "Number"}] ``` Get as a list: ```wolfram SemanticImportString["1,2,3\n4,5,6", Automatic, "Data"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticImportString.html) for more details. # SemanticInterpretation `SemanticInterpretation["string"]` attempts to give the best semantic interpretation of the specified free-form string as a Wolfram Language expression. * `SemanticInterpretation["string", pattern]` filters possible semantic interpretations, returning the best one that matches the specified pattern. * `SemanticInterpretation["string", pattern, head]` returns the semantic interpretation wrapped with the specified head. Examples [#examples] ```wolfram SemanticInterpretation["population of France"] ``` ```wolfram SemanticInterpretation["5 feet 10 inches", _Quantity] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SemanticInterpretation.html) for more details. # SequenceAlignment `SequenceAlignment[s1, s2]` finds an optimal alignment of sequences of elements in the strings, lists or biomolecular sequences s1 and s2, and yields a list of successive matching and differing sequences. Examples [#examples] ```wolfram SequenceAlignment["kitten", "sitting"] ``` ```wolfram SequenceAlignment[{1, 2, 3, 4, 5}, {1, 2, 4, 5}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SequenceAlignment.html) for more details. # SpellingCorrectionList `SpellingCorrectionList["word"]` gives a list of possible spelling corrections for "word". Examples [#examples] Get spelling suggestions: ```wolfram SpellingCorrectionList["teh"] (* {"the", "tea", "ten"} *) ``` Correct a misspelled word: ```wolfram SpellingCorrectionList["progam"] (* {"program"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpellingCorrectionList.html) for more details. # SpellingDictionaries `SpellingDictionaries` is a global option that specifies settings for spell checking. This option controls which dictionaries are used for spell checking in notebooks and text processing. Examples [#examples] ```wolfram CurrentValue[$FrontEnd, SpellingDictionaries] ``` ```wolfram SetOptions[$FrontEnd, SpellingDictionaries -> {"English"}] ``` ```wolfram Options[$FrontEnd, SpellingDictionaries] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpellingDictionaries.html) for more details. # SpellingDictionariesPath `SpellingDictionariesPath` is a global option that specifies which directories are searched for spelling dictionaries when the Edit ▶ Check Spelling menu item is used. Examples [#examples] Get current spelling dictionaries path: ```wolfram $SpellingDictionariesPath ``` Add custom dictionary directory: ```wolfram SetOptions[$FrontEnd, SpellingDictionariesPath -> {"path/to/dictionaries"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpellingDictionariesPath.html) for more details. # SpokenString `SpokenString[expr]` gives a string of text corresponding to a spoken representation of the expression expr. Examples [#examples] Get a spoken representation of an expression: ```wolfram SpokenString[x^2 + 1] (* "x squared plus 1" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SpokenString.html) for more details. # StartOfLine `StartOfLine` represents the start of a line in a string for purposes of matching in `StringExpression`. Examples [#examples] ```wolfram StringCases["line1\nline2\nline3", StartOfLine ~~ __ ~~ EndOfLine] ``` ```wolfram StringMatchQ["hello", StartOfLine ~~ "hello"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StartOfLine.html) for more details. # StartOfString `StartOfString` represents the start of a string for purposes of matching in `StringExpression`. This is similar to `^` in regular expressions. Examples [#examples] ```wolfram StringMatchQ["hello", StartOfString ~~ "he" ~~ __] ``` ```wolfram StringReplace["test string", StartOfString ~~ x_ :> ToUpperCase[x]] ``` ```wolfram StringCases["abc123", StartOfString ~~ LetterCharacter ..] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StartOfString.html) for more details. # String `String` is the head of a character string "text". Examples [#examples] Check if an expression is a string: ```wolfram Head["hello"] (* String *) ``` Test with pattern: ```wolfram MatchQ["hello", _String] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/String.html) for more details. # StringApply `StringApply[f, string]` applies f to the code points in string. * `StringApply[f]` represents an operator form of `StringApply` that can be applied to an expression. Examples [#examples] ```wolfram StringApply[Plus, "abc"] ``` ```wolfram StringApply[FromCharacterCode @* Plus] @ "hello" ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringApply.html) for more details. # StringByteCount `StringByteCount["string"]` gives the total number of bytes used to store the characters in a string. Examples [#examples] ```wolfram StringByteCount["Hello"] (* 5 *) ``` ```wolfram StringByteCount["日本語"] (* 9 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringByteCount.html) for more details. # StringCases `StringCases["string", patt]` gives a list of substrings that match the pattern. `StringCases["string", lhs -> rhs]` gives a list of rhs values for matching substrings. Examples [#examples] Find matching substrings: ```wolfram StringCases["the cat and the hat", "the"] (* {"the", "the"} *) ``` With pattern: ```wolfram StringCases["a1b2c3", DigitCharacter] (* {"1", "2", "3"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringCases.html) for more details. # StringContainsQ `StringContainsQ["string", patt]` yields `True` if any substring matches the pattern. `StringContainsQ[patt]` represents an operator form. Examples [#examples] Check for substring: ```wolfram StringContainsQ["Hello World", "World"] (* True *) ``` ```wolfram StringContainsQ["Hello World", "Goodbye"] (* False *) ``` With patterns: ```wolfram StringContainsQ["abc123", DigitCharacter] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringContainsQ.html) for more details. # StringCount `StringCount["string", "sub"]` counts occurrences of a substring. `StringCount["string", patt]` counts substrings matching a pattern. Examples [#examples] Count occurrences: ```wolfram StringCount["mississippi", "ss"] (* 2 *) ``` Count pattern matches: ```wolfram StringCount["abc123def456", DigitCharacter] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringCount.html) for more details. # StringDelete `StringDelete["string", patt]` yields the string obtained by deleting from string all occurrences of anything matching the string pattern patt. `StringDelete[patt]` represents an operator form of StringDelete that can be applied to an expression. Examples [#examples] Delete substrings: ```wolfram StringDelete["the cat in the hat", "the "] (* "cat in hat" *) ``` Delete pattern matches: ```wolfram StringDelete["abc123def", DigitCharacter] (* "abcdef" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringDelete.html) for more details. # StringDrop `StringDrop["string", n]` gives string with its first n characters dropped. `StringDrop["string", -n]` gives string with its last n characters dropped. Examples [#examples] Drop first characters: ```wolfram StringDrop["Hello World", 6] (* "World" *) ``` Drop last characters: ```wolfram StringDrop["Hello World", -6] (* "Hello" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringDrop.html) for more details. # StringEndsQ `StringEndsQ["string", patt]` yields `True` if the end of the string matches the pattern. `StringEndsQ[patt]` represents an operator form. Examples [#examples] Check suffix: ```wolfram StringEndsQ["Hello World", "World"] (* True *) ``` ```wolfram StringEndsQ["Hello World", "Hello"] (* False *) ``` Filter by file extension: ```wolfram Select[{"file.txt", "image.png", "data.txt"}, StringEndsQ[".txt"]] (* {"file.txt", "data.txt"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringEndsQ.html) for more details. # StringExpression `s1 ~~ s2 ~~ ...` or `StringExpression[s1, s2, ...]` represents a sequence of strings and symbolic string objects si. Examples [#examples] Create a string pattern: ```wolfram StringMatchQ["abc123", LetterCharacter ~~ LetterCharacter ~~ LetterCharacter ~~ DigitCharacter ..] (* True *) ``` Use in StringCases: ```wolfram StringCases["The cat sat", "c" ~~ __ ~~ "t"] (* {"cat sat"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringExpression.html) for more details. # StringExtract `StringExtract["string", n]` extracts the nth block of characters in string, where blocks of characters are defined as delimited by whitespace. * `StringExtract["string", {pos1, pos2, ...}]` extracts blocks at several positions in string. * `StringExtract["string", sep -> pos]` takes blocks to be delimited by separators that match sep. * `StringExtract["string", pos1, pos2, ...]` extracts blocks at positions posi, delimiting with whitespace for the lowest level, newlines for the next level. * `StringExtract["string", sep1 -> pos1, sep2 -> pos2, ...]` gives a nested list of blocks, with the sepi used as separators for successive levels. Examples [#examples] ```wolfram StringExtract["one two three", 2] ``` ```wolfram StringExtract["a,b,c", "," -> 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringExtract.html) for more details. # StringForm `StringForm["controlstring", expr1, ...]` prints as the text of the controlstring, with the printed forms of the expri embedded. Examples [#examples] Format a string: ```wolfram StringForm["The value is ``.", 42] (* "The value is 42." *) ``` Multiple placeholders: ```wolfram StringForm["`` + `` = ``", 2, 3, 5] (* "2 + 3 = 5" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringForm.html) for more details. # StringFormat `StringFormat["string"]` attempts to determine what `ImportString` format could be used to import the string *"string"*. Examples [#examples] ```wolfram StringFormat["<html><body>Hello</body></html>"] (* "HTML" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringFormat.html) for more details. # StringFormatQ `StringFormatQ["string","fmt"]` gives True if the string "string" might be imported as format "fmt" and gives False otherwise. `StringFormatQ["string",{fmt1,fmt2,…}]` gives True if "string" might be imported as one of "fmti". Examples [#examples] ```wolfram StringFormatQ["{\"key\": 1}", "JSON"] (* True *) ``` ```wolfram StringFormatQ["<html></html>", {"JSON", "HTML"}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringFormatQ.html) for more details. # StringFreeQ `StringFreeQ["string", patt]` yields `True` if no substring matches the pattern, and `False` otherwise. `StringFreeQ[patt]` represents an operator form that can be applied to an expression. Examples [#examples] Check if string is free of a pattern: ```wolfram StringFreeQ["Hello World", "xyz"] (* True *) ``` Check for digit characters: ```wolfram StringFreeQ["Hello World", DigitCharacter] (* True *) ``` ```wolfram StringFreeQ["Hello123", DigitCharacter] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringFreeQ.html) for more details. # StringInsert `StringInsert["string", "snew", n]` inserts "snew" starting at position n. `StringInsert["string", "snew", -n]` inserts at position n from the end. Examples [#examples] Insert at position: ```wolfram StringInsert["HelloWorld", " ", 6] (* "Hello World" *) ``` Insert from end: ```wolfram StringInsert["Hello", "!", -1] (* "Hello!" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringInsert.html) for more details. # StringJoin `StringJoin["s1", "s2", ...]` or `"s1" <> "s2" <> ...` yields a string consisting of the concatenation of the strings. Examples [#examples] Join strings: ```wolfram StringJoin["Hello", " ", "World"] (* "Hello World" *) ``` Using the `<>` operator: ```wolfram "Hello" <> " " <> "World" (* "Hello World" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringJoin.html) for more details. # StringLength `StringLength["string"]` gives the number of characters in a string. Examples [#examples] Length of a string: ```wolfram StringLength["Hello World"] (* 11 *) ``` Empty string: ```wolfram StringLength[""] (* 0 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringLength.html) for more details. # StringMatchQ `StringMatchQ["string", patt]` tests whether the entire string matches the pattern. `StringMatchQ[patt]` represents an operator form. Examples [#examples] Match with wildcard: ```wolfram StringMatchQ["Hello World", "Hello*"] (* True *) ``` Match entire string: ```wolfram StringMatchQ["abc123", LetterCharacter..] (* False *) ``` With regex: ```wolfram StringMatchQ["test@example.com", RegularExpression[".+@.+\\..+"]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringMatchQ.html) for more details. # StringPadLeft `StringPadLeft["string", n]` pads the string on the left with spaces to make it length n. `StringPadLeft["string", n, "padding"]` pads with a custom padding string. Examples [#examples] Pad with spaces: ```wolfram StringPadLeft["hello", 10] (* " hello" *) ``` Pad with zeros: ```wolfram StringPadLeft["42", 5, "0"] (* "00042" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringPadLeft.html) for more details. # StringPadRight `StringPadRight["string", n]` pads the string on the right with spaces to make it length n. `StringPadRight["string", n, "padding"]` pads with a custom padding string. Examples [#examples] Pad with spaces: ```wolfram StringPadRight["hello", 10] (* "hello " *) ``` Pad with custom character: ```wolfram StringPadRight["test", 10, "-"] (* "test------" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringPadRight.html) for more details. # StringPart `StringPart["string", n]` gives the nth character in "string". `StringPart["string", {n1, n2, ...}]` gives a list of the specified characters. `StringPart["string", m;;n]` gives a list of the characters from m to n. Examples [#examples] Get a single character: ```wolfram StringPart["Hello", 2] (* "e" *) ``` Get multiple characters: ```wolfram StringPart["Hello", {1, 3, 5}] (* {"H", "l", "o"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringPart.html) for more details. # StringPartition `StringPartition["string", n]` partitions string into nonoverlapping substrings of length n. `StringPartition["string", n, d]` generates substrings with offset d. Examples [#examples] Partition into chunks: ```wolfram StringPartition["abcdefgh", 2] (* {"ab", "cd", "ef", "gh"} *) ``` Overlapping partitions: ```wolfram StringPartition["abcdef", 3, 1] (* {"abc", "bcd", "cde", "def"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringPartition.html) for more details. # StringPosition `StringPosition["string", "sub"]` gives a list of `{start, end}` positions where the substring appears. `StringPosition["string", patt, n]` includes only the first n occurrences. Examples [#examples] Find positions: ```wolfram StringPosition["abcabc", "bc"] (* {{2, 3}, {5, 6}} *) ``` First occurrence only: ```wolfram StringPosition["abcabc", "bc", 1] (* {{2, 3}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringPosition.html) for more details. # StringQ `StringQ[expr]` gives `True` if expr is a string, and `False` otherwise. Examples [#examples] Test for strings: ```wolfram StringQ["hello"] (* True *) ``` ```wolfram StringQ[hello] (* False *) ``` Filter strings from a list: ```wolfram Select[{1, "a", 2, "b"}, StringQ] (* {"a", "b"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringQ.html) for more details. # StringRepeat `StringRepeat["str", n]` creates a string consisting of "str" repeated n times. `StringRepeat["str", n, max]` limits the result to at most max characters. Examples [#examples] Repeat a string: ```wolfram StringRepeat["ab", 5] (* "ababababab" *) ``` With maximum length: ```wolfram StringRepeat["hello", 10, 20] (* "hellohellohelloHello" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringRepeat.html) for more details. # StringReplace `StringReplace["string", s -> sp]` replaces the string expression s by sp wherever it appears. `StringReplace["string", {s1 -> sp1, s2 -> sp2, ...}]` replaces multiple patterns. Examples [#examples] Replace a substring: ```wolfram StringReplace["Hello World", "World" -> "Universe"] (* "Hello Universe" *) ``` Multiple replacements: ```wolfram StringReplace["cat and dog", {"cat" -> "dog", "dog" -> "cat"}] (* "dog and cat" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringReplace.html) for more details. # StringReplaceList `StringReplaceList["string", s -> sp]` gives a list of the strings obtained by replacing each individual occurrence of substrings in "string" matching the string expressions. * `StringReplaceList["string", {s1 -> sp1, s2 -> sp2, ...}]` replaces multiple patterns. * `StringReplaceList["string", srules, n]` gives a list of the first n results obtained. * `StringReplaceList[{s1, s2, ...}, srules]` gives the list of results for each of the si. Examples [#examples] List all possible single replacements: ```wolfram StringReplaceList["abab", "a" -> "X"] ``` Replace with multiple patterns: ```wolfram StringReplaceList["abc", {"a" -> "1", "b" -> "2"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringReplaceList.html) for more details. # StringReplacePart `StringReplacePart["string", "snew", {m, n}]` replaces the characters at positions m through n in "string" by "snew". `StringReplacePart["string", "snew", {{m1, n1}, {m2, n2}, …}]` inserts copies of "snew" at several positions. `StringReplacePart["string", {"snew1", "snew2", …}, {{m1, n1}, {m2, n2}, …}]` replaces characters at positions mi through ni in "string" by "snewi". `StringReplacePart["snew", {m, n}]` represents an operator form of StringReplacePart that can be applied to an expression. Examples [#examples] Replace characters in a string: ```wolfram StringReplacePart["abcdefgh", "XYZ", {3, 5}] (* "abXYZfgh" *) ``` Replace at multiple positions: ```wolfram StringReplacePart["abcdefgh", "*", {{1, 2}, {5, 6}}] (* "*cd*gh" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringReplacePart.html) for more details. # StringReverse `StringReverse["string"]` reverses the order of characters in the string. Examples [#examples] Reverse a string: ```wolfram StringReverse["Hello"] (* "olleH" *) ``` Check for palindrome: ```wolfram StringReverse["racecar"] === "racecar" (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringReverse.html) for more details. # StringRiffle `StringRiffle[{s1, s2, s3, ...}]` concatenates strings with spaces between them. `StringRiffle[list, sep]` uses sep as the separator. Examples [#examples] Join with spaces: ```wolfram StringRiffle[{"a", "b", "c"}] (* "a b c" *) ``` Join with custom separator: ```wolfram StringRiffle[{"a", "b", "c"}, ", "] (* "a, b, c" *) ``` With delimiters: ```wolfram StringRiffle[{"a", "b", "c"}, {"[", ", ", "]"}] (* "[a, b, c]" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringRiffle.html) for more details. # StringRotateLeft `StringRotateLeft[string,n]` cycles the characters in string n positions to the left. `StringRotateLeft[string]` cycles one position to the left. Examples [#examples] Rotate a string one position to the left: ```wolfram StringRotateLeft["hello"] (* "elloh" *) ``` Rotate a string multiple positions: ```wolfram StringRotateLeft["hello", 2] (* "llohe" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringRotateLeft.html) for more details. # StringRotateRight `StringRotateRight[string, n]` cycles the characters in *string* *n* positions to the right. * `StringRotateRight[string]` cycles one position to the right. Examples [#examples] ```wolfram StringRotateRight["abcdef", 2] (* "efabcd" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringRotateRight.html) for more details. # StringSkeleton `StringSkeleton[n]` represents a sequence of n omitted characters in a string printed with `Short`. The standard print form for StringSkeleton is an ellipsis. Examples [#examples] ```wolfram Short["This is a very long string", 1] ``` ```wolfram StringSkeleton[10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringSkeleton.html) for more details. # StringSplit `StringSplit["string"]` splits a string into a list of substrings separated by whitespace. `StringSplit["string", patt]` splits at delimiters matching the pattern. Examples [#examples] Split by whitespace: ```wolfram StringSplit["Hello World"] (* {"Hello", "World"} *) ``` Split by a delimiter: ```wolfram StringSplit["a,b,c", ","] (* {"a", "b", "c"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringSplit.html) for more details. # StringStartsQ `StringStartsQ["string", patt]` yields `True` if the beginning of the string matches the pattern. `StringStartsQ[patt]` represents an operator form. Examples [#examples] Check prefix: ```wolfram StringStartsQ["Hello World", "Hello"] (* True *) ``` ```wolfram StringStartsQ["Hello World", "World"] (* False *) ``` Filter strings by prefix: ```wolfram Select[{"apple", "apricot", "banana"}, StringStartsQ["ap"]] (* {"apple", "apricot"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringStartsQ.html) for more details. # StringTake `StringTake["string", n]` gives a string containing the first n characters. `StringTake["string", -n]` gives the last n characters. `StringTake["string", {m, n}]` gives characters m through n. Examples [#examples] First 5 characters: ```wolfram StringTake["Hello World", 5] (* "Hello" *) ``` Last 5 characters: ```wolfram StringTake["Hello World", -5] (* "World" *) ``` Substring: ```wolfram StringTake["Hello World", {7, 11}] (* "World" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringTake.html) for more details. # StringTakeDrop `StringTakeDrop["string", n]` gives a pair of strings containing the first n characters in "string" and the remaining characters. * `StringTakeDrop["string", seq]` gives the pair `{StringTake["string", seq], StringDrop["string", seq]}`. Examples [#examples] Split a string at position 5: ```wolfram StringTakeDrop["Hello World", 5] (* {"Hello", " World"} *) ``` Take and drop last 3 characters: ```wolfram StringTakeDrop["abcdefgh", -3] (* {"abcde", "fgh"} *) ``` With range specification: ```wolfram StringTakeDrop["Hello World", {1, 5}] (* {"Hello", " World"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringTakeDrop.html) for more details. # StringTemplate `StringTemplate["string"]` yields a TemplateObject expression that represents a string template to be applied to arguments. `StringTemplate[src]` uses File\[...], URL\[...] as the source for the string template. Examples [#examples] Create and apply a template: ```wolfram template = StringTemplate["Hello, `name`!"]; template[<|"name" -> "World"|>] (* "Hello, World!" *) ``` Positional arguments: ```wolfram StringTemplate["`` + `` = ``"][2, 3, 5] (* "2 + 3 = 5" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringTemplate.html) for more details. # StringToByteArray `StringToByteArray["string"]` returns a byte array corresponding to the UTF-8 encoding of the specified string. * `StringToByteArray["string", "encoding"]` uses the specified character encoding. Examples [#examples] UTF-8 encoding: ```wolfram StringToByteArray["Hello"] ``` With different encoding: ```wolfram StringToByteArray["Hello", "ASCII"] ``` Unicode characters: ```wolfram StringToByteArray["你好"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringToByteArray.html) for more details. # StringToStream `StringToStream["string"]` opens an input stream for reading from a string. Examples [#examples] Create a stream from a string: ```wolfram stream = StringToStream["Hello\nWorld"]; ReadLine[stream] (* "Hello" *) Close[stream] ``` Read all data: ```wolfram stream = StringToStream["1 2 3"]; ReadList[stream, Number] (* {1, 2, 3} *) Close[stream] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringToStream.html) for more details. # StringTrim `StringTrim["string"]` trims whitespace from the beginning and end of the string. `StringTrim["string", patt]` trims substrings matching patt. Examples [#examples] Trim whitespace: ```wolfram StringTrim[" Hello World "] (* "Hello World" *) ``` Trim specific characters: ```wolfram StringTrim["###hello###", "#" ..] (* "hello" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StringTrim.html) for more details. # Synonyms `Synonyms["word"]` returns the synonyms associated with the specified word. Examples [#examples] Find synonyms of a word: ```wolfram Synonyms["happy"] (* {"joyful", "content", "pleased", ...} *) ``` Synonyms for a verb: ```wolfram Synonyms["run"] (* {"sprint", "dash", "jog", ...} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Synonyms.html) for more details. # TextCases `TextCases[text, form]` gives a list of all cases of text identified as being of type form that appear in text. * `TextCases[text, {form1, form2, ...}]` gives an association of results for all the types formi. * `TextCases[text, formspec -> prop]` gives the specified property for each result found. * `TextCases[text, spec, n]` gives the first n cases found. Examples [#examples] ```wolfram TextCases["The cat and dog ran.", "Noun"] ``` ```wolfram TextCases["Call me at 555-1234.", "PhoneNumber"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TextCases.html) for more details. # TextContents `TextContents[text]` gives a dataset of information about entities, dates, quantities and other content-related elements found in text. * `TextContents[text, form]` searches for cases of the type form. * `TextContents[text, {form1, form2, …}]` searches for cases of types form1, form2, …. * `TextContents[text, forms, props]` includes the property props for each object in the dataset produced. Examples [#examples] ```wolfram TextContents["I visited Paris on January 5, 2020."] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TextContents.html) for more details. # TextPosition `TextPosition[text,form]` gives a list of the starting and ending positions at which instances of form occur in text. `TextPosition[text,{form1,form2,…}]` gives an association of results for all the types formi. `TextPosition[text,formspec,n]` gives the positions of the first n cases found. Examples [#examples] Find positions of a word: ```wolfram TextPosition["The quick brown fox", "Word"] (* {{1, 3}, {5, 9}, {11, 15}, {17, 19}} *) ``` Find sentence positions: ```wolfram TextPosition["Hello world. How are you?", "Sentence"] (* {{1, 12}, {14, 26}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TextPosition.html) for more details. # TextSentences `TextSentences["string"]` gives a list of the runs of characters identified as sentences in string. * `TextSentences["string", n]` gives the first n sentences in string. Examples [#examples] ```wolfram TextSentences["Hello world. How are you? I am fine."] ``` ```wolfram TextSentences["First sentence. Second sentence. Third sentence.", 2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TextSentences.html) for more details. # TextWords `TextWords["string"]` gives a list of the runs of characters identified as words in string. * `TextWords["string", n]` gives the first n words in string. Examples [#examples] Extract all words: ```wolfram TextWords["The quick brown fox"] (* {"The", "quick", "brown", "fox"} *) ``` Get first 3 words: ```wolfram TextWords["Hello world, this is a test", 3] (* {"Hello", "world", "this"} *) ``` Count words in text: ```wolfram Length[TextWords["One two three four five"]] (* 5 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TextWords.html) for more details. # ToCharacterCode `ToCharacterCode["string"]` gives a list of the integer codes corresponding to the characters in a string. `ToCharacterCode["string", "encoding"]` gives integer codes according to the specified encoding. Examples [#examples] Get character codes: ```wolfram ToCharacterCode["Hello"] (* {72, 101, 108, 108, 111} *) ``` Single character: ```wolfram ToCharacterCode["A"] (* {65} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToCharacterCode.html) for more details. # ToEntity `ToEntity[expr]` returns an entity object corresponding to the given expression. `ToEntity[expr,type]` returns an entity object of the specified type corresponding to expr. Examples [#examples] Convert a date to an entity: ```wolfram ToEntity[DateObject[{2024, 1, 1}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToEntity.html) for more details. # ToLowerCase `ToLowerCase[string]` yields a string in which all letters have been converted to lowercase. Examples [#examples] Convert to lowercase: ```wolfram ToLowerCase["Hello World"] (* "hello world" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToLowerCase.html) for more details. # ToRules `ToRules[eqns]` takes logical combinations of equations, in the form generated by Roots and Reduce, and converts them to lists of rules, of the form produced by Solve. Examples [#examples] Convert equations to rules: ```wolfram ToRules[x == 1 || x == 2] (* {{x -> 1}, {x -> 2}} *) ``` From Reduce output: ```wolfram ToRules[Reduce[x^2 == 4, x]] (* {{x -> -2}, {x -> 2}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToRules.html) for more details. # ToString `ToString[expr]` gives a string corresponding to the printed form of expr. `ToString[expr, form]` gives the string in the specified form. Examples [#examples] Convert expression to string: ```wolfram ToString[123] (* "123" *) ToString[x^2 + 1] (* "1 + x^2" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToString.html) for more details. # ToUpperCase `ToUpperCase[string]` yields a string in which all letters have been converted to uppercase. Examples [#examples] Convert to uppercase: ```wolfram ToUpperCase["Hello World"] (* "HELLO WORLD" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToUpperCase.html) for more details. # UpperCaseQ `UpperCaseQ[string]` yields True if all the characters in the string are uppercase letters, and yields False otherwise. Examples [#examples] Test an uppercase string: ```wolfram UpperCaseQ["HELLO"] (* True *) ``` Test a mixed case string: ```wolfram UpperCaseQ["Hello"] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpperCaseQ.html) for more details. # Verbatim `Verbatim[expr]` represents expr in pattern matching, requiring that expr be matched exactly as it appears, with no substitutions for blanks or other transformations. Examples [#examples] Match a literal pattern: ```wolfram MatchQ[_, Verbatim[_]] (* True *) ``` Without Verbatim, blank matches anything: ```wolfram MatchQ[x, _] (* True *) ``` Match a specific function form: ```wolfram Cases[{f[_], g[x], f[y]}, Verbatim[f[_]]] (* {f[_]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Verbatim.html) for more details. # Whitespace `Whitespace` represents a sequence of whitespace characters in `StringExpression`. Examples [#examples] Split a string by whitespace: ```wolfram StringSplit["hello world", Whitespace] (* {"hello", "world"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Whitespace.html) for more details. # WhitespaceCharacter `WhitespaceCharacter` represents a single whitespace character in `StringExpression`. Examples [#examples] ```wolfram StringMatchQ[" ", WhitespaceCharacter] (* True *) ``` ```wolfram StringSplit["hello world", WhitespaceCharacter..] (* {"hello", "world"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WhitespaceCharacter.html) for more details. # Word `Word` represents a word in `Read`, `Find`, and related functions. Examples [#examples] Read words from a file: ```wolfram stream = StringToStream["Hello World Test"]; Read[stream, Word] ``` Read multiple words: ```wolfram stream = StringToStream["one two three"]; ReadList[stream, Word] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Word.html) for more details. # WordBoundary `WordBoundary` represents a boundary between words for purposes of matching in `StringExpression`. Examples [#examples] ```wolfram StringMatchQ["hello world", __ ~~ WordBoundary ~~ __] (* True *) ``` ```wolfram StringCases["the cat sat", WordBoundary ~~ LetterCharacter.. ~~ WordBoundary] (* {"the", "cat", "sat"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordBoundary.html) for more details. # WordCharacter `WordCharacter` represents a letter or digit character in `StringExpression`. Examples [#examples] ```wolfram StringMatchQ["a", WordCharacter] ``` ```wolfram StringCases["hello123!", WordCharacter ..] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordCharacter.html) for more details. # WordCount `WordCount["string"]` gives the total number of words in string. Examples [#examples] Count words in a string: ```wolfram WordCount["The quick brown fox jumps over the lazy dog"] ``` Count words in longer text: ```wolfram WordCount["Hello world. This is a test sentence."] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordCount.html) for more details. # WordCounts `WordCounts["string"]` gives an association whose keys are the distinct words identified in string, and whose values give the number of times those words appear. * `WordCounts["string", n]` gives counts of the distinct n-grams consisting of runs of n words in string. * `WordCounts[{string1, string2, ...}, ...]` gives the counts for each of the strings. Examples [#examples] Count words in a string: ```wolfram WordCounts["the quick brown fox jumps over the lazy dog"] ``` Count bigrams (word pairs): ```wolfram WordCounts["to be or not to be", 2] ``` Count words in multiple strings: ```wolfram WordCounts[{"hello world", "world hello hello"}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordCounts.html) for more details. # WordData `WordData["word", "property"]` gives the specified property for the English word "word". * `WordData["word"]` gives a list of full word specifications representing possible uses and senses of "word". * `WordData[wordspec, "property"]` gives a property for a particular word specification. Examples [#examples] Get definitions of a word: ```wolfram WordData["run", "Definitions"] ``` List all word specifications: ```wolfram WordData["bank"] ``` Get synonyms for a specific sense: ```wolfram WordData[{"bank", "Noun", "Riverbank"}, "Synonyms"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordData.html) for more details. # WordDefinition `WordDefinition["word"]` gives the dictionary definitions available for "word". Examples [#examples] ```wolfram WordDefinition["algorithm"] ``` ```wolfram WordDefinition["vector"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordDefinition.html) for more details. # WordFrequency `WordFrequency[text, word]` gives the frequency of word in text. * `WordFrequency[text, {word1, word2, ...}]` gives an association of the frequencies of each of the wordi. This function calculates how often words appear in text as a fraction of total words. Examples [#examples] ```wolfram WordFrequency["the cat and the dog", "the"] ``` ```wolfram WordFrequency[ExampleData[{"Text", "AliceInWonderland"}], "Alice"] ``` ```wolfram WordFrequency["hello world hello", {"hello", "world"}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordFrequency.html) for more details. # WordList `WordList[]` gives a list of common words. * `WordList[type]` gives a list of words of the specified type. Examples [#examples] ```wolfram WordList[] ``` ```wolfram WordList["CommonWords"] ``` ```wolfram WordList["KnownWords"] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordList.html) for more details. # WordStem `WordStem["word"]` gives a stemmed form of word, removing plurals, inflections, etc. Examples [#examples] Stem a word: ```wolfram WordStem["running"] (* "run" *) ``` Stem plural forms: ```wolfram WordStem["cats"] (* "cat" *) ``` Apply to multiple words: ```wolfram WordStem /@ {"playing", "played", "plays"} (* {"play", "play", "play"} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/WordStem.html) for more details. # XMLElement `XMLElement[tag, {attr1 -> val1, ...}, {data1, ...}]` represents an element in symbolic XML. Examples [#examples] Create an XML element: ```wolfram XMLElement["book", {"id" -> "1"}, {"Title of Book"}] ``` Nested elements: ```wolfram XMLElement["root", {}, {XMLElement["child", {}, {"content"}]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/XMLElement.html) for more details. # XMLObject `XMLObject["type"]` represents the head of an XML object in symbolic XML. Examples [#examples] Document declaration: ```wolfram XMLObject["Declaration"]["Version" -> "1.0"] ``` XML document: ```wolfram XMLObject["Document"][{}, XMLElement["root", {}, {}], {}] ``` Import XML: ```wolfram Import["file.xml", "XML"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/XMLObject.html) for more details. # XMLTemplate `XMLTemplate["string"]` yields a TemplateObject that represents an XML template to be applied using functions like `TemplateApply`. * `XMLTemplate[src]` uses File\[...], URL\[...] as the source for the string template. * `XMLTemplate[form, args]` yields a TemplateObject with arguments, suitable for cloud deployment or other evaluation. Examples [#examples] Create and apply an XML template: ```wolfram template = XMLTemplate["<item><name>`name`</name></item>"]; TemplateApply[template, <|"name" -> "Product"|>] ``` Load template from file: ```wolfram XMLTemplate[File["template.xml"]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/XMLTemplate.html) for more details. # Activate `Activate[expr]` replaces all instances of `Inactive[f]` in expr with f. `Activate[expr, patt]` replaces only instances of `Inactive[f]` for which f matches the pattern patt. Examples [#examples] Activate an inactive expression: ```wolfram Activate[Inactive[Plus][2, 3]] (* 5 *) ``` Selectively activate only certain functions: ```wolfram Activate[Inactive[Plus][Inactive[Times][2, 3], 4], Times] (* Inactive[Plus][6, 4] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Activate.html) for more details. # Algebraics `Algebraics` represents the domain of algebraic numbers, as in x∈Algebraics. Examples [#examples] Test if a number is algebraic: ```wolfram Element[Sqrt[2], Algebraics] (* True *) ``` Solve over algebraic numbers: ```wolfram Solve[x^2 == 2, x, Algebraics] (* {{x -> -Sqrt[2]}, {x -> Sqrt[2]}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Algebraics.html) for more details. # And `e1 && e2 && ...` is the logical AND function. It gives `False` immediately if any argument is `False`, and `True` if all are `True`. Examples [#examples] Logical AND: ```wolfram True && True (* True *) True && False (* False *) ``` With conditions: ```wolfram x = 5; x > 0 && x < 10 (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/And.html) for more details. # AtomQ `AtomQ[expr]` yields `True` if expr is an atomic expression that cannot be divided into subexpressions. Examples [#examples] Numbers are atoms: ```wolfram AtomQ[5] (* True *) ``` Symbols are atoms: ```wolfram AtomQ[x] (* True *) ``` Lists are not atoms: ```wolfram AtomQ[{1, 2, 3}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/AtomQ.html) for more details. # Between `Between[x, {min, max}]` is equivalent to `min ≤ x ≤ max`. `Between[{min, max}]` is an operator form that can be applied to an expression. Examples [#examples] Check if value is in range: ```wolfram Between[5, {0, 10}] (* True *) ``` ```wolfram Between[15, {0, 10}] (* False *) ``` Operator form: ```wolfram Select[{-5, 0, 5, 10, 15}, Between[{0, 10}]] (* {0, 5, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Between.html) for more details. # Boole `Boole[expr]` yields 1 if expr is True and 0 if it is False. Examples [#examples] Convert boolean to number: ```wolfram Boole[True] (* 1 *) Boole[False] (* 0 *) ``` Use in calculations: ```wolfram Boole[5 > 3] + Boole[2 > 4] (* 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Boole.html) for more details. # BooleanConvert `BooleanConvert[expr]` converts the Boolean expression expr to disjunctive normal form. `BooleanConvert[expr, form]` converts the Boolean expression expr to the specified form. `BooleanConvert[expr, form, cond]` finds an expression in the specified form that is equivalent to expr when cond is true. Examples [#examples] Convert to DNF: ```wolfram BooleanConvert[(a || b) && c] (* (a && c) || (b && c) *) ``` Convert to CNF: ```wolfram BooleanConvert[a || (b && c), "CNF"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanConvert.html) for more details. # BooleanCountingFunction `BooleanCountingFunction[kmax, n]` represents a Boolean function of n variables that gives True if at most kmax variables are True. `BooleanCountingFunction[{k}, n]` represents a function that gives True if exactly k variables are True. `BooleanCountingFunction[{kmin, kmax}, n]` represents a function that gives True if between kmin and kmax variables are True. Examples [#examples] At most 2 of 4 variables true: ```wolfram BooleanCountingFunction[2, 4][True, False, True, False] (* True *) ``` Exactly 2 variables true: ```wolfram BooleanCountingFunction[{2}, {a, b, c}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanCountingFunction.html) for more details. # BooleanFunction `BooleanFunction[k, n]` represents the kth Boolean function in n variables. `BooleanFunction[values]` represents the Boolean function corresponding to the specified vector of truth values. `BooleanFunction[spec, {a1, a2, ...}]` gives the Boolean expression in variables ai corresponding to the Boolean function specified by spec. Examples [#examples] The AND function: ```wolfram BooleanFunction[8, 2][a, b] (* a && b *) ``` From truth table: ```wolfram BooleanFunction[{0, 0, 0, 1}][a, b] (* a && b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanFunction.html) for more details. # BooleanGraph `BooleanGraph[bfunc, g1, ..., gn]` gives the Boolean graph defined by the Boolean function bfunc on the graphs g1, ..., gn. Examples [#examples] Intersection of two graphs: ```wolfram g1 = Graph[{1 -> 2, 2 -> 3}]; g2 = Graph[{2 -> 3, 3 -> 4}]; BooleanGraph[And, g1, g2] ``` Union of graphs: ```wolfram BooleanGraph[Or, g1, g2] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanGraph.html) for more details. # BooleanMaxterms `BooleanMaxterms[k, n]` represents the kth maxterm in n variables. `BooleanMaxterms[{k1, k2, ...}, n]` represents the conjunction of the maxterms ki. `BooleanMaxterms[spec, {a1, a2, ...}]` gives the Boolean expression in variables ai. Examples [#examples] A maxterm: ```wolfram BooleanMaxterms[2, {a, b, c}] (* a || !b || c *) ``` Conjunction of maxterms: ```wolfram BooleanMaxterms[{0, 3}, {a, b}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanMaxterms.html) for more details. # BooleanMinimize `BooleanMinimize[expr]` finds a minimal-length disjunctive normal form representation of expr. `BooleanMinimize[expr,form]` finds a minimal-length representation for expr in the specified form. `BooleanMinimize[expr,form,cond]` finds a minimal-length expression in the specified form that is equivalent to expr when cond is true. Examples [#examples] Minimize a Boolean expression: ```wolfram BooleanMinimize[(a || b) && (a || c)] (* a || (b && c) *) ``` Minimize to conjunctive normal form: ```wolfram BooleanMinimize[a || (b && c), "CNF"] (* (a || b) && (a || c) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanMinimize.html) for more details. # BooleanMinterms `BooleanMinterms[k, n]` represents the kth minterm in n variables. `BooleanMinterms[{k1, k2, ...}, n]` represents the disjunction of the minterms ki. `BooleanMinterms[spec, {a1, a2, ...}]` gives the Boolean expression in variables ai. Examples [#examples] A minterm: ```wolfram BooleanMinterms[2, {a, b, c}] (* !a && b && !c *) ``` Disjunction of minterms: ```wolfram BooleanMinterms[{0, 3}, {a, b}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanMinterms.html) for more details. # BooleanQ `BooleanQ[expr]` returns True if expr is either True or False. Examples [#examples] Test boolean values: ```wolfram BooleanQ[True] (* True *) BooleanQ[False] (* True *) ``` Non-boolean: ```wolfram BooleanQ[1] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanQ.html) for more details. # BooleanRegion `BooleanRegion[bfunc, {reg1, reg2, ...}]` represents the Boolean combination of regions. Examples [#examples] Intersection of circles: ```wolfram c1 = Disk[{0, 0}, 1]; c2 = Disk[{0.5, 0}, 1]; BooleanRegion[And, {c1, c2}] ``` Union: ```wolfram BooleanRegion[Or, {c1, c2}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanRegion.html) for more details. # BooleanTable `BooleanTable[bf]` gives a list of truth values for all possible combinations of variable values supplied to the Boolean function bf. `BooleanTable[expr, {a1, a2, ...}]` gives a list of truth values of the Boolean expression expr for all combinations of values of the ai. Examples [#examples] Truth table for AND: ```wolfram BooleanTable[a && b, {a, b}] (* {False, False, False, True} *) ``` Truth table for OR: ```wolfram BooleanTable[a || b, {a, b}] (* {False, True, True, True} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanTable.html) for more details. # BooleanVariables `BooleanVariables[expr]` gives a list of the Boolean variables in the Boolean expression expr. `BooleanVariables[bf]` gives the number of Boolean variables in the BooleanFunction object bf. Examples [#examples] ```wolfram BooleanVariables[a && b || c] (* {a, b, c} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/BooleanVariables.html) for more details. # Booleans `Booleans` represents the domain of Booleans, as in x∈Booleans. Examples [#examples] Test if a value is in the Booleans domain: ```wolfram Element[True, Booleans] (* True *) ``` ```wolfram Element[1, Booleans] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Booleans.html) for more details. # ByteCount `ByteCount[expr]` gives the number of bytes used internally by the Wolfram System to store expr. Examples [#examples] Check memory usage of expressions: ```wolfram ByteCount[{1, 2, 3, 4, 5}] (* 136 *) ``` Compare memory for different types: ```wolfram ByteCount[Range[1000]] (* 8056 *) ByteCount["Hello World"] (* 104 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ByteCount.html) for more details. # Complexes `Complexes` represents the domain of complex numbers, as in x∈Complexes. Examples [#examples] Specify that a variable is complex: ```wolfram Element[z, Complexes] (* z ∈ Complexes *) ``` Solve over the complex numbers: ```wolfram Solve[x^2 + 1 == 0, x, Complexes] (* {{x -> -I}, {x -> I}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Complexes.html) for more details. # Construct `Construct[f, x]` gives `f[x]`. `Construct[f, x1, ..., xn]` gives `f[x1, ..., xn]`. Examples [#examples] Apply a function dynamically: ```wolfram Construct[Plus, 1, 2, 3] (* 6 *) ``` Use with symbolic functions: ```wolfram Construct[f, a, b] (* f[a, b] *) ``` Useful for meta-programming: ```wolfram Map[Construct[#, 2] &, {Sin, Cos, Tan}] (* {Sin[2], Cos[2], Tan[2]} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Construct.html) for more details. # DefaultValues `DefaultValues[f]` gives a list of transformation rules corresponding to default values of f. `DefaultValues["symbol"]` gives a list of transformation rules corresponding to all default values defined for the symbol named "symbol" if it exists. Examples [#examples] Get default values for a function: ```wolfram f[x_, y_:0] := x + y; DefaultValues[f] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/DefaultValues.html) for more details. # Equal `lhs == rhs` returns `True` if lhs and rhs are identical. Examples [#examples] Numeric comparison: ```wolfram 5 == 5 (* True *) 3 == 4 (* False *) ``` Symbolic: ```wolfram x == x (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Equal.html) for more details. # EqualTilde `EqualTilde[x, y, ...]` displays as x≂y≂.... Examples [#examples] Display equal tilde notation: ```wolfram EqualTilde[a, b, c] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EqualTilde.html) for more details. # EqualTo `EqualTo[y]` is an operator form that yields x == y when applied to an expression x. Examples [#examples] Use as an operator: ```wolfram EqualTo[5][5] (* True *) ``` Filter equal elements: ```wolfram Select[{1, 2, 3, 4, 5}, EqualTo[3]] (* {3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EqualTo.html) for more details. # Equilibrium `Equilibrium[x, y, ...]` displays as x⇌y⇌.... Examples [#examples] Display equilibrium notation: ```wolfram Equilibrium[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Equilibrium.html) for more details. # Equivalent `Equivalent[e1, e2, ...]` represents the logical equivalence e1⇔e2⇔..., giving True when all of the ei are the same. Examples [#examples] Test logical equivalence: ```wolfram Equivalent[True, True] (* True *) ``` Mixed values: ```wolfram Equivalent[True, False] (* False *) ``` Simplify a logical expression: ```wolfram BooleanSimplify[Equivalent[p, q]] (* (p && q) || (!p && !q) *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Equivalent.html) for more details. # EvenQ `EvenQ[expr]` gives `True` if expr is an even integer, and `False` otherwise. Examples [#examples] Test if a number is even: ```wolfram EvenQ[4] (* True *) ``` ```wolfram EvenQ[7] (* False *) ``` Filter even numbers from a list: ```wolfram Select[Range[10], EvenQ] (* {2, 4, 6, 8, 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/EvenQ.html) for more details. # Exists `Exists[x, expr]` represents the statement that there exists a value of x for which expr is `True`. `Exists[x, cond, expr]` states that there exists an x satisfying the condition cond for which expr is `True`. `Exists[{x1, x2, ...}, expr]` states that there exist values for all the xi for which expr is `True`. Examples [#examples] Check for existence: ```wolfram Resolve[Exists[x, x^2 == 4]] (* True *) ``` Existence with a condition: ```wolfram Resolve[Exists[x, x > 0, x^2 == 4]] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Exists.html) for more details. # False `False` is the symbol for the Boolean value false. Examples [#examples] Logical operations: ```wolfram False && True (* False *) False || True (* True *) ``` Conditional: ```wolfram If[False, "yes", "no"] (* "no" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/False.html) for more details. # FindEquationalProof `FindEquationalProof[thm,axms]` tries to find an equational proof of the symbolic theorem thm using the axioms axms. `FindEquationalProof[thm,"theory"]` tries to find a proof of thm using the specified named axiomatic theory. Examples [#examples] ```wolfram (* Prove a group theory theorem *) FindEquationalProof[ ForAll[x, x * Inverse[x] == e], "GroupAxioms"] (* Use custom axioms *) axioms = {ForAll[{x, y}, f[x, y] == f[y, x]]}; FindEquationalProof[f[a, b] == f[b, a], axioms] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindEquationalProof.html) for more details. # FindFundamentalCycles `FindFundamentalCycles[g]` finds fundamental cycles of the graph g. Examples [#examples] ```wolfram FindFundamentalCycles[CycleGraph[5]] ``` ```wolfram FindFundamentalCycles[CompleteGraph[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindFundamentalCycles.html) for more details. # FindIntegerNullVector `FindIntegerNullVector[{x1,x2,…,xn}]` finds a list of integers ai such that a1 x1+a2 x2+⋯+an xn≈0. `FindIntegerNullVector[{x1,x2,…,xn},d]` finds a list of integers ai with ‖\{a1,…,an}‖≤d such that a1 x1+a2 x2+⋯+an xn≈0. Examples [#examples] Find an integer relation: ```wolfram FindIntegerNullVector[{1, Sqrt[2], Sqrt[3]}] ``` Find relation with Pi: ```wolfram FindIntegerNullVector[{Pi, E, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindIntegerNullVector.html) for more details. # FindIsomorphicSubgraph `FindIsomorphicSubgraph[g1,g2]` finds a subgraph of g1 that is isomorphic to g2. `FindIsomorphicSubgraph[g1,g2,n]` finds at most n subgraphs. Examples [#examples] ```wolfram (* Find a triangle subgraph *) g = RandomGraph[{10, 20}]; triangle = CycleGraph[3]; FindIsomorphicSubgraph[g, triangle] (* Find multiple matching subgraphs *) FindIsomorphicSubgraph[g, triangle, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindIsomorphicSubgraph.html) for more details. # FindLinearRecurrence `FindLinearRecurrence[list]` finds if possible the minimal linear recurrence that generates list. `FindLinearRecurrence[list,d]` finds if possible the linear recurrence of maximum order d that generates list. Examples [#examples] ```wolfram (* Find recurrence for Fibonacci sequence *) FindLinearRecurrence[{1, 1, 2, 3, 5, 8, 13, 21}] (* {1, 1} *) (* Find recurrence with maximum order *) FindLinearRecurrence[{1, 2, 4, 8, 16, 32}, 1] (* Verify the recurrence *) LinearRecurrence[{1, 1}, {1, 1}, 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindLinearRecurrence.html) for more details. # FindPermutation `FindPermutation[expr]` gives a permutation that produces expr by permuting `Sort[expr]`. `FindPermutation[expr1, expr2]` gives a permutation that converts expr1 to expr2. Examples [#examples] Find permutation from sorted: ```wolfram FindPermutation[{c, a, b}] (* Cycles[{{1, 2, 3}}] *) ``` Permutation between lists: ```wolfram FindPermutation[{a, b, c}, {c, a, b}] (* Cycles[{{1, 3, 2}}] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPermutation.html) for more details. # FindPostmanTour `FindPostmanTour[g]` finds a Chinese postman tour in the graph g of minimal length. * `FindPostmanTour[g,k]` finds at most k Chinese postman tours. * `FindPostmanTour[{v->w,…},…]` uses rules v->w to specify the graph g. Examples [#examples] ```wolfram (* Find a postman tour *) g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 4 <-> 1, 2 <-> 4}]; FindPostmanTour[g] (* Find multiple tours *) FindPostmanTour[g, 3] (* Visualize the tour *) tour = FindPostmanTour[g]; HighlightGraph[g, tour] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindPostmanTour.html) for more details. # FindShortestTour `FindShortestTour[{v1, v2, ...}]` attempts to find an ordering of the vi that minimizes the total distance on a tour that visits all the vi once. `FindShortestTour[graph]` attempts to find an ordering of the vertices in graph that minimizes the total length when visiting each vertex once. `FindShortestTour[{v1, v2, ...}, j, k]` finds an ordering of the vi that minimizes the total distance on a path from vj to vk. `FindShortestTour[graph, s, t]` finds an ordering of the vertices that minimizes the total length on a path from s to t. Examples [#examples] Find shortest tour through points: ```wolfram pts = RandomReal[1, {10, 2}]; FindShortestTour[pts] (* {length, {ordering}} *) ``` Tour in a graph: ```wolfram FindShortestTour[CompleteGraph[5]] (* {5, {1, 2, 3, 4, 5, 1}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FindShortestTour.html) for more details. # FiniteAbelianGroupCount `FiniteAbelianGroupCount[n]` gives the number of finite Abelian groups of order n. Examples [#examples] Count finite Abelian groups of order 12: ```wolfram FiniteAbelianGroupCount[12] ``` Count for a range of orders: ```wolfram Table[FiniteAbelianGroupCount[n], {n, 1, 20}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteAbelianGroupCount.html) for more details. # FiniteGroupCount `FiniteGroupCount[n]` gives the number of finite groups of order n. Examples [#examples] Count finite groups of order 8: ```wolfram FiniteGroupCount[8] ``` Compare with Abelian group counts: ```wolfram Table[{FiniteGroupCount[n], FiniteAbelianGroupCount[n]}, {n, 1, 12}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FiniteGroupCount.html) for more details. # FullForm `FullForm[expr]` prints as the full form of expr, with no special syntax. Examples [#examples] See full form of expressions: ```wolfram FullForm[a + b] (* Plus[a, b] *) FullForm[a/b] (* Times[a, Power[b, -1]] *) FullForm[{1, 2, 3}] (* List[1, 2, 3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/FullForm.html) for more details. # Greater `x > y` yields `True` if x is greater than y. `x1 > x2 > x3` yields `True` if the values form a strictly decreasing sequence. Examples [#examples] Comparison: ```wolfram 5 > 3 (* True *) 3 > 5 (* False *) ``` Chained comparison: ```wolfram 3 > 2 > 1 (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Greater.html) for more details. # GreaterEqual `x >= y` yields `True` if x is greater than or equal to y. Examples [#examples] Comparison: ```wolfram 5 >= 3 (* True *) 5 >= 5 (* True *) 4 >= 5 (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterEqual.html) for more details. # GreaterEqualLess `GreaterEqualLess[x, y, …]` displays as x⋛y⋛…. Examples [#examples] ```wolfram GreaterEqualLess[a, b, c] ``` ```wolfram GreaterEqualLess[1, 2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterEqualLess.html) for more details. # GreaterEqualThan `GreaterEqualThan[y]` is an operator form that yields x≥y when applied to an expression x. Examples [#examples] Use as an operator to test if values are greater than or equal to 5: ```wolfram Select[{3, 5, 7, 2, 8}, GreaterEqualThan[5]] (* {5, 7, 8} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterEqualThan.html) for more details. # GreaterFullEqual `GreaterFullEqual[x,y,…]` displays as x≧y≧…. Examples [#examples] Create a greater-or-equal chain: ```wolfram GreaterFullEqual[a, b, c] (* a ≧ b ≧ c *) ``` Use in an expression: ```wolfram GreaterFullEqual[5, 3, 1] (* 5 ≧ 3 ≧ 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterFullEqual.html) for more details. # GreaterGreater `GreaterGreater[x, y, …]` displays as x≫y≫…. Examples [#examples] ```wolfram GreaterGreater[a, b, c] ``` ```wolfram GreaterGreater[100, 10, 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterGreater.html) for more details. # GreaterLess `GreaterLess[x, y, …]` displays as x≷y≷…. Examples [#examples] ```wolfram GreaterLess[a, b, c] ``` ```wolfram GreaterLess[5, 3, 7] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterLess.html) for more details. # GreaterSlantEqual `GreaterSlantEqual[x, y, …]` displays as x⩾y⩾…. Examples [#examples] ```wolfram GreaterSlantEqual[a, b, c] ``` ```wolfram GreaterSlantEqual[10, 5, 5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterSlantEqual.html) for more details. # GreaterThan `GreaterThan[y]` is an operator form that yields `x > y` when applied to an expression x. Examples [#examples] Use as an operator: ```wolfram Select[{1, 3, 5, 7, 9}, GreaterThan[4]] (* {5, 7, 9} *) ``` With Map: ```wolfram GreaterThan[5] /@ {3, 5, 7} (* {False, False, True} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterThan.html) for more details. # GreaterTilde `GreaterTilde[x,y,...]` displays as x≳y≳.... Examples [#examples] Display the greater-tilde relation: ```wolfram GreaterTilde[a, b, c] (* a ≳ b ≳ c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/GreaterTilde.html) for more details. # Head `Head[expr]` gives the head of expr. Examples [#examples] Get the head of various expressions: ```wolfram Head[{1, 2, 3}] (* List *) Head[f[x, y]] (* f *) Head[5] (* Integer *) Head[3.14] (* Real *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Head.html) for more details. # HeadCompose `HeadCompose[a, b, c, d]` gives `a[b][c][d]`. Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HeadCompose.html) for more details. # HumpDownHump `HumpDownHump[x,y,…]` displays as x≎y≎…. Examples [#examples] Display the hump down hump relation: ```wolfram HumpDownHump[a, b, c] (* a ≎ b ≎ c *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HumpDownHump.html) for more details. # HumpEqual `HumpEqual[x, y, …]` displays as x ≏ y ≏ …. Examples [#examples] ```wolfram HumpEqual[a, b] ``` ```wolfram HumpEqual[x, y, z] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/HumpEqual.html) for more details. # Implies `Implies[p, q]` represents the logical implication p ⇒ q. Examples [#examples] Basic implication: ```wolfram Implies[True, False] (* False *) ``` Symbolic implication: ```wolfram Implies[a, b] // BooleanConvert (* !a || b *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Implies.html) for more details. # Inactivate `Inactivate[expr]` replaces all instances of *f* with `Inactive[f]` for symbols *f* used as heads in *expr*. * `Inactivate[expr, patt]` inactivates all symbols in *expr* that match the pattern *patt*. Examples [#examples] ```wolfram Inactivate[1 + 2 + 3] (* Inactive[Plus][1, 2, 3] *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inactivate.html) for more details. # Inactive `Inactive[f]` is an inactive form of f that does not evaluate. Examples [#examples] Create an inactive integral: ```wolfram Inactive[Integrate][x^2, x] ``` Activate the expression to evaluate it: ```wolfram Activate[Inactive[Integrate][x^2, x]] (* x^3/3 *) ``` Use inactive forms to represent unevaluated operations: ```wolfram Inactive[Plus][1, 2, 3] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inactive.html) for more details. # Inequality `Inequality` represents a sequence of relational statements. Examples [#examples] Chain inequalities: ```wolfram Inequality[1, Less, x, LessEqual, 5] (* 1 < x <= 5 *) ``` Use with Reduce: ```wolfram Reduce[Inequality[0, Less, x, Less, 1], x] (* 0 < x < 1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Inequality.html) for more details. # IntegerQ `IntegerQ[expr]` gives `True` if expr is an integer, and `False` otherwise. Examples [#examples] Test for integers: ```wolfram IntegerQ[5] (* True *) ``` ```wolfram IntegerQ[5.0] (* False *) ``` Filter integers from a list: ```wolfram Select[{1, 2.5, 3, 4.2, 5}, IntegerQ] (* {1, 3, 5} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/IntegerQ.html) for more details. # Integers `Integers` represents the domain of integers, as in x ∈ Integers. Examples [#examples] Use in solving equations: ```wolfram Solve[x^2 == 4, x, Integers] (* {{x -> -2}, {x -> 2}} *) ``` Domain specification: ```wolfram Element[n, Integers] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Integers.html) for more details. # Interpretation `Interpretation[e, expr]` represents an object that displays as e, but is interpreted as the unevaluated form of expr if supplied as input. * `Interpretation[{x = x0, y = y0, ...}, e, expr]` allows local variables x, y, … in e and expr. Examples [#examples] ```wolfram Interpretation[Style["π", Red], Pi] ``` ```wolfram Interpretation["click me", Button["Click", Print["Hello"]]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Interpretation.html) for more details. # LeafCount `LeafCount[expr]` gives the total number of indivisible subexpressions (atoms) in expr. Examples [#examples] Count atoms in an expression: ```wolfram LeafCount[{1, 2, 3}] (* 3 *) ``` Complex expressions: ```wolfram LeafCount[a + b*c] (* 3 *) LeafCount[x^2 + 3*x + 1] (* 6 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/LeafCount.html) for more details. # MandelbrotSetBoettcher `MandelbrotSetBoettcher[z]` gives the Böttcher coordinate of z with respect to the Mandelbrot set. The Böttcher coordinate maps the exterior of the Mandelbrot set conformally to the exterior of the unit disk. Examples [#examples] ```wolfram MandelbrotSetBoettcher[2 + I] ``` ```wolfram Abs[MandelbrotSetBoettcher[3]] ``` ```wolfram MandelbrotSetBoettcher[0.5 + 0.5 I] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MandelbrotSetBoettcher.html) for more details. # MultilaunchWarning `MultilaunchWarning` is a global option that specifies whether a warning is given when you try to modify user preferences while running two copies of the Wolfram System simultaneously. Examples [#examples] Disable the multilaunch warning: ```wolfram SetOptions[$FrontEnd, MultilaunchWarning -> False] ``` Check the current setting: ```wolfram CurrentValue[$FrontEnd, MultilaunchWarning] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/MultilaunchWarning.html) for more details. # Nand `Nand[e1, e2, ...]` is the logical NAND function. It evaluates its arguments in order, giving `True` immediately if any of them are `False`, and `False` if they are all `True`. Examples [#examples] ```wolfram Nand[True, True] (* False *) ``` ```wolfram Nand[True, False] (* True *) ``` ```wolfram Nand[False, False] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Nand.html) for more details. # Negative `Negative[x]` gives `True` if x is a negative number. Examples [#examples] Test for negative numbers: ```wolfram Negative[-5] (* True *) ``` ```wolfram Negative[3] (* False *) ``` Filter negative numbers: ```wolfram Select[{-2, -1, 0, 1, 2}, Negative] (* {-2, -1} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Negative.html) for more details. # NegativeDefiniteMatrixQ `NegativeDefiniteMatrixQ[m]` gives `True` if m is explicitly negative definite, and `False` otherwise. Examples [#examples] Test for negative definite: ```wolfram NegativeDefiniteMatrixQ[{{-2, 0}, {0, -1}}] (* True *) ``` Positive definite returns false: ```wolfram NegativeDefiniteMatrixQ[{{1, 0}, {0, 1}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeDefiniteMatrixQ.html) for more details. # NegativeIntegers `NegativeIntegers` represents the domain of strictly negative integers, as in x ∈ NegativeIntegers. Examples [#examples] Test membership: ```wolfram Element[-5, NegativeIntegers] (* True *) ``` Zero is not a negative integer: ```wolfram Element[0, NegativeIntegers] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeIntegers.html) for more details. # NegativeRationals `NegativeRationals` represents the domain of strictly negative rational numbers, as in x∈NegativeRationals. Examples [#examples] ```wolfram -3/4 ∈ NegativeRationals (* True *) ``` ```wolfram 1/2 ∈ NegativeRationals (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeRationals.html) for more details. # NegativeReals `NegativeReals` represents the domain of strictly negative real numbers. Examples [#examples] Test membership: ```wolfram Element[-3.14, NegativeReals] (* True *) ``` Zero is not negative: ```wolfram Element[0, NegativeReals] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeReals.html) for more details. # NegativeSemidefiniteMatrixQ `NegativeSemidefiniteMatrixQ[m]` gives True if m is explicitly negative semidefinite, and False otherwise. Examples [#examples] Test if a matrix is negative semidefinite: ```wolfram NegativeSemidefiniteMatrixQ[{{-1, 0}, {0, -2}}] (* True *) ``` ```wolfram NegativeSemidefiniteMatrixQ[{{1, 0}, {0, 2}}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativeSemidefiniteMatrixQ.html) for more details. # NegativelyOrientedPoints `NegativelyOrientedPoints[{p1,p2,p3,…,pn}]` tests whether the sequence of points p1,p2,p3,…,pn is negatively oriented. Examples [#examples] ```wolfram NegativelyOrientedPoints[{{0,0}, {1,0}, {0,1}}] (* False *) ``` ```wolfram NegativelyOrientedPoints[{{0,0}, {0,1}, {1,0}}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NegativelyOrientedPoints.html) for more details. # NonNegative `NonNegative[x]` gives `True` if x is a non-negative number (zero or positive). Examples [#examples] Test for non-negative numbers: ```wolfram NonNegative[5] (* True *) ``` ```wolfram NonNegative[0] (* True *) ``` ```wolfram NonNegative[-3] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonNegative.html) for more details. # NonPositive `NonPositive[x]` gives True if x is a non‐positive number. Examples [#examples] Test if a number is non-positive: ```wolfram NonPositive[-5] (* True *) NonPositive[0] (* True *) NonPositive[3] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonPositive.html) for more details. # NonPositiveIntegers `NonPositiveIntegers` represents the domain of non-positive integers, as in x ∈ NonPositiveIntegers. Examples [#examples] Test membership: ```wolfram Element[0, NonPositiveIntegers] (* True *) ``` Positive fails: ```wolfram Element[1, NonPositiveIntegers] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonPositiveIntegers.html) for more details. # NonPositiveRationals `NonPositiveRationals` represents the domain of non-positive rational numbers, as in x ∈ NonPositiveRationals. Examples [#examples] Test membership: ```wolfram Element[-1/2, NonPositiveRationals] (* True *) ``` Zero is included: ```wolfram Element[0, NonPositiveRationals] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonPositiveRationals.html) for more details. # NonPositiveReals `NonPositiveReals` represents the domain of non-positive real numbers. Examples [#examples] Test membership: ```wolfram Element[-1.5, NonPositiveReals] (* True *) ``` Positive fails: ```wolfram Element[0.5, NonPositiveReals] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NonPositiveReals.html) for more details. # NondimensionalizationTransform `NondimensionalizationTransform[eq, ovars, fvars]` nondimensionalizes *eq*, replacing original variables *ovars* with the variables *fvars*. * `NondimensionalizationTransform[eq, ovars, fvars, prop]` returns a property associated with the nondimensionalization of *eq*. Examples [#examples] ```wolfram NondimensionalizationTransform[x^2 + y^2 == 1, {x, y}, {u, v}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NondimensionalizationTransform.html) for more details. # Nor `Nor[e1,e2,…]` is the logical NOR function. It evaluates its arguments in order, giving False immediately if any of them are True, and True if they are all False. Examples [#examples] Nor of all False values: ```wolfram Nor[False, False, False] (* True *) ``` Nor with a True value: ```wolfram Nor[False, True, False] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Nor.html) for more details. # NorlundB `NorlundB[n, a]` gives Nørlund polynomials Bₙ(a) of degree *n* in *a*. * `NorlundB[n, a, x]` gives generalized Bernoulli polynomials Bₙ⁽ᵃ⁾(x). Examples [#examples] ```wolfram NorlundB[3, a] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NorlundB.html) for more details. # Not `!expr` is the logical NOT function. It gives `False` if expr is `True`, and `True` if it is `False`. Examples [#examples] Logical NOT: ```wolfram !True (* False *) !False (* True *) ``` With conditions: ```wolfram x = 5; !(x > 10) (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Not.html) for more details. # NotCongruent `NotCongruent[x, y, ...]` displays as x≢y≢.... Examples [#examples] Display a not congruent expression: ```wolfram NotCongruent[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NotCongruent.html) for more details. # Null `Null` is a symbol used to indicate the absence of an expression or a result. When it appears as a complete output expression, no output is printed. Examples [#examples] Suppress output: ```wolfram x = 5; (* returns Null, nothing printed *) ``` Explicit Null: ```wolfram {1, Null, 2, Null, 3} (* {1, Null, 2, Null, 3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Null.html) for more details. # NumberQ `NumberQ[expr]` gives `True` if expr is an explicit number, and `False` otherwise. Examples [#examples] Test explicit numbers: ```wolfram NumberQ[42] (* True *) ``` ```wolfram NumberQ[3.14] (* True *) ``` Symbolic constants are not explicit numbers: ```wolfram NumberQ[Pi] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumberQ.html) for more details. # NumericArray `NumericArray[array, type]` creates a numeric array of the specified type. * `NumericArray[array, type, method]` uses method to convert numbers into type. Examples [#examples] Create an integer array: ```wolfram NumericArray[{1, 2, 3}, "Integer32"] ``` Create a float array: ```wolfram NumericArray[{{1.0, 2.0}, {3.0, 4.0}}, "Real32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericArray.html) for more details. # NumericArrayQ `NumericArrayQ[expr]` gives True if expr is a valid NumericArray object, and False otherwise. * `NumericArrayQ[expr, tpatt]` requires additionally that `NumericArrayType[expr]` match the pattern tpatt. * `NumericArrayQ[expr, tpatt, dpatt]` requires additionally that `ArrayDepth[expr]` match the pattern dpatt. Examples [#examples] Check if an expression is a NumericArray: ```wolfram arr = NumericArray[{1, 2, 3}, "Integer32"]; NumericArrayQ[arr] ``` Verify type and depth: ```wolfram NumericArrayQ[arr, "Integer32", 1] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericArrayQ.html) for more details. # NumericArrayType `NumericArrayType[array]` gives the underlying type of values used for each element in the NumericArray object. Examples [#examples] Get the type of a numeric array: ```wolfram arr = NumericArray[{1, 2, 3}, "Integer32"]; NumericArrayType[arr] (* "Integer32" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericArrayType.html) for more details. # NumericFunction `NumericFunction` is an attribute that can be assigned to a symbol f to indicate that `f[arg1, arg2, ...]` should be considered a numeric quantity whenever all the argi are numeric quantities. Examples [#examples] ```wolfram SetAttributes[myFunc, NumericFunction] NumericQ[myFunc[1, 2]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericFunction.html) for more details. # NumericQ `NumericQ[expr]` gives `True` if expr is a numeric quantity, and `False` otherwise. Examples [#examples] Test numeric quantities: ```wolfram NumericQ[3.14] (* True *) ``` ```wolfram NumericQ[Pi] (* True *) ``` Symbolic expressions are not numeric: ```wolfram NumericQ[x + 1] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/NumericQ.html) for more details. # ObjectExistsQ `ObjectExistsQ` is a system symbol for checking if an object exists. Examples [#examples] ```wolfram ObjectExistsQ[x] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ObjectExistsQ.html) for more details. # OddQ `OddQ[expr]` gives `True` if expr is an odd integer, and `False` otherwise. Examples [#examples] Test if a number is odd: ```wolfram OddQ[7] (* True *) ``` ```wolfram OddQ[4] (* False *) ``` Filter odd numbers from a list: ```wolfram Select[Range[10], OddQ] (* {1, 3, 5, 7, 9} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OddQ.html) for more details. # OpaqueRawPointer `OpaqueRawPointer[addr]` represents an untyped pointer to the memory address addr. Examples [#examples] ```wolfram OpaqueRawPointer[16^^DEADBEEF] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OpaqueRawPointer.html) for more details. # OperationDeclaration `OperationDeclaration[type, op, typedfun]` declares a typed function to be used for the operation op of type. Examples [#examples] Declare an operation for a custom type: ```wolfram OperationDeclaration["MyType", Plus, myPlusFunction] ``` Register a compiled function for an operation: ```wolfram OperationDeclaration[type, Times, compiledMultiply] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OperationDeclaration.html) for more details. # Or `e1 || e2 || ...` is the logical OR function. It gives `True` immediately if any argument is `True`, and `False` if all are `False`. Examples [#examples] Logical OR: ```wolfram True || False (* True *) False || False (* False *) ``` With conditions: ```wolfram x = 15; x < 0 || x > 10 (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Or.html) for more details. # Order `Order[expr1, expr2]` gives 1 if expr1 is before expr2 in canonical order, and -1 if expr1 is after expr2 in canonical order. It gives 0 if expr1 is identical to expr2. Examples [#examples] Compare canonical ordering: ```wolfram Order[a, b] (* 1 *) ``` Identical expressions: ```wolfram Order[x^2, x^2] (* 0 *) ``` Reverse order: ```wolfram Order[b, a] (* -1 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Order.html) for more details. # OrderedQ `OrderedQ[h[e1, e2, …]]` gives `True` if the ei are in canonical order, and `False` otherwise. `OrderedQ[h[e1, e2, …], p]` uses the ordering function p. Examples [#examples] Check canonical order: ```wolfram OrderedQ[{a, b, c}] (* True *) ``` Not in order: ```wolfram OrderedQ[{c, a, b}] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrderedQ.html) for more details. # Orderless `Orderless` is an attribute that can be assigned to a symbol f to indicate that the elements in expressions of the form `f[e1, e2, …]` should automatically be sorted into canonical order. Examples [#examples] Define orderless function: ```wolfram SetAttributes[f, Orderless]; f[c, a, b] (* f[a, b, c] *) ``` Check attributes: ```wolfram Attributes[Plus] (* {Flat, Listable, NumericFunction, OneIdentity, Orderless, Protected} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Orderless.html) for more details. # OrderlessPatternSequence `OrderlessPatternSequence[p1, p2, ...]` is a pattern object that represents a sequence of arguments matching p1, p2, ... in any order. Examples [#examples] Match arguments in any order: ```wolfram f[a, b, c] /. f[OrderlessPatternSequence[b, a, c]] -> True (* True *) ``` Use with named patterns: ```wolfram {1, "x", 2} /. {OrderlessPatternSequence[x_Integer, y_String, z_Integer]} :> {x, y, z} ``` Match subset in any order: ```wolfram g[1, 2, 3] /. g[OrderlessPatternSequence[2, 1, rest___]] :> {rest} (* {3} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrderlessPatternSequence.html) for more details. # OrdinalScale `OrdinalScale[{cat1, cat2, ..., catn}]` represents a set of ordered categories cati with order cat1 \< cat2 \< … \< catn. * `OrdinalScale[{cat1, ..., catn}, {val1, ..., valn}]` associates the category cati with the numeric value vali. * `OrdinalScale[<|cat1 -> val1, ..., catn -> valn|>]` also associates the category cati with the numeric value vali. * `OrdinalScale[{cat1, ..., catn}, vals, {lab1, ..., labn}]` displays the category cati as the corresponding labi when used as a label in plots. Examples [#examples] ```wolfram OrdinalScale[{"Low", "Medium", "High"}] ``` ```wolfram OrdinalScale[<|"Small" -> 1, "Medium" -> 2, "Large" -> 3|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrdinalScale.html) for more details. # OrthogonalMatrix `OrthogonalMatrix[omat]` converts the orthogonal matrix omat to a structured array. Examples [#examples] Create an orthogonal matrix from a rotation: ```wolfram OrthogonalMatrix[RotationMatrix[Pi/4]] ``` Verify orthogonality: ```wolfram om = OrthogonalMatrix[RotationMatrix[Pi/3]]; om . Transpose[om] // Chop ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OrthogonalMatrix.html) for more details. # OwnValues `OwnValues[x]` gives a list of transformation rules corresponding to all ownvalues (direct values) defined for the symbol x. Examples [#examples] Get the value assigned to a symbol: ```wolfram x = 5; OwnValues[x] (* {HoldPattern[x] :> 5} *) ``` Compare with DownValues: ```wolfram f = 10; (* OwnValue *) f[x_] := x^2; (* DownValue *) OwnValues[f] (* {HoldPattern[f] :> 10} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/OwnValues.html) for more details. # ParametricFunction `ParametricFunction[pars,…]` represents a function that computes a solution when evaluated with numerical values for the parameters pars. Examples [#examples] Evaluate a parametric function with specific parameter values: ```wolfram pfun = ParametricNDSolveValue[{y'[x] == a y[x], y[0] == 1}, y, {x, 0, 1}, {a}]; pfun[2][0.5] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ParametricFunction.html) for more details. # PermutationLength `PermutationLength[perm]` returns the number of integers moved by the permutation perm. The length is the count of elements not in their original positions. Examples [#examples] ```wolfram PermutationLength[Cycles[{{1, 2, 3}}]] ``` ```wolfram PermutationLength[{2, 3, 1, 4}] ``` ```wolfram PermutationLength[Cycles[{}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PermutationLength.html) for more details. # Positive `Positive[x]` gives `True` if x is a positive number. Examples [#examples] Test for positive numbers: ```wolfram Positive[5] (* True *) ``` ```wolfram Positive[-3] (* False *) ``` Filter positive numbers: ```wolfram Select[{-2, -1, 0, 1, 2}, Positive] (* {1, 2} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Positive.html) for more details. # PositiveIntegers `PositiveIntegers` represents the domain of strictly positive integers, as in x ∈ PositiveIntegers. Examples [#examples] Test membership: ```wolfram Element[5, PositiveIntegers] (* True *) ``` Zero is not positive: ```wolfram Element[0, PositiveIntegers] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositiveIntegers.html) for more details. # PositiveRationals `PositiveRationals` represents the domain of strictly positive rational numbers, as in `x∈PositiveRationals`. Examples [#examples] ```wolfram Element[1/2, PositiveRationals] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositiveRationals.html) for more details. # PositiveReals `PositiveReals` represents the domain of strictly positive real numbers. Examples [#examples] Test if a number is in PositiveReals: ```wolfram Element[5, PositiveReals] (* True *) ``` Use in assumptions: ```wolfram Simplify[Sqrt[x^2], x ∈ PositiveReals] (* x *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositiveReals.html) for more details. # PositiveSemidefiniteMatrixQ `PositiveSemidefiniteMatrixQ[m]` gives `True` if m is explicitly positive semidefinite, and `False` otherwise. Examples [#examples] ```wolfram PositiveSemidefiniteMatrixQ[{{1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositiveSemidefiniteMatrixQ.html) for more details. # PositivelyOrientedPoints `PositivelyOrientedPoints[{p1, p2, p3, …, pd+1}]` tests whether the sequence of points p1, p2, p3, …, pd+1 is positively oriented. Examples [#examples] ```wolfram PositivelyOrientedPoints[{{0, 0}, {1, 0}, {0, 1}}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PositivelyOrientedPoints.html) for more details. # PossibleZeroQ `PossibleZeroQ[expr]` gives `True` if basic symbolic and numerical methods suggest that expr has value zero, and gives `False` otherwise. Examples [#examples] ```wolfram PossibleZeroQ[Sin[Pi]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/PossibleZeroQ.html) for more details. # ProofObject `ProofObject[…]` represents a proof object generated by `FindEquationalProof`. Examples [#examples] Generate a proof: ```wolfram proof = FindEquationalProof[a == c, {a == b, b == c}] (* ProofObject[...] *) ``` Extract the proof steps: ```wolfram proof["ProofGraph"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ProofObject.html) for more details. # QuestionGenerator `QuestionGenerator[<|name1 :> val1, name2 :> val2, ...|>, genfunc]` represents a QuestionObject generated by applying genfunc to the parameter association. Examples [#examples] ```wolfram QuestionGenerator[<|"a" :> RandomInteger[10], "b" :> RandomInteger[10]|>, QuestionObject["What is #a + #b?", InputField[]] &] ``` ```wolfram qg = QuestionGenerator[params, generateQuestion] qg[] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuestionGenerator.html) for more details. # QuestionInterface `QuestionInterface[type, <|p1 -> s1, p2 -> s2, ...|>]` defines an interface for a QuestionObject using the given type and properties pi with settings si. Examples [#examples] Create a multiple choice interface: ```wolfram QuestionInterface["MultipleChoice", <|"Choices" -> {"A", "B", "C"}|>] ``` Define a text input question: ```wolfram QuestionInterface["FreeForm", <|"Hint" -> "Enter your answer"|>] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuestionInterface.html) for more details. # QuestionObject `QuestionObject[q, assess]` represents the question q and the corresponding assessment assess. * `QuestionObject[assess]` derives a question from the assessment. Examples [#examples] ```wolfram QuestionObject["What is 2+2?", AssessmentFunction[4]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuestionObject.html) for more details. # QuestionSelector `QuestionSelector[{qo1, qo2, …}]` represents a list of questions from which one of the question objects qoi can be randomly selected. Examples [#examples] ```wolfram QuestionSelector[{QuestionObject["What is 1+1?", 2], QuestionObject["What is 2+2?", 4]}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/QuestionSelector.html) for more details. # RFixedPoints `RFixedPoints[eqn, a[n], n]` gives the fixed points for a recurrence equation. * `RFixedPoints[{eqn1, eqn2, ...}, {a1[n], a2[n], ...}, n]` gives the fixed points for a system of recurrence equations. Examples [#examples] ```wolfram RFixedPoints[a[n + 1] == 2 a[n] (1 - a[n]), a[n], n] ``` ```wolfram RFixedPoints[a[n + 1] == a[n]^2, a[n], n] ``` ```wolfram RFixedPoints[{x[n + 1] == y[n], y[n + 1] == x[n]}, {x[n], y[n]}, n] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RFixedPoints.html) for more details. # RStabilityConditions `RStabilityConditions[eqn, a[n], n]` gives the fixed points and stability conditions for a recurrence equation. * `RStabilityConditions[{eqn1, eqn2, ...}, {a1[n], a2[n], ...}, n]` gives the fixed points and stability conditions for a system of recurrence equations. * `RStabilityConditions[{eqn1, eqn2, ...}, {a1[n], a2[n], ...}, n, {pnt1, pnt2, ...}]` gives stability conditions only for the given fixed points. This function analyzes the stability of recurrence equations. Examples [#examples] ```wolfram RStabilityConditions[a[n + 1] == r*a[n]*(1 - a[n]), a[n], n] ``` ```wolfram RStabilityConditions[x[n + 1] == 2 x[n] - x[n]^2, x[n], n] ``` ```wolfram RStabilityConditions[{x[n + 1] == x[n] + y[n], y[n + 1] == x[n]*y[n]}, {x[n], y[n]}, n] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RStabilityConditions.html) for more details. # Rationals `Rationals` represents the domain of rational numbers, as in x ∈ Rationals. Examples [#examples] Test membership: ```wolfram Element[3/4, Rationals] (* True *) ``` Pi is not rational: ```wolfram Element[Pi, Rationals] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Rationals.html) for more details. # RawMemoryAllocate `RawMemoryAllocate[type]` allocates enough raw memory to store a binary representation of the specified type. * `RawMemoryAllocate[type, len]` allocates memory for len objects. Examples [#examples] ```wolfram RawMemoryAllocate["Integer32", 10] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryAllocate.html) for more details. # RawMemoryExport `RawMemoryExport[expr]` exports a raw memory representation of expr. * `RawMemoryExport[expr, type]` uses the specified element type when returning an array. Examples [#examples] ```wolfram RawMemoryExport[{1, 2, 3, 4}] ``` ```wolfram RawMemoryExport[Image[RandomReal[1, {10, 10}]], "Real32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryExport.html) for more details. # RawMemoryFree `RawMemoryFree[ptr]` frees the raw memory at a pointer ptr. Examples [#examples] ```wolfram ptr = RawMemoryAllocate["Integer64", 10]; RawMemoryFree[ptr] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryFree.html) for more details. # RawMemoryImport `RawMemoryImport[ptr, format]` imports raw memory from the pointer ptr with the specified format. * `RawMemoryImport[format]` represents an operator form of `RawMemoryImport` that can be applied to an expression. Examples [#examples] ```wolfram ptr = RawMemoryAllocate["UnsignedInteger8", 10]; RawMemoryImport[ptr, "UnsignedInteger8"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryImport.html) for more details. # RawMemoryRead `RawMemoryRead[ptr]` reads raw memory from the pointer ptr. `RawMemoryRead[ptr, offset]` reads from an offset pointer. Examples [#examples] ```wolfram ptr = RawMemoryAllocate["Integer32", 10]; RawMemoryRead[ptr] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryRead.html) for more details. # RawMemoryWrite `RawMemoryWrite[ptr, val]` writes a binary representation of val to the raw memory at the pointer ptr. `RawMemoryWrite[ptr, val, offset]` writes to an offset pointer. Examples [#examples] ```wolfram ptr = RawMemoryAllocate["Integer32", 10]; RawMemoryWrite[ptr, 42] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawMemoryWrite.html) for more details. # RawPointer `RawPointer[addr, type]` represents a raw pointer to the specified *type* at the memory address *addr*. Examples [#examples] ```wolfram ptr = RawMemoryAllocate["Integer32", 4]; RawPointer[ptr, "Integer32"] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RawPointer.html) for more details. # Resolve `Resolve[expr]` attempts to resolve expr into a form that eliminates `ForAll` and `Exists` quantifiers. * `Resolve[expr, dom]` works over the domain dom. Common choices of dom are `Complexes`, `Reals`, and `Booleans`. Examples [#examples] ```wolfram Resolve[Exists[x, x^2 == 4], Reals] ``` ```wolfram Resolve[ForAll[x, x^2 >= 0], Reals] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Resolve.html) for more details. # RightCosetRepresentative `RightCosetRepresentative[group, g]` returns the smallest element in the right coset of products of the elements of *group* by *g*. Examples [#examples] ```wolfram RightCosetRepresentative[SymmetricGroup[4], Cycles[{{1, 2}}]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RightCosetRepresentative.html) for more details. # RollPitchYawAngles `RollPitchYawAngles[r]` gives the roll-pitch-yaw angles \{α, β, γ} corresponding to the rotation matrix r. * `RollPitchYawAngles[r, {a, b, c}]` gives the roll-pitch-yaw angles \{α, β, γ} corresponding to rotation order \{a, b, c}. Examples [#examples] Get angles from rotation matrix: ```wolfram RollPitchYawAngles[RotationMatrix[Pi/4, {0, 0, 1}]] ``` Specify rotation order: ```wolfram RollPitchYawAngles[rotMatrix, {3, 2, 1}] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/RollPitchYawAngles.html) for more details. # SameQ `lhs === rhs` yields `True` if the expression lhs is identical to rhs, and `False` otherwise. Examples [#examples] Test for identical expressions: ```wolfram {1, 2, 3} === {1, 2, 3} (* True *) ``` Symbolic equality vs identity: ```wolfram x === x (* True *) ``` ```wolfram 1.0 === 1 (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SameQ.html) for more details. # SatisfiabilityCount `SatisfiabilityCount[bf]` counts the number of possible combinations of variable values that yield `True` when supplied as arguments to the Boolean function bf. * `SatisfiabilityCount[expr, {a1, a2, ...}]` counts the number of possible combinations of the ai that make the Boolean expression expr be true. This function counts the satisfying assignments of a Boolean formula. Examples [#examples] ```wolfram SatisfiabilityCount[a || b] ``` ```wolfram SatisfiabilityCount[a && b && c, {a, b, c}] ``` ```wolfram SatisfiabilityCount[(a || b) && (!a || c), {a, b, c}] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SatisfiabilityCount.html) for more details. # SatisfiabilityInstances `SatisfiabilityInstances[bf]` attempts to find a choice of variables that makes the Boolean function bf yield True. `SatisfiabilityInstances[expr,{a1,a2,…}]` attempts to find a choice of the ai that makes the Boolean expression expr be True. `SatisfiabilityInstances[…,…,m]` attempts to find m choices of variables that yield True. Examples [#examples] Find a satisfying assignment for a Boolean expression: ```wolfram SatisfiabilityInstances[a && (b || !c), {a, b, c}] (* {{True, True, True}} *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SatisfiabilityInstances.html) for more details. # SatisfiableQ `SatisfiableQ[bf]` gives True if a combination of values of variables exists that makes the Boolean function bf yield True. `SatisfiableQ[expr, {a1, a2, ...}]` gives True if a combination of values of the ai exists that makes the Boolean expression expr yield True. Examples [#examples] Check if formula is satisfiable: ```wolfram SatisfiableQ[a && b] (* True *) ``` Unsatisfiable formula: ```wolfram SatisfiableQ[a && !a] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SatisfiableQ.html) for more details. # SmithDelayCompensator `SmithDelayCompensator[sys, con]` gives the Smith compensator for the time-delay system sys and the delay-free controller con. Examples [#examples] Create Smith compensator: ```wolfram sys = TransferFunctionModel[Exp[-s]/(s + 1), s]; con = TransferFunctionModel[2, s]; SmithDelayCompensator[sys, con] ``` For a process with delay: ```wolfram SmithDelayCompensator[ TransferFunctionModel[Exp[-2 s]/(s^2 + s + 1), s], TransferFunctionModel[s + 1, s] ] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SmithDelayCompensator.html) for more details. # Square `Square[x]` displays as x. Examples [#examples] Display the square notation: ```wolfram Square[a] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Square.html) for more details. # StructuredArray `StructuredArray[st, {d1, d2, ...}, data]` represents a d1×d2×… array with structure type st and specific content data. Structured arrays efficiently store arrays with special structure (symmetric, antisymmetric, etc.). Examples [#examples] ```wolfram StructuredArray[SymmetricMatrix, {3, 3}, {1, 2, 3, 4, 5, 6}] ``` ```wolfram StructuredArray[DiagonalMatrix, {3, 3}, {1, 2, 3}] ``` ```wolfram Normal[StructuredArray[SymmetricMatrix, {2, 2}, {a, b, c}]] ``` \*See the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/StructuredArray.html) for more details. # SubValues `SubValues[f]` gives a list of transformation rules corresponding to all subvalues (values for f\[...]\[...]...) defined for the symbol f. Examples [#examples] Define and retrieve subvalues: ```wolfram f[x_][y_] := x + y; SubValues[f] (* {HoldPattern[f[x_][y_]] :> x + y} *) ``` Check subvalues of a symbol: ```wolfram g[a_][b_][c_] := a*b*c; SubValues[g] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/SubValues.html) for more details. # TautologyQ `TautologyQ[bf]` gives True if all combinations of values of variables make the Boolean function bf yield True. `TautologyQ[expr, {a1, a2, ...}]` gives True if all combinations of values of the ai make the Boolean expression expr yield True. Examples [#examples] Check for tautology: ```wolfram TautologyQ[a || !a] (* True *) ``` Non-tautology: ```wolfram TautologyQ[a && b] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TautologyQ.html) for more details. # ToInvertibleTimeSeries `ToInvertibleTimeSeries[tproc]` returns an invertible version of a time series process tproc. Examples [#examples] Convert an MA process to invertible form: ```wolfram ToInvertibleTimeSeries[MAProcess[{1.5}, 1]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ToInvertibleTimeSeries.html) for more details. # True `True` is the symbol for the Boolean value true. Examples [#examples] Logical operations: ```wolfram True && True (* True *) True || False (* True *) ``` Conditional: ```wolfram If[True, "yes", "no"] (* "yes" *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/True.html) for more details. # TrueQ `TrueQ[expr]` yields `True` if expr is explicitly `True`, and `False` otherwise. Examples [#examples] Test for True: ```wolfram TrueQ[True] (* True *) ``` ```wolfram TrueQ[False] (* False *) ``` Unevaluated expressions give False: ```wolfram TrueQ[x > 0] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/TrueQ.html) for more details. # UnateQ `UnateQ[bexpr, {x1, x2, ...}]` tests whether the Boolean expression bexpr is positive unate in the variables x1, x2, .... `UnateQ[bexpr, {Not[x1], Not[x2], ...}]` tests whether the Boolean expression bexpr is negative unate in the variables. Examples [#examples] Test if an expression is positive unate: ```wolfram UnateQ[a || b, {a, b}] (* True *) ``` Test for negative unateness: ```wolfram UnateQ[!a && !b, {Not[a], Not[b]}] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnateQ.html) for more details. # Unequal `lhs != rhs` returns `True` if lhs and rhs are not identical. Examples [#examples] Numeric comparison: ```wolfram 3 != 4 (* True *) 5 != 5 (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Unequal.html) for more details. # UnequalTo `UnequalTo[y]` is an operator form that yields x ≠ y when applied to an expression x. Examples [#examples] ```wolfram UnequalTo[5][3] ``` ```wolfram Select[{1, 2, 3, 4, 5}, UnequalTo[3]] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnequalTo.html) for more details. # UnsameQ `lhs =!= rhs` yields `True` if the expression lhs is not identical to rhs, and `False` otherwise. Examples [#examples] Test for non-identical expressions: ```wolfram 1.0 =!= 1 (* True *) ``` ```wolfram {1, 2} =!= {1, 2} (* False *) ``` Different symbols: ```wolfram x =!= y (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UnsameQ.html) for more details. # UpEquilibrium `UpEquilibrium[x, y, …]` displays as x⥮y⥮…. Examples [#examples] ```wolfram UpEquilibrium[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpEquilibrium.html) for more details. # UpValues `UpValues[f]` gives a list of transformation rules corresponding to all upvalues (definitions for expressions containing `f`) defined for the symbol f. Examples [#examples] Define an upvalue: ```wolfram g /: h[g] = 42; UpValues[g] (* {HoldPattern[h[g]] :> 42} *) ``` Upvalues allow a symbol to define how other functions handle it: ```wolfram myType /: Length[myType[args___]] := Length[{args}]; Length[myType[a, b, c]] (* 3 *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/UpValues.html) for more details. # ValueQ `ValueQ[expr]` gives `True` if a value has been defined for expr, and gives `False` otherwise. Examples [#examples] ```wolfram x = 5; ValueQ[x] (* True *) ``` ```wolfram ValueQ[y] (* False *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/ValueQ.html) for more details. # VerticalTilde `VerticalTilde[x, y, ...]` displays as x≀y≀…. Examples [#examples] ```wolfram VerticalTilde[a, b] ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/VerticalTilde.html) for more details. # Xor `Xor[e1, e2, ...]` is the logical XOR (exclusive OR) function. It gives `True` if an odd number of the ei are `True`. Examples [#examples] Basic XOR: ```wolfram Xor[True, False] (* True *) Xor[True, True] (* False *) Xor[False, False] (* False *) ``` Multiple arguments: ```wolfram Xor[True, True, True] (* True *) ``` Something isn't working? [Report](https://github.com/WLJSTeam/wljs-notebook/issues) an issue. Please visit the official [Wolfram Language Reference](https://reference.wolfram.com/language/ref/Xor.html) for more details. # Overview > Visualize your Ideas <div className="invertColor"> <img alt="" src={__img0} /> </div> To start - import the context to anyhting expect `Global`: ```wolfram Needs["AnimationFramework`" -> "af`"] // Quiet ``` > **AF** is a build-in library of WLJS Notebook for creating complex event-driven 2D animations in a functional style. You create all necessary primitives by yourself combining well-known expressions of Wolfram Language. **AF** only provides a set of helper tools to organize your workflow, its fundament is based on existing features [WLJS can offer](./../../Guides/Dynamic). What is included? [#what-is-included] * Automatic object-like management, layers * Animated transitions (linear, cubic, custom function) * Workers, loops and helper structures * Timeline GUI * Recorder (only for desktop application) Basic Example [#basic-example] Let's describe what should happen each frame: ```wolfram title="make a scene" scene = af`Scene[]; scene // Framed ``` Use [projection feature](./../../Overview) of the input cell to render your scene in a separate window ```wolfram title="describe logic" animation = AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Opacity[#o], Translate[ Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] , #c] }, { "o" -> 0., "r" -> 0., "c" -> {0,0} }]; af`Animate[scene, d, {"o" -> 1.0,"r" -> 3.14}, "Ease", 1.0] // Await; PauseAsync[0.4] // Await; af`Animate[scene, d, {"c"->{0.5,0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{-0.5,0.5}, "r"->4.2}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.5,-0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.,0.}, "o"->0., "r"->0}, "Ease", 1.0] // Await; af`Remove[d]; "The End" ]]; Then[animation[scene], Speak]; ``` <div className="invertColor"> <img alt="" src={__img1} /> </div> Emoji pistol shooting crystals [#emoji-pistol-shooting-crystals] Here is fun one using workers: <details> ```wolfram mainScene = af`Scene[ImageSize->2 {500,400}]; kill = InputButton["Stop"] ``` ```wolfram animateShooting[mainScene, kill]; ``` ```wolfram shoot = AsyncFunction[{scene, layer, d, crystal, p, target}, Module[{s, pos}, pos = p; With[ {angle = Sign[target[[2]] - p[[2]]] ArcCos[{-1, 0}.Normalize[target - p]]}, af`Animate[scene, d, "r" -> angle, "Linear", 0.2] // Await; s = af`AddTo[layer, { Pink, Opacity[#o], Line[{#origin, #target}] }, { "origin" -> pos, "target" -> pos, "o" -> 0.0 }]; af`Animate[scene, s, { "target" -> target, "o" -> 1.0 }, "Linear", 0.2] // Await; af`Update[scene, s, {"origin" -> target}]; { af`Animate[scene, s, { "target" -> {1.5, RandomReal[{-1, 1}]}, "o" -> 0.0 }, "Linear", 0.3], af`Animate[scene, crystal, { "o" -> 0.1, "s" -> 1.5 }, "QuadOut", 0.15] } // Await; af`Remove[s]; ] ] ]; addCrystal = AsyncFunction[scene, Module[{c}, c = With[{pos = {RandomReal[{-1.0, 0.4}], -2.0}}, { af`AddTo[scene, { Opacity[#o], Translate[ Scale[ Rotate[ { Directive[FontSize -> 20], Text["💎", {0, 0}, {0, 0}] }, RandomReal[{0, 6.}] ], #s ], #p ] }, { "p" -> pos, "s" -> 1.0, "o" -> 1.0 }], pos } ]; c[[2]] = {c[[2]][[1]], RandomReal[{-0.2, 0.9}]}; af`Animate[scene, c[[1]], "p" -> c[[2]], "CubicInOut", 1.0] // Await; c ] ]; animateShooting = AsyncFunction[{scene, kill}, Module[{d, worker, bg}, bg = af`Layer[scene, SVGGroup[{#children}]]; d = af`AddTo[scene, { Translate[ Rotate[ { Directive[FontSize -> 34], Text["🔫", {0, 0}, {0, 1}] }, #r, {0.05, 0.0} ], {0.6568339538574219, 0.06299530029296868} ] }, { "r" -> 0. }]; worker = af`Worker[scene, AsyncFunction[Null, Module[{crystal}, crystal = addCrystal[scene] // Await; shoot[ scene, bg, d, crystal[[1]], {0.6568339538574219, 0.06299530029296868}, crystal[[2]] ] // Await; ] ]]; kill // Await; af`Finish[worker] // Await; af`Remove[worker]; af`Remove[scene]; ] ]; ``` </details> <div className="invertColor"> <img alt="" src={__img2} /> </div> Not all graphics primitives or their properties **are animatable** or **appendable**. Please check if the primitive support `Offload` in the header of the reference page of a given symbol. Real World Examples [#real-world-examples] There are not that many of them. This framework was originally created for the sake of this [YouTube Short](https://www.youtube.com/watch?v=vTrVGam84m8). Limitations [#limitations] * Not possible to export the animation to [HTML](./../../Share/Standalone-HTML) or MDX. # Recording Any animation sequence can be rendered to the sequence of images. Since graphical canvas can include a mixture of an arbitrary expressions containing HTML elements, SVG, WebGL canvas we rely on the direct render of Chromium Engine on-page: * You keep the notebook open (probably fullscreen) * Animating is played **lively** at lower speeds to achieve higher frame rates * Chromium is taking screenshots of the area of the scene and saves them on the disk This feature is only available for WLJS Notebook **desktop application** Tips [#tips] * Use `PauseAsync` with `scene` object provided ```wolfram ...your timeline ❌ PauseAsync[3] // Await ✅ PauseAsync[scene, 3] // Await ``` This allows to lock the time with the frame rate How to record? [#how-to-record] Let's try with a simple example Step 1 [#step-1] Import a library and define an animation timeline: ```wolfram Needs["AnimationFramework`"->"af`"]; ``` ```wolfram timeline = AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Opacity[#o], Translate[ Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] , #c] }, { "o" -> 0., "r" -> 0., "c" -> {0,0} }]; af`Animate[scene, d, {"o" -> 1.0,"r" -> 3.14}, "Ease", 1.0] // Await; PauseAsync[scene, 0.4] // Await; af`Animate[scene, d, {"c"->{0.5,0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{-0.5,0.5}, "r"->4.2}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.5,-0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.,0.}, "o"->0., "r"->0}, "Ease", 1.0] // Await; af`Remove[d]; ]]; ``` Step 2 [#step-2] ```wolfram r = af`RecordAnimation[animation, ImageSize->Large, FrameRate->60]; ``` To start recording - evaluate `r` and resize the notebook **to fit the render window**: ```wolfram r ``` <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div> Step 3 [#step-3] Once the rendering has been finished, you can see the exported series: ```wolfram r["OutputDirectory"] // SystemOpen ``` Step 4 (Optional) [#step-4-optional] Make a video using Wolfram Standard library ```wolfram af`RecorderToVideo[r] ``` # Reference Note, that you need to import this library to any context expect `Global` ```wolfram Needs["AnimationFramework`"->"af`"]; ``` Scene [#scene] ```wolfram af`Scene[opts___] _Scene ``` constructs the main object `Scene`, where animation is going to be rendered. It also serves the purpose of a hosting object for primitives, animations, workers and etc. The local coordinates are limited to $\pm 1$ for the square aspect ratio, otherwise the smallest side takes is scaled to 1: <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div> Scenes can be reused multiple times in different animations. Options [#options] ImageSize [#imagesize] By the default is `Medium`. "TimeMarkers" [#timemarkers] Sets the time markers from the [Timeline](./Timeline) "GlobalDirectives" [#globaldirectives] Adds a provided list to the scene globally (set font size globally and etc) Other options [#other-options] The rest is inherited from [Graphics](./../../Graphics/Graphics). `PlotRange`, `ImageSizeRaw`, cannot be changed. Animation Flow [#animation-flow] All animations on the scene should follows the pattern: * append objects * animate * remove objects By design most of methods and functions of AF framework return [Promise](./../../Misc/Promise) expression. In this regard, it makes sense to describe your animation flow using [Asynchronous Functions](./../Asynchronous-programming): ```wolfram AsyncFunction[scene, Module[{}, ... ]][scene]; ``` Supported methods [#supported-methods] * [AddTo](#AddTo) * [Remove](#Remove) AddTo [#addto] The most important method for the animation scene or to a layer: ```wolfram title="immutable object" af`AddTo[_Scene | layer_, primitives_] _af`Private`entity ``` ```wolfram title="object with mutable properties" af`AddTo[_Scene | layer_, primitives_, { prop1_String -> value1_, ... }] _af`Private`entity ``` where `primitives` can be any 2D graphics object, or an expression, that produces graphics objects or your custom written [frontend symbol](./../Frontend-functions/Overview) that support `.update` method. `AddTo` function works for both: [Scene](#Scene) and [Layer](#Layer) objects Mutable properties are embed using `Slot` expression aka ```wolfram Primitive[#prop1, #prop2] ... ``` Basic example: ```wolfram disk = af`AddTo[scene, {Red, Disk[{0,0}, 1]}]; ``` However, *it does not have any mutable properties*. Here is another example ```wolfram disk = af`AddTo[scene, {Red, Disk[#pos, #r]}, { "pos" -> {0.,0.}, "r" -> 0.5 }]; ``` On the created entity the following methods are supported Supported methods [#supported-methods-1] * [Update](#Update) * [Animate](#Animate) * [Remove](#Remove) Update [#update] Assigns a new value to a given property or list of properties ```wolfram title="assign 1 value" af`Update[scene_Scene, entity_, prop_String -> newValue_ ..] ``` ```wolfram title="assign set of values" af`Update[scene_Scene, entity_, { prop1_String -> val1_, ... }] ``` ```wolfram af`Update[entity_, {__Rule}] ``` The action will be applied immediately without easing. For example: ```wolfram disk = af`AddTo[scene, {Red, Disk[#pos, #r]}, { "pos" -> {0.,0.}, "r" -> 0.5 }]; ``` ```wolfram af`Update[scene, disk, "pos"->RandomReal[{-1,1}, 2]]; ``` Remove [#remove] Removes a single object or object from the scene or in a layer (including all children) ```wolfram title="remove a single object" af`Remove[_af`Private`entity | _af`Private`runner | _af`Private`worker] ``` ```wolfram title="remove a layer with children" af`Remove[layer_af`Private`entity] ``` ```wolfram title="remove all obejcts in the scene" af`Remove[_Scene] ``` `Remove` acting on `Scene` does not remove the scene itself, but it disposes all objects added to it including the nested ones (layers). Use it as a fast way to clean up the scene. Animate [#animate] It animates the transition of a property or set of properties with a given easing function on the scene ```wolfram af`Animate[scene_Scene, entity_, prop_String -> value_, easing_:"CubicInOut", duration_:1] _Promise ``` ```wolfram af`Animate[scene_Scene, entity_, { prop1_String -> value1_, prop2_String -> value2_, ... }, easing_:"CubicInOut", duration_:1] _Promise ``` where `easing` is function used for animating the transition: * `"Linear"` * `"CubicInOut"` or `"Ease"` * `"QuadIn"` * `"QuadOut"` * `"LinearEuclidean"` (usually used for colors) * `Function[{t, initial, current, target}, ...]` and `duration` is given in **seconds**. In addition `Animate` can be applied to any held `_Symbol`: ```wolfram af`Animate[scene_Scene, Hold[symbol_], newValue_, easing_:"CubicInOut", duration_:1] _Promise ``` or a [Layer](#Layer) entity ```wolfram af`Animate[scene_Scene, layer_, prop_String->newValue_, easing_:"CubicInOut", duration_:1] _Promise ``` `Animate` always returns `Promise`, which is resolved when the animation is finished, i.e.: *wait for the animation to be finished* ```wolfram af`Animate[scene, object, "prop"->1.0] // Await; ``` *wait for multiple animations to be finished* ```wolfram { af`Animate[scene, object1, "prop"->1.0], af`Animate[scene, object2, "prop"->1.0], }// Await; ``` For animating multiple properties of **the same object** - use ```wolfram af`Animate[scene, object1, {"prop1"->1.0, "prop2"->3.0}] ``` Animation is done fully using Wolfram Kernel (no Javascript easing is involved) at the maximum available frame rate (dynamic). For example: ```wolfram scene = af`Scene[]; scene ``` ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Opacity[#o], Translate[ Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] , #c] }, { "o" -> 0., "r" -> 0., "c" -> {0,0} }]; af`Animate[scene, d, {"o" -> 1.0,"r" -> 3.14}, "Ease", 1.0] // Await; PauseAsync[1] // Await; af`Animate[scene, d, {"o"->0., "r"->0}, "Ease", 1.0] // Await; af`Remove[d]; ]][scene]; ``` Supported property types [#supported-property-types] * `Real`, `Integer` * `List` of integers, reals * `List` of `List` and etc * `String` with numbers inside In principle anything, which can be combined with multiplication and sum can work as a property value. Strings [#strings] String interpolation is done in steps: * exploding string into string and number-like string * convert number-like strings into array * interpolate a array (using easing function) between the original and target value (transformed from a string) * compose back into a string For example, one can easily animate the following SVG attribute ```wolfram scene = af`Scene[]; scene ``` ```wolfram AsyncFunction[scene, Module[{layer}, layer = af`Layer[scene, { SVGAttribute[#children, "style"->#style] }, {"style" -> "filter: blur(0px)"}]; af`AddTo[layer, Table[{RandomColor[], Disk[RandomReal[{-1,1},2], 1.0]}, {10}]]; af`Animate[scene, layer, "style"->"filter: blur(100px)", "Ease", 5]//Await; af`Remove[layer]; ]][scene]; ``` Layer [#layer] It creates an isolated group of objects (layer): ```wolfram title="no mutable props" af`Layer[scene_Scene | layer_, body_] _af`Private`entity ``` ```wolfram title="mutable props" af`Layer[scene_Scene | layer_, body_, { prop1_String -> value1_, ... }] _af`Private`entity ``` where `body` is defined similar to one in [AddTo](#AddTo): ```wolfram { Opacity[0.5], #children } ``` or ```wolfram { Opacity[#opacity], Translate[#children, #coordinates] } ``` where `#children` is **a special reserved slot** to specify where to append children. **You can append objects similar to `Scene` using [AddTo](#AddTo) expression**: ```wolfram layer = af`Layer[scene, { Opacity[#opacity], Translate[#children, #coordinates] }, {"opacity" -> 0.5, "coordinates"->{0,0}}]; af`AddTo[layer, Table[{RandomColor[], Disk[RandomReal[{-0.2,0.2},2], 0.05]}, {10}]]; ``` Z-ordering [#z-ordering] To preserve z-order of your primitives, one can use `Layer` together with [SVGGroup](./../../Graphics/SVGGroup). Supported methods [#supported-methods-2] * [AddTo](#AddTo) * [Update](#Update) * [Animate](#Animate) * [Remove](#Remove) Loop [#loop] It create custom animation loop, which is repeated until manually removed ```wolfram af`Loop[scene_Scene, entity_, property_String, function_, duration_:1] _af`Private`runner ``` where `function` should have the following form: ```wolfram Function[{t, prevValue, cycleNumber}, ] ``` Here `t` goes from `0` to `1` in `duration` seconds, and `cycleNumber` represents the number of rounds passed. `function` is fired every frame How to stop a loop [#how-to-stop-a-loop] Before removing a loop animation call `Await` [Finish](#Finish) on the loop object to wait until the cycle is fully finished. `Finish` returns promise, which is resolved on the end of the current cycle. This will help to avoid abrupt stop of the loop. For example ```wolfram scene = af`Scene[]; scene stop = InputButton["Stop"] ``` ```wolfram AsyncFunction[scene, Module[{d, loop}, d = af`AddTo[scene, { Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] }, { "r" -> 0. }]; loop = af`Loop[scene, d, "r", Function[{t, o, n}, 3.14 t + (n-1) 3.14 ], 2]; stop // Await; af`Finish[loop] // Await; af`Remove[loop]; PauseAsync[0.5] // Await; af`Remove[d]; ]][scene] ``` Supported methods [#supported-methods-3] * [Remove](#Remove) * [Finish](#Finish) Worker [#worker] Workers are similar to [Loop](#Loop)s, but allow to execute an arbitrary code concurrently with the main animation on each frame: ```wolfram af`Worker[scene_Scene, function_] _af`Private`worker ``` where `function` has the following form ```wolfram Function[absoluteTime, ...] ``` You can place an entire new animation sequence to a worker as [Asynchronous Functions](./../Asynchronous-programming): ```wolfram AsyncFunction[absoluteTime, ...] ``` `function` is called every frame, but only after the execution of the previous `function` call is finished. `absoluteTime` is a time in seconds passed after the worker has been created. For example: ```wolfram scene = af`Scene[]; scene stop = InputButton["Stop"] ``` ```wolfram AsyncFunction[scene, Module[{d, worker}, d = af`AddTo[scene, { Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] }, { "r" -> 0. }]; worker = af`Worker[scene, AsyncFunction[Null, af`Animate[scene, d, "r"->Pi/2] // Await; af`Animate[scene, d, "r"->-Pi/2] // Await; ]]; stop // Await; af`Finish[worker] // Await; af`Remove[worker]; PauseAsync[0.5] // Await; af`Remove[d]; ]][scene] ``` How to stop a worker [#how-to-stop-a-worker] Before removing a worker call `Await` [Finish](#Finish) on the worker object to wait until the execution is fully finished (as on the example above). `Finish` returns promise, which is resolved on the end of the current cycle. This will help to avoid abrupt stop. Supported methods [#supported-methods-4] * [Remove](#Remove) * [Finish](#Finish) Component [#component] Adds to a scene or layer an object similar to [AddTo](#AddTo) with custom update and remove functions ```wolfram af`Component[s_Scene | layer_, { "Update" -> update_Function, "Remove" -> remove_Function }, { prop1_String -> value1_, ... }] _af`Private`entity ``` where `remove` and `update` are called with an association argument, containing all defined properties. Supported methods [#supported-methods-5] * [Animate](#Animate) * [Update](#Update) * [Remove](#Remove) CameraRig [#camerarig] It is a special object allowing to animate and set camera zoom and pan: ```wolfram af`CameraRig[scene_Scene] _af`Private`entity ``` it returns a similar object to [AddTo](#AddTo), which is removable, animatable and etc - see below. Properties [#properties] There are two hidden properties: * `"zoom"` by the default is `1.0` * `"position"` by the default is `{0,0}` Supported methods [#supported-methods-6] * [Animate](#Animate) * [Update](#Update) * [Remove](#Remove) Finish [#finish] ```wolfram af`Finish[worker_ | loop_ | _Promise] _Promise ``` It is a special promise generator used for waiting for various events: * [Loop](#Loop) has finished the cycle of animation * [Worker](#Worker) has finished the function execution Any `Promise` object will be returned without changes. **It only makes sense to use it with `Await` expression**: ```wolfram af`Finish[worker1] // Await ``` or multiple events ```wolfram { af`Finish[worker1], af`Finish[worker2] } // Await ``` RecordAnimation [#recordanimation] Read more at [Recording](./Recording) page To render the animation into the sequence of images: ```wolfram af`RecordAnimation[animationFunction_, opts___] _af`Private`recorder ``` where `animationFunction` is your async animation function, that accepts `Scene` object and `opts` are the same as for [Scene](#Scene) including extra: * `FrameRate` - frames per second (`60` by the default) * `GeneratedAssetLocation` - by the default is `$TemporalDirectory` * `GeneratedAssetFormat` - format for rendered sequence: `"PNG"`, `"JPEG"` * `CompressionLevel` - by the default is `0.2` (applicable only for JPEG) * `"TimeMarkers"` - sets the time markers from the [Timeline](./Timeline) * `"StaggerDelay"` - sets an extra delay in milliseconds before capturing a frame (by the default is set to 30) Properties [#properties-1] `recorder` object provides the following fields: * `"GeneratedAssetLocation"` - path to sequence * `"Recording"` - status TimelinedAnimation [#timelinedanimation] Read more at [Timeline](./Timeline) page To play an animation with a graphical timeline attached: ```wolfram af`RecordAnimation[animationFunction_, opts___] _af`Private`timelined ``` <div className="invertColor"> <img alt="" src={__img1} placeholder="blur" /> </div> where `animationFunction` is your async animation function, that accepts `Scene` object and `opts` are the same as for [Scene](#Scene) including extra: * `"TimeMarkers"` - sets the time markers from the [Timeline](./Timeline) * `"AudioClips"` - restores recorded voice overs Note, `RecordAnimation` has `HoldFirst` attribute. Properties [#properties-2] `timelined` object provides the following fields: * `"TimeMarkers"` - current time markers * `"AudioClips"` - gets audio clips from the timeline * `"AudioClipsAsync"` - gets audio clips from the timeline Utilities [#utilities] Color [#color] ```wolfram af`Color[_Hue | _RGBColor | _LABColor] _List ``` a color conversion tool, which turns any color representation to a list of RGB values. This comes handy with [RGBColor](./../../Graphics/RGBColor), since to update it you need to provide a list instead of an actual color: ```wolfram {RGBColor[#color], ...} ``` then when you update ```wolfram af`Animate[... "color"->af`Color[Red], ...] ``` PauseAsync [#pauseasync] A modified version of system default `PauseAsync` with extra argument ```wolfram PauseAsync[scene_Scene, n_Integer | n_Real] _Promise ``` Here the time delay will be in sync with [Scene](#Scene). It makes sense during the [Recording](./Recording) process, where the actual time is fixed with a frame rate. Delayed [#delayed] Pattern 1 [#pattern-1] A generator of delay wrappers ```wolfram af`Delayed[scene_Scene, duration_] _Function ``` The returned function can be applied to any other expression to delay its execution (including [Asynchronous Functions](./../Asynchronous-programming)). Returns `Promise`. For example: ```wolfram g = af`Delayed[scene, 1]; g[af`Animate[scene, object, "prop"->1.0, "Linear", 1.0]] // Await; ``` Pattern 2 [#pattern-2] Using 3 arguments: ```wolfram af`Delayed[function_, scene_Scene, duration_] _Promise ``` RecorderToVideo [#recordertovideo] It converts `recorder` object to [Video](./../../Video/Video) **after the rendering is finished** ```wolfram af`RecorderToVideo[_af`Private`recorder] _Video ``` Marker [#marker] A helper to wait or extract property from [Timeline](./Timeline) markers *wait for the marker* ```wolfram af`Marker[scene_Scene, name_String] _Promise af`Marker[scene_Scene, name_String, "Start"] _Promise ``` *wait for the end of the marker* ```wolfram af`Marker[scene_Scene, name_String, "End"] _Promise ``` *take duration in seconds* ```wolfram af`Marker[scene_Scene, name_String, "Duration"] _Real ``` AudioFromClips [#audiofromclips] A helper function to convert a list of audio clips (voice overs) retrieved from the properties of `timelined` object to a single audio object: ```wolfram af`AudioFromClips[clips_List] ``` For example: ```wolfram af`AudioFromClips[t["AudioClips"]] ``` where `t` is your [TimelinedAnimation](#TimelinedAnimation) object # Timeline **AF** provides a GUI element for timing and adjusting the events on the timeline filling some gaps between programmatic approach for animations and visual like in a typical video editor: <div className="invertColor"> <img alt="" src={__img0} /> </div> You are still working with `AsyncFunction` functions. Timeline is an external addition to that. Quick start [#quick-start] Let's create a timeline: ```wolfram Needs["AnimationFramework`"->"af`"]; ``` ```wolfram t = af`TimelinedAnimation[animationFunction]; t ``` There are some key aspects of working with a timeline: * The duration of your playback is defined by the total time needed for executing your **animationFunction** (which has to be [Asynchronous Function](./../Asynchronous-programming)) * `TimelinedAnimation` has `HoldFirst` attribute and **PLAY** button releases it and evaluates animation function symbol provided. I.e. when you update the definition of `animationFunction`, **you do not need to reevaluate** `TimelinedAnimation` * Seeking the position on the timeline is done via artificially speeding up time of the scene, since animation function may have internal states. * Use `PauseAsync` with `scene` argument provided, otherwise the animation will be un-synced with the timeline. Now define a basic animation sequence for now without a direct connection with a timeline: ```wolfram animationFunction = AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Opacity[#o], Translate[ Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] , #c] }, { "o" -> 0., "r" -> 0., "c" -> {0,0} }]; af`Animate[scene, d, {"o" -> 1.0,"r" -> 3.14}, "Ease", 1.0] // Await; PauseAsync[scene, 0.4] // Await; af`Animate[scene, d, {"c"->{0.5,0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{-0.5,0.5}, "r"->4.2}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.5,-0.5}}, "Ease", 1.0] // Await; af`Animate[scene, d, {"c"->{0.,0.}, "o"->0., "r"->0}, "Ease", 1.0] // Await; af`Remove[d]; ]]; ``` Now hit *PLAY* button: <div className="invertColor"> <img alt="" src={__img1} placeholder="blur" /> </div> When focused on the timeline: * `Spacebar` - play/pause Time markers [#time-markers] To place a time marker - **double click**: <div className="invertColor"> <img alt="" src={__img2} placeholder="blur" /> </div> * All marker must have a **unique label** * Double click on a marker to remove it * Each marker has a duration, you can change it by dragging a gizmo on the right * Timeline rows have no effect and exists only for the user convenience in placing overlapping markers A user can can reference the markers from `Scene` object in two possible ways in the animation function: 1. As a pause *wait for the marker* ```wolfram af`Marker[scene, "M1"] // Await; ``` *wait for the end of the marker* ```wolfram af`Marker[scene, "M1", "End"] // Await; ``` 2. As a quantity ```wolfram af`Marker[scene, "M1", "Duration"] ``` This will return a number in seconds. Example [#example] Let us transform our previous animation to use marker events ```wolfram animationFunction = AsyncFunction[scene, Module[{d, u}, d = af`AddTo[scene, { Opacity[#o], Translate[ Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] , #c] }, { "o" -> 0., "r" -> 0., "c" -> {0,0} }]; af`Marker[scene, "appear"] // Await; af`Animate[scene, d, {"o" -> 1.0,"r" -> 3.14}, "Ease", af`Marker[scene, "appear", "Duration"]] // Await; af`Marker[scene, "move1"] // Await; af`Animate[scene, d, {"c"->{0.5,0.5}}, "Ease", af`Marker[scene, "move1", "Duration"]] // Await; af`Marker[scene, "move2"] // Await; af`Animate[scene, d, {"c"->{-0.5,0.5}, "r"->4.2}, "Ease", af`Marker[scene, "move2", "Duration"]] // Await; af`Marker[scene, "move3"] // Await; af`Animate[scene, d, {"c"->{0.5,-0.5}}, "Ease", af`Marker[scene, "move3", "Duration"]] // Await; af`Marker[scene, "remove"]//Await; af`Animate[scene, d, {"c"->{0.,0.}, "o"->0., "r"->0}, "Ease", af`Marker[scene, "remove", "Duration"]] // Await; af`Remove[d]; ]]; ``` And then place those markers on the timeline: <div className="invertColor"> <img alt="" src={__img3} placeholder="blur" /> </div> Here is serialized version of all markers from the screenshot above: ```wolfram <|"move1"-><|"uid"->"move1","time"->2.0757575757575757`,"duration"->0.8787878787878788`,"track"->48|>,"appear"-><|"uid"->"appear","time"->1,"duration"->1.07`,"track"->72|>,"move2"-><|"uid"->"move2","time"->2.9846153846153847`,"duration"->0.9242424242424242`,"track"->72|>,"move3"-><|"uid"->"move3","time"->4,"duration"->0.9242424242424242`,"track"->72|>,"remove"-><|"uid"->"remove","time"->5,"duration"->1,"track"->48|>|> ``` See how to restore / store markers position in the section [Export markers](#Export%20markers). Now if you hit a playback button it will play the animation according to your time markers: <LazyAutoplayVideo url={"/TimelineAnimation-3e0642b6070910d5c2a7eba00680281d.mp4"} /> Export markers [#export-markers] Access the object `t` created by `TimelinedAnimation` animation expression ```wolfram t["TimeMarkers"] ``` Restore markers [#restore-markers] To import time markers to a new scene or `TimelinedAnimation` provide `"TimeMarkers"` options. For example: *import to the scene* ```wolfram s = af`Scene["TimeMarkers" -> ...]; ``` *import to the scene in TimelinedAnimation* ```wolfram t = af`TimelinedAnimation[ animationFunction, "TimeMarkers" -> ... ]; ``` *import to recorder object* ```wolfram r = af`RecordAnimation[ animationFunction, ImageSize->Large, FrameRate->120, "TimeMarkers" -> ... ]; ``` Recording [#recording] 1. Export your existing markers following [Export markers](#Export%20markers) 2. Following the guide [Recording](./Recording) provide an options to `RecordAnimation` expression (see [Import markers](#Import%20markers)) with exported timeline markers Voice-over [#voice-over] You can record voice-overs directly to the timeline: <div className="invertColor"> <img alt="" src={__img4} placeholder="blur" /> </div> In general it does not matter on which track you place it. Voice clips do not interferer with regular time markers and has to be exported / imported separately. This functionality serves a purpose of roughly aligning the timing of your animation with your audio narratives, which can be later polished in a professional video editing software. Recording [#recording-1] Find a place on a timeline and hit `Voice` button to start recording. Press stop to stop it. Exporting [#exporting] To export you can simply read a property of a timeline object: ```wolfram clips = t["AudioClips"] ``` Then you can merge it into a single audio file for later production: ```wolfram af`AudioFromClips[clips] ``` This will contain an [Audio](./../../Sound/Audio) object, which can be exported to be used in other video-editing programs. Restoring [#restoring] To restore clips for a new session or a timeline object - provide clips as an options to the constructor: ```wolfram t = af`TimelinedAnimation[ animationFunction, "TimeMarkers" -> ..., "AudioClips" -> clips ]; ``` # Tutorial Let's learn how to make animations step by step: ```wolfram Needs["AnimationFramework`" -> "af`"] // Quiet ``` Create a scene ```wolfram s = af`Scene[]; Framed[s] ``` AF works only with 2D primitives used in `Graphics` expression Animation Flow [#animation-flow] All animations on the scene should follows the pattern: * append objects * animate * remove objects By design most of methods and functions of AF framework return [Promise](./../../Misc/Promise) expression. In this regard, it makes sense to describe your animation flow using [Asynchronous Functions](./../../Misc/Async). A advanced guide on how write async functions </Cards> Basics [#basics] Append and move [#append-and-move] Append and move a disk on the scene: <div className="invertColor"> <img alt="" src={__img0} /> </div> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, Disk[#pos, 0.1], { "pos" -> {-1,0} }]; af`Animate[scene, d, "pos"->{1,0}, "QuadOut", 1.5] // Await; af`Remove[d]; ]][s]; ``` Combine animations of two properties: <div className="invertColor"> <img alt="" src={__img1} /> </div> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, Disk[#pos, #r], { "pos" -> {-1,0}, "r"->0.1 }]; af`Animate[scene, d, { "pos"->{1,0}, "r"->1.0 }, "QuadOut", 1.5] // Await; af`Remove[d]; ]][s]; ``` Animate two objects at the same time: <div className="invertColor"> <img alt="" src={__img2} /> </div> ```wolfram AsyncFunction[scene, Module[{d,r}, r = af`AddTo[scene, {Red, Translate[Rotate[ Rectangle[0.2{-1,-1}, 0.2{1,1}] , #angle], #pos]}, { "pos" -> {1.5,1.5}, "angle" -> 0. }]; d = af`AddTo[scene, {Blue, Disk[#pos, 0.1]}, { "pos" -> {-1.5,0} }]; { af`Animate[scene, d, "pos"->{0,0}, "QuadOut", 1.5], af`Animate[scene, r, { "pos"->{0,0}, "angle"->2Pi }, "QuadOut", 1.5] }// Await; af`Remove[d]; af`Remove[r]; ]][s]; ``` Timings [#timings] Try different easing functions: <div className="invertColor"> <img alt="" src={__img3} /> </div> ```wolfram AsyncFunction[scene, Module[{d,label}, d = af`AddTo[scene, {Blue, Disk[#pos, 0.1]}, { "pos" -> {-0.8,0} }]; label = af`AddTo[scene, {Text[#text, {0,0.2}, {0,0}]}, {"text"->"QuadOut"} ]; af`Animate[scene, d, "pos"->{0.8,0}, "QuadOut", 2] // Await; af`Update[scene, d, "pos"->{-0.8,0}]; af`Update[scene, label, "text"->"QuadIn"]; af`Animate[scene, d, "pos"->{0.8,0}, "QuadIn", 2] // Await; af`Update[scene, d, "pos"->{-0.8,0}]; af`Update[scene, label, "text"->"CubicInOut"]; af`Animate[scene, d, "pos"->{0.8,0}, "CubicInOut", 2] // Await; af`Update[scene, d, "pos"->{-0.8,0}]; af`Update[scene, label, "text"->"Linear"]; af`Animate[scene, d, "pos"->{0.8,0}, "Linear", 2] // Await; af`Remove[d]; af`Remove[label]; ]][s]; ``` Use pauses: <div className="invertColor"> <img alt="" src={__img4} /> </div> ```wolfram AsyncFunction[scene, Module[{r}, r = af`AddTo[scene, {Red, Translate[Rotate[ Rectangle[0.2{-1,-1}, 0.2{1,1}] , #angle], #pos]}, { "pos" -> {1.5,1.5}, "angle" -> 0. }]; af`Animate[scene, r, "pos"->{0,0}, "CubicInOut", 1] // Await; PauseAsync[scene, 0.2] // Await; af`Animate[scene, r, "angle"->Pi/4, "CubicInOut", 0.4] // Await; PauseAsync[scene, 0.2] // Await; af`Animate[scene, r, "pos"->{-0.5,0}, "CubicInOut", 1] // Await; PauseAsync[scene, 0.2] // Await; { af`Animate[scene, r, "angle"->Pi/2, "CubicInOut", 1], af`Animate[scene, r, "pos"->{-0.5,-0.5}, "CubicInOut", 1] } // Await; { af`Animate[scene, r, "angle"->(Pi/2 + Pi/4), "CubicInOut", 1], af`Animate[scene, r, "pos"->{0.5,-0.5}, "CubicInOut", 1] } // Await; { af`Animate[scene, r, "angle"->(Pi/2 + Pi/2), "CubicInOut", 1], af`Animate[scene, r, "pos"->{0.5,0.5}, "CubicInOut", 1] } // Await; { af`Animate[scene, r, "angle"->(10Pi), "CubicInOut", 4], af`Animate[scene, r, "pos"->{0,0}, "CubicInOut", 1] } // Await; PauseAsync[scene, 2] // Await; af`Remove[r]; ]][s]; ``` Turn repeating elements into async functions [#turn-repeating-elements-into-async-functions] Using the pervious examples on [Timings](#Timings) we can simplify the code: ```wolfram animateStuff = AsyncFunction[{s, d, l, type}, ( af`Update[s, d, "pos"->{-0.8,0}]; af`Update[s, l, "text"->type]; af`Animate[s, d, "pos"->{0.8,0}, type, 2] // Await; )]; AsyncFunction[scene, Module[{d,label}, d = af`AddTo[scene, {Blue, Disk[#pos, 0.1]}, { "pos" -> {-0.8,0} }]; label = af`AddTo[scene, {Text[#text, {0,0.2}, {0,0}]}, {"text"->""} ]; animateStuff[scene, d, label, "QuadOut"] // Await; animateStuff[scene, d, label, "QuadIn"] // Await; animateStuff[scene, d, label, "CubicInOut"] // Await; animateStuff[scene, d, label, "Linear"] // Await; af`Remove[d]; af`Remove[label]; ]][s]; ``` Animating more properties [#animating-more-properties] Animate [Opacity](./../../Graphics/Opacity) for adding or removing an objects: <div className="invertColor"> <img alt="" src={__img5} /> </div> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, {Opacity[#o], Red, Disk[#pos, 0.1]}, { "pos" -> {-0.5,0}, "o"->0 }]; af`Animate[scene, d, "o"->1.0, "Linear", 0.2] // Await; af`Animate[scene, d, "pos"->{0.5,0}, "Ease", 1.5] // Await; PauseAsync[scene, 0.5] // Await; af`Animate[scene, d, "o"->0.0, "Linear", 0.2] // Await; af`Remove[d]; ]][s]; ``` To interpolate color of the object we use `"LinearEuclidean"` to get the correct gamma of the intermediate colors: <div className="invertColor"> <img alt="" src={__img6} /> </div> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, {Opacity[#o], RGBColor[#c], Disk[#pos, 0.1]}, { "pos" -> {-0.5,0}, "o"->0, "c"->af`Color[Red] }]; af`Animate[scene, d, "o"->1.0, "Linear", 0.2] // Await; { af`Animate[scene, d, "c"->af`Color[Blue], "LinearEuclidean", 1.5], af`Animate[scene, d, "pos"->{0.5,0}, "Linear", 1.5] } // Await; PauseAsync[scene, 0.5] // Await; af`Animate[scene, d, "o"->0.0, "Linear", 0.2] // Await; af`Remove[d]; ]][s]; ``` Background animation: <div className="invertColor"> <img alt="" src={__img7} /> </div> ```wolfram AsyncFunction[scene, Module[{bg,text}, bg = af`AddTo[scene, { RGBColor[#c], Opacity[#o], Rectangle[{-2,-2}, {2,2}] }, { "o"->0., "c"->af`Color[Pink] }]; text = af`AddTo[scene, {White, Text[Style["Hello World", FontSize->68], {0,0}, {0,0}]}]; af`Animate[scene, bg, "o"->1.0, "CubicInOut", 0.5] // Await; PauseAsync[scene, 0.3] // Await; af`Animate[scene, bg, "c"->af`Color[Lighter[Magenta]], "LinearEuclidean", 0.5] // Await; PauseAsync[scene, 0.3] // Await; af`Animate[scene, bg, "c"->af`Color[Lighter[Brown]], "LinearEuclidean", 0.5] // Await; PauseAsync[scene, 0.3] // Await; af`Animate[scene, bg, "o"->0.0, "CubicInOut", 0.5] // Await; af`Remove[bg]; af`Remove[text]; ]][s]; ``` Layers [#layers] [Layer](./Reference#Layer) are used for grouping multiple objects. All properties do not propagate to the objects in the group, but applied to the container. You can animate: * `Opacity` * `Rotate` * `Translate` * `Scale` * `SVGAttribute` There is a special key-property for placing children objects `#children`. Methods used for operating groups are similar to `Scene` and to a regular object. For example: <div className="invertColor"> <img alt="" src={__img8} /> </div> ```wolfram AsyncFunction[scene, Module[{layer}, layer = af`Layer[scene, { Opacity[#opacity], Scale[#children, #scale] }, {"opacity" -> 0., "scale"->1.0}]; af`AddTo[layer, Table[{RandomColor[], Disk[RandomReal[{-0.2,0.2},2], 0.05]}, {10}]]; af`Animate[scene, layer, "opacity"->1.0, "Linear", 0.5] // Await; af`Animate[scene, layer, "scale"->3.0, "QuadOut", 0.5] // Await; af`Animate[scene, layer, "scale"->0.1, "QuadIn", 0.5] // Await; af`Remove[layer]; ]][s]; ``` Apply directly any CSS style: <div className="invertColor"> <img alt="" src={__img9} /> </div> ```wolfram AsyncFunction[scene, Module[{layer}, layer = af`Layer[scene, { SVGAttribute[#children, "style"->#style] }, {"style"->"filter: blur(0px)"}]; af`AddTo[layer, Table[{RandomColor[], Disk[RandomReal[{-0.5,0.5},2], 0.05]}, {10}]]; af`Animate[scene, layer, "style"->"filter: blur(100px)", "Linear", 2] // Await; af`Remove[layer]; ]][s]; ``` `Animate` does support string interpolation By removing the layer object you will removes all children as well External events [#external-events] Any `EventObject` or `Promise` can be used a trigger for your animation: <div className="invertColor"> <img alt="" src={__img10} /> </div> ```wolfram next = InputButton["Next"] ``` ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Disk[#pos, #r], Hue[0.3], Circle[#pos, #r #r] }, {"pos"->{0.,0.}, "r"->0.001} ]; next // Await; af`Animate[scene, d, "r"->0.5, "CubicInOut", 1] // Await; next // Await; af`Animate[scene, d, "r"->0.0001, "CubicInOut", 1] // Await; af`Remove[d]; ]][s]; ``` Embed foreign objects [#embed-foreign-objects] For general case you need to use [Inset](./../../Graphics/Inset). Embed a graph: <div> <img alt="" src={__img11} /> </div> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Translate[Scale[ Rotate[Inset[Plot[x, {x,0,1}, ImageSize->Small]], #a], 0.5 ], #pos] }, {"pos"->{2.0,0.}, "a"->0} ]; af`Animate[scene, d, { "pos"->{0,0}, "a"->2Pi }, "CubicInOut", 1] // Await; PauseAsync[scene, 1] // Await; af`Remove[d]; ]][s]; ``` `Inset` is pixel-perfect and it does not autoscale. Results might depend on pixel-density of the screen. To avoid that use `ImageSizeRaw` instead of `ImageSize` on `Graphics`-like objects Medium [#medium] Combining with Offload [#combining-with-offload] `AddTo` method effectively uses `Offload` technique for aniamting things. It means you can still use it in any animated object A guide on interactive evaluation, updates and animation </Cards> `Animate` method can animate an arbitrary dynamic-symbol as well: <div className="invertColor"> <img alt="" src={__img12} /> </div> ```wolfram AsyncFunction[scene, Module[{d, pos = {2,0}, a = 0.}, d = af`AddTo[scene, { Translate[ Rotate[ Text["Hello World", {0,0}, {0,0}] , Offload[a]] , Offload[pos]] }]; { af`Animate[scene, Hold[pos], {0,0}, "CubicInOut", 1], af`Animate[scene, Hold[a], 2Pi, "CubicInOut", 1] } // Await; PauseAsync[scene, 1] // Await; af`Remove[d]; ]][s]; ``` <details> <summary> Equivalent using AF only </summary> ```wolfram AsyncFunction[scene, Module[{d}, d = af`AddTo[scene, { Translate[Rotate[Text["Hello World", {0,0}, {0,0}], #a], #pos] }, {"pos"->{2.0,0.}, "a"->0} ]; af`Animate[scene, d, { "pos"->{0,0}, "a"->2Pi }, "CubicInOut", 1] // Await; PauseAsync[scene, 1] // Await; af`Remove[d]; ]][s]; ``` </details> An example, where we combine both approaches to avoid extra `Translate` function: <div className="invertColor"> <img alt="" src={__img13} /> </div> ```wolfram AsyncFunction[scene, Module[{d, pos = {2,0}, a = 0.}, d = af`AddTo[scene, { Magenta, Rectangle[ Offload[{-0.5,-0.5} + #pos], Offload[{0.5,0.5} + #pos] , RoundingRadius->0.1] }, {"pos"->{0,-1.5}}]; af`Animate[scene, d, "pos"->{0,0}, "CubicInOut", 1] // Await; PauseAsync[scene, 1] // Await; af`Remove[d]; ]][s]; ``` Another example: <div className="invertColor"> <img alt="" src={__img14} /> </div> ```wolfram AsyncFunction[scene, Module[{d, text = "Hello"}, d = af`AddTo[scene, { Translate[Rotate[Text[text // Offload, {0,0}, {0,0}], #a], #pos] }, {"pos"->{2.0,0.}, "a"->0} ]; af`Animate[scene, d, { "pos"->{0,0}, "a"->2Pi }, "CubicInOut", 1] // Await; text = "Hello W"; af`PauseAsync[scene, 0.2] // Await; text = "Hello Wo"; af`PauseAsync[scene, 0.2] // Await; text = "Hello Wor"; af`PauseAsync[scene, 0.2] // Await; text = "Hello Worl"; af`PauseAsync[scene, 0.2] // Await; text = "Hello World"; af`PauseAsync[scene, 0.2] // Await; af`Remove[d]; ]][s]; ``` In general named property slots `#pos` and etc can be passed further to other function outside the main one: <div className="invertColor"> <img alt="" src={__img15} /> </div> <details> ```wolfram fakeWritting[from_, to_, vert_, scale_: 1, freq_: 50] := Line[ MovingAverage[ Table[ { i, vert + scale 0.065 Sin[freq i] + 0 RandomReal[scale 0.05 {-1, 1}] }, {i, from, to, (to - from)/300.0} ], 10 ] ]; slidersComponent[p1_, p2_] := { White, Rectangle[{-0.5, -0.5}, {0.5, 0.2}, RoundingRadius -> 2 0.14], { RGBColor[0.9, 0.9, 0.9], Rectangle[{-0.3, -0.02}, {0.3, 0.02}, RoundingRadius -> 0.04], RGBColor[0.4, 0.6, 0.9], Disk[{0.25 p1, 0}, 0.05] }, Translate[ { RGBColor[0.9, 0.9, 0.9], Rectangle[{-0.3, -0.02}, {0.3, 0.02}, RoundingRadius -> 0.04], RGBColor[0.4, 0.6, 0.9], Disk[{0.25 p2, 0}, 0.05] }, {0, -0.3} ] }; ClearAll[notebookModel] notebookModel[size_, scale_, contentOpacity_, s_] := Scale[ SVGGroup[ { Lighter[Black], Text[Style["Notebook", FontSize -> 14], {0, 0.4}, {0, -1}], RGBColor[0.93, 0.93, 0.90], Rectangle[size {-1, -1}, size {1, 1}, RoundingRadius -> 0.13], Opacity[contentOpacity], SVGGroup[{ { Translate[ Scale[ slidersComponent[Offload[s[[1]]], Offload[s[[2]]]], 0.2 ], {0.16015625, 0.16022949218750004} ] }, Black // Lighter // Lighter, { AbsoluteThickness[2], fakeWritting[-0.3, 0.05, 0.27, 0.4, 170/1.8] }, Table[ fakeWritting[-0.3, 0.3, i, 0.1, 170], {i, 0.13, 0.3 - 0.07, 0.04} ], Table[ fakeWritting[-0.3, 0.3, i, 0.1, 170], {i, -0.3 + 0.03, -0.1, 0.04} ] }] } ], scale ]; ``` </details> ```wolfram AsyncFunction[scene, Module[{d, sliders = {0,0}}, d = af`AddTo[scene, { Translate[notebookModel[0.33, 2.0, 1.0, sliders // Offload], #pos] }, { "pos"->{0,2.0}, "cop"->1.0 }]; af`Animate[scene, d, "pos"->{0,0}, "CubicInOut", 1] // Await; af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; af`Remove[d]; ]][s]; ``` This example can be heavily simplified using [Workers](#Workers) Be careful with temporal symbols defined within the `Module`. If they are not involved into any animation Wolfram Kernel might collect them as garbage. Use `Unique` to make sure or `LeakyModule` Loops [#loops] It allows to create custom animation loop on a given property of an object on the scene: ```wolfram af`Loop[scene_, object_, prop_String, Function[{t, previousValue, n}, ... ], duration_] ``` where `t` goes from `0` to `1` every `duration` and `n` represents the number of a cycle. Loop function is called every frame (usually 30 times per second) and is running until manually removed using [Remove](./Reference#Remove) method. To simulate a delayed event we introduce a button: ```wolfram next = InputButton["Stop"] ``` As an example we rotate infinitely a rectangle: <div className="invertColor"> <img alt="" src={__img16} /> </div> ```wolfram AsyncFunction[scene, Module[{d, loop}, d = af`AddTo[scene, { Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] }, { "r" -> 0. }]; loop = af`Loop[scene, d, "r", Function[{t, o, n}, Pi t + (n-1) Pi ], 0.5]; next // Await; af`Remove[loop]; PauseAsync[scene, 0.5] // Await; af`Remove[d]; ]][s] ``` However, one can see that our animation has been interrupted somewhere mid-cycle, which may not be great for some cases. Using [Finish](./Reference#Finish) method we can wait extra time until the cycle of animation has been finished: <div className="invertColor"> <img alt="" src={__img17} /> </div> ```wolfram AsyncFunction[scene, Module[{d, loop}, d = af`AddTo[scene, { Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] }, { "r" -> 0. }]; loop = af`Loop[scene, d, "r", Function[{t, o, n}, Pi t + (n-1) Pi ], 0.5]; next // Await; af`Finish[loop] // Await; (* <---- HERE *) af`Remove[loop]; PauseAsync[scene, 0.5] // Await; af`Remove[d]; ]][s] ``` Workers [#workers] Workers are like parallel threads - a more general and extended version of loops. It allows to execute an arbitrary code concurrently with the main animation on each frame: ```wolfram af`Worker[scene_Scene, Function[absoluteTime, ... ]] ``` or ```wolfram af`Worker[scene_Scene, AsyncFunction[absoluteTime, ... ]] ``` The last case is the most valuable. You can assign a sub-animation to a worker. Using [Finish](./Reference#Finish) method on worker one can catch the moment when async sub-animation has been finished. Workers are running until they are manually removed using [Remove](./Reference#Remove) method. Taking a previous example, we can modify it slightly to take advantage of workers: <div className="invertColor"> <img alt="" src={__img18} /> </div> ```wolfram next = InputButton["Stop"] ``` ```wolfram AsyncFunction[scene, Module[{d, worker}, d = af`AddTo[scene, { Rotate[ Rectangle[{-0.5,-0.1}, {0.5,0.1}] , #r] }, { "r" -> 0. }]; worker = af`Worker[scene, AsyncFunction[Null, af`Animate[scene, d, "r"->Pi/2] // Await; af`Animate[scene, d, "r"->-Pi/2] // Await; ]]; next // Await; af`Finish[worker] // Await; af`Remove[worker]; PauseAsync[scene, 0.5] // Await; af`Remove[d]; ]][s] ``` Here is an adapter example from [Combining with Offload](#Combining%20with%20Offload), that becomes much more compact and easier to read using workers: <div className="invertColor"> <img alt="" src={__img19} /> </div> <details> ```wolfram fakeWritting[from_, to_, vert_, scale_: 1, freq_: 50] := Line[ MovingAverage[ Table[ { i, vert + scale 0.065 Sin[freq i] + 0 RandomReal[scale 0.05 {-1, 1}] }, {i, from, to, (to - from)/300.0} ], 10 ] ]; slidersComponent[p1_, p2_] := { White, Rectangle[{-0.5, -0.5}, {0.5, 0.2}, RoundingRadius -> 2 0.14], { RGBColor[0.9, 0.9, 0.9], Rectangle[{-0.3, -0.02}, {0.3, 0.02}, RoundingRadius -> 0.04], RGBColor[0.4, 0.6, 0.9], Disk[{0.25 p1, 0}, 0.05] }, Translate[ { RGBColor[0.9, 0.9, 0.9], Rectangle[{-0.3, -0.02}, {0.3, 0.02}, RoundingRadius -> 0.04], RGBColor[0.4, 0.6, 0.9], Disk[{0.25 p2, 0}, 0.05] }, {0, -0.3} ] }; ClearAll[notebookModel] notebookModel[size_, scale_, contentOpacity_, s_] := Scale[ SVGGroup[ { Lighter[Black], Text[Style["Notebook", FontSize -> 14], {0, 0.4}, {0, -1}], RGBColor[0.93, 0.93, 0.90], Rectangle[size {-1, -1}, size {1, 1}, RoundingRadius -> 0.13], Opacity[contentOpacity], SVGGroup[{ { Translate[ Scale[ slidersComponent[Offload[s[[1]]], Offload[s[[2]]]], 0.2 ], {0.16015625, 0.16022949218750004} ] }, Black // Lighter // Lighter, { AbsoluteThickness[2], fakeWritting[-0.3, 0.05, 0.27, 0.4, 170/1.8] }, Table[ fakeWritting[-0.3, 0.3, i, 0.1, 170], {i, 0.13, 0.3 - 0.07, 0.04} ], Table[ fakeWritting[-0.3, 0.3, i, 0.1, 170], {i, -0.3 + 0.03, -0.1, 0.04} ] }] } ], scale ]; ``` </details> ```wolfram AsyncFunction[scene, Module[{d, sliders = {0,0}, w}, d = af`AddTo[scene, { Translate[notebookModel[0.33, 2.0, 1.0, sliders // Offload], #pos] }, { "pos"->{0,2.0}, "cop"->1.0 }]; af`Animate[scene, d, "pos"->{0,0}, "CubicInOut", 1] // Await; w = af`Worker[scene, AsyncFunction[Null, af`Animate[scene, Hold[sliders], RandomReal[{-1,1},2], "CubicInOut", 0.5] // Await; ]]; PauseAsync[scene, 4] // Await; af`Remove[w]; af`Remove[d]; ]][s]; ``` # Overview > **Canvas2D** is an optional package used to bridge [HTML Canvas API](https://www.w3schools.com/tags/ref_canvas.asp) with Wolfram Language allowing low-level raster realtime render. Setting up [#setting-up] Firstly, you need to load this package into any context except `Global`: ```wolfram Needs["Canvas2D`"->"ctx`"]; ``` To create canvas context use the following constructor: ```wolfram context = ctx`Canvas2D[] ``` Then to display and render graphics in the given context - provide [Image](./../../Image/Image): ```wolfram Image[context, ImageResolution->{300,300}] ``` Draw basic shapes [#draw-basic-shapes] Created context is used to pipe commands to Canvas API (and then internally to GPU). Let's make basic shapes: ```wolfram ctx`BeginPath[context]; ctx`MoveTo[context, {25, 25}]; ctx`LineTo[context, {105, 25}]; ctx`LineTo[context, {25, 105}]; ctx`Fill[context]; ctx`BeginPath[context]; ctx`MoveTo[context, {125, 125}]; ctx`LineTo[context, {125, 45}]; ctx`LineTo[context, {45, 125}]; ctx`ClosePath[context]; ctx`Stroke[context]; (* Send the buffer of commands *) ctx`Dispatch[context]; ``` <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div> API allows to make gradients and change filling colors as well: ```wolfram (* top-left quarter *) ctx`SetFillStyle[context, "#FD0"]; ctx`FillRect[context, {0, 0}, 2{75, 75}]; (* top-right quarter *) ctx`SetFillStyle[context, "#6C0"]; ctx`FillRect[context, 2{75, 0}, 2{75, 75}]; (* bottom-left quarter *) ctx`SetFillStyle[context, "#09F"]; ctx`FillRect[context, 2{0, 75}, 2{75, 75}]; (* bottom-right quarter *) ctx`SetFillStyle[context, "#F30"]; ctx`FillRect[context, 2{75, 75}, 2{75, 75}]; ctx`SetFillStyle[context, "#FFF"]; ctx`SetGlobalAlpha[context, 0.2]; Do[ ctx`BeginPath[context]; ctx`Arc[context, 2{75, 75}, 2 10 + 2 10 i, 0, 2.0 π]; ctx`Fill[context]; , {i, 0, 6}]; ctx`Dispatch[context]; ``` <div className="invertColor"> <img alt="" src={__img1} placeholder="blur" /> </div> Animation [#animation] Passing `Image` to [`EventHandler`](./../../Misc/Events) expression allows to capture user events: for example mouse tracking feature. [AnimationFrameListener](./../../Graphics/AnimationFrameListener) is also extended to work with canvas `context` symbols, i.e: ```wolfram AnimationFrameListener[context_, "Event"->event_String] ``` Let's make some complex animations! <details> <summary> Handler generator function </summary> ```wolfram SetAttributes[handler, HoldRest] handler[c_, tcursor_, {width_ height_}] := Module[ { w = width, h = height, (* initial canvas size *) n = 101, cursor = tcursor, (* number of particles *) rotSpeed = 0.02, (* angular velocity *) particles, theta, rad, col, old }, (* center point *) cx = w/2; cy = h/2; (* semi-transparent drawing *) ctx`SetGlobalAlpha[c, 0.5]; (* initialize particles: random angle, radius, colour *) particles = Table[ { RandomReal[{0, 2 π}], RandomReal[{0, 150}], ctx`ColorToString[RandomColor[]], cursor }, {n} ]; Function[Null, cursor = cursor + 0.1 (tcursor - cursor); ctx`SetFillStyle[c, {Black, Opacity[0.05]}]; ctx`FillRect[c, {0, 0}, {w, h}]; (* draw each particle: from last cursor pos to new one *) Do[ particles[[i, 1]] += rotSpeed; {theta, rad, col, old} = particles[[i]]; Module[{newPos}, newPos = cursor + {Cos[theta], Sin[theta]} rad; ctx`BeginPath[c]; ctx`SetLineWidth[c, 4]; ctx`SetStrokeStyle[c, col]; ctx`MoveTo[c, old]; ctx`LineTo[c, newPos]; ctx`Stroke[c]; particles[[i,4]] = newPos; ], {i, n} ]; ctx`Dispatch[c]; ] ] ``` </details> ```wolfram aContext = ctx`Canvas2D[]; tcursor = {250,250}; EventHandler["frame", handler[aContext, tcursor, {500,500}]]; EventHandler[ Image[aContext, ImageResolution->{500,500}, Epilog->{ AnimationFrameListener[aContext, "Event"->"frame"] }], { "mousemove" -> Function[xy, tcursor = {xy[[1]], xy[[2]]} ] } ] ``` <div className="invertColor"> <img alt="" src={__img2} /> </div> # Reference **Note**, that you need to import this library to any context expect `Global` ```wolfram Needs["Canvas2D`"->"ctx`"]; ``` Constructor [#constructor] ```wolfram context = ctx`Canvas2D[] ``` creates a canvas context with a buffer of commands. Render [#render] To render context buffer to a screen use [Image](./../../Image/Image): ```wolfram Image[context_, opts___] ``` Options [#options] * `ImageResolution` (by the default is `{500,500}`) * `Epilog` (similar to `Graphics`) How to capture user input [#how-to-capture-user-input] One can directly use `EventHandler` on `Image` expression: ```wolfram EventHandler[Image[context], {"mousemove" -> Print}] ``` AnimationFrameListener [#animationframelistener] [AnimationFrameListener](./../../Graphics/AnimationFrameListener) supports canvas context as a first argument: ```wolfram AnimationFrameListener[context_, "Event"->event_String] ``` Buffer Management [#buffer-management] ```wolfram ctx`Dispatch[context_] ``` flushes the buffer of commands to the Graphics API. Paths [#paths] ```wolfram ctx`BeginPath[context_] ctx`ClosePath[context_] ctx`MoveTo[context_, {x_, y_}] ctx`LineTo[context_, {x_, y_}] ctx`Arc[context_, {cx_, cy_}, r_, θ1_, θ2_, ccw_: False] ctx`QuadraticCurveTo[context_, {cpx_, cpy_}, {x_, y_}] ctx`BezierCurveTo[context_, {cp1x_, cp1y_}, {cp2x_, cp2y_}, {x_, y_}] ``` * **BeginPath** starts a new path (clears any subpaths). * **ClosePath** closes the current subpath by drawing a straight line back to its start. * **MoveTo** / **LineTo** move or draw a line to the given point. * **Arc** adds a circular arc centered at `(cx,cy)` with radius `r` from angle `θ1` to `θ2` (set `ccw->True` for counterclockwise). * **QuadraticCurveTo** / **BezierCurveTo** add Bézier curves with the specified control points. Shapes [#shapes] ```wolfram ctx`FillRect[context_, {x_, y_}, {w_, h_}] ctx`StrokeRect[context_, {x_, y_}, {w_, h_}] ctx`Rect[context_, {x_, y_}, {w_, h_}] ctx`Fill[context_] ctx`Stroke[context_] ``` * **FillRect** draws a filled rectangle at `(x,y)` of size `(w,h)`. * **StrokeRect** outlines a rectangle similarly. * **Rect** adds a rectangle to the current path (use with `Fill` or `Stroke`). * **Fill** / **Stroke** fill or stroke the current path. Text [#text] ```wolfram ctx`FillText[context_, text_String, {x_, y_}] ctx`StrokeText[context_, text_String, {x_, y_}] ``` Draws filled or stroked text at position `(x,y)`. Styles & State [#styles--state] ```wolfram ctx`SetFillStyle[context_, style_String] ctx`SetStrokeStyle[context_, style_String] ctx`SetFillStyle[context_, _RGBColor] ctx`SetStrokeStyle[context_, _RGBColor] ctx`SetLineWidth[context_, w_] ctx`SetLineCap[context_, cap_String] ctx`SetLineJoin[context_, join_String] ctx`SetMiterLimit[context_, m_] ctx`SetFont[context_, fontSpec_String] ctx`SetGlobalAlpha[context_, α_] ctx`SetGlobalCompositeOperation[context_, op_String] ctx`SetFilter[context_, op_String] ctx`SetTextAlign[context_, align_String] ctx`SetTextBaseline[context_, baseline_String] ctx`Save[context_] ctx`Restore[context_] ``` Configures fill/stroke colors, line styles, font, global transparency, text alignment, and push/pop drawing state. Transforms & Clipping [#transforms--clipping] ```wolfram ctx`Translate[context_, {dx_, dy_}] ctx`Rotate[context_, angle_] ctx`Scale[context_, {sx_, sy_}] ctx`Clip[context_] ``` Applies 2D transforms or sets the current clipping region. Images [#images] To plot an image ```wolfram ctx`DrawImage[context_, i_Image, {x_, y_}] ctx`DrawImage[context_, i_Image, {x_, y_}, {dwidth_, dheight_}] ``` Utils [#utils] ```wolfram ctx`ColorToString[_RGBColor | _Hue] ctx`ColorToString[{_RGBColor | _Hue, _Opacity}] ``` converts colors to CSS string. # JS libraries for data visualization Fortunately, we have a vast choice of many great JavaScript tools for data visualization. In this guide, we'll try a few of them and integrate them seamlessly with Wolfram Language. ApexCharts [#apexcharts] [ApexCharts](https://apexcharts.com/) is a free and open-source interactive charting library with built-in transition animations. It is distributed as an NPM package, which makes it easy to use with [MJS cells](./../../Cell-types/Javascript). You do not need to reevaluate or recompile any Javascript cells, the generated output is stored in the notebook. Copy the whole group from [the cell's properties](./../../Overview) and paste it to a new notebook if you want to reuse it. First, let's install it locally using [shell cells](./../../Cell-types/Misc): ``` .sh npm i apexcharts --prefix . ``` ``` // node_modules/apexcharts/dist/apexcharts.esm.js function t(t2, e2) { (null == e2 || e2 > t2.length) && (e2 = t2.length); for (var i2 = 0, a2 = Array(e2); i2 < e2; i2++) a2[i2] = t2[i2]; return a2; } function e(t2) { if (void 0 === t2) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return t2; } function i(t2, e2) { if (!(t2 instanceof e2)) throw new TypeError("Cannot call a class as a function"); } function a(t2, e2) { for (var i2 = 0; i2 < e2.length; i2++) { var a2 = e2[i2]; a2.enumerable = a2.enumerable || false, a2.configurable = true, "value" in a2 && (a2.writable = true), Object.defineProperty(t2, x(a2.key), a2); } } function s(t2, e2, i2) { return e2 && a(t2.prototype, e2), i2 && a(t2, i2), Object.defineProperty(t2, "prototype", { writable: false }), t2; } function r(t2, e2) { var i2 = "undefined" != typeof Symbol && t2[Symbol.iterator] || t2["@@iterator"]; if (!i2) { if (Array.isArray(t2) || (i2 = m(t2)) || e2 && t2 && "number" == typeof t2.length) { i2 && (t2 = i2); var a2 = 0, s2 = function() { }; return { s: s2, n: function() { return a2 >= t2.length ? { done: true } : { done: false, value: t2[a2++] }; }, e: function(t3) { throw t3; }, f: s2 }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var r2, n2 = true, o2 = false; return { s: function() { i2 = i2.call(t2); }, n: function() { var t3 = i2.next(); return n2 = t3.done, t3; }, e: function(t3) { o2 = true, r2 = t3; }, f: function() { try { n2 || null == i2.return || i2.return(); } finally { if (o2) throw r2; } } }; } function n(t2) { var i2 = c(); return function() { var a2, s2 = l(t2); if (i2) { var r2 = l(this).constructor; a2 = Reflect.construct(s2, arguments, r2); } else a2 = s2.apply(this, arguments); return (function(t3, i3) { if (i3 && ("object" == typeof i3 || "function" == typeof i3)) return i3; if (void 0 !== i3) throw new TypeError("Derived constructors may only return object or undefined"); return e(t3); })(this, a2); }; } function o(t2, e2, i2) { return (e2 = x(e2)) in t2 ? Object.defineProperty(t2, e2, { value: i2, enumerable: true, configurable: true, writable: true }) : t2[e2] = i2, t2; } function l(t2) { return l = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(t3) { return t3.__proto__ || Object.getPrototypeOf(t3); }, l(t2); } function h(t2, e2) { if ("function" != typeof e2 && null !== e2) throw new TypeError("Super expression must either be null or a function"); t2.prototype = Object.create(e2 && e2.prototype, { constructor: { value: t2, writable: true, configurable: true } }), Object.defineProperty(t2, "prototype", { writable: false }), e2 && g(t2, e2); } function c() { try { var t2 = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], (function() { }))); } catch (t3) { } return (c = function() { return !!t2; })(); } function d(t2, e2) { var i2 = Object.keys(t2); if (Object.getOwnPropertySymbols) { var a2 = Object.getOwnPropertySymbols(t2); e2 && (a2 = a2.filter((function(e3) { return Object.getOwnPropertyDescriptor(t2, e3).enumerable; }))), i2.push.apply(i2, a2); } return i2; } function u(t2) { for (var e2 = 1; e2 < arguments.length; e2++) { var i2 = null != arguments[e2] ? arguments[e2] : {}; e2 % 2 ? d(Object(i2), true).forEach((function(e3) { o(t2, e3, i2[e3]); })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t2, Object.getOwnPropertyDescriptors(i2)) : d(Object(i2)).forEach((function(e3) { Object.defineProperty(t2, e3, Object.getOwnPropertyDescriptor(i2, e3)); })); } return t2; } function g(t2, e2) { return g = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(t3, e3) { return t3.__proto__ = e3, t3; }, g(t2, e2); } function p(t2, e2) { return (function(t3) { if (Array.isArray(t3)) return t3; })(t2) || (function(t3, e3) { var i2 = null == t3 ? null : "undefined" != typeof Symbol && t3[Symbol.iterator] || t3["@@iterator"]; if (null != i2) { var a2, s2, r2, n2, o2 = [], l2 = true, h2 = false; try { if (r2 = (i2 = i2.call(t3)).next, 0 === e3) { if (Object(i2) !== i2) return; l2 = false; } else for (; !(l2 = (a2 = r2.call(i2)).done) && (o2.push(a2.value), o2.length !== e3); l2 = true) ; } catch (t4) { h2 = true, s2 = t4; } finally { try { if (!l2 && null != i2.return && (n2 = i2.return(), Object(n2) !== n2)) return; } finally { if (h2) throw s2; } } return o2; } })(t2, e2) || m(t2, e2) || (function() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); })(); } function f(e2) { return (function(e3) { if (Array.isArray(e3)) return t(e3); })(e2) || (function(t2) { if ("undefined" != typeof Symbol && null != t2[Symbol.iterator] || null != t2["@@iterator"]) return Array.from(t2); })(e2) || m(e2) || (function() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); })(); } function x(t2) { var e2 = (function(t3, e3) { if ("object" != typeof t3 || !t3) return t3; var i2 = t3[Symbol.toPrimitive]; if (void 0 !== i2) { var a2 = i2.call(t3, e3 || "default"); if ("object" != typeof a2) return a2; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === e3 ? String : Number)(t3); })(t2, "string"); return "symbol" == typeof e2 ? e2 : e2 + ""; } function b(t2) { return b = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(t3) { return typeof t3; } : function(t3) { return t3 && "function" == typeof Symbol && t3.constructor === Symbol && t3 !== Symbol.prototype ? "symbol" : typeof t3; }, b(t2); } function m(e2, i2) { if (e2) { if ("string" == typeof e2) return t(e2, i2); var a2 = {}.toString.call(e2).slice(8, -1); return "Object" === a2 && e2.constructor && (a2 = e2.constructor.name), "Map" === a2 || "Set" === a2 ? Array.from(e2) : "Arguments" === a2 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a2) ? t(e2, i2) : void 0; } } var v = (function() { function t2() { i(this, t2); } return s(t2, [{ key: "shadeRGBColor", value: function(t3, e2) { var i2 = e2.split(","), a2 = t3 < 0 ? 0 : 255, s2 = t3 < 0 ? -1 * t3 : t3, r2 = parseInt(i2[0].slice(4), 10), n2 = parseInt(i2[1], 10), o2 = parseInt(i2[2], 10); return "rgb(" + (Math.round((a2 - r2) * s2) + r2) + "," + (Math.round((a2 - n2) * s2) + n2) + "," + (Math.round((a2 - o2) * s2) + o2) + ")"; } }, { key: "shadeHexColor", value: function(t3, e2) { var i2 = parseInt(e2.slice(1), 16), a2 = t3 < 0 ? 0 : 255, s2 = t3 < 0 ? -1 * t3 : t3, r2 = i2 >> 16, n2 = i2 >> 8 & 255, o2 = 255 & i2; return "#" + (16777216 + 65536 * (Math.round((a2 - r2) * s2) + r2) + 256 * (Math.round((a2 - n2) * s2) + n2) + (Math.round((a2 - o2) * s2) + o2)).toString(16).slice(1); } }, { key: "shadeColor", value: function(e2, i2) { return t2.isColorHex(i2) ? this.shadeHexColor(e2, i2) : this.shadeRGBColor(e2, i2); } }], [{ key: "bind", value: function(t3, e2) { return function() { return t3.apply(e2, arguments); }; } }, { key: "isObject", value: function(t3) { return t3 && "object" === b(t3) && !Array.isArray(t3) && null != t3; } }, { key: "is", value: function(t3, e2) { return Object.prototype.toString.call(e2) === "[object " + t3 + "]"; } }, { key: "isSafari", value: function() { return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); } }, { key: "listToArray", value: function(t3) { var e2, i2 = []; for (e2 = 0; e2 < t3.length; e2++) i2[e2] = t3[e2]; return i2; } }, { key: "extend", value: function(t3, e2) { var i2 = this; "function" != typeof Object.assign && (Object.assign = function(t4) { if (null == t4) throw new TypeError("Cannot convert undefined or null to object"); for (var e3 = Object(t4), i3 = 1; i3 < arguments.length; i3++) { var a3 = arguments[i3]; if (null != a3) for (var s2 in a3) a3.hasOwnProperty(s2) && (e3[s2] = a3[s2]); } return e3; }); var a2 = Object.assign({}, t3); return this.isObject(t3) && this.isObject(e2) && Object.keys(e2).forEach((function(s2) { i2.isObject(e2[s2]) && s2 in t3 ? a2[s2] = i2.extend(t3[s2], e2[s2]) : Object.assign(a2, o({}, s2, e2[s2])); })), a2; } }, { key: "extendArray", value: function(e2, i2) { var a2 = []; return e2.map((function(e3) { a2.push(t2.extend(i2, e3)); })), e2 = a2; } }, { key: "monthMod", value: function(t3) { return t3 % 12; } }, { key: "clone", value: function(t3) { var e2, i2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : /* @__PURE__ */ new WeakMap(); if (null === t3 || "object" !== b(t3)) return t3; if (i2.has(t3)) return i2.get(t3); if (Array.isArray(t3)) { e2 = [], i2.set(t3, e2); for (var a2 = 0; a2 < t3.length; a2++) e2[a2] = this.clone(t3[a2], i2); } else if (t3 instanceof Date) e2 = new Date(t3.getTime()); else for (var s2 in e2 = {}, i2.set(t3, e2), t3) t3.hasOwnProperty(s2) && (e2[s2] = this.clone(t3[s2], i2)); return e2; } }, { key: "log10", value: function(t3) { return Math.log(t3) / Math.LN10; } }, { key: "roundToBase10", value: function(t3) { return Math.pow(10, Math.floor(Math.log10(t3))); } }, { key: "roundToBase", value: function(t3, e2) { return Math.pow(e2, Math.floor(Math.log(t3) / Math.log(e2))); } }, { key: "parseNumber", value: function(t3) { return "number" == typeof t3 || null === t3 ? t3 : parseFloat(t3); } }, { key: "stripNumber", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 2; return Number.isInteger(t3) ? t3 : parseFloat(t3.toPrecision(e2)); } }, { key: "randomId", value: function() { return (Math.random() + 1).toString(36).substring(4); } }, { key: "noExponents", value: function(t3) { return t3.toString().includes("e") ? Math.round(t3) : t3; } }, { key: "elementExists", value: function(t3) { return !(!t3 || !t3.isConnected); } }, { key: "isInShadowDOM", value: function(e2) { if (!e2 || !e2.getRootNode) return false; var i2 = e2.getRootNode(); return i2 && i2 !== document && t2.is("ShadowRoot", i2); } }, { key: "getShadowRootHost", value: function(e2) { return t2.isInShadowDOM(e2) && e2.getRootNode().host || null; } }, { key: "getDimensions", value: function(t3) { if (!t3) return [0, 0]; var e2, i2 = t3.getRootNode && t3.getRootNode(); if (i2 && i2 !== document && i2.host) { var a2 = i2.host.getBoundingClientRect(); return [a2.width, a2.height]; } try { e2 = getComputedStyle(t3, null); } catch (e3) { return [t3.clientWidth || 0, t3.clientHeight || 0]; } var s2 = t3.clientHeight, r2 = t3.clientWidth; return s2 -= parseFloat(e2.paddingTop) + parseFloat(e2.paddingBottom), [r2 -= parseFloat(e2.paddingLeft) + parseFloat(e2.paddingRight), s2]; } }, { key: "getBoundingClientRect", value: function(t3) { if (!t3) return { top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0, x: 0, y: 0 }; var e2 = t3.getBoundingClientRect(); return { top: e2.top, right: e2.right, bottom: e2.bottom, left: e2.left, width: t3.clientWidth, height: t3.clientHeight, x: e2.left, y: e2.top }; } }, { key: "getLargestStringFromArr", value: function(t3) { return t3.reduce((function(t4, e2) { return Array.isArray(e2) && (e2 = e2.reduce((function(t5, e3) { return t5.length > e3.length ? t5 : e3; }))), t4.length > e2.length ? t4 : e2; }), 0); } }, { key: "hexToRgba", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "#999999", e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0.6; "#" !== t3.substring(0, 1) && (t3 = "#999999"); var i2 = t3.replace("#", ""); i2 = i2.match(new RegExp("(.{" + i2.length / 3 + "})", "g")); for (var a2 = 0; a2 < i2.length; a2++) i2[a2] = parseInt(1 === i2[a2].length ? i2[a2] + i2[a2] : i2[a2], 16); return void 0 !== e2 && i2.push(e2), "rgba(" + i2.join(",") + ")"; } }, { key: "getOpacityFromRGBA", value: function(t3) { return parseFloat(t3.replace(/^.*,(.+)\)/, "$1")); } }, { key: "rgb2hex", value: function(t3) { return (t3 = t3.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i)) && 4 === t3.length ? "#" + ("0" + parseInt(t3[1], 10).toString(16)).slice(-2) + ("0" + parseInt(t3[2], 10).toString(16)).slice(-2) + ("0" + parseInt(t3[3], 10).toString(16)).slice(-2) : ""; } }, { key: "isColorHex", value: function(t3) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)|(^#[0-9A-F]{8}$)/i.test(t3); } }, { key: "getPolygonPos", value: function(t3, e2) { for (var i2 = [], a2 = 2 * Math.PI / e2, s2 = 0; s2 < e2; s2++) { var r2 = {}; r2.x = t3 * Math.sin(s2 * a2), r2.y = -t3 * Math.cos(s2 * a2), i2.push(r2); } return i2; } }, { key: "polarToCartesian", value: function(t3, e2, i2, a2) { var s2 = (a2 - 90) * Math.PI / 180; return { x: t3 + i2 * Math.cos(s2), y: e2 + i2 * Math.sin(s2) }; } }, { key: "escapeString", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "x", i2 = t3.toString().slice(); return i2 = i2.replace(/[` ~!@#$%^&*()|+\=?;:'",.<>{}[\]\\/]/gi, e2); } }, { key: "negToZero", value: function(t3) { return t3 < 0 ? 0 : t3; } }, { key: "moveIndexInArray", value: function(t3, e2, i2) { if (i2 >= t3.length) for (var a2 = i2 - t3.length + 1; a2--; ) t3.push(void 0); return t3.splice(i2, 0, t3.splice(e2, 1)[0]), t3; } }, { key: "extractNumber", value: function(t3) { return parseFloat(t3.replace(/[^\d.]*/g, "")); } }, { key: "findAncestor", value: function(t3, e2) { for (; (t3 = t3.parentElement) && !t3.classList.contains(e2); ) ; return t3; } }, { key: "setELstyles", value: function(t3, e2) { for (var i2 in e2) e2.hasOwnProperty(i2) && (t3.style.key = e2[i2]); } }, { key: "preciseAddition", value: function(t3, e2) { var i2 = (String(t3).split(".")[1] || "").length, a2 = (String(e2).split(".")[1] || "").length, s2 = Math.pow(10, Math.max(i2, a2)); return (Math.round(t3 * s2) + Math.round(e2 * s2)) / s2; } }, { key: "isNumber", value: function(t3) { return !isNaN(t3) && parseFloat(Number(t3)) === t3 && !isNaN(parseInt(t3, 10)); } }, { key: "isFloat", value: function(t3) { return Number(t3) === t3 && t3 % 1 != 0; } }, { key: "isMsEdge", value: function() { var t3 = window.navigator.userAgent, e2 = t3.indexOf("Edge/"); return e2 > 0 && parseInt(t3.substring(e2 + 5, t3.indexOf(".", e2)), 10); } }, { key: "getGCD", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 7, a2 = Math.pow(10, i2 - Math.floor(Math.log10(Math.max(t3, e2)))); for (a2 > 1 ? (t3 = Math.round(Math.abs(t3) * a2), e2 = Math.round(Math.abs(e2) * a2)) : a2 = 1; e2; ) { var s2 = e2; e2 = t3 % e2, t3 = s2; } return t3 / a2; } }, { key: "getPrimeFactors", value: function(t3) { for (var e2 = [], i2 = 2; t3 >= 2; ) t3 % i2 == 0 ? (e2.push(i2), t3 /= i2) : i2++; return e2; } }, { key: "mod", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 7, a2 = Math.pow(10, i2 - Math.floor(Math.log10(Math.max(t3, e2)))); return (t3 = Math.round(Math.abs(t3) * a2)) % (e2 = Math.round(Math.abs(e2) * a2)) / a2; } }]), t2; })(); var y = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "animateLine", value: function(t3, e2, i2, a2) { t3.attr(e2).animate(a2).attr(i2); } }, { key: "animateMarker", value: function(t3, e2, i2, a2) { t3.attr({ opacity: 0 }).animate(e2).attr({ opacity: 1 }).after((function() { a2(); })); } }, { key: "animateRect", value: function(t3, e2, i2, a2, s2) { t3.attr(e2).animate(a2).attr(i2).after((function() { return s2(); })); } }, { key: "animatePathsGradually", value: function(t3) { var e2 = t3.el, i2 = t3.realIndex, a2 = t3.j, s2 = t3.fill, r2 = t3.pathFrom, n2 = t3.pathTo, o2 = t3.speed, l2 = t3.delay, h2 = this.w, c2 = 0; h2.config.chart.animations.animateGradually.enabled && (c2 = h2.config.chart.animations.animateGradually.delay), h2.config.chart.animations.dynamicAnimation.enabled && h2.globals.dataChanged && "bar" !== h2.config.chart.type && (c2 = 0), this.morphSVG(e2, i2, a2, "line" !== h2.config.chart.type || h2.globals.comboCharts ? s2 : "stroke", r2, n2, o2, l2 * c2); } }, { key: "showDelayedElements", value: function() { this.w.globals.delayedElements.forEach((function(t3) { var e2 = t3.el; e2.classList.remove("apexcharts-element-hidden"), e2.classList.add("apexcharts-hidden-element-shown"); })); } }, { key: "animationCompleted", value: function(t3) { var e2 = this.w; e2.globals.animationEnded || (e2.globals.animationEnded = true, this.showDelayedElements(), "function" == typeof e2.config.chart.events.animationEnd && e2.config.chart.events.animationEnd(this.ctx, { el: t3, w: e2 })); } }, { key: "morphSVG", value: function(t3, e2, i2, a2, s2, r2, n2, o2) { var l2 = this, h2 = this.w; s2 || (s2 = t3.attr("pathFrom")), r2 || (r2 = t3.attr("pathTo")); var c2 = function(t4) { return "radar" === h2.config.chart.type && (n2 = 1), "M 0 ".concat(h2.globals.gridHeight); }; (!s2 || s2.indexOf("undefined") > -1 || s2.indexOf("NaN") > -1) && (s2 = c2()), (!r2.trim() || r2.indexOf("undefined") > -1 || r2.indexOf("NaN") > -1) && (r2 = c2()), h2.globals.shouldAnimate || (n2 = 1), t3.plot(s2).animate(1, o2).plot(s2).animate(n2, o2).plot(r2).after((function() { v.isNumber(i2) ? i2 === h2.globals.series[h2.globals.maxValsInArrayIndex].length - 2 && h2.globals.shouldAnimate && l2.animationCompleted(t3) : "none" !== a2 && h2.globals.shouldAnimate && (!h2.globals.comboCharts && e2 === h2.globals.series.length - 1 || h2.globals.comboCharts) && l2.animationCompleted(t3), l2.showDelayedElements(); })); } }]), t2; })(); var w = {}; var k = []; function A(t2, e2) { if (Array.isArray(t2)) for (const i2 of t2) A(i2, e2); else if ("object" != typeof t2) S(Object.getOwnPropertyNames(e2)), w[t2] = Object.assign(w[t2] || {}, e2); else for (const e3 in t2) A(e3, t2[e3]); } function C(t2) { return w[t2] || {}; } function S(t2) { k.push(...t2); } function L(t2, e2) { let i2; const a2 = t2.length, s2 = []; for (i2 = 0; i2 < a2; i2++) s2.push(e2(t2[i2])); return s2; } function M(t2) { return t2 % 360 * Math.PI / 180; } function P(t2) { return t2.charAt(0).toUpperCase() + t2.slice(1); } function I(t2, e2, i2, a2) { return null != e2 && null != i2 || (a2 = a2 || t2.bbox(), null == e2 ? e2 = a2.width / a2.height * i2 : null == i2 && (i2 = a2.height / a2.width * e2)), { width: e2, height: i2 }; } function T(t2, e2) { const i2 = t2.origin; let a2 = null != t2.ox ? t2.ox : null != t2.originX ? t2.originX : "center", s2 = null != t2.oy ? t2.oy : null != t2.originY ? t2.originY : "center"; null != i2 && ([a2, s2] = Array.isArray(i2) ? i2 : "object" == typeof i2 ? [i2.x, i2.y] : [i2, i2]); const r2 = "string" == typeof a2, n2 = "string" == typeof s2; if (r2 || n2) { const { height: t3, width: i3, x: o2, y: l2 } = e2.bbox(); r2 && (a2 = a2.includes("left") ? o2 : a2.includes("right") ? o2 + i3 : o2 + i3 / 2), n2 && (s2 = s2.includes("top") ? l2 : s2.includes("bottom") ? l2 + t3 : l2 + t3 / 2); } return [a2, s2]; } var z = /* @__PURE__ */ new Set(["desc", "metadata", "title"]); var X = (t2) => z.has(t2.nodeName); var R = (t2, e2, i2 = {}) => { const a2 = { ...e2 }; for (const t3 in a2) a2[t3].valueOf() === i2[t3] && delete a2[t3]; Object.keys(a2).length ? t2.node.setAttribute("data-svgjs", JSON.stringify(a2)) : (t2.node.removeAttribute("data-svgjs"), t2.node.removeAttribute("svgjs:data")); }; var E = "http://www.w3.org/2000/svg"; var Y = "http://www.w3.org/2000/xmlns/"; var H = "http://www.w3.org/1999/xlink"; var O = { window: "undefined" == typeof window ? null : window, document: "undefined" == typeof document ? null : document }; function F() { return O.window; } var D = class { }; var _ = {}; var N = "___SYMBOL___ROOT___"; function W(t2, e2 = E) { return O.document.createElementNS(e2, t2); } function B(t2, e2 = false) { if (t2 instanceof D) return t2; if ("object" == typeof t2) return U(t2); if (null == t2) return new _[N](); if ("string" == typeof t2 && "<" !== t2.charAt(0)) return U(O.document.querySelector(t2)); const i2 = e2 ? O.document.createElement("div") : W("svg"); return i2.innerHTML = t2, t2 = U(i2.firstChild), i2.removeChild(i2.firstChild), t2; } function G(t2, e2) { return e2 && (e2 instanceof O.window.Node || e2.ownerDocument && e2 instanceof e2.ownerDocument.defaultView.Node) ? e2 : W(t2); } function V(t2) { if (!t2) return null; if (t2.instance instanceof D) return t2.instance; if ("#document-fragment" === t2.nodeName) return new _.Fragment(t2); let e2 = P(t2.nodeName || "Dom"); return "LinearGradient" === e2 || "RadialGradient" === e2 ? e2 = "Gradient" : _[e2] || (e2 = "Dom"), new _[e2](t2); } var U = V; function q(t2, e2 = t2.name, i2 = false) { return _[e2] = t2, i2 && (_[N] = t2), S(Object.getOwnPropertyNames(t2.prototype)), t2; } var Z = 1e3; function $(t2) { return "Svgjs" + P(t2) + Z++; } function J(t2) { for (let e2 = t2.children.length - 1; e2 >= 0; e2--) J(t2.children[e2]); return t2.id ? (t2.id = $(t2.nodeName), t2) : t2; } function Q(t2, e2) { let i2, a2; for (a2 = (t2 = Array.isArray(t2) ? t2 : [t2]).length - 1; a2 >= 0; a2--) for (i2 in e2) t2[a2].prototype[i2] = e2[i2]; } function K(t2) { return function(...e2) { const i2 = e2[e2.length - 1]; return !i2 || i2.constructor !== Object || i2 instanceof Array ? t2.apply(this, e2) : t2.apply(this, e2.slice(0, -1)).attr(i2); }; } A("Dom", { siblings: function() { return this.parent().children(); }, position: function() { return this.parent().index(this); }, next: function() { return this.siblings()[this.position() + 1]; }, prev: function() { return this.siblings()[this.position() - 1]; }, forward: function() { const t2 = this.position(); return this.parent().add(this.remove(), t2 + 1), this; }, backward: function() { const t2 = this.position(); return this.parent().add(this.remove(), t2 ? t2 - 1 : 0), this; }, front: function() { return this.parent().add(this.remove()), this; }, back: function() { return this.parent().add(this.remove(), 0), this; }, before: function(t2) { (t2 = B(t2)).remove(); const e2 = this.position(); return this.parent().add(t2, e2), this; }, after: function(t2) { (t2 = B(t2)).remove(); const e2 = this.position(); return this.parent().add(t2, e2 + 1), this; }, insertBefore: function(t2) { return (t2 = B(t2)).before(this), this; }, insertAfter: function(t2) { return (t2 = B(t2)).after(this), this; } }); var tt = /^([+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?)([a-z%]*)$/i; var et = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; var it = /rgb\((\d+),(\d+),(\d+)\)/; var at = /(#[a-z_][a-z0-9\-_]*)/i; var st = /\)\s*,?\s*/; var rt = /\s/g; var nt = /^#[a-f0-9]{3}$|^#[a-f0-9]{6}$/i; var ot = /^rgb\(/; var lt = /^(\s+)?$/; var ht = /^[+-]?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; var ct = /\.(jpg|jpeg|png|gif|svg)(\?[^=]+.*)?/i; var dt = /[\s,]+/; var ut = /[MLHVCSQTAZ]/i; function gt(t2) { const e2 = Math.round(t2), i2 = Math.max(0, Math.min(255, e2)).toString(16); return 1 === i2.length ? "0" + i2 : i2; } function pt(t2, e2) { for (let i2 = e2.length; i2--; ) if (null == t2[e2[i2]]) return false; return true; } function ft(t2, e2, i2) { return i2 < 0 && (i2 += 1), i2 > 1 && (i2 -= 1), i2 < 1 / 6 ? t2 + 6 * (e2 - t2) * i2 : i2 < 0.5 ? e2 : i2 < 2 / 3 ? t2 + (e2 - t2) * (2 / 3 - i2) * 6 : t2; } A("Dom", { classes: function() { const t2 = this.attr("class"); return null == t2 ? [] : t2.trim().split(dt); }, hasClass: function(t2) { return -1 !== this.classes().indexOf(t2); }, addClass: function(t2) { if (!this.hasClass(t2)) { const e2 = this.classes(); e2.push(t2), this.attr("class", e2.join(" ")); } return this; }, removeClass: function(t2) { return this.hasClass(t2) && this.attr("class", this.classes().filter((function(e2) { return e2 !== t2; })).join(" ")), this; }, toggleClass: function(t2) { return this.hasClass(t2) ? this.removeClass(t2) : this.addClass(t2); } }), A("Dom", { css: function(t2, e2) { const i2 = {}; if (0 === arguments.length) return this.node.style.cssText.split(/\s*;\s*/).filter((function(t3) { return !!t3.length; })).forEach((function(t3) { const e3 = t3.split(/\s*:\s*/); i2[e3[0]] = e3[1]; })), i2; if (arguments.length < 2) { if (Array.isArray(t2)) { for (const e3 of t2) { const t3 = e3; i2[e3] = this.node.style.getPropertyValue(t3); } return i2; } if ("string" == typeof t2) return this.node.style.getPropertyValue(t2); if ("object" == typeof t2) for (const e3 in t2) this.node.style.setProperty(e3, null == t2[e3] || lt.test(t2[e3]) ? "" : t2[e3]); } return 2 === arguments.length && this.node.style.setProperty(t2, null == e2 || lt.test(e2) ? "" : e2), this; }, show: function() { return this.css("display", ""); }, hide: function() { return this.css("display", "none"); }, visible: function() { return "none" !== this.css("display"); } }), A("Dom", { data: function(t2, e2, i2) { if (null == t2) return this.data(L((function(t3, e3) { let i3; const a2 = t3.length, s2 = []; for (i3 = 0; i3 < a2; i3++) e3(t3[i3]) && s2.push(t3[i3]); return s2; })(this.node.attributes, ((t3) => 0 === t3.nodeName.indexOf("data-"))), ((t3) => t3.nodeName.slice(5)))); if (t2 instanceof Array) { const e3 = {}; for (const i3 of t2) e3[i3] = this.data(i3); return e3; } if ("object" == typeof t2) for (e2 in t2) this.data(e2, t2[e2]); else if (arguments.length < 2) try { return JSON.parse(this.attr("data-" + t2)); } catch (e3) { return this.attr("data-" + t2); } else this.attr("data-" + t2, null === e2 ? null : true === i2 || "string" == typeof e2 || "number" == typeof e2 ? e2 : JSON.stringify(e2)); return this; } }), A("Dom", { remember: function(t2, e2) { if ("object" == typeof arguments[0]) for (const e3 in t2) this.remember(e3, t2[e3]); else { if (1 === arguments.length) return this.memory()[t2]; this.memory()[t2] = e2; } return this; }, forget: function() { if (0 === arguments.length) this._memory = {}; else for (let t2 = arguments.length - 1; t2 >= 0; t2--) delete this.memory()[arguments[t2]]; return this; }, memory: function() { return this._memory = this._memory || {}; } }); var xt = class _xt { constructor(...t2) { this.init(...t2); } static isColor(t2) { return t2 && (t2 instanceof _xt || this.isRgb(t2) || this.test(t2)); } static isRgb(t2) { return t2 && "number" == typeof t2.r && "number" == typeof t2.g && "number" == typeof t2.b; } static random(t2 = "vibrant", e2) { const { random: i2, round: a2, sin: s2, PI: r2 } = Math; if ("vibrant" === t2) { const t3 = 24 * i2() + 57, e3 = 38 * i2() + 45, a3 = 360 * i2(); return new _xt(t3, e3, a3, "lch"); } if ("sine" === t2) { const t3 = a2(80 * s2(2 * r2 * (e2 = null == e2 ? i2() : e2) / 0.5 + 0.01) + 150), n2 = a2(50 * s2(2 * r2 * e2 / 0.5 + 4.6) + 200), o2 = a2(100 * s2(2 * r2 * e2 / 0.5 + 2.3) + 150); return new _xt(t3, n2, o2); } if ("pastel" === t2) { const t3 = 8 * i2() + 86, e3 = 17 * i2() + 9, a3 = 360 * i2(); return new _xt(t3, e3, a3, "lch"); } if ("dark" === t2) { const t3 = 10 + 10 * i2(), e3 = 50 * i2() + 86, a3 = 360 * i2(); return new _xt(t3, e3, a3, "lch"); } if ("rgb" === t2) { const t3 = 255 * i2(), e3 = 255 * i2(), a3 = 255 * i2(); return new _xt(t3, e3, a3); } if ("lab" === t2) { const t3 = 100 * i2(), e3 = 256 * i2() - 128, a3 = 256 * i2() - 128; return new _xt(t3, e3, a3, "lab"); } if ("grey" === t2) { const t3 = 255 * i2(); return new _xt(t3, t3, t3); } throw new Error("Unsupported random color mode"); } static test(t2) { return "string" == typeof t2 && (nt.test(t2) || ot.test(t2)); } cmyk() { const { _a: t2, _b: e2, _c: i2 } = this.rgb(), [a2, s2, r2] = [t2, e2, i2].map(((t3) => t3 / 255)), n2 = Math.min(1 - a2, 1 - s2, 1 - r2); if (1 === n2) return new _xt(0, 0, 0, 1, "cmyk"); return new _xt((1 - a2 - n2) / (1 - n2), (1 - s2 - n2) / (1 - n2), (1 - r2 - n2) / (1 - n2), n2, "cmyk"); } hsl() { const { _a: t2, _b: e2, _c: i2 } = this.rgb(), [a2, s2, r2] = [t2, e2, i2].map(((t3) => t3 / 255)), n2 = Math.max(a2, s2, r2), o2 = Math.min(a2, s2, r2), l2 = (n2 + o2) / 2, h2 = n2 === o2, c2 = n2 - o2; return new _xt(360 * (h2 ? 0 : n2 === a2 ? ((s2 - r2) / c2 + (s2 < r2 ? 6 : 0)) / 6 : n2 === s2 ? ((r2 - a2) / c2 + 2) / 6 : n2 === r2 ? ((a2 - s2) / c2 + 4) / 6 : 0), 100 * (h2 ? 0 : l2 > 0.5 ? c2 / (2 - n2 - o2) : c2 / (n2 + o2)), 100 * l2, "hsl"); } init(t2 = 0, e2 = 0, i2 = 0, a2 = 0, s2 = "rgb") { if (t2 = t2 || 0, this.space) for (const t3 in this.space) delete this[this.space[t3]]; if ("number" == typeof t2) s2 = "string" == typeof a2 ? a2 : s2, a2 = "string" == typeof a2 ? 0 : a2, Object.assign(this, { _a: t2, _b: e2, _c: i2, _d: a2, space: s2 }); else if (t2 instanceof Array) this.space = e2 || ("string" == typeof t2[3] ? t2[3] : t2[4]) || "rgb", Object.assign(this, { _a: t2[0], _b: t2[1], _c: t2[2], _d: t2[3] || 0 }); else if (t2 instanceof Object) { const i3 = (function(t3, e3) { const i4 = pt(t3, "rgb") ? { _a: t3.r, _b: t3.g, _c: t3.b, _d: 0, space: "rgb" } : pt(t3, "xyz") ? { _a: t3.x, _b: t3.y, _c: t3.z, _d: 0, space: "xyz" } : pt(t3, "hsl") ? { _a: t3.h, _b: t3.s, _c: t3.l, _d: 0, space: "hsl" } : pt(t3, "lab") ? { _a: t3.l, _b: t3.a, _c: t3.b, _d: 0, space: "lab" } : pt(t3, "lch") ? { _a: t3.l, _b: t3.c, _c: t3.h, _d: 0, space: "lch" } : pt(t3, "cmyk") ? { _a: t3.c, _b: t3.m, _c: t3.y, _d: t3.k, space: "cmyk" } : { _a: 0, _b: 0, _c: 0, space: "rgb" }; return i4.space = e3 || i4.space, i4; })(t2, e2); Object.assign(this, i3); } else if ("string" == typeof t2) if (ot.test(t2)) { const e3 = t2.replace(rt, ""), [i3, a3, s3] = it.exec(e3).slice(1, 4).map(((t3) => parseInt(t3))); Object.assign(this, { _a: i3, _b: a3, _c: s3, _d: 0, space: "rgb" }); } else { if (!nt.test(t2)) throw Error("Unsupported string format, can't construct Color"); { const e3 = (t3) => parseInt(t3, 16), [, i3, a3, s3] = et.exec((function(t3) { return 4 === t3.length ? ["#", t3.substring(1, 2), t3.substring(1, 2), t3.substring(2, 3), t3.substring(2, 3), t3.substring(3, 4), t3.substring(3, 4)].join("") : t3; })(t2)).map(e3); Object.assign(this, { _a: i3, _b: a3, _c: s3, _d: 0, space: "rgb" }); } } const { _a: r2, _b: n2, _c: o2, _d: l2 } = this, h2 = "rgb" === this.space ? { r: r2, g: n2, b: o2 } : "xyz" === this.space ? { x: r2, y: n2, z: o2 } : "hsl" === this.space ? { h: r2, s: n2, l: o2 } : "lab" === this.space ? { l: r2, a: n2, b: o2 } : "lch" === this.space ? { l: r2, c: n2, h: o2 } : "cmyk" === this.space ? { c: r2, m: n2, y: o2, k: l2 } : {}; Object.assign(this, h2); } lab() { const { x: t2, y: e2, z: i2 } = this.xyz(); return new _xt(116 * e2 - 16, 500 * (t2 - e2), 200 * (e2 - i2), "lab"); } lch() { const { l: t2, a: e2, b: i2 } = this.lab(), a2 = Math.sqrt(e2 ** 2 + i2 ** 2); let s2 = 180 * Math.atan2(i2, e2) / Math.PI; s2 < 0 && (s2 *= -1, s2 = 360 - s2); return new _xt(t2, a2, s2, "lch"); } rgb() { if ("rgb" === this.space) return this; if ("lab" === (t2 = this.space) || "xyz" === t2 || "lch" === t2) { let { x: t3, y: e2, z: i2 } = this; if ("lab" === this.space || "lch" === this.space) { let { l: a3, a: s3, b: r3 } = this; if ("lch" === this.space) { const { c: t4, h: e3 } = this, i3 = Math.PI / 180; s3 = t4 * Math.cos(i3 * e3), r3 = t4 * Math.sin(i3 * e3); } const n3 = (a3 + 16) / 116, o3 = s3 / 500 + n3, l3 = n3 - r3 / 200, h3 = 16 / 116, c3 = 8856e-6, d2 = 7.787; t3 = 0.95047 * (o3 ** 3 > c3 ? o3 ** 3 : (o3 - h3) / d2), e2 = 1 * (n3 ** 3 > c3 ? n3 ** 3 : (n3 - h3) / d2), i2 = 1.08883 * (l3 ** 3 > c3 ? l3 ** 3 : (l3 - h3) / d2); } const a2 = 3.2406 * t3 + -1.5372 * e2 + -0.4986 * i2, s2 = -0.9689 * t3 + 1.8758 * e2 + 0.0415 * i2, r2 = 0.0557 * t3 + -0.204 * e2 + 1.057 * i2, n2 = Math.pow, o2 = 31308e-7, l2 = a2 > o2 ? 1.055 * n2(a2, 1 / 2.4) - 0.055 : 12.92 * a2, h2 = s2 > o2 ? 1.055 * n2(s2, 1 / 2.4) - 0.055 : 12.92 * s2, c2 = r2 > o2 ? 1.055 * n2(r2, 1 / 2.4) - 0.055 : 12.92 * r2; return new _xt(255 * l2, 255 * h2, 255 * c2); } if ("hsl" === this.space) { let { h: t3, s: e2, l: i2 } = this; if (t3 /= 360, e2 /= 100, i2 /= 100, 0 === e2) { i2 *= 255; return new _xt(i2, i2, i2); } const a2 = i2 < 0.5 ? i2 * (1 + e2) : i2 + e2 - i2 * e2, s2 = 2 * i2 - a2, r2 = 255 * ft(s2, a2, t3 + 1 / 3), n2 = 255 * ft(s2, a2, t3), o2 = 255 * ft(s2, a2, t3 - 1 / 3); return new _xt(r2, n2, o2); } if ("cmyk" === this.space) { const { c: t3, m: e2, y: i2, k: a2 } = this, s2 = 255 * (1 - Math.min(1, t3 * (1 - a2) + a2)), r2 = 255 * (1 - Math.min(1, e2 * (1 - a2) + a2)), n2 = 255 * (1 - Math.min(1, i2 * (1 - a2) + a2)); return new _xt(s2, r2, n2); } return this; var t2; } toArray() { const { _a: t2, _b: e2, _c: i2, _d: a2, space: s2 } = this; return [t2, e2, i2, a2, s2]; } toHex() { const [t2, e2, i2] = this._clamped().map(gt); return `#${t2}${e2}${i2}`; } toRgb() { const [t2, e2, i2] = this._clamped(); return `rgb(${t2},${e2},${i2})`; } toString() { return this.toHex(); } xyz() { const { _a: t2, _b: e2, _c: i2 } = this.rgb(), [a2, s2, r2] = [t2, e2, i2].map(((t3) => t3 / 255)), n2 = a2 > 0.04045 ? Math.pow((a2 + 0.055) / 1.055, 2.4) : a2 / 12.92, o2 = s2 > 0.04045 ? Math.pow((s2 + 0.055) / 1.055, 2.4) : s2 / 12.92, l2 = r2 > 0.04045 ? Math.pow((r2 + 0.055) / 1.055, 2.4) : r2 / 12.92, h2 = (0.4124 * n2 + 0.3576 * o2 + 0.1805 * l2) / 0.95047, c2 = (0.2126 * n2 + 0.7152 * o2 + 0.0722 * l2) / 1, d2 = (0.0193 * n2 + 0.1192 * o2 + 0.9505 * l2) / 1.08883, u2 = h2 > 8856e-6 ? Math.pow(h2, 1 / 3) : 7.787 * h2 + 16 / 116, g2 = c2 > 8856e-6 ? Math.pow(c2, 1 / 3) : 7.787 * c2 + 16 / 116, p2 = d2 > 8856e-6 ? Math.pow(d2, 1 / 3) : 7.787 * d2 + 16 / 116; return new _xt(u2, g2, p2, "xyz"); } _clamped() { const { _a: t2, _b: e2, _c: i2 } = this.rgb(), { max: a2, min: s2, round: r2 } = Math; return [t2, e2, i2].map(((t3) => a2(0, s2(r2(t3), 255)))); } }; var bt = class _bt { constructor(...t2) { this.init(...t2); } clone() { return new _bt(this); } init(t2, e2) { const i2 = 0, a2 = 0, s2 = Array.isArray(t2) ? { x: t2[0], y: t2[1] } : "object" == typeof t2 ? { x: t2.x, y: t2.y } : { x: t2, y: e2 }; return this.x = null == s2.x ? i2 : s2.x, this.y = null == s2.y ? a2 : s2.y, this; } toArray() { return [this.x, this.y]; } transform(t2) { return this.clone().transformO(t2); } transformO(t2) { vt.isMatrixLike(t2) || (t2 = new vt(t2)); const { x: e2, y: i2 } = this; return this.x = t2.a * e2 + t2.c * i2 + t2.e, this.y = t2.b * e2 + t2.d * i2 + t2.f, this; } }; function mt(t2, e2, i2) { return Math.abs(e2 - t2) < (i2 || 1e-6); } var vt = class _vt { constructor(...t2) { this.init(...t2); } static formatTransforms(t2) { const e2 = "both" === t2.flip || true === t2.flip, i2 = t2.flip && (e2 || "x" === t2.flip) ? -1 : 1, a2 = t2.flip && (e2 || "y" === t2.flip) ? -1 : 1, s2 = t2.skew && t2.skew.length ? t2.skew[0] : isFinite(t2.skew) ? t2.skew : isFinite(t2.skewX) ? t2.skewX : 0, r2 = t2.skew && t2.skew.length ? t2.skew[1] : isFinite(t2.skew) ? t2.skew : isFinite(t2.skewY) ? t2.skewY : 0, n2 = t2.scale && t2.scale.length ? t2.scale[0] * i2 : isFinite(t2.scale) ? t2.scale * i2 : isFinite(t2.scaleX) ? t2.scaleX * i2 : i2, o2 = t2.scale && t2.scale.length ? t2.scale[1] * a2 : isFinite(t2.scale) ? t2.scale * a2 : isFinite(t2.scaleY) ? t2.scaleY * a2 : a2, l2 = t2.shear || 0, h2 = t2.rotate || t2.theta || 0, c2 = new bt(t2.origin || t2.around || t2.ox || t2.originX, t2.oy || t2.originY), d2 = c2.x, u2 = c2.y, g2 = new bt(t2.position || t2.px || t2.positionX || NaN, t2.py || t2.positionY || NaN), p2 = g2.x, f2 = g2.y, x2 = new bt(t2.translate || t2.tx || t2.translateX, t2.ty || t2.translateY), b2 = x2.x, m2 = x2.y, v2 = new bt(t2.relative || t2.rx || t2.relativeX, t2.ry || t2.relativeY); return { scaleX: n2, scaleY: o2, skewX: s2, skewY: r2, shear: l2, theta: h2, rx: v2.x, ry: v2.y, tx: b2, ty: m2, ox: d2, oy: u2, px: p2, py: f2 }; } static fromArray(t2) { return { a: t2[0], b: t2[1], c: t2[2], d: t2[3], e: t2[4], f: t2[5] }; } static isMatrixLike(t2) { return null != t2.a || null != t2.b || null != t2.c || null != t2.d || null != t2.e || null != t2.f; } static matrixMultiply(t2, e2, i2) { const a2 = t2.a * e2.a + t2.c * e2.b, s2 = t2.b * e2.a + t2.d * e2.b, r2 = t2.a * e2.c + t2.c * e2.d, n2 = t2.b * e2.c + t2.d * e2.d, o2 = t2.e + t2.a * e2.e + t2.c * e2.f, l2 = t2.f + t2.b * e2.e + t2.d * e2.f; return i2.a = a2, i2.b = s2, i2.c = r2, i2.d = n2, i2.e = o2, i2.f = l2, i2; } around(t2, e2, i2) { return this.clone().aroundO(t2, e2, i2); } aroundO(t2, e2, i2) { const a2 = t2 || 0, s2 = e2 || 0; return this.translateO(-a2, -s2).lmultiplyO(i2).translateO(a2, s2); } clone() { return new _vt(this); } decompose(t2 = 0, e2 = 0) { const i2 = this.a, a2 = this.b, s2 = this.c, r2 = this.d, n2 = this.e, o2 = this.f, l2 = i2 * r2 - a2 * s2, h2 = l2 > 0 ? 1 : -1, c2 = h2 * Math.sqrt(i2 * i2 + a2 * a2), d2 = Math.atan2(h2 * a2, h2 * i2), u2 = 180 / Math.PI * d2, g2 = Math.cos(d2), p2 = Math.sin(d2), f2 = (i2 * s2 + a2 * r2) / l2, x2 = s2 * c2 / (f2 * i2 - a2) || r2 * c2 / (f2 * a2 + i2); return { scaleX: c2, scaleY: x2, shear: f2, rotate: u2, translateX: n2 - t2 + t2 * g2 * c2 + e2 * (f2 * g2 * c2 - p2 * x2), translateY: o2 - e2 + t2 * p2 * c2 + e2 * (f2 * p2 * c2 + g2 * x2), originX: t2, originY: e2, a: this.a, b: this.b, c: this.c, d: this.d, e: this.e, f: this.f }; } equals(t2) { if (t2 === this) return true; const e2 = new _vt(t2); return mt(this.a, e2.a) && mt(this.b, e2.b) && mt(this.c, e2.c) && mt(this.d, e2.d) && mt(this.e, e2.e) && mt(this.f, e2.f); } flip(t2, e2) { return this.clone().flipO(t2, e2); } flipO(t2, e2) { return "x" === t2 ? this.scaleO(-1, 1, e2, 0) : "y" === t2 ? this.scaleO(1, -1, 0, e2) : this.scaleO(-1, -1, t2, e2 || t2); } init(t2) { const e2 = _vt.fromArray([1, 0, 0, 1, 0, 0]); return t2 = t2 instanceof Gt ? t2.matrixify() : "string" == typeof t2 ? _vt.fromArray(t2.split(dt).map(parseFloat)) : Array.isArray(t2) ? _vt.fromArray(t2) : "object" == typeof t2 && _vt.isMatrixLike(t2) ? t2 : "object" == typeof t2 ? new _vt().transform(t2) : 6 === arguments.length ? _vt.fromArray([].slice.call(arguments)) : e2, this.a = null != t2.a ? t2.a : e2.a, this.b = null != t2.b ? t2.b : e2.b, this.c = null != t2.c ? t2.c : e2.c, this.d = null != t2.d ? t2.d : e2.d, this.e = null != t2.e ? t2.e : e2.e, this.f = null != t2.f ? t2.f : e2.f, this; } inverse() { return this.clone().inverseO(); } inverseO() { const t2 = this.a, e2 = this.b, i2 = this.c, a2 = this.d, s2 = this.e, r2 = this.f, n2 = t2 * a2 - e2 * i2; if (!n2) throw new Error("Cannot invert " + this); const o2 = a2 / n2, l2 = -e2 / n2, h2 = -i2 / n2, c2 = t2 / n2, d2 = -(o2 * s2 + h2 * r2), u2 = -(l2 * s2 + c2 * r2); return this.a = o2, this.b = l2, this.c = h2, this.d = c2, this.e = d2, this.f = u2, this; } lmultiply(t2) { return this.clone().lmultiplyO(t2); } lmultiplyO(t2) { const e2 = t2 instanceof _vt ? t2 : new _vt(t2); return _vt.matrixMultiply(e2, this, this); } multiply(t2) { return this.clone().multiplyO(t2); } multiplyO(t2) { const e2 = t2 instanceof _vt ? t2 : new _vt(t2); return _vt.matrixMultiply(this, e2, this); } rotate(t2, e2, i2) { return this.clone().rotateO(t2, e2, i2); } rotateO(t2, e2 = 0, i2 = 0) { t2 = M(t2); const a2 = Math.cos(t2), s2 = Math.sin(t2), { a: r2, b: n2, c: o2, d: l2, e: h2, f: c2 } = this; return this.a = r2 * a2 - n2 * s2, this.b = n2 * a2 + r2 * s2, this.c = o2 * a2 - l2 * s2, this.d = l2 * a2 + o2 * s2, this.e = h2 * a2 - c2 * s2 + i2 * s2 - e2 * a2 + e2, this.f = c2 * a2 + h2 * s2 - e2 * s2 - i2 * a2 + i2, this; } scale() { return this.clone().scaleO(...arguments); } scaleO(t2, e2 = t2, i2 = 0, a2 = 0) { 3 === arguments.length && (a2 = i2, i2 = e2, e2 = t2); const { a: s2, b: r2, c: n2, d: o2, e: l2, f: h2 } = this; return this.a = s2 * t2, this.b = r2 * e2, this.c = n2 * t2, this.d = o2 * e2, this.e = l2 * t2 - i2 * t2 + i2, this.f = h2 * e2 - a2 * e2 + a2, this; } shear(t2, e2, i2) { return this.clone().shearO(t2, e2, i2); } shearO(t2, e2 = 0, i2 = 0) { const { a: a2, b: s2, c: r2, d: n2, e: o2, f: l2 } = this; return this.a = a2 + s2 * t2, this.c = r2 + n2 * t2, this.e = o2 + l2 * t2 - i2 * t2, this; } skew() { return this.clone().skewO(...arguments); } skewO(t2, e2 = t2, i2 = 0, a2 = 0) { 3 === arguments.length && (a2 = i2, i2 = e2, e2 = t2), t2 = M(t2), e2 = M(e2); const s2 = Math.tan(t2), r2 = Math.tan(e2), { a: n2, b: o2, c: l2, d: h2, e: c2, f: d2 } = this; return this.a = n2 + o2 * s2, this.b = o2 + n2 * r2, this.c = l2 + h2 * s2, this.d = h2 + l2 * r2, this.e = c2 + d2 * s2 - a2 * s2, this.f = d2 + c2 * r2 - i2 * r2, this; } skewX(t2, e2, i2) { return this.skew(t2, 0, e2, i2); } skewY(t2, e2, i2) { return this.skew(0, t2, e2, i2); } toArray() { return [this.a, this.b, this.c, this.d, this.e, this.f]; } toString() { return "matrix(" + this.a + "," + this.b + "," + this.c + "," + this.d + "," + this.e + "," + this.f + ")"; } transform(t2) { if (_vt.isMatrixLike(t2)) { return new _vt(t2).multiplyO(this); } const e2 = _vt.formatTransforms(t2), { x: i2, y: a2 } = new bt(e2.ox, e2.oy).transform(this), s2 = new _vt().translateO(e2.rx, e2.ry).lmultiplyO(this).translateO(-i2, -a2).scaleO(e2.scaleX, e2.scaleY).skewO(e2.skewX, e2.skewY).shearO(e2.shear).rotateO(e2.theta).translateO(i2, a2); if (isFinite(e2.px) || isFinite(e2.py)) { const t3 = new bt(i2, a2).transform(s2), r2 = isFinite(e2.px) ? e2.px - t3.x : 0, n2 = isFinite(e2.py) ? e2.py - t3.y : 0; s2.translateO(r2, n2); } return s2.translateO(e2.tx, e2.ty), s2; } translate(t2, e2) { return this.clone().translateO(t2, e2); } translateO(t2, e2) { return this.e += t2 || 0, this.f += e2 || 0, this; } valueOf() { return { a: this.a, b: this.b, c: this.c, d: this.d, e: this.e, f: this.f }; } }; function yt() { if (!yt.nodes) { const t2 = B().size(2, 0); t2.node.style.cssText = ["opacity: 0", "position: absolute", "left: -100%", "top: -100%", "overflow: hidden"].join(";"), t2.attr("focusable", "false"), t2.attr("aria-hidden", "true"); const e2 = t2.path().node; yt.nodes = { svg: t2, path: e2 }; } if (!yt.nodes.svg.node.parentNode) { const t2 = O.document.body || O.document.documentElement; yt.nodes.svg.addTo(t2); } return yt.nodes; } function wt(t2) { return !(t2.width || t2.height || t2.x || t2.y); } q(vt, "Matrix"); var kt = class _kt { constructor(...t2) { this.init(...t2); } addOffset() { return this.x += O.window.pageXOffset, this.y += O.window.pageYOffset, new _kt(this); } init(t2) { return t2 = "string" == typeof t2 ? t2.split(dt).map(parseFloat) : Array.isArray(t2) ? t2 : "object" == typeof t2 ? [null != t2.left ? t2.left : t2.x, null != t2.top ? t2.top : t2.y, t2.width, t2.height] : 4 === arguments.length ? [].slice.call(arguments) : [0, 0, 0, 0], this.x = t2[0] || 0, this.y = t2[1] || 0, this.width = this.w = t2[2] || 0, this.height = this.h = t2[3] || 0, this.x2 = this.x + this.w, this.y2 = this.y + this.h, this.cx = this.x + this.w / 2, this.cy = this.y + this.h / 2, this; } isNulled() { return wt(this); } merge(t2) { const e2 = Math.min(this.x, t2.x), i2 = Math.min(this.y, t2.y), a2 = Math.max(this.x + this.width, t2.x + t2.width) - e2, s2 = Math.max(this.y + this.height, t2.y + t2.height) - i2; return new _kt(e2, i2, a2, s2); } toArray() { return [this.x, this.y, this.width, this.height]; } toString() { return this.x + " " + this.y + " " + this.width + " " + this.height; } transform(t2) { t2 instanceof vt || (t2 = new vt(t2)); let e2 = 1 / 0, i2 = -1 / 0, a2 = 1 / 0, s2 = -1 / 0; return [new bt(this.x, this.y), new bt(this.x2, this.y), new bt(this.x, this.y2), new bt(this.x2, this.y2)].forEach((function(r2) { r2 = r2.transform(t2), e2 = Math.min(e2, r2.x), i2 = Math.max(i2, r2.x), a2 = Math.min(a2, r2.y), s2 = Math.max(s2, r2.y); })), new _kt(e2, a2, i2 - e2, s2 - a2); } }; function At(t2, e2, i2) { let a2; try { if (a2 = e2(t2.node), wt(a2) && ((s2 = t2.node) !== O.document && !(O.document.documentElement.contains || function(t3) { for (; t3.parentNode; ) t3 = t3.parentNode; return t3 === O.document; }).call(O.document.documentElement, s2))) throw new Error("Element not in the dom"); } catch (e3) { a2 = i2(t2); } var s2; return a2; } A({ viewbox: { viewbox(t2, e2, i2, a2) { return null == t2 ? new kt(this.attr("viewBox")) : this.attr("viewBox", new kt(t2, e2, i2, a2)); }, zoom(t2, e2) { let { width: i2, height: a2 } = this.attr(["width", "height"]); if ((i2 || a2) && "string" != typeof i2 && "string" != typeof a2 || (i2 = this.node.clientWidth, a2 = this.node.clientHeight), !i2 || !a2) throw new Error("Impossible to get absolute width and height. Please provide an absolute width and height attribute on the zooming element"); const s2 = this.viewbox(), r2 = i2 / s2.width, n2 = a2 / s2.height, o2 = Math.min(r2, n2); if (null == t2) return o2; let l2 = o2 / t2; l2 === 1 / 0 && (l2 = Number.MAX_SAFE_INTEGER / 100), e2 = e2 || new bt(i2 / 2 / r2 + s2.x, a2 / 2 / n2 + s2.y); const h2 = new kt(s2).transform(new vt({ scale: l2, origin: e2 })); return this.viewbox(h2); } } }), q(kt, "Box"); var Ct = class extends Array { constructor(t2 = [], ...e2) { if (super(t2, ...e2), "number" == typeof t2) return this; this.length = 0, this.push(...t2); } }; Q([Ct], { each(t2, ...e2) { return "function" == typeof t2 ? this.map(((e3, i2, a2) => t2.call(e3, e3, i2, a2))) : this.map(((i2) => i2[t2](...e2))); }, toArray() { return Array.prototype.concat.apply([], this); } }); var St = ["toArray", "constructor", "each"]; function Lt(t2, e2) { return new Ct(L((e2 || O.document).querySelectorAll(t2), (function(t3) { return V(t3); }))); } Ct.extend = function(t2) { t2 = t2.reduce(((t3, e2) => (St.includes(e2) || "_" === e2[0] || (e2 in Array.prototype && (t3["$" + e2] = Array.prototype[e2]), t3[e2] = function(...t4) { return this.each(e2, ...t4); }), t3)), {}), Q([Ct], t2); }; var Mt = 0; var Pt = {}; function It(t2) { let e2 = t2.getEventHolder(); return e2 === O.window && (e2 = Pt), e2.events || (e2.events = {}), e2.events; } function Tt(t2) { return t2.getEventTarget(); } function zt(t2, e2, i2, a2, s2) { const r2 = i2.bind(a2 || t2), n2 = B(t2), o2 = It(n2), l2 = Tt(n2); e2 = Array.isArray(e2) ? e2 : e2.split(dt), i2._svgjsListenerId || (i2._svgjsListenerId = ++Mt), e2.forEach((function(t3) { const e3 = t3.split(".")[0], a3 = t3.split(".")[1] || "*"; o2[e3] = o2[e3] || {}, o2[e3][a3] = o2[e3][a3] || {}, o2[e3][a3][i2._svgjsListenerId] = r2, l2.addEventListener(e3, r2, s2 || false); })); } function Xt(t2, e2, i2, a2) { const s2 = B(t2), r2 = It(s2), n2 = Tt(s2); ("function" != typeof i2 || (i2 = i2._svgjsListenerId)) && (e2 = Array.isArray(e2) ? e2 : (e2 || "").split(dt)).forEach((function(t3) { const e3 = t3 && t3.split(".")[0], o2 = t3 && t3.split(".")[1]; let l2, h2; if (i2) r2[e3] && r2[e3][o2 || "*"] && (n2.removeEventListener(e3, r2[e3][o2 || "*"][i2], a2 || false), delete r2[e3][o2 || "*"][i2]); else if (e3 && o2) { if (r2[e3] && r2[e3][o2]) { for (h2 in r2[e3][o2]) Xt(n2, [e3, o2].join("."), h2); delete r2[e3][o2]; } } else if (o2) for (t3 in r2) for (l2 in r2[t3]) o2 === l2 && Xt(n2, [t3, o2].join(".")); else if (e3) { if (r2[e3]) { for (l2 in r2[e3]) Xt(n2, [e3, l2].join(".")); delete r2[e3]; } } else { for (t3 in r2) Xt(n2, t3); !(function(t4) { let e4 = t4.getEventHolder(); e4 === O.window && (e4 = Pt), e4.events && (e4.events = {}); })(s2); } })); } var Rt = class extends D { addEventListener() { } dispatch(t2, e2, i2) { return (function(t3, e3, i3, a2) { const s2 = Tt(t3); return e3 instanceof O.window.Event || (e3 = new O.window.CustomEvent(e3, { detail: i3, cancelable: true, ...a2 })), s2.dispatchEvent(e3), e3; })(this, t2, e2, i2); } dispatchEvent(t2) { const e2 = this.getEventHolder().events; if (!e2) return true; const i2 = e2[t2.type]; for (const e3 in i2) for (const a2 in i2[e3]) i2[e3][a2](t2); return !t2.defaultPrevented; } fire(t2, e2, i2) { return this.dispatch(t2, e2, i2), this; } getEventHolder() { return this; } getEventTarget() { return this; } off(t2, e2, i2) { return Xt(this, t2, e2, i2), this; } on(t2, e2, i2, a2) { return zt(this, t2, e2, i2, a2), this; } removeEventListener() { } }; function Et() { } q(Rt, "EventTarget"); var Yt = 400; var Ht = ">"; var Ot = 0; var Ft = { "fill-opacity": 1, "stroke-opacity": 1, "stroke-width": 0, "stroke-linejoin": "miter", "stroke-linecap": "butt", fill: "#000000", stroke: "#000000", opacity: 1, x: 0, y: 0, cx: 0, cy: 0, width: 0, height: 0, r: 0, rx: 0, ry: 0, offset: 0, "stop-opacity": 1, "stop-color": "#000000", "text-anchor": "start" }; var Dt = class extends Array { constructor(...t2) { super(...t2), this.init(...t2); } clone() { return new this.constructor(this); } init(t2) { return "number" == typeof t2 || (this.length = 0, this.push(...this.parse(t2))), this; } parse(t2 = []) { return t2 instanceof Array ? t2 : t2.trim().split(dt).map(parseFloat); } toArray() { return Array.prototype.concat.apply([], this); } toSet() { return new Set(this); } toString() { return this.join(" "); } valueOf() { const t2 = []; return t2.push(...this), t2; } }; var _t = class __t { constructor(...t2) { this.init(...t2); } convert(t2) { return new __t(this.value, t2); } divide(t2) { return t2 = new __t(t2), new __t(this / t2, this.unit || t2.unit); } init(t2, e2) { return e2 = Array.isArray(t2) ? t2[1] : e2, t2 = Array.isArray(t2) ? t2[0] : t2, this.value = 0, this.unit = e2 || "", "number" == typeof t2 ? this.value = isNaN(t2) ? 0 : isFinite(t2) ? t2 : t2 < 0 ? -34e37 : 34e37 : "string" == typeof t2 ? (e2 = t2.match(tt)) && (this.value = parseFloat(e2[1]), "%" === e2[5] ? this.value /= 100 : "s" === e2[5] && (this.value *= 1e3), this.unit = e2[5]) : t2 instanceof __t && (this.value = t2.valueOf(), this.unit = t2.unit), this; } minus(t2) { return t2 = new __t(t2), new __t(this - t2, this.unit || t2.unit); } plus(t2) { return t2 = new __t(t2), new __t(this + t2, this.unit || t2.unit); } times(t2) { return t2 = new __t(t2), new __t(this * t2, this.unit || t2.unit); } toArray() { return [this.value, this.unit]; } toJSON() { return this.toString(); } toString() { return ("%" === this.unit ? ~~(1e8 * this.value) / 1e6 : "s" === this.unit ? this.value / 1e3 : this.value) + this.unit; } valueOf() { return this.value; } }; var Nt = /* @__PURE__ */ new Set(["fill", "stroke", "color", "bgcolor", "stop-color", "flood-color", "lighting-color"]); var Wt = []; var Bt = class _Bt extends Rt { constructor(t2, e2) { super(), this.node = t2, this.type = t2.nodeName, e2 && t2 !== e2 && this.attr(e2); } add(t2, e2) { return (t2 = B(t2)).removeNamespace && this.node instanceof O.window.SVGElement && t2.removeNamespace(), null == e2 ? this.node.appendChild(t2.node) : t2.node !== this.node.childNodes[e2] && this.node.insertBefore(t2.node, this.node.childNodes[e2]), this; } addTo(t2, e2) { return B(t2).put(this, e2); } children() { return new Ct(L(this.node.children, (function(t2) { return V(t2); }))); } clear() { for (; this.node.hasChildNodes(); ) this.node.removeChild(this.node.lastChild); return this; } clone(t2 = true, e2 = true) { this.writeDataToDom(); let i2 = this.node.cloneNode(t2); return e2 && (i2 = J(i2)), new this.constructor(i2); } each(t2, e2) { const i2 = this.children(); let a2, s2; for (a2 = 0, s2 = i2.length; a2 < s2; a2++) t2.apply(i2[a2], [a2, i2]), e2 && i2[a2].each(t2, e2); return this; } element(t2, e2) { return this.put(new _Bt(W(t2), e2)); } first() { return V(this.node.firstChild); } get(t2) { return V(this.node.childNodes[t2]); } getEventHolder() { return this.node; } getEventTarget() { return this.node; } has(t2) { return this.index(t2) >= 0; } html(t2, e2) { return this.xml(t2, e2, "http://www.w3.org/1999/xhtml"); } id(t2) { return void 0 !== t2 || this.node.id || (this.node.id = $(this.type)), this.attr("id", t2); } index(t2) { return [].slice.call(this.node.childNodes).indexOf(t2.node); } last() { return V(this.node.lastChild); } matches(t2) { const e2 = this.node, i2 = e2.matches || e2.matchesSelector || e2.msMatchesSelector || e2.mozMatchesSelector || e2.webkitMatchesSelector || e2.oMatchesSelector || null; return i2 && i2.call(e2, t2); } parent(t2) { let e2 = this; if (!e2.node.parentNode) return null; if (e2 = V(e2.node.parentNode), !t2) return e2; do { if ("string" == typeof t2 ? e2.matches(t2) : e2 instanceof t2) return e2; } while (e2 = V(e2.node.parentNode)); return e2; } put(t2, e2) { return t2 = B(t2), this.add(t2, e2), t2; } putIn(t2, e2) { return B(t2).add(this, e2); } remove() { return this.parent() && this.parent().removeElement(this), this; } removeElement(t2) { return this.node.removeChild(t2.node), this; } replace(t2) { return t2 = B(t2), this.node.parentNode && this.node.parentNode.replaceChild(t2.node, this.node), t2; } round(t2 = 2, e2 = null) { const i2 = 10 ** t2, a2 = this.attr(e2); for (const t3 in a2) "number" == typeof a2[t3] && (a2[t3] = Math.round(a2[t3] * i2) / i2); return this.attr(a2), this; } svg(t2, e2) { return this.xml(t2, e2, E); } toString() { return this.id(); } words(t2) { return this.node.textContent = t2, this; } wrap(t2) { const e2 = this.parent(); if (!e2) return this.addTo(t2); const i2 = e2.index(this); return e2.put(t2, i2).put(this); } writeDataToDom() { return this.each((function() { this.writeDataToDom(); })), this; } xml(t2, e2, i2) { if ("boolean" == typeof t2 && (i2 = e2, e2 = t2, t2 = null), null == t2 || "function" == typeof t2) { e2 = null == e2 || e2, this.writeDataToDom(); let i3 = this; if (null != t2) { if (i3 = V(i3.node.cloneNode(true)), e2) { const e3 = t2(i3); if (i3 = e3 || i3, false === e3) return ""; } i3.each((function() { const e3 = t2(this), i4 = e3 || this; false === e3 ? this.remove() : e3 && this !== i4 && this.replace(i4); }), true); } return e2 ? i3.node.outerHTML : i3.node.innerHTML; } e2 = null != e2 && e2; const a2 = W("wrapper", i2), s2 = O.document.createDocumentFragment(); a2.innerHTML = t2; for (let t3 = a2.children.length; t3--; ) s2.appendChild(a2.firstElementChild); const r2 = this.parent(); return e2 ? this.replace(s2) && r2 : this.add(s2); } }; Q(Bt, { attr: function(t2, e2, i2) { if (null == t2) { t2 = {}, e2 = this.node.attributes; for (const i3 of e2) t2[i3.nodeName] = ht.test(i3.nodeValue) ? parseFloat(i3.nodeValue) : i3.nodeValue; return t2; } if (t2 instanceof Array) return t2.reduce(((t3, e3) => (t3[e3] = this.attr(e3), t3)), {}); if ("object" == typeof t2 && t2.constructor === Object) for (e2 in t2) this.attr(e2, t2[e2]); else if (null === e2) this.node.removeAttribute(t2); else { if (null == e2) return null == (e2 = this.node.getAttribute(t2)) ? Ft[t2] : ht.test(e2) ? parseFloat(e2) : e2; "number" == typeof (e2 = Wt.reduce(((e3, i3) => i3(t2, e3, this)), e2)) ? e2 = new _t(e2) : Nt.has(t2) && xt.isColor(e2) ? e2 = new xt(e2) : e2.constructor === Array && (e2 = new Dt(e2)), "leading" === t2 ? this.leading && this.leading(e2) : "string" == typeof i2 ? this.node.setAttributeNS(i2, t2, e2.toString()) : this.node.setAttribute(t2, e2.toString()), !this.rebuild || "font-size" !== t2 && "x" !== t2 || this.rebuild(); } return this; }, find: function(t2) { return Lt(t2, this.node); }, findOne: function(t2) { return V(this.node.querySelector(t2)); } }), q(Bt, "Dom"); var Gt = class extends Bt { constructor(t2, e2) { super(t2, e2), this.dom = {}, this.node.instance = this, (t2.hasAttribute("data-svgjs") || t2.hasAttribute("svgjs:data")) && this.setData(JSON.parse(t2.getAttribute("data-svgjs")) ?? JSON.parse(t2.getAttribute("svgjs:data")) ?? {}); } center(t2, e2) { return this.cx(t2).cy(e2); } cx(t2) { return null == t2 ? this.x() + this.width() / 2 : this.x(t2 - this.width() / 2); } cy(t2) { return null == t2 ? this.y() + this.height() / 2 : this.y(t2 - this.height() / 2); } defs() { const t2 = this.root(); return t2 && t2.defs(); } dmove(t2, e2) { return this.dx(t2).dy(e2); } dx(t2 = 0) { return this.x(new _t(t2).plus(this.x())); } dy(t2 = 0) { return this.y(new _t(t2).plus(this.y())); } getEventHolder() { return this; } height(t2) { return this.attr("height", t2); } move(t2, e2) { return this.x(t2).y(e2); } parents(t2 = this.root()) { const e2 = "string" == typeof t2; e2 || (t2 = B(t2)); const i2 = new Ct(); let a2 = this; for (; (a2 = a2.parent()) && a2.node !== O.document && "#document-fragment" !== a2.nodeName && (i2.push(a2), e2 || a2.node !== t2.node) && (!e2 || !a2.matches(t2)); ) if (a2.node === this.root().node) return null; return i2; } reference(t2) { if (!(t2 = this.attr(t2))) return null; const e2 = (t2 + "").match(at); return e2 ? B(e2[1]) : null; } root() { const t2 = this.parent((function(t3) { return _[t3]; })(N)); return t2 && t2.root(); } setData(t2) { return this.dom = t2, this; } size(t2, e2) { const i2 = I(this, t2, e2); return this.width(new _t(i2.width)).height(new _t(i2.height)); } width(t2) { return this.attr("width", t2); } writeDataToDom() { return R(this, this.dom), super.writeDataToDom(); } x(t2) { return this.attr("x", t2); } y(t2) { return this.attr("y", t2); } }; Q(Gt, { bbox: function() { const t2 = At(this, ((t3) => t3.getBBox()), ((t3) => { try { const e2 = t3.clone().addTo(yt().svg).show(), i2 = e2.node.getBBox(); return e2.remove(), i2; } catch (e2) { throw new Error(`Getting bbox of element "${t3.node.nodeName}" is not possible: ${e2.toString()}`); } })); return new kt(t2); }, rbox: function(t2) { const e2 = At(this, ((t3) => t3.getBoundingClientRect()), ((t3) => { throw new Error(`Getting rbox of element "${t3.node.nodeName}" is not possible`); })), i2 = new kt(e2); return t2 ? i2.transform(t2.screenCTM().inverseO()) : i2.addOffset(); }, inside: function(t2, e2) { const i2 = this.bbox(); return t2 > i2.x && e2 > i2.y && t2 < i2.x + i2.width && e2 < i2.y + i2.height; }, point: function(t2, e2) { return new bt(t2, e2).transformO(this.screenCTM().inverseO()); }, ctm: function() { return new vt(this.node.getCTM()); }, screenCTM: function() { try { if ("function" == typeof this.isRoot && !this.isRoot()) { const t2 = this.rect(1, 1), e2 = t2.node.getScreenCTM(); return t2.remove(), new vt(e2); } return new vt(this.node.getScreenCTM()); } catch (t2) { return console.warn(`Cannot get CTM from SVG node ${this.node.nodeName}. Is the element rendered?`), new vt(); } } }), q(Gt, "Element"); var jt = { stroke: ["color", "width", "opacity", "linecap", "linejoin", "miterlimit", "dasharray", "dashoffset"], fill: ["color", "opacity", "rule"], prefix: function(t2, e2) { return "color" === e2 ? t2 : t2 + "-" + e2; } }; ["fill", "stroke"].forEach((function(t2) { const e2 = {}; let i2; e2[t2] = function(e3) { if (void 0 === e3) return this.attr(t2); if ("string" == typeof e3 || e3 instanceof xt || xt.isRgb(e3) || e3 instanceof Gt) this.attr(t2, e3); else for (i2 = jt[t2].length - 1; i2 >= 0; i2--) null != e3[jt[t2][i2]] && this.attr(jt.prefix(t2, jt[t2][i2]), e3[jt[t2][i2]]); return this; }, A(["Element", "Runner"], e2); })), A(["Element", "Runner"], { matrix: function(t2, e2, i2, a2, s2, r2) { return null == t2 ? new vt(this) : this.attr("transform", new vt(t2, e2, i2, a2, s2, r2)); }, rotate: function(t2, e2, i2) { return this.transform({ rotate: t2, ox: e2, oy: i2 }, true); }, skew: function(t2, e2, i2, a2) { return 1 === arguments.length || 3 === arguments.length ? this.transform({ skew: t2, ox: e2, oy: i2 }, true) : this.transform({ skew: [t2, e2], ox: i2, oy: a2 }, true); }, shear: function(t2, e2, i2) { return this.transform({ shear: t2, ox: e2, oy: i2 }, true); }, scale: function(t2, e2, i2, a2) { return 1 === arguments.length || 3 === arguments.length ? this.transform({ scale: t2, ox: e2, oy: i2 }, true) : this.transform({ scale: [t2, e2], ox: i2, oy: a2 }, true); }, translate: function(t2, e2) { return this.transform({ translate: [t2, e2] }, true); }, relative: function(t2, e2) { return this.transform({ relative: [t2, e2] }, true); }, flip: function(t2 = "both", e2 = "center") { return -1 === "xybothtrue".indexOf(t2) && (e2 = t2, t2 = "both"), this.transform({ flip: t2, origin: e2 }, true); }, opacity: function(t2) { return this.attr("opacity", t2); } }), A("radius", { radius: function(t2, e2 = t2) { return "radialGradient" === (this._element || this).type ? this.attr("r", new _t(t2)) : this.rx(t2).ry(e2); } }), A("Path", { length: function() { return this.node.getTotalLength(); }, pointAt: function(t2) { return new bt(this.node.getPointAtLength(t2)); } }), A(["Element", "Runner"], { font: function(t2, e2) { if ("object" == typeof t2) { for (e2 in t2) this.font(e2, t2[e2]); return this; } return "leading" === t2 ? this.leading(e2) : "anchor" === t2 ? this.attr("text-anchor", e2) : "size" === t2 || "family" === t2 || "weight" === t2 || "stretch" === t2 || "variant" === t2 || "style" === t2 ? this.attr("font-" + t2, e2) : this.attr(t2, e2); } }); A("Element", ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mouseout", "mousemove", "mouseenter", "mouseleave", "touchstart", "touchmove", "touchleave", "touchend", "touchcancel", "contextmenu", "wheel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel"].reduce((function(t2, e2) { return t2[e2] = function(t3) { return null === t3 ? this.off(e2) : this.on(e2, t3), this; }, t2; }), {})), A("Element", { untransform: function() { return this.attr("transform", null); }, matrixify: function() { const t2 = (this.attr("transform") || "").split(st).slice(0, -1).map((function(t3) { const e2 = t3.trim().split("("); return [e2[0], e2[1].split(dt).map((function(t4) { return parseFloat(t4); }))]; })).reverse().reduce((function(t3, e2) { return "matrix" === e2[0] ? t3.lmultiply(vt.fromArray(e2[1])) : t3[e2[0]].apply(t3, e2[1]); }), new vt()); return t2; }, toParent: function(t2, e2) { if (this === t2) return this; if (X(this.node)) return this.addTo(t2, e2); const i2 = this.screenCTM(), a2 = t2.screenCTM().inverse(); return this.addTo(t2, e2).untransform().transform(a2.multiply(i2)), this; }, toRoot: function(t2) { return this.toParent(this.root(), t2); }, transform: function(t2, e2) { if (null == t2 || "string" == typeof t2) { const e3 = new vt(this).decompose(); return null == t2 ? e3 : e3[t2]; } vt.isMatrixLike(t2) || (t2 = { ...t2, origin: T(t2, this) }); const i2 = new vt(true === e2 ? this : e2 || false).transform(t2); return this.attr("transform", i2); } }); var Vt = class _Vt extends Gt { flatten() { return this.each((function() { if (this instanceof _Vt) return this.flatten().ungroup(); })), this; } ungroup(t2 = this.parent(), e2 = t2.index(this)) { return e2 = -1 === e2 ? t2.children().length : e2, this.each((function(i2, a2) { return a2[a2.length - i2 - 1].toParent(t2, e2); })), this.remove(); } }; q(Vt, "Container"); var Ut = class extends Vt { constructor(t2, e2 = t2) { super(G("defs", t2), e2); } flatten() { return this; } ungroup() { return this; } }; q(Ut, "Defs"); var qt = class extends Gt { }; function Zt(t2) { return this.attr("rx", t2); } function $t(t2) { return this.attr("ry", t2); } function Jt(t2) { return null == t2 ? this.cx() - this.rx() : this.cx(t2 + this.rx()); } function Qt(t2) { return null == t2 ? this.cy() - this.ry() : this.cy(t2 + this.ry()); } function Kt(t2) { return this.attr("cx", t2); } function te(t2) { return this.attr("cy", t2); } function ee(t2) { return null == t2 ? 2 * this.rx() : this.rx(new _t(t2).divide(2)); } function ie(t2) { return null == t2 ? 2 * this.ry() : this.ry(new _t(t2).divide(2)); } q(qt, "Shape"); var ae = Object.freeze({ __proto__: null, cx: Kt, cy: te, height: ie, rx: Zt, ry: $t, width: ee, x: Jt, y: Qt }); var se = class extends qt { constructor(t2, e2 = t2) { super(G("ellipse", t2), e2); } size(t2, e2) { const i2 = I(this, t2, e2); return this.rx(new _t(i2.width).divide(2)).ry(new _t(i2.height).divide(2)); } }; Q(se, ae), A("Container", { ellipse: K((function(t2 = 0, e2 = t2) { return this.put(new se()).size(t2, e2).move(0, 0); })) }), q(se, "Ellipse"); var re = class extends Bt { constructor(t2 = O.document.createDocumentFragment()) { super(t2); } xml(t2, e2, i2) { if ("boolean" == typeof t2 && (i2 = e2, e2 = t2, t2 = null), null == t2 || "function" == typeof t2) { const t3 = new Bt(W("wrapper", i2)); return t3.add(this.node.cloneNode(true)), t3.xml(false, i2); } return super.xml(t2, false, i2); } }; function ne(t2, e2) { return "radialGradient" === (this._element || this).type ? this.attr({ fx: new _t(t2), fy: new _t(e2) }) : this.attr({ x1: new _t(t2), y1: new _t(e2) }); } function oe(t2, e2) { return "radialGradient" === (this._element || this).type ? this.attr({ cx: new _t(t2), cy: new _t(e2) }) : this.attr({ x2: new _t(t2), y2: new _t(e2) }); } q(re, "Fragment"); var le = Object.freeze({ __proto__: null, from: ne, to: oe }); var he = class extends Vt { constructor(t2, e2) { super(G(t2 + "Gradient", "string" == typeof t2 ? null : t2), e2); } attr(t2, e2, i2) { return "transform" === t2 && (t2 = "gradientTransform"), super.attr(t2, e2, i2); } bbox() { return new kt(); } targets() { return Lt("svg [fill*=" + this.id() + "]"); } toString() { return this.url(); } update(t2) { return this.clear(), "function" == typeof t2 && t2.call(this, this), this; } url() { return "url(#" + this.id() + ")"; } }; Q(he, le), A({ Container: { gradient(...t2) { return this.defs().gradient(...t2); } }, Defs: { gradient: K((function(t2, e2) { return this.put(new he(t2)).update(e2); })) } }), q(he, "Gradient"); var ce = class extends Vt { constructor(t2, e2 = t2) { super(G("pattern", t2), e2); } attr(t2, e2, i2) { return "transform" === t2 && (t2 = "patternTransform"), super.attr(t2, e2, i2); } bbox() { return new kt(); } targets() { return Lt("svg [fill*=" + this.id() + "]"); } toString() { return this.url(); } update(t2) { return this.clear(), "function" == typeof t2 && t2.call(this, this), this; } url() { return "url(#" + this.id() + ")"; } }; A({ Container: { pattern(...t2) { return this.defs().pattern(...t2); } }, Defs: { pattern: K((function(t2, e2, i2) { return this.put(new ce()).update(i2).attr({ x: 0, y: 0, width: t2, height: e2, patternUnits: "userSpaceOnUse" }); })) } }), q(ce, "Pattern"); var de = class extends qt { constructor(t2, e2 = t2) { super(G("image", t2), e2); } load(t2, e2) { if (!t2) return this; const i2 = new O.window.Image(); return zt(i2, "load", (function(t3) { const a2 = this.parent(ce); 0 === this.width() && 0 === this.height() && this.size(i2.width, i2.height), a2 instanceof ce && 0 === a2.width() && 0 === a2.height() && a2.size(this.width(), this.height()), "function" == typeof e2 && e2.call(this, t3); }), this), zt(i2, "load error", (function() { Xt(i2); })), this.attr("href", i2.src = t2, H); } }; var ue; ue = function(t2, e2, i2) { return "fill" !== t2 && "stroke" !== t2 || ct.test(e2) && (e2 = i2.root().defs().image(e2)), e2 instanceof de && (e2 = i2.root().defs().pattern(0, 0, ((t3) => { t3.add(e2); }))), e2; }, Wt.push(ue), A({ Container: { image: K((function(t2, e2) { return this.put(new de()).size(0, 0).load(t2, e2); })) } }), q(de, "Image"); var ge = class extends Dt { bbox() { let t2 = -1 / 0, e2 = -1 / 0, i2 = 1 / 0, a2 = 1 / 0; return this.forEach((function(s2) { t2 = Math.max(s2[0], t2), e2 = Math.max(s2[1], e2), i2 = Math.min(s2[0], i2), a2 = Math.min(s2[1], a2); })), new kt(i2, a2, t2 - i2, e2 - a2); } move(t2, e2) { const i2 = this.bbox(); if (t2 -= i2.x, e2 -= i2.y, !isNaN(t2) && !isNaN(e2)) for (let i3 = this.length - 1; i3 >= 0; i3--) this[i3] = [this[i3][0] + t2, this[i3][1] + e2]; return this; } parse(t2 = [0, 0]) { const e2 = []; (t2 = t2 instanceof Array ? Array.prototype.concat.apply([], t2) : t2.trim().split(dt).map(parseFloat)).length % 2 != 0 && t2.pop(); for (let i2 = 0, a2 = t2.length; i2 < a2; i2 += 2) e2.push([t2[i2], t2[i2 + 1]]); return e2; } size(t2, e2) { let i2; const a2 = this.bbox(); for (i2 = this.length - 1; i2 >= 0; i2--) a2.width && (this[i2][0] = (this[i2][0] - a2.x) * t2 / a2.width + a2.x), a2.height && (this[i2][1] = (this[i2][1] - a2.y) * e2 / a2.height + a2.y); return this; } toLine() { return { x1: this[0][0], y1: this[0][1], x2: this[1][0], y2: this[1][1] }; } toString() { const t2 = []; for (let e2 = 0, i2 = this.length; e2 < i2; e2++) t2.push(this[e2].join(",")); return t2.join(" "); } transform(t2) { return this.clone().transformO(t2); } transformO(t2) { vt.isMatrixLike(t2) || (t2 = new vt(t2)); for (let e2 = this.length; e2--; ) { const [i2, a2] = this[e2]; this[e2][0] = t2.a * i2 + t2.c * a2 + t2.e, this[e2][1] = t2.b * i2 + t2.d * a2 + t2.f; } return this; } }; var pe = ge; var fe = Object.freeze({ __proto__: null, MorphArray: pe, height: function(t2) { const e2 = this.bbox(); return null == t2 ? e2.height : this.size(e2.width, t2); }, width: function(t2) { const e2 = this.bbox(); return null == t2 ? e2.width : this.size(t2, e2.height); }, x: function(t2) { return null == t2 ? this.bbox().x : this.move(t2, this.bbox().y); }, y: function(t2) { return null == t2 ? this.bbox().y : this.move(this.bbox().x, t2); } }); var xe = class extends qt { constructor(t2, e2 = t2) { super(G("line", t2), e2); } array() { return new ge([[this.attr("x1"), this.attr("y1")], [this.attr("x2"), this.attr("y2")]]); } move(t2, e2) { return this.attr(this.array().move(t2, e2).toLine()); } plot(t2, e2, i2, a2) { return null == t2 ? this.array() : (t2 = void 0 !== e2 ? { x1: t2, y1: e2, x2: i2, y2: a2 } : new ge(t2).toLine(), this.attr(t2)); } size(t2, e2) { const i2 = I(this, t2, e2); return this.attr(this.array().size(i2.width, i2.height).toLine()); } }; Q(xe, fe), A({ Container: { line: K((function(...t2) { return xe.prototype.plot.apply(this.put(new xe()), null != t2[0] ? t2 : [0, 0, 0, 0]); })) } }), q(xe, "Line"); var be = class extends Vt { constructor(t2, e2 = t2) { super(G("marker", t2), e2); } height(t2) { return this.attr("markerHeight", t2); } orient(t2) { return this.attr("orient", t2); } ref(t2, e2) { return this.attr("refX", t2).attr("refY", e2); } toString() { return "url(#" + this.id() + ")"; } update(t2) { return this.clear(), "function" == typeof t2 && t2.call(this, this), this; } width(t2) { return this.attr("markerWidth", t2); } }; function me(t2, e2) { return function(i2) { return null == i2 ? this[t2] : (this[t2] = i2, e2 && e2.call(this), this); }; } A({ Container: { marker(...t2) { return this.defs().marker(...t2); } }, Defs: { marker: K((function(t2, e2, i2) { return this.put(new be()).size(t2, e2).ref(t2 / 2, e2 / 2).viewbox(0, 0, t2, e2).attr("orient", "auto").update(i2); })) }, marker: { marker(t2, e2, i2, a2) { let s2 = ["marker"]; return "all" !== t2 && s2.push(t2), s2 = s2.join("-"), t2 = arguments[1] instanceof be ? arguments[1] : this.defs().marker(e2, i2, a2), this.attr(s2, t2); } } }), q(be, "Marker"); var ve = { "-": function(t2) { return t2; }, "<>": function(t2) { return -Math.cos(t2 * Math.PI) / 2 + 0.5; }, ">": function(t2) { return Math.sin(t2 * Math.PI / 2); }, "<": function(t2) { return 1 - Math.cos(t2 * Math.PI / 2); }, bezier: function(t2, e2, i2, a2) { return function(s2) { return s2 < 0 ? t2 > 0 ? e2 / t2 * s2 : i2 > 0 ? a2 / i2 * s2 : 0 : s2 > 1 ? i2 < 1 ? (1 - a2) / (1 - i2) * s2 + (a2 - i2) / (1 - i2) : t2 < 1 ? (1 - e2) / (1 - t2) * s2 + (e2 - t2) / (1 - t2) : 1 : 3 * s2 * (1 - s2) ** 2 * e2 + 3 * s2 ** 2 * (1 - s2) * a2 + s2 ** 3; }; }, steps: function(t2, e2 = "end") { e2 = e2.split("-").reverse()[0]; let i2 = t2; return "none" === e2 ? --i2 : "both" === e2 && ++i2, (a2, s2 = false) => { let r2 = Math.floor(a2 * t2); const n2 = a2 * r2 % 1 == 0; return "start" !== e2 && "both" !== e2 || ++r2, s2 && n2 && --r2, a2 >= 0 && r2 < 0 && (r2 = 0), a2 <= 1 && r2 > i2 && (r2 = i2), r2 / i2; }; } }; var ye = class { done() { return false; } }; var we = class extends ye { constructor(t2 = Ht) { super(), this.ease = ve[t2] || t2; } step(t2, e2, i2) { return "number" != typeof t2 ? i2 < 1 ? t2 : e2 : t2 + (e2 - t2) * this.ease(i2); } }; var ke = class extends ye { constructor(t2) { super(), this.stepper = t2; } done(t2) { return t2.done; } step(t2, e2, i2, a2) { return this.stepper(t2, e2, i2, a2); } }; function Ae() { const t2 = (this._duration || 500) / 1e3, e2 = this._overshoot || 0, i2 = Math.PI, a2 = Math.log(e2 / 100 + 1e-10), s2 = -a2 / Math.sqrt(i2 * i2 + a2 * a2), r2 = 3.9 / (s2 * t2); this.d = 2 * s2 * r2, this.k = r2 * r2; } Q(class extends ke { constructor(t2 = 500, e2 = 0) { super(), this.duration(t2).overshoot(e2); } step(t2, e2, i2, a2) { if ("string" == typeof t2) return t2; if (a2.done = i2 === 1 / 0, i2 === 1 / 0) return e2; if (0 === i2) return t2; i2 > 100 && (i2 = 16), i2 /= 1e3; const s2 = a2.velocity || 0, r2 = -this.d * s2 - this.k * (t2 - e2), n2 = t2 + s2 * i2 + r2 * i2 * i2 / 2; return a2.velocity = s2 + r2 * i2, a2.done = Math.abs(e2 - n2) + Math.abs(s2) < 2e-3, a2.done ? e2 : n2; } }, { duration: me("_duration", Ae), overshoot: me("_overshoot", Ae) }); Q(class extends ke { constructor(t2 = 0.1, e2 = 0.01, i2 = 0, a2 = 1e3) { super(), this.p(t2).i(e2).d(i2).windup(a2); } step(t2, e2, i2, a2) { if ("string" == typeof t2) return t2; if (a2.done = i2 === 1 / 0, i2 === 1 / 0) return e2; if (0 === i2) return t2; const s2 = e2 - t2; let r2 = (a2.integral || 0) + s2 * i2; const n2 = (s2 - (a2.error || 0)) / i2, o2 = this._windup; return false !== o2 && (r2 = Math.max(-o2, Math.min(r2, o2))), a2.error = s2, a2.integral = r2, a2.done = Math.abs(s2) < 1e-3, a2.done ? e2 : t2 + (this.P * s2 + this.I * r2 + this.D * n2); } }, { windup: me("_windup"), p: me("P"), i: me("I"), d: me("D") }); var Ce = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 }; var Se = { M: function(t2, e2, i2) { return e2.x = i2.x = t2[0], e2.y = i2.y = t2[1], ["M", e2.x, e2.y]; }, L: function(t2, e2) { return e2.x = t2[0], e2.y = t2[1], ["L", t2[0], t2[1]]; }, H: function(t2, e2) { return e2.x = t2[0], ["H", t2[0]]; }, V: function(t2, e2) { return e2.y = t2[0], ["V", t2[0]]; }, C: function(t2, e2) { return e2.x = t2[4], e2.y = t2[5], ["C", t2[0], t2[1], t2[2], t2[3], t2[4], t2[5]]; }, S: function(t2, e2) { return e2.x = t2[2], e2.y = t2[3], ["S", t2[0], t2[1], t2[2], t2[3]]; }, Q: function(t2, e2) { return e2.x = t2[2], e2.y = t2[3], ["Q", t2[0], t2[1], t2[2], t2[3]]; }, T: function(t2, e2) { return e2.x = t2[0], e2.y = t2[1], ["T", t2[0], t2[1]]; }, Z: function(t2, e2, i2) { return e2.x = i2.x, e2.y = i2.y, ["Z"]; }, A: function(t2, e2) { return e2.x = t2[5], e2.y = t2[6], ["A", t2[0], t2[1], t2[2], t2[3], t2[4], t2[5], t2[6]]; } }; var Le = "mlhvqtcsaz".split(""); for (let t2 = 0, e2 = Le.length; t2 < e2; ++t2) Se[Le[t2]] = /* @__PURE__ */ (function(t3) { return function(e3, i2, a2) { if ("H" === t3) e3[0] = e3[0] + i2.x; else if ("V" === t3) e3[0] = e3[0] + i2.y; else if ("A" === t3) e3[5] = e3[5] + i2.x, e3[6] = e3[6] + i2.y; else for (let t4 = 0, a3 = e3.length; t4 < a3; ++t4) e3[t4] = e3[t4] + (t4 % 2 ? i2.y : i2.x); return Se[t3](e3, i2, a2); }; })(Le[t2].toUpperCase()); function Me(t2) { return t2.segment.length && t2.segment.length - 1 === Ce[t2.segment[0].toUpperCase()]; } function Pe(t2, e2) { t2.inNumber && Ie(t2, false); const i2 = ut.test(e2); if (i2) t2.segment = [e2]; else { const e3 = t2.lastCommand, i3 = e3.toLowerCase(), a2 = e3 === i3; t2.segment = ["m" === i3 ? a2 ? "l" : "L" : e3]; } return t2.inSegment = true, t2.lastCommand = t2.segment[0], i2; } function Ie(t2, e2) { if (!t2.inNumber) throw new Error("Parser Error"); t2.number && t2.segment.push(parseFloat(t2.number)), t2.inNumber = e2, t2.number = "", t2.pointSeen = false, t2.hasExponent = false, Me(t2) && Te(t2); } function Te(t2) { t2.inSegment = false, t2.absolute && (t2.segment = (function(t3) { const e2 = t3.segment[0]; return Se[e2](t3.segment.slice(1), t3.p, t3.p0); })(t2)), t2.segments.push(t2.segment); } function ze(t2) { if (!t2.segment.length) return false; const e2 = "A" === t2.segment[0].toUpperCase(), i2 = t2.segment.length; return e2 && (4 === i2 || 5 === i2); } function Xe(t2) { return "E" === t2.lastToken.toUpperCase(); } var Re = /* @__PURE__ */ new Set([" ", ",", " ", "\n", "\r", "\f"]); var Ee = class extends Dt { bbox() { return yt().path.setAttribute("d", this.toString()), new kt(yt.nodes.path.getBBox()); } move(t2, e2) { const i2 = this.bbox(); if (t2 -= i2.x, e2 -= i2.y, !isNaN(t2) && !isNaN(e2)) for (let i3, a2 = this.length - 1; a2 >= 0; a2--) i3 = this[a2][0], "M" === i3 || "L" === i3 || "T" === i3 ? (this[a2][1] += t2, this[a2][2] += e2) : "H" === i3 ? this[a2][1] += t2 : "V" === i3 ? this[a2][1] += e2 : "C" === i3 || "S" === i3 || "Q" === i3 ? (this[a2][1] += t2, this[a2][2] += e2, this[a2][3] += t2, this[a2][4] += e2, "C" === i3 && (this[a2][5] += t2, this[a2][6] += e2)) : "A" === i3 && (this[a2][6] += t2, this[a2][7] += e2); return this; } parse(t2 = "M0 0") { return Array.isArray(t2) && (t2 = Array.prototype.concat.apply([], t2).toString()), (function(t3, e2 = true) { let i2 = 0, a2 = ""; const s2 = { segment: [], inNumber: false, number: "", lastToken: "", inSegment: false, segments: [], pointSeen: false, hasExponent: false, absolute: e2, p0: new bt(), p: new bt() }; for (; s2.lastToken = a2, a2 = t3.charAt(i2++); ) if (s2.inSegment || !Pe(s2, a2)) if ("." !== a2) if (isNaN(parseInt(a2))) if (Re.has(a2)) s2.inNumber && Ie(s2, false); else if ("-" !== a2 && "+" !== a2) if ("E" !== a2.toUpperCase()) { if (ut.test(a2)) { if (s2.inNumber) Ie(s2, false); else { if (!Me(s2)) throw new Error("parser Error"); Te(s2); } --i2; } } else s2.number += a2, s2.hasExponent = true; else { if (s2.inNumber && !Xe(s2)) { Ie(s2, false), --i2; continue; } s2.number += a2, s2.inNumber = true; } else { if ("0" === s2.number || ze(s2)) { s2.inNumber = true, s2.number = a2, Ie(s2, true); continue; } s2.inNumber = true, s2.number += a2; } else { if (s2.pointSeen || s2.hasExponent) { Ie(s2, false), --i2; continue; } s2.inNumber = true, s2.pointSeen = true, s2.number += a2; } return s2.inNumber && Ie(s2, false), s2.inSegment && Me(s2) && Te(s2), s2.segments; })(t2); } size(t2, e2) { const i2 = this.bbox(); let a2, s2; for (i2.width = 0 === i2.width ? 1 : i2.width, i2.height = 0 === i2.height ? 1 : i2.height, a2 = this.length - 1; a2 >= 0; a2--) s2 = this[a2][0], "M" === s2 || "L" === s2 || "T" === s2 ? (this[a2][1] = (this[a2][1] - i2.x) * t2 / i2.width + i2.x, this[a2][2] = (this[a2][2] - i2.y) * e2 / i2.height + i2.y) : "H" === s2 ? this[a2][1] = (this[a2][1] - i2.x) * t2 / i2.width + i2.x : "V" === s2 ? this[a2][1] = (this[a2][1] - i2.y) * e2 / i2.height + i2.y : "C" === s2 || "S" === s2 || "Q" === s2 ? (this[a2][1] = (this[a2][1] - i2.x) * t2 / i2.width + i2.x, this[a2][2] = (this[a2][2] - i2.y) * e2 / i2.height + i2.y, this[a2][3] = (this[a2][3] - i2.x) * t2 / i2.width + i2.x, this[a2][4] = (this[a2][4] - i2.y) * e2 / i2.height + i2.y, "C" === s2 && (this[a2][5] = (this[a2][5] - i2.x) * t2 / i2.width + i2.x, this[a2][6] = (this[a2][6] - i2.y) * e2 / i2.height + i2.y)) : "A" === s2 && (this[a2][1] = this[a2][1] * t2 / i2.width, this[a2][2] = this[a2][2] * e2 / i2.height, this[a2][6] = (this[a2][6] - i2.x) * t2 / i2.width + i2.x, this[a2][7] = (this[a2][7] - i2.y) * e2 / i2.height + i2.y); return this; } toString() { return (function(t2) { let e2 = ""; for (let i2 = 0, a2 = t2.length; i2 < a2; i2++) e2 += t2[i2][0], null != t2[i2][1] && (e2 += t2[i2][1], null != t2[i2][2] && (e2 += " ", e2 += t2[i2][2], null != t2[i2][3] && (e2 += " ", e2 += t2[i2][3], e2 += " ", e2 += t2[i2][4], null != t2[i2][5] && (e2 += " ", e2 += t2[i2][5], e2 += " ", e2 += t2[i2][6], null != t2[i2][7] && (e2 += " ", e2 += t2[i2][7]))))); return e2 + " "; })(this); } }; var Ye = (t2) => { const e2 = typeof t2; return "number" === e2 ? _t : "string" === e2 ? xt.isColor(t2) ? xt : dt.test(t2) ? ut.test(t2) ? Ee : Dt : tt.test(t2) ? _t : Oe : Ne.indexOf(t2.constructor) > -1 ? t2.constructor : Array.isArray(t2) ? Dt : "object" === e2 ? _e : Oe; }; var He = class { constructor(t2) { this._stepper = t2 || new we("-"), this._from = null, this._to = null, this._type = null, this._context = null, this._morphObj = null; } at(t2) { return this._morphObj.morph(this._from, this._to, t2, this._stepper, this._context); } done() { return this._context.map(this._stepper.done).reduce((function(t2, e2) { return t2 && e2; }), true); } from(t2) { return null == t2 ? this._from : (this._from = this._set(t2), this); } stepper(t2) { return null == t2 ? this._stepper : (this._stepper = t2, this); } to(t2) { return null == t2 ? this._to : (this._to = this._set(t2), this); } type(t2) { return null == t2 ? this._type : (this._type = t2, this); } _set(t2) { this._type || this.type(Ye(t2)); let e2 = new this._type(t2); return this._type === xt && (e2 = this._to ? e2[this._to[4]]() : this._from ? e2[this._from[4]]() : e2), this._type === _e && (e2 = this._to ? e2.align(this._to) : this._from ? e2.align(this._from) : e2), e2 = e2.toConsumable(), this._morphObj = this._morphObj || new this._type(), this._context = this._context || Array.apply(null, Array(e2.length)).map(Object).map((function(t3) { return t3.done = true, t3; })), e2; } }; var Oe = class { constructor(...t2) { this.init(...t2); } init(t2) { return t2 = Array.isArray(t2) ? t2[0] : t2, this.value = t2, this; } toArray() { return [this.value]; } valueOf() { return this.value; } }; var Fe = class _Fe { constructor(...t2) { this.init(...t2); } init(t2) { return Array.isArray(t2) && (t2 = { scaleX: t2[0], scaleY: t2[1], shear: t2[2], rotate: t2[3], translateX: t2[4], translateY: t2[5], originX: t2[6], originY: t2[7] }), Object.assign(this, _Fe.defaults, t2), this; } toArray() { const t2 = this; return [t2.scaleX, t2.scaleY, t2.shear, t2.rotate, t2.translateX, t2.translateY, t2.originX, t2.originY]; } }; Fe.defaults = { scaleX: 1, scaleY: 1, shear: 0, rotate: 0, translateX: 0, translateY: 0, originX: 0, originY: 0 }; var De = (t2, e2) => t2[0] < e2[0] ? -1 : t2[0] > e2[0] ? 1 : 0; var _e = class { constructor(...t2) { this.init(...t2); } align(t2) { const e2 = this.values; for (let i2 = 0, a2 = e2.length; i2 < a2; ++i2) { if (e2[i2 + 1] === t2[i2 + 1]) { if (e2[i2 + 1] === xt && t2[i2 + 7] !== e2[i2 + 7]) { const e3 = t2[i2 + 7], a4 = new xt(this.values.splice(i2 + 3, 5))[e3]().toArray(); this.values.splice(i2 + 3, 0, ...a4); } i2 += e2[i2 + 2] + 2; continue; } if (!t2[i2 + 1]) return this; const a3 = new t2[i2 + 1]().toArray(), s2 = e2[i2 + 2] + 3; e2.splice(i2, s2, t2[i2], t2[i2 + 1], t2[i2 + 2], ...a3), i2 += e2[i2 + 2] + 2; } return this; } init(t2) { if (this.values = [], Array.isArray(t2)) return void (this.values = t2.slice()); t2 = t2 || {}; const e2 = []; for (const i2 in t2) { const a2 = Ye(t2[i2]), s2 = new a2(t2[i2]).toArray(); e2.push([i2, a2, s2.length, ...s2]); } return e2.sort(De), this.values = e2.reduce(((t3, e3) => t3.concat(e3)), []), this; } toArray() { return this.values; } valueOf() { const t2 = {}, e2 = this.values; for (; e2.length; ) { const i2 = e2.shift(), a2 = e2.shift(), s2 = e2.shift(), r2 = e2.splice(0, s2); t2[i2] = new a2(r2); } return t2; } }; var Ne = [Oe, Fe, _e]; var We = class extends qt { constructor(t2, e2 = t2) { super(G("path", t2), e2); } array() { return this._array || (this._array = new Ee(this.attr("d"))); } clear() { return delete this._array, this; } height(t2) { return null == t2 ? this.bbox().height : this.size(this.bbox().width, t2); } move(t2, e2) { return this.attr("d", this.array().move(t2, e2)); } plot(t2) { return null == t2 ? this.array() : this.clear().attr("d", "string" == typeof t2 ? t2 : this._array = new Ee(t2)); } size(t2, e2) { const i2 = I(this, t2, e2); return this.attr("d", this.array().size(i2.width, i2.height)); } width(t2) { return null == t2 ? this.bbox().width : this.size(t2, this.bbox().height); } x(t2) { return null == t2 ? this.bbox().x : this.move(t2, this.bbox().y); } y(t2) { return null == t2 ? this.bbox().y : this.move(this.bbox().x, t2); } }; We.prototype.MorphArray = Ee, A({ Container: { path: K((function(t2) { return this.put(new We()).plot(t2 || new Ee()); })) } }), q(We, "Path"); var Be = Object.freeze({ __proto__: null, array: function() { return this._array || (this._array = new ge(this.attr("points"))); }, clear: function() { return delete this._array, this; }, move: function(t2, e2) { return this.attr("points", this.array().move(t2, e2)); }, plot: function(t2) { return null == t2 ? this.array() : this.clear().attr("points", "string" == typeof t2 ? t2 : this._array = new ge(t2)); }, size: function(t2, e2) { const i2 = I(this, t2, e2); return this.attr("points", this.array().size(i2.width, i2.height)); } }); var Ge = class extends qt { constructor(t2, e2 = t2) { super(G("polygon", t2), e2); } }; A({ Container: { polygon: K((function(t2) { return this.put(new Ge()).plot(t2 || new ge()); })) } }), Q(Ge, fe), Q(Ge, Be), q(Ge, "Polygon"); var je = class extends qt { constructor(t2, e2 = t2) { super(G("polyline", t2), e2); } }; A({ Container: { polyline: K((function(t2) { return this.put(new je()).plot(t2 || new ge()); })) } }), Q(je, fe), Q(je, Be), q(je, "Polyline"); var Ve = class extends qt { constructor(t2, e2 = t2) { super(G("rect", t2), e2); } }; Q(Ve, { rx: Zt, ry: $t }), A({ Container: { rect: K((function(t2, e2) { return this.put(new Ve()).size(t2, e2); })) } }), q(Ve, "Rect"); var Ue = class { constructor() { this._first = null, this._last = null; } first() { return this._first && this._first.value; } last() { return this._last && this._last.value; } push(t2) { const e2 = void 0 !== t2.next ? t2 : { value: t2, next: null, prev: null }; return this._last ? (e2.prev = this._last, this._last.next = e2, this._last = e2) : (this._last = e2, this._first = e2), e2; } remove(t2) { t2.prev && (t2.prev.next = t2.next), t2.next && (t2.next.prev = t2.prev), t2 === this._last && (this._last = t2.prev), t2 === this._first && (this._first = t2.next), t2.prev = null, t2.next = null; } shift() { const t2 = this._first; return t2 ? (this._first = t2.next, this._first && (this._first.prev = null), this._last = this._first ? this._last : null, t2.value) : null; } }; var qe = { nextDraw: null, frames: new Ue(), timeouts: new Ue(), immediates: new Ue(), timer: () => O.window.performance || O.window.Date, transforms: [], frame(t2) { const e2 = qe.frames.push({ run: t2 }); return null === qe.nextDraw && (qe.nextDraw = O.window.requestAnimationFrame(qe._draw)), e2; }, timeout(t2, e2) { e2 = e2 || 0; const i2 = qe.timer().now() + e2, a2 = qe.timeouts.push({ run: t2, time: i2 }); return null === qe.nextDraw && (qe.nextDraw = O.window.requestAnimationFrame(qe._draw)), a2; }, immediate(t2) { const e2 = qe.immediates.push(t2); return null === qe.nextDraw && (qe.nextDraw = O.window.requestAnimationFrame(qe._draw)), e2; }, cancelFrame(t2) { null != t2 && qe.frames.remove(t2); }, clearTimeout(t2) { null != t2 && qe.timeouts.remove(t2); }, cancelImmediate(t2) { null != t2 && qe.immediates.remove(t2); }, _draw(t2) { let e2 = null; const i2 = qe.timeouts.last(); for (; (e2 = qe.timeouts.shift()) && (t2 >= e2.time ? e2.run() : qe.timeouts.push(e2), e2 !== i2); ) ; let a2 = null; const s2 = qe.frames.last(); for (; a2 !== s2 && (a2 = qe.frames.shift()); ) a2.run(t2); let r2 = null; for (; r2 = qe.immediates.shift(); ) r2(); qe.nextDraw = qe.timeouts.first() || qe.frames.first() ? O.window.requestAnimationFrame(qe._draw) : null; } }; var Ze = function(t2) { const e2 = t2.start, i2 = t2.runner.duration(); return { start: e2, duration: i2, end: e2 + i2, runner: t2.runner }; }; var $e = function() { const t2 = O.window; return (t2.performance || t2.Date).now(); }; var Je = class extends Rt { constructor(t2 = $e) { super(), this._timeSource = t2, this.terminate(); } active() { return !!this._nextFrame; } finish() { return this.time(this.getEndTimeOfTimeline() + 1), this.pause(); } getEndTime() { const t2 = this.getLastRunnerInfo(), e2 = t2 ? t2.runner.duration() : 0; return (t2 ? t2.start : this._time) + e2; } getEndTimeOfTimeline() { const t2 = this._runners.map(((t3) => t3.start + t3.runner.duration())); return Math.max(0, ...t2); } getLastRunnerInfo() { return this.getRunnerInfoById(this._lastRunnerId); } getRunnerInfoById(t2) { return this._runners[this._runnerIds.indexOf(t2)] || null; } pause() { return this._paused = true, this._continue(); } persist(t2) { return null == t2 ? this._persist : (this._persist = t2, this); } play() { return this._paused = false, this.updateTime()._continue(); } reverse(t2) { const e2 = this.speed(); if (null == t2) return this.speed(-e2); const i2 = Math.abs(e2); return this.speed(t2 ? -i2 : i2); } schedule(t2, e2, i2) { if (null == t2) return this._runners.map(Ze); let a2 = 0; const s2 = this.getEndTime(); if (e2 = e2 || 0, null == i2 || "last" === i2 || "after" === i2) a2 = s2; else if ("absolute" === i2 || "start" === i2) a2 = e2, e2 = 0; else if ("now" === i2) a2 = this._time; else if ("relative" === i2) { const i3 = this.getRunnerInfoById(t2.id); i3 && (a2 = i3.start + e2, e2 = 0); } else { if ("with-last" !== i2) throw new Error('Invalid value for the "when" parameter'); { const t3 = this.getLastRunnerInfo(); a2 = t3 ? t3.start : this._time; } } t2.unschedule(), t2.timeline(this); const r2 = t2.persist(), n2 = { persist: null === r2 ? this._persist : r2, start: a2 + e2, runner: t2 }; return this._lastRunnerId = t2.id, this._runners.push(n2), this._runners.sort(((t3, e3) => t3.start - e3.start)), this._runnerIds = this._runners.map(((t3) => t3.runner.id)), this.updateTime()._continue(), this; } seek(t2) { return this.time(this._time + t2); } source(t2) { return null == t2 ? this._timeSource : (this._timeSource = t2, this); } speed(t2) { return null == t2 ? this._speed : (this._speed = t2, this); } stop() { return this.time(0), this.pause(); } time(t2) { return null == t2 ? this._time : (this._time = t2, this._continue(true)); } unschedule(t2) { const e2 = this._runnerIds.indexOf(t2.id); return e2 < 0 || (this._runners.splice(e2, 1), this._runnerIds.splice(e2, 1), t2.timeline(null)), this; } updateTime() { return this.active() || (this._lastSourceTime = this._timeSource()), this; } _continue(t2 = false) { return qe.cancelFrame(this._nextFrame), this._nextFrame = null, t2 ? this._stepImmediate() : (this._paused || (this._nextFrame = qe.frame(this._step)), this); } _stepFn(t2 = false) { const e2 = this._timeSource(); let i2 = e2 - this._lastSourceTime; t2 && (i2 = 0); const a2 = this._speed * i2 + (this._time - this._lastStepTime); this._lastSourceTime = e2, t2 || (this._time += a2, this._time = this._time < 0 ? 0 : this._time), this._lastStepTime = this._time, this.fire("time", this._time); for (let t3 = this._runners.length; t3--; ) { const e3 = this._runners[t3], i3 = e3.runner; this._time - e3.start <= 0 && i3.reset(); } let s2 = false; for (let t3 = 0, e3 = this._runners.length; t3 < e3; t3++) { const i3 = this._runners[t3], r2 = i3.runner; let n2 = a2; const o2 = this._time - i3.start; if (o2 <= 0) { s2 = true; continue; } if (o2 < n2 && (n2 = o2), !r2.active()) continue; if (r2.step(n2).done) { if (true !== i3.persist) { r2.duration() - r2.time() + this._time + i3.persist < this._time && (r2.unschedule(), --t3, --e3); } } else s2 = true; } return s2 && !(this._speed < 0 && 0 === this._time) || this._runnerIds.length && this._speed < 0 && this._time > 0 ? this._continue() : (this.pause(), this.fire("finished")), this; } terminate() { this._startTime = 0, this._speed = 1, this._persist = 0, this._nextFrame = null, this._paused = true, this._runners = [], this._runnerIds = [], this._lastRunnerId = -1, this._time = 0, this._lastSourceTime = 0, this._lastStepTime = 0, this._step = this._stepFn.bind(this, false), this._stepImmediate = this._stepFn.bind(this, true); } }; A({ Element: { timeline: function(t2) { return null == t2 ? (this._timeline = this._timeline || new Je(), this._timeline) : (this._timeline = t2, this); } } }); var Qe = class _Qe extends Rt { constructor(t2) { super(), this.id = _Qe.id++, t2 = "function" == typeof (t2 = null == t2 ? Yt : t2) ? new ke(t2) : t2, this._element = null, this._timeline = null, this.done = false, this._queue = [], this._duration = "number" == typeof t2 && t2, this._isDeclarative = t2 instanceof ke, this._stepper = this._isDeclarative ? t2 : new we(), this._history = {}, this.enabled = true, this._time = 0, this._lastTime = 0, this._reseted = true, this.transforms = new vt(), this.transformId = 1, this._haveReversed = false, this._reverse = false, this._loopsDone = 0, this._swing = false, this._wait = 0, this._times = 1, this._frameId = null, this._persist = !!this._isDeclarative || null; } static sanitise(t2, e2, i2) { let a2 = 1, s2 = false, r2 = 0; return e2 = e2 ?? Ot, i2 = i2 || "last", "object" != typeof (t2 = t2 ?? Yt) || t2 instanceof ye || (e2 = t2.delay ?? e2, i2 = t2.when ?? i2, s2 = t2.swing || s2, a2 = t2.times ?? a2, r2 = t2.wait ?? r2, t2 = t2.duration ?? Yt), { duration: t2, delay: e2, swing: s2, times: a2, wait: r2, when: i2 }; } active(t2) { return null == t2 ? this.enabled : (this.enabled = t2, this); } addTransform(t2) { return this.transforms.lmultiplyO(t2), this; } after(t2) { return this.on("finished", t2); } animate(t2, e2, i2) { const a2 = _Qe.sanitise(t2, e2, i2), s2 = new _Qe(a2.duration); return this._timeline && s2.timeline(this._timeline), this._element && s2.element(this._element), s2.loop(a2).schedule(a2.delay, a2.when); } clearTransform() { return this.transforms = new vt(), this; } clearTransformsFromQueue() { this.done && this._timeline && this._timeline._runnerIds.includes(this.id) || (this._queue = this._queue.filter(((t2) => !t2.isTransform))); } delay(t2) { return this.animate(0, t2); } duration() { return this._times * (this._wait + this._duration) - this._wait; } during(t2) { return this.queue(null, t2); } ease(t2) { return this._stepper = new we(t2), this; } element(t2) { return null == t2 ? this._element : (this._element = t2, t2._prepareRunner(), this); } finish() { return this.step(1 / 0); } loop(t2, e2, i2) { return "object" == typeof t2 && (e2 = t2.swing, i2 = t2.wait, t2 = t2.times), this._times = t2 || 1 / 0, this._swing = e2 || false, this._wait = i2 || 0, true === this._times && (this._times = 1 / 0), this; } loops(t2) { const e2 = this._duration + this._wait; if (null == t2) { const t3 = Math.floor(this._time / e2), i3 = (this._time - t3 * e2) / this._duration; return Math.min(t3 + i3, this._times); } const i2 = t2 % 1, a2 = e2 * Math.floor(t2) + this._duration * i2; return this.time(a2); } persist(t2) { return null == t2 ? this._persist : (this._persist = t2, this); } position(t2) { const e2 = this._time, i2 = this._duration, a2 = this._wait, s2 = this._times, r2 = this._swing, n2 = this._reverse; let o2; if (null == t2) { const t3 = function(t4) { const e3 = r2 * Math.floor(t4 % (2 * (a2 + i2)) / (a2 + i2)), s3 = e3 && !n2 || !e3 && n2, o3 = Math.pow(-1, s3) * (t4 % (a2 + i2)) / i2 + s3; return Math.max(Math.min(o3, 1), 0); }, l3 = s2 * (a2 + i2) - a2; return o2 = e2 <= 0 ? Math.round(t3(1e-5)) : e2 < l3 ? t3(e2) : Math.round(t3(l3 - 1e-5)), o2; } const l2 = Math.floor(this.loops()), h2 = r2 && l2 % 2 == 0; return o2 = l2 + (h2 && !n2 || n2 && h2 ? t2 : 1 - t2), this.loops(o2); } progress(t2) { return null == t2 ? Math.min(1, this._time / this.duration()) : this.time(t2 * this.duration()); } queue(t2, e2, i2, a2) { this._queue.push({ initialiser: t2 || Et, runner: e2 || Et, retarget: i2, isTransform: a2, initialised: false, finished: false }); return this.timeline() && this.timeline()._continue(), this; } reset() { return this._reseted || (this.time(0), this._reseted = true), this; } reverse(t2) { return this._reverse = null == t2 ? !this._reverse : t2, this; } schedule(t2, e2, i2) { if (t2 instanceof Je || (i2 = e2, e2 = t2, t2 = this.timeline()), !t2) throw Error("Runner cannot be scheduled without timeline"); return t2.schedule(this, e2, i2), this; } step(t2) { if (!this.enabled) return this; t2 = null == t2 ? 16 : t2, this._time += t2; const e2 = this.position(), i2 = this._lastPosition !== e2 && this._time >= 0; this._lastPosition = e2; const a2 = this.duration(), s2 = this._lastTime <= 0 && this._time > 0, r2 = this._lastTime < a2 && this._time >= a2; this._lastTime = this._time, s2 && this.fire("start", this); const n2 = this._isDeclarative; this.done = !n2 && !r2 && this._time >= a2, this._reseted = false; let o2 = false; return (i2 || n2) && (this._initialise(i2), this.transforms = new vt(), o2 = this._run(n2 ? t2 : e2), this.fire("step", this)), this.done = this.done || o2 && n2, r2 && this.fire("finished", this), this; } time(t2) { if (null == t2) return this._time; const e2 = t2 - this._time; return this.step(e2), this; } timeline(t2) { return void 0 === t2 ? this._timeline : (this._timeline = t2, this); } unschedule() { const t2 = this.timeline(); return t2 && t2.unschedule(this), this; } _initialise(t2) { if (t2 || this._isDeclarative) for (let e2 = 0, i2 = this._queue.length; e2 < i2; ++e2) { const i3 = this._queue[e2], a2 = this._isDeclarative || !i3.initialised && t2; t2 = !i3.finished, a2 && t2 && (i3.initialiser.call(this), i3.initialised = true); } } _rememberMorpher(t2, e2) { if (this._history[t2] = { morpher: e2, caller: this._queue[this._queue.length - 1] }, this._isDeclarative) { const t3 = this.timeline(); t3 && t3.play(); } } _run(t2) { let e2 = true; for (let i2 = 0, a2 = this._queue.length; i2 < a2; ++i2) { const a3 = this._queue[i2], s2 = a3.runner.call(this, t2); a3.finished = a3.finished || true === s2, e2 = e2 && a3.finished; } return e2; } _tryRetarget(t2, e2, i2) { if (this._history[t2]) { if (!this._history[t2].caller.initialised) { const e3 = this._queue.indexOf(this._history[t2].caller); return this._queue.splice(e3, 1), false; } this._history[t2].caller.retarget ? this._history[t2].caller.retarget.call(this, e2, i2) : this._history[t2].morpher.to(e2), this._history[t2].caller.finished = false; const a2 = this.timeline(); return a2 && a2.play(), true; } return false; } }; Qe.id = 0; var Ke = class { constructor(t2 = new vt(), e2 = -1, i2 = true) { this.transforms = t2, this.id = e2, this.done = i2; } clearTransformsFromQueue() { } }; Q([Qe, Ke], { mergeWith(t2) { return new Ke(t2.transforms.lmultiply(this.transforms), t2.id); } }); var ti = (t2, e2) => t2.lmultiplyO(e2); var ei = (t2) => t2.transforms; function ii() { const t2 = this._transformationRunners.runners.map(ei).reduce(ti, new vt()); this.transform(t2), this._transformationRunners.merge(), 1 === this._transformationRunners.length() && (this._frameId = null); } var ai = class { constructor() { this.runners = [], this.ids = []; } add(t2) { if (this.runners.includes(t2)) return; const e2 = t2.id + 1; return this.runners.push(t2), this.ids.push(e2), this; } clearBefore(t2) { const e2 = this.ids.indexOf(t2 + 1) || 1; return this.ids.splice(0, e2, 0), this.runners.splice(0, e2, new Ke()).forEach(((t3) => t3.clearTransformsFromQueue())), this; } edit(t2, e2) { const i2 = this.ids.indexOf(t2 + 1); return this.ids.splice(i2, 1, t2 + 1), this.runners.splice(i2, 1, e2), this; } getByID(t2) { return this.runners[this.ids.indexOf(t2 + 1)]; } length() { return this.ids.length; } merge() { let t2 = null; for (let e2 = 0; e2 < this.runners.length; ++e2) { const i2 = this.runners[e2]; if (t2 && i2.done && t2.done && (!i2._timeline || !i2._timeline._runnerIds.includes(i2.id)) && (!t2._timeline || !t2._timeline._runnerIds.includes(t2.id))) { this.remove(i2.id); const a2 = i2.mergeWith(t2); this.edit(t2.id, a2), t2 = a2, --e2; } else t2 = i2; } return this; } remove(t2) { const e2 = this.ids.indexOf(t2 + 1); return this.ids.splice(e2, 1), this.runners.splice(e2, 1), this; } }; A({ Element: { animate(t2, e2, i2) { const a2 = Qe.sanitise(t2, e2, i2), s2 = this.timeline(); return new Qe(a2.duration).loop(a2).element(this).timeline(s2.play()).schedule(a2.delay, a2.when); }, delay(t2, e2) { return this.animate(0, t2, e2); }, _clearTransformRunnersBefore(t2) { this._transformationRunners.clearBefore(t2.id); }, _currentTransform(t2) { return this._transformationRunners.runners.filter(((e2) => e2.id <= t2.id)).map(ei).reduce(ti, new vt()); }, _addRunner(t2) { this._transformationRunners.add(t2), qe.cancelImmediate(this._frameId), this._frameId = qe.immediate(ii.bind(this)); }, _prepareRunner() { null == this._frameId && (this._transformationRunners = new ai().add(new Ke(new vt(this)))); } } }); Q(Qe, { attr(t2, e2) { return this.styleAttr("attr", t2, e2); }, css(t2, e2) { return this.styleAttr("css", t2, e2); }, styleAttr(t2, e2, i2) { if ("string" == typeof e2) return this.styleAttr(t2, { [e2]: i2 }); let a2 = e2; if (this._tryRetarget(t2, a2)) return this; let s2 = new He(this._stepper).to(a2), r2 = Object.keys(a2); return this.queue((function() { s2 = s2.from(this.element()[t2](r2)); }), (function(e3) { return this.element()[t2](s2.at(e3).valueOf()), s2.done(); }), (function(e3) { const i3 = Object.keys(e3), n2 = (o2 = r2, i3.filter(((t3) => !o2.includes(t3)))); var o2; if (n2.length) { const e4 = this.element()[t2](n2), i4 = new _e(s2.from()).valueOf(); Object.assign(i4, e4), s2.from(i4); } const l2 = new _e(s2.to()).valueOf(); Object.assign(l2, e3), s2.to(l2), r2 = i3, a2 = e3; })), this._rememberMorpher(t2, s2), this; }, zoom(t2, e2) { if (this._tryRetarget("zoom", t2, e2)) return this; let i2 = new He(this._stepper).to(new _t(t2)); return this.queue((function() { i2 = i2.from(this.element().zoom()); }), (function(t3) { return this.element().zoom(i2.at(t3), e2), i2.done(); }), (function(t3, a2) { e2 = a2, i2.to(t3); })), this._rememberMorpher("zoom", i2), this; }, transform(t2, e2, i2) { if (e2 = t2.relative || e2, this._isDeclarative && !e2 && this._tryRetarget("transform", t2)) return this; const a2 = vt.isMatrixLike(t2); i2 = null != t2.affine ? t2.affine : null != i2 ? i2 : !a2; const s2 = new He(this._stepper).type(i2 ? Fe : vt); let r2, n2, o2, l2, h2; return this.queue((function() { n2 = n2 || this.element(), r2 = r2 || T(t2, n2), h2 = new vt(e2 ? void 0 : n2), n2._addRunner(this), e2 || n2._clearTransformRunnersBefore(this); }), (function(c2) { e2 || this.clearTransform(); const { x: d2, y: u2 } = new bt(r2).transform(n2._currentTransform(this)); let g2 = new vt({ ...t2, origin: [d2, u2] }), p2 = this._isDeclarative && o2 ? o2 : h2; if (i2) { g2 = g2.decompose(d2, u2), p2 = p2.decompose(d2, u2); const t3 = g2.rotate, e3 = p2.rotate, i3 = [t3 - 360, t3, t3 + 360], a3 = i3.map(((t4) => Math.abs(t4 - e3))), s3 = Math.min(...a3), r3 = a3.indexOf(s3); g2.rotate = i3[r3]; } e2 && (a2 || (g2.rotate = t2.rotate || 0), this._isDeclarative && l2 && (p2.rotate = l2)), s2.from(p2), s2.to(g2); const f2 = s2.at(c2); return l2 = f2.rotate, o2 = new vt(f2), this.addTransform(o2), n2._addRunner(this), s2.done(); }), (function(e3) { (e3.origin || "center").toString() !== (t2.origin || "center").toString() && (r2 = T(e3, n2)), t2 = { ...e3, origin: r2 }; }), true), this._isDeclarative && this._rememberMorpher("transform", s2), this; }, x(t2) { return this._queueNumber("x", t2); }, y(t2) { return this._queueNumber("y", t2); }, ax(t2) { return this._queueNumber("ax", t2); }, ay(t2) { return this._queueNumber("ay", t2); }, dx(t2 = 0) { return this._queueNumberDelta("x", t2); }, dy(t2 = 0) { return this._queueNumberDelta("y", t2); }, dmove(t2, e2) { return this.dx(t2).dy(e2); }, _queueNumberDelta(t2, e2) { if (e2 = new _t(e2), this._tryRetarget(t2, e2)) return this; const i2 = new He(this._stepper).to(e2); let a2 = null; return this.queue((function() { a2 = this.element()[t2](), i2.from(a2), i2.to(a2 + e2); }), (function(e3) { return this.element()[t2](i2.at(e3)), i2.done(); }), (function(t3) { i2.to(a2 + new _t(t3)); })), this._rememberMorpher(t2, i2), this; }, _queueObject(t2, e2) { if (this._tryRetarget(t2, e2)) return this; const i2 = new He(this._stepper).to(e2); return this.queue((function() { i2.from(this.element()[t2]()); }), (function(e3) { return this.element()[t2](i2.at(e3)), i2.done(); })), this._rememberMorpher(t2, i2), this; }, _queueNumber(t2, e2) { return this._queueObject(t2, new _t(e2)); }, cx(t2) { return this._queueNumber("cx", t2); }, cy(t2) { return this._queueNumber("cy", t2); }, move(t2, e2) { return this.x(t2).y(e2); }, amove(t2, e2) { return this.ax(t2).ay(e2); }, center(t2, e2) { return this.cx(t2).cy(e2); }, size(t2, e2) { let i2; return t2 && e2 || (i2 = this._element.bbox()), t2 || (t2 = i2.width / i2.height * e2), e2 || (e2 = i2.height / i2.width * t2), this.width(t2).height(e2); }, width(t2) { return this._queueNumber("width", t2); }, height(t2) { return this._queueNumber("height", t2); }, plot(t2, e2, i2, a2) { if (4 === arguments.length) return this.plot([t2, e2, i2, a2]); if (this._tryRetarget("plot", t2)) return this; const s2 = new He(this._stepper).type(this._element.MorphArray).to(t2); return this.queue((function() { s2.from(this._element.array()); }), (function(t3) { return this._element.plot(s2.at(t3)), s2.done(); })), this._rememberMorpher("plot", s2), this; }, leading(t2) { return this._queueNumber("leading", t2); }, viewbox(t2, e2, i2, a2) { return this._queueObject("viewbox", new kt(t2, e2, i2, a2)); }, update(t2) { return "object" != typeof t2 ? this.update({ offset: arguments[0], color: arguments[1], opacity: arguments[2] }) : (null != t2.opacity && this.attr("stop-opacity", t2.opacity), null != t2.color && this.attr("stop-color", t2.color), null != t2.offset && this.attr("offset", t2.offset), this); } }), Q(Qe, { rx: Zt, ry: $t, from: ne, to: oe }), q(Qe, "Runner"); var si = class extends Vt { constructor(t2, e2 = t2) { super(G("svg", t2), e2), this.namespace(); } defs() { return this.isRoot() ? V(this.node.querySelector("defs")) || this.put(new Ut()) : this.root().defs(); } isRoot() { return !this.node.parentNode || !(this.node.parentNode instanceof O.window.SVGElement) && "#document-fragment" !== this.node.parentNode.nodeName; } namespace() { return this.isRoot() ? this.attr({ xmlns: E, version: "1.1" }).attr("xmlns:xlink", H, Y) : this.root().namespace(); } removeNamespace() { return this.attr({ xmlns: null, version: null }).attr("xmlns:xlink", null, Y).attr("xmlns:svgjs", null, Y); } root() { return this.isRoot() ? this : super.root(); } }; A({ Container: { nested: K((function() { return this.put(new si()); })) } }), q(si, "Svg", true); var ri = class extends Vt { constructor(t2, e2 = t2) { super(G("symbol", t2), e2); } }; A({ Container: { symbol: K((function() { return this.put(new ri()); })) } }), q(ri, "Symbol"); var ni = Object.freeze({ __proto__: null, amove: function(t2, e2) { return this.ax(t2).ay(e2); }, ax: function(t2) { return this.attr("x", t2); }, ay: function(t2) { return this.attr("y", t2); }, build: function(t2) { return this._build = !!t2, this; }, center: function(t2, e2, i2 = this.bbox()) { return this.cx(t2, i2).cy(e2, i2); }, cx: function(t2, e2 = this.bbox()) { return null == t2 ? e2.cx : this.attr("x", this.attr("x") + t2 - e2.cx); }, cy: function(t2, e2 = this.bbox()) { return null == t2 ? e2.cy : this.attr("y", this.attr("y") + t2 - e2.cy); }, length: function() { return this.node.getComputedTextLength(); }, move: function(t2, e2, i2 = this.bbox()) { return this.x(t2, i2).y(e2, i2); }, plain: function(t2) { return false === this._build && this.clear(), this.node.appendChild(O.document.createTextNode(t2)), this; }, x: function(t2, e2 = this.bbox()) { return null == t2 ? e2.x : this.attr("x", this.attr("x") + t2 - e2.x); }, y: function(t2, e2 = this.bbox()) { return null == t2 ? e2.y : this.attr("y", this.attr("y") + t2 - e2.y); } }); var oi = class extends qt { constructor(t2, e2 = t2) { super(G("text", t2), e2), this.dom.leading = this.dom.leading ?? new _t(1.3), this._rebuild = true, this._build = false; } leading(t2) { return null == t2 ? this.dom.leading : (this.dom.leading = new _t(t2), this.rebuild()); } rebuild(t2) { if ("boolean" == typeof t2 && (this._rebuild = t2), this._rebuild) { const t3 = this; let e2 = 0; const i2 = this.dom.leading; this.each((function(a2) { if (X(this.node)) return; const s2 = O.window.getComputedStyle(this.node).getPropertyValue("font-size"), r2 = i2 * new _t(s2); this.dom.newLined && (this.attr("x", t3.attr("x")), "\n" === this.text() ? e2 += r2 : (this.attr("dy", a2 ? r2 + e2 : 0), e2 = 0)); })), this.fire("rebuild"); } return this; } setData(t2) { return this.dom = t2, this.dom.leading = new _t(t2.leading || 1.3), this; } writeDataToDom() { return R(this, this.dom, { leading: 1.3 }), this; } text(t2) { if (void 0 === t2) { const e2 = this.node.childNodes; let i2 = 0; t2 = ""; for (let a2 = 0, s2 = e2.length; a2 < s2; ++a2) "textPath" === e2[a2].nodeName || X(e2[a2]) ? 0 === a2 && (i2 = a2 + 1) : (a2 !== i2 && 3 !== e2[a2].nodeType && true === V(e2[a2]).dom.newLined && (t2 += "\n"), t2 += e2[a2].textContent); return t2; } if (this.clear().build(true), "function" == typeof t2) t2.call(this, this); else for (let e2 = 0, i2 = (t2 = (t2 + "").split("\n")).length; e2 < i2; e2++) this.newLine(t2[e2]); return this.build(false).rebuild(); } }; Q(oi, ni), A({ Container: { text: K((function(t2 = "") { return this.put(new oi()).text(t2); })), plain: K((function(t2 = "") { return this.put(new oi()).plain(t2); })) } }), q(oi, "Text"); var li = class extends qt { constructor(t2, e2 = t2) { super(G("tspan", t2), e2), this._build = false; } dx(t2) { return this.attr("dx", t2); } dy(t2) { return this.attr("dy", t2); } newLine() { this.dom.newLined = true; const t2 = this.parent(); if (!(t2 instanceof oi)) return this; const e2 = t2.index(this), i2 = O.window.getComputedStyle(this.node).getPropertyValue("font-size"), a2 = t2.dom.leading * new _t(i2); return this.dy(e2 ? a2 : 0).attr("x", t2.x()); } text(t2) { return null == t2 ? this.node.textContent + (this.dom.newLined ? "\n" : "") : ("function" == typeof t2 ? (this.clear().build(true), t2.call(this, this), this.build(false)) : this.plain(t2), this); } }; Q(li, ni), A({ Tspan: { tspan: K((function(t2 = "") { const e2 = new li(); return this._build || this.clear(), this.put(e2).text(t2); })) }, Text: { newLine: function(t2 = "") { return this.tspan(t2).newLine(); } } }), q(li, "Tspan"); var hi = class extends qt { constructor(t2, e2 = t2) { super(G("circle", t2), e2); } radius(t2) { return this.attr("r", t2); } rx(t2) { return this.attr("r", t2); } ry(t2) { return this.rx(t2); } size(t2) { return this.radius(new _t(t2).divide(2)); } }; Q(hi, { x: Jt, y: Qt, cx: Kt, cy: te, width: ee, height: ie }), A({ Container: { circle: K((function(t2 = 0) { return this.put(new hi()).size(t2).move(0, 0); })) } }), q(hi, "Circle"); var ci = class extends Vt { constructor(t2, e2 = t2) { super(G("clipPath", t2), e2); } remove() { return this.targets().forEach((function(t2) { t2.unclip(); })), super.remove(); } targets() { return Lt("svg [clip-path*=" + this.id() + "]"); } }; A({ Container: { clip: K((function() { return this.defs().put(new ci()); })) }, Element: { clipper() { return this.reference("clip-path"); }, clipWith(t2) { const e2 = t2 instanceof ci ? t2 : this.parent().clip().add(t2); return this.attr("clip-path", "url(#" + e2.id() + ")"); }, unclip() { return this.attr("clip-path", null); } } }), q(ci, "ClipPath"); var di = class extends Gt { constructor(t2, e2 = t2) { super(G("foreignObject", t2), e2); } }; A({ Container: { foreignObject: K((function(t2, e2) { return this.put(new di()).size(t2, e2); })) } }), q(di, "ForeignObject"); var ui = Object.freeze({ __proto__: null, dmove: function(t2, e2) { return this.children().forEach(((i2) => { let a2; try { a2 = i2.node instanceof F().SVGSVGElement ? new kt(i2.attr(["x", "y", "width", "height"])) : i2.bbox(); } catch (t3) { return; } const s2 = new vt(i2), r2 = s2.translate(t2, e2).transform(s2.inverse()), n2 = new bt(a2.x, a2.y).transform(r2); i2.move(n2.x, n2.y); })), this; }, dx: function(t2) { return this.dmove(t2, 0); }, dy: function(t2) { return this.dmove(0, t2); }, height: function(t2, e2 = this.bbox()) { return null == t2 ? e2.height : this.size(e2.width, t2, e2); }, move: function(t2 = 0, e2 = 0, i2 = this.bbox()) { const a2 = t2 - i2.x, s2 = e2 - i2.y; return this.dmove(a2, s2); }, size: function(t2, e2, i2 = this.bbox()) { const a2 = I(this, t2, e2, i2), s2 = a2.width / i2.width, r2 = a2.height / i2.height; return this.children().forEach(((t3) => { const e3 = new bt(i2).transform(new vt(t3).inverse()); t3.scale(s2, r2, e3.x, e3.y); })), this; }, width: function(t2, e2 = this.bbox()) { return null == t2 ? e2.width : this.size(t2, e2.height, e2); }, x: function(t2, e2 = this.bbox()) { return null == t2 ? e2.x : this.move(t2, e2.y, e2); }, y: function(t2, e2 = this.bbox()) { return null == t2 ? e2.y : this.move(e2.x, t2, e2); } }); var gi = class extends Vt { constructor(t2, e2 = t2) { super(G("g", t2), e2); } }; Q(gi, ui), A({ Container: { group: K((function() { return this.put(new gi()); })) } }), q(gi, "G"); var pi = class extends Vt { constructor(t2, e2 = t2) { super(G("a", t2), e2); } target(t2) { return this.attr("target", t2); } to(t2) { return this.attr("href", t2, H); } }; Q(pi, ui), A({ Container: { link: K((function(t2) { return this.put(new pi()).to(t2); })) }, Element: { unlink() { const t2 = this.linker(); if (!t2) return this; const e2 = t2.parent(); if (!e2) return this.remove(); const i2 = e2.index(t2); return e2.add(this, i2), t2.remove(), this; }, linkTo(t2) { let e2 = this.linker(); return e2 || (e2 = new pi(), this.wrap(e2)), "function" == typeof t2 ? t2.call(e2, e2) : e2.to(t2), this; }, linker() { const t2 = this.parent(); return t2 && "a" === t2.node.nodeName.toLowerCase() ? t2 : null; } } }), q(pi, "A"); var fi = class extends Vt { constructor(t2, e2 = t2) { super(G("mask", t2), e2); } remove() { return this.targets().forEach((function(t2) { t2.unmask(); })), super.remove(); } targets() { return Lt("svg [mask*=" + this.id() + "]"); } }; A({ Container: { mask: K((function() { return this.defs().put(new fi()); })) }, Element: { masker() { return this.reference("mask"); }, maskWith(t2) { const e2 = t2 instanceof fi ? t2 : this.parent().mask().add(t2); return this.attr("mask", "url(#" + e2.id() + ")"); }, unmask() { return this.attr("mask", null); } } }), q(fi, "Mask"); var xi = class extends Gt { constructor(t2, e2 = t2) { super(G("stop", t2), e2); } update(t2) { return ("number" == typeof t2 || t2 instanceof _t) && (t2 = { offset: arguments[0], color: arguments[1], opacity: arguments[2] }), null != t2.opacity && this.attr("stop-opacity", t2.opacity), null != t2.color && this.attr("stop-color", t2.color), null != t2.offset && this.attr("offset", new _t(t2.offset)), this; } }; A({ Gradient: { stop: function(t2, e2, i2) { return this.put(new xi()).update(t2, e2, i2); } } }), q(xi, "Stop"); var bi = class extends Gt { constructor(t2, e2 = t2) { super(G("style", t2), e2); } addText(t2 = "") { return this.node.textContent += t2, this; } font(t2, e2, i2 = {}) { return this.rule("@font-face", { fontFamily: t2, src: e2, ...i2 }); } rule(t2, e2) { return this.addText((function(t3, e3) { if (!t3) return ""; if (!e3) return t3; let i2 = t3 + "{"; for (const t4 in e3) i2 += t4.replace(/([A-Z])/g, (function(t5, e4) { return "-" + e4.toLowerCase(); })) + ":" + e3[t4] + ";"; return i2 += "}", i2; })(t2, e2)); } }; A("Dom", { style(t2, e2) { return this.put(new bi()).rule(t2, e2); }, fontface(t2, e2, i2) { return this.put(new bi()).font(t2, e2, i2); } }), q(bi, "Style"); var mi = class extends oi { constructor(t2, e2 = t2) { super(G("textPath", t2), e2); } array() { const t2 = this.track(); return t2 ? t2.array() : null; } plot(t2) { const e2 = this.track(); let i2 = null; return e2 && (i2 = e2.plot(t2)), null == t2 ? i2 : this; } track() { return this.reference("href"); } }; A({ Container: { textPath: K((function(t2, e2) { return t2 instanceof oi || (t2 = this.text(t2)), t2.path(e2); })) }, Text: { path: K((function(t2, e2 = true) { const i2 = new mi(); let a2; if (t2 instanceof We || (t2 = this.defs().path(t2)), i2.attr("href", "#" + t2, H), e2) for (; a2 = this.node.firstChild; ) i2.node.appendChild(a2); return this.put(i2); })), textPath() { return this.findOne("textPath"); } }, Path: { text: K((function(t2) { return t2 instanceof oi || (t2 = new oi().addTo(this.parent()).text(t2)), t2.path(this); })), targets() { return Lt("svg textPath").filter(((t2) => (t2.attr("href") || "").includes(this.id()))); } } }), mi.prototype.MorphArray = Ee, q(mi, "TextPath"); var vi = class extends qt { constructor(t2, e2 = t2) { super(G("use", t2), e2); } use(t2, e2) { return this.attr("href", (e2 || "") + "#" + t2, H); } }; A({ Container: { use: K((function(t2, e2) { return this.put(new vi()).use(t2, e2); })) } }), q(vi, "Use"); var yi = B; Q([si, ri, de, ce, be], C("viewbox")), Q([xe, je, Ge, We], C("marker")), Q(oi, C("Text")), Q(We, C("Path")), Q(Ut, C("Defs")), Q([oi, li], C("Tspan")), Q([Ve, se, he, Qe], C("radius")), Q(Rt, C("EventTarget")), Q(Bt, C("Dom")), Q(Gt, C("Element")), Q(qt, C("Shape")), Q([Vt, re], C("Container")), Q(he, C("Gradient")), Q(Qe, C("Runner")), Ct.extend([...new Set(k)]), (function(t2 = []) { Ne.push(...[].concat(t2)); })([_t, xt, kt, vt, Dt, ge, Ee, bt]), Q(Ne, { to(t2) { return new He().type(this.constructor).from(this.toArray()).to(t2); }, fromArray(t2) { return this.init(t2), this; }, toConsumable() { return this.toArray(); }, morph(t2, e2, i2, a2, s2) { return this.fromArray(t2.map((function(t3, r2) { return a2.step(t3, e2[r2], i2, s2[r2], s2); }))); } }); var wi = class extends Gt { constructor(t2) { super(G("filter", t2), t2), this.$source = "SourceGraphic", this.$sourceAlpha = "SourceAlpha", this.$background = "BackgroundImage", this.$backgroundAlpha = "BackgroundAlpha", this.$fill = "FillPaint", this.$stroke = "StrokePaint", this.$autoSetIn = true; } put(t2, e2) { return !(t2 = super.put(t2, e2)).attr("in") && this.$autoSetIn && t2.attr("in", this.$source), t2.attr("result") || t2.attr("result", t2.id()), t2; } remove() { return this.targets().each("unfilter"), super.remove(); } targets() { return Lt('svg [filter*="' + this.id() + '"]'); } toString() { return "url(#" + this.id() + ")"; } }; var ki = class extends Gt { constructor(t2, e2) { super(t2, e2), this.result(this.id()); } in(t2) { if (null == t2) { const t3 = this.attr("in"); return this.parent() && this.parent().find(`[result="${t3}"]`)[0] || t3; } return this.attr("in", t2); } result(t2) { return this.attr("result", t2); } toString() { return this.result(); } }; var Ai = (t2) => function(...e2) { for (let i2 = t2.length; i2--; ) null != e2[i2] && this.attr(t2[i2], e2[i2]); }; var Ci = { blend: Ai(["in", "in2", "mode"]), colorMatrix: Ai(["type", "values"]), composite: Ai(["in", "in2", "operator"]), convolveMatrix: function(t2) { t2 = new Dt(t2).toString(), this.attr({ order: Math.sqrt(t2.split(" ").length), kernelMatrix: t2 }); }, diffuseLighting: Ai(["surfaceScale", "lightingColor", "diffuseConstant", "kernelUnitLength"]), displacementMap: Ai(["in", "in2", "scale", "xChannelSelector", "yChannelSelector"]), dropShadow: Ai(["in", "dx", "dy", "stdDeviation"]), flood: Ai(["flood-color", "flood-opacity"]), gaussianBlur: function(t2 = 0, e2 = t2) { this.attr("stdDeviation", t2 + " " + e2); }, image: function(t2) { this.attr("href", t2, H); }, morphology: Ai(["operator", "radius"]), offset: Ai(["dx", "dy"]), specularLighting: Ai(["surfaceScale", "lightingColor", "diffuseConstant", "specularExponent", "kernelUnitLength"]), tile: Ai([]), turbulence: Ai(["baseFrequency", "numOctaves", "seed", "stitchTiles", "type"]) }; ["blend", "colorMatrix", "componentTransfer", "composite", "convolveMatrix", "diffuseLighting", "displacementMap", "dropShadow", "flood", "gaussianBlur", "image", "merge", "morphology", "offset", "specularLighting", "tile", "turbulence"].forEach(((t2) => { const e2 = P(t2), i2 = Ci[t2]; wi[e2 + "Effect"] = class extends ki { constructor(t3) { super(G("fe" + e2, t3), t3); } update(t3) { return i2.apply(this, t3), this; } }, wi.prototype[t2] = K((function(t3, ...i3) { const a2 = new wi[e2 + "Effect"](); return null == t3 ? this.put(a2) : ("function" == typeof t3 ? t3.call(a2, a2) : i3.unshift(t3), this.put(a2).update(i3)); })); })), Q(wi, { merge(t2) { const e2 = this.put(new wi.MergeEffect()); if ("function" == typeof t2) return t2.call(e2, e2), e2; return (t2 instanceof Array ? t2 : [...arguments]).forEach(((t3) => { t3 instanceof wi.MergeNode ? e2.put(t3) : e2.mergeNode(t3); })), e2; }, componentTransfer(t2 = {}) { const e2 = this.put(new wi.ComponentTransferEffect()); if ("function" == typeof t2) return t2.call(e2, e2), e2; if (!(t2.r || t2.g || t2.b || t2.a)) { t2 = { r: t2, g: t2, b: t2, a: t2 }; } for (const i2 in t2) e2.add(new wi["Func" + i2.toUpperCase()](t2[i2])); return e2; } }); ["distantLight", "pointLight", "spotLight", "mergeNode", "FuncR", "FuncG", "FuncB", "FuncA"].forEach(((t2) => { const e2 = P(t2); wi[e2] = class extends ki { constructor(t3) { super(G("fe" + e2, t3), t3); } }; })); ["funcR", "funcG", "funcB", "funcA"].forEach((function(t2) { const e2 = wi[P(t2)], i2 = K((function() { return this.put(new e2()); })); wi.ComponentTransferEffect.prototype[t2] = i2; })); ["distantLight", "pointLight", "spotLight"].forEach(((t2) => { const e2 = wi[P(t2)], i2 = K((function() { return this.put(new e2()); })); wi.DiffuseLightingEffect.prototype[t2] = i2, wi.SpecularLightingEffect.prototype[t2] = i2; })), Q(wi.MergeEffect, { mergeNode(t2) { return this.put(new wi.MergeNode()).attr("in", t2); } }), Q(Ut, { filter: function(t2) { const e2 = this.put(new wi()); return "function" == typeof t2 && t2.call(e2, e2), e2; } }), Q(Vt, { filter: function(t2) { return this.defs().filter(t2); } }), Q(Gt, { filterWith: function(t2) { const e2 = t2 instanceof wi ? t2 : this.defs().filter(t2); return this.attr("filter", e2); }, unfilter: function(t2) { return this.attr("filter", null); }, filterer() { return this.reference("filter"); } }); var Si = { blend: function(t2, e2) { return this.parent() && this.parent().blend(this, t2, e2); }, colorMatrix: function(t2, e2) { return this.parent() && this.parent().colorMatrix(t2, e2).in(this); }, componentTransfer: function(t2) { return this.parent() && this.parent().componentTransfer(t2).in(this); }, composite: function(t2, e2) { return this.parent() && this.parent().composite(this, t2, e2); }, convolveMatrix: function(t2) { return this.parent() && this.parent().convolveMatrix(t2).in(this); }, diffuseLighting: function(t2, e2, i2, a2) { return this.parent() && this.parent().diffuseLighting(t2, i2, a2).in(this); }, displacementMap: function(t2, e2, i2, a2) { return this.parent() && this.parent().displacementMap(this, t2, e2, i2, a2); }, dropShadow: function(t2, e2, i2) { return this.parent() && this.parent().dropShadow(this, t2, e2, i2).in(this); }, flood: function(t2, e2) { return this.parent() && this.parent().flood(t2, e2); }, gaussianBlur: function(t2, e2) { return this.parent() && this.parent().gaussianBlur(t2, e2).in(this); }, image: function(t2) { return this.parent() && this.parent().image(t2); }, merge: function(t2) { return t2 = t2 instanceof Array ? t2 : [...t2], this.parent() && this.parent().merge(this, ...t2); }, morphology: function(t2, e2) { return this.parent() && this.parent().morphology(t2, e2).in(this); }, offset: function(t2, e2) { return this.parent() && this.parent().offset(t2, e2).in(this); }, specularLighting: function(t2, e2, i2, a2, s2) { return this.parent() && this.parent().specularLighting(t2, i2, a2, s2).in(this); }, tile: function() { return this.parent() && this.parent().tile().in(this); }, turbulence: function(t2, e2, i2, a2, s2) { return this.parent() && this.parent().turbulence(t2, e2, i2, a2, s2).in(this); } }; Q(ki, Si), Q(wi.MergeEffect, { in: function(t2) { return t2 instanceof wi.MergeNode ? this.add(t2, 0) : this.add(new wi.MergeNode().in(t2), 0), this; } }), Q([wi.CompositeEffect, wi.BlendEffect, wi.DisplacementMapEffect], { in2: function(t2) { if (null == t2) { const t3 = this.attr("in2"); return this.parent() && this.parent().find(`[result="${t3}"]`)[0] || t3; } return this.attr("in2", t2); } }), wi.filter = { sepiatone: [0.343, 0.669, 0.119, 0, 0, 0.249, 0.626, 0.13, 0, 0, 0.172, 0.334, 0.111, 0, 0, 0, 0, 0, 1, 0] }; var Li = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "getDefaultFilter", value: function(t3, e2) { var i2 = this.w; t3.unfilter(true), new wi().size("120%", "180%", "-5%", "-40%"), i2.config.chart.dropShadow.enabled && this.dropShadow(t3, i2.config.chart.dropShadow, e2); } }, { key: "applyFilter", value: function(t3, e2, i2) { var a2, s2 = this, r2 = this.w; if (t3.unfilter(true), "none" !== i2) { var n2, o2, l2 = r2.config.chart.dropShadow, h2 = "lighten" === i2 ? 2 : 0.3; if (t3.filterWith((function(t4) { t4.colorMatrix({ type: "matrix", values: "\n ".concat(h2, " 0 0 0 0\n 0 ").concat(h2, " 0 0 0\n 0 0 ").concat(h2, " 0 0\n 0 0 0 1 0\n "), in: "SourceGraphic", result: "brightness" }), l2.enabled && s2.addShadow(t4, e2, l2, "brightness"); })), !l2.noUserSpaceOnUse) null === (n2 = t3.filterer()) || void 0 === n2 || null === (o2 = n2.node) || void 0 === o2 || o2.setAttribute("filterUnits", "userSpaceOnUse"); this._scaleFilterSize(null === (a2 = t3.filterer()) || void 0 === a2 ? void 0 : a2.node); } else this.getDefaultFilter(t3, e2); } }, { key: "addShadow", value: function(t3, e2, i2, a2) { var s2, r2 = this.w, n2 = i2.blur, o2 = i2.top, l2 = i2.left, h2 = i2.color, c2 = i2.opacity; if (h2 = Array.isArray(h2) ? h2[e2] : h2, (null === (s2 = r2.config.chart.dropShadow.enabledOnSeries) || void 0 === s2 ? void 0 : s2.length) > 0 && -1 === r2.config.chart.dropShadow.enabledOnSeries.indexOf(e2)) return t3; t3.offset({ in: a2, dx: l2, dy: o2, result: "offset" }), t3.gaussianBlur({ in: "offset", stdDeviation: n2, result: "blur" }), t3.flood({ "flood-color": h2, "flood-opacity": c2, result: "flood" }), t3.composite({ in: "flood", in2: "blur", operator: "in", result: "shadow" }), t3.merge(["shadow", a2]); } }, { key: "dropShadow", value: function(t3, e2) { var i2, a2, s2, r2, n2, o2 = this, l2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, h2 = this.w; if (t3.unfilter(true), v.isMsEdge() && "radialBar" === h2.config.chart.type) return t3; if ((null === (i2 = h2.config.chart.dropShadow.enabledOnSeries) || void 0 === i2 ? void 0 : i2.length) > 0 && -1 === (null === (s2 = h2.config.chart.dropShadow.enabledOnSeries) || void 0 === s2 ? void 0 : s2.indexOf(l2))) return t3; (t3.filterWith((function(t4) { o2.addShadow(t4, l2, e2, "SourceGraphic"); })), e2.noUserSpaceOnUse) || (null === (r2 = t3.filterer()) || void 0 === r2 || null === (n2 = r2.node) || void 0 === n2 || n2.setAttribute("filterUnits", "userSpaceOnUse")); return this._scaleFilterSize(null === (a2 = t3.filterer()) || void 0 === a2 ? void 0 : a2.node), t3; } }, { key: "setSelectionFilter", value: function(t3, e2, i2) { var a2 = this.w; if (void 0 !== a2.globals.selectedDataPoints[e2] && a2.globals.selectedDataPoints[e2].indexOf(i2) > -1) { t3.node.setAttribute("selected", true); var s2 = a2.config.states.active.filter; "none" !== s2 && this.applyFilter(t3, e2, s2.type); } } }, { key: "_scaleFilterSize", value: function(t3) { if (t3) { !(function(e2) { for (var i2 in e2) e2.hasOwnProperty(i2) && t3.setAttribute(i2, e2[i2]); })({ width: "200%", height: "200%", x: "-50%", y: "-50%" }); } } }]), t2; })(); var Mi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "roundPathCorners", value: function(t3, e2) { function i2(t4, e3, i3) { var s3 = e3.x - t4.x, r3 = e3.y - t4.y, n3 = Math.sqrt(s3 * s3 + r3 * r3); return a2(t4, e3, Math.min(1, i3 / n3)); } function a2(t4, e3, i3) { return { x: t4.x + (e3.x - t4.x) * i3, y: t4.y + (e3.y - t4.y) * i3 }; } function s2(t4, e3) { t4.length > 2 && (t4[t4.length - 2] = e3.x, t4[t4.length - 1] = e3.y); } function r2(t4) { return { x: parseFloat(t4[t4.length - 2]), y: parseFloat(t4[t4.length - 1]) }; } t3.indexOf("NaN") > -1 && (t3 = ""); var n2 = t3.split(/[,\s]/).reduce((function(t4, e3) { var i3 = e3.match(/^([a-zA-Z])(.+)/); return i3 ? (t4.push(i3[1]), t4.push(i3[2])) : t4.push(e3), t4; }), []).reduce((function(t4, e3) { return parseFloat(e3) == e3 && t4.length ? t4[t4.length - 1].push(e3) : t4.push([e3]), t4; }), []), o2 = []; if (n2.length > 1) { var l2 = r2(n2[0]), h2 = null; "Z" == n2[n2.length - 1][0] && n2[0].length > 2 && (h2 = ["L", l2.x, l2.y], n2[n2.length - 1] = h2), o2.push(n2[0]); for (var c2 = 1; c2 < n2.length; c2++) { var d2 = o2[o2.length - 1], u2 = n2[c2], g2 = u2 == h2 ? n2[1] : n2[c2 + 1]; if (g2 && d2 && d2.length > 2 && "L" == u2[0] && g2.length > 2 && "L" == g2[0]) { var p2, f2, x2 = r2(d2), b2 = r2(u2), m2 = r2(g2); p2 = i2(b2, x2, e2), f2 = i2(b2, m2, e2), s2(u2, p2), u2.origPoint = b2, o2.push(u2); var v2 = a2(p2, b2, 0.5), y2 = a2(b2, f2, 0.5), w2 = ["C", v2.x, v2.y, y2.x, y2.y, f2.x, f2.y]; w2.origPoint = b2, o2.push(w2); } else o2.push(u2); } if (h2) { var k2 = r2(o2[o2.length - 1]); o2.push(["Z"]), s2(o2[0], k2); } } else o2 = n2; return o2.reduce((function(t4, e3) { return t4 + e3.join(" ") + " "; }), ""); } }, { key: "drawLine", value: function(t3, e2, i2, a2) { var s2 = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : "#a8a8a8", r2 = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : 0, n2 = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : null, o2 = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : "butt"; return this.w.globals.dom.Paper.line().attr({ x1: t3, y1: e2, x2: i2, y2: a2, stroke: s2, "stroke-dasharray": r2, "stroke-width": n2, "stroke-linecap": o2 }); } }, { key: "drawRect", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 0, s2 = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, r2 = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : "#fefefe", n2 = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : 1, o2 = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : null, l2 = arguments.length > 8 && void 0 !== arguments[8] ? arguments[8] : null, h2 = arguments.length > 9 && void 0 !== arguments[9] ? arguments[9] : 0, c2 = this.w.globals.dom.Paper.rect(); return c2.attr({ x: t3, y: e2, width: i2 > 0 ? i2 : 0, height: a2 > 0 ? a2 : 0, rx: s2, ry: s2, opacity: n2, "stroke-width": null !== o2 ? o2 : 0, stroke: null !== l2 ? l2 : "none", "stroke-dasharray": h2 }), c2.node.setAttribute("fill", r2), c2; } }, { key: "drawPolygon", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "#e1e1e1", i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1, a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "none"; return this.w.globals.dom.Paper.polygon(t3).attr({ fill: a2, stroke: e2, "stroke-width": i2 }); } }, { key: "drawCircle", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; t3 < 0 && (t3 = 0); var i2 = this.w.globals.dom.Paper.circle(2 * t3); return null !== e2 && i2.attr(e2), i2; } }, { key: "drawPath", value: function(t3) { var e2 = t3.d, i2 = void 0 === e2 ? "" : e2, a2 = t3.stroke, s2 = void 0 === a2 ? "#a8a8a8" : a2, r2 = t3.strokeWidth, n2 = void 0 === r2 ? 1 : r2, o2 = t3.fill, l2 = t3.fillOpacity, h2 = void 0 === l2 ? 1 : l2, c2 = t3.strokeOpacity, d2 = void 0 === c2 ? 1 : c2, u2 = t3.classes, g2 = t3.strokeLinecap, p2 = void 0 === g2 ? null : g2, f2 = t3.strokeDashArray, x2 = void 0 === f2 ? 0 : f2, b2 = this.w; return null === p2 && (p2 = b2.config.stroke.lineCap), (i2.indexOf("undefined") > -1 || i2.indexOf("NaN") > -1) && (i2 = "M 0 ".concat(b2.globals.gridHeight)), b2.globals.dom.Paper.path(i2).attr({ fill: o2, "fill-opacity": h2, stroke: s2, "stroke-opacity": d2, "stroke-linecap": p2, "stroke-width": n2, "stroke-dasharray": x2, class: u2 }); } }, { key: "group", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, e2 = this.w.globals.dom.Paper.group(); return null !== t3 && e2.attr(t3), e2; } }, { key: "move", value: function(t3, e2) { var i2 = ["M", t3, e2].join(" "); return i2; } }, { key: "line", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a2 = null; return null === i2 ? a2 = [" L", t3, e2].join(" ") : "H" === i2 ? a2 = [" H", t3].join(" ") : "V" === i2 && (a2 = [" V", e2].join(" ")), a2; } }, { key: "curve", value: function(t3, e2, i2, a2, s2, r2) { var n2 = ["C", t3, e2, i2, a2, s2, r2].join(" "); return n2; } }, { key: "quadraticCurve", value: function(t3, e2, i2, a2) { return ["Q", t3, e2, i2, a2].join(" "); } }, { key: "arc", value: function(t3, e2, i2, a2, s2, r2, n2) { var o2 = "A"; arguments.length > 7 && void 0 !== arguments[7] && arguments[7] && (o2 = "a"); var l2 = [o2, t3, e2, i2, a2, s2, r2, n2].join(" "); return l2; } }, { key: "renderPaths", value: function(t3) { var e2, i2 = t3.j, a2 = t3.realIndex, s2 = t3.pathFrom, r2 = t3.pathTo, n2 = t3.stroke, o2 = t3.strokeWidth, l2 = t3.strokeLinecap, h2 = t3.fill, c2 = t3.animationDelay, d2 = t3.initialSpeed, g2 = t3.dataChangeSpeed, p2 = t3.className, f2 = t3.chartType, x2 = t3.shouldClipToGrid, b2 = void 0 === x2 || x2, m2 = t3.bindEventsOnPaths, v2 = void 0 === m2 || m2, w2 = t3.drawShadow, k2 = void 0 === w2 || w2, A2 = this.w, C2 = new Li(this.ctx), S2 = new y(this.ctx), L2 = this.w.config.chart.animations.enabled, M2 = L2 && this.w.config.chart.animations.dynamicAnimation.enabled; if (s2 && s2.startsWith("M 0 0") && r2) { var P2 = r2.match(/^M\s+[\d.-]+\s+[\d.-]+/); P2 && (s2 = s2.replace(/^M\s+0\s+0/, P2[0])); } var I2 = !!(L2 && !A2.globals.resized || M2 && A2.globals.dataChanged && A2.globals.shouldAnimate); I2 ? e2 = s2 : (e2 = r2, A2.globals.animationEnded = true); var T2 = A2.config.stroke.dashArray, z2 = 0; z2 = Array.isArray(T2) ? T2[a2] : A2.config.stroke.dashArray; var X2 = this.drawPath({ d: e2, stroke: n2, strokeWidth: o2, fill: h2, fillOpacity: 1, classes: p2, strokeLinecap: l2, strokeDashArray: z2 }); X2.attr("index", a2), b2 && ("bar" === f2 && !A2.globals.isHorizontal || A2.globals.comboCharts ? X2.attr({ "clip-path": "url(#gridRectBarMask".concat(A2.globals.cuid, ")") }) : X2.attr({ "clip-path": "url(#gridRectMask".concat(A2.globals.cuid, ")") })), A2.config.chart.dropShadow.enabled && k2 && C2.dropShadow(X2, A2.config.chart.dropShadow, a2), v2 && (X2.node.addEventListener("mouseenter", this.pathMouseEnter.bind(this, X2)), X2.node.addEventListener("mouseleave", this.pathMouseLeave.bind(this, X2)), X2.node.addEventListener("mousedown", this.pathMouseDown.bind(this, X2))), X2.attr({ pathTo: r2, pathFrom: s2 }); var R2 = { el: X2, j: i2, realIndex: a2, pathFrom: s2, pathTo: r2, fill: h2, strokeWidth: o2, delay: c2 }; return !L2 || A2.globals.resized || A2.globals.dataChanged ? !A2.globals.resized && A2.globals.dataChanged || S2.showDelayedElements() : S2.animatePathsGradually(u(u({}, R2), {}, { speed: d2 })), A2.globals.dataChanged && M2 && I2 && S2.animatePathsGradually(u(u({}, R2), {}, { speed: g2 })), X2; } }, { key: "drawPattern", value: function(t3, e2, i2) { var a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : "#a8a8a8", s2 = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0; return this.w.globals.dom.Paper.pattern(e2, i2, (function(r2) { "horizontalLines" === t3 ? r2.line(0, 0, i2, 0).stroke({ color: a2, width: s2 + 1 }) : "verticalLines" === t3 ? r2.line(0, 0, 0, e2).stroke({ color: a2, width: s2 + 1 }) : "slantedLines" === t3 ? r2.line(0, 0, e2, i2).stroke({ color: a2, width: s2 }) : "squares" === t3 ? r2.rect(e2, i2).fill("none").stroke({ color: a2, width: s2 }) : "circles" === t3 && r2.circle(e2).fill("none").stroke({ color: a2, width: s2 }); })); } }, { key: "drawGradient", value: function(t3, e2, i2, a2, s2) { var r2, n2 = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : null, o2 = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : null, l2 = arguments.length > 7 && void 0 !== arguments[7] ? arguments[7] : [], h2 = arguments.length > 8 && void 0 !== arguments[8] ? arguments[8] : 0, c2 = this.w; e2.length < 9 && 0 === e2.indexOf("#") && (e2 = v.hexToRgba(e2, a2)), i2.length < 9 && 0 === i2.indexOf("#") && (i2 = v.hexToRgba(i2, s2)); var d2 = 0, u2 = 1, g2 = 1, p2 = null; null !== o2 && (d2 = void 0 !== o2[0] ? o2[0] / 100 : 0, u2 = void 0 !== o2[1] ? o2[1] / 100 : 1, g2 = void 0 !== o2[2] ? o2[2] / 100 : 1, p2 = void 0 !== o2[3] ? o2[3] / 100 : null); var f2 = !("donut" !== c2.config.chart.type && "pie" !== c2.config.chart.type && "polarArea" !== c2.config.chart.type && "bubble" !== c2.config.chart.type); if (r2 = l2 && 0 !== l2.length ? c2.globals.dom.Paper.gradient(f2 ? "radial" : "linear", (function(t4) { (Array.isArray(l2[h2]) ? l2[h2] : l2).forEach((function(e3) { t4.stop(e3.offset / 100, e3.color, e3.opacity); })); })) : c2.globals.dom.Paper.gradient(f2 ? "radial" : "linear", (function(t4) { t4.stop(d2, e2, a2), t4.stop(u2, i2, s2), t4.stop(g2, i2, s2), null !== p2 && t4.stop(p2, e2, a2); })), f2) { var x2 = c2.globals.gridWidth / 2, b2 = c2.globals.gridHeight / 2; "bubble" !== c2.config.chart.type ? r2.attr({ gradientUnits: "userSpaceOnUse", cx: x2, cy: b2, r: n2 }) : r2.attr({ cx: 0.5, cy: 0.5, r: 0.8, fx: 0.2, fy: 0.2 }); } else "vertical" === t3 ? r2.from(0, 0).to(0, 1) : "diagonal" === t3 ? r2.from(0, 0).to(1, 1) : "horizontal" === t3 ? r2.from(0, 1).to(1, 1) : "diagonal2" === t3 && r2.from(1, 0).to(0, 1); return r2; } }, { key: "getTextBasedOnMaxWidth", value: function(t3) { var e2 = t3.text, i2 = t3.maxWidth, a2 = t3.fontSize, s2 = t3.fontFamily, r2 = this.getTextRects(e2, a2, s2), n2 = r2.width / e2.length, o2 = Math.floor(i2 / n2); return i2 < r2.width ? e2.slice(0, o2 - 3) + "..." : e2; } }, { key: "drawText", value: function(t3) { var e2 = this, i2 = t3.x, a2 = t3.y, s2 = t3.text, r2 = t3.textAnchor, n2 = t3.fontSize, o2 = t3.fontFamily, l2 = t3.fontWeight, h2 = t3.foreColor, c2 = t3.opacity, d2 = t3.maxWidth, g2 = t3.cssClass, p2 = void 0 === g2 ? "" : g2, f2 = t3.isPlainText, x2 = void 0 === f2 || f2, b2 = t3.dominantBaseline, m2 = void 0 === b2 ? "auto" : b2, v2 = this.w; void 0 === s2 && (s2 = ""); var y2 = s2; r2 || (r2 = "start"), h2 && h2.length || (h2 = v2.config.chart.foreColor), o2 = o2 || v2.config.chart.fontFamily, l2 = l2 || "regular"; var w2, k2 = { maxWidth: d2, fontSize: n2 = n2 || "11px", fontFamily: o2 }; return Array.isArray(s2) ? w2 = v2.globals.dom.Paper.text((function(t4) { for (var i3 = 0; i3 < s2.length; i3++) y2 = s2[i3], d2 && (y2 = e2.getTextBasedOnMaxWidth(u({ text: s2[i3] }, k2))), 0 === i3 ? t4.tspan(y2) : t4.tspan(y2).newLine(); })) : (d2 && (y2 = this.getTextBasedOnMaxWidth(u({ text: s2 }, k2))), w2 = x2 ? v2.globals.dom.Paper.plain(s2) : v2.globals.dom.Paper.text((function(t4) { return t4.tspan(y2); }))), w2.attr({ x: i2, y: a2, "text-anchor": r2, "dominant-baseline": m2, "font-size": n2, "font-family": o2, "font-weight": l2, fill: h2, class: "apexcharts-text " + p2 }), w2.node.style.fontFamily = o2, w2.node.style.opacity = c2, w2; } }, { key: "getMarkerPath", value: function(t3, e2, i2, a2) { var s2 = ""; switch (i2) { case "cross": s2 = "M ".concat(t3 - (a2 /= 1.4), " ").concat(e2 - a2, " L ").concat(t3 + a2, " ").concat(e2 + a2, " M ").concat(t3 - a2, " ").concat(e2 + a2, " L ").concat(t3 + a2, " ").concat(e2 - a2); break; case "plus": s2 = "M ".concat(t3 - (a2 /= 1.12), " ").concat(e2, " L ").concat(t3 + a2, " ").concat(e2, " M ").concat(t3, " ").concat(e2 - a2, " L ").concat(t3, " ").concat(e2 + a2); break; case "star": case "sparkle": var r2 = 5; a2 *= 1.15, "sparkle" === i2 && (a2 /= 1.1, r2 = 4); for (var n2 = Math.PI / r2, o2 = 0; o2 <= 2 * r2; o2++) { var l2 = o2 * n2, h2 = o2 % 2 == 0 ? a2 : a2 / 2; s2 += (0 === o2 ? "M" : "L") + (t3 + h2 * Math.sin(l2)) + "," + (e2 - h2 * Math.cos(l2)); } s2 += "Z"; break; case "triangle": s2 = "M ".concat(t3, " ").concat(e2 - a2, " \n L ").concat(t3 + a2, " ").concat(e2 + a2, " \n L ").concat(t3 - a2, " ").concat(e2 + a2, " \n Z"); break; case "square": case "rect": s2 = "M ".concat(t3 - (a2 /= 1.125), " ").concat(e2 - a2, " \n L ").concat(t3 + a2, " ").concat(e2 - a2, " \n L ").concat(t3 + a2, " ").concat(e2 + a2, " \n L ").concat(t3 - a2, " ").concat(e2 + a2, " \n Z"); break; case "diamond": a2 *= 1.05, s2 = "M ".concat(t3, " ").concat(e2 - a2, " \n L ").concat(t3 + a2, " ").concat(e2, " \n L ").concat(t3, " ").concat(e2 + a2, " \n L ").concat(t3 - a2, " ").concat(e2, " \n Z"); break; case "line": s2 = "M ".concat(t3 - (a2 /= 1.1), " ").concat(e2, " \n L ").concat(t3 + a2, " ").concat(e2); break; default: a2 *= 2, s2 = "M ".concat(t3, ", ").concat(e2, " \n m -").concat(a2 / 2, ", 0 \n a ").concat(a2 / 2, ",").concat(a2 / 2, " 0 1,0 ").concat(a2, ",0 \n a ").concat(a2 / 2, ",").concat(a2 / 2, " 0 1,0 -").concat(a2, ",0"); } return s2; } }, { key: "drawMarkerShape", value: function(t3, e2, i2, a2, s2) { var r2 = this.drawPath({ d: this.getMarkerPath(t3, e2, i2, a2, s2), stroke: s2.pointStrokeColor, strokeDashArray: s2.pointStrokeDashArray, strokeWidth: s2.pointStrokeWidth, fill: s2.pointFillColor, fillOpacity: s2.pointFillOpacity, strokeOpacity: s2.pointStrokeOpacity }); return r2.attr({ cx: t3, cy: e2, shape: s2.shape, class: s2.class ? s2.class : "" }), r2; } }, { key: "drawMarker", value: function(t3, e2, i2) { t3 = t3 || 0; var a2 = i2.pSize || 0; return v.isNumber(e2) || (a2 = 0, e2 = 0), this.drawMarkerShape(t3, e2, null == i2 ? void 0 : i2.shape, a2, u(u({}, i2), "line" === i2.shape || "plus" === i2.shape || "cross" === i2.shape ? { pointStrokeColor: i2.pointFillColor, pointStrokeOpacity: i2.pointFillOpacity } : {})); } }, { key: "pathMouseEnter", value: function(t3, e2) { var i2 = this.w, a2 = new Li(this.ctx), s2 = parseInt(t3.node.getAttribute("index"), 10), r2 = parseInt(t3.node.getAttribute("j"), 10); if ("function" == typeof i2.config.chart.events.dataPointMouseEnter && i2.config.chart.events.dataPointMouseEnter(e2, this.ctx, { seriesIndex: s2, dataPointIndex: r2, w: i2 }), this.ctx.events.fireEvent("dataPointMouseEnter", [e2, this.ctx, { seriesIndex: s2, dataPointIndex: r2, w: i2 }]), ("none" === i2.config.states.active.filter.type || "true" !== t3.node.getAttribute("selected")) && "none" !== i2.config.states.hover.filter.type && !i2.globals.isTouchDevice) { var n2 = i2.config.states.hover.filter; a2.applyFilter(t3, s2, n2.type); } } }, { key: "pathMouseLeave", value: function(t3, e2) { var i2 = this.w, a2 = new Li(this.ctx), s2 = parseInt(t3.node.getAttribute("index"), 10), r2 = parseInt(t3.node.getAttribute("j"), 10); "function" == typeof i2.config.chart.events.dataPointMouseLeave && i2.config.chart.events.dataPointMouseLeave(e2, this.ctx, { seriesIndex: s2, dataPointIndex: r2, w: i2 }), this.ctx.events.fireEvent("dataPointMouseLeave", [e2, this.ctx, { seriesIndex: s2, dataPointIndex: r2, w: i2 }]), "none" !== i2.config.states.active.filter.type && "true" === t3.node.getAttribute("selected") || "none" !== i2.config.states.hover.filter.type && a2.getDefaultFilter(t3, s2); } }, { key: "pathMouseDown", value: function(t3, e2) { var i2 = this.w, a2 = new Li(this.ctx), s2 = parseInt(t3.node.getAttribute("index"), 10), r2 = parseInt(t3.node.getAttribute("j"), 10), n2 = "false"; if ("true" === t3.node.getAttribute("selected")) { if (t3.node.setAttribute("selected", "false"), i2.globals.selectedDataPoints[s2].indexOf(r2) > -1) { var o2 = i2.globals.selectedDataPoints[s2].indexOf(r2); i2.globals.selectedDataPoints[s2].splice(o2, 1); } } else { if (!i2.config.states.active.allowMultipleDataPointsSelection && i2.globals.selectedDataPoints.length > 0) { i2.globals.selectedDataPoints = []; var l2 = i2.globals.dom.Paper.find(".apexcharts-series path:not(.apexcharts-decoration-element)"), h2 = i2.globals.dom.Paper.find(".apexcharts-series circle:not(.apexcharts-decoration-element), .apexcharts-series rect:not(.apexcharts-decoration-element)"), c2 = function(t4) { Array.prototype.forEach.call(t4, (function(t5) { t5.node.setAttribute("selected", "false"), a2.getDefaultFilter(t5, s2); })); }; c2(l2), c2(h2); } t3.node.setAttribute("selected", "true"), n2 = "true", void 0 === i2.globals.selectedDataPoints[s2] && (i2.globals.selectedDataPoints[s2] = []), i2.globals.selectedDataPoints[s2].push(r2); } if ("true" === n2) { var d2 = i2.config.states.active.filter; if ("none" !== d2) a2.applyFilter(t3, s2, d2.type); else if ("none" !== i2.config.states.hover.filter && !i2.globals.isTouchDevice) { var u2 = i2.config.states.hover.filter; a2.applyFilter(t3, s2, u2.type); } } else if ("none" !== i2.config.states.active.filter.type) if ("none" === i2.config.states.hover.filter.type || i2.globals.isTouchDevice) a2.getDefaultFilter(t3, s2); else { u2 = i2.config.states.hover.filter; a2.applyFilter(t3, s2, u2.type); } "function" == typeof i2.config.chart.events.dataPointSelection && i2.config.chart.events.dataPointSelection(e2, this.ctx, { selectedDataPoints: i2.globals.selectedDataPoints, seriesIndex: s2, dataPointIndex: r2, w: i2 }), e2 && this.ctx.events.fireEvent("dataPointSelection", [e2, this.ctx, { selectedDataPoints: i2.globals.selectedDataPoints, seriesIndex: s2, dataPointIndex: r2, w: i2 }]); } }, { key: "rotateAroundCenter", value: function(t3) { var e2 = {}; return t3 && "function" == typeof t3.getBBox && (e2 = t3.getBBox()), { x: e2.x + e2.width / 2, y: e2.y + e2.height / 2 }; } }, { key: "getTextRects", value: function(t3, e2, i2, a2) { var s2 = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], r2 = this.w, n2 = this.drawText({ x: -200, y: -200, text: t3, textAnchor: "start", fontSize: e2, fontFamily: i2, foreColor: "#fff", opacity: 0 }); a2 && n2.attr("transform", a2), r2.globals.dom.Paper.add(n2); var o2 = n2.bbox(); return s2 || (o2 = n2.node.getBoundingClientRect()), n2.remove(), { width: o2.width, height: o2.height }; } }, { key: "placeTextWithEllipsis", value: function(t3, e2, i2) { if ("function" == typeof t3.getComputedTextLength && (t3.textContent = e2, e2.length > 0 && t3.getComputedTextLength() >= i2 / 1.1)) { for (var a2 = e2.length - 3; a2 > 0; a2 -= 3) if (t3.getSubStringLength(0, a2) <= i2 / 1.1) return void (t3.textContent = e2.substring(0, a2) + "..."); t3.textContent = "."; } } }], [{ key: "setAttrs", value: function(t3, e2) { for (var i2 in e2) e2.hasOwnProperty(i2) && t3.setAttribute(i2, e2[i2]); } }]), t2; })(); var Pi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "getStackedSeriesTotals", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e2 = this.w, i2 = []; if (0 === e2.globals.series.length) return i2; for (var a2 = 0; a2 < e2.globals.series[e2.globals.maxValsInArrayIndex].length; a2++) { for (var s2 = 0, r2 = 0; r2 < e2.globals.series.length; r2++) void 0 !== e2.globals.series[r2][a2] && -1 === t3.indexOf(r2) && (s2 += e2.globals.series[r2][a2]); i2.push(s2); } return i2; } }, { key: "getSeriesTotalByIndex", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; return null === t3 ? this.w.config.series.reduce((function(t4, e2) { return t4 + e2; }), 0) : this.w.globals.series[t3].reduce((function(t4, e2) { return t4 + e2; }), 0); } }, { key: "getStackedSeriesTotalsByGroups", value: function() { var t3 = this, e2 = this.w, i2 = []; return e2.globals.seriesGroups.forEach((function(a2) { var s2 = []; e2.config.series.forEach((function(t4, i3) { a2.indexOf(e2.globals.seriesNames[i3]) > -1 && s2.push(i3); })); var r2 = e2.globals.series.map((function(t4, e3) { return -1 === s2.indexOf(e3) ? e3 : -1; })).filter((function(t4) { return -1 !== t4; })); i2.push(t3.getStackedSeriesTotals(r2)); })), i2; } }, { key: "setSeriesYAxisMappings", value: function() { var t3 = this.w.globals, e2 = this.w.config, i2 = [], a2 = [], s2 = [], r2 = t3.series.length > e2.yaxis.length || e2.yaxis.some((function(t4) { return Array.isArray(t4.seriesName); })); e2.series.forEach((function(t4, e3) { s2.push(e3), a2.push(null); })), e2.yaxis.forEach((function(t4, e3) { i2[e3] = []; })); var n2 = []; e2.yaxis.forEach((function(t4, a3) { var o3 = false; if (t4.seriesName) { var l3 = []; Array.isArray(t4.seriesName) ? l3 = t4.seriesName : l3.push(t4.seriesName), l3.forEach((function(t5) { e2.series.forEach((function(e3, n3) { if (e3.name === t5) { var l4 = n3; a3 === n3 || r2 ? !r2 || s2.indexOf(n3) > -1 ? i2[a3].push([a3, n3]) : console.warn("Series '" + e3.name + "' referenced more than once in what looks like the new style. That is, when using either seriesName: [], or when there are more series than yaxes.") : (i2[n3].push([n3, a3]), l4 = a3), o3 = true, -1 !== (l4 = s2.indexOf(l4)) && s2.splice(l4, 1); } })); })); } o3 || n2.push(a3); })), i2 = i2.map((function(t4, e3) { var i3 = []; return t4.forEach((function(t5) { a2[t5[1]] = t5[0], i3.push(t5[1]); })), i3; })); for (var o2 = e2.yaxis.length - 1, l2 = 0; l2 < n2.length && (o2 = n2[l2], i2[o2] = [], s2); l2++) { var h2 = s2[0]; s2.shift(), i2[o2].push(h2), a2[h2] = o2; } s2.forEach((function(t4) { i2[o2].push(t4), a2[t4] = o2; })), t3.seriesYAxisMap = i2.map((function(t4) { return t4; })), t3.seriesYAxisReverseMap = a2.map((function(t4) { return t4; })), t3.seriesYAxisMap.forEach((function(t4, i3) { t4.forEach((function(t5) { e2.series[t5] && void 0 === e2.series[t5].group && (e2.series[t5].group = "apexcharts-axis-".concat(i3.toString())); })); })); } }, { key: "isSeriesNull", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; return 0 === (null === t3 ? this.w.config.series.filter((function(t4) { return null !== t4; })) : this.w.config.series[t3].data.filter((function(t4) { return null !== t4; }))).length; } }, { key: "seriesHaveSameValues", value: function(t3) { return this.w.globals.series[t3].every((function(t4, e2, i2) { return t4 === i2[0]; })); } }, { key: "getCategoryLabels", value: function(t3) { var e2 = this.w, i2 = t3.slice(); return e2.config.xaxis.convertedCatToNumeric && (i2 = t3.map((function(t4, i3) { return e2.config.xaxis.labels.formatter(t4 - e2.globals.minX + 1); }))), i2; } }, { key: "getLargestSeries", value: function() { var t3 = this.w; t3.globals.maxValsInArrayIndex = t3.globals.series.map((function(t4) { return t4.length; })).indexOf(Math.max.apply(Math, t3.globals.series.map((function(t4) { return t4.length; })))); } }, { key: "getLargestMarkerSize", value: function() { var t3 = this.w, e2 = 0; return t3.globals.markers.size.forEach((function(t4) { e2 = Math.max(e2, t4); })), t3.config.markers.discrete && t3.config.markers.discrete.length && t3.config.markers.discrete.forEach((function(t4) { e2 = Math.max(e2, t4.size); })), e2 > 0 && (t3.config.markers.hover.size > 0 ? e2 = t3.config.markers.hover.size : e2 += t3.config.markers.hover.sizeOffset), t3.globals.markers.largestSize = e2, e2; } }, { key: "getSeriesTotals", value: function() { var t3 = this.w; t3.globals.seriesTotals = t3.globals.series.map((function(t4, e2) { var i2 = 0; if (Array.isArray(t4)) for (var a2 = 0; a2 < t4.length; a2++) i2 += t4[a2]; else i2 += t4; return i2; })); } }, { key: "getSeriesTotalsXRange", value: function(t3, e2) { var i2 = this.w; return i2.globals.series.map((function(a2, s2) { for (var r2 = 0, n2 = 0; n2 < a2.length; n2++) i2.globals.seriesX[s2][n2] > t3 && i2.globals.seriesX[s2][n2] < e2 && (r2 += a2[n2]); return r2; })); } }, { key: "getPercentSeries", value: function() { var t3 = this.w; t3.globals.seriesPercent = t3.globals.series.map((function(e2, i2) { var a2 = []; if (Array.isArray(e2)) for (var s2 = 0; s2 < e2.length; s2++) { var r2 = t3.globals.stackedSeriesTotals[s2], n2 = 0; r2 && (n2 = 100 * e2[s2] / r2), a2.push(n2); } else { var o2 = 100 * e2 / t3.globals.seriesTotals.reduce((function(t4, e3) { return t4 + e3; }), 0); a2.push(o2); } return a2; })); } }, { key: "getCalculatedRatios", value: function() { var t3, e2, i2, a2 = this, s2 = this.w, r2 = s2.globals, n2 = [], o2 = 0, l2 = [], h2 = 0.1, c2 = 0; if (r2.yRange = [], r2.isMultipleYAxis) for (var d2 = 0; d2 < r2.minYArr.length; d2++) r2.yRange.push(Math.abs(r2.minYArr[d2] - r2.maxYArr[d2])), l2.push(0); else r2.yRange.push(Math.abs(r2.minY - r2.maxY)); r2.xRange = Math.abs(r2.maxX - r2.minX), r2.zRange = Math.abs(r2.maxZ - r2.minZ); for (var u2 = 0; u2 < r2.yRange.length; u2++) n2.push(r2.yRange[u2] / r2.gridHeight); if (e2 = r2.xRange / r2.gridWidth, t3 = r2.yRange / r2.gridWidth, i2 = r2.xRange / r2.gridHeight, (o2 = r2.zRange / r2.gridHeight * 16) || (o2 = 1), r2.minY !== Number.MIN_VALUE && 0 !== Math.abs(r2.minY) && (r2.hasNegs = true), s2.globals.seriesYAxisReverseMap.length > 0) { var g2 = function(t4, e3) { var i3 = s2.config.yaxis[s2.globals.seriesYAxisReverseMap[e3]], r3 = t4 < 0 ? -1 : 1; return t4 = Math.abs(t4), i3.logarithmic && (t4 = a2.getBaseLog(i3.logBase, t4)), -r3 * t4 / n2[e3]; }; if (r2.isMultipleYAxis) { l2 = []; for (var p2 = 0; p2 < n2.length; p2++) l2.push(g2(r2.minYArr[p2], p2)); } else (l2 = []).push(g2(r2.minY, 0)), r2.minY !== Number.MIN_VALUE && 0 !== Math.abs(r2.minY) && (h2 = -r2.minY / t3, c2 = r2.minX / e2); } else (l2 = []).push(0), h2 = 0, c2 = 0; return { yRatio: n2, invertedYRatio: t3, zRatio: o2, xRatio: e2, invertedXRatio: i2, baseLineInvertedY: h2, baseLineY: l2, baseLineX: c2 }; } }, { key: "getLogSeries", value: function(t3) { var e2 = this, i2 = this.w; return i2.globals.seriesLog = t3.map((function(t4, a2) { var s2 = i2.globals.seriesYAxisReverseMap[a2]; return i2.config.yaxis[s2] && i2.config.yaxis[s2].logarithmic ? t4.map((function(t5) { return null === t5 ? null : e2.getLogVal(i2.config.yaxis[s2].logBase, t5, a2); })) : t4; })), i2.globals.invalidLogScale ? t3 : i2.globals.seriesLog; } }, { key: "getLogValAtSeriesIndex", value: function(t3, e2) { if (null === t3) return null; var i2 = this.w, a2 = i2.globals.seriesYAxisReverseMap[e2]; return i2.config.yaxis[a2] && i2.config.yaxis[a2].logarithmic ? this.getLogVal(i2.config.yaxis[a2].logBase, t3, e2) : t3; } }, { key: "getBaseLog", value: function(t3, e2) { return Math.log(e2) / Math.log(t3); } }, { key: "getLogVal", value: function(t3, e2, i2) { if (e2 <= 0) return 0; var a2 = this.w, s2 = 0 === a2.globals.minYArr[i2] ? -1 : this.getBaseLog(t3, a2.globals.minYArr[i2]), r2 = (0 === a2.globals.maxYArr[i2] ? 0 : this.getBaseLog(t3, a2.globals.maxYArr[i2])) - s2; return e2 < 1 ? e2 / r2 : (this.getBaseLog(t3, e2) - s2) / r2; } }, { key: "getLogYRatios", value: function(t3) { var e2 = this, i2 = this.w, a2 = this.w.globals; return a2.yLogRatio = t3.slice(), a2.logYRange = a2.yRange.map((function(t4, s2) { var r2 = i2.globals.seriesYAxisReverseMap[s2]; if (i2.config.yaxis[r2] && e2.w.config.yaxis[r2].logarithmic) { var n2, o2 = -Number.MAX_VALUE, l2 = Number.MIN_VALUE; return a2.seriesLog.forEach((function(t5, e3) { t5.forEach((function(t6) { i2.config.yaxis[e3] && i2.config.yaxis[e3].logarithmic && (o2 = Math.max(t6, o2), l2 = Math.min(t6, l2)); })); })), n2 = Math.pow(a2.yRange[s2], Math.abs(l2 - o2) / a2.yRange[s2]), a2.yLogRatio[s2] = n2 / a2.gridHeight, n2; } })), a2.invalidLogScale ? t3.slice() : a2.yLogRatio; } }, { key: "drawSeriesByGroup", value: function(t3, e2, i2, a2) { var s2 = this.w, r2 = []; return t3.series.length > 0 && e2.forEach((function(e3) { var n2 = [], o2 = []; t3.i.forEach((function(i3, a3) { s2.config.series[i3].group === e3 && (n2.push(t3.series[a3]), o2.push(i3)); })), n2.length > 0 && r2.push(a2.draw(n2, i2, o2)); })), r2; } }], [{ key: "checkComboSeries", value: function(t3, e2) { var i2 = false, a2 = 0, s2 = 0; return void 0 === e2 && (e2 = "line"), t3.length && void 0 !== t3[0].type && t3.forEach((function(t4) { "bar" !== t4.type && "column" !== t4.type && "candlestick" !== t4.type && "boxPlot" !== t4.type || a2++, void 0 !== t4.type && t4.type !== e2 && s2++; })), s2 > 0 && (i2 = true), { comboBarCount: a2, comboCharts: i2 }; } }, { key: "extendArrayProps", value: function(t3, e2, i2) { var a2, s2, r2, n2, o2, l2; (null !== (a2 = e2) && void 0 !== a2 && a2.yaxis && (e2 = t3.extendYAxis(e2, i2)), null !== (s2 = e2) && void 0 !== s2 && s2.annotations) && (e2.annotations.yaxis && (e2 = t3.extendYAxisAnnotations(e2)), null !== (r2 = e2) && void 0 !== r2 && null !== (n2 = r2.annotations) && void 0 !== n2 && n2.xaxis && (e2 = t3.extendXAxisAnnotations(e2)), null !== (o2 = e2) && void 0 !== o2 && null !== (l2 = o2.annotations) && void 0 !== l2 && l2.points && (e2 = t3.extendPointAnnotations(e2))); return e2; } }]), t2; })(); var Ii = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.annoCtx = e2; } return s(t2, [{ key: "setOrientations", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i2 = this.w; if ("vertical" === t3.label.orientation) { var a2 = null !== e2 ? e2 : 0, s2 = i2.globals.dom.baseEl.querySelector(".apexcharts-xaxis-annotations .apexcharts-xaxis-annotation-label[rel='".concat(a2, "']")); if (null !== s2) { var r2 = s2.getBoundingClientRect(); s2.setAttribute("x", parseFloat(s2.getAttribute("x")) - r2.height + 4); var n2 = "top" === t3.label.position ? r2.width : -r2.width; s2.setAttribute("y", parseFloat(s2.getAttribute("y")) + n2); var o2 = this.annoCtx.graphics.rotateAroundCenter(s2), l2 = o2.x, h2 = o2.y; s2.setAttribute("transform", "rotate(-90 ".concat(l2, " ").concat(h2, ")")); } } } }, { key: "addBackgroundToAnno", value: function(t3, e2) { var i2 = this.w; if (!t3 || !e2.label.text || !String(e2.label.text).trim()) return null; var a2 = i2.globals.dom.baseEl.querySelector(".apexcharts-grid").getBoundingClientRect(), s2 = t3.getBoundingClientRect(), r2 = e2.label.style.padding, n2 = r2.left, o2 = r2.right, l2 = r2.top, h2 = r2.bottom; if ("vertical" === e2.label.orientation) { var c2 = [n2, o2, l2, h2]; l2 = c2[0], h2 = c2[1], n2 = c2[2], o2 = c2[3]; } var d2 = s2.left - a2.left - n2, u2 = s2.top - a2.top - l2, g2 = this.annoCtx.graphics.drawRect(d2 - i2.globals.barPadForNumericAxis, u2, s2.width + n2 + o2, s2.height + l2 + h2, e2.label.borderRadius, e2.label.style.background, 1, e2.label.borderWidth, e2.label.borderColor, 0); return e2.id && g2.node.classList.add(e2.id), g2; } }, { key: "annotationsBackground", value: function() { var t3 = this, e2 = this.w, i2 = function(i3, a2, s2) { var r2 = e2.globals.dom.baseEl.querySelector(".apexcharts-".concat(s2, "-annotations .apexcharts-").concat(s2, "-annotation-label[rel='").concat(a2, "']")); if (r2) { var n2 = r2.parentNode, o2 = t3.addBackgroundToAnno(r2, i3); o2 && (n2.insertBefore(o2.node, r2), i3.label.mouseEnter && o2.node.addEventListener("mouseenter", i3.label.mouseEnter.bind(t3, i3)), i3.label.mouseLeave && o2.node.addEventListener("mouseleave", i3.label.mouseLeave.bind(t3, i3)), i3.label.click && o2.node.addEventListener("click", i3.label.click.bind(t3, i3))); } }; e2.config.annotations.xaxis.forEach((function(t4, e3) { return i2(t4, e3, "xaxis"); })), e2.config.annotations.yaxis.forEach((function(t4, e3) { return i2(t4, e3, "yaxis"); })), e2.config.annotations.points.forEach((function(t4, e3) { return i2(t4, e3, "point"); })); } }, { key: "getY1Y2", value: function(t3, e2) { var i2, a2 = this.w, s2 = "y1" === t3 ? e2.y : e2.y2, r2 = false; if (this.annoCtx.invertAxis) { var n2 = a2.config.xaxis.convertedCatToNumeric ? a2.globals.categoryLabels : a2.globals.labels, o2 = n2.indexOf(s2), l2 = a2.globals.dom.baseEl.querySelector(".apexcharts-yaxis-texts-g text:nth-child(".concat(o2 + 1, ")")); i2 = l2 ? parseFloat(l2.getAttribute("y")) : (a2.globals.gridHeight / n2.length - 1) * (o2 + 1) - a2.globals.barHeight, void 0 !== e2.seriesIndex && a2.globals.barHeight && (i2 -= a2.globals.barHeight / 2 * (a2.globals.series.length - 1) - a2.globals.barHeight * e2.seriesIndex); } else { var h2, c2 = a2.globals.seriesYAxisMap[e2.yAxisIndex][0], d2 = a2.config.yaxis[e2.yAxisIndex].logarithmic ? new Pi(this.annoCtx.ctx).getLogVal(a2.config.yaxis[e2.yAxisIndex].logBase, s2, c2) / a2.globals.yLogRatio[c2] : (s2 - a2.globals.minYArr[c2]) / (a2.globals.yRange[c2] / a2.globals.gridHeight); i2 = a2.globals.gridHeight - Math.min(Math.max(d2, 0), a2.globals.gridHeight), r2 = d2 > a2.globals.gridHeight || d2 < 0, !e2.marker || void 0 !== e2.y && null !== e2.y || (i2 = 0), null !== (h2 = a2.config.yaxis[e2.yAxisIndex]) && void 0 !== h2 && h2.reversed && (i2 = d2); } return "string" == typeof s2 && s2.includes("px") && (i2 = parseFloat(s2)), { yP: i2, clipped: r2 }; } }, { key: "getX1X2", value: function(t3, e2) { var i2 = this.w, a2 = "x1" === t3 ? e2.x : e2.x2, s2 = this.annoCtx.invertAxis ? i2.globals.minY : i2.globals.minX, r2 = this.annoCtx.invertAxis ? i2.globals.maxY : i2.globals.maxX, n2 = this.annoCtx.invertAxis ? i2.globals.yRange[0] : i2.globals.xRange, o2 = false, l2 = this.annoCtx.inversedReversedAxis ? (r2 - a2) / (n2 / i2.globals.gridWidth) : (a2 - s2) / (n2 / i2.globals.gridWidth); return "category" !== i2.config.xaxis.type && !i2.config.xaxis.convertedCatToNumeric || this.annoCtx.invertAxis || i2.globals.dataFormatXNumeric || i2.config.chart.sparkline.enabled || (l2 = this.getStringX(a2)), "string" == typeof a2 && a2.includes("px") && (l2 = parseFloat(a2)), null == a2 && e2.marker && (l2 = i2.globals.gridWidth), void 0 !== e2.seriesIndex && i2.globals.barWidth && !this.annoCtx.invertAxis && (l2 -= i2.globals.barWidth / 2 * (i2.globals.series.length - 1) - i2.globals.barWidth * e2.seriesIndex), "number" != typeof l2 && (l2 = 0, o2 = true), parseFloat(l2.toFixed(10)) > parseFloat(i2.globals.gridWidth.toFixed(10)) ? (l2 = i2.globals.gridWidth, o2 = true) : l2 < 0 && (l2 = 0, o2 = true), { x: l2, clipped: o2 }; } }, { key: "getStringX", value: function(t3) { var e2 = this.w, i2 = t3; e2.config.xaxis.convertedCatToNumeric && e2.globals.categoryLabels.length && (t3 = e2.globals.categoryLabels.indexOf(t3) + 1); var a2 = e2.globals.labels.map((function(t4) { return Array.isArray(t4) ? t4.join(" ") : t4; })).indexOf(t3), s2 = e2.globals.dom.baseEl.querySelector(".apexcharts-xaxis-texts-g text:nth-child(".concat(a2 + 1, ")")); return s2 && (i2 = parseFloat(s2.getAttribute("x"))), i2; } }]), t2; })(); var Ti = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.annoCtx = e2, this.invertAxis = this.annoCtx.invertAxis, this.helpers = new Ii(this.annoCtx); } return s(t2, [{ key: "addXaxisAnnotation", value: function(t3, e2, i2) { var a2, s2 = this.w, r2 = this.helpers.getX1X2("x1", t3), n2 = r2.x, o2 = r2.clipped, l2 = true, h2 = t3.label.text, c2 = t3.strokeDashArray; if (v.isNumber(n2)) { if (null === t3.x2 || void 0 === t3.x2) { if (!o2) { var d2 = this.annoCtx.graphics.drawLine(n2 + t3.offsetX, 0 + t3.offsetY, n2 + t3.offsetX, s2.globals.gridHeight + t3.offsetY, t3.borderColor, c2, t3.borderWidth); e2.appendChild(d2.node), t3.id && d2.node.classList.add(t3.id); } } else { var u2 = this.helpers.getX1X2("x2", t3); if (a2 = u2.x, l2 = u2.clipped, a2 < n2) { var g2 = n2; n2 = a2, a2 = g2; } var p2 = this.annoCtx.graphics.drawRect(n2 + t3.offsetX, 0 + t3.offsetY, a2 - n2, s2.globals.gridHeight + t3.offsetY, 0, t3.fillColor, t3.opacity, 1, t3.borderColor, c2); p2.node.classList.add("apexcharts-annotation-rect"), p2.attr("clip-path", "url(#gridRectMask".concat(s2.globals.cuid, ")")), e2.appendChild(p2.node), t3.id && p2.node.classList.add(t3.id); } if (!o2 || !l2) { var f2 = this.annoCtx.graphics.getTextRects(h2, parseFloat(t3.label.style.fontSize)), x2 = "top" === t3.label.position ? 4 : "center" === t3.label.position ? s2.globals.gridHeight / 2 + ("vertical" === t3.label.orientation ? f2.width / 2 : 0) : s2.globals.gridHeight, b2 = this.annoCtx.graphics.drawText({ x: n2 + t3.label.offsetX, y: x2 + t3.label.offsetY - ("vertical" === t3.label.orientation ? "top" === t3.label.position ? f2.width / 2 - 12 : -f2.width / 2 : 0), text: h2, textAnchor: t3.label.textAnchor, fontSize: t3.label.style.fontSize, fontFamily: t3.label.style.fontFamily, fontWeight: t3.label.style.fontWeight, foreColor: t3.label.style.color, cssClass: "apexcharts-xaxis-annotation-label ".concat(t3.label.style.cssClass, " ").concat(t3.id ? t3.id : "") }); b2.attr({ rel: i2 }), e2.appendChild(b2.node), this.annoCtx.helpers.setOrientations(t3, i2); } } } }, { key: "drawXAxisAnnotations", value: function() { var t3 = this, e2 = this.w, i2 = this.annoCtx.graphics.group({ class: "apexcharts-xaxis-annotations" }); return e2.config.annotations.xaxis.map((function(e3, a2) { t3.addXaxisAnnotation(e3, i2.node, a2); })), i2; } }]), t2; })(); var zi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.months31 = [1, 3, 5, 7, 8, 10, 12], this.months30 = [2, 4, 6, 9, 11], this.daysCntOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; } return s(t2, [{ key: "isValidDate", value: function(t3) { return "number" != typeof t3 && !isNaN(this.parseDate(t3)); } }, { key: "getTimeStamp", value: function(t3) { return Date.parse(t3) ? this.w.config.xaxis.labels.datetimeUTC ? new Date(new Date(t3).toISOString().substr(0, 25)).getTime() : new Date(t3).getTime() : t3; } }, { key: "getDate", value: function(t3) { return this.w.config.xaxis.labels.datetimeUTC ? new Date(new Date(t3).toUTCString()) : new Date(t3); } }, { key: "parseDate", value: function(t3) { var e2 = Date.parse(t3); if (!isNaN(e2)) return this.getTimeStamp(t3); var i2 = Date.parse(t3.replace(/-/g, "/").replace(/[a-z]+/gi, " ")); return i2 = this.getTimeStamp(i2); } }, { key: "parseDateWithTimezone", value: function(t3) { return Date.parse(t3.replace(/-/g, "/").replace(/[a-z]+/gi, " ")); } }, { key: "formatDate", value: function(t3, e2) { var i2 = this.w.globals.locale, a2 = this.w.config.xaxis.labels.datetimeUTC, s2 = ["\0"].concat(f(i2.months)), r2 = [""].concat(f(i2.shortMonths)), n2 = [""].concat(f(i2.days)), o2 = [""].concat(f(i2.shortDays)); function l2(t4, e3) { var i3 = t4 + ""; for (e3 = e3 || 2; i3.length < e3; ) i3 = "0" + i3; return i3; } var h2 = a2 ? t3.getUTCFullYear() : t3.getFullYear(); e2 = (e2 = (e2 = e2.replace(/(^|[^\\])yyyy+/g, "$1" + h2)).replace(/(^|[^\\])yy/g, "$1" + h2.toString().substr(2, 2))).replace(/(^|[^\\])y/g, "$1" + h2); var c2 = (a2 ? t3.getUTCMonth() : t3.getMonth()) + 1; e2 = (e2 = (e2 = (e2 = e2.replace(/(^|[^\\])MMMM+/g, "$1" + s2[0])).replace(/(^|[^\\])MMM/g, "$1" + r2[0])).replace(/(^|[^\\])MM/g, "$1" + l2(c2))).replace(/(^|[^\\])M/g, "$1" + c2); var d2 = a2 ? t3.getUTCDate() : t3.getDate(); e2 = (e2 = (e2 = (e2 = e2.replace(/(^|[^\\])dddd+/g, "$1" + n2[0])).replace(/(^|[^\\])ddd/g, "$1" + o2[0])).replace(/(^|[^\\])dd/g, "$1" + l2(d2))).replace(/(^|[^\\])d/g, "$1" + d2); var u2 = a2 ? t3.getUTCHours() : t3.getHours(), g2 = u2 > 12 ? u2 - 12 : 0 === u2 ? 12 : u2; e2 = (e2 = (e2 = (e2 = e2.replace(/(^|[^\\])HH+/g, "$1" + l2(u2))).replace(/(^|[^\\])H/g, "$1" + u2)).replace(/(^|[^\\])hh+/g, "$1" + l2(g2))).replace(/(^|[^\\])h/g, "$1" + g2); var p2 = a2 ? t3.getUTCMinutes() : t3.getMinutes(); e2 = (e2 = e2.replace(/(^|[^\\])mm+/g, "$1" + l2(p2))).replace(/(^|[^\\])m/g, "$1" + p2); var x2 = a2 ? t3.getUTCSeconds() : t3.getSeconds(); e2 = (e2 = e2.replace(/(^|[^\\])ss+/g, "$1" + l2(x2))).replace(/(^|[^\\])s/g, "$1" + x2); var b2 = a2 ? t3.getUTCMilliseconds() : t3.getMilliseconds(); e2 = e2.replace(/(^|[^\\])fff+/g, "$1" + l2(b2, 3)), b2 = Math.round(b2 / 10), e2 = e2.replace(/(^|[^\\])ff/g, "$1" + l2(b2)), b2 = Math.round(b2 / 10); var m2 = u2 < 12 ? "AM" : "PM"; e2 = (e2 = (e2 = e2.replace(/(^|[^\\])f/g, "$1" + b2)).replace(/(^|[^\\])TT+/g, "$1" + m2)).replace(/(^|[^\\])T/g, "$1" + m2.charAt(0)); var v2 = m2.toLowerCase(); e2 = (e2 = e2.replace(/(^|[^\\])tt+/g, "$1" + v2)).replace(/(^|[^\\])t/g, "$1" + v2.charAt(0)); var y2 = -t3.getTimezoneOffset(), w2 = a2 || !y2 ? "Z" : y2 > 0 ? "+" : "-"; if (!a2) { var k2 = (y2 = Math.abs(y2)) % 60; w2 += l2(Math.floor(y2 / 60)) + ":" + l2(k2); } e2 = e2.replace(/(^|[^\\])K/g, "$1" + w2); var A2 = (a2 ? t3.getUTCDay() : t3.getDay()) + 1; return e2 = (e2 = (e2 = (e2 = (e2 = e2.replace(new RegExp(n2[0], "g"), n2[A2])).replace(new RegExp(o2[0], "g"), o2[A2])).replace(new RegExp(s2[0], "g"), s2[c2])).replace(new RegExp(r2[0], "g"), r2[c2])).replace(/\\(.)/g, "$1"); } }, { key: "getTimeUnitsfromTimestamp", value: function(t3, e2, i2) { var a2 = this.w; void 0 !== a2.config.xaxis.min && (t3 = a2.config.xaxis.min), void 0 !== a2.config.xaxis.max && (e2 = a2.config.xaxis.max); var s2 = this.getDate(t3), r2 = this.getDate(e2), n2 = this.formatDate(s2, "yyyy MM dd HH mm ss fff").split(" "), o2 = this.formatDate(r2, "yyyy MM dd HH mm ss fff").split(" "); return { minMillisecond: parseInt(n2[6], 10), maxMillisecond: parseInt(o2[6], 10), minSecond: parseInt(n2[5], 10), maxSecond: parseInt(o2[5], 10), minMinute: parseInt(n2[4], 10), maxMinute: parseInt(o2[4], 10), minHour: parseInt(n2[3], 10), maxHour: parseInt(o2[3], 10), minDate: parseInt(n2[2], 10), maxDate: parseInt(o2[2], 10), minMonth: parseInt(n2[1], 10) - 1, maxMonth: parseInt(o2[1], 10) - 1, minYear: parseInt(n2[0], 10), maxYear: parseInt(o2[0], 10) }; } }, { key: "isLeapYear", value: function(t3) { return t3 % 4 == 0 && t3 % 100 != 0 || t3 % 400 == 0; } }, { key: "calculcateLastDaysOfMonth", value: function(t3, e2, i2) { return this.determineDaysOfMonths(t3, e2) - i2; } }, { key: "determineDaysOfYear", value: function(t3) { var e2 = 365; return this.isLeapYear(t3) && (e2 = 366), e2; } }, { key: "determineRemainingDaysOfYear", value: function(t3, e2, i2) { var a2 = this.daysCntOfYear[e2] + i2; return e2 > 1 && this.isLeapYear() && a2++, a2; } }, { key: "determineDaysOfMonths", value: function(t3, e2) { var i2 = 30; switch (t3 = v.monthMod(t3), true) { case this.months30.indexOf(t3) > -1: 2 === t3 && (i2 = this.isLeapYear(e2) ? 29 : 28); break; case this.months31.indexOf(t3) > -1: default: i2 = 31; } return i2; } }]), t2; })(); var Xi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.tooltipKeyFormat = "dd MMM"; } return s(t2, [{ key: "xLabelFormat", value: function(t3, e2, i2, a2) { var s2 = this.w; if ("datetime" === s2.config.xaxis.type && void 0 === s2.config.xaxis.labels.formatter && void 0 === s2.config.tooltip.x.formatter) { var r2 = new zi(this.ctx); return r2.formatDate(r2.getDate(e2), s2.config.tooltip.x.format); } return t3(e2, i2, a2); } }, { key: "defaultGeneralFormatter", value: function(t3) { return Array.isArray(t3) ? t3.map((function(t4) { return t4; })) : t3; } }, { key: "defaultYFormatter", value: function(t3, e2, i2) { var a2 = this.w; if (v.isNumber(t3)) if (0 !== a2.globals.yValueDecimal) t3 = t3.toFixed(void 0 !== e2.decimalsInFloat ? e2.decimalsInFloat : a2.globals.yValueDecimal); else { var s2 = t3.toFixed(0); t3 = t3 == s2 ? s2 : t3.toFixed(1); } return t3; } }, { key: "setLabelFormatters", value: function() { var t3 = this, e2 = this.w; return e2.globals.xaxisTooltipFormatter = function(e3) { return t3.defaultGeneralFormatter(e3); }, e2.globals.ttKeyFormatter = function(e3) { return t3.defaultGeneralFormatter(e3); }, e2.globals.ttZFormatter = function(t4) { return t4; }, e2.globals.legendFormatter = function(e3) { return t3.defaultGeneralFormatter(e3); }, void 0 !== e2.config.xaxis.labels.formatter ? e2.globals.xLabelFormatter = e2.config.xaxis.labels.formatter : e2.globals.xLabelFormatter = function(t4) { if (v.isNumber(t4)) { if (!e2.config.xaxis.convertedCatToNumeric && "numeric" === e2.config.xaxis.type) { if (v.isNumber(e2.config.xaxis.decimalsInFloat)) return t4.toFixed(e2.config.xaxis.decimalsInFloat); var i2 = e2.globals.maxX - e2.globals.minX; return i2 > 0 && i2 < 100 ? t4.toFixed(1) : t4.toFixed(0); } if (e2.globals.isBarHorizontal) { if (e2.globals.maxY - e2.globals.minYArr < 4) return t4.toFixed(1); } return t4.toFixed(0); } return t4; }, "function" == typeof e2.config.tooltip.x.formatter ? e2.globals.ttKeyFormatter = e2.config.tooltip.x.formatter : e2.globals.ttKeyFormatter = e2.globals.xLabelFormatter, "function" == typeof e2.config.xaxis.tooltip.formatter && (e2.globals.xaxisTooltipFormatter = e2.config.xaxis.tooltip.formatter), (Array.isArray(e2.config.tooltip.y) || void 0 !== e2.config.tooltip.y.formatter) && (e2.globals.ttVal = e2.config.tooltip.y), void 0 !== e2.config.tooltip.z.formatter && (e2.globals.ttZFormatter = e2.config.tooltip.z.formatter), void 0 !== e2.config.legend.formatter && (e2.globals.legendFormatter = e2.config.legend.formatter), e2.config.yaxis.forEach((function(i2, a2) { void 0 !== i2.labels.formatter ? e2.globals.yLabelFormatters[a2] = i2.labels.formatter : e2.globals.yLabelFormatters[a2] = function(s2) { return e2.globals.xyCharts ? Array.isArray(s2) ? s2.map((function(e3) { return t3.defaultYFormatter(e3, i2, a2); })) : t3.defaultYFormatter(s2, i2, a2) : s2; }; })), e2.globals; } }, { key: "heatmapLabelFormatters", value: function() { var t3 = this.w; if ("heatmap" === t3.config.chart.type) { t3.globals.yAxisScale[0].result = t3.globals.seriesNames.slice(); var e2 = t3.globals.seriesNames.reduce((function(t4, e3) { return t4.length > e3.length ? t4 : e3; }), 0); t3.globals.yAxisScale[0].niceMax = e2, t3.globals.yAxisScale[0].niceMin = e2; } } }]), t2; })(); var Ri = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "getLabel", value: function(t3, e2, i2, a2) { var s2 = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : [], r2 = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : "12px", n2 = !(arguments.length > 6 && void 0 !== arguments[6]) || arguments[6], o2 = this.w, l2 = void 0 === t3[a2] ? "" : t3[a2], h2 = l2, c2 = o2.globals.xLabelFormatter, d2 = o2.config.xaxis.labels.formatter, u2 = false, g2 = new Xi(this.ctx), p2 = l2; n2 && (h2 = g2.xLabelFormat(c2, l2, p2, { i: a2, dateFormatter: new zi(this.ctx).formatDate, w: o2 }), void 0 !== d2 && (h2 = d2(l2, t3[a2], { i: a2, dateFormatter: new zi(this.ctx).formatDate, w: o2 }))); var f2, x2; e2.length > 0 ? (f2 = e2[a2].unit, x2 = null, e2.forEach((function(t4) { "month" === t4.unit ? x2 = "year" : "day" === t4.unit ? x2 = "month" : "hour" === t4.unit ? x2 = "day" : "minute" === t4.unit && (x2 = "hour"); })), u2 = x2 === f2, i2 = e2[a2].position, h2 = e2[a2].value) : "datetime" === o2.config.xaxis.type && void 0 === d2 && (h2 = ""), void 0 === h2 && (h2 = ""), h2 = Array.isArray(h2) ? h2 : h2.toString(); var b2 = new Mi(this.ctx), m2 = {}; m2 = o2.globals.rotateXLabels && n2 ? b2.getTextRects(h2, parseInt(r2, 10), null, "rotate(".concat(o2.config.xaxis.labels.rotate, " 0 0)"), false) : b2.getTextRects(h2, parseInt(r2, 10)); var v2 = !o2.config.xaxis.labels.showDuplicates && this.ctx.timeScale; return !Array.isArray(h2) && ("NaN" === String(h2) || s2.indexOf(h2) >= 0 && v2) && (h2 = ""), { x: i2, text: h2, textRect: m2, isBold: u2 }; } }, { key: "checkLabelBasedOnTickamount", value: function(t3, e2, i2) { var a2 = this.w, s2 = a2.config.xaxis.tickAmount; return "dataPoints" === s2 && (s2 = Math.round(a2.globals.gridWidth / 120)), s2 > i2 || t3 % Math.round(i2 / (s2 + 1)) == 0 || (e2.text = ""), e2; } }, { key: "checkForOverflowingLabels", value: function(t3, e2, i2, a2, s2) { var r2 = this.w; if (0 === t3 && r2.globals.skipFirstTimelinelabel && (e2.text = ""), t3 === i2 - 1 && r2.globals.skipLastTimelinelabel && (e2.text = ""), r2.config.xaxis.labels.hideOverlappingLabels && a2.length > 0) { var n2 = s2[s2.length - 1]; if (r2.config.xaxis.labels.trim && "datetime" !== r2.config.xaxis.type) return e2; e2.x < n2.textRect.width / (r2.globals.rotateXLabels ? Math.abs(r2.config.xaxis.labels.rotate) / 12 : 1.01) + n2.x && (e2.text = ""); } return e2; } }, { key: "checkForReversedLabels", value: function(t3, e2) { var i2 = this.w; return i2.config.yaxis[t3] && i2.config.yaxis[t3].reversed && e2.reverse(), e2; } }, { key: "yAxisAllSeriesCollapsed", value: function(t3) { var e2 = this.w.globals; return !e2.seriesYAxisMap[t3].some((function(t4) { return -1 === e2.collapsedSeriesIndices.indexOf(t4); })); } }, { key: "translateYAxisIndex", value: function(t3) { var e2 = this.w, i2 = e2.globals, a2 = e2.config.yaxis; return i2.series.length > a2.length || a2.some((function(t4) { return Array.isArray(t4.seriesName); })) ? t3 : i2.seriesYAxisReverseMap[t3]; } }, { key: "isYAxisHidden", value: function(t3) { var e2 = this.w, i2 = e2.config.yaxis[t3]; if (!i2.show || this.yAxisAllSeriesCollapsed(t3)) return true; if (!i2.showForNullSeries) { var a2 = e2.globals.seriesYAxisMap[t3], s2 = new Pi(this.ctx); return a2.every((function(t4) { return s2.isSeriesNull(t4); })); } return false; } }, { key: "getYAxisForeColor", value: function(t3, e2) { var i2 = this.w; return Array.isArray(t3) && i2.globals.yAxisScale[e2] && this.ctx.theme.pushExtraColors(t3, i2.globals.yAxisScale[e2].result.length, false), t3; } }, { key: "drawYAxisTicks", value: function(t3, e2, i2, a2, s2, r2, n2) { var o2 = this.w, l2 = new Mi(this.ctx), h2 = o2.globals.translateY + o2.config.yaxis[s2].labels.offsetY; if (o2.globals.isBarHorizontal ? h2 = 0 : "heatmap" === o2.config.chart.type && (h2 += r2 / 2), a2.show && e2 > 0) { true === o2.config.yaxis[s2].opposite && (t3 += a2.width); for (var c2 = e2; c2 >= 0; c2--) { var d2 = l2.drawLine(t3 + i2.offsetX - a2.width + a2.offsetX, h2 + a2.offsetY, t3 + i2.offsetX + a2.offsetX, h2 + a2.offsetY, a2.color); n2.add(d2), h2 += r2; } } } }]), t2; })(); var Ei = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.annoCtx = e2, this.helpers = new Ii(this.annoCtx), this.axesUtils = new Ri(this.annoCtx); } return s(t2, [{ key: "addYaxisAnnotation", value: function(t3, e2, i2) { var a2, s2 = this.w, r2 = t3.strokeDashArray, n2 = this.helpers.getY1Y2("y1", t3), o2 = n2.yP, l2 = n2.clipped, h2 = true, c2 = false, d2 = t3.label.text; if (null === t3.y2 || void 0 === t3.y2) { if (!l2) { c2 = true; var u2 = this.annoCtx.graphics.drawLine(0 + t3.offsetX, o2 + t3.offsetY, this._getYAxisAnnotationWidth(t3), o2 + t3.offsetY, t3.borderColor, r2, t3.borderWidth); e2.appendChild(u2.node), t3.id && u2.node.classList.add(t3.id); } } else { if (a2 = (n2 = this.helpers.getY1Y2("y2", t3)).yP, h2 = n2.clipped, a2 > o2) { var g2 = o2; o2 = a2, a2 = g2; } if (!l2 || !h2) { c2 = true; var p2 = this.annoCtx.graphics.drawRect(0 + t3.offsetX, a2 + t3.offsetY, this._getYAxisAnnotationWidth(t3), o2 - a2, 0, t3.fillColor, t3.opacity, 1, t3.borderColor, r2); p2.node.classList.add("apexcharts-annotation-rect"), p2.attr("clip-path", "url(#gridRectMask".concat(s2.globals.cuid, ")")), e2.appendChild(p2.node), t3.id && p2.node.classList.add(t3.id); } } if (c2) { var f2 = "right" === t3.label.position ? s2.globals.gridWidth : "center" === t3.label.position ? s2.globals.gridWidth / 2 : 0, x2 = this.annoCtx.graphics.drawText({ x: f2 + t3.label.offsetX, y: (null != a2 ? a2 : o2) + t3.label.offsetY - 3, text: d2, textAnchor: t3.label.textAnchor, fontSize: t3.label.style.fontSize, fontFamily: t3.label.style.fontFamily, fontWeight: t3.label.style.fontWeight, foreColor: t3.label.style.color, cssClass: "apexcharts-yaxis-annotation-label ".concat(t3.label.style.cssClass, " ").concat(t3.id ? t3.id : "") }); x2.attr({ rel: i2 }), e2.appendChild(x2.node); } } }, { key: "_getYAxisAnnotationWidth", value: function(t3) { var e2 = this.w; e2.globals.gridWidth; return (t3.width.indexOf("%") > -1 ? e2.globals.gridWidth * parseInt(t3.width, 10) / 100 : parseInt(t3.width, 10)) + t3.offsetX; } }, { key: "drawYAxisAnnotations", value: function() { var t3 = this, e2 = this.w, i2 = this.annoCtx.graphics.group({ class: "apexcharts-yaxis-annotations" }); return e2.config.annotations.yaxis.forEach((function(e3, a2) { e3.yAxisIndex = t3.axesUtils.translateYAxisIndex(e3.yAxisIndex), t3.axesUtils.isYAxisHidden(e3.yAxisIndex) && t3.axesUtils.yAxisAllSeriesCollapsed(e3.yAxisIndex) || t3.addYaxisAnnotation(e3, i2.node, a2); })), i2; } }]), t2; })(); var Yi = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.annoCtx = e2, this.helpers = new Ii(this.annoCtx); } return s(t2, [{ key: "addPointAnnotation", value: function(t3, e2, i2) { if (!(this.w.globals.collapsedSeriesIndices.indexOf(t3.seriesIndex) > -1)) { var a2 = this.helpers.getX1X2("x1", t3), s2 = a2.x, r2 = a2.clipped, n2 = (a2 = this.helpers.getY1Y2("y1", t3)).yP, o2 = a2.clipped; if (v.isNumber(s2) && !o2 && !r2) { var l2 = { pSize: t3.marker.size, pointStrokeWidth: t3.marker.strokeWidth, pointFillColor: t3.marker.fillColor, pointStrokeColor: t3.marker.strokeColor, shape: t3.marker.shape, pRadius: t3.marker.radius, class: "apexcharts-point-annotation-marker ".concat(t3.marker.cssClass, " ").concat(t3.id ? t3.id : "") }, h2 = this.annoCtx.graphics.drawMarker(s2 + t3.marker.offsetX, n2 + t3.marker.offsetY, l2); e2.appendChild(h2.node); var c2 = t3.label.text ? t3.label.text : "", d2 = this.annoCtx.graphics.drawText({ x: s2 + t3.label.offsetX, y: n2 + t3.label.offsetY - t3.marker.size - parseFloat(t3.label.style.fontSize) / 1.6, text: c2, textAnchor: t3.label.textAnchor, fontSize: t3.label.style.fontSize, fontFamily: t3.label.style.fontFamily, fontWeight: t3.label.style.fontWeight, foreColor: t3.label.style.color, cssClass: "apexcharts-point-annotation-label ".concat(t3.label.style.cssClass, " ").concat(t3.id ? t3.id : "") }); if (d2.attr({ rel: i2 }), e2.appendChild(d2.node), t3.customSVG.SVG) { var u2 = this.annoCtx.graphics.group({ class: "apexcharts-point-annotations-custom-svg " + t3.customSVG.cssClass }); u2.attr({ transform: "translate(".concat(s2 + t3.customSVG.offsetX, ", ").concat(n2 + t3.customSVG.offsetY, ")") }), u2.node.innerHTML = t3.customSVG.SVG, e2.appendChild(u2.node); } if (t3.image.path) { var g2 = t3.image.width ? t3.image.width : 20, p2 = t3.image.height ? t3.image.height : 20; h2 = this.annoCtx.addImage({ x: s2 + t3.image.offsetX - g2 / 2, y: n2 + t3.image.offsetY - p2 / 2, width: g2, height: p2, path: t3.image.path, appendTo: ".apexcharts-point-annotations" }); } t3.mouseEnter && h2.node.addEventListener("mouseenter", t3.mouseEnter.bind(this, t3)), t3.mouseLeave && h2.node.addEventListener("mouseleave", t3.mouseLeave.bind(this, t3)), t3.click && h2.node.addEventListener("click", t3.click.bind(this, t3)); } } } }, { key: "drawPointAnnotations", value: function() { var t3 = this, e2 = this.w, i2 = this.annoCtx.graphics.group({ class: "apexcharts-point-annotations" }); return e2.config.annotations.points.map((function(e3, a2) { t3.addPointAnnotation(e3, i2.node, a2); })), i2; } }]), t2; })(); var Hi = { name: "en", options: { months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], toolbar: { exportToSVG: "Download SVG", exportToPNG: "Download PNG", exportToCSV: "Download CSV", menu: "Menu", selection: "Selection", selectionZoom: "Selection Zoom", zoomIn: "Zoom In", zoomOut: "Zoom Out", pan: "Panning", reset: "Reset Zoom" } } }; var Oi = (function() { function t2() { i(this, t2), this.yAxis = { show: true, showAlways: false, showForNullSeries: true, seriesName: void 0, opposite: false, reversed: false, logarithmic: false, logBase: 10, tickAmount: void 0, stepSize: void 0, forceNiceScale: false, max: void 0, min: void 0, floating: false, decimalsInFloat: void 0, labels: { show: true, showDuplicates: false, minWidth: 0, maxWidth: 160, offsetX: 0, offsetY: 0, align: void 0, rotate: 0, padding: 20, style: { colors: [], fontSize: "11px", fontWeight: 400, fontFamily: void 0, cssClass: "" }, formatter: void 0 }, axisBorder: { show: false, color: "#e0e0e0", width: 1, offsetX: 0, offsetY: 0 }, axisTicks: { show: false, color: "#e0e0e0", width: 6, offsetX: 0, offsetY: 0 }, title: { text: void 0, rotate: -90, offsetY: 0, offsetX: 0, style: { color: void 0, fontSize: "11px", fontWeight: 900, fontFamily: void 0, cssClass: "" } }, tooltip: { enabled: false, offsetX: 0 }, crosshairs: { show: true, position: "front", stroke: { color: "#b6b6b6", width: 1, dashArray: 0 } } }, this.pointAnnotation = { id: void 0, x: 0, y: null, yAxisIndex: 0, seriesIndex: void 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, marker: { size: 4, fillColor: "#fff", strokeWidth: 2, strokeColor: "#333", shape: "circle", offsetX: 0, offsetY: 0, cssClass: "" }, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "middle", offsetX: 0, offsetY: 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } }, customSVG: { SVG: void 0, cssClass: void 0, offsetX: 0, offsetY: 0 }, image: { path: void 0, width: 20, height: 20, offsetX: 0, offsetY: 0 } }, this.yAxisAnnotation = { id: void 0, y: 0, y2: null, strokeDashArray: 1, fillColor: "#c2c2c2", borderColor: "#c2c2c2", borderWidth: 1, opacity: 0.3, offsetX: 0, offsetY: 0, width: "100%", yAxisIndex: 0, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "end", position: "right", offsetX: 0, offsetY: -3, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } } }, this.xAxisAnnotation = { id: void 0, x: 0, x2: null, strokeDashArray: 1, fillColor: "#c2c2c2", borderColor: "#c2c2c2", borderWidth: 1, opacity: 0.3, offsetX: 0, offsetY: 0, label: { borderColor: "#c2c2c2", borderWidth: 1, borderRadius: 2, text: void 0, textAnchor: "middle", orientation: "vertical", position: "top", offsetX: 0, offsetY: 0, mouseEnter: void 0, mouseLeave: void 0, click: void 0, style: { background: "#fff", color: void 0, fontSize: "11px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 5, right: 5, top: 2, bottom: 2 } } } }, this.text = { x: 0, y: 0, text: "", textAnchor: "start", foreColor: void 0, fontSize: "13px", fontFamily: void 0, fontWeight: 400, appendTo: ".apexcharts-annotations", backgroundColor: "transparent", borderColor: "#c2c2c2", borderRadius: 0, borderWidth: 0, paddingLeft: 4, paddingRight: 4, paddingTop: 2, paddingBottom: 2 }; } return s(t2, [{ key: "init", value: function() { return { annotations: { yaxis: [this.yAxisAnnotation], xaxis: [this.xAxisAnnotation], points: [this.pointAnnotation], texts: [], images: [], shapes: [] }, chart: { animations: { enabled: true, speed: 800, animateGradually: { delay: 150, enabled: true }, dynamicAnimation: { enabled: true, speed: 350 } }, background: "", locales: [Hi], defaultLocale: "en", dropShadow: { enabled: false, enabledOnSeries: void 0, top: 2, left: 2, blur: 4, color: "#000", opacity: 0.7 }, events: { animationEnd: void 0, beforeMount: void 0, mounted: void 0, updated: void 0, click: void 0, mouseMove: void 0, mouseLeave: void 0, xAxisLabelClick: void 0, legendClick: void 0, markerClick: void 0, selection: void 0, dataPointSelection: void 0, dataPointMouseEnter: void 0, dataPointMouseLeave: void 0, beforeZoom: void 0, beforeResetZoom: void 0, zoomed: void 0, scrolled: void 0, brushScrolled: void 0 }, foreColor: "#373d3f", fontFamily: "Helvetica, Arial, sans-serif", height: "auto", parentHeightOffset: 15, redrawOnParentResize: true, redrawOnWindowResize: true, id: void 0, group: void 0, nonce: void 0, offsetX: 0, offsetY: 0, injectStyleSheet: true, selection: { enabled: false, type: "x", fill: { color: "#24292e", opacity: 0.1 }, stroke: { width: 1, color: "#24292e", opacity: 0.4, dashArray: 3 }, xaxis: { min: void 0, max: void 0 }, yaxis: { min: void 0, max: void 0 } }, sparkline: { enabled: false }, brush: { enabled: false, autoScaleYaxis: true, target: void 0, targets: void 0 }, stacked: false, stackOnlyBar: true, stackType: "normal", toolbar: { show: true, offsetX: 0, offsetY: 0, tools: { download: true, selection: true, zoom: true, zoomin: true, zoomout: true, pan: true, reset: true, customIcons: [] }, export: { csv: { filename: void 0, columnDelimiter: ",", headerCategory: "category", headerValue: "value", categoryFormatter: void 0, valueFormatter: void 0 }, png: { filename: void 0 }, svg: { filename: void 0 }, scale: void 0, width: void 0 }, autoSelected: "zoom" }, type: "line", width: "100%", zoom: { enabled: true, type: "x", autoScaleYaxis: false, allowMouseWheelZoom: true, zoomedArea: { fill: { color: "#90CAF9", opacity: 0.4 }, stroke: { color: "#0D47A1", opacity: 0.4, width: 1 } } } }, parsing: { x: void 0, y: void 0 }, plotOptions: { line: { isSlopeChart: false, colors: { threshold: 0, colorAboveThreshold: void 0, colorBelowThreshold: void 0 } }, area: { fillTo: "origin" }, bar: { horizontal: false, columnWidth: "70%", barHeight: "70%", distributed: false, borderRadius: 0, borderRadiusApplication: "around", borderRadiusWhenStacked: "last", rangeBarOverlap: true, rangeBarGroupRows: false, hideZeroBarsWhenGrouped: false, isDumbbell: false, dumbbellColors: void 0, isFunnel: false, isFunnel3d: true, colors: { ranges: [], backgroundBarColors: [], backgroundBarOpacity: 1, backgroundBarRadius: 0 }, dataLabels: { position: "top", maxItems: 100, hideOverflowingLabels: true, orientation: "horizontal", total: { enabled: false, formatter: void 0, offsetX: 0, offsetY: 0, style: { color: "#373d3f", fontSize: "12px", fontFamily: void 0, fontWeight: 600 } } } }, bubble: { zScaling: true, minBubbleRadius: void 0, maxBubbleRadius: void 0 }, candlestick: { colors: { upward: "#00B746", downward: "#EF403C" }, wick: { useFillColor: true } }, boxPlot: { colors: { upper: "#00E396", lower: "#008FFB" } }, heatmap: { radius: 2, enableShades: true, shadeIntensity: 0.5, reverseNegativeShade: false, distributed: false, useFillColorAsStroke: false, colorScale: { inverse: false, ranges: [], min: void 0, max: void 0 } }, treemap: { enableShades: true, shadeIntensity: 0.5, distributed: false, reverseNegativeShade: false, useFillColorAsStroke: false, borderRadius: 4, dataLabels: { format: "scale" }, colorScale: { inverse: false, ranges: [], min: void 0, max: void 0 }, seriesTitle: { show: true, offsetY: 1, offsetX: 1, borderColor: "#000", borderWidth: 1, borderRadius: 2, style: { background: "rgba(0, 0, 0, 0.6)", color: "#fff", fontSize: "12px", fontFamily: void 0, fontWeight: 400, cssClass: "", padding: { left: 6, right: 6, top: 2, bottom: 2 } } } }, radialBar: { inverseOrder: false, startAngle: 0, endAngle: 360, offsetX: 0, offsetY: 0, hollow: { margin: 5, size: "50%", background: "transparent", image: void 0, imageWidth: 150, imageHeight: 150, imageOffsetX: 0, imageOffsetY: 0, imageClipped: true, position: "front", dropShadow: { enabled: false, top: 0, left: 0, blur: 3, color: "#000", opacity: 0.5 } }, track: { show: true, startAngle: void 0, endAngle: void 0, background: "#f2f2f2", strokeWidth: "97%", opacity: 1, margin: 5, dropShadow: { enabled: false, top: 0, left: 0, blur: 3, color: "#000", opacity: 0.5 } }, dataLabels: { show: true, name: { show: true, fontSize: "16px", fontFamily: void 0, fontWeight: 600, color: void 0, offsetY: 0, formatter: function(t3) { return t3; } }, value: { show: true, fontSize: "14px", fontFamily: void 0, fontWeight: 400, color: void 0, offsetY: 16, formatter: function(t3) { return t3 + "%"; } }, total: { show: false, label: "Total", fontSize: "16px", fontWeight: 600, fontFamily: void 0, color: void 0, formatter: function(t3) { return t3.globals.seriesTotals.reduce((function(t4, e2) { return t4 + e2; }), 0) / t3.globals.series.length + "%"; } } }, barLabels: { enabled: false, offsetX: 0, offsetY: 0, useSeriesColors: true, fontFamily: void 0, fontWeight: 600, fontSize: "16px", formatter: function(t3) { return t3; }, onClick: void 0 } }, pie: { customScale: 1, offsetX: 0, offsetY: 0, startAngle: 0, endAngle: 360, expandOnClick: true, dataLabels: { offset: 0, minAngleToShowLabel: 10 }, donut: { size: "65%", background: "transparent", labels: { show: false, name: { show: true, fontSize: "16px", fontFamily: void 0, fontWeight: 600, color: void 0, offsetY: -10, formatter: function(t3) { return t3; } }, value: { show: true, fontSize: "20px", fontFamily: void 0, fontWeight: 400, color: void 0, offsetY: 10, formatter: function(t3) { return t3; } }, total: { show: false, showAlways: false, label: "Total", fontSize: "16px", fontWeight: 400, fontFamily: void 0, color: void 0, formatter: function(t3) { return t3.globals.seriesTotals.reduce((function(t4, e2) { return t4 + e2; }), 0); } } } } }, polarArea: { rings: { strokeWidth: 1, strokeColor: "#e8e8e8" }, spokes: { strokeWidth: 1, connectorColors: "#e8e8e8" } }, radar: { size: void 0, offsetX: 0, offsetY: 0, polygons: { strokeWidth: 1, strokeColors: "#e8e8e8", connectorColors: "#e8e8e8", fill: { colors: void 0 } } } }, colors: void 0, dataLabels: { enabled: true, enabledOnSeries: void 0, formatter: function(t3) { return null !== t3 ? t3 : ""; }, textAnchor: "middle", distributed: false, offsetX: 0, offsetY: 0, style: { fontSize: "12px", fontFamily: void 0, fontWeight: 600, colors: void 0 }, background: { enabled: true, foreColor: "#fff", backgroundColor: void 0, borderRadius: 2, padding: 4, opacity: 0.9, borderWidth: 1, borderColor: "#fff", dropShadow: { enabled: false, top: 1, left: 1, blur: 1, color: "#000", opacity: 0.8 } }, dropShadow: { enabled: false, top: 1, left: 1, blur: 1, color: "#000", opacity: 0.8 } }, fill: { type: "solid", colors: void 0, opacity: 0.85, gradient: { shade: "dark", type: "horizontal", shadeIntensity: 0.5, gradientToColors: void 0, inverseColors: true, opacityFrom: 1, opacityTo: 1, stops: [0, 50, 100], colorStops: [] }, image: { src: [], width: void 0, height: void 0 }, pattern: { style: "squares", width: 6, height: 6, strokeWidth: 2 } }, forecastDataPoints: { count: 0, fillOpacity: 0.5, strokeWidth: void 0, dashArray: 4 }, grid: { show: true, borderColor: "#e0e0e0", strokeDashArray: 0, position: "back", xaxis: { lines: { show: false } }, yaxis: { lines: { show: true } }, row: { colors: void 0, opacity: 0.5 }, column: { colors: void 0, opacity: 0.5 }, padding: { top: 0, right: 10, bottom: 0, left: 12 } }, labels: [], legend: { show: true, showForSingleSeries: false, showForNullSeries: true, showForZeroSeries: true, floating: false, position: "bottom", horizontalAlign: "center", inverseOrder: false, fontSize: "12px", fontFamily: void 0, fontWeight: 400, width: void 0, height: void 0, formatter: void 0, tooltipHoverFormatter: void 0, offsetX: -20, offsetY: 4, customLegendItems: [], clusterGroupedSeries: true, clusterGroupedSeriesOrientation: "vertical", labels: { colors: void 0, useSeriesColors: false }, markers: { size: 7, fillColors: void 0, strokeWidth: 1, shape: void 0, offsetX: 0, offsetY: 0, customHTML: void 0, onClick: void 0 }, itemMargin: { horizontal: 5, vertical: 4 }, onItemClick: { toggleDataSeries: true }, onItemHover: { highlightDataSeries: true } }, markers: { discrete: [], size: 0, colors: void 0, strokeColors: "#fff", strokeWidth: 2, strokeOpacity: 0.9, strokeDashArray: 0, fillOpacity: 1, shape: "circle", offsetX: 0, offsetY: 0, showNullDataPoints: true, onClick: void 0, onDblClick: void 0, hover: { size: void 0, sizeOffset: 3 } }, noData: { text: void 0, align: "center", verticalAlign: "middle", offsetX: 0, offsetY: 0, style: { color: void 0, fontSize: "14px", fontFamily: void 0 } }, responsive: [], series: void 0, states: { hover: { filter: { type: "lighten" } }, active: { allowMultipleDataPointsSelection: false, filter: { type: "darken" } } }, title: { text: void 0, align: "left", margin: 5, offsetX: 0, offsetY: 0, floating: false, style: { fontSize: "14px", fontWeight: 900, fontFamily: void 0, color: void 0 } }, subtitle: { text: void 0, align: "left", margin: 5, offsetX: 0, offsetY: 30, floating: false, style: { fontSize: "12px", fontWeight: 400, fontFamily: void 0, color: void 0 } }, stroke: { show: true, curve: "smooth", lineCap: "butt", width: 2, colors: void 0, dashArray: 0, fill: { type: "solid", colors: void 0, opacity: 0.85, gradient: { shade: "dark", type: "horizontal", shadeIntensity: 0.5, gradientToColors: void 0, inverseColors: true, opacityFrom: 1, opacityTo: 1, stops: [0, 50, 100], colorStops: [] } } }, tooltip: { enabled: true, enabledOnSeries: void 0, shared: true, hideEmptySeries: false, followCursor: false, intersect: false, inverseOrder: false, custom: void 0, fillSeriesColor: false, theme: "light", cssClass: "", style: { fontSize: "12px", fontFamily: void 0 }, onDatasetHover: { highlightDataSeries: false }, x: { show: true, format: "dd MMM", formatter: void 0 }, y: { formatter: void 0, title: { formatter: function(t3) { return t3 ? t3 + ": " : ""; } } }, z: { formatter: void 0, title: "Size: " }, marker: { show: true, fillColors: void 0 }, items: { display: "flex" }, fixed: { enabled: false, position: "topRight", offsetX: 0, offsetY: 0 } }, xaxis: { type: "category", categories: [], convertedCatToNumeric: false, offsetX: 0, offsetY: 0, overwriteCategories: void 0, labels: { show: true, rotate: -45, rotateAlways: false, hideOverlappingLabels: true, trim: false, minHeight: void 0, maxHeight: 120, showDuplicates: true, style: { colors: [], fontSize: "12px", fontWeight: 400, fontFamily: void 0, cssClass: "" }, offsetX: 0, offsetY: 0, format: void 0, formatter: void 0, datetimeUTC: true, datetimeFormatter: { year: "yyyy", month: "MMM 'yy", day: "dd MMM", hour: "HH:mm", minute: "HH:mm:ss", second: "HH:mm:ss" } }, group: { groups: [], style: { colors: [], fontSize: "12px", fontWeight: 400, fontFamily: void 0, cssClass: "" } }, axisBorder: { show: true, color: "#e0e0e0", width: "100%", height: 1, offsetX: 0, offsetY: 0 }, axisTicks: { show: true, color: "#e0e0e0", height: 6, offsetX: 0, offsetY: 0 }, stepSize: void 0, tickAmount: void 0, tickPlacement: "on", min: void 0, max: void 0, range: void 0, floating: false, decimalsInFloat: void 0, position: "bottom", title: { text: void 0, offsetX: 0, offsetY: 0, style: { color: void 0, fontSize: "12px", fontWeight: 900, fontFamily: void 0, cssClass: "" } }, crosshairs: { show: true, width: 1, position: "back", opacity: 0.9, stroke: { color: "#b6b6b6", width: 1, dashArray: 3 }, fill: { type: "solid", color: "#B1B9C4", gradient: { colorFrom: "#D8E3F0", colorTo: "#BED1E6", stops: [0, 100], opacityFrom: 0.4, opacityTo: 0.5 } }, dropShadow: { enabled: false, left: 0, top: 0, blur: 1, opacity: 0.8 } }, tooltip: { enabled: true, offsetY: 0, formatter: void 0, style: { fontSize: "12px", fontFamily: void 0 } } }, yaxis: this.yAxis, theme: { mode: "", palette: "palette1", monochrome: { enabled: false, color: "#008FFB", shadeTo: "light", shadeIntensity: 0.65 } } }; } }]), t2; })(); var Fi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.graphics = new Mi(this.ctx), this.w.globals.isBarHorizontal && (this.invertAxis = true), this.helpers = new Ii(this), this.xAxisAnnotations = new Ti(this), this.yAxisAnnotations = new Ei(this), this.pointsAnnotations = new Yi(this), this.w.globals.isBarHorizontal && this.w.config.yaxis[0].reversed && (this.inversedReversedAxis = true), this.xDivision = this.w.globals.gridWidth / this.w.globals.dataPoints; } return s(t2, [{ key: "drawAxesAnnotations", value: function() { var t3 = this.w; if (t3.globals.axisCharts && t3.globals.dataPoints) { for (var e2 = this.yAxisAnnotations.drawYAxisAnnotations(), i2 = this.xAxisAnnotations.drawXAxisAnnotations(), a2 = this.pointsAnnotations.drawPointAnnotations(), s2 = t3.config.chart.animations.enabled, r2 = [e2, i2, a2], n2 = [i2.node, e2.node, a2.node], o2 = 0; o2 < 3; o2++) t3.globals.dom.elGraphical.add(r2[o2]), !s2 || t3.globals.resized || t3.globals.dataChanged || "scatter" !== t3.config.chart.type && "bubble" !== t3.config.chart.type && t3.globals.dataPoints > 1 && n2[o2].classList.add("apexcharts-element-hidden"), t3.globals.delayedElements.push({ el: n2[o2], index: 0 }); this.helpers.annotationsBackground(); } } }, { key: "drawImageAnnos", value: function() { var t3 = this; this.w.config.annotations.images.map((function(e2, i2) { t3.addImage(e2, i2); })); } }, { key: "drawTextAnnos", value: function() { var t3 = this; this.w.config.annotations.texts.map((function(e2, i2) { t3.addText(e2, i2); })); } }, { key: "addXaxisAnnotation", value: function(t3, e2, i2) { this.xAxisAnnotations.addXaxisAnnotation(t3, e2, i2); } }, { key: "addYaxisAnnotation", value: function(t3, e2, i2) { this.yAxisAnnotations.addYaxisAnnotation(t3, e2, i2); } }, { key: "addPointAnnotation", value: function(t3, e2, i2) { this.pointsAnnotations.addPointAnnotation(t3, e2, i2); } }, { key: "addText", value: function(t3, e2) { var i2 = t3.x, a2 = t3.y, s2 = t3.text, r2 = t3.textAnchor, n2 = t3.foreColor, o2 = t3.fontSize, l2 = t3.fontFamily, h2 = t3.fontWeight, c2 = t3.cssClass, d2 = t3.backgroundColor, u2 = t3.borderWidth, g2 = t3.strokeDashArray, p2 = t3.borderRadius, f2 = t3.borderColor, x2 = t3.appendTo, b2 = void 0 === x2 ? ".apexcharts-svg" : x2, m2 = t3.paddingLeft, v2 = void 0 === m2 ? 4 : m2, y2 = t3.paddingRight, w2 = void 0 === y2 ? 4 : y2, k2 = t3.paddingBottom, A2 = void 0 === k2 ? 2 : k2, C2 = t3.paddingTop, S2 = void 0 === C2 ? 2 : C2, L2 = this.w, M2 = this.graphics.drawText({ x: i2, y: a2, text: s2, textAnchor: r2 || "start", fontSize: o2 || "12px", fontWeight: h2 || "regular", fontFamily: l2 || L2.config.chart.fontFamily, foreColor: n2 || L2.config.chart.foreColor, cssClass: c2 }), P2 = L2.globals.dom.baseEl.querySelector(b2); P2 && P2.appendChild(M2.node); var I2 = M2.bbox(); if (s2) { var T2 = this.graphics.drawRect(I2.x - v2, I2.y - S2, I2.width + v2 + w2, I2.height + A2 + S2, p2, d2 || "transparent", 1, u2, f2, g2); P2.insertBefore(T2.node, M2.node); } } }, { key: "addImage", value: function(t3, e2) { var i2 = this.w, a2 = t3.path, s2 = t3.x, r2 = void 0 === s2 ? 0 : s2, n2 = t3.y, o2 = void 0 === n2 ? 0 : n2, l2 = t3.width, h2 = void 0 === l2 ? 20 : l2, c2 = t3.height, d2 = void 0 === c2 ? 20 : c2, u2 = t3.appendTo, g2 = void 0 === u2 ? ".apexcharts-svg" : u2, p2 = i2.globals.dom.Paper.image(a2); p2.size(h2, d2).move(r2, o2); var f2 = i2.globals.dom.baseEl.querySelector(g2); return f2 && f2.appendChild(p2.node), p2; } }, { key: "addXaxisAnnotationExternal", value: function(t3, e2, i2) { return this.addAnnotationExternal({ params: t3, pushToMemory: e2, context: i2, type: "xaxis", contextMethod: i2.addXaxisAnnotation }), i2; } }, { key: "addYaxisAnnotationExternal", value: function(t3, e2, i2) { return this.addAnnotationExternal({ params: t3, pushToMemory: e2, context: i2, type: "yaxis", contextMethod: i2.addYaxisAnnotation }), i2; } }, { key: "addPointAnnotationExternal", value: function(t3, e2, i2) { return void 0 === this.invertAxis && (this.invertAxis = i2.w.globals.isBarHorizontal), this.addAnnotationExternal({ params: t3, pushToMemory: e2, context: i2, type: "point", contextMethod: i2.addPointAnnotation }), i2; } }, { key: "addAnnotationExternal", value: function(t3) { var e2 = t3.params, i2 = t3.pushToMemory, a2 = t3.context, s2 = t3.type, r2 = t3.contextMethod, n2 = a2, o2 = n2.w, l2 = o2.globals.dom.baseEl.querySelector(".apexcharts-".concat(s2, "-annotations")), h2 = l2.childNodes.length + 1, c2 = new Oi(), d2 = Object.assign({}, "xaxis" === s2 ? c2.xAxisAnnotation : "yaxis" === s2 ? c2.yAxisAnnotation : c2.pointAnnotation), u2 = v.extend(d2, e2); switch (s2) { case "xaxis": this.addXaxisAnnotation(u2, l2, h2); break; case "yaxis": this.addYaxisAnnotation(u2, l2, h2); break; case "point": this.addPointAnnotation(u2, l2, h2); } var g2 = o2.globals.dom.baseEl.querySelector(".apexcharts-".concat(s2, "-annotations .apexcharts-").concat(s2, "-annotation-label[rel='").concat(h2, "']")), p2 = this.helpers.addBackgroundToAnno(g2, u2); return p2 && l2.insertBefore(p2.node, g2), i2 && o2.globals.memory.methodsToExec.push({ context: n2, id: u2.id ? u2.id : v.randomId(), method: r2, label: "addAnnotation", params: e2 }), a2; } }, { key: "clearAnnotations", value: function(t3) { for (var e2 = t3.w, i2 = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis-annotations, .apexcharts-xaxis-annotations, .apexcharts-point-annotations"), a2 = e2.globals.memory.methodsToExec.length - 1; a2 >= 0; a2--) "addText" !== e2.globals.memory.methodsToExec[a2].label && "addAnnotation" !== e2.globals.memory.methodsToExec[a2].label || e2.globals.memory.methodsToExec.splice(a2, 1); i2 = v.listToArray(i2), Array.prototype.forEach.call(i2, (function(t4) { for (; t4.firstChild; ) t4.removeChild(t4.firstChild); })); } }, { key: "removeAnnotation", value: function(t3, e2) { var i2 = t3.w, a2 = i2.globals.dom.baseEl.querySelectorAll(".".concat(e2)); a2 && (i2.globals.memory.methodsToExec.map((function(t4, a3) { t4.id === e2 && i2.globals.memory.methodsToExec.splice(a3, 1); })), Object.keys(i2.config.annotations).forEach((function(t4) { var a3 = i2.config.annotations[t4]; Array.isArray(a3) && (i2.config.annotations[t4] = a3.filter((function(t5) { return t5.id !== e2; }))); })), Array.prototype.forEach.call(a2, (function(t4) { t4.parentElement.removeChild(t4); }))); } }]), t2; })(); var Di = function(t2) { var e2, i2 = t2.isTimeline, a2 = t2.ctx, s2 = t2.seriesIndex, r2 = t2.dataPointIndex, n2 = t2.y1, o2 = t2.y2, l2 = t2.w, h2 = l2.globals.seriesRangeStart[s2][r2], c2 = l2.globals.seriesRangeEnd[s2][r2], d2 = l2.globals.labels[r2], u2 = l2.config.series[s2].name ? l2.config.series[s2].name : "", g2 = l2.globals.ttKeyFormatter, p2 = l2.config.tooltip.y.title.formatter, f2 = { w: l2, seriesIndex: s2, dataPointIndex: r2, start: h2, end: c2 }; ("function" == typeof p2 && (u2 = p2(u2, f2)), null !== (e2 = l2.config.series[s2].data[r2]) && void 0 !== e2 && e2.x && (d2 = l2.config.series[s2].data[r2].x), i2) || "datetime" === l2.config.xaxis.type && (d2 = new Xi(a2).xLabelFormat(l2.globals.ttKeyFormatter, d2, d2, { i: void 0, dateFormatter: new zi(a2).formatDate, w: l2 })); "function" == typeof g2 && (d2 = g2(d2, f2)), Number.isFinite(n2) && Number.isFinite(o2) && (h2 = n2, c2 = o2); var x2 = "", b2 = "", m2 = l2.globals.colors[s2]; if (void 0 === l2.config.tooltip.x.formatter) if ("datetime" === l2.config.xaxis.type) { var v2 = new zi(a2); x2 = v2.formatDate(v2.getDate(h2), l2.config.tooltip.x.format), b2 = v2.formatDate(v2.getDate(c2), l2.config.tooltip.x.format); } else x2 = h2, b2 = c2; else x2 = l2.config.tooltip.x.formatter(h2), b2 = l2.config.tooltip.x.formatter(c2); return { start: h2, end: c2, startVal: x2, endVal: b2, ylabel: d2, color: m2, seriesName: u2 }; }; var _i = function(t2) { var e2 = t2.color, i2 = t2.seriesName, a2 = t2.ylabel, s2 = t2.start, r2 = t2.end, n2 = t2.seriesIndex, o2 = t2.dataPointIndex, l2 = t2.ctx.tooltip.tooltipLabels.getFormatters(n2); s2 = l2.yLbFormatter(s2), r2 = l2.yLbFormatter(r2); var h2 = l2.yLbFormatter(t2.w.globals.series[n2][o2]), c2 = '<span class="value start-value">\n '.concat(s2, '\n </span> <span class="separator">-</span> <span class="value end-value">\n ').concat(r2, "\n </span>"); return '<div class="apexcharts-tooltip-rangebar"><div> <span class="series-name" style="color: ' + e2 + '">' + (i2 || "") + '</span></div><div> <span class="category">' + a2 + ": </span> " + (t2.w.globals.comboCharts ? "rangeArea" === t2.w.config.series[n2].type || "rangeBar" === t2.w.config.series[n2].type ? c2 : "<span>".concat(h2, "</span>") : c2) + " </div></div>"; }; var Ni = (function() { function t2(e2) { i(this, t2), this.opts = e2; } return s(t2, [{ key: "hideYAxis", value: function() { this.opts.yaxis[0].show = false, this.opts.yaxis[0].title.text = "", this.opts.yaxis[0].axisBorder.show = false, this.opts.yaxis[0].axisTicks.show = false, this.opts.yaxis[0].floating = true; } }, { key: "line", value: function() { return { dataLabels: { enabled: false }, stroke: { width: 5, curve: "straight" }, markers: { size: 0, hover: { sizeOffset: 6 } }, xaxis: { crosshairs: { width: 1 } } }; } }, { key: "sparkline", value: function(t3) { this.hideYAxis(); return v.extend(t3, { grid: { show: false, padding: { left: 0, right: 0, top: 0, bottom: 0 } }, legend: { show: false }, xaxis: { labels: { show: false }, tooltip: { enabled: false }, axisBorder: { show: false }, axisTicks: { show: false } }, chart: { toolbar: { show: false }, zoom: { enabled: false } }, dataLabels: { enabled: false } }); } }, { key: "slope", value: function() { return this.hideYAxis(), { chart: { toolbar: { show: false }, zoom: { enabled: false } }, dataLabels: { enabled: true, formatter: function(t3, e2) { var i2 = e2.w.config.series[e2.seriesIndex].name; return null !== t3 ? i2 + ": " + t3 : ""; }, background: { enabled: false }, offsetX: -5 }, grid: { xaxis: { lines: { show: true } }, yaxis: { lines: { show: false } } }, xaxis: { position: "top", labels: { style: { fontSize: 14, fontWeight: 900 } }, tooltip: { enabled: false }, crosshairs: { show: false } }, markers: { size: 8, hover: { sizeOffset: 1 } }, legend: { show: false }, tooltip: { shared: false, intersect: true, followCursor: true }, stroke: { width: 5, curve: "straight" } }; } }, { key: "bar", value: function() { return { chart: { stacked: false }, plotOptions: { bar: { dataLabels: { position: "center" } } }, dataLabels: { style: { colors: ["#fff"] }, background: { enabled: false } }, stroke: { width: 0, lineCap: "square" }, fill: { opacity: 0.85 }, legend: { markers: { shape: "square" } }, tooltip: { shared: false, intersect: true }, xaxis: { tooltip: { enabled: false }, tickPlacement: "between", crosshairs: { width: "barWidth", position: "back", fill: { type: "gradient" }, dropShadow: { enabled: false }, stroke: { width: 0 } } } }; } }, { key: "funnel", value: function() { return this.hideYAxis(), u(u({}, this.bar()), {}, { chart: { animations: { speed: 800, animateGradually: { enabled: false } } }, plotOptions: { bar: { horizontal: true, borderRadiusApplication: "around", borderRadius: 0, dataLabels: { position: "center" } } }, grid: { show: false, padding: { left: 0, right: 0 } }, xaxis: { labels: { show: false }, tooltip: { enabled: false }, axisBorder: { show: false }, axisTicks: { show: false } } }); } }, { key: "candlestick", value: function() { var t3 = this; return { stroke: { width: 1 }, fill: { opacity: 1 }, dataLabels: { enabled: false }, tooltip: { shared: true, custom: function(e2) { var i2 = e2.seriesIndex, a2 = e2.dataPointIndex, s2 = e2.w; return t3._getBoxTooltip(s2, i2, a2, ["Open", "High", "", "Low", "Close"], "candlestick"); } }, states: { active: { filter: { type: "none" } } }, xaxis: { crosshairs: { width: 1 } } }; } }, { key: "boxPlot", value: function() { var t3 = this; return { chart: { animations: { dynamicAnimation: { enabled: false } } }, stroke: { width: 1, colors: ["#24292e"] }, dataLabels: { enabled: false }, tooltip: { shared: true, custom: function(e2) { var i2 = e2.seriesIndex, a2 = e2.dataPointIndex, s2 = e2.w; return t3._getBoxTooltip(s2, i2, a2, ["Minimum", "Q1", "Median", "Q3", "Maximum"], "boxPlot"); } }, markers: { size: 7, strokeWidth: 1, strokeColors: "#111" }, xaxis: { crosshairs: { width: 1 } } }; } }, { key: "rangeBar", value: function() { return { chart: { animations: { animateGradually: false } }, stroke: { width: 0, lineCap: "square" }, plotOptions: { bar: { borderRadius: 0, dataLabels: { position: "center" } } }, dataLabels: { enabled: false, formatter: function(t3, e2) { e2.ctx; var i2 = e2.seriesIndex, a2 = e2.dataPointIndex, s2 = e2.w, r2 = function() { var t4 = s2.globals.seriesRangeStart[i2][a2]; return s2.globals.seriesRangeEnd[i2][a2] - t4; }; return s2.globals.comboCharts ? "rangeBar" === s2.config.series[i2].type || "rangeArea" === s2.config.series[i2].type ? r2() : t3 : r2(); }, background: { enabled: false }, style: { colors: ["#fff"] } }, markers: { size: 10 }, tooltip: { shared: false, followCursor: true, custom: function(t3) { return t3.w.config.plotOptions && t3.w.config.plotOptions.bar && t3.w.config.plotOptions.bar.horizontal ? (function(t4) { var e2 = Di(u(u({}, t4), {}, { isTimeline: true })), i2 = e2.color, a2 = e2.seriesName, s2 = e2.ylabel, r2 = e2.startVal, n2 = e2.endVal; return _i(u(u({}, t4), {}, { color: i2, seriesName: a2, ylabel: s2, start: r2, end: n2 })); })(t3) : (function(t4) { var e2 = Di(t4), i2 = e2.color, a2 = e2.seriesName, s2 = e2.ylabel, r2 = e2.start, n2 = e2.end; return _i(u(u({}, t4), {}, { color: i2, seriesName: a2, ylabel: s2, start: r2, end: n2 })); })(t3); } }, xaxis: { tickPlacement: "between", tooltip: { enabled: false }, crosshairs: { stroke: { width: 0 } } } }; } }, { key: "dumbbell", value: function(t3) { var e2, i2; return null !== (e2 = t3.plotOptions.bar) && void 0 !== e2 && e2.barHeight || (t3.plotOptions.bar.barHeight = 2), null !== (i2 = t3.plotOptions.bar) && void 0 !== i2 && i2.columnWidth || (t3.plotOptions.bar.columnWidth = 2), t3; } }, { key: "area", value: function() { return { stroke: { width: 4, fill: { type: "solid", gradient: { inverseColors: false, shade: "light", type: "vertical", opacityFrom: 0.65, opacityTo: 0.5, stops: [0, 100, 100] } } }, fill: { type: "gradient", gradient: { inverseColors: false, shade: "light", type: "vertical", opacityFrom: 0.65, opacityTo: 0.5, stops: [0, 100, 100] } }, markers: { size: 0, hover: { sizeOffset: 6 } }, tooltip: { followCursor: false } }; } }, { key: "rangeArea", value: function() { return { stroke: { curve: "straight", width: 0 }, fill: { type: "solid", opacity: 0.6 }, markers: { size: 0 }, states: { hover: { filter: { type: "none" } }, active: { filter: { type: "none" } } }, tooltip: { intersect: false, shared: true, followCursor: true, custom: function(t3) { return (function(t4) { var e2 = Di(t4), i2 = e2.color, a2 = e2.seriesName, s2 = e2.ylabel, r2 = e2.start, n2 = e2.end; return _i(u(u({}, t4), {}, { color: i2, seriesName: a2, ylabel: s2, start: r2, end: n2 })); })(t3); } } }; } }, { key: "brush", value: function(t3) { return v.extend(t3, { chart: { toolbar: { autoSelected: "selection", show: false }, zoom: { enabled: false } }, dataLabels: { enabled: false }, stroke: { width: 1 }, tooltip: { enabled: false }, xaxis: { tooltip: { enabled: false } } }); } }, { key: "stacked100", value: function(t3) { t3.dataLabels = t3.dataLabels || {}, t3.dataLabels.formatter = t3.dataLabels.formatter || void 0; var e2 = t3.dataLabels.formatter; return t3.yaxis.forEach((function(e3, i2) { t3.yaxis[i2].min = 0, t3.yaxis[i2].max = 100; })), "bar" === t3.chart.type && (t3.dataLabels.formatter = e2 || function(t4) { return "number" == typeof t4 && t4 ? t4.toFixed(0) + "%" : t4; }), t3; } }, { key: "stackedBars", value: function() { var t3 = this.bar(); return u(u({}, t3), {}, { plotOptions: u(u({}, t3.plotOptions), {}, { bar: u(u({}, t3.plotOptions.bar), {}, { borderRadiusApplication: "end", borderRadiusWhenStacked: "last" }) }) }); } }, { key: "convertCatToNumeric", value: function(t3) { return t3.xaxis.convertedCatToNumeric = true, t3; } }, { key: "convertCatToNumericXaxis", value: function(t3, e2, i2) { t3.xaxis.type = "numeric", t3.xaxis.labels = t3.xaxis.labels || {}, t3.xaxis.labels.formatter = t3.xaxis.labels.formatter || function(t4) { return v.isNumber(t4) ? Math.floor(t4) : t4; }; var a2 = t3.xaxis.labels.formatter, s2 = t3.xaxis.categories && t3.xaxis.categories.length ? t3.xaxis.categories : t3.labels; return i2 && i2.length && (s2 = i2.map((function(t4) { return Array.isArray(t4) ? t4 : String(t4); }))), s2 && s2.length && (t3.xaxis.labels.formatter = function(t4) { return v.isNumber(t4) ? a2(s2[Math.floor(t4) - 1]) : a2(t4); }), t3.xaxis.categories = [], t3.labels = [], t3.xaxis.tickAmount = t3.xaxis.tickAmount || "dataPoints", t3; } }, { key: "bubble", value: function() { return { dataLabels: { style: { colors: ["#fff"] } }, tooltip: { shared: false, intersect: true }, xaxis: { crosshairs: { width: 0 } }, fill: { type: "solid", gradient: { shade: "light", inverse: true, shadeIntensity: 0.55, opacityFrom: 0.4, opacityTo: 0.8 } } }; } }, { key: "scatter", value: function() { return { dataLabels: { enabled: false }, tooltip: { shared: false, intersect: true }, markers: { size: 6, strokeWidth: 1, hover: { sizeOffset: 2 } } }; } }, { key: "heatmap", value: function() { return { chart: { stacked: false }, fill: { opacity: 1 }, dataLabels: { style: { colors: ["#fff"] } }, stroke: { colors: ["#fff"] }, tooltip: { followCursor: true, marker: { show: false }, x: { show: false } }, legend: { position: "top", markers: { shape: "square" } }, grid: { padding: { right: 20 } } }; } }, { key: "treemap", value: function() { return { chart: { zoom: { enabled: false } }, dataLabels: { style: { fontSize: 14, fontWeight: 600, colors: ["#fff"] } }, stroke: { show: true, width: 2, colors: ["#fff"] }, legend: { show: false }, fill: { opacity: 1, gradient: { stops: [0, 100] } }, tooltip: { followCursor: true, x: { show: false } }, grid: { padding: { left: 0, right: 0 } }, xaxis: { crosshairs: { show: false }, tooltip: { enabled: false } } }; } }, { key: "pie", value: function() { return { chart: { toolbar: { show: false } }, plotOptions: { pie: { donut: { labels: { show: false } } } }, dataLabels: { formatter: function(t3) { return t3.toFixed(1) + "%"; }, style: { colors: ["#fff"] }, background: { enabled: false }, dropShadow: { enabled: true } }, stroke: { colors: ["#fff"] }, fill: { opacity: 1, gradient: { shade: "light", stops: [0, 100] } }, tooltip: { theme: "dark", fillSeriesColor: true }, legend: { position: "right" }, grid: { padding: { left: 0, right: 0, top: 0, bottom: 0 } } }; } }, { key: "donut", value: function() { return { chart: { toolbar: { show: false } }, dataLabels: { formatter: function(t3) { return t3.toFixed(1) + "%"; }, style: { colors: ["#fff"] }, background: { enabled: false }, dropShadow: { enabled: true } }, stroke: { colors: ["#fff"] }, fill: { opacity: 1, gradient: { shade: "light", shadeIntensity: 0.35, stops: [80, 100], opacityFrom: 1, opacityTo: 1 } }, tooltip: { theme: "dark", fillSeriesColor: true }, legend: { position: "right" }, grid: { padding: { left: 0, right: 0, top: 0, bottom: 0 } } }; } }, { key: "polarArea", value: function() { return { chart: { toolbar: { show: false } }, dataLabels: { formatter: function(t3) { return t3.toFixed(1) + "%"; }, enabled: false }, stroke: { show: true, width: 2 }, fill: { opacity: 0.7 }, tooltip: { theme: "dark", fillSeriesColor: true }, legend: { position: "right" }, grid: { padding: { left: 0, right: 0, top: 0, bottom: 0 } } }; } }, { key: "radar", value: function() { return this.opts.yaxis[0].labels.offsetY = this.opts.yaxis[0].labels.offsetY ? this.opts.yaxis[0].labels.offsetY : 6, { dataLabels: { enabled: false, style: { fontSize: "11px" } }, stroke: { width: 2 }, markers: { size: 5, strokeWidth: 1, strokeOpacity: 1 }, fill: { opacity: 0.2 }, tooltip: { shared: false, intersect: true, followCursor: true }, grid: { show: false, padding: { left: 0, right: 0, top: 0, bottom: 0 } }, xaxis: { labels: { formatter: function(t3) { return t3; }, style: { colors: ["#a8a8a8"], fontSize: "11px" } }, tooltip: { enabled: false }, crosshairs: { show: false } } }; } }, { key: "radialBar", value: function() { return { chart: { animations: { dynamicAnimation: { enabled: true, speed: 800 } }, toolbar: { show: false } }, fill: { gradient: { shade: "dark", shadeIntensity: 0.4, inverseColors: false, type: "diagonal2", opacityFrom: 1, opacityTo: 1, stops: [70, 98, 100] } }, legend: { show: false, position: "right" }, tooltip: { enabled: false, fillSeriesColor: true }, grid: { padding: { left: 0, right: 0, top: 0, bottom: 0 } } }; } }, { key: "_getBoxTooltip", value: function(t3, e2, i2, a2, s2) { var r2 = t3.globals.seriesCandleO[e2][i2], n2 = t3.globals.seriesCandleH[e2][i2], o2 = t3.globals.seriesCandleM[e2][i2], l2 = t3.globals.seriesCandleL[e2][i2], h2 = t3.globals.seriesCandleC[e2][i2]; return t3.config.series[e2].type && t3.config.series[e2].type !== s2 ? '<div class="apexcharts-custom-tooltip">\n '.concat(t3.config.series[e2].name ? t3.config.series[e2].name : "series-" + (e2 + 1), ": <strong>").concat(t3.globals.series[e2][i2], "</strong>\n </div>") : '<div class="apexcharts-tooltip-box apexcharts-tooltip-'.concat(t3.config.chart.type, '">') + "<div>".concat(a2[0], ': <span class="value">') + r2 + "</span></div>" + "<div>".concat(a2[1], ': <span class="value">') + n2 + "</span></div>" + (o2 ? "<div>".concat(a2[2], ': <span class="value">') + o2 + "</span></div>" : "") + "<div>".concat(a2[3], ': <span class="value">') + l2 + "</span></div>" + "<div>".concat(a2[4], ': <span class="value">') + h2 + "</span></div></div>"; } }]), t2; })(); var Wi = (function() { function t2(e2) { i(this, t2), this.opts = e2; } return s(t2, [{ key: "init", value: function(t3) { var e2 = t3.responsiveOverride, i2 = this.opts, a2 = new Oi(), s2 = new Ni(i2); this.chartType = i2.chart.type, i2 = this.extendYAxis(i2), i2 = this.extendAnnotations(i2); var r2 = a2.init(), n2 = {}; if (i2 && "object" === b(i2)) { var o2, l2, h2, c2, d2, u2, g2, p2, f2, x2, m2 = {}; m2 = -1 !== ["line", "area", "bar", "candlestick", "boxPlot", "rangeBar", "rangeArea", "bubble", "scatter", "heatmap", "treemap", "pie", "polarArea", "donut", "radar", "radialBar"].indexOf(i2.chart.type) ? s2[i2.chart.type]() : s2.line(), null !== (o2 = i2.plotOptions) && void 0 !== o2 && null !== (l2 = o2.bar) && void 0 !== l2 && l2.isFunnel && (m2 = s2.funnel()), i2.chart.stacked && "bar" === i2.chart.type && (m2 = s2.stackedBars()), null !== (h2 = i2.chart.brush) && void 0 !== h2 && h2.enabled && (m2 = s2.brush(m2)), null !== (c2 = i2.plotOptions) && void 0 !== c2 && null !== (d2 = c2.line) && void 0 !== d2 && d2.isSlopeChart && (m2 = s2.slope()), i2.chart.stacked && "100%" === i2.chart.stackType && (i2 = s2.stacked100(i2)), null !== (u2 = i2.plotOptions) && void 0 !== u2 && null !== (g2 = u2.bar) && void 0 !== g2 && g2.isDumbbell && (i2 = s2.dumbbell(i2)), this.checkForDarkTheme(window.Apex), this.checkForDarkTheme(i2), i2.xaxis = i2.xaxis || window.Apex.xaxis || {}, e2 || (i2.xaxis.convertedCatToNumeric = false), (null !== (p2 = (i2 = this.checkForCatToNumericXAxis(this.chartType, m2, i2)).chart.sparkline) && void 0 !== p2 && p2.enabled || null !== (f2 = window.Apex.chart) && void 0 !== f2 && null !== (x2 = f2.sparkline) && void 0 !== x2 && x2.enabled) && (m2 = s2.sparkline(m2)), n2 = v.extend(r2, m2); } var y2 = v.extend(n2, window.Apex); return r2 = v.extend(y2, i2), r2 = this.handleUserInputErrors(r2); } }, { key: "checkForCatToNumericXAxis", value: function(t3, e2, i2) { var a2, s2, r2 = new Ni(i2), n2 = ("bar" === t3 || "boxPlot" === t3) && (null === (a2 = i2.plotOptions) || void 0 === a2 || null === (s2 = a2.bar) || void 0 === s2 ? void 0 : s2.horizontal), o2 = "pie" === t3 || "polarArea" === t3 || "donut" === t3 || "radar" === t3 || "radialBar" === t3 || "heatmap" === t3, l2 = "datetime" !== i2.xaxis.type && "numeric" !== i2.xaxis.type, h2 = i2.xaxis.tickPlacement ? i2.xaxis.tickPlacement : e2.xaxis && e2.xaxis.tickPlacement; return n2 || o2 || !l2 || "between" === h2 || (i2 = r2.convertCatToNumeric(i2)), i2; } }, { key: "extendYAxis", value: function(t3, e2) { var i2 = new Oi(); (void 0 === t3.yaxis || !t3.yaxis || Array.isArray(t3.yaxis) && 0 === t3.yaxis.length) && (t3.yaxis = {}), t3.yaxis.constructor !== Array && window.Apex.yaxis && window.Apex.yaxis.constructor !== Array && (t3.yaxis = v.extend(t3.yaxis, window.Apex.yaxis)), t3.yaxis.constructor !== Array ? t3.yaxis = [v.extend(i2.yAxis, t3.yaxis)] : t3.yaxis = v.extendArray(t3.yaxis, i2.yAxis); var a2 = false; t3.yaxis.forEach((function(t4) { t4.logarithmic && (a2 = true); })); var s2 = t3.series; return e2 && !s2 && (s2 = e2.config.series), a2 && s2.length !== t3.yaxis.length && s2.length && (t3.yaxis = s2.map((function(e3, a3) { if (e3.name || (s2[a3].name = "series-".concat(a3 + 1)), t3.yaxis[a3]) return t3.yaxis[a3].seriesName = s2[a3].name, t3.yaxis[a3]; var r2 = v.extend(i2.yAxis, t3.yaxis[0]); return r2.show = false, r2; }))), a2 && s2.length > 1 && s2.length !== t3.yaxis.length && console.warn("A multi-series logarithmic chart should have equal number of series and y-axes"), t3; } }, { key: "extendAnnotations", value: function(t3) { return void 0 === t3.annotations && (t3.annotations = {}, t3.annotations.yaxis = [], t3.annotations.xaxis = [], t3.annotations.points = []), t3 = this.extendYAxisAnnotations(t3), t3 = this.extendXAxisAnnotations(t3), t3 = this.extendPointAnnotations(t3); } }, { key: "extendYAxisAnnotations", value: function(t3) { var e2 = new Oi(); return t3.annotations.yaxis = v.extendArray(void 0 !== t3.annotations.yaxis ? t3.annotations.yaxis : [], e2.yAxisAnnotation), t3; } }, { key: "extendXAxisAnnotations", value: function(t3) { var e2 = new Oi(); return t3.annotations.xaxis = v.extendArray(void 0 !== t3.annotations.xaxis ? t3.annotations.xaxis : [], e2.xAxisAnnotation), t3; } }, { key: "extendPointAnnotations", value: function(t3) { var e2 = new Oi(); return t3.annotations.points = v.extendArray(void 0 !== t3.annotations.points ? t3.annotations.points : [], e2.pointAnnotation), t3; } }, { key: "checkForDarkTheme", value: function(t3) { t3.theme && "dark" === t3.theme.mode && (t3.tooltip || (t3.tooltip = {}), "light" !== t3.tooltip.theme && (t3.tooltip.theme = "dark"), t3.chart.foreColor || (t3.chart.foreColor = "#f6f7f8"), t3.theme.palette || (t3.theme.palette = "palette4")); } }, { key: "handleUserInputErrors", value: function(t3) { var e2 = t3; if (e2.tooltip.shared && e2.tooltip.intersect) throw new Error("tooltip.shared cannot be enabled when tooltip.intersect is true. Turn off any other option by setting it to false."); if ("bar" === e2.chart.type && e2.plotOptions.bar.horizontal) { if (e2.yaxis.length > 1) throw new Error("Multiple Y Axis for bars are not supported. Switch to column chart by setting plotOptions.bar.horizontal=false"); e2.yaxis[0].reversed && (e2.yaxis[0].opposite = true), e2.xaxis.tooltip.enabled = false, e2.yaxis[0].tooltip.enabled = false, e2.chart.zoom.enabled = false; } return "bar" !== e2.chart.type && "rangeBar" !== e2.chart.type || e2.tooltip.shared && "barWidth" === e2.xaxis.crosshairs.width && e2.series.length > 1 && (e2.xaxis.crosshairs.width = "tickWidth"), "candlestick" !== e2.chart.type && "boxPlot" !== e2.chart.type || e2.yaxis[0].reversed && (console.warn("Reversed y-axis in ".concat(e2.chart.type, " chart is not supported.")), e2.yaxis[0].reversed = false), e2; } }]), t2; })(); var Bi = (function() { function t2() { i(this, t2); } return s(t2, [{ key: "initGlobalVars", value: function(t3) { t3.series = [], t3.seriesCandleO = [], t3.seriesCandleH = [], t3.seriesCandleM = [], t3.seriesCandleL = [], t3.seriesCandleC = [], t3.seriesRangeStart = [], t3.seriesRangeEnd = [], t3.seriesRange = [], t3.seriesPercent = [], t3.seriesGoals = [], t3.seriesX = [], t3.seriesZ = [], t3.seriesNames = [], t3.seriesTotals = [], t3.seriesLog = [], t3.seriesColors = [], t3.stackedSeriesTotals = [], t3.seriesXvalues = [], t3.seriesYvalues = [], t3.dataWasParsed = false, t3.originalSeries = null, t3.labels = [], t3.hasXaxisGroups = false, t3.groups = [], t3.barGroups = [], t3.lineGroups = [], t3.areaGroups = [], t3.hasSeriesGroups = false, t3.seriesGroups = [], t3.categoryLabels = [], t3.timescaleLabels = [], t3.noLabelsProvided = false, t3.resizeTimer = null, t3.selectionResizeTimer = null, t3.lastWheelExecution = 0, t3.delayedElements = [], t3.pointsArray = [], t3.dataLabelsRects = [], t3.isXNumeric = false, t3.skipLastTimelinelabel = false, t3.skipFirstTimelinelabel = false, t3.isDataXYZ = false, t3.isMultiLineX = false, t3.isMultipleYAxis = false, t3.maxY = -Number.MAX_VALUE, t3.minY = Number.MIN_VALUE, t3.minYArr = [], t3.maxYArr = [], t3.maxX = -Number.MAX_VALUE, t3.minX = Number.MAX_VALUE, t3.initialMaxX = -Number.MAX_VALUE, t3.initialMinX = Number.MAX_VALUE, t3.maxDate = 0, t3.minDate = Number.MAX_VALUE, t3.minZ = Number.MAX_VALUE, t3.maxZ = -Number.MAX_VALUE, t3.minXDiff = Number.MAX_VALUE, t3.yAxisScale = [], t3.xAxisScale = null, t3.xAxisTicksPositions = [], t3.yLabelsCoords = [], t3.yTitleCoords = [], t3.barPadForNumericAxis = 0, t3.padHorizontal = 0, t3.xRange = 0, t3.yRange = [], t3.zRange = 0, t3.dataPoints = 0, t3.xTickAmount = 0, t3.multiAxisTickAmount = 0; } }, { key: "globalVars", value: function(t3) { return { chartID: null, cuid: null, events: { beforeMount: [], mounted: [], updated: [], clicked: [], selection: [], dataPointSelection: [], zoomed: [], scrolled: [] }, colors: [], clientX: null, clientY: null, fill: { colors: [] }, stroke: { colors: [] }, dataLabels: { style: { colors: [] } }, radarPolygons: { fill: { colors: [] } }, markers: { colors: [], size: t3.markers.size, largestSize: 0 }, animationEnded: false, isTouchDevice: "ontouchstart" in window || navigator.msMaxTouchPoints, isDirty: false, isExecCalled: false, initialConfig: null, initialSeries: [], lastXAxis: [], lastYAxis: [], columnSeries: null, labels: [], timescaleLabels: [], noLabelsProvided: false, allSeriesCollapsed: false, collapsedSeries: [], collapsedSeriesIndices: [], ancillaryCollapsedSeries: [], ancillaryCollapsedSeriesIndices: [], risingSeries: [], dataFormatXNumeric: false, capturedSeriesIndex: -1, capturedDataPointIndex: -1, selectedDataPoints: [], invalidLogScale: false, ignoreYAxisIndexes: [], maxValsInArrayIndex: 0, radialSize: 0, selection: void 0, zoomEnabled: "zoom" === t3.chart.toolbar.autoSelected && t3.chart.toolbar.tools.zoom && t3.chart.zoom.enabled, panEnabled: "pan" === t3.chart.toolbar.autoSelected && t3.chart.toolbar.tools.pan, selectionEnabled: "selection" === t3.chart.toolbar.autoSelected && t3.chart.toolbar.tools.selection, yaxis: null, mousedown: false, lastClientPosition: {}, visibleXRange: void 0, yValueDecimal: 0, total: 0, SVGNS: "http://www.w3.org/2000/svg", svgWidth: 0, svgHeight: 0, noData: false, locale: {}, dom: {}, memory: { methodsToExec: [] }, shouldAnimate: true, skipLastTimelinelabel: false, skipFirstTimelinelabel: false, delayedElements: [], axisCharts: true, isDataXYZ: false, isSlopeChart: t3.plotOptions.line.isSlopeChart, resized: false, resizeTimer: null, comboCharts: false, dataChanged: false, previousPaths: [], allSeriesHasEqualX: true, pointsArray: [], dataLabelsRects: [], lastDrawnDataLabelsIndexes: [], hasNullValues: false, zoomed: false, gridWidth: 0, gridHeight: 0, rotateXLabels: false, defaultLabels: false, xLabelFormatter: void 0, yLabelFormatters: [], xaxisTooltipFormatter: void 0, ttKeyFormatter: void 0, ttVal: void 0, ttZFormatter: void 0, LINE_HEIGHT_RATIO: 1.618, xAxisLabelsHeight: 0, xAxisGroupLabelsHeight: 0, xAxisLabelsWidth: 0, yAxisLabelsWidth: 0, scaleX: 1, scaleY: 1, translateX: 0, translateY: 0, translateYAxisX: [], yAxisWidths: [], translateXAxisY: 0, translateXAxisX: 0, tooltip: null, niceScaleAllowedMagMsd: [[1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10], [1, 1, 2, 5, 5, 5, 10, 10, 10, 10, 10]], niceScaleDefaultTicks: [1, 2, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 24], seriesYAxisMap: [], seriesYAxisReverseMap: [] }; } }, { key: "init", value: function(t3) { var e2 = this.globalVars(t3); return this.initGlobalVars(e2), e2.initialConfig = v.extend({}, t3), e2.initialSeries = v.clone(t3.series), e2.lastXAxis = v.clone(e2.initialConfig.xaxis), e2.lastYAxis = v.clone(e2.initialConfig.yaxis), e2; } }]), t2; })(); var Gi = (function() { function t2(e2) { i(this, t2), this.opts = e2; } return s(t2, [{ key: "init", value: function() { var t3 = new Wi(this.opts).init({ responsiveOverride: false }); return { config: t3, globals: new Bi().init(t3) }; } }]), t2; })(); var ji = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.opts = null, this.seriesIndex = 0, this.patternIDs = []; } return s(t2, [{ key: "clippedImgArea", value: function(t3) { var e2 = this.w, i2 = e2.config, a2 = parseInt(e2.globals.gridWidth, 10), s2 = parseInt(e2.globals.gridHeight, 10), r2 = a2 > s2 ? a2 : s2, n2 = t3.image, o2 = 0, l2 = 0; void 0 === t3.width && void 0 === t3.height ? void 0 !== i2.fill.image.width && void 0 !== i2.fill.image.height ? (o2 = i2.fill.image.width + 1, l2 = i2.fill.image.height) : (o2 = r2 + 1, l2 = r2) : (o2 = t3.width, l2 = t3.height); var h2 = document.createElementNS(e2.globals.SVGNS, "pattern"); Mi.setAttrs(h2, { id: t3.patternID, patternUnits: t3.patternUnits ? t3.patternUnits : "userSpaceOnUse", width: o2 + "px", height: l2 + "px" }); var c2 = document.createElementNS(e2.globals.SVGNS, "image"); h2.appendChild(c2), c2.setAttributeNS(window.SVG.xlink, "href", n2), Mi.setAttrs(c2, { x: 0, y: 0, preserveAspectRatio: "none", width: o2 + "px", height: l2 + "px" }), c2.style.opacity = t3.opacity, e2.globals.dom.elDefs.node.appendChild(h2); } }, { key: "getSeriesIndex", value: function(t3) { var e2 = this.w, i2 = e2.config.chart.type; return ("bar" === i2 || "rangeBar" === i2) && e2.config.plotOptions.bar.distributed || "heatmap" === i2 || "treemap" === i2 ? this.seriesIndex = t3.seriesNumber : this.seriesIndex = t3.seriesNumber % e2.globals.series.length, this.seriesIndex; } }, { key: "computeColorStops", value: function(t3, e2) { var i2, a2 = this.w, s2 = null, n2 = null, o2 = r(t3); try { for (o2.s(); !(i2 = o2.n()).done; ) { var l2 = i2.value; l2 >= e2.threshold ? (null === s2 || l2 > s2) && (s2 = l2) : (null === n2 || l2 < n2) && (n2 = l2); } } catch (t4) { o2.e(t4); } finally { o2.f(); } null === s2 && (s2 = e2.threshold), null === n2 && (n2 = e2.threshold); var h2 = s2 - e2.threshold + (e2.threshold - n2); 0 === h2 && (h2 = 1); var c2 = 100 - (e2.threshold - n2) / h2 * 100; return [{ offset: c2 = Math.max(0, Math.min(c2, 100)), color: e2.colorAboveThreshold, opacity: a2.config.fill.opacity }, { offset: 0, color: e2.colorBelowThreshold, opacity: a2.config.fill.opacity }]; } }, { key: "fillPath", value: function(t3) { var e2, i2, a2, s2 = this.w; this.opts = t3; var r2, n2, o2, l2 = this.w.config; this.seriesIndex = this.getSeriesIndex(t3); var h2 = l2.plotOptions.line.colors.colorAboveThreshold && l2.plotOptions.line.colors.colorBelowThreshold, c2 = this.getFillColors()[this.seriesIndex]; void 0 !== s2.globals.seriesColors[this.seriesIndex] && (c2 = s2.globals.seriesColors[this.seriesIndex]), "function" == typeof c2 && (c2 = c2({ seriesIndex: this.seriesIndex, dataPointIndex: t3.dataPointIndex, value: t3.value, w: s2 })); var d2, u2, g2, p2 = t3.fillType ? t3.fillType : this.getFillType(this.seriesIndex), x2 = Array.isArray(l2.fill.opacity) ? l2.fill.opacity[this.seriesIndex] : l2.fill.opacity, b2 = "gradient" === p2 || h2; (t3.color && (c2 = t3.color), null !== (e2 = s2.config.series[this.seriesIndex]) && void 0 !== e2 && null !== (i2 = e2.data) && void 0 !== i2 && null !== (a2 = i2[t3.dataPointIndex]) && void 0 !== a2 && a2.fillColor) && (c2 = null === (d2 = s2.config.series[this.seriesIndex]) || void 0 === d2 || null === (u2 = d2.data) || void 0 === u2 || null === (g2 = u2[t3.dataPointIndex]) || void 0 === g2 ? void 0 : g2.fillColor); c2 || (c2 = "#fff", console.warn("undefined color - ApexCharts")); var m2 = c2; if (-1 === c2.indexOf("rgb") ? -1 === c2.indexOf("#") ? m2 = c2 : c2.length < 9 && (m2 = v.hexToRgba(c2, x2)) : c2.indexOf("rgba") > -1 ? x2 = v.getOpacityFromRGBA(c2) : m2 = v.hexToRgba(v.rgb2hex(c2), x2), t3.opacity && (x2 = t3.opacity), "pattern" === p2 && (n2 = this.handlePatternFill({ fillConfig: t3.fillConfig, patternFill: n2, fillColor: c2, fillOpacity: x2, defaultColor: m2 })), b2) { var y2 = f(l2.fill.gradient.colorStops) || [], w2 = l2.fill.gradient.type; h2 && (y2[this.seriesIndex] = this.computeColorStops(s2.globals.series[this.seriesIndex], l2.plotOptions.line.colors), w2 = "vertical"), o2 = this.handleGradientFill({ type: w2, fillConfig: t3.fillConfig, fillColor: c2, fillOpacity: x2, colorStops: y2, i: this.seriesIndex }); } if ("image" === p2) { var k2 = l2.fill.image.src, A2 = t3.patternID ? t3.patternID : "", C2 = "pattern".concat(s2.globals.cuid).concat(t3.seriesNumber + 1).concat(A2); -1 === this.patternIDs.indexOf(C2) && (this.clippedImgArea({ opacity: x2, image: Array.isArray(k2) ? t3.seriesNumber < k2.length ? k2[t3.seriesNumber] : k2[0] : k2, width: t3.width ? t3.width : void 0, height: t3.height ? t3.height : void 0, patternUnits: t3.patternUnits, patternID: C2 }), this.patternIDs.push(C2)), r2 = "url(#".concat(C2, ")"); } else r2 = b2 ? o2 : "pattern" === p2 ? n2 : m2; return t3.solid && (r2 = m2), r2; } }, { key: "getFillType", value: function(t3) { var e2 = this.w; return Array.isArray(e2.config.fill.type) ? e2.config.fill.type[t3] : e2.config.fill.type; } }, { key: "getFillColors", value: function() { var t3 = this.w, e2 = t3.config, i2 = this.opts, a2 = []; return t3.globals.comboCharts ? "line" === t3.config.series[this.seriesIndex].type ? Array.isArray(t3.globals.stroke.colors) ? a2 = t3.globals.stroke.colors : a2.push(t3.globals.stroke.colors) : Array.isArray(t3.globals.fill.colors) ? a2 = t3.globals.fill.colors : a2.push(t3.globals.fill.colors) : "line" === e2.chart.type ? Array.isArray(t3.globals.stroke.colors) ? a2 = t3.globals.stroke.colors : a2.push(t3.globals.stroke.colors) : Array.isArray(t3.globals.fill.colors) ? a2 = t3.globals.fill.colors : a2.push(t3.globals.fill.colors), void 0 !== i2.fillColors && (a2 = [], Array.isArray(i2.fillColors) ? a2 = i2.fillColors.slice() : a2.push(i2.fillColors)), a2; } }, { key: "handlePatternFill", value: function(t3) { var e2 = t3.fillConfig, i2 = t3.patternFill, a2 = t3.fillColor, s2 = t3.fillOpacity, r2 = t3.defaultColor, n2 = this.w.config.fill; e2 && (n2 = e2); var o2 = this.opts, l2 = new Mi(this.ctx), h2 = Array.isArray(n2.pattern.strokeWidth) ? n2.pattern.strokeWidth[this.seriesIndex] : n2.pattern.strokeWidth, c2 = a2; Array.isArray(n2.pattern.style) ? i2 = void 0 !== n2.pattern.style[o2.seriesNumber] ? l2.drawPattern(n2.pattern.style[o2.seriesNumber], n2.pattern.width, n2.pattern.height, c2, h2, s2) : r2 : i2 = l2.drawPattern(n2.pattern.style, n2.pattern.width, n2.pattern.height, c2, h2, s2); return i2; } }, { key: "handleGradientFill", value: function(t3) { var e2 = t3.type, i2 = t3.fillColor, a2 = t3.fillOpacity, s2 = t3.fillConfig, r2 = t3.colorStops, n2 = t3.i, o2 = this.w.config.fill; s2 && (o2 = u(u({}, o2), s2)); var l2 = this.opts, h2 = new Mi(this.ctx), c2 = new v(); e2 = e2 || o2.gradient.type; var d2, g2 = i2, p2 = void 0 === o2.gradient.opacityFrom ? a2 : Array.isArray(o2.gradient.opacityFrom) ? o2.gradient.opacityFrom[n2] : o2.gradient.opacityFrom; g2.indexOf("rgba") > -1 && (p2 = v.getOpacityFromRGBA(g2)); var f2 = void 0 === o2.gradient.opacityTo ? a2 : Array.isArray(o2.gradient.opacityTo) ? o2.gradient.opacityTo[n2] : o2.gradient.opacityTo; if (void 0 === o2.gradient.gradientToColors || 0 === o2.gradient.gradientToColors.length) d2 = "dark" === o2.gradient.shade ? c2.shadeColor(-1 * parseFloat(o2.gradient.shadeIntensity), i2.indexOf("rgb") > -1 ? v.rgb2hex(i2) : i2) : c2.shadeColor(parseFloat(o2.gradient.shadeIntensity), i2.indexOf("rgb") > -1 ? v.rgb2hex(i2) : i2); else if (o2.gradient.gradientToColors[l2.seriesNumber]) { var x2 = o2.gradient.gradientToColors[l2.seriesNumber]; d2 = x2, x2.indexOf("rgba") > -1 && (f2 = v.getOpacityFromRGBA(x2)); } else d2 = i2; if (o2.gradient.gradientFrom && (g2 = o2.gradient.gradientFrom), o2.gradient.gradientTo && (d2 = o2.gradient.gradientTo), o2.gradient.inverseColors) { var b2 = g2; g2 = d2, d2 = b2; } return g2.indexOf("rgb") > -1 && (g2 = v.rgb2hex(g2)), d2.indexOf("rgb") > -1 && (d2 = v.rgb2hex(d2)), h2.drawGradient(e2, g2, d2, p2, f2, l2.size, o2.gradient.stops, r2, n2); } }]), t2; })(); var Vi = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "setGlobalMarkerSize", value: function() { var t3 = this.w; if (t3.globals.markers.size = Array.isArray(t3.config.markers.size) ? t3.config.markers.size : [t3.config.markers.size], t3.globals.markers.size.length > 0) { if (t3.globals.markers.size.length < t3.globals.series.length + 1) for (var e2 = 0; e2 <= t3.globals.series.length; e2++) void 0 === t3.globals.markers.size[e2] && t3.globals.markers.size.push(t3.globals.markers.size[0]); } else t3.globals.markers.size = t3.config.series.map((function(e3) { return t3.config.markers.size; })); } }, { key: "plotChartMarkers", value: function(t3) { var e2 = t3.pointsPos, i2 = t3.seriesIndex, a2 = t3.j, s2 = t3.pSize, r2 = t3.alwaysDrawMarker, n2 = void 0 !== r2 && r2, o2 = t3.isVirtualPoint, l2 = void 0 !== o2 && o2, h2 = this.w, c2 = i2, d2 = e2, u2 = null, g2 = new Mi(this.ctx), p2 = h2.config.markers.discrete && h2.config.markers.discrete.length; if (Array.isArray(d2.x)) for (var f2 = 0; f2 < d2.x.length; f2++) { var x2 = void 0, b2 = a2, m2 = !v.isNumber(d2.y[f2]); 0 === h2.globals.markers.largestSize && h2.globals.hasNullValues && null !== h2.globals.series[c2][a2 + 1] && !l2 && (m2 = true), 1 === a2 && 0 === f2 && (b2 = 0), 1 === a2 && 1 === f2 && (b2 = 1); var y2 = "apexcharts-marker"; if ("line" !== h2.config.chart.type && "area" !== h2.config.chart.type || h2.globals.comboCharts || h2.config.tooltip.intersect || (y2 += " no-pointer-events"), (Array.isArray(h2.config.markers.size) ? h2.globals.markers.size[i2] > 0 : h2.config.markers.size > 0) || n2 || p2) { m2 || (y2 += " w".concat(v.randomId())); var w2 = this.getMarkerConfig({ cssClass: y2, seriesIndex: i2, dataPointIndex: b2 }); if (h2.config.series[c2].data[b2] && (h2.config.series[c2].data[b2].fillColor && (w2.pointFillColor = h2.config.series[c2].data[b2].fillColor), h2.config.series[c2].data[b2].strokeColor && (w2.pointStrokeColor = h2.config.series[c2].data[b2].strokeColor)), void 0 !== s2 && (w2.pSize = s2), (d2.x[f2] < -h2.globals.markers.largestSize || d2.x[f2] > h2.globals.gridWidth + h2.globals.markers.largestSize || d2.y[f2] < -h2.globals.markers.largestSize || d2.y[f2] > h2.globals.gridHeight + h2.globals.markers.largestSize) && (w2.pSize = 0), !m2) (h2.globals.markers.size[i2] > 0 || n2 || p2) && !u2 && (u2 = g2.group({ class: n2 || p2 ? "" : "apexcharts-series-markers" })).attr("clip-path", "url(#gridRectMarkerMask".concat(h2.globals.cuid, ")")), (x2 = g2.drawMarker(d2.x[f2], d2.y[f2], w2)).attr("rel", b2), x2.attr("j", b2), x2.attr("index", i2), x2.node.setAttribute("default-marker-size", w2.pSize), new Li(this.ctx).setSelectionFilter(x2, i2, b2), this.addEvents(x2), u2 && u2.add(x2); } else void 0 === h2.globals.pointsArray[i2] && (h2.globals.pointsArray[i2] = []), h2.globals.pointsArray[i2].push([d2.x[f2], d2.y[f2]]); } return u2; } }, { key: "getMarkerConfig", value: function(t3) { var e2 = t3.cssClass, i2 = t3.seriesIndex, a2 = t3.dataPointIndex, s2 = void 0 === a2 ? null : a2, r2 = t3.radius, n2 = void 0 === r2 ? null : r2, o2 = t3.size, l2 = void 0 === o2 ? null : o2, h2 = t3.strokeWidth, c2 = void 0 === h2 ? null : h2, d2 = this.w, u2 = this.getMarkerStyle(i2), g2 = null === l2 ? d2.globals.markers.size[i2] : l2, p2 = d2.config.markers; return null !== s2 && p2.discrete.length && p2.discrete.map((function(t4) { t4.seriesIndex === i2 && t4.dataPointIndex === s2 && (u2.pointStrokeColor = t4.strokeColor, u2.pointFillColor = t4.fillColor, g2 = t4.size, u2.pointShape = t4.shape); })), { pSize: null === n2 ? g2 : n2, pRadius: null !== n2 ? n2 : p2.radius, pointStrokeWidth: null !== c2 ? c2 : Array.isArray(p2.strokeWidth) ? p2.strokeWidth[i2] : p2.strokeWidth, pointStrokeColor: u2.pointStrokeColor, pointFillColor: u2.pointFillColor, shape: u2.pointShape || (Array.isArray(p2.shape) ? p2.shape[i2] : p2.shape), class: e2, pointStrokeOpacity: Array.isArray(p2.strokeOpacity) ? p2.strokeOpacity[i2] : p2.strokeOpacity, pointStrokeDashArray: Array.isArray(p2.strokeDashArray) ? p2.strokeDashArray[i2] : p2.strokeDashArray, pointFillOpacity: Array.isArray(p2.fillOpacity) ? p2.fillOpacity[i2] : p2.fillOpacity, seriesIndex: i2 }; } }, { key: "addEvents", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx); t3.node.addEventListener("mouseenter", i2.pathMouseEnter.bind(this.ctx, t3)), t3.node.addEventListener("mouseleave", i2.pathMouseLeave.bind(this.ctx, t3)), t3.node.addEventListener("mousedown", i2.pathMouseDown.bind(this.ctx, t3)), t3.node.addEventListener("click", e2.config.markers.onClick), t3.node.addEventListener("dblclick", e2.config.markers.onDblClick), t3.node.addEventListener("touchstart", i2.pathMouseDown.bind(this.ctx, t3), { passive: true }); } }, { key: "getMarkerStyle", value: function(t3) { var e2 = this.w, i2 = e2.globals.markers.colors, a2 = e2.config.markers.strokeColor || e2.config.markers.strokeColors; return { pointStrokeColor: Array.isArray(a2) ? a2[t3] : a2, pointFillColor: Array.isArray(i2) ? i2[t3] : i2 }; } }]), t2; })(); var Ui = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.initialAnim = this.w.config.chart.animations.enabled; } return s(t2, [{ key: "draw", value: function(t3, e2, i2) { var a2 = this.w, s2 = new Mi(this.ctx), r2 = i2.realIndex, n2 = i2.pointsPos, o2 = i2.zRatio, l2 = i2.elParent, h2 = s2.group({ class: "apexcharts-series-markers apexcharts-series-".concat(a2.config.chart.type) }); if (h2.attr("clip-path", "url(#gridRectMarkerMask".concat(a2.globals.cuid, ")")), Array.isArray(n2.x)) for (var c2 = 0; c2 < n2.x.length; c2++) { var d2 = e2 + 1, u2 = true; 0 === e2 && 0 === c2 && (d2 = 0), 0 === e2 && 1 === c2 && (d2 = 1); var g2 = a2.globals.markers.size[r2]; if (o2 !== 1 / 0) { var p2 = a2.config.plotOptions.bubble; g2 = a2.globals.seriesZ[r2][d2], p2.zScaling && (g2 /= o2), p2.minBubbleRadius && g2 < p2.minBubbleRadius && (g2 = p2.minBubbleRadius), p2.maxBubbleRadius && g2 > p2.maxBubbleRadius && (g2 = p2.maxBubbleRadius); } var f2 = n2.x[c2], x2 = n2.y[c2]; if (g2 = g2 || 0, null !== x2 && void 0 !== a2.globals.series[r2][d2] || (u2 = false), u2) { var b2 = this.drawPoint(f2, x2, g2, r2, d2, e2); h2.add(b2); } l2.add(h2); } } }, { key: "drawPoint", value: function(t3, e2, i2, a2, s2, r2) { var n2 = this.w, o2 = a2, l2 = new y(this.ctx), h2 = new Li(this.ctx), c2 = new ji(this.ctx), d2 = new Vi(this.ctx), u2 = new Mi(this.ctx), g2 = d2.getMarkerConfig({ cssClass: "apexcharts-marker", seriesIndex: o2, dataPointIndex: s2, radius: "bubble" === n2.config.chart.type || n2.globals.comboCharts && n2.config.series[a2] && "bubble" === n2.config.series[a2].type ? i2 : null }), p2 = c2.fillPath({ seriesNumber: a2, dataPointIndex: s2, color: g2.pointFillColor, patternUnits: "objectBoundingBox", value: n2.globals.series[a2][r2] }), f2 = u2.drawMarker(t3, e2, g2); if (n2.config.series[o2].data[s2] && n2.config.series[o2].data[s2].fillColor && (p2 = n2.config.series[o2].data[s2].fillColor), f2.attr({ fill: p2 }), n2.config.chart.dropShadow.enabled) { var x2 = n2.config.chart.dropShadow; h2.dropShadow(f2, x2, a2); } if (!this.initialAnim || n2.globals.dataChanged || n2.globals.resized) n2.globals.animationEnded = true; else { var b2 = n2.config.chart.animations.speed; l2.animateMarker(f2, b2, n2.globals.easing, (function() { window.setTimeout((function() { l2.animationCompleted(f2); }), 100); })); } return f2.attr({ rel: s2, j: s2, index: a2, "default-marker-size": g2.pSize }), h2.setSelectionFilter(f2, a2, s2), d2.addEvents(f2), f2.node.classList.add("apexcharts-marker"), f2; } }, { key: "centerTextInBubble", value: function(t3) { var e2 = this.w; return { y: t3 += parseInt(e2.config.dataLabels.style.fontSize, 10) / 4 }; } }]), t2; })(); var qi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "dataLabelsCorrection", value: function(t3, e2, i2, a2, s2, r2, n2) { var o2 = this.w, l2 = false, h2 = new Mi(this.ctx).getTextRects(i2, n2), c2 = h2.width, d2 = h2.height; e2 < 0 && (e2 = 0), e2 > o2.globals.gridHeight + d2 && (e2 = o2.globals.gridHeight + d2 / 2), void 0 === o2.globals.dataLabelsRects[a2] && (o2.globals.dataLabelsRects[a2] = []), o2.globals.dataLabelsRects[a2].push({ x: t3, y: e2, width: c2, height: d2 }); var u2 = o2.globals.dataLabelsRects[a2].length - 2, g2 = void 0 !== o2.globals.lastDrawnDataLabelsIndexes[a2] ? o2.globals.lastDrawnDataLabelsIndexes[a2][o2.globals.lastDrawnDataLabelsIndexes[a2].length - 1] : 0; if (void 0 !== o2.globals.dataLabelsRects[a2][u2]) { var p2 = o2.globals.dataLabelsRects[a2][g2]; (t3 > p2.x + p2.width || e2 > p2.y + p2.height || e2 + d2 < p2.y || t3 + c2 < p2.x) && (l2 = true); } return (0 === s2 || r2) && (l2 = true), { x: t3, y: e2, textRects: h2, drawnextLabel: l2 }; } }, { key: "drawDataLabel", value: function(t3) { var e2 = this, i2 = t3.type, a2 = t3.pos, s2 = t3.i, r2 = t3.j, n2 = t3.isRangeStart, o2 = t3.strokeWidth, l2 = void 0 === o2 ? 2 : o2, h2 = this.w, c2 = new Mi(this.ctx), d2 = h2.config.dataLabels, u2 = 0, g2 = 0, p2 = r2, f2 = null; if (-1 !== h2.globals.collapsedSeriesIndices.indexOf(s2) || !d2.enabled || !Array.isArray(a2.x)) return f2; f2 = c2.group({ class: "apexcharts-data-labels" }); for (var x2 = 0; x2 < a2.x.length; x2++) if (u2 = a2.x[x2] + d2.offsetX, g2 = a2.y[x2] + d2.offsetY + l2, !isNaN(u2)) { 1 === r2 && 0 === x2 && (p2 = 0), 1 === r2 && 1 === x2 && (p2 = 1); var b2 = h2.globals.series[s2][p2]; "rangeArea" === i2 && (b2 = n2 ? h2.globals.seriesRangeStart[s2][p2] : h2.globals.seriesRangeEnd[s2][p2]); var m2 = "", v2 = function(t4) { return h2.config.dataLabels.formatter(t4, { ctx: e2.ctx, seriesIndex: s2, dataPointIndex: p2, w: h2 }); }; if ("bubble" === h2.config.chart.type) m2 = v2(b2 = h2.globals.seriesZ[s2][p2]), g2 = a2.y[x2], g2 = new Ui(this.ctx).centerTextInBubble(g2, s2, p2).y; else void 0 !== b2 && (m2 = v2(b2)); var y2 = h2.config.dataLabels.textAnchor; h2.globals.isSlopeChart && (y2 = 0 === p2 ? "end" : p2 === h2.config.series[s2].data.length - 1 ? "start" : "middle"), this.plotDataLabelsText({ x: u2, y: g2, text: m2, i: s2, j: p2, parent: f2, offsetCorrection: true, dataLabelsConfig: h2.config.dataLabels, textAnchor: y2 }); } return f2; } }, { key: "plotDataLabelsText", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a2 = t3.x, s2 = t3.y, r2 = t3.i, n2 = t3.j, o2 = t3.text, l2 = t3.textAnchor, h2 = t3.fontSize, c2 = t3.parent, d2 = t3.dataLabelsConfig, u2 = t3.color, g2 = t3.alwaysDrawDataLabel, p2 = t3.offsetCorrection, f2 = t3.className, x2 = null; if (Array.isArray(e2.config.dataLabels.enabledOnSeries) && e2.config.dataLabels.enabledOnSeries.indexOf(r2) < 0) return x2; var b2 = { x: a2, y: s2, drawnextLabel: true, textRects: null }; p2 && (b2 = this.dataLabelsCorrection(a2, s2, o2, r2, n2, g2, parseInt(d2.style.fontSize, 10))), e2.globals.zoomed || (a2 = b2.x, s2 = b2.y), b2.textRects && (a2 < -20 - b2.textRects.width || a2 > e2.globals.gridWidth + b2.textRects.width + 30) && (o2 = ""); var m2 = e2.globals.dataLabels.style.colors[r2]; (("bar" === e2.config.chart.type || "rangeBar" === e2.config.chart.type) && e2.config.plotOptions.bar.distributed || e2.config.dataLabels.distributed) && (m2 = e2.globals.dataLabels.style.colors[n2]), "function" == typeof m2 && (m2 = m2({ series: e2.globals.series, seriesIndex: r2, dataPointIndex: n2, w: e2 })), u2 && (m2 = u2); var v2 = d2.offsetX, y2 = d2.offsetY; if ("bar" !== e2.config.chart.type && "rangeBar" !== e2.config.chart.type || (v2 = 0, y2 = 0), e2.globals.isSlopeChart && (0 !== n2 && (v2 = -2 * d2.offsetX + 5), 0 !== n2 && n2 !== e2.config.series[r2].data.length - 1 && (v2 = 0)), b2.drawnextLabel) { if ("middle" === l2 && a2 === e2.globals.gridWidth && (l2 = "end"), (x2 = i2.drawText({ width: 100, height: parseInt(d2.style.fontSize, 10), x: a2 + v2, y: s2 + y2, foreColor: m2, textAnchor: l2 || d2.textAnchor, text: o2, fontSize: h2 || d2.style.fontSize, fontFamily: d2.style.fontFamily, fontWeight: d2.style.fontWeight || "normal" })).attr({ class: f2 || "apexcharts-datalabel", cx: a2, cy: s2 }), d2.dropShadow.enabled) { var w2 = d2.dropShadow; new Li(this.ctx).dropShadow(x2, w2); } c2.add(x2), void 0 === e2.globals.lastDrawnDataLabelsIndexes[r2] && (e2.globals.lastDrawnDataLabelsIndexes[r2] = []), e2.globals.lastDrawnDataLabelsIndexes[r2].push(n2); } return x2; } }, { key: "addBackgroundToDataLabel", value: function(t3, e2) { var i2 = this.w, a2 = i2.config.dataLabels.background, s2 = a2.padding, r2 = a2.padding / 2, n2 = e2.width, o2 = e2.height, l2 = new Mi(this.ctx).drawRect(e2.x - s2, e2.y - r2 / 2, n2 + 2 * s2, o2 + r2, a2.borderRadius, "transparent" !== i2.config.chart.background && i2.config.chart.background ? i2.config.chart.background : "#fff", a2.opacity, a2.borderWidth, a2.borderColor); a2.dropShadow.enabled && new Li(this.ctx).dropShadow(l2, a2.dropShadow); return l2; } }, { key: "dataLabelsBackground", value: function() { var t3 = this.w; if ("bubble" !== t3.config.chart.type) for (var e2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-datalabels text"), i2 = 0; i2 < e2.length; i2++) { var a2 = e2[i2], s2 = a2.getBBox(), r2 = null; if (s2.width && s2.height && (r2 = this.addBackgroundToDataLabel(a2, s2)), r2) { a2.parentNode.insertBefore(r2.node, a2); var n2 = t3.config.dataLabels.background.backgroundColor || a2.getAttribute("fill"); t3.config.chart.animations.enabled && !t3.globals.resized && !t3.globals.dataChanged ? r2.animate().attr({ fill: n2 }) : r2.attr({ fill: n2 }), a2.setAttribute("fill", t3.config.dataLabels.background.foreColor); } } } }, { key: "bringForward", value: function() { for (var t3 = this.w, e2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-datalabels"), i2 = t3.globals.dom.baseEl.querySelector(".apexcharts-plot-series:last-child"), a2 = 0; a2 < e2.length; a2++) i2 && i2.insertBefore(e2[a2], i2.nextSibling); } }]), t2; })(); var Zi = ".apexcharts-flip-y {\n transform: scaleY(-1) translateY(-100%);\n transform-origin: top;\n transform-box: fill-box;\n}\n.apexcharts-flip-x {\n transform: scaleX(-1);\n transform-origin: center;\n transform-box: fill-box;\n}\n.apexcharts-legend {\n display: flex;\n overflow: auto;\n padding: 0 10px;\n}\n.apexcharts-legend.apexcharts-legend-group-horizontal {\n flex-direction: column;\n}\n.apexcharts-legend-group {\n display: flex;\n}\n.apexcharts-legend-group-vertical {\n flex-direction: column-reverse;\n}\n.apexcharts-legend.apx-legend-position-bottom, .apexcharts-legend.apx-legend-position-top {\n flex-wrap: wrap\n}\n.apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\n flex-direction: column;\n bottom: 0;\n}\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-left, .apexcharts-legend.apx-legend-position-top.apexcharts-align-left, .apexcharts-legend.apx-legend-position-right, .apexcharts-legend.apx-legend-position-left {\n justify-content: flex-start;\n align-items: flex-start;\n}\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-center, .apexcharts-legend.apx-legend-position-top.apexcharts-align-center {\n justify-content: center;\n align-items: center;\n}\n.apexcharts-legend.apx-legend-position-bottom.apexcharts-align-right, .apexcharts-legend.apx-legend-position-top.apexcharts-align-right {\n justify-content: flex-end;\n align-items: flex-end;\n}\n.apexcharts-legend-series {\n cursor: pointer;\n line-height: normal;\n display: flex;\n align-items: center;\n}\n.apexcharts-legend-text {\n position: relative;\n font-size: 14px;\n}\n.apexcharts-legend-text *, .apexcharts-legend-marker * {\n pointer-events: none;\n}\n.apexcharts-legend-marker {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n margin-right: 1px;\n}\n\n.apexcharts-legend-series.apexcharts-no-click {\n cursor: auto;\n}\n.apexcharts-legend .apexcharts-hidden-zero-series, .apexcharts-legend .apexcharts-hidden-null-series {\n display: none !important;\n}\n.apexcharts-inactive-legend {\n opacity: 0.45;\n} "; var $i = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.legendInactiveClass = "legend-mouseover-inactive"; } return s(t2, [{ key: "getAllSeriesEls", value: function() { return this.w.globals.dom.baseEl.getElementsByClassName("apexcharts-series"); } }, { key: "getSeriesByName", value: function(t3) { return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner .apexcharts-series[seriesName='".concat(v.escapeString(t3), "']")); } }, { key: "isSeriesHidden", value: function(t3) { var e2 = this.getSeriesByName(t3), i2 = parseInt(e2.getAttribute("data:realIndex"), 10); return { isHidden: e2.classList.contains("apexcharts-series-collapsed"), realIndex: i2 }; } }, { key: "addCollapsedClassToSeries", value: function(t3, e2) { var i2 = this.w; function a2(i3) { for (var a3 = 0; a3 < i3.length; a3++) i3[a3].index === e2 && t3.node.classList.add("apexcharts-series-collapsed"); } a2(i2.globals.collapsedSeries), a2(i2.globals.ancillaryCollapsedSeries); } }, { key: "toggleSeries", value: function(t3) { var e2 = this.isSeriesHidden(t3); return this.ctx.legend.legendHelpers.toggleDataSeries(e2.realIndex, e2.isHidden), e2.isHidden; } }, { key: "showSeries", value: function(t3) { var e2 = this.isSeriesHidden(t3); e2.isHidden && this.ctx.legend.legendHelpers.toggleDataSeries(e2.realIndex, true); } }, { key: "hideSeries", value: function(t3) { var e2 = this.isSeriesHidden(t3); e2.isHidden || this.ctx.legend.legendHelpers.toggleDataSeries(e2.realIndex, false); } }, { key: "resetSeries", value: function() { var t3 = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], a2 = this.w, s2 = v.clone(a2.globals.initialSeries); a2.globals.previousPaths = [], i2 ? (a2.globals.collapsedSeries = [], a2.globals.ancillaryCollapsedSeries = [], a2.globals.collapsedSeriesIndices = [], a2.globals.ancillaryCollapsedSeriesIndices = []) : s2 = this.emptyCollapsedSeries(s2), a2.config.series = s2, t3 && (e2 && (a2.globals.zoomed = false, this.ctx.updateHelpers.revertDefaultAxisMinMax()), this.ctx.updateHelpers._updateSeries(s2, a2.config.chart.animations.dynamicAnimation.enabled)); } }, { key: "emptyCollapsedSeries", value: function(t3) { for (var e2 = this.w, i2 = 0; i2 < t3.length; i2++) e2.globals.collapsedSeriesIndices.indexOf(i2) > -1 && (t3[i2].data = []); return t3; } }, { key: "highlightSeries", value: function(t3) { var e2 = this.w, i2 = this.getSeriesByName(t3), a2 = parseInt(null == i2 ? void 0 : i2.getAttribute("data:realIndex"), 10), s2 = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-series, .apexcharts-datalabels, .apexcharts-yaxis"), r2 = null, n2 = null, o2 = null; if (e2.globals.axisCharts || "radialBar" === e2.config.chart.type) if (e2.globals.axisCharts) { r2 = e2.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(a2, "']")), n2 = e2.globals.dom.baseEl.querySelector(".apexcharts-datalabels[data\\:realIndex='".concat(a2, "']")); var l2 = e2.globals.seriesYAxisReverseMap[a2]; o2 = e2.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(l2, "']")); } else r2 = e2.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(a2 + 1, "']")); else r2 = e2.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(a2 + 1, "'] path")); for (var h2 = 0; h2 < s2.length; h2++) s2[h2].classList.add(this.legendInactiveClass); if (r2) e2.globals.axisCharts || r2.parentNode.classList.remove(this.legendInactiveClass), r2.classList.remove(this.legendInactiveClass), null !== n2 && n2.classList.remove(this.legendInactiveClass), null !== o2 && o2.classList.remove(this.legendInactiveClass); else for (var c2 = 0; c2 < s2.length; c2++) s2[c2].classList.remove(this.legendInactiveClass); } }, { key: "toggleSeriesOnHover", value: function(t3, e2) { var i2 = this.w; e2 || (e2 = t3.target); var a2 = i2.globals.dom.baseEl.querySelectorAll(".apexcharts-series, .apexcharts-datalabels, .apexcharts-yaxis"); if ("mousemove" === t3.type) { var s2 = parseInt(e2.getAttribute("rel"), 10) - 1; this.highlightSeries(i2.globals.seriesNames[s2]); } else if ("mouseout" === t3.type) for (var r2 = 0; r2 < a2.length; r2++) a2[r2].classList.remove(this.legendInactiveClass); } }, { key: "highlightRangeInSeries", value: function(t3, e2) { var i2 = this, a2 = this.w, s2 = a2.globals.dom.baseEl.getElementsByClassName("apexcharts-heatmap-rect"), r2 = function(t4) { for (var e3 = 0; e3 < s2.length; e3++) s2[e3].classList[t4](i2.legendInactiveClass); }; if ("mousemove" === t3.type) { var n2 = parseInt(e2.getAttribute("rel"), 10) - 1; r2("add"); var o2 = a2.config.plotOptions.heatmap.colorScale.ranges; !(function(t4, e3) { for (var a3 = 0; a3 < s2.length; a3++) { var r3 = Number(s2[a3].getAttribute("val")); r3 >= t4.from && (r3 < t4.to || t4.to === e3 && r3 === e3) && s2[a3].classList.remove(i2.legendInactiveClass); } })(o2[n2], o2.reduce((function(t4, e3) { return Math.max(t4, e3.to); }), 0)); } else "mouseout" === t3.type && r2("remove"); } }, { key: "getActiveConfigSeriesIndex", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "asc", e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], i2 = this.w, a2 = 0; if (i2.config.series.length > 1) { for (var s2 = i2.config.series.map((function(t4, a3) { return t4.data && t4.data.length > 0 && -1 === i2.globals.collapsedSeriesIndices.indexOf(a3) && (!i2.globals.comboCharts || 0 === e2.length || e2.length && e2.indexOf(i2.config.series[a3].type) > -1) ? a3 : -1; })), r2 = "asc" === t3 ? 0 : s2.length - 1; "asc" === t3 ? r2 < s2.length : r2 >= 0; "asc" === t3 ? r2++ : r2--) if (-1 !== s2[r2]) { a2 = s2[r2]; break; } } return a2; } }, { key: "getBarSeriesIndices", value: function() { return this.w.globals.comboCharts ? this.w.config.series.map((function(t3, e2) { return "bar" === t3.type || "column" === t3.type ? e2 : -1; })).filter((function(t3) { return -1 !== t3; })) : this.w.config.series.map((function(t3, e2) { return e2; })); } }, { key: "getPreviousPaths", value: function() { var t3 = this.w; function e2(e3, i3, a3) { for (var s3 = e3[i3].childNodes, r2 = { type: a3, paths: [], realIndex: e3[i3].getAttribute("data:realIndex") }, n2 = 0; n2 < s3.length; n2++) if (s3[n2].hasAttribute("pathTo")) { var o2 = s3[n2].getAttribute("pathTo"); r2.paths.push({ d: o2 }); } t3.globals.previousPaths.push(r2); } t3.globals.previousPaths = []; ["line", "area", "bar", "rangebar", "rangeArea", "candlestick", "radar"].forEach((function(i3) { for (var a3, s3 = (a3 = i3, t3.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(a3, "-series .apexcharts-series"))), r2 = 0; r2 < s3.length; r2++) e2(s3, r2, i3); })); var i2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t3.config.chart.type, " .apexcharts-series")); if (i2.length > 0) for (var a2 = function(e3) { for (var i3 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-".concat(t3.config.chart.type, " .apexcharts-series[data\\:realIndex='").concat(e3, "'] rect")), a3 = [], s3 = function(t4) { var e4 = function(e5) { return i3[t4].getAttribute(e5); }, s4 = { x: parseFloat(e4("x")), y: parseFloat(e4("y")), width: parseFloat(e4("width")), height: parseFloat(e4("height")) }; a3.push({ rect: s4, color: i3[t4].getAttribute("color") }); }, r2 = 0; r2 < i3.length; r2++) s3(r2); t3.globals.previousPaths.push(a3); }, s2 = 0; s2 < i2.length; s2++) a2(s2); t3.globals.axisCharts || (t3.globals.previousPaths = t3.globals.series); } }, { key: "clearPreviousPaths", value: function() { var t3 = this.w; t3.globals.previousPaths = [], t3.globals.allSeriesCollapsed = false; } }, { key: "handleNoData", value: function() { var t3 = this.w, e2 = t3.config.noData, i2 = new Mi(this.ctx), a2 = t3.globals.svgWidth / 2, s2 = t3.globals.svgHeight / 2, r2 = "middle"; if (t3.globals.noData = true, t3.globals.animationEnded = true, "left" === e2.align ? (a2 = 10, r2 = "start") : "right" === e2.align && (a2 = t3.globals.svgWidth - 10, r2 = "end"), "top" === e2.verticalAlign ? s2 = 50 : "bottom" === e2.verticalAlign && (s2 = t3.globals.svgHeight - 50), a2 += e2.offsetX, s2 = s2 + parseInt(e2.style.fontSize, 10) + 2 + e2.offsetY, void 0 !== e2.text && "" !== e2.text) { var n2 = i2.drawText({ x: a2, y: s2, text: e2.text, textAnchor: r2, fontSize: e2.style.fontSize, fontFamily: e2.style.fontFamily, foreColor: e2.style.color, opacity: 1, class: "apexcharts-text-nodata" }); t3.globals.dom.Paper.add(n2); } } }, { key: "setNullSeriesToZeroValues", value: function(t3) { for (var e2 = this.w, i2 = 0; i2 < t3.length; i2++) if (0 === t3[i2].length) for (var a2 = 0; a2 < t3[e2.globals.maxValsInArrayIndex].length; a2++) t3[i2].push(0); return t3; } }, { key: "hasAllSeriesEqualX", value: function() { for (var t3 = true, e2 = this.w, i2 = this.filteredSeriesX(), a2 = 0; a2 < i2.length - 1; a2++) if (i2[a2][0] !== i2[a2 + 1][0]) { t3 = false; break; } return e2.globals.allSeriesHasEqualX = t3, t3; } }, { key: "filteredSeriesX", value: function() { var t3 = this.w.globals.seriesX.map((function(t4) { return t4.length > 0 ? t4 : []; })); return t3; } }]), t2; })(); var Ji = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.twoDSeries = [], this.threeDSeries = [], this.twoDSeriesX = [], this.seriesGoals = [], this.coreUtils = new Pi(this.ctx); } return s(t2, [{ key: "isMultiFormat", value: function() { return this.isFormatXY() || this.isFormat2DArray(); } }, { key: "isFormatXY", value: function() { var t3 = this.w.config.series.slice(), e2 = new $i(this.ctx); if (this.activeSeriesIndex = e2.getActiveConfigSeriesIndex(), void 0 !== t3[this.activeSeriesIndex].data && t3[this.activeSeriesIndex].data.length > 0 && null !== t3[this.activeSeriesIndex].data[0] && void 0 !== t3[this.activeSeriesIndex].data[0].x && null !== t3[this.activeSeriesIndex].data[0]) return true; } }, { key: "isFormat2DArray", value: function() { var t3 = this.w.config.series.slice(), e2 = new $i(this.ctx); if (this.activeSeriesIndex = e2.getActiveConfigSeriesIndex(), void 0 !== t3[this.activeSeriesIndex].data && t3[this.activeSeriesIndex].data.length > 0 && void 0 !== t3[this.activeSeriesIndex].data[0] && null !== t3[this.activeSeriesIndex].data[0] && t3[this.activeSeriesIndex].data[0].constructor === Array) return true; } }, { key: "handleFormat2DArray", value: function(t3, e2) { for (var i2 = this.w.config, a2 = this.w.globals, s2 = "boxPlot" === i2.chart.type || "boxPlot" === i2.series[e2].type, r2 = 0; r2 < t3[e2].data.length; r2++) if (void 0 !== t3[e2].data[r2][1] && (Array.isArray(t3[e2].data[r2][1]) && 4 === t3[e2].data[r2][1].length && !s2 ? this.twoDSeries.push(v.parseNumber(t3[e2].data[r2][1][3])) : t3[e2].data[r2].length >= 5 ? this.twoDSeries.push(v.parseNumber(t3[e2].data[r2][4])) : this.twoDSeries.push(v.parseNumber(t3[e2].data[r2][1])), a2.dataFormatXNumeric = true), "datetime" === i2.xaxis.type) { var n2 = new Date(t3[e2].data[r2][0]); n2 = new Date(n2).getTime(), this.twoDSeriesX.push(n2); } else this.twoDSeriesX.push(t3[e2].data[r2][0]); for (var o2 = 0; o2 < t3[e2].data.length; o2++) void 0 !== t3[e2].data[o2][2] && (this.threeDSeries.push(t3[e2].data[o2][2]), a2.isDataXYZ = true); } }, { key: "handleFormatXY", value: function(t3, e2) { var i2 = this.w.config, a2 = this.w.globals, s2 = new zi(this.ctx), r2 = e2; a2.collapsedSeriesIndices.indexOf(e2) > -1 && (r2 = this.activeSeriesIndex); for (var n2 = 0; n2 < t3[e2].data.length; n2++) void 0 !== t3[e2].data[n2].y && (Array.isArray(t3[e2].data[n2].y) ? this.twoDSeries.push(v.parseNumber(t3[e2].data[n2].y[t3[e2].data[n2].y.length - 1])) : this.twoDSeries.push(v.parseNumber(t3[e2].data[n2].y))), void 0 !== t3[e2].data[n2].goals && Array.isArray(t3[e2].data[n2].goals) ? (void 0 === this.seriesGoals[e2] && (this.seriesGoals[e2] = []), this.seriesGoals[e2].push(t3[e2].data[n2].goals)) : (void 0 === this.seriesGoals[e2] && (this.seriesGoals[e2] = []), this.seriesGoals[e2].push(null)); for (var o2 = 0; o2 < t3[r2].data.length; o2++) { var l2 = "string" == typeof t3[r2].data[o2].x, h2 = Array.isArray(t3[r2].data[o2].x), c2 = !h2 && !!s2.isValidDate(t3[r2].data[o2].x); if (l2 || c2) if (l2 || i2.xaxis.convertedCatToNumeric) { var d2 = a2.isBarHorizontal && a2.isRangeData; "datetime" !== i2.xaxis.type || d2 ? (this.fallbackToCategory = true, this.twoDSeriesX.push(t3[r2].data[o2].x), isNaN(t3[r2].data[o2].x) || "category" === this.w.config.xaxis.type || "string" == typeof t3[r2].data[o2].x || (a2.isXNumeric = true)) : this.twoDSeriesX.push(s2.parseDate(t3[r2].data[o2].x)); } else "datetime" === i2.xaxis.type ? this.twoDSeriesX.push(s2.parseDate(t3[r2].data[o2].x.toString())) : (a2.dataFormatXNumeric = true, a2.isXNumeric = true, this.twoDSeriesX.push(parseFloat(t3[r2].data[o2].x))); else h2 ? (this.fallbackToCategory = true, this.twoDSeriesX.push(t3[r2].data[o2].x)) : (a2.isXNumeric = true, a2.dataFormatXNumeric = true, this.twoDSeriesX.push(t3[r2].data[o2].x)); } if (t3[e2].data[0] && void 0 !== t3[e2].data[0].z) { for (var u2 = 0; u2 < t3[e2].data.length; u2++) this.threeDSeries.push(t3[e2].data[u2].z); a2.isDataXYZ = true; } } }, { key: "handleRangeData", value: function(t3, e2) { var i2 = this.w.globals, a2 = {}; return this.isFormat2DArray() ? a2 = this.handleRangeDataFormat("array", t3, e2) : this.isFormatXY() && (a2 = this.handleRangeDataFormat("xy", t3, e2)), i2.seriesRangeStart[e2] = void 0 === a2.start ? [] : a2.start, i2.seriesRangeEnd[e2] = void 0 === a2.end ? [] : a2.end, i2.seriesRange[e2] = a2.rangeUniques, i2.seriesRange.forEach((function(t4, e3) { t4 && t4.forEach((function(t5, e4) { t5.y.forEach((function(e5, i3) { for (var a3 = 0; a3 < t5.y.length; a3++) if (i3 !== a3) { var s2 = e5.y1, r2 = e5.y2, n2 = t5.y[a3].y1; s2 <= t5.y[a3].y2 && n2 <= r2 && (t5.overlaps.indexOf(e5.rangeName) < 0 && t5.overlaps.push(e5.rangeName), t5.overlaps.indexOf(t5.y[a3].rangeName) < 0 && t5.overlaps.push(t5.y[a3].rangeName)); } })); })); })), a2; } }, { key: "handleCandleStickBoxData", value: function(t3, e2) { var i2 = this.w.globals, a2 = {}; return this.isFormat2DArray() ? a2 = this.handleCandleStickBoxDataFormat("array", t3, e2) : this.isFormatXY() && (a2 = this.handleCandleStickBoxDataFormat("xy", t3, e2)), i2.seriesCandleO[e2] = a2.o, i2.seriesCandleH[e2] = a2.h, i2.seriesCandleM[e2] = a2.m, i2.seriesCandleL[e2] = a2.l, i2.seriesCandleC[e2] = a2.c, a2; } }, { key: "handleRangeDataFormat", value: function(t3, e2, i2) { var a2 = [], s2 = [], r2 = e2[i2].data.filter((function(t4, e3, i3) { return e3 === i3.findIndex((function(e4) { return e4.x === t4.x; })); })).map((function(t4, e3) { return { x: t4.x, overlaps: [], y: [] }; })); if ("array" === t3) for (var n2 = 0; n2 < e2[i2].data.length; n2++) Array.isArray(e2[i2].data[n2]) ? (a2.push(e2[i2].data[n2][1][0]), s2.push(e2[i2].data[n2][1][1])) : (a2.push(e2[i2].data[n2]), s2.push(e2[i2].data[n2])); else if ("xy" === t3) for (var o2 = function(t4) { var n3 = Array.isArray(e2[i2].data[t4].y), o3 = v.randomId(), l3 = e2[i2].data[t4].x, h2 = { y1: n3 ? e2[i2].data[t4].y[0] : e2[i2].data[t4].y, y2: n3 ? e2[i2].data[t4].y[1] : e2[i2].data[t4].y, rangeName: o3 }; e2[i2].data[t4].rangeName = o3; var c2 = r2.findIndex((function(t5) { return t5.x === l3; })); r2[c2].y.push(h2), a2.push(h2.y1), s2.push(h2.y2); }, l2 = 0; l2 < e2[i2].data.length; l2++) o2(l2); return { start: a2, end: s2, rangeUniques: r2 }; } }, { key: "handleCandleStickBoxDataFormat", value: function(t3, e2, i2) { var a2 = this.w, s2 = "boxPlot" === a2.config.chart.type || "boxPlot" === a2.config.series[i2].type, r2 = [], n2 = [], o2 = [], l2 = [], h2 = []; if ("array" === t3) if (s2 && 6 === e2[i2].data[0].length || !s2 && 5 === e2[i2].data[0].length) for (var c2 = 0; c2 < e2[i2].data.length; c2++) r2.push(e2[i2].data[c2][1]), n2.push(e2[i2].data[c2][2]), s2 ? (o2.push(e2[i2].data[c2][3]), l2.push(e2[i2].data[c2][4]), h2.push(e2[i2].data[c2][5])) : (l2.push(e2[i2].data[c2][3]), h2.push(e2[i2].data[c2][4])); else for (var d2 = 0; d2 < e2[i2].data.length; d2++) Array.isArray(e2[i2].data[d2][1]) && (r2.push(e2[i2].data[d2][1][0]), n2.push(e2[i2].data[d2][1][1]), s2 ? (o2.push(e2[i2].data[d2][1][2]), l2.push(e2[i2].data[d2][1][3]), h2.push(e2[i2].data[d2][1][4])) : (l2.push(e2[i2].data[d2][1][2]), h2.push(e2[i2].data[d2][1][3]))); else if ("xy" === t3) for (var u2 = 0; u2 < e2[i2].data.length; u2++) Array.isArray(e2[i2].data[u2].y) && (r2.push(e2[i2].data[u2].y[0]), n2.push(e2[i2].data[u2].y[1]), s2 ? (o2.push(e2[i2].data[u2].y[2]), l2.push(e2[i2].data[u2].y[3]), h2.push(e2[i2].data[u2].y[4])) : (l2.push(e2[i2].data[u2].y[2]), h2.push(e2[i2].data[u2].y[3]))); return { o: r2, h: n2, m: o2, l: l2, c: h2 }; } }, { key: "parseDataAxisCharts", value: function(t3) { var e2 = this, i2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.ctx, a2 = this.w.config, s2 = this.w.globals, r2 = new zi(i2), n2 = a2.labels.length > 0 ? a2.labels.slice() : a2.xaxis.categories.slice(); s2.isRangeBar = "rangeBar" === a2.chart.type && s2.isBarHorizontal, s2.hasXaxisGroups = "category" === a2.xaxis.type && a2.xaxis.group.groups.length > 0, s2.hasXaxisGroups && (s2.groups = a2.xaxis.group.groups), t3.forEach((function(t4, e3) { void 0 !== t4.name ? s2.seriesNames.push(t4.name) : s2.seriesNames.push("series-" + parseInt(e3 + 1, 10)); })), this.coreUtils.setSeriesYAxisMappings(); var o2 = [], l2 = f(new Set(a2.series.map((function(t4) { return t4.group; })))); a2.series.forEach((function(t4, e3) { var i3 = l2.indexOf(t4.group); o2[i3] || (o2[i3] = []), o2[i3].push(s2.seriesNames[e3]); })), s2.seriesGroups = o2; for (var h2 = function() { for (var t4 = 0; t4 < n2.length; t4++) if ("string" == typeof n2[t4]) { if (!r2.isValidDate(n2[t4])) throw new Error("You have provided invalid Date format. Please provide a valid JavaScript Date"); e2.twoDSeriesX.push(r2.parseDate(n2[t4])); } else e2.twoDSeriesX.push(n2[t4]); }, c2 = 0; c2 < t3.length; c2++) { if (this.twoDSeries = [], this.twoDSeriesX = [], this.threeDSeries = [], void 0 === t3[c2].data) return void console.error("It is a possibility that you may have not included 'data' property in series."); if ("rangeBar" !== a2.chart.type && "rangeArea" !== a2.chart.type && "rangeBar" !== t3[c2].type && "rangeArea" !== t3[c2].type || (s2.isRangeData = true, this.handleRangeData(t3, c2)), this.isMultiFormat()) this.isFormat2DArray() ? this.handleFormat2DArray(t3, c2) : this.isFormatXY() && this.handleFormatXY(t3, c2), "candlestick" !== a2.chart.type && "candlestick" !== t3[c2].type && "boxPlot" !== a2.chart.type && "boxPlot" !== t3[c2].type || this.handleCandleStickBoxData(t3, c2), s2.series.push(this.twoDSeries), s2.labels.push(this.twoDSeriesX), s2.seriesX.push(this.twoDSeriesX), s2.seriesGoals = this.seriesGoals, c2 !== this.activeSeriesIndex || this.fallbackToCategory || (s2.isXNumeric = true); else { "datetime" === a2.xaxis.type ? (s2.isXNumeric = true, h2(), s2.seriesX.push(this.twoDSeriesX)) : "numeric" === a2.xaxis.type && (s2.isXNumeric = true, n2.length > 0 && (this.twoDSeriesX = n2, s2.seriesX.push(this.twoDSeriesX))), s2.labels.push(this.twoDSeriesX); var d2 = t3[c2].data.map((function(t4) { return v.parseNumber(t4); })); s2.series.push(d2); } s2.seriesZ.push(this.threeDSeries), void 0 !== t3[c2].color ? s2.seriesColors.push(t3[c2].color) : s2.seriesColors.push(void 0); } return this.w; } }, { key: "parseDataNonAxisCharts", value: function(t3) { var e2 = this.w.globals, i2 = this.w.config, a2 = Array.isArray(t3) && t3.every((function(t4) { return "number" == typeof t4; })) && i2.labels.length > 0, s2 = Array.isArray(t3) && t3.some((function(t4) { return t4 && "object" === b(t4) && t4.data || t4 && "object" === b(t4) && t4.parsing; })); if (a2 && s2 && console.warn("ApexCharts: Both old format (numeric series + labels) and new format (series objects with data/parsing) detected. Using old format for backward compatibility."), a2) { e2.series = t3.slice(), e2.seriesNames = i2.labels.slice(); for (var r2 = 0; r2 < e2.series.length; r2++) void 0 === e2.seriesNames[r2] && e2.seriesNames.push("series-" + (r2 + 1)); return this.w; } if (Array.isArray(t3) && t3.every((function(t4) { return "number" == typeof t4; }))) { e2.series = t3.slice(), e2.seriesNames = []; for (var n2 = 0; n2 < e2.series.length; n2++) e2.seriesNames.push(i2.labels[n2] || "series-".concat(n2 + 1)); return this.w; } var o2 = this.extractPieDataFromSeries(t3); e2.series = o2.values, e2.seriesNames = o2.labels, "radialBar" === i2.chart.type && (e2.series = e2.series.map((function(t4) { var e3 = v.parseNumber(t4); return e3 > 100 && console.warn("ApexCharts: RadialBar value ".concat(e3, " > 100, consider using percentage values (0-100)")), e3; }))); for (var l2 = 0; l2 < e2.series.length; l2++) void 0 === e2.seriesNames[l2] && e2.seriesNames.push("series-" + (l2 + 1)); return this.w; } }, { key: "resetParsingFlags", value: function() { var t3 = this.w; t3.globals.dataWasParsed = false, t3.globals.originalSeries = null, t3.config.series && t3.config.series.forEach((function(t4) { t4.__apexParsed && delete t4.__apexParsed; })); } }, { key: "extractPieDataFromSeries", value: function(t3) { var e2 = [], i2 = []; if (!Array.isArray(t3)) return console.warn("ApexCharts: Expected array for series data"), { values: [], labels: [] }; if (0 === t3.length) return console.warn("ApexCharts: Empty series array"), { values: [], labels: [] }; var a2 = t3[0]; return "object" === b(a2) && null !== a2 && a2.data ? (this.extractPieDataFromSeriesObjects(t3, e2, i2), { values: e2, labels: i2 }) : (console.warn("ApexCharts: Unsupported series format for pie/donut/radialBar. Expected series objects with data property."), { values: [], labels: [] }); } }, { key: "extractPieDataFromSeriesObjects", value: function(t3, e2, i2) { t3.forEach((function(t4, a2) { t4.data && Array.isArray(t4.data) ? t4.data.forEach((function(t5) { "object" === b(t5) && null !== t5 ? void 0 !== t5.x && void 0 !== t5.y ? (i2.push(String(t5.x)), e2.push(v.parseNumber(t5.y))) : console.warn("ApexCharts: Invalid data point format for pie chart. Expected {x, y} format:", t5) : console.warn("ApexCharts: Expected object data point, got:", b(t5)); })) : console.warn("ApexCharts: Series ".concat(a2, " has no valid data array")); })); } }, { key: "handleExternalLabelsData", value: function(t3) { var e2 = this.w.config, i2 = this.w.globals; if (e2.xaxis.categories.length > 0) i2.labels = e2.xaxis.categories; else if (e2.labels.length > 0) i2.labels = e2.labels.slice(); else if (this.fallbackToCategory) { if (i2.labels = i2.labels[0], i2.seriesRange.length && (i2.seriesRange.map((function(t4) { t4.forEach((function(t5) { i2.labels.indexOf(t5.x) < 0 && t5.x && i2.labels.push(t5.x); })); })), i2.labels = Array.from(new Set(i2.labels.map(JSON.stringify)), JSON.parse)), e2.xaxis.convertedCatToNumeric) new Ni(e2).convertCatToNumericXaxis(e2, this.ctx, i2.seriesX[0]), this._generateExternalLabels(t3); } else this._generateExternalLabels(t3); } }, { key: "_generateExternalLabels", value: function(t3) { var e2 = this.w.globals, i2 = this.w.config, a2 = []; if (e2.axisCharts) { if (e2.series.length > 0) if (this.isFormatXY()) for (var s2 = i2.series.map((function(t4, e3) { return t4.data.filter((function(t5, e4, i3) { return i3.findIndex((function(e5) { return e5.x === t5.x; })) === e4; })); })), r2 = s2.reduce((function(t4, e3, i3, a3) { return a3[t4].length > e3.length ? t4 : i3; }), 0), n2 = 0; n2 < s2[r2].length; n2++) a2.push(n2 + 1); else for (var o2 = 0; o2 < e2.series[e2.maxValsInArrayIndex].length; o2++) a2.push(o2 + 1); e2.seriesX = []; for (var l2 = 0; l2 < t3.length; l2++) e2.seriesX.push(a2); this.w.globals.isBarHorizontal || (e2.isXNumeric = true); } if (0 === a2.length) { a2 = e2.axisCharts ? [] : e2.series.map((function(t4, e3) { return e3 + 1; })); for (var h2 = 0; h2 < t3.length; h2++) e2.seriesX.push(a2); } e2.labels = a2, i2.xaxis.convertedCatToNumeric && (e2.categoryLabels = a2.map((function(t4) { return i2.xaxis.labels.formatter(t4); }))), e2.noLabelsProvided = true; } }, { key: "parseRawDataIfNeeded", value: function(t3) { var e2 = this, i2 = this.w.config, a2 = this.w.globals, s2 = i2.parsing; if (a2.dataWasParsed) return t3; if (!s2 && !t3.some((function(t4) { return t4.parsing; }))) return t3; var r2 = t3.map((function(t4, i3) { var a3, r3, n2; if (!t4.data || !Array.isArray(t4.data) || 0 === t4.data.length) return t4; var o2 = { x: (null === (a3 = t4.parsing) || void 0 === a3 ? void 0 : a3.x) || (null == s2 ? void 0 : s2.x), y: (null === (r3 = t4.parsing) || void 0 === r3 ? void 0 : r3.y) || (null == s2 ? void 0 : s2.y), z: (null === (n2 = t4.parsing) || void 0 === n2 ? void 0 : n2.z) || (null == s2 ? void 0 : s2.z) }; if (!o2.x && !o2.y) return t4; var l2 = t4.data[0]; if ("object" === b(l2) && null !== l2 && (l2.hasOwnProperty("x") || l2.hasOwnProperty("y")) || Array.isArray(l2)) return t4; if (!o2.x || !o2.y || Array.isArray(o2.y) && 0 === o2.y.length) return console.warn("ApexCharts: Series ".concat(i3, " has parsing config but missing x or y field specification")), t4; var h2 = t4.data.map((function(t5, a4) { if ("object" !== b(t5) || null === t5) return console.warn("ApexCharts: Series ".concat(i3, ", data point ").concat(a4, " is not an object, skipping parsing")), t5; var s3, r4 = e2.getNestedValue(t5, o2.x), n3 = void 0; if (Array.isArray(o2.y)) { var l3 = o2.y.map((function(i4) { return e2.getNestedValue(t5, i4); })); s3 = "bubble" === e2.w.config.chart.type && 2 === l3.length ? l3[0] : l3; } else s3 = e2.getNestedValue(t5, o2.y); o2.z && (n3 = e2.getNestedValue(t5, o2.z)), void 0 === r4 && console.warn("ApexCharts: Series ".concat(i3, ", data point ").concat(a4, " missing field '").concat(o2.x, "'")), void 0 === s3 && console.warn("ApexCharts: Series ".concat(i3, ", data point ").concat(a4, " missing field '").concat(o2.y, "'")); var h3 = { x: r4, y: s3 }; if ("bubble" === e2.w.config.chart.type && Array.isArray(o2.y) && 2 === o2.y.length) { var c2 = e2.getNestedValue(t5, o2.y[1]); void 0 !== c2 && (h3.z = c2); } return void 0 !== n3 && (h3.z = n3), h3; })); return u(u({}, t4), {}, { data: h2, __apexParsed: true }); })); return a2.dataWasParsed = true, a2.originalSeries || (a2.originalSeries = v.clone(t3)), r2; } }, { key: "getNestedValue", value: function(t3, e2) { if (t3 && "object" === b(t3) && e2) { if (-1 === e2.indexOf(".")) return t3[e2]; for (var i2 = e2.split("."), a2 = t3, s2 = 0; s2 < i2.length; s2++) { if (null == a2 || "object" !== b(a2)) return; a2 = a2[i2[s2]]; } return a2; } } }, { key: "parseData", value: function(t3) { var e2 = this.w, i2 = e2.config, a2 = e2.globals; if (t3 = this.parseRawDataIfNeeded(t3), i2.series = t3, a2.initialSeries = v.clone(t3), this.excludeCollapsedSeriesInYAxis(), this.fallbackToCategory = false, this.ctx.core.resetGlobals(), this.ctx.core.isMultipleY(), a2.axisCharts ? (this.parseDataAxisCharts(t3), this.coreUtils.getLargestSeries()) : this.parseDataNonAxisCharts(t3), i2.chart.stacked) { var s2 = new $i(this.ctx); a2.series = s2.setNullSeriesToZeroValues(a2.series); } this.coreUtils.getSeriesTotals(), a2.axisCharts && (a2.stackedSeriesTotals = this.coreUtils.getStackedSeriesTotals(), a2.stackedSeriesTotalsByGroups = this.coreUtils.getStackedSeriesTotalsByGroups()), this.coreUtils.getPercentSeries(), a2.dataFormatXNumeric || a2.isXNumeric && ("numeric" !== i2.xaxis.type || 0 !== i2.labels.length || 0 !== i2.xaxis.categories.length) || this.handleExternalLabelsData(t3); for (var r2 = this.coreUtils.getCategoryLabels(a2.labels), n2 = 0; n2 < r2.length; n2++) if (Array.isArray(r2[n2])) { a2.isMultiLineX = true; break; } } }, { key: "excludeCollapsedSeriesInYAxis", value: function() { var t3 = this.w, e2 = []; t3.globals.seriesYAxisMap.forEach((function(i2, a2) { var s2 = 0; i2.forEach((function(e3) { -1 !== t3.globals.collapsedSeriesIndices.indexOf(e3) && s2++; })), s2 > 0 && s2 == i2.length && e2.push(a2); })), t3.globals.ignoreYAxisIndexes = e2.map((function(t4) { return t4; })); } }]), t2; })(); var Qi = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "svgStringToNode", value: function(t3) { return new DOMParser().parseFromString(t3, "image/svg+xml").documentElement; } }, { key: "scaleSvgNode", value: function(t3, e2) { var i2 = parseFloat(t3.getAttributeNS(null, "width")), a2 = parseFloat(t3.getAttributeNS(null, "height")); t3.setAttributeNS(null, "width", i2 * e2), t3.setAttributeNS(null, "height", a2 * e2), t3.setAttributeNS(null, "viewBox", "0 0 " + i2 + " " + a2); } }, { key: "getSvgString", value: function(t3) { var e2 = this; return new Promise((function(i2) { var a2 = e2.w, s2 = t3 || a2.config.chart.toolbar.export.scale || a2.config.chart.toolbar.export.width / a2.globals.svgWidth; s2 || (s2 = 1); var r2 = a2.globals.svgWidth * s2, n2 = a2.globals.svgHeight * s2, o2 = a2.globals.dom.elWrap.cloneNode(true); o2.style.width = r2 + "px", o2.style.height = n2 + "px"; var l2 = new XMLSerializer().serializeToString(o2), h2 = "\n .apexcharts-tooltip, .apexcharts-toolbar, .apexcharts-xaxistooltip, .apexcharts-yaxistooltip, .apexcharts-xcrosshairs, .apexcharts-ycrosshairs, .apexcharts-zoom-rect, .apexcharts-selection-rect {\n display: none;\n }\n "; a2.config.legend.show && a2.globals.dom.elLegendWrap && a2.globals.dom.elLegendWrap.children.length > 0 && (h2 += Zi); var c2 = '\n <svg xmlns="http://www.w3.org/2000/svg"\n version="1.1"\n xmlns:xlink="http://www.w3.org/1999/xlink"\n class="apexcharts-svg"\n xmlns:data="ApexChartsNS"\n transform="translate(0, 0)"\n width="'.concat(a2.globals.svgWidth, 'px" height="').concat(a2.globals.svgHeight, 'px">\n <foreignObject width="100%" height="100%">\n <div xmlns="http://www.w3.org/1999/xhtml" style="width:').concat(r2, "px; height:").concat(n2, 'px;">\n <style type="text/css">\n ').concat(h2, "\n </style>\n ").concat(l2, "\n </div>\n </foreignObject>\n </svg>\n "), d2 = e2.svgStringToNode(c2); 1 !== s2 && e2.scaleSvgNode(d2, s2), e2.convertImagesToBase64(d2).then((function() { c2 = new XMLSerializer().serializeToString(d2), i2(c2.replace(/ /g, " ")); })); })); } }, { key: "convertImagesToBase64", value: function(t3) { var e2 = this, i2 = t3.getElementsByTagName("image"), a2 = Array.from(i2).map((function(t4) { var i3 = t4.getAttributeNS("http://www.w3.org/1999/xlink", "href"); return i3 && !i3.startsWith("data:") ? e2.getBase64FromUrl(i3).then((function(e3) { t4.setAttributeNS("http://www.w3.org/1999/xlink", "href", e3); })).catch((function(t5) { console.error("Error converting image to base64:", t5); })) : Promise.resolve(); })); return Promise.all(a2); } }, { key: "getBase64FromUrl", value: function(t3) { return new Promise((function(e2, i2) { var a2 = new Image(); a2.crossOrigin = "Anonymous", a2.onload = function() { var t4 = document.createElement("canvas"); t4.width = a2.width, t4.height = a2.height, t4.getContext("2d").drawImage(a2, 0, 0), e2(t4.toDataURL()); }, a2.onerror = i2, a2.src = t3; })); } }, { key: "svgUrl", value: function() { var t3 = this; return new Promise((function(e2) { t3.getSvgString().then((function(t4) { var i2 = new Blob([t4], { type: "image/svg+xml;charset=utf-8" }); e2(URL.createObjectURL(i2)); })); })); } }, { key: "dataURI", value: function(t3) { var e2 = this; return new Promise((function(i2) { var a2 = e2.w, s2 = t3 ? t3.scale || t3.width / a2.globals.svgWidth : 1, r2 = document.createElement("canvas"); r2.width = a2.globals.svgWidth * s2, r2.height = parseInt(a2.globals.dom.elWrap.style.height, 10) * s2; var n2 = "transparent" !== a2.config.chart.background && a2.config.chart.background ? a2.config.chart.background : "#fff", o2 = r2.getContext("2d"); o2.fillStyle = n2, o2.fillRect(0, 0, r2.width * s2, r2.height * s2), e2.getSvgString(s2).then((function(t4) { var e3 = "data:image/svg+xml," + encodeURIComponent(t4), a3 = new Image(); a3.crossOrigin = "anonymous", a3.onload = function() { if (o2.drawImage(a3, 0, 0), r2.msToBlob) { var t5 = r2.msToBlob(); i2({ blob: t5 }); } else { var e4 = r2.toDataURL("image/png"); i2({ imgURI: e4 }); } }, a3.src = e3; })); })); } }, { key: "exportToSVG", value: function() { var t3 = this; this.svgUrl().then((function(e2) { t3.triggerDownload(e2, t3.w.config.chart.toolbar.export.svg.filename, ".svg"); })); } }, { key: "exportToPng", value: function() { var t3 = this, e2 = this.w.config.chart.toolbar.export.scale, i2 = this.w.config.chart.toolbar.export.width, a2 = e2 ? { scale: e2 } : i2 ? { width: i2 } : void 0; this.dataURI(a2).then((function(e3) { var i3 = e3.imgURI, a3 = e3.blob; a3 ? navigator.msSaveOrOpenBlob(a3, t3.w.globals.chartID + ".png") : t3.triggerDownload(i3, t3.w.config.chart.toolbar.export.png.filename, ".png"); })); } }, { key: "exportToCSV", value: function(t3) { var e2 = this, i2 = t3.series, a2 = t3.fileName, s2 = t3.columnDelimiter, r2 = void 0 === s2 ? "," : s2, n2 = t3.lineDelimiter, o2 = void 0 === n2 ? "\n" : n2, l2 = this.w; i2 || (i2 = l2.config.series); var h2 = [], c2 = [], d2 = "", u2 = l2.globals.series.map((function(t4, e3) { return -1 === l2.globals.collapsedSeriesIndices.indexOf(e3) ? t4 : []; })), g2 = function(t4) { return "function" == typeof l2.config.chart.toolbar.export.csv.categoryFormatter ? l2.config.chart.toolbar.export.csv.categoryFormatter(t4) : "datetime" === l2.config.xaxis.type && String(t4).length >= 10 ? new Date(t4).toDateString() : v.isNumber(t4) ? t4 : t4.split(r2).join(""); }, p2 = function(t4) { return "function" == typeof l2.config.chart.toolbar.export.csv.valueFormatter ? l2.config.chart.toolbar.export.csv.valueFormatter(t4) : t4; }, x2 = Math.max.apply(Math, f(i2.map((function(t4) { return t4.data ? t4.data.length : 0; })))), b2 = new Ji(this.ctx), m2 = new Ri(this.ctx), y2 = function(t4) { var i3 = ""; if (l2.globals.axisCharts) { if ("category" === l2.config.xaxis.type || l2.config.xaxis.convertedCatToNumeric) if (l2.globals.isBarHorizontal) { var a3 = l2.globals.yLabelFormatters[0], s3 = new $i(e2.ctx).getActiveConfigSeriesIndex(); i3 = a3(l2.globals.labels[t4], { seriesIndex: s3, dataPointIndex: t4, w: l2 }); } else i3 = m2.getLabel(l2.globals.labels, l2.globals.timescaleLabels, 0, t4).text; "datetime" === l2.config.xaxis.type && (l2.config.xaxis.categories.length ? i3 = l2.config.xaxis.categories[t4] : l2.config.labels.length && (i3 = l2.config.labels[t4])); } else i3 = l2.config.labels[t4]; return null === i3 ? "nullvalue" : (Array.isArray(i3) && (i3 = i3.join(" ")), v.isNumber(i3) ? i3 : i3.split(r2).join("")); }, w2 = function(t4, e3) { if (h2.length && 0 === e3 && c2.push(h2.join(r2)), t4.data) { t4.data = t4.data.length && t4.data || f(Array(x2)).map((function() { return ""; })); for (var a3 = 0; a3 < t4.data.length; a3++) { h2 = []; var s3 = y2(a3); if ("nullvalue" !== s3) { if (s3 || (b2.isFormatXY() ? s3 = i2[e3].data[a3].x : b2.isFormat2DArray() && (s3 = i2[e3].data[a3] ? i2[e3].data[a3][0] : "")), 0 === e3) { h2.push(g2(s3)); for (var n3 = 0; n3 < l2.globals.series.length; n3++) { var o3, d3 = b2.isFormatXY() ? null === (o3 = i2[n3].data[a3]) || void 0 === o3 ? void 0 : o3.y : u2[n3][a3]; h2.push(p2(d3)); } } ("candlestick" === l2.config.chart.type || t4.type && "candlestick" === t4.type) && (h2.pop(), h2.push(l2.globals.seriesCandleO[e3][a3]), h2.push(l2.globals.seriesCandleH[e3][a3]), h2.push(l2.globals.seriesCandleL[e3][a3]), h2.push(l2.globals.seriesCandleC[e3][a3])), ("boxPlot" === l2.config.chart.type || t4.type && "boxPlot" === t4.type) && (h2.pop(), h2.push(l2.globals.seriesCandleO[e3][a3]), h2.push(l2.globals.seriesCandleH[e3][a3]), h2.push(l2.globals.seriesCandleM[e3][a3]), h2.push(l2.globals.seriesCandleL[e3][a3]), h2.push(l2.globals.seriesCandleC[e3][a3])), "rangeBar" === l2.config.chart.type && (h2.pop(), h2.push(l2.globals.seriesRangeStart[e3][a3]), h2.push(l2.globals.seriesRangeEnd[e3][a3])), h2.length && c2.push(h2.join(r2)); } } } }; h2.push(l2.config.chart.toolbar.export.csv.headerCategory), "boxPlot" === l2.config.chart.type ? (h2.push("minimum"), h2.push("q1"), h2.push("median"), h2.push("q3"), h2.push("maximum")) : "candlestick" === l2.config.chart.type ? (h2.push("open"), h2.push("high"), h2.push("low"), h2.push("close")) : "rangeBar" === l2.config.chart.type ? (h2.push("minimum"), h2.push("maximum")) : i2.map((function(t4, e3) { var i3 = (t4.name ? t4.name : "series-".concat(e3)) + ""; l2.globals.axisCharts && h2.push(i3.split(r2).join("") ? i3.split(r2).join("") : "series-".concat(e3)); })), l2.globals.axisCharts || (h2.push(l2.config.chart.toolbar.export.csv.headerValue), c2.push(h2.join(r2))), l2.globals.allSeriesHasEqualX || !l2.globals.axisCharts || l2.config.xaxis.categories.length || l2.config.labels.length ? i2.map((function(t4, e3) { l2.globals.axisCharts ? w2(t4, e3) : ((h2 = []).push(g2(l2.globals.labels[e3])), h2.push(p2(u2[e3])), c2.push(h2.join(r2))); })) : (function() { var t4 = /* @__PURE__ */ new Set(), e3 = {}; i2.forEach((function(a3, s3) { null == a3 || a3.data.forEach((function(a4) { var r3, n3; if (b2.isFormatXY()) r3 = a4.x, n3 = a4.y; else { if (!b2.isFormat2DArray()) return; r3 = a4[0], n3 = a4[1]; } e3[r3] || (e3[r3] = Array(i2.length).fill("")), e3[r3][s3] = p2(n3), t4.add(r3); })); })), h2.length && c2.push(h2.join(r2)), Array.from(t4).sort().forEach((function(t5) { c2.push([g2(t5), e3[t5].join(r2)]); })); })(), d2 += c2.join(o2), this.triggerDownload("data:text/csv; charset=utf-8," + encodeURIComponent("\uFEFF" + d2), a2 || l2.config.chart.toolbar.export.csv.filename, ".csv"); } }, { key: "triggerDownload", value: function(t3, e2, i2) { var a2 = document.createElement("a"); a2.href = t3, a2.download = (e2 || this.w.globals.chartID) + i2, document.body.appendChild(a2), a2.click(), document.body.removeChild(a2); } }]), t2; })(); var Ki = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.elgrid = a2, this.w = e2.w; var s2 = this.w; this.axesUtils = new Ri(e2), this.xaxisLabels = s2.globals.labels.slice(), s2.globals.timescaleLabels.length > 0 && !s2.globals.isBarHorizontal && (this.xaxisLabels = s2.globals.timescaleLabels.slice()), s2.config.xaxis.overwriteCategories && (this.xaxisLabels = s2.config.xaxis.overwriteCategories), this.drawnLabels = [], this.drawnLabelsRects = [], "top" === s2.config.xaxis.position ? this.offY = 0 : this.offY = s2.globals.gridHeight, this.offY = this.offY + s2.config.xaxis.axisBorder.offsetY, this.isCategoryBarHorizontal = "bar" === s2.config.chart.type && s2.config.plotOptions.bar.horizontal, this.xaxisFontSize = s2.config.xaxis.labels.style.fontSize, this.xaxisFontFamily = s2.config.xaxis.labels.style.fontFamily, this.xaxisForeColors = s2.config.xaxis.labels.style.colors, this.xaxisBorderWidth = s2.config.xaxis.axisBorder.width, this.isCategoryBarHorizontal && (this.xaxisBorderWidth = s2.config.yaxis[0].axisBorder.width.toString()), String(this.xaxisBorderWidth).indexOf("%") > -1 ? this.xaxisBorderWidth = s2.globals.gridWidth * parseInt(this.xaxisBorderWidth, 10) / 100 : this.xaxisBorderWidth = parseInt(this.xaxisBorderWidth, 10), this.xaxisBorderHeight = s2.config.xaxis.axisBorder.height, this.yaxis = s2.config.yaxis[0]; } return s(t2, [{ key: "drawXaxis", value: function() { var t3 = this.w, e2 = new Mi(this.ctx), i2 = e2.group({ class: "apexcharts-xaxis", transform: "translate(".concat(t3.config.xaxis.offsetX, ", ").concat(t3.config.xaxis.offsetY, ")") }), a2 = e2.group({ class: "apexcharts-xaxis-texts-g", transform: "translate(".concat(t3.globals.translateXAxisX, ", ").concat(t3.globals.translateXAxisY, ")") }); i2.add(a2); for (var s2 = [], r2 = 0; r2 < this.xaxisLabels.length; r2++) s2.push(this.xaxisLabels[r2]); if (this.drawXAxisLabelAndGroup(true, e2, a2, s2, t3.globals.isXNumeric, (function(t4, e3) { return e3; })), t3.globals.hasXaxisGroups) { var n2 = t3.globals.groups; s2 = []; for (var o2 = 0; o2 < n2.length; o2++) s2.push(n2[o2].title); var l2 = {}; t3.config.xaxis.group.style && (l2.xaxisFontSize = t3.config.xaxis.group.style.fontSize, l2.xaxisFontFamily = t3.config.xaxis.group.style.fontFamily, l2.xaxisForeColors = t3.config.xaxis.group.style.colors, l2.fontWeight = t3.config.xaxis.group.style.fontWeight, l2.cssClass = t3.config.xaxis.group.style.cssClass), this.drawXAxisLabelAndGroup(false, e2, a2, s2, false, (function(t4, e3) { return n2[t4].cols * e3; }), l2); } if (void 0 !== t3.config.xaxis.title.text) { var h2 = e2.group({ class: "apexcharts-xaxis-title" }), c2 = e2.drawText({ x: t3.globals.gridWidth / 2 + t3.config.xaxis.title.offsetX, y: this.offY + parseFloat(this.xaxisFontSize) + ("bottom" === t3.config.xaxis.position ? t3.globals.xAxisLabelsHeight : -t3.globals.xAxisLabelsHeight - 10) + t3.config.xaxis.title.offsetY, text: t3.config.xaxis.title.text, textAnchor: "middle", fontSize: t3.config.xaxis.title.style.fontSize, fontFamily: t3.config.xaxis.title.style.fontFamily, fontWeight: t3.config.xaxis.title.style.fontWeight, foreColor: t3.config.xaxis.title.style.color, cssClass: "apexcharts-xaxis-title-text " + t3.config.xaxis.title.style.cssClass }); h2.add(c2), i2.add(h2); } if (t3.config.xaxis.axisBorder.show) { var d2 = t3.globals.barPadForNumericAxis, u2 = e2.drawLine(t3.globals.padHorizontal + t3.config.xaxis.axisBorder.offsetX - d2, this.offY, this.xaxisBorderWidth + d2, this.offY, t3.config.xaxis.axisBorder.color, 0, this.xaxisBorderHeight); this.elgrid && this.elgrid.elGridBorders && t3.config.grid.show ? this.elgrid.elGridBorders.add(u2) : i2.add(u2); } return i2; } }, { key: "drawXAxisLabelAndGroup", value: function(t3, e2, i2, a2, s2, r2) { var n2, o2 = this, l2 = arguments.length > 6 && void 0 !== arguments[6] ? arguments[6] : {}, h2 = [], c2 = [], d2 = this.w, u2 = l2.xaxisFontSize || this.xaxisFontSize, g2 = l2.xaxisFontFamily || this.xaxisFontFamily, p2 = l2.xaxisForeColors || this.xaxisForeColors, f2 = l2.fontWeight || d2.config.xaxis.labels.style.fontWeight, x2 = l2.cssClass || d2.config.xaxis.labels.style.cssClass, b2 = d2.globals.padHorizontal, m2 = a2.length, v2 = "category" === d2.config.xaxis.type ? d2.globals.dataPoints : m2; if (0 === v2 && m2 > v2 && (v2 = m2), s2) { var y2 = Math.max(Number(d2.config.xaxis.tickAmount) || 1, v2 > 1 ? v2 - 1 : v2); n2 = d2.globals.gridWidth / Math.min(y2, m2 - 1), b2 = b2 + r2(0, n2) / 2 + d2.config.xaxis.labels.offsetX; } else n2 = d2.globals.gridWidth / v2, b2 = b2 + r2(0, n2) + d2.config.xaxis.labels.offsetX; for (var w2 = function(s3) { var l3 = b2 - r2(s3, n2) / 2 + d2.config.xaxis.labels.offsetX; 0 === s3 && 1 === m2 && n2 / 2 === b2 && 1 === v2 && (l3 = d2.globals.gridWidth / 2); var y3 = o2.axesUtils.getLabel(a2, d2.globals.timescaleLabels, l3, s3, h2, u2, t3), w3 = 28; d2.globals.rotateXLabels && t3 && (w3 = 22), d2.config.xaxis.title.text && "top" === d2.config.xaxis.position && (w3 += parseFloat(d2.config.xaxis.title.style.fontSize) + 2), t3 || (w3 = w3 + parseFloat(u2) + (d2.globals.xAxisLabelsHeight - d2.globals.xAxisGroupLabelsHeight) + (d2.globals.rotateXLabels ? 10 : 0)), y3 = void 0 !== d2.config.xaxis.tickAmount && "dataPoints" !== d2.config.xaxis.tickAmount && "datetime" !== d2.config.xaxis.type ? o2.axesUtils.checkLabelBasedOnTickamount(s3, y3, m2) : o2.axesUtils.checkForOverflowingLabels(s3, y3, m2, h2, c2); if (d2.config.xaxis.labels.show) { var k3 = e2.drawText({ x: y3.x, y: o2.offY + d2.config.xaxis.labels.offsetY + w3 - ("top" === d2.config.xaxis.position ? d2.globals.xAxisHeight + d2.config.xaxis.axisTicks.height - 2 : 0), text: y3.text, textAnchor: "middle", fontWeight: y3.isBold ? 600 : f2, fontSize: u2, fontFamily: g2, foreColor: Array.isArray(p2) ? t3 && d2.config.xaxis.convertedCatToNumeric ? p2[d2.globals.minX + s3 - 1] : p2[s3] : p2, isPlainText: false, cssClass: (t3 ? "apexcharts-xaxis-label " : "apexcharts-xaxis-group-label ") + x2 }); if (i2.add(k3), k3.on("click", (function(t4) { if ("function" == typeof d2.config.chart.events.xAxisLabelClick) { var e3 = Object.assign({}, d2, { labelIndex: s3 }); d2.config.chart.events.xAxisLabelClick(t4, o2.ctx, e3); } })), t3) { var A2 = document.createElementNS(d2.globals.SVGNS, "title"); A2.textContent = Array.isArray(y3.text) ? y3.text.join(" ") : y3.text, k3.node.appendChild(A2), "" !== y3.text && (h2.push(y3.text), c2.push(y3)); } } s3 < m2 - 1 && (b2 += r2(s3 + 1, n2)); }, k2 = 0; k2 <= m2 - 1; k2++) w2(k2); } }, { key: "drawXaxisInversed", value: function(t3) { var e2, i2, a2 = this, s2 = this.w, r2 = new Mi(this.ctx), n2 = s2.config.yaxis[0].opposite ? s2.globals.translateYAxisX[t3] : 0, o2 = r2.group({ class: "apexcharts-yaxis apexcharts-xaxis-inversed", rel: t3 }), l2 = r2.group({ class: "apexcharts-yaxis-texts-g apexcharts-xaxis-inversed-texts-g", transform: "translate(" + n2 + ", 0)" }); o2.add(l2); var h2 = []; if (s2.config.yaxis[t3].show) for (var c2 = 0; c2 < this.xaxisLabels.length; c2++) h2.push(this.xaxisLabels[c2]); e2 = s2.globals.gridHeight / h2.length, i2 = -e2 / 2.2; var d2 = s2.globals.yLabelFormatters[0], u2 = s2.config.yaxis[0].labels; if (u2.show) for (var g2 = function(n3) { var o3 = void 0 === h2[n3] ? "" : h2[n3]; o3 = d2(o3, { seriesIndex: t3, dataPointIndex: n3, w: s2 }); var c3 = a2.axesUtils.getYAxisForeColor(u2.style.colors, t3), g3 = 0; Array.isArray(o3) && (g3 = o3.length / 2 * parseInt(u2.style.fontSize, 10)); var p3 = u2.offsetX - 15, f3 = "end"; a2.yaxis.opposite && (f3 = "start"), "left" === s2.config.yaxis[0].labels.align ? (p3 = u2.offsetX, f3 = "start") : "center" === s2.config.yaxis[0].labels.align ? (p3 = u2.offsetX, f3 = "middle") : "right" === s2.config.yaxis[0].labels.align && (f3 = "end"); var x3 = r2.drawText({ x: p3, y: i2 + e2 + u2.offsetY - g3, text: o3, textAnchor: f3, foreColor: Array.isArray(c3) ? c3[n3] : c3, fontSize: u2.style.fontSize, fontFamily: u2.style.fontFamily, fontWeight: u2.style.fontWeight, isPlainText: false, cssClass: "apexcharts-yaxis-label " + u2.style.cssClass, maxWidth: u2.maxWidth }); l2.add(x3), x3.on("click", (function(t4) { if ("function" == typeof s2.config.chart.events.xAxisLabelClick) { var e3 = Object.assign({}, s2, { labelIndex: n3 }); s2.config.chart.events.xAxisLabelClick(t4, a2.ctx, e3); } })); var b3 = document.createElementNS(s2.globals.SVGNS, "title"); if (b3.textContent = Array.isArray(o3) ? o3.join(" ") : o3, x3.node.appendChild(b3), 0 !== s2.config.yaxis[t3].labels.rotate) { var m3 = r2.rotateAroundCenter(x3.node); x3.node.setAttribute("transform", "rotate(".concat(s2.config.yaxis[t3].labels.rotate, " 0 ").concat(m3.y, ")")); } i2 += e2; }, p2 = 0; p2 <= h2.length - 1; p2++) g2(p2); if (void 0 !== s2.config.yaxis[0].title.text) { var f2 = r2.group({ class: "apexcharts-yaxis-title apexcharts-xaxis-title-inversed", transform: "translate(" + n2 + ", 0)" }), x2 = r2.drawText({ x: s2.config.yaxis[0].title.offsetX, y: s2.globals.gridHeight / 2 + s2.config.yaxis[0].title.offsetY, text: s2.config.yaxis[0].title.text, textAnchor: "middle", foreColor: s2.config.yaxis[0].title.style.color, fontSize: s2.config.yaxis[0].title.style.fontSize, fontWeight: s2.config.yaxis[0].title.style.fontWeight, fontFamily: s2.config.yaxis[0].title.style.fontFamily, cssClass: "apexcharts-yaxis-title-text " + s2.config.yaxis[0].title.style.cssClass }); f2.add(x2), o2.add(f2); } var b2 = 0; this.isCategoryBarHorizontal && s2.config.yaxis[0].opposite && (b2 = s2.globals.gridWidth); var m2 = s2.config.xaxis.axisBorder; if (m2.show) { var v2 = r2.drawLine(s2.globals.padHorizontal + m2.offsetX + b2, 1 + m2.offsetY, s2.globals.padHorizontal + m2.offsetX + b2, s2.globals.gridHeight + m2.offsetY, m2.color, 0); this.elgrid && this.elgrid.elGridBorders && s2.config.grid.show ? this.elgrid.elGridBorders.add(v2) : o2.add(v2); } return s2.config.yaxis[0].axisTicks.show && this.axesUtils.drawYAxisTicks(b2, h2.length, s2.config.yaxis[0].axisBorder, s2.config.yaxis[0].axisTicks, 0, e2, o2), o2; } }, { key: "drawXaxisTicks", value: function(t3, e2, i2) { var a2 = this.w, s2 = t3; if (!(t3 < 0 || t3 - 2 > a2.globals.gridWidth)) { var r2 = this.offY + a2.config.xaxis.axisTicks.offsetY; if (e2 = e2 + r2 + a2.config.xaxis.axisTicks.height, "top" === a2.config.xaxis.position && (e2 = r2 - a2.config.xaxis.axisTicks.height), a2.config.xaxis.axisTicks.show) { var n2 = new Mi(this.ctx).drawLine(t3 + a2.config.xaxis.axisTicks.offsetX, r2 + a2.config.xaxis.offsetY, s2 + a2.config.xaxis.axisTicks.offsetX, e2 + a2.config.xaxis.offsetY, a2.config.xaxis.axisTicks.color); i2.add(n2), n2.node.classList.add("apexcharts-xaxis-tick"); } } } }, { key: "getXAxisTicksPositions", value: function() { var t3 = this.w, e2 = [], i2 = this.xaxisLabels.length, a2 = t3.globals.padHorizontal; if (t3.globals.timescaleLabels.length > 0) for (var s2 = 0; s2 < i2; s2++) a2 = this.xaxisLabels[s2].position, e2.push(a2); else for (var r2 = i2, n2 = 0; n2 < r2; n2++) { var o2 = r2; t3.globals.isXNumeric && "bar" !== t3.config.chart.type && (o2 -= 1), a2 += t3.globals.gridWidth / o2, e2.push(a2); } return e2; } }, { key: "xAxisLabelCorrections", value: function() { var t3 = this.w, e2 = new Mi(this.ctx), i2 = t3.globals.dom.baseEl.querySelector(".apexcharts-xaxis-texts-g"), a2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-xaxis-texts-g text:not(.apexcharts-xaxis-group-label)"), s2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis-inversed text"), r2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-xaxis-inversed-texts-g text tspan"); if (t3.globals.rotateXLabels || t3.config.xaxis.labels.rotateAlways) for (var n2 = 0; n2 < a2.length; n2++) { var o2 = e2.rotateAroundCenter(a2[n2]); o2.y = o2.y - 1, o2.x = o2.x + 1, a2[n2].setAttribute("transform", "rotate(".concat(t3.config.xaxis.labels.rotate, " ").concat(o2.x, " ").concat(o2.y, ")")), a2[n2].setAttribute("text-anchor", "end"); i2.setAttribute("transform", "translate(0, ".concat(-10, ")")); var l2 = a2[n2].childNodes; t3.config.xaxis.labels.trim && Array.prototype.forEach.call(l2, (function(i3) { e2.placeTextWithEllipsis(i3, i3.textContent, t3.globals.xAxisLabelsHeight - ("bottom" === t3.config.legend.position ? 20 : 10)); })); } else !(function() { for (var i3 = t3.globals.gridWidth / (t3.globals.labels.length + 1), s3 = 0; s3 < a2.length; s3++) { var r3 = a2[s3].childNodes; t3.config.xaxis.labels.trim && "datetime" !== t3.config.xaxis.type && Array.prototype.forEach.call(r3, (function(t4) { e2.placeTextWithEllipsis(t4, t4.textContent, i3); })); } })(); if (s2.length > 0) { var h2 = s2[s2.length - 1].getBBox(), c2 = s2[0].getBBox(); h2.x < -20 && s2[s2.length - 1].parentNode.removeChild(s2[s2.length - 1]), c2.x + c2.width > t3.globals.gridWidth && !t3.globals.isBarHorizontal && s2[0].parentNode.removeChild(s2[0]); for (var d2 = 0; d2 < r2.length; d2++) e2.placeTextWithEllipsis(r2[d2], r2[d2].textContent, t3.config.yaxis[0].labels.maxWidth - (t3.config.yaxis[0].title.text ? 2 * parseFloat(t3.config.yaxis[0].title.style.fontSize) : 0) - 15); } } }]), t2; })(); var ta = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; var a2 = this.w; this.xaxisLabels = a2.globals.labels.slice(), this.axesUtils = new Ri(e2), this.isRangeBar = a2.globals.seriesRange.length && a2.globals.isBarHorizontal, a2.globals.timescaleLabels.length > 0 && (this.xaxisLabels = a2.globals.timescaleLabels.slice()); } return s(t2, [{ key: "drawGridArea", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, e2 = this.w, i2 = new Mi(this.ctx); t3 || (t3 = i2.group({ class: "apexcharts-grid" })); var a2 = i2.drawLine(e2.globals.padHorizontal, 1, e2.globals.padHorizontal, e2.globals.gridHeight, "transparent"), s2 = i2.drawLine(e2.globals.padHorizontal, e2.globals.gridHeight, e2.globals.gridWidth, e2.globals.gridHeight, "transparent"); return t3.add(s2), t3.add(a2), t3; } }, { key: "drawGrid", value: function() { if (this.w.globals.axisCharts) { var t3 = this.renderGrid(); return this.drawGridArea(t3.el), t3; } return null; } }, { key: "createGridMask", value: function() { var t3 = this.w, e2 = t3.globals, i2 = new Mi(this.ctx), a2 = Array.isArray(t3.config.stroke.width) ? Math.max.apply(Math, f(t3.config.stroke.width)) : t3.config.stroke.width, s2 = function(t4) { var i3 = document.createElementNS(e2.SVGNS, "clipPath"); return i3.setAttribute("id", t4), i3; }; e2.dom.elGridRectMask = s2("gridRectMask".concat(e2.cuid)), e2.dom.elGridRectBarMask = s2("gridRectBarMask".concat(e2.cuid)), e2.dom.elGridRectMarkerMask = s2("gridRectMarkerMask".concat(e2.cuid)), e2.dom.elForecastMask = s2("forecastMask".concat(e2.cuid)), e2.dom.elNonForecastMask = s2("nonForecastMask".concat(e2.cuid)); var r2 = 0, n2 = 0; (["bar", "rangeBar", "candlestick", "boxPlot"].includes(t3.config.chart.type) || t3.globals.comboBarCount > 0) && t3.globals.isXNumeric && !t3.globals.isBarHorizontal && (r2 = Math.max(t3.config.grid.padding.left, e2.barPadForNumericAxis), n2 = Math.max(t3.config.grid.padding.right, e2.barPadForNumericAxis)), e2.dom.elGridRect = i2.drawRect(-a2 / 2 - 2, -a2 / 2 - 2, e2.gridWidth + a2 + 4, e2.gridHeight + a2 + 4, 0, "#fff"), e2.dom.elGridRectBar = i2.drawRect(-a2 / 2 - r2 - 2, -a2 / 2 - 2, e2.gridWidth + a2 + n2 + r2 + 4, e2.gridHeight + a2 + 4, 0, "#fff"); var o2 = t3.globals.markers.largestSize; e2.dom.elGridRectMarker = i2.drawRect(Math.min(-a2 / 2 - r2 - 2, -o2), -o2, e2.gridWidth + Math.max(a2 + n2 + r2 + 4, 2 * o2), e2.gridHeight + 2 * o2, 0, "#fff"), e2.dom.elGridRectMask.appendChild(e2.dom.elGridRect.node), e2.dom.elGridRectBarMask.appendChild(e2.dom.elGridRectBar.node), e2.dom.elGridRectMarkerMask.appendChild(e2.dom.elGridRectMarker.node); var l2 = e2.dom.baseEl.querySelector("defs"); l2.appendChild(e2.dom.elGridRectMask), l2.appendChild(e2.dom.elGridRectBarMask), l2.appendChild(e2.dom.elGridRectMarkerMask), l2.appendChild(e2.dom.elForecastMask), l2.appendChild(e2.dom.elNonForecastMask); } }, { key: "_drawGridLines", value: function(t3) { var e2 = t3.i, i2 = t3.x1, a2 = t3.y1, s2 = t3.x2, r2 = t3.y2, n2 = t3.xCount, o2 = t3.parent, l2 = this.w; if (!(0 === e2 && l2.globals.skipFirstTimelinelabel || e2 === n2 - 1 && l2.globals.skipLastTimelinelabel && !l2.config.xaxis.labels.formatter || "radar" === l2.config.chart.type)) { l2.config.grid.xaxis.lines.show && this._drawGridLine({ i: e2, x1: i2, y1: a2, x2: s2, y2: r2, xCount: n2, parent: o2 }); var h2 = 0; if (l2.globals.hasXaxisGroups && "between" === l2.config.xaxis.tickPlacement) { var c2 = l2.globals.groups; if (c2) { for (var d2 = 0, u2 = 0; d2 < e2 && u2 < c2.length; u2++) d2 += c2[u2].cols; d2 === e2 && (h2 = 0.6 * l2.globals.xAxisLabelsHeight); } } new Ki(this.ctx).drawXaxisTicks(i2, h2, l2.globals.dom.elGraphical); } } }, { key: "_drawGridLine", value: function(t3) { var e2 = t3.i, i2 = t3.x1, a2 = t3.y1, s2 = t3.x2, r2 = t3.y2, n2 = t3.xCount, o2 = t3.parent, l2 = this.w, h2 = o2.node.classList.contains("apexcharts-gridlines-horizontal"), c2 = l2.globals.barPadForNumericAxis, d2 = 0 === a2 && 0 === r2 || 0 === i2 && 0 === s2 || a2 === l2.globals.gridHeight && r2 === l2.globals.gridHeight || l2.globals.isBarHorizontal && (0 === e2 || e2 === n2 - 1), u2 = new Mi(this).drawLine(i2 - (h2 ? c2 : 0), a2, s2 + (h2 ? c2 : 0), r2, l2.config.grid.borderColor, l2.config.grid.strokeDashArray); u2.node.classList.add("apexcharts-gridline"), d2 && l2.config.grid.show ? this.elGridBorders.add(u2) : o2.add(u2); } }, { key: "_drawGridBandRect", value: function(t3) { var e2 = t3.c, i2 = t3.x1, a2 = t3.y1, s2 = t3.x2, r2 = t3.y2, n2 = t3.type, o2 = this.w, l2 = new Mi(this.ctx), h2 = o2.globals.barPadForNumericAxis, c2 = o2.config.grid[n2].colors[e2], d2 = l2.drawRect(i2 - ("row" === n2 ? h2 : 0), a2, s2 + ("row" === n2 ? 2 * h2 : 0), r2, 0, c2, o2.config.grid[n2].opacity); this.elg.add(d2), d2.attr("clip-path", "url(#gridRectMask".concat(o2.globals.cuid, ")")), d2.node.classList.add("apexcharts-grid-".concat(n2)); } }, { key: "_drawXYLines", value: function(t3) { var e2 = this, i2 = t3.xCount, a2 = t3.tickAmount, s2 = this.w; if (s2.config.grid.xaxis.lines.show || s2.config.xaxis.axisTicks.show) { var r2, n2 = s2.globals.padHorizontal, o2 = s2.globals.gridHeight; s2.globals.timescaleLabels.length ? (function(t4) { for (var a3 = t4.xC, s3 = t4.x1, r3 = t4.y1, n3 = t4.x2, o3 = t4.y2, l3 = 0; l3 < a3; l3++) s3 = e2.xaxisLabels[l3].position, n3 = e2.xaxisLabels[l3].position, e2._drawGridLines({ i: l3, x1: s3, y1: r3, x2: n3, y2: o3, xCount: i2, parent: e2.elgridLinesV }); })({ xC: i2, x1: n2, y1: 0, x2: r2, y2: o2 }) : (s2.globals.isXNumeric && (i2 = s2.globals.xAxisScale.result.length), (function(t4) { for (var a3 = t4.xC, r3 = t4.x1, n3 = t4.y1, o3 = t4.x2, l3 = t4.y2, h3 = 0; h3 < a3 + (s2.globals.isXNumeric ? 0 : 1); h3++) 0 === h3 && 1 === a3 && 1 === s2.globals.dataPoints && (o3 = r3 = s2.globals.gridWidth / 2), e2._drawGridLines({ i: h3, x1: r3, y1: n3, x2: o3, y2: l3, xCount: i2, parent: e2.elgridLinesV }), o3 = r3 += s2.globals.gridWidth / (s2.globals.isXNumeric ? a3 - 1 : a3); })({ xC: i2, x1: n2, y1: 0, x2: r2, y2: o2 })); } if (s2.config.grid.yaxis.lines.show) { var l2 = 0, h2 = 0, c2 = s2.globals.gridWidth, d2 = a2 + 1; this.isRangeBar && (d2 = s2.globals.labels.length); for (var u2 = 0; u2 < d2 + (this.isRangeBar ? 1 : 0); u2++) this._drawGridLine({ i: u2, xCount: d2 + (this.isRangeBar ? 1 : 0), x1: 0, y1: l2, x2: c2, y2: h2, parent: this.elgridLinesH }), h2 = l2 += s2.globals.gridHeight / (this.isRangeBar ? d2 : a2); } } }, { key: "_drawInvertedXYLines", value: function(t3) { var e2 = t3.xCount, i2 = this.w; if (i2.config.grid.xaxis.lines.show || i2.config.xaxis.axisTicks.show) for (var a2, s2 = i2.globals.padHorizontal, r2 = i2.globals.gridHeight, n2 = 0; n2 < e2 + 1; n2++) { i2.config.grid.xaxis.lines.show && this._drawGridLine({ i: n2, xCount: e2 + 1, x1: s2, y1: 0, x2: a2, y2: r2, parent: this.elgridLinesV }), new Ki(this.ctx).drawXaxisTicks(s2, 0, i2.globals.dom.elGraphical), a2 = s2 += i2.globals.gridWidth / e2; } if (i2.config.grid.yaxis.lines.show) for (var o2 = 0, l2 = 0, h2 = i2.globals.gridWidth, c2 = 0; c2 < i2.globals.dataPoints + 1; c2++) this._drawGridLine({ i: c2, xCount: i2.globals.dataPoints + 1, x1: 0, y1: o2, x2: h2, y2: l2, parent: this.elgridLinesH }), l2 = o2 += i2.globals.gridHeight / i2.globals.dataPoints; } }, { key: "renderGrid", value: function() { var t3 = this.w, e2 = t3.globals, i2 = new Mi(this.ctx); this.elg = i2.group({ class: "apexcharts-grid" }), this.elgridLinesH = i2.group({ class: "apexcharts-gridlines-horizontal" }), this.elgridLinesV = i2.group({ class: "apexcharts-gridlines-vertical" }), this.elGridBorders = i2.group({ class: "apexcharts-grid-borders" }), this.elg.add(this.elgridLinesH), this.elg.add(this.elgridLinesV), t3.config.grid.show || (this.elgridLinesV.hide(), this.elgridLinesH.hide(), this.elGridBorders.hide()); for (var a2 = 0; a2 < e2.seriesYAxisMap.length && e2.ignoreYAxisIndexes.includes(a2); ) a2++; a2 === e2.seriesYAxisMap.length && (a2 = 0); var s2, r2 = e2.yAxisScale[a2].result.length - 1; if (!e2.isBarHorizontal || this.isRangeBar) { var n2, o2, l2; if (s2 = this.xaxisLabels.length, this.isRangeBar) r2 = e2.labels.length, t3.config.xaxis.tickAmount && t3.config.xaxis.labels.formatter && (s2 = t3.config.xaxis.tickAmount), (null === (n2 = e2.yAxisScale) || void 0 === n2 || null === (o2 = n2[a2]) || void 0 === o2 || null === (l2 = o2.result) || void 0 === l2 ? void 0 : l2.length) > 0 && "datetime" !== t3.config.xaxis.type && (s2 = e2.yAxisScale[a2].result.length - 1); this._drawXYLines({ xCount: s2, tickAmount: r2 }); } else s2 = r2, r2 = e2.xTickAmount, this._drawInvertedXYLines({ xCount: s2, tickAmount: r2 }); return this.drawGridBands(s2, r2), { el: this.elg, elGridBorders: this.elGridBorders, xAxisTickWidth: e2.gridWidth / s2 }; } }, { key: "drawGridBands", value: function(t3, e2) { var i2, a2, s2 = this, r2 = this.w; if ((null === (i2 = r2.config.grid.row.colors) || void 0 === i2 ? void 0 : i2.length) > 0 && (function(t4, i3, a3, n3, o3, l3) { for (var h3 = 0, c3 = 0; h3 < i3; h3++, c3++) c3 >= r2.config.grid[t4].colors.length && (c3 = 0), s2._drawGridBandRect({ c: c3, x1: a3, y1: n3, x2: o3, y2: l3, type: t4 }), n3 += r2.globals.gridHeight / e2; })("row", e2, 0, 0, r2.globals.gridWidth, r2.globals.gridHeight / e2), (null === (a2 = r2.config.grid.column.colors) || void 0 === a2 ? void 0 : a2.length) > 0) { var n2 = r2.globals.isBarHorizontal || "on" !== r2.config.xaxis.tickPlacement || "category" !== r2.config.xaxis.type && !r2.config.xaxis.convertedCatToNumeric ? t3 : t3 - 1; r2.globals.isXNumeric && (n2 = r2.globals.xAxisScale.result.length - 1); for (var o2 = r2.globals.padHorizontal, l2 = r2.globals.padHorizontal + r2.globals.gridWidth / n2, h2 = r2.globals.gridHeight, c2 = 0, d2 = 0; c2 < t3; c2++, d2++) { var u2; if (d2 >= r2.config.grid.column.colors.length && (d2 = 0), "datetime" === r2.config.xaxis.type) o2 = this.xaxisLabels[c2].position, l2 = ((null === (u2 = this.xaxisLabels[c2 + 1]) || void 0 === u2 ? void 0 : u2.position) || r2.globals.gridWidth) - this.xaxisLabels[c2].position; this._drawGridBandRect({ c: d2, x1: o2, y1: 0, x2: l2, y2: h2, type: "column" }), o2 += r2.globals.gridWidth / n2; } } } }]), t2; })(); var ea = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.coreUtils = new Pi(this.ctx); } return s(t2, [{ key: "niceScale", value: function(t3, e2) { var i2, a2, s2, r2, n2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, o2 = 1e-11, l2 = this.w, h2 = l2.globals; h2.isBarHorizontal ? (i2 = l2.config.xaxis, a2 = Math.max((h2.svgWidth - 100) / 25, 2)) : (i2 = l2.config.yaxis[n2], a2 = Math.max((h2.svgHeight - 100) / 15, 2)), v.isNumber(a2) || (a2 = 10), s2 = void 0 !== i2.min && null !== i2.min, r2 = void 0 !== i2.max && null !== i2.min; var c2 = void 0 !== i2.stepSize && null !== i2.stepSize, d2 = void 0 !== i2.tickAmount && null !== i2.tickAmount, u2 = d2 ? i2.tickAmount : h2.niceScaleDefaultTicks[Math.min(Math.round(a2 / 2), h2.niceScaleDefaultTicks.length - 1)]; if (h2.isMultipleYAxis && !d2 && h2.multiAxisTickAmount > 0 && (u2 = h2.multiAxisTickAmount, d2 = true), u2 = "dataPoints" === u2 ? h2.dataPoints - 1 : Math.abs(Math.round(u2)), (t3 === Number.MIN_VALUE && 0 === e2 || !v.isNumber(t3) && !v.isNumber(e2) || t3 === Number.MIN_VALUE && e2 === -Number.MAX_VALUE) && (t3 = v.isNumber(i2.min) ? i2.min : 0, e2 = v.isNumber(i2.max) ? i2.max : t3 + u2, h2.allSeriesCollapsed = false), t3 > e2) { console.warn("axis.min cannot be greater than axis.max: swapping min and max"); var g2 = e2; e2 = t3, t3 = g2; } else t3 === e2 && (t3 = 0 === t3 ? 0 : t3 - 1, e2 = 0 === e2 ? 2 : e2 + 1); var p2 = []; u2 < 1 && (u2 = 1); var f2 = u2, x2 = Math.abs(e2 - t3); !s2 && t3 > 0 && t3 / x2 < 0.15 && (t3 = 0, s2 = true), !r2 && e2 < 0 && -e2 / x2 < 0.15 && (e2 = 0, r2 = true); var b2 = (x2 = Math.abs(e2 - t3)) / f2, m2 = b2, y2 = Math.floor(Math.log10(m2)), w2 = Math.pow(10, y2), k2 = Math.ceil(m2 / w2); if (b2 = m2 = (k2 = h2.niceScaleAllowedMagMsd[0 === h2.yValueDecimal ? 0 : 1][k2]) * w2, h2.isBarHorizontal && i2.stepSize && "datetime" !== i2.type ? (b2 = i2.stepSize, c2 = true) : c2 && (b2 = i2.stepSize), c2 && i2.forceNiceScale) { var A2 = Math.floor(Math.log10(b2)); b2 *= Math.pow(10, y2 - A2); } if (s2 && r2) { var C2 = x2 / f2; if (d2) if (c2) if (0 != v.mod(x2, b2)) { var S2 = v.getGCD(b2, C2); b2 = C2 / S2 < 10 ? S2 : C2; } else 0 == v.mod(b2, C2) ? b2 = C2 : (C2 = b2, d2 = false); else b2 = C2; else if (c2) 0 == v.mod(x2, b2) ? C2 = b2 : b2 = C2; else if (0 == v.mod(x2, b2)) C2 = b2; else { C2 = x2 / (f2 = Math.ceil(x2 / b2)); var L2 = v.getGCD(x2, b2); x2 / L2 < a2 && (C2 = L2), b2 = C2; } f2 = Math.round(x2 / b2); } else { if (s2 || r2) { if (r2) if (d2) t3 = e2 - b2 * f2; else { var M2 = t3; t3 = b2 * Math.floor(t3 / b2), Math.abs(e2 - t3) / v.getGCD(x2, b2) > a2 && (t3 = e2 - b2 * u2, t3 += b2 * Math.floor((M2 - t3) / b2)); } else if (s2) if (d2) e2 = t3 + b2 * f2; else { var P2 = e2; e2 = b2 * Math.ceil(e2 / b2), Math.abs(e2 - t3) / v.getGCD(x2, b2) > a2 && (e2 = t3 + b2 * u2, e2 += b2 * Math.ceil((P2 - e2) / b2)); } } else if (h2.isMultipleYAxis && d2) { var I2 = b2 * Math.floor(t3 / b2), T2 = I2 + b2 * f2; T2 < e2 && (b2 *= 2), T2 = e2, e2 = (t3 = I2) + b2 * f2, x2 = Math.abs(e2 - t3), t3 > 0 && t3 < Math.abs(T2 - e2) && (t3 = 0, e2 = b2 * f2), e2 < 0 && -e2 < Math.abs(I2 - t3) && (e2 = 0, t3 = -b2 * f2); } else t3 = b2 * Math.floor(t3 / b2), e2 = b2 * Math.ceil(e2 / b2); x2 = Math.abs(e2 - t3), b2 = v.getGCD(x2, b2), f2 = Math.round(x2 / b2); } if (d2 || s2 || r2 || (f2 = Math.ceil((x2 - o2) / (b2 + o2))) > 16 && v.getPrimeFactors(f2).length < 2 && f2++, !d2 && i2.forceNiceScale && 0 === h2.yValueDecimal && f2 > x2 && (f2 = x2, b2 = Math.round(x2 / f2)), f2 > a2 && (!d2 && !c2 || i2.forceNiceScale)) { var z2 = v.getPrimeFactors(f2), X2 = z2.length - 1, R2 = f2; t: for (var E2 = 0; E2 < X2; E2++) for (var Y2 = 0; Y2 <= X2 - E2; Y2++) { for (var H2 = Math.min(Y2 + E2, X2), O2 = R2, F2 = 1, D2 = Y2; D2 <= H2; D2++) F2 *= z2[D2]; if ((O2 /= F2) < a2) { R2 = O2; break t; } } b2 = R2 === f2 ? x2 : x2 / R2, f2 = Math.round(x2 / b2); } h2.isMultipleYAxis && 0 == h2.multiAxisTickAmount && h2.ignoreYAxisIndexes.indexOf(n2) < 0 && (h2.multiAxisTickAmount = f2); var _2 = t3 - b2, N2 = b2 * o2; do { _2 += b2, p2.push(v.stripNumber(_2, 7)); } while (e2 - _2 > N2); return { result: p2, niceMin: p2[0], niceMax: p2[p2.length - 1] }; } }, { key: "linearScale", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 10, a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 0, s2 = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : void 0, r2 = Math.abs(e2 - t3), n2 = []; if (t3 === e2) return { result: n2 = [t3], niceMin: n2[0], niceMax: n2[n2.length - 1] }; "dataPoints" === (i2 = this._adjustTicksForSmallRange(i2, a2, r2)) && (i2 = this.w.globals.dataPoints - 1), s2 || (s2 = r2 / i2), s2 = Math.round(100 * (s2 + Number.EPSILON)) / 100, i2 === Number.MAX_VALUE && (i2 = 5, s2 = 1); for (var o2 = t3; i2 >= 0; ) n2.push(o2), o2 = v.preciseAddition(o2, s2), i2 -= 1; return { result: n2, niceMin: n2[0], niceMax: n2[n2.length - 1] }; } }, { key: "logarithmicScaleNice", value: function(t3, e2, i2) { e2 <= 0 && (e2 = Math.max(t3, i2)), t3 <= 0 && (t3 = Math.min(e2, i2)); for (var a2 = [], s2 = Math.ceil(Math.log(e2) / Math.log(i2) + 1), r2 = Math.floor(Math.log(t3) / Math.log(i2)); r2 < s2; r2++) a2.push(Math.pow(i2, r2)); return { result: a2, niceMin: a2[0], niceMax: a2[a2.length - 1] }; } }, { key: "logarithmicScale", value: function(t3, e2, i2) { e2 <= 0 && (e2 = Math.max(t3, i2)), t3 <= 0 && (t3 = Math.min(e2, i2)); for (var a2 = [], s2 = Math.log(e2) / Math.log(i2), r2 = Math.log(t3) / Math.log(i2), n2 = s2 - r2, o2 = Math.round(n2), l2 = n2 / o2, h2 = 0, c2 = r2; h2 < o2; h2++, c2 += l2) a2.push(Math.pow(i2, c2)); return a2.push(Math.pow(i2, s2)), { result: a2, niceMin: t3, niceMax: e2 }; } }, { key: "_adjustTicksForSmallRange", value: function(t3, e2, i2) { var a2 = t3; if (void 0 !== e2 && this.w.config.yaxis[e2].labels.formatter && void 0 === this.w.config.yaxis[e2].tickAmount) { var s2 = Number(this.w.config.yaxis[e2].labels.formatter(1)); v.isNumber(s2) && 0 === this.w.globals.yValueDecimal && (a2 = Math.ceil(i2)); } return a2 < t3 ? a2 : t3; } }, { key: "setYScaleForIndex", value: function(t3, e2, i2) { var a2 = this.w.globals, s2 = this.w.config, r2 = a2.isBarHorizontal ? s2.xaxis : s2.yaxis[t3]; void 0 === a2.yAxisScale[t3] && (a2.yAxisScale[t3] = []); var n2 = Math.abs(i2 - e2); r2.logarithmic && n2 <= 5 && (a2.invalidLogScale = true), r2.logarithmic && n2 > 5 ? (a2.allSeriesCollapsed = false, a2.yAxisScale[t3] = r2.forceNiceScale ? this.logarithmicScaleNice(e2, i2, r2.logBase) : this.logarithmicScale(e2, i2, r2.logBase)) : i2 !== -Number.MAX_VALUE && v.isNumber(i2) && e2 !== Number.MAX_VALUE && v.isNumber(e2) ? (a2.allSeriesCollapsed = false, a2.yAxisScale[t3] = this.niceScale(e2, i2, t3)) : a2.yAxisScale[t3] = this.niceScale(Number.MIN_VALUE, 0, t3); } }, { key: "setXScale", value: function(t3, e2) { var i2 = this.w, a2 = i2.globals; if (e2 !== -Number.MAX_VALUE && v.isNumber(e2)) { var s2 = a2.xTickAmount; a2.xAxisScale = this.linearScale(t3, e2, s2, 0, void 0 === i2.config.xaxis.max ? i2.config.xaxis.stepSize : void 0); } else a2.xAxisScale = this.linearScale(0, 10, 10); return a2.xAxisScale; } }, { key: "scaleMultipleYAxes", value: function() { var t3 = this, e2 = this.w.config, i2 = this.w.globals; this.coreUtils.setSeriesYAxisMappings(); var a2 = i2.seriesYAxisMap, s2 = i2.minYArr, r2 = i2.maxYArr; i2.allSeriesCollapsed = true, i2.barGroups = [], a2.forEach((function(a3, n2) { var o2 = []; a3.forEach((function(t4) { var i3, a4 = null === (i3 = e2.series[t4]) || void 0 === i3 ? void 0 : i3.group; o2.indexOf(a4) < 0 && o2.push(a4); })), a3.length > 0 ? (function() { var l2, h2, c2 = Number.MAX_VALUE, d2 = -Number.MAX_VALUE, u2 = c2, g2 = d2; if (e2.chart.stacked) !(function() { var t4 = new Array(i2.dataPoints).fill(0), s3 = [], r3 = [], p3 = []; o2.forEach((function() { s3.push(t4.map((function() { return Number.MIN_VALUE; }))), r3.push(t4.map((function() { return Number.MIN_VALUE; }))), p3.push(t4.map((function() { return Number.MIN_VALUE; }))); })); for (var f3 = function(t5) { !l2 && e2.series[a3[t5]].type && (l2 = e2.series[a3[t5]].type); var c3 = a3[t5]; h2 = e2.series[c3].group ? e2.series[c3].group : "axis-".concat(n2), !(i2.collapsedSeriesIndices.indexOf(c3) < 0 && i2.ancillaryCollapsedSeriesIndices.indexOf(c3) < 0) || (i2.allSeriesCollapsed = false, o2.forEach((function(t6, a4) { if (e2.series[c3].group === t6) for (var n3 = 0; n3 < i2.series[c3].length; n3++) { var o3 = i2.series[c3][n3]; o3 >= 0 ? r3[a4][n3] += o3 : p3[a4][n3] += o3, s3[a4][n3] += o3, u2 = Math.min(u2, o3), g2 = Math.max(g2, o3); } }))), "bar" !== l2 && "column" !== l2 || i2.barGroups.push(h2); }, x2 = 0; x2 < a3.length; x2++) f3(x2); l2 || (l2 = e2.chart.type), "bar" === l2 || "column" === l2 ? o2.forEach((function(t5, e3) { c2 = Math.min(c2, Math.min.apply(null, p3[e3])), d2 = Math.max(d2, Math.max.apply(null, r3[e3])); })) : (o2.forEach((function(t5, e3) { u2 = Math.min(u2, Math.min.apply(null, s3[e3])), g2 = Math.max(g2, Math.max.apply(null, s3[e3])); })), c2 = u2, d2 = g2), c2 === Number.MIN_VALUE && d2 === Number.MIN_VALUE && (d2 = -Number.MAX_VALUE); })(); else for (var p2 = 0; p2 < a3.length; p2++) { var f2 = a3[p2]; c2 = Math.min(c2, s2[f2]), d2 = Math.max(d2, r2[f2]), !(i2.collapsedSeriesIndices.indexOf(f2) < 0 && i2.ancillaryCollapsedSeriesIndices.indexOf(f2) < 0) || (i2.allSeriesCollapsed = false); } void 0 !== e2.yaxis[n2].min && (c2 = "function" == typeof e2.yaxis[n2].min ? e2.yaxis[n2].min(c2) : e2.yaxis[n2].min), void 0 !== e2.yaxis[n2].max && (d2 = "function" == typeof e2.yaxis[n2].max ? e2.yaxis[n2].max(d2) : e2.yaxis[n2].max), i2.barGroups = i2.barGroups.filter((function(t4, e3, i3) { return i3.indexOf(t4) === e3; })), t3.setYScaleForIndex(n2, c2, d2), a3.forEach((function(t4) { s2[t4] = i2.yAxisScale[n2].niceMin, r2[t4] = i2.yAxisScale[n2].niceMax; })); })() : t3.setYScaleForIndex(n2, 0, -Number.MAX_VALUE); })); } }]), t2; })(); var ia = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.scales = new ea(e2); } return s(t2, [{ key: "init", value: function() { this.setYRange(), this.setXRange(), this.setZRange(); } }, { key: "getMinYMaxY", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE, i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : -Number.MAX_VALUE, a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null, s2 = this.w.config, r2 = this.w.globals, n2 = -Number.MAX_VALUE, o2 = Number.MIN_VALUE; null === a2 && (a2 = t3 + 1); var l2 = r2.series, h2 = l2, c2 = l2; "candlestick" === s2.chart.type ? (h2 = r2.seriesCandleL, c2 = r2.seriesCandleH) : "boxPlot" === s2.chart.type ? (h2 = r2.seriesCandleO, c2 = r2.seriesCandleC) : r2.isRangeData && (h2 = r2.seriesRangeStart, c2 = r2.seriesRangeEnd); var d2 = false; if (r2.seriesX.length >= a2) { var u2, g2 = null === (u2 = r2.brushSource) || void 0 === u2 ? void 0 : u2.w.config.chart.brush; (s2.chart.zoom.enabled && s2.chart.zoom.autoScaleYaxis || null != g2 && g2.enabled && null != g2 && g2.autoScaleYaxis) && (d2 = true); } for (var p2 = t3; p2 < a2; p2++) { r2.dataPoints = Math.max(r2.dataPoints, l2[p2].length); var f2 = s2.series[p2].type; r2.categoryLabels.length && (r2.dataPoints = r2.categoryLabels.filter((function(t4) { return void 0 !== t4; })).length), r2.labels.length && "datetime" !== s2.xaxis.type && 0 !== r2.series.reduce((function(t4, e3) { return t4 + e3.length; }), 0) && (r2.dataPoints = Math.max(r2.dataPoints, r2.labels.length)); var x2 = 0, b2 = l2[p2].length - 1; if (d2) { if (s2.xaxis.min) for (; x2 < b2 && r2.seriesX[p2][x2] < s2.xaxis.min; x2++) ; if (s2.xaxis.max) for (; b2 > x2 && r2.seriesX[p2][b2] > s2.xaxis.max; b2--) ; } for (var m2 = x2; m2 <= b2 && m2 < r2.series[p2].length; m2++) { var y2 = l2[p2][m2]; if (null !== y2 && v.isNumber(y2)) { var w2, k2, A2, C2; switch (void 0 !== (null === (w2 = c2[p2]) || void 0 === w2 ? void 0 : w2[m2]) && (n2 = Math.max(n2, c2[p2][m2]), e2 = Math.min(e2, c2[p2][m2])), void 0 !== (null === (k2 = h2[p2]) || void 0 === k2 ? void 0 : k2[m2]) && (e2 = Math.min(e2, h2[p2][m2]), i2 = Math.max(i2, h2[p2][m2])), f2) { case "candlestick": void 0 !== r2.seriesCandleC[p2][m2] && (n2 = Math.max(n2, r2.seriesCandleH[p2][m2]), e2 = Math.min(e2, r2.seriesCandleL[p2][m2])); break; case "boxPlot": void 0 !== r2.seriesCandleC[p2][m2] && (n2 = Math.max(n2, r2.seriesCandleC[p2][m2]), e2 = Math.min(e2, r2.seriesCandleO[p2][m2])); } f2 && "candlestick" !== f2 && "boxPlot" !== f2 && "rangeArea" !== f2 && "rangeBar" !== f2 && (n2 = Math.max(n2, r2.series[p2][m2]), e2 = Math.min(e2, r2.series[p2][m2])), r2.seriesGoals[p2] && r2.seriesGoals[p2][m2] && Array.isArray(r2.seriesGoals[p2][m2]) && r2.seriesGoals[p2][m2].forEach((function(t4) { n2 = Math.max(n2, t4.value), e2 = Math.min(e2, t4.value); })), i2 = n2, y2 = v.noExponents(y2), v.isFloat(y2) && (r2.yValueDecimal = Math.max(r2.yValueDecimal, y2.toString().split(".")[1].length)), o2 > (null === (A2 = h2[p2]) || void 0 === A2 ? void 0 : A2[m2]) && (null === (C2 = h2[p2]) || void 0 === C2 ? void 0 : C2[m2]) < 0 && (o2 = h2[p2][m2]); } else r2.hasNullValues = true; } "bar" !== f2 && "column" !== f2 || (o2 < 0 && n2 < 0 && (n2 = 0, i2 = Math.max(i2, 0)), o2 === Number.MIN_VALUE && (o2 = 0, e2 = Math.min(e2, 0))); } return "rangeBar" === s2.chart.type && r2.seriesRangeStart.length && r2.isBarHorizontal && (o2 = e2), "bar" === s2.chart.type && (o2 < 0 && n2 < 0 && (n2 = 0), o2 === Number.MIN_VALUE && (o2 = 0)), { minY: o2, maxY: n2, lowestY: e2, highestY: i2 }; } }, { key: "setYRange", value: function() { var t3 = this.w.globals, e2 = this.w.config; t3.maxY = -Number.MAX_VALUE, t3.minY = Number.MIN_VALUE; var i2, a2 = Number.MAX_VALUE; if (t3.isMultipleYAxis) { a2 = Number.MAX_VALUE; for (var s2 = 0; s2 < t3.series.length; s2++) i2 = this.getMinYMaxY(s2), t3.minYArr[s2] = i2.lowestY, t3.maxYArr[s2] = i2.highestY, a2 = Math.min(a2, i2.lowestY); } if (i2 = this.getMinYMaxY(0, a2, null, t3.series.length), "bar" === e2.chart.type ? (t3.minY = i2.minY, t3.maxY = i2.maxY) : (t3.minY = i2.lowestY, t3.maxY = i2.highestY), a2 = i2.lowestY, e2.chart.stacked && this._setStackedMinMax(), "line" === e2.chart.type || "area" === e2.chart.type || "scatter" === e2.chart.type || "candlestick" === e2.chart.type || "boxPlot" === e2.chart.type || "rangeBar" === e2.chart.type && !t3.isBarHorizontal ? t3.minY === Number.MIN_VALUE && a2 !== -Number.MAX_VALUE && a2 !== t3.maxY && (t3.minY = a2) : t3.minY = t3.minY !== Number.MIN_VALUE ? Math.min(i2.minY, t3.minY) : i2.minY, e2.yaxis.forEach((function(e3, i3) { void 0 !== e3.max && ("number" == typeof e3.max ? t3.maxYArr[i3] = e3.max : "function" == typeof e3.max && (t3.maxYArr[i3] = e3.max(t3.isMultipleYAxis ? t3.maxYArr[i3] : t3.maxY)), t3.maxY = t3.maxYArr[i3]), void 0 !== e3.min && ("number" == typeof e3.min ? t3.minYArr[i3] = e3.min : "function" == typeof e3.min && (t3.minYArr[i3] = e3.min(t3.isMultipleYAxis ? t3.minYArr[i3] === Number.MIN_VALUE ? 0 : t3.minYArr[i3] : t3.minY)), t3.minY = t3.minYArr[i3]); })), t3.isBarHorizontal) { ["min", "max"].forEach((function(i3) { void 0 !== e2.xaxis[i3] && "number" == typeof e2.xaxis[i3] && ("min" === i3 ? t3.minY = e2.xaxis[i3] : t3.maxY = e2.xaxis[i3]); })); } return t3.isMultipleYAxis ? (this.scales.scaleMultipleYAxes(), t3.minY = a2) : (this.scales.setYScaleForIndex(0, t3.minY, t3.maxY), t3.minY = t3.yAxisScale[0].niceMin, t3.maxY = t3.yAxisScale[0].niceMax, t3.minYArr[0] = t3.minY, t3.maxYArr[0] = t3.maxY), t3.barGroups = [], t3.lineGroups = [], t3.areaGroups = [], e2.series.forEach((function(i3) { switch (i3.type || e2.chart.type) { case "bar": case "column": t3.barGroups.push(i3.group); break; case "line": t3.lineGroups.push(i3.group); break; case "area": t3.areaGroups.push(i3.group); } })), t3.barGroups = t3.barGroups.filter((function(t4, e3, i3) { return i3.indexOf(t4) === e3; })), t3.lineGroups = t3.lineGroups.filter((function(t4, e3, i3) { return i3.indexOf(t4) === e3; })), t3.areaGroups = t3.areaGroups.filter((function(t4, e3, i3) { return i3.indexOf(t4) === e3; })), { minY: t3.minY, maxY: t3.maxY, minYArr: t3.minYArr, maxYArr: t3.maxYArr, yAxisScale: t3.yAxisScale }; } }, { key: "setXRange", value: function() { var t3 = this.w.globals, e2 = this.w.config, i2 = "numeric" === e2.xaxis.type || "datetime" === e2.xaxis.type || "category" === e2.xaxis.type && !t3.noLabelsProvided || t3.noLabelsProvided || t3.isXNumeric; if (t3.isXNumeric && (function() { for (var e3 = 0; e3 < t3.series.length; e3++) if (t3.labels[e3]) for (var i3 = 0; i3 < t3.labels[e3].length; i3++) null !== t3.labels[e3][i3] && v.isNumber(t3.labels[e3][i3]) && (t3.maxX = Math.max(t3.maxX, t3.labels[e3][i3]), t3.initialMaxX = Math.max(t3.maxX, t3.labels[e3][i3]), t3.minX = Math.min(t3.minX, t3.labels[e3][i3]), t3.initialMinX = Math.min(t3.minX, t3.labels[e3][i3])); })(), t3.noLabelsProvided && 0 === e2.xaxis.categories.length && (t3.maxX = t3.labels[t3.labels.length - 1], t3.initialMaxX = t3.labels[t3.labels.length - 1], t3.minX = 1, t3.initialMinX = 1), t3.isXNumeric || t3.noLabelsProvided || t3.dataFormatXNumeric) { var a2 = 10; if (void 0 === e2.xaxis.tickAmount) a2 = Math.round(t3.svgWidth / 150), "numeric" === e2.xaxis.type && t3.dataPoints < 30 && (a2 = t3.dataPoints - 1), a2 > t3.dataPoints && 0 !== t3.dataPoints && (a2 = t3.dataPoints - 1); else if ("dataPoints" === e2.xaxis.tickAmount) { if (t3.series.length > 1 && (a2 = t3.series[t3.maxValsInArrayIndex].length - 1), t3.isXNumeric) { var s2 = Math.round(t3.maxX - t3.minX); s2 < 30 && (a2 = s2); } } else a2 = e2.xaxis.tickAmount; if (t3.xTickAmount = a2, void 0 !== e2.xaxis.max && "number" == typeof e2.xaxis.max && (t3.maxX = e2.xaxis.max), void 0 !== e2.xaxis.min && "number" == typeof e2.xaxis.min && (t3.minX = e2.xaxis.min), void 0 !== e2.xaxis.range && (t3.minX = t3.maxX - e2.xaxis.range), t3.minX !== Number.MAX_VALUE && t3.maxX !== -Number.MAX_VALUE) if (e2.xaxis.convertedCatToNumeric && !t3.dataFormatXNumeric) { for (var r2 = [], n2 = t3.minX - 1; n2 < t3.maxX; n2++) r2.push(n2 + 1); t3.xAxisScale = { result: r2, niceMin: r2[0], niceMax: r2[r2.length - 1] }; } else t3.xAxisScale = this.scales.setXScale(t3.minX, t3.maxX); else t3.xAxisScale = this.scales.linearScale(0, a2, a2, 0, e2.xaxis.stepSize), t3.noLabelsProvided && t3.labels.length > 0 && (t3.xAxisScale = this.scales.linearScale(1, t3.labels.length, a2 - 1, 0, e2.xaxis.stepSize), t3.seriesX = t3.labels.slice()); i2 && (t3.labels = t3.xAxisScale.result.slice()); } return t3.isBarHorizontal && t3.labels.length && (t3.xTickAmount = t3.labels.length), this._handleSingleDataPoint(), this._getMinXDiff(), { minX: t3.minX, maxX: t3.maxX }; } }, { key: "setZRange", value: function() { var t3 = this.w.globals; if (t3.isDataXYZ) { for (var e2 = 0; e2 < t3.series.length; e2++) if (void 0 !== t3.seriesZ[e2]) for (var i2 = 0; i2 < t3.seriesZ[e2].length; i2++) null !== t3.seriesZ[e2][i2] && v.isNumber(t3.seriesZ[e2][i2]) && (t3.maxZ = Math.max(t3.maxZ, t3.seriesZ[e2][i2]), t3.minZ = Math.min(t3.minZ, t3.seriesZ[e2][i2])); } } }, { key: "_handleSingleDataPoint", value: function() { var t3 = this.w.globals, e2 = this.w.config; if (t3.minX === t3.maxX) { var i2 = new zi(this.ctx); if ("datetime" === e2.xaxis.type) { var a2 = i2.getDate(t3.minX); e2.xaxis.labels.datetimeUTC ? a2.setUTCDate(a2.getUTCDate() - 2) : a2.setDate(a2.getDate() - 2), t3.minX = new Date(a2).getTime(); var s2 = i2.getDate(t3.maxX); e2.xaxis.labels.datetimeUTC ? s2.setUTCDate(s2.getUTCDate() + 2) : s2.setDate(s2.getDate() + 2), t3.maxX = new Date(s2).getTime(); } else ("numeric" === e2.xaxis.type || "category" === e2.xaxis.type && !t3.noLabelsProvided) && (t3.minX = t3.minX - 2, t3.initialMinX = t3.minX, t3.maxX = t3.maxX + 2, t3.initialMaxX = t3.maxX); } } }, { key: "_getMinXDiff", value: function() { var t3 = this.w.globals; t3.isXNumeric && t3.seriesX.forEach((function(e2, i2) { if (e2.length) { 1 === e2.length && e2.push(t3.seriesX[t3.maxValsInArrayIndex][t3.seriesX[t3.maxValsInArrayIndex].length - 1]); var a2 = e2.slice(); a2.sort((function(t4, e3) { return t4 - e3; })), a2.forEach((function(e3, i3) { if (i3 > 0) { var s2 = e3 - a2[i3 - 1]; s2 > 0 && (t3.minXDiff = Math.min(s2, t3.minXDiff)); } })), 1 !== t3.dataPoints && t3.minXDiff !== Number.MAX_VALUE || (t3.minXDiff = 0.5); } })); } }, { key: "_setStackedMinMax", value: function() { var t3 = this, e2 = this.w.globals; if (e2.series.length) { var i2 = e2.seriesGroups; i2.length || (i2 = [this.w.globals.seriesNames.map((function(t4) { return t4; }))]); var a2 = {}, s2 = {}; i2.forEach((function(i3) { a2[i3] = [], s2[i3] = [], t3.w.config.series.map((function(t4, a3) { return i3.indexOf(e2.seriesNames[a3]) > -1 ? a3 : null; })).filter((function(t4) { return null !== t4; })).forEach((function(r2) { for (var n2 = 0; n2 < e2.series[e2.maxValsInArrayIndex].length; n2++) { var o2, l2, h2, c2; void 0 === a2[i3][n2] && (a2[i3][n2] = 0, s2[i3][n2] = 0), (t3.w.config.chart.stacked && !e2.comboCharts || t3.w.config.chart.stacked && e2.comboCharts && (!t3.w.config.chart.stackOnlyBar || "bar" === (null === (o2 = t3.w.config.series) || void 0 === o2 || null === (l2 = o2[r2]) || void 0 === l2 ? void 0 : l2.type) || "column" === (null === (h2 = t3.w.config.series) || void 0 === h2 || null === (c2 = h2[r2]) || void 0 === c2 ? void 0 : c2.type))) && null !== e2.series[r2][n2] && v.isNumber(e2.series[r2][n2]) && (e2.series[r2][n2] > 0 ? a2[i3][n2] += parseFloat(e2.series[r2][n2]) + 1e-4 : s2[i3][n2] += parseFloat(e2.series[r2][n2])); } })); })), Object.entries(a2).forEach((function(t4) { var i3 = p(t4, 1)[0]; a2[i3].forEach((function(t5, r2) { e2.maxY = Math.max(e2.maxY, a2[i3][r2]), e2.minY = Math.min(e2.minY, s2[i3][r2]); })); })); } } }]), t2; })(); var aa = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.elgrid = a2, this.w = e2.w; var s2 = this.w; this.xaxisFontSize = s2.config.xaxis.labels.style.fontSize, this.axisFontFamily = s2.config.xaxis.labels.style.fontFamily, this.xaxisForeColors = s2.config.xaxis.labels.style.colors, this.isCategoryBarHorizontal = "bar" === s2.config.chart.type && s2.config.plotOptions.bar.horizontal, this.xAxisoffX = "bottom" === s2.config.xaxis.position ? s2.globals.gridHeight : 0, this.drawnLabels = [], this.axesUtils = new Ri(e2); } return s(t2, [{ key: "drawYaxis", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a2 = e2.config.yaxis[t3].labels.style, s2 = a2.fontSize, r2 = a2.fontFamily, n2 = a2.fontWeight, o2 = i2.group({ class: "apexcharts-yaxis", rel: t3, transform: "translate(".concat(e2.globals.translateYAxisX[t3], ", 0)") }); if (this.axesUtils.isYAxisHidden(t3)) return o2; var l2 = i2.group({ class: "apexcharts-yaxis-texts-g" }); o2.add(l2); var h2 = e2.globals.yAxisScale[t3].result.length - 1, c2 = e2.globals.gridHeight / h2, d2 = e2.globals.yLabelFormatters[t3], u2 = this.axesUtils.checkForReversedLabels(t3, e2.globals.yAxisScale[t3].result.slice()); if (e2.config.yaxis[t3].labels.show) { var g2 = e2.globals.translateY + e2.config.yaxis[t3].labels.offsetY; e2.globals.isBarHorizontal ? g2 = 0 : "heatmap" === e2.config.chart.type && (g2 -= c2 / 2), g2 += parseInt(s2, 10) / 3; for (var p2 = h2; p2 >= 0; p2--) { var f2 = d2(u2[p2], p2, e2), x2 = e2.config.yaxis[t3].labels.padding; e2.config.yaxis[t3].opposite && 0 !== e2.config.yaxis.length && (x2 *= -1); var b2 = this.getTextAnchor(e2.config.yaxis[t3].labels.align, e2.config.yaxis[t3].opposite), m2 = this.axesUtils.getYAxisForeColor(a2.colors, t3), y2 = Array.isArray(m2) ? m2[p2] : m2, w2 = v.listToArray(e2.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis[rel='".concat(t3, "'] .apexcharts-yaxis-label tspan"))).map((function(t4) { return t4.textContent; })), k2 = i2.drawText({ x: x2, y: g2, text: w2.includes(f2) && !e2.config.yaxis[t3].labels.showDuplicates ? "" : f2, textAnchor: b2, fontSize: s2, fontFamily: r2, fontWeight: n2, maxWidth: e2.config.yaxis[t3].labels.maxWidth, foreColor: y2, isPlainText: false, cssClass: "apexcharts-yaxis-label ".concat(a2.cssClass) }); l2.add(k2), this.addTooltip(k2, f2), 0 !== e2.config.yaxis[t3].labels.rotate && this.rotateLabel(i2, k2, firstLabel, e2.config.yaxis[t3].labels.rotate), g2 += c2; } } return this.addYAxisTitle(i2, o2, t3), this.addAxisBorder(i2, o2, t3, h2, c2), o2; } }, { key: "getTextAnchor", value: function(t3, e2) { return "left" === t3 ? "start" : "center" === t3 ? "middle" : "right" === t3 ? "end" : e2 ? "start" : "end"; } }, { key: "addTooltip", value: function(t3, e2) { var i2 = document.createElementNS(this.w.globals.SVGNS, "title"); i2.textContent = Array.isArray(e2) ? e2.join(" ") : e2, t3.node.appendChild(i2); } }, { key: "rotateLabel", value: function(t3, e2, i2, a2) { var s2 = t3.rotateAroundCenter(i2.node), r2 = t3.rotateAroundCenter(e2.node); e2.node.setAttribute("transform", "rotate(".concat(a2, " ").concat(s2.x, " ").concat(r2.y, ")")); } }, { key: "addYAxisTitle", value: function(t3, e2, i2) { var a2 = this.w; if (void 0 !== a2.config.yaxis[i2].title.text) { var s2 = t3.group({ class: "apexcharts-yaxis-title" }), r2 = a2.config.yaxis[i2].opposite ? a2.globals.translateYAxisX[i2] : 0, n2 = t3.drawText({ x: r2, y: a2.globals.gridHeight / 2 + a2.globals.translateY + a2.config.yaxis[i2].title.offsetY, text: a2.config.yaxis[i2].title.text, textAnchor: "end", foreColor: a2.config.yaxis[i2].title.style.color, fontSize: a2.config.yaxis[i2].title.style.fontSize, fontWeight: a2.config.yaxis[i2].title.style.fontWeight, fontFamily: a2.config.yaxis[i2].title.style.fontFamily, cssClass: "apexcharts-yaxis-title-text ".concat(a2.config.yaxis[i2].title.style.cssClass) }); s2.add(n2), e2.add(s2); } } }, { key: "addAxisBorder", value: function(t3, e2, i2, a2, s2) { var r2 = this.w, n2 = r2.config.yaxis[i2].axisBorder, o2 = 31 + n2.offsetX; if (r2.config.yaxis[i2].opposite && (o2 = -31 - n2.offsetX), n2.show) { var l2 = t3.drawLine(o2, r2.globals.translateY + n2.offsetY - 2, o2, r2.globals.gridHeight + r2.globals.translateY + n2.offsetY + 2, n2.color, 0, n2.width); e2.add(l2); } r2.config.yaxis[i2].axisTicks.show && this.axesUtils.drawYAxisTicks(o2, a2, n2, r2.config.yaxis[i2].axisTicks, i2, s2, e2); } }, { key: "drawYaxisInversed", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a2 = i2.group({ class: "apexcharts-xaxis apexcharts-yaxis-inversed" }), s2 = i2.group({ class: "apexcharts-xaxis-texts-g", transform: "translate(".concat(e2.globals.translateXAxisX, ", ").concat(e2.globals.translateXAxisY, ")") }); a2.add(s2); var r2 = e2.globals.yAxisScale[t3].result.length - 1, n2 = e2.globals.gridWidth / r2 + 0.1, o2 = n2 + e2.config.xaxis.labels.offsetX, l2 = e2.globals.xLabelFormatter, h2 = this.axesUtils.checkForReversedLabels(t3, e2.globals.yAxisScale[t3].result.slice()), c2 = e2.globals.timescaleLabels; if (c2.length > 0 && (this.xaxisLabels = c2.slice(), r2 = (h2 = c2.slice()).length), e2.config.xaxis.labels.show) for (var d2 = c2.length ? 0 : r2; c2.length ? d2 < c2.length : d2 >= 0; c2.length ? d2++ : d2--) { var u2 = l2(h2[d2], d2, e2), g2 = e2.globals.gridWidth + e2.globals.padHorizontal - (o2 - n2 + e2.config.xaxis.labels.offsetX); if (c2.length) { var p2 = this.axesUtils.getLabel(h2, c2, g2, d2, this.drawnLabels, this.xaxisFontSize); g2 = p2.x, u2 = p2.text, this.drawnLabels.push(p2.text), 0 === d2 && e2.globals.skipFirstTimelinelabel && (u2 = ""), d2 === h2.length - 1 && e2.globals.skipLastTimelinelabel && (u2 = ""); } var f2 = i2.drawText({ x: g2, y: this.xAxisoffX + e2.config.xaxis.labels.offsetY + 30 - ("top" === e2.config.xaxis.position ? e2.globals.xAxisHeight + e2.config.xaxis.axisTicks.height - 2 : 0), text: u2, textAnchor: "middle", foreColor: Array.isArray(this.xaxisForeColors) ? this.xaxisForeColors[t3] : this.xaxisForeColors, fontSize: this.xaxisFontSize, fontFamily: this.xaxisFontFamily, fontWeight: e2.config.xaxis.labels.style.fontWeight, isPlainText: false, cssClass: "apexcharts-xaxis-label ".concat(e2.config.xaxis.labels.style.cssClass) }); s2.add(f2), f2.tspan(u2), this.addTooltip(f2, u2), o2 += n2; } return this.inversedYAxisTitleText(a2), this.inversedYAxisBorder(a2), a2; } }, { key: "inversedYAxisBorder", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a2 = e2.config.xaxis.axisBorder; if (a2.show) { var s2 = 0; "bar" === e2.config.chart.type && e2.globals.isXNumeric && (s2 -= 15); var r2 = i2.drawLine(e2.globals.padHorizontal + s2 + a2.offsetX, this.xAxisoffX, e2.globals.gridWidth, this.xAxisoffX, a2.color, 0, a2.height); this.elgrid && this.elgrid.elGridBorders && e2.config.grid.show ? this.elgrid.elGridBorders.add(r2) : t3.add(r2); } } }, { key: "inversedYAxisTitleText", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx); if (void 0 !== e2.config.xaxis.title.text) { var a2 = i2.group({ class: "apexcharts-xaxis-title apexcharts-yaxis-title-inversed" }), s2 = i2.drawText({ x: e2.globals.gridWidth / 2 + e2.config.xaxis.title.offsetX, y: this.xAxisoffX + parseFloat(this.xaxisFontSize) + parseFloat(e2.config.xaxis.title.style.fontSize) + e2.config.xaxis.title.offsetY + 20, text: e2.config.xaxis.title.text, textAnchor: "middle", fontSize: e2.config.xaxis.title.style.fontSize, fontFamily: e2.config.xaxis.title.style.fontFamily, fontWeight: e2.config.xaxis.title.style.fontWeight, foreColor: e2.config.xaxis.title.style.color, cssClass: "apexcharts-xaxis-title-text ".concat(e2.config.xaxis.title.style.cssClass) }); a2.add(s2), t3.add(a2); } } }, { key: "yAxisTitleRotate", value: function(t3, e2) { var i2 = this.w, a2 = new Mi(this.ctx), s2 = i2.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(t3, "'] .apexcharts-yaxis-texts-g")), r2 = s2 ? s2.getBoundingClientRect() : { width: 0, height: 0 }, n2 = i2.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(t3, "'] .apexcharts-yaxis-title text")), o2 = n2 ? n2.getBoundingClientRect() : { width: 0, height: 0 }; if (n2) { var l2 = this.xPaddingForYAxisTitle(t3, r2, o2, e2); n2.setAttribute("x", l2.xPos - (e2 ? 10 : 0)); var h2 = a2.rotateAroundCenter(n2); n2.setAttribute("transform", "rotate(".concat(e2 ? -1 * i2.config.yaxis[t3].title.rotate : i2.config.yaxis[t3].title.rotate, " ").concat(h2.x, " ").concat(h2.y, ")")); } } }, { key: "xPaddingForYAxisTitle", value: function(t3, e2, i2, a2) { var s2 = this.w, r2 = 0, n2 = 10; return void 0 === s2.config.yaxis[t3].title.text || t3 < 0 ? { xPos: r2, padd: 0 } : (a2 ? r2 = e2.width + s2.config.yaxis[t3].title.offsetX + i2.width / 2 + n2 / 2 : (r2 = -1 * e2.width + s2.config.yaxis[t3].title.offsetX + n2 / 2 + i2.width / 2, s2.globals.isBarHorizontal && (n2 = 25, r2 = -1 * e2.width - s2.config.yaxis[t3].title.offsetX - n2)), { xPos: r2, padd: n2 }); } }, { key: "setYAxisXPosition", value: function(t3, e2) { var i2 = this.w, a2 = 0, s2 = 0, r2 = 18, n2 = 1; i2.config.yaxis.length > 1 && (this.multipleYs = true), i2.config.yaxis.forEach((function(o2, l2) { var h2 = i2.globals.ignoreYAxisIndexes.includes(l2) || !o2.show || o2.floating || 0 === t3[l2].width, c2 = t3[l2].width + e2[l2].width; o2.opposite ? i2.globals.isBarHorizontal ? (s2 = i2.globals.gridWidth + i2.globals.translateX - 1, i2.globals.translateYAxisX[l2] = s2 - o2.labels.offsetX) : (s2 = i2.globals.gridWidth + i2.globals.translateX + n2, h2 || (n2 += c2 + 20), i2.globals.translateYAxisX[l2] = s2 - o2.labels.offsetX + 20) : (a2 = i2.globals.translateX - r2, h2 || (r2 += c2 + 20), i2.globals.translateYAxisX[l2] = a2 + o2.labels.offsetX); })); } }, { key: "setYAxisTextAlignments", value: function() { var t3 = this.w; v.listToArray(t3.globals.dom.baseEl.getElementsByClassName("apexcharts-yaxis")).forEach((function(e2, i2) { var a2 = t3.config.yaxis[i2]; if (a2 && !a2.floating && void 0 !== a2.labels.align) { var s2 = t3.globals.dom.baseEl.querySelector(".apexcharts-yaxis[rel='".concat(i2, "'] .apexcharts-yaxis-texts-g")), r2 = v.listToArray(t3.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxis[rel='".concat(i2, "'] .apexcharts-yaxis-label"))), n2 = s2.getBoundingClientRect(); r2.forEach((function(t4) { t4.setAttribute("text-anchor", a2.labels.align); })), "left" !== a2.labels.align || a2.opposite ? "center" === a2.labels.align ? s2.setAttribute("transform", "translate(".concat(n2.width / 2 * (a2.opposite ? 1 : -1), ", 0)")) : "right" === a2.labels.align && a2.opposite && s2.setAttribute("transform", "translate(".concat(n2.width, ", 0)")) : s2.setAttribute("transform", "translate(-".concat(n2.width, ", 0)")); } })); } }]), t2; })(); var sa = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.documentEvent = v.bind(this.documentEvent, this); } return s(t2, [{ key: "addEventListener", value: function(t3, e2) { var i2 = this.w; i2.globals.events.hasOwnProperty(t3) ? i2.globals.events[t3].push(e2) : i2.globals.events[t3] = [e2]; } }, { key: "removeEventListener", value: function(t3, e2) { var i2 = this.w; if (i2.globals.events.hasOwnProperty(t3)) { var a2 = i2.globals.events[t3].indexOf(e2); -1 !== a2 && i2.globals.events[t3].splice(a2, 1); } } }, { key: "fireEvent", value: function(t3, e2) { var i2 = this.w; if (i2.globals.events.hasOwnProperty(t3)) { e2 && e2.length || (e2 = []); for (var a2 = i2.globals.events[t3], s2 = a2.length, r2 = 0; r2 < s2; r2++) a2[r2].apply(null, e2); } } }, { key: "setupEventHandlers", value: function() { var t3 = this, e2 = this.w, i2 = this.ctx, a2 = e2.globals.dom.baseEl.querySelector(e2.globals.chartClass); this.ctx.eventList.forEach((function(t4) { a2.addEventListener(t4, (function(t5) { var a3 = null === t5.target.getAttribute("i") && -1 !== e2.globals.capturedSeriesIndex ? e2.globals.capturedSeriesIndex : t5.target.getAttribute("i"), s2 = null === t5.target.getAttribute("j") && -1 !== e2.globals.capturedDataPointIndex ? e2.globals.capturedDataPointIndex : t5.target.getAttribute("j"), r2 = Object.assign({}, e2, { seriesIndex: e2.globals.axisCharts ? a3 : 0, dataPointIndex: s2 }); "mousemove" === t5.type || "touchmove" === t5.type ? "function" == typeof e2.config.chart.events.mouseMove && e2.config.chart.events.mouseMove(t5, i2, r2) : "mouseleave" === t5.type || "touchleave" === t5.type ? "function" == typeof e2.config.chart.events.mouseLeave && e2.config.chart.events.mouseLeave(t5, i2, r2) : ("mouseup" === t5.type && 1 === t5.which || "touchend" === t5.type) && ("function" == typeof e2.config.chart.events.click && e2.config.chart.events.click(t5, i2, r2), i2.ctx.events.fireEvent("click", [t5, i2, r2])); }), { capture: false, passive: true }); })), this.ctx.eventList.forEach((function(i3) { e2.globals.dom.baseEl.addEventListener(i3, t3.documentEvent, { passive: true }); })), this.ctx.core.setupBrushHandler(); } }, { key: "documentEvent", value: function(t3) { var e2 = this.w, i2 = t3.target.className; if ("click" === t3.type) { var a2 = e2.globals.dom.baseEl.querySelector(".apexcharts-menu"); a2 && a2.classList.contains("apexcharts-menu-open") && "apexcharts-menu-icon" !== i2 && a2.classList.remove("apexcharts-menu-open"); } e2.globals.clientX = "touchmove" === t3.type ? t3.touches[0].clientX : t3.clientX, e2.globals.clientY = "touchmove" === t3.type ? t3.touches[0].clientY : t3.clientY; } }]), t2; })(); var ra = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "setCurrentLocaleValues", value: function(t3) { var e2 = this.w.config.chart.locales; window.Apex.chart && window.Apex.chart.locales && window.Apex.chart.locales.length > 0 && (e2 = this.w.config.chart.locales.concat(window.Apex.chart.locales)); var i2 = e2.filter((function(e3) { return e3.name === t3; }))[0]; if (!i2) throw new Error("Wrong locale name provided. Please make sure you set the correct locale name in options"); var a2 = v.extend(Hi, i2); this.w.globals.locale = a2.options; } }]), t2; })(); var na = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "drawAxis", value: function(t3, e2) { var i2, a2, s2 = this, r2 = this.w.globals, n2 = this.w.config, o2 = new Ki(this.ctx, e2), l2 = new aa(this.ctx, e2); r2.axisCharts && "radar" !== t3 && (r2.isBarHorizontal ? (a2 = l2.drawYaxisInversed(0), i2 = o2.drawXaxisInversed(0), r2.dom.elGraphical.add(i2), r2.dom.elGraphical.add(a2)) : (i2 = o2.drawXaxis(), r2.dom.elGraphical.add(i2), n2.yaxis.map((function(t4, e3) { if (-1 === r2.ignoreYAxisIndexes.indexOf(e3) && (a2 = l2.drawYaxis(e3), r2.dom.Paper.add(a2), "back" === s2.w.config.grid.position)) { var i3 = r2.dom.Paper.children()[1]; i3.remove(), r2.dom.Paper.add(i3); } })))); } }]), t2; })(); var oa = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "drawXCrosshairs", value: function() { var t3 = this.w, e2 = new Mi(this.ctx), i2 = new Li(this.ctx), a2 = t3.config.xaxis.crosshairs.fill.gradient, s2 = t3.config.xaxis.crosshairs.dropShadow, r2 = t3.config.xaxis.crosshairs.fill.type, n2 = a2.colorFrom, o2 = a2.colorTo, l2 = a2.opacityFrom, h2 = a2.opacityTo, c2 = a2.stops, d2 = s2.enabled, u2 = s2.left, g2 = s2.top, p2 = s2.blur, f2 = s2.color, x2 = s2.opacity, b2 = t3.config.xaxis.crosshairs.fill.color; if (t3.config.xaxis.crosshairs.show) { "gradient" === r2 && (b2 = e2.drawGradient("vertical", n2, o2, l2, h2, null, c2, null)); var m2 = e2.drawRect(); 1 === t3.config.xaxis.crosshairs.width && (m2 = e2.drawLine()); var y2 = t3.globals.gridHeight; (!v.isNumber(y2) || y2 < 0) && (y2 = 0); var w2 = t3.config.xaxis.crosshairs.width; (!v.isNumber(w2) || w2 < 0) && (w2 = 0), m2.attr({ class: "apexcharts-xcrosshairs", x: 0, y: 0, y2, width: w2, height: y2, fill: b2, filter: "none", "fill-opacity": t3.config.xaxis.crosshairs.opacity, stroke: t3.config.xaxis.crosshairs.stroke.color, "stroke-width": t3.config.xaxis.crosshairs.stroke.width, "stroke-dasharray": t3.config.xaxis.crosshairs.stroke.dashArray }), d2 && (m2 = i2.dropShadow(m2, { left: u2, top: g2, blur: p2, color: f2, opacity: x2 })), t3.globals.dom.elGraphical.add(m2); } } }, { key: "drawYCrosshairs", value: function() { var t3 = this.w, e2 = new Mi(this.ctx), i2 = t3.config.yaxis[0].crosshairs, a2 = t3.globals.barPadForNumericAxis; if (t3.config.yaxis[0].crosshairs.show) { var s2 = e2.drawLine(-a2, 0, t3.globals.gridWidth + a2, 0, i2.stroke.color, i2.stroke.dashArray, i2.stroke.width); s2.attr({ class: "apexcharts-ycrosshairs" }), t3.globals.dom.elGraphical.add(s2); } var r2 = e2.drawLine(-a2, 0, t3.globals.gridWidth + a2, 0, i2.stroke.color, 0, 0); r2.attr({ class: "apexcharts-ycrosshairs-hidden" }), t3.globals.dom.elGraphical.add(r2); } }]), t2; })(); var la = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "checkResponsiveConfig", value: function(t3) { var e2 = this, i2 = this.w, a2 = i2.config; if (0 !== a2.responsive.length) { var s2 = a2.responsive.slice(); s2.sort((function(t4, e3) { return t4.breakpoint > e3.breakpoint ? 1 : e3.breakpoint > t4.breakpoint ? -1 : 0; })).reverse(); var r2 = new Wi({}), n2 = function() { var t4 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, a3 = s2[0].breakpoint, n3 = window.innerWidth > 0 ? window.innerWidth : screen.width; if (n3 > a3) { var o3 = v.clone(i2.globals.initialConfig); o3.series = v.clone(i2.config.series); var l2 = Pi.extendArrayProps(r2, o3, i2); t4 = v.extend(l2, t4), t4 = v.extend(i2.config, t4), e2.overrideResponsiveOptions(t4); } else for (var h2 = 0; h2 < s2.length; h2++) n3 < s2[h2].breakpoint && (t4 = Pi.extendArrayProps(r2, s2[h2].options, i2), t4 = v.extend(i2.config, t4), e2.overrideResponsiveOptions(t4)); }; if (t3) { var o2 = Pi.extendArrayProps(r2, t3, i2); o2 = v.extend(i2.config, o2), n2(o2 = v.extend(o2, t3)); } else n2({}); } } }, { key: "overrideResponsiveOptions", value: function(t3) { var e2 = new Wi(t3).init({ responsiveOverride: true }); this.w.config = e2; } }]), t2; })(); var ha = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.colors = [], this.isColorFn = false, this.isHeatmapDistributed = this.checkHeatmapDistributed(), this.isBarDistributed = this.checkBarDistributed(); } return s(t2, [{ key: "checkHeatmapDistributed", value: function() { var t3 = this.w.config, e2 = t3.chart, i2 = t3.plotOptions; return "treemap" === e2.type && i2.treemap && i2.treemap.distributed || "heatmap" === e2.type && i2.heatmap && i2.heatmap.distributed; } }, { key: "checkBarDistributed", value: function() { var t3 = this.w.config, e2 = t3.chart, i2 = t3.plotOptions; return i2.bar && i2.bar.distributed && ("bar" === e2.type || "rangeBar" === e2.type); } }, { key: "init", value: function() { this.setDefaultColors(); } }, { key: "setDefaultColors", value: function() { var t3 = this.w, e2 = new v(); t3.globals.dom.elWrap.classList.add("apexcharts-theme-".concat(t3.config.theme.mode || "light")); var i2 = f(t3.config.colors || t3.config.fill.colors || []); t3.globals.colors = this.getColors(i2), this.applySeriesColors(t3.globals.seriesColors, t3.globals.colors), t3.config.theme.monochrome.enabled && (t3.globals.colors = this.getMonochromeColors(t3.config.theme.monochrome, t3.globals.series, e2)); var a2 = t3.globals.colors.slice(); this.pushExtraColors(t3.globals.colors), this.applyColorTypes(["fill", "stroke"], a2), this.applyDataLabelsColors(a2), this.applyRadarPolygonsColors(), this.applyMarkersColors(a2); } }, { key: "getColors", value: function(t3) { var e2 = this, i2 = this.w; return t3 && 0 !== t3.length ? Array.isArray(t3) && t3.length > 0 && "function" == typeof t3[0] ? (this.isColorFn = true, i2.config.series.map((function(a2, s2) { var r2 = t3[s2] || t3[0]; return "function" == typeof r2 ? r2({ value: i2.globals.axisCharts ? i2.globals.series[s2][0] || 0 : i2.globals.series[s2], seriesIndex: s2, dataPointIndex: s2, w: e2.w }) : r2; }))) : t3 : this.predefined(); } }, { key: "applySeriesColors", value: function(t3, e2) { t3.forEach((function(t4, i2) { t4 && (e2[i2] = t4); })); } }, { key: "getMonochromeColors", value: function(t3, e2, i2) { var a2 = t3.color, s2 = t3.shadeIntensity, r2 = t3.shadeTo, n2 = this.isBarDistributed || this.isHeatmapDistributed ? e2[0].length * e2.length : e2.length, o2 = 1 / (n2 / s2), l2 = 0; return Array.from({ length: n2 }, (function() { var t4 = "dark" === r2 ? i2.shadeColor(-1 * l2, a2) : i2.shadeColor(l2, a2); return l2 += o2, t4; })); } }, { key: "applyColorTypes", value: function(t3, e2) { var i2 = this, a2 = this.w; t3.forEach((function(t4) { a2.globals[t4].colors = void 0 === a2.config[t4].colors ? i2.isColorFn ? a2.config.colors : e2 : a2.config[t4].colors.slice(), i2.pushExtraColors(a2.globals[t4].colors); })); } }, { key: "applyDataLabelsColors", value: function(t3) { var e2 = this.w; e2.globals.dataLabels.style.colors = void 0 === e2.config.dataLabels.style.colors ? t3 : e2.config.dataLabels.style.colors.slice(), this.pushExtraColors(e2.globals.dataLabels.style.colors, 50); } }, { key: "applyRadarPolygonsColors", value: function() { var t3 = this.w; t3.globals.radarPolygons.fill.colors = void 0 === t3.config.plotOptions.radar.polygons.fill.colors ? ["dark" === t3.config.theme.mode ? "#343A3F" : "none"] : t3.config.plotOptions.radar.polygons.fill.colors.slice(), this.pushExtraColors(t3.globals.radarPolygons.fill.colors, 20); } }, { key: "applyMarkersColors", value: function(t3) { var e2 = this.w; e2.globals.markers.colors = void 0 === e2.config.markers.colors ? t3 : e2.config.markers.colors.slice(), this.pushExtraColors(e2.globals.markers.colors); } }, { key: "pushExtraColors", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a2 = this.w, s2 = e2 || a2.globals.series.length; if (null === i2 && (i2 = this.isBarDistributed || this.isHeatmapDistributed || "heatmap" === a2.config.chart.type && a2.config.plotOptions.heatmap && a2.config.plotOptions.heatmap.colorScale.inverse), i2 && a2.globals.series.length && (s2 = a2.globals.series[a2.globals.maxValsInArrayIndex].length * a2.globals.series.length), t3.length < s2) for (var r2 = s2 - t3.length, n2 = 0; n2 < r2; n2++) t3.push(t3[n2]); } }, { key: "updateThemeOptions", value: function(t3) { t3.chart = t3.chart || {}, t3.tooltip = t3.tooltip || {}; var e2 = t3.theme.mode, i2 = "dark" === e2 ? "palette4" : "light" === e2 ? "palette1" : t3.theme.palette || "palette1", a2 = "dark" === e2 ? "#f6f7f8" : "light" === e2 ? "#373d3f" : t3.chart.foreColor || "#373d3f"; return t3.tooltip.theme = e2 || "light", t3.chart.foreColor = a2, t3.theme.palette = i2, t3; } }, { key: "predefined", value: function() { var t3 = this.w.config.theme.palette, e2 = this.ctx.constructor.getThemePalettes(); return e2[t3] || e2.palette1; } }]), t2; })(); var ca = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "draw", value: function() { this.drawTitleSubtitle("title"), this.drawTitleSubtitle("subtitle"); } }, { key: "drawTitleSubtitle", value: function(t3) { var e2 = this.w, i2 = "title" === t3 ? e2.config.title : e2.config.subtitle, a2 = e2.globals.svgWidth / 2, s2 = i2.offsetY, r2 = "middle"; if ("left" === i2.align ? (a2 = 10, r2 = "start") : "right" === i2.align && (a2 = e2.globals.svgWidth - 10, r2 = "end"), a2 += i2.offsetX, s2 = s2 + parseInt(i2.style.fontSize, 10) + i2.margin / 2, void 0 !== i2.text) { var n2 = new Mi(this.ctx).drawText({ x: a2, y: s2, text: i2.text, textAnchor: r2, fontSize: i2.style.fontSize, fontFamily: i2.style.fontFamily, fontWeight: i2.style.fontWeight, foreColor: i2.style.color, opacity: 1 }); n2.node.setAttribute("class", "apexcharts-".concat(t3, "-text")), e2.globals.dom.Paper.add(n2); } } }]), t2; })(); var da = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.dCtx = e2; } return s(t2, [{ key: "getTitleSubtitleCoords", value: function(t3) { var e2 = this.w, i2 = 0, a2 = 0, s2 = "title" === t3 ? e2.config.title.floating : e2.config.subtitle.floating, r2 = e2.globals.dom.baseEl.querySelector(".apexcharts-".concat(t3, "-text")); if (null !== r2 && !s2) { var n2 = r2.getBoundingClientRect(); i2 = n2.width, a2 = e2.globals.axisCharts ? n2.height + 5 : n2.height; } return { width: i2, height: a2 }; } }, { key: "getLegendsRect", value: function() { var t3 = this.w, e2 = t3.globals.dom.elLegendWrap; t3.config.legend.height || "top" !== t3.config.legend.position && "bottom" !== t3.config.legend.position || (e2.style.maxHeight = t3.globals.svgHeight / 2 + "px"); var i2 = Object.assign({}, v.getBoundingClientRect(e2)); return null !== e2 && !t3.config.legend.floating && t3.config.legend.show ? this.dCtx.lgRect = { x: i2.x, y: i2.y, height: i2.height, width: 0 === i2.height ? 0 : i2.width } : this.dCtx.lgRect = { x: 0, y: 0, height: 0, width: 0 }, "left" !== t3.config.legend.position && "right" !== t3.config.legend.position || 1.5 * this.dCtx.lgRect.width > t3.globals.svgWidth && (this.dCtx.lgRect.width = t3.globals.svgWidth / 1.5), this.dCtx.lgRect; } }, { key: "getDatalabelsRect", value: function() { var t3 = this, e2 = this.w, i2 = []; e2.config.series.forEach((function(s3, r3) { s3.data.forEach((function(s4, n3) { var o2; o2 = e2.globals.series[r3][n3], a2 = e2.config.dataLabels.formatter(o2, { ctx: t3.dCtx.ctx, seriesIndex: r3, dataPointIndex: n3, w: e2 }), i2.push(a2); })); })); var a2 = v.getLargestStringFromArr(i2), s2 = new Mi(this.dCtx.ctx), r2 = e2.config.dataLabels.style, n2 = s2.getTextRects(a2, parseInt(r2.fontSize), r2.fontFamily); return { width: 1.05 * n2.width, height: n2.height }; } }, { key: "getLargestStringFromMultiArr", value: function(t3, e2) { var i2 = t3; if (this.w.globals.isMultiLineX) { var a2 = e2.map((function(t4, e3) { return Array.isArray(t4) ? t4.length : 1; })), s2 = Math.max.apply(Math, f(a2)); i2 = e2[a2.indexOf(s2)]; } return i2; } }]), t2; })(); var ua = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.dCtx = e2; } return s(t2, [{ key: "getxAxisLabelsCoords", value: function() { var t3, e2 = this.w, i2 = e2.globals.labels.slice(); if (e2.config.xaxis.convertedCatToNumeric && 0 === i2.length && (i2 = e2.globals.categoryLabels), e2.globals.timescaleLabels.length > 0) { var a2 = this.getxAxisTimeScaleLabelsCoords(); t3 = { width: a2.width, height: a2.height }, e2.globals.rotateXLabels = false; } else { this.dCtx.lgWidthForSideLegends = "left" !== e2.config.legend.position && "right" !== e2.config.legend.position || e2.config.legend.floating ? 0 : this.dCtx.lgRect.width; var s2 = e2.globals.xLabelFormatter, r2 = v.getLargestStringFromArr(i2), n2 = this.dCtx.dimHelpers.getLargestStringFromMultiArr(r2, i2); e2.globals.isBarHorizontal && (n2 = r2 = e2.globals.yAxisScale[0].result.reduce((function(t4, e3) { return t4.length > e3.length ? t4 : e3; }), 0)); var o2 = new Xi(this.dCtx.ctx), l2 = r2; r2 = o2.xLabelFormat(s2, r2, l2, { i: void 0, dateFormatter: new zi(this.dCtx.ctx).formatDate, w: e2 }), n2 = o2.xLabelFormat(s2, n2, l2, { i: void 0, dateFormatter: new zi(this.dCtx.ctx).formatDate, w: e2 }), (e2.config.xaxis.convertedCatToNumeric && void 0 === r2 || "" === String(r2).trim()) && (n2 = r2 = "1"); var h2 = new Mi(this.dCtx.ctx), c2 = h2.getTextRects(r2, e2.config.xaxis.labels.style.fontSize), d2 = c2; if (r2 !== n2 && (d2 = h2.getTextRects(n2, e2.config.xaxis.labels.style.fontSize)), (t3 = { width: c2.width >= d2.width ? c2.width : d2.width, height: c2.height >= d2.height ? c2.height : d2.height }).width * i2.length > e2.globals.svgWidth - this.dCtx.lgWidthForSideLegends - this.dCtx.yAxisWidth - this.dCtx.gridPad.left - this.dCtx.gridPad.right && 0 !== e2.config.xaxis.labels.rotate || e2.config.xaxis.labels.rotateAlways) { if (!e2.globals.isBarHorizontal) { e2.globals.rotateXLabels = true; var u2 = function(t4) { return h2.getTextRects(t4, e2.config.xaxis.labels.style.fontSize, e2.config.xaxis.labels.style.fontFamily, "rotate(".concat(e2.config.xaxis.labels.rotate, " 0 0)"), false); }; c2 = u2(r2), r2 !== n2 && (d2 = u2(n2)), t3.height = (c2.height > d2.height ? c2.height : d2.height) / 1.5, t3.width = c2.width > d2.width ? c2.width : d2.width; } } else e2.globals.rotateXLabels = false; } return e2.config.xaxis.labels.show || (t3 = { width: 0, height: 0 }), { width: t3.width, height: t3.height }; } }, { key: "getxAxisGroupLabelsCoords", value: function() { var t3, e2 = this.w; if (!e2.globals.hasXaxisGroups) return { width: 0, height: 0 }; var i2, a2 = (null === (t3 = e2.config.xaxis.group.style) || void 0 === t3 ? void 0 : t3.fontSize) || e2.config.xaxis.labels.style.fontSize, s2 = e2.globals.groups.map((function(t4) { return t4.title; })), r2 = v.getLargestStringFromArr(s2), n2 = this.dCtx.dimHelpers.getLargestStringFromMultiArr(r2, s2), o2 = new Mi(this.dCtx.ctx), l2 = o2.getTextRects(r2, a2), h2 = l2; return r2 !== n2 && (h2 = o2.getTextRects(n2, a2)), i2 = { width: l2.width >= h2.width ? l2.width : h2.width, height: l2.height >= h2.height ? l2.height : h2.height }, e2.config.xaxis.labels.show || (i2 = { width: 0, height: 0 }), { width: i2.width, height: i2.height }; } }, { key: "getxAxisTitleCoords", value: function() { var t3 = this.w, e2 = 0, i2 = 0; if (void 0 !== t3.config.xaxis.title.text) { var a2 = new Mi(this.dCtx.ctx).getTextRects(t3.config.xaxis.title.text, t3.config.xaxis.title.style.fontSize); e2 = a2.width, i2 = a2.height; } return { width: e2, height: i2 }; } }, { key: "getxAxisTimeScaleLabelsCoords", value: function() { var t3, e2 = this.w; this.dCtx.timescaleLabels = e2.globals.timescaleLabels.slice(); var i2 = this.dCtx.timescaleLabels.map((function(t4) { return t4.value; })), a2 = i2.reduce((function(t4, e3) { return void 0 === t4 ? (console.error("You have possibly supplied invalid Date format. Please supply a valid JavaScript Date"), 0) : t4.length > e3.length ? t4 : e3; }), 0); return 1.05 * (t3 = new Mi(this.dCtx.ctx).getTextRects(a2, e2.config.xaxis.labels.style.fontSize)).width * i2.length > e2.globals.gridWidth && 0 !== e2.config.xaxis.labels.rotate && (e2.globals.overlappingXLabels = true), t3; } }, { key: "additionalPaddingXLabels", value: function(t3) { var e2 = this, i2 = this.w, a2 = i2.globals, s2 = i2.config, r2 = s2.xaxis.type, n2 = t3.width; a2.skipLastTimelinelabel = false, a2.skipFirstTimelinelabel = false; var o2 = i2.config.yaxis[0].opposite && i2.globals.isBarHorizontal, l2 = function(t4, o3) { s2.yaxis.length > 1 && (function(t5) { return -1 !== a2.collapsedSeriesIndices.indexOf(t5); })(o3) || (function(t5) { if (e2.dCtx.timescaleLabels && e2.dCtx.timescaleLabels.length) { var o4 = e2.dCtx.timescaleLabels[0], l3 = e2.dCtx.timescaleLabels[e2.dCtx.timescaleLabels.length - 1].position + n2 / 1.75 - e2.dCtx.yAxisWidthRight, h2 = o4.position - n2 / 1.75 + e2.dCtx.yAxisWidthLeft, c2 = "right" === i2.config.legend.position && e2.dCtx.lgRect.width > 0 ? e2.dCtx.lgRect.width : 0; l3 > a2.svgWidth - a2.translateX - c2 && (a2.skipLastTimelinelabel = true), h2 < -(t5.show && !t5.floating || "bar" !== s2.chart.type && "candlestick" !== s2.chart.type && "rangeBar" !== s2.chart.type && "boxPlot" !== s2.chart.type ? 10 : n2 / 1.75) && (a2.skipFirstTimelinelabel = true); } else "datetime" === r2 ? e2.dCtx.gridPad.right < n2 && !a2.rotateXLabels && (a2.skipLastTimelinelabel = true) : "datetime" !== r2 && e2.dCtx.gridPad.right < n2 / 2 - e2.dCtx.yAxisWidthRight && !a2.rotateXLabels && !i2.config.xaxis.labels.trim && (e2.dCtx.xPadRight = n2 / 2 + 1); })(t4); }; s2.yaxis.forEach((function(t4, i3) { o2 ? (e2.dCtx.gridPad.left < n2 && (e2.dCtx.xPadLeft = n2 / 2 + 1), e2.dCtx.xPadRight = n2 / 2 + 1) : l2(t4, i3); })); } }]), t2; })(); var ga = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.dCtx = e2; } return s(t2, [{ key: "getyAxisLabelsCoords", value: function() { var t3 = this, e2 = this.w, i2 = [], a2 = 10, s2 = new Ri(this.dCtx.ctx); return e2.config.yaxis.map((function(r2, n2) { var o2 = { seriesIndex: n2, dataPointIndex: -1, w: e2 }, l2 = e2.globals.yAxisScale[n2], h2 = 0; if (!s2.isYAxisHidden(n2) && r2.labels.show && void 0 !== r2.labels.minWidth && (h2 = r2.labels.minWidth), !s2.isYAxisHidden(n2) && r2.labels.show && l2.result.length) { var c2 = e2.globals.yLabelFormatters[n2], d2 = l2.niceMin === Number.MIN_VALUE ? 0 : l2.niceMin, u2 = l2.result.reduce((function(t4, e3) { var i3, a3; return (null === (i3 = String(c2(t4, o2))) || void 0 === i3 ? void 0 : i3.length) > (null === (a3 = String(c2(e3, o2))) || void 0 === a3 ? void 0 : a3.length) ? t4 : e3; }), d2), g2 = u2 = c2(u2, o2); if (void 0 !== u2 && 0 !== u2.length || (u2 = l2.niceMax), e2.globals.isBarHorizontal) { a2 = 0; var p2 = e2.globals.labels.slice(); u2 = v.getLargestStringFromArr(p2), u2 = c2(u2, { seriesIndex: n2, dataPointIndex: -1, w: e2 }), g2 = t3.dCtx.dimHelpers.getLargestStringFromMultiArr(u2, p2); } var f2 = new Mi(t3.dCtx.ctx), x2 = "rotate(".concat(r2.labels.rotate, " 0 0)"), b2 = f2.getTextRects(u2, r2.labels.style.fontSize, r2.labels.style.fontFamily, x2, false), m2 = b2; u2 !== g2 && (m2 = f2.getTextRects(g2, r2.labels.style.fontSize, r2.labels.style.fontFamily, x2, false)), i2.push({ width: (h2 > m2.width || h2 > b2.width ? h2 : m2.width > b2.width ? m2.width : b2.width) + a2, height: m2.height > b2.height ? m2.height : b2.height }); } else i2.push({ width: 0, height: 0 }); })), i2; } }, { key: "getyAxisTitleCoords", value: function() { var t3 = this, e2 = this.w, i2 = []; return e2.config.yaxis.map((function(e3, a2) { if (e3.show && void 0 !== e3.title.text) { var s2 = new Mi(t3.dCtx.ctx), r2 = "rotate(".concat(e3.title.rotate, " 0 0)"), n2 = s2.getTextRects(e3.title.text, e3.title.style.fontSize, e3.title.style.fontFamily, r2, false); i2.push({ width: n2.width, height: n2.height }); } else i2.push({ width: 0, height: 0 }); })), i2; } }, { key: "getTotalYAxisWidth", value: function() { var t3 = this.w, e2 = 0, i2 = 0, a2 = 0, s2 = t3.globals.yAxisScale.length > 1 ? 10 : 0, r2 = new Ri(this.dCtx.ctx), n2 = function(n3, o2) { var l2 = t3.config.yaxis[o2].floating, h2 = 0; n3.width > 0 && !l2 ? (h2 = n3.width + s2, (function(e3) { return t3.globals.ignoreYAxisIndexes.indexOf(e3) > -1; })(o2) && (h2 = h2 - n3.width - s2)) : h2 = l2 || r2.isYAxisHidden(o2) ? 0 : 5, t3.config.yaxis[o2].opposite ? a2 += h2 : i2 += h2, e2 += h2; }; return t3.globals.yLabelsCoords.map((function(t4, e3) { n2(t4, e3); })), t3.globals.yTitleCoords.map((function(t4, e3) { n2(t4, e3); })), t3.globals.isBarHorizontal && !t3.config.yaxis[0].floating && (e2 = t3.globals.yLabelsCoords[0].width + t3.globals.yTitleCoords[0].width + 15), this.dCtx.yAxisWidthLeft = i2, this.dCtx.yAxisWidthRight = a2, e2; } }]), t2; })(); var pa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.dCtx = e2; } return s(t2, [{ key: "gridPadForColumnsInNumericAxis", value: function(t3) { var e2 = this.w, i2 = e2.config, a2 = e2.globals; if (a2.noData || a2.collapsedSeries.length + a2.ancillaryCollapsedSeries.length === i2.series.length) return 0; var s2 = function(t4) { return ["bar", "rangeBar", "candlestick", "boxPlot"].includes(t4); }, r2 = i2.chart.type, n2 = 0, o2 = s2(r2) ? i2.series.length : 1; a2.comboBarCount > 0 && (o2 = a2.comboBarCount), a2.collapsedSeries.forEach((function(t4) { s2(t4.type) && (o2 -= 1); })), i2.chart.stacked && (o2 = 1); var l2 = s2(r2) || a2.comboBarCount > 0, h2 = Math.abs(a2.initialMaxX - a2.initialMinX); if (l2 && a2.isXNumeric && !a2.isBarHorizontal && o2 > 0 && 0 !== h2) { h2 <= 3 && (h2 = a2.dataPoints); var c2 = h2 / t3, d2 = a2.minXDiff && a2.minXDiff / c2 > 0 ? a2.minXDiff / c2 : 0; d2 > t3 / 2 && (d2 /= 2), (n2 = d2 * parseInt(i2.plotOptions.bar.columnWidth, 10) / 100) < 1 && (n2 = 1), a2.barPadForNumericAxis = n2; } return n2; } }, { key: "gridPadFortitleSubtitle", value: function() { var t3 = this, e2 = this.w, i2 = e2.globals, a2 = this.dCtx.isSparkline || !i2.axisCharts ? 0 : 10; ["title", "subtitle"].forEach((function(s3) { void 0 !== e2.config[s3].text ? a2 += e2.config[s3].margin : a2 += t3.dCtx.isSparkline || !i2.axisCharts ? 0 : 5; })), !e2.config.legend.show || "bottom" !== e2.config.legend.position || e2.config.legend.floating || i2.axisCharts || (a2 += 10); var s2 = this.dCtx.dimHelpers.getTitleSubtitleCoords("title"), r2 = this.dCtx.dimHelpers.getTitleSubtitleCoords("subtitle"); i2.gridHeight -= s2.height + r2.height + a2, i2.translateY += s2.height + r2.height + a2; } }, { key: "setGridXPosForDualYAxis", value: function(t3, e2) { var i2 = this.w, a2 = new Ri(this.dCtx.ctx); i2.config.yaxis.forEach((function(s2, r2) { -1 !== i2.globals.ignoreYAxisIndexes.indexOf(r2) || s2.floating || a2.isYAxisHidden(r2) || (s2.opposite && (i2.globals.translateX -= e2[r2].width + t3[r2].width + parseInt(s2.labels.style.fontSize, 10) / 1.2 + 12), i2.globals.translateX < 2 && (i2.globals.translateX = 2)); })); } }]), t2; })(); var fa = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.lgRect = {}, this.yAxisWidth = 0, this.yAxisWidthLeft = 0, this.yAxisWidthRight = 0, this.xAxisHeight = 0, this.isSparkline = this.w.config.chart.sparkline.enabled, this.dimHelpers = new da(this), this.dimYAxis = new ga(this), this.dimXAxis = new ua(this), this.dimGrid = new pa(this), this.lgWidthForSideLegends = 0, this.gridPad = this.w.config.grid.padding, this.xPadRight = 0, this.xPadLeft = 0; } return s(t2, [{ key: "plotCoords", value: function() { var t3 = this, e2 = this.w, i2 = e2.globals; this.lgRect = this.dimHelpers.getLegendsRect(), this.datalabelsCoords = { width: 0, height: 0 }; var a2 = Array.isArray(e2.config.stroke.width) ? Math.max.apply(Math, f(e2.config.stroke.width)) : e2.config.stroke.width; this.isSparkline && ((e2.config.markers.discrete.length > 0 || e2.config.markers.size > 0) && Object.entries(this.gridPad).forEach((function(e3) { var i3 = p(e3, 2), a3 = i3[0], s3 = i3[1]; t3.gridPad[a3] = Math.max(s3, t3.w.globals.markers.largestSize / 1.5); })), this.gridPad.top = Math.max(a2 / 2, this.gridPad.top), this.gridPad.bottom = Math.max(a2 / 2, this.gridPad.bottom)), i2.axisCharts ? this.setDimensionsForAxisCharts() : this.setDimensionsForNonAxisCharts(), this.dimGrid.gridPadFortitleSubtitle(), i2.gridHeight = i2.gridHeight - this.gridPad.top - this.gridPad.bottom, i2.gridWidth = i2.gridWidth - this.gridPad.left - this.gridPad.right - this.xPadRight - this.xPadLeft; var s2 = this.dimGrid.gridPadForColumnsInNumericAxis(i2.gridWidth); i2.gridWidth = i2.gridWidth - 2 * s2, i2.translateX = i2.translateX + this.gridPad.left + this.xPadLeft + (s2 > 0 ? s2 : 0), i2.translateY = i2.translateY + this.gridPad.top; } }, { key: "setDimensionsForAxisCharts", value: function() { var t3 = this, e2 = this.w, i2 = e2.globals, a2 = this.dimYAxis.getyAxisLabelsCoords(), s2 = this.dimYAxis.getyAxisTitleCoords(); i2.isSlopeChart && (this.datalabelsCoords = this.dimHelpers.getDatalabelsRect()), e2.globals.yLabelsCoords = [], e2.globals.yTitleCoords = [], e2.config.yaxis.map((function(t4, i3) { e2.globals.yLabelsCoords.push({ width: a2[i3].width, index: i3 }), e2.globals.yTitleCoords.push({ width: s2[i3].width, index: i3 }); })), this.yAxisWidth = this.dimYAxis.getTotalYAxisWidth(); var r2 = this.dimXAxis.getxAxisLabelsCoords(), n2 = this.dimXAxis.getxAxisGroupLabelsCoords(), o2 = this.dimXAxis.getxAxisTitleCoords(); this.conditionalChecksForAxisCoords(r2, o2, n2), i2.translateXAxisY = e2.globals.rotateXLabels ? this.xAxisHeight / 8 : -4, i2.translateXAxisX = e2.globals.rotateXLabels && e2.globals.isXNumeric && e2.config.xaxis.labels.rotate <= -45 ? -this.xAxisWidth / 4 : 0, e2.globals.isBarHorizontal && (i2.rotateXLabels = false, i2.translateXAxisY = parseInt(e2.config.xaxis.labels.style.fontSize, 10) / 1.5 * -1), i2.translateXAxisY = i2.translateXAxisY + e2.config.xaxis.labels.offsetY, i2.translateXAxisX = i2.translateXAxisX + e2.config.xaxis.labels.offsetX; var l2 = this.yAxisWidth, h2 = this.xAxisHeight; i2.xAxisLabelsHeight = this.xAxisHeight - o2.height, i2.xAxisGroupLabelsHeight = i2.xAxisLabelsHeight - r2.height, i2.xAxisLabelsWidth = this.xAxisWidth, i2.xAxisHeight = this.xAxisHeight; var c2 = 10; ("radar" === e2.config.chart.type || this.isSparkline) && (l2 = 0, h2 = 0), this.isSparkline && (this.lgRect = { height: 0, width: 0 }), (this.isSparkline || "treemap" === e2.config.chart.type) && (l2 = 0, h2 = 0, c2 = 0), this.isSparkline || "treemap" === e2.config.chart.type || this.dimXAxis.additionalPaddingXLabels(r2); var d2 = function() { i2.translateX = l2 + t3.datalabelsCoords.width, i2.gridHeight = i2.svgHeight - t3.lgRect.height - h2 - (t3.isSparkline || "treemap" === e2.config.chart.type ? 0 : e2.globals.rotateXLabels ? 10 : 15), i2.gridWidth = i2.svgWidth - l2 - 2 * t3.datalabelsCoords.width; }; switch ("top" === e2.config.xaxis.position && (c2 = i2.xAxisHeight - e2.config.xaxis.axisTicks.height - 5), e2.config.legend.position) { case "bottom": i2.translateY = c2, d2(); break; case "top": i2.translateY = this.lgRect.height + c2, d2(); break; case "left": i2.translateY = c2, i2.translateX = this.lgRect.width + l2 + this.datalabelsCoords.width, i2.gridHeight = i2.svgHeight - h2 - 12, i2.gridWidth = i2.svgWidth - this.lgRect.width - l2 - 2 * this.datalabelsCoords.width; break; case "right": i2.translateY = c2, i2.translateX = l2 + this.datalabelsCoords.width, i2.gridHeight = i2.svgHeight - h2 - 12, i2.gridWidth = i2.svgWidth - this.lgRect.width - l2 - 2 * this.datalabelsCoords.width - 5; break; default: throw new Error("Legend position not supported"); } this.dimGrid.setGridXPosForDualYAxis(s2, a2), new aa(this.ctx).setYAxisXPosition(a2, s2); } }, { key: "setDimensionsForNonAxisCharts", value: function() { var t3 = this.w, e2 = t3.globals, i2 = t3.config, a2 = 0; t3.config.legend.show && !t3.config.legend.floating && (a2 = 20); var s2 = "pie" === i2.chart.type || "polarArea" === i2.chart.type || "donut" === i2.chart.type ? "pie" : "radialBar", r2 = i2.plotOptions[s2].offsetY, n2 = i2.plotOptions[s2].offsetX; if (!i2.legend.show || i2.legend.floating) { e2.gridHeight = e2.svgHeight; var o2 = e2.dom.elWrap.getBoundingClientRect().width; return e2.gridWidth = Math.min(o2, e2.gridHeight), e2.translateY = r2, void (e2.translateX = n2 + (e2.svgWidth - e2.gridWidth) / 2); } switch (i2.legend.position) { case "bottom": e2.gridHeight = e2.svgHeight - this.lgRect.height, e2.gridWidth = e2.svgWidth, e2.translateY = r2 - 10, e2.translateX = n2 + (e2.svgWidth - e2.gridWidth) / 2; break; case "top": e2.gridHeight = e2.svgHeight - this.lgRect.height, e2.gridWidth = e2.svgWidth, e2.translateY = this.lgRect.height + r2 + 10, e2.translateX = n2 + (e2.svgWidth - e2.gridWidth) / 2; break; case "left": e2.gridWidth = e2.svgWidth - this.lgRect.width - a2, e2.gridHeight = "auto" !== i2.chart.height ? e2.svgHeight : e2.gridWidth, e2.translateY = r2, e2.translateX = n2 + this.lgRect.width + a2; break; case "right": e2.gridWidth = e2.svgWidth - this.lgRect.width - a2 - 5, e2.gridHeight = "auto" !== i2.chart.height ? e2.svgHeight : e2.gridWidth, e2.translateY = r2, e2.translateX = n2 + 10; break; default: throw new Error("Legend position not supported"); } } }, { key: "conditionalChecksForAxisCoords", value: function(t3, e2, i2) { var a2 = this.w, s2 = a2.globals.hasXaxisGroups ? 2 : 1, r2 = i2.height + t3.height + e2.height, n2 = a2.globals.isMultiLineX ? 1.2 : a2.globals.LINE_HEIGHT_RATIO, o2 = a2.globals.rotateXLabels ? 22 : 10, l2 = a2.globals.rotateXLabels && "bottom" === a2.config.legend.position ? 10 : 0; this.xAxisHeight = r2 * n2 + s2 * o2 + l2, this.xAxisWidth = t3.width, this.xAxisHeight - e2.height > a2.config.xaxis.labels.maxHeight && (this.xAxisHeight = a2.config.xaxis.labels.maxHeight), a2.config.xaxis.labels.minHeight && this.xAxisHeight < a2.config.xaxis.labels.minHeight && (this.xAxisHeight = a2.config.xaxis.labels.minHeight), a2.config.xaxis.floating && (this.xAxisHeight = 0); var h2 = 0, c2 = 0; a2.config.yaxis.forEach((function(t4) { h2 += t4.labels.minWidth, c2 += t4.labels.maxWidth; })), this.yAxisWidth < h2 && (this.yAxisWidth = h2), this.yAxisWidth > c2 && (this.yAxisWidth = c2); } }]), t2; })(); var xa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.lgCtx = e2; } return s(t2, [{ key: "getLegendStyles", value: function() { var t3, e2, i2, a2 = document.createElement("style"); a2.setAttribute("type", "text/css"); var s2 = (null === (t3 = this.lgCtx.ctx) || void 0 === t3 || null === (e2 = t3.opts) || void 0 === e2 || null === (i2 = e2.chart) || void 0 === i2 ? void 0 : i2.nonce) || this.w.config.chart.nonce; s2 && a2.setAttribute("nonce", s2); var r2 = document.createTextNode(Zi); return a2.appendChild(r2), a2; } }, { key: "getLegendDimensions", value: function() { var t3 = this.w.globals.dom.baseEl.querySelector(".apexcharts-legend").getBoundingClientRect(), e2 = t3.width; return { clwh: t3.height, clww: e2 }; } }, { key: "appendToForeignObject", value: function() { var t3 = this.w.globals; false !== this.w.config.chart.injectStyleSheet && t3.dom.elLegendForeign.appendChild(this.getLegendStyles()); } }, { key: "toggleDataSeries", value: function(t3, e2) { var i2 = this, a2 = this.w; if (a2.globals.axisCharts || "radialBar" === a2.config.chart.type) { a2.globals.resized = true; var s2 = null, r2 = null; if (a2.globals.risingSeries = [], a2.globals.axisCharts ? (s2 = a2.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(t3, "']")), r2 = parseInt(s2.getAttribute("data:realIndex"), 10)) : (s2 = a2.globals.dom.baseEl.querySelector(".apexcharts-series[rel='".concat(t3 + 1, "']")), r2 = parseInt(s2.getAttribute("rel"), 10) - 1), e2) [{ cs: a2.globals.collapsedSeries, csi: a2.globals.collapsedSeriesIndices }, { cs: a2.globals.ancillaryCollapsedSeries, csi: a2.globals.ancillaryCollapsedSeriesIndices }].forEach((function(t4) { i2.riseCollapsedSeries(t4.cs, t4.csi, r2); })); else this.hideSeries({ seriesEl: s2, realIndex: r2 }); } else { var n2 = a2.globals.dom.Paper.findOne(" .apexcharts-series[rel='".concat(t3 + 1, "'] path")), o2 = a2.config.chart.type; if ("pie" === o2 || "polarArea" === o2 || "donut" === o2) { var l2 = a2.config.plotOptions.pie.donut.labels; new Mi(this.lgCtx.ctx).pathMouseDown(n2, null), this.lgCtx.ctx.pie.printDataLabelsInner(n2.node, l2); } n2.fire("click"); } } }, { key: "getSeriesAfterCollapsing", value: function(t3) { var e2 = t3.realIndex, i2 = this.w, a2 = i2.globals, s2 = v.clone(i2.config.series); if (a2.axisCharts) { var r2 = i2.config.yaxis[a2.seriesYAxisReverseMap[e2]], n2 = { index: e2, data: s2[e2].data.slice(), type: s2[e2].type || i2.config.chart.type }; if (r2 && r2.show && r2.showAlways) a2.ancillaryCollapsedSeriesIndices.indexOf(e2) < 0 && (a2.ancillaryCollapsedSeries.push(n2), a2.ancillaryCollapsedSeriesIndices.push(e2)); else if (a2.collapsedSeriesIndices.indexOf(e2) < 0) { a2.collapsedSeries.push(n2), a2.collapsedSeriesIndices.push(e2); var o2 = a2.risingSeries.indexOf(e2); a2.risingSeries.splice(o2, 1); } } else a2.collapsedSeries.push({ index: e2, data: s2[e2] }), a2.collapsedSeriesIndices.push(e2); return a2.allSeriesCollapsed = a2.collapsedSeries.length + a2.ancillaryCollapsedSeries.length === i2.config.series.length, this._getSeriesBasedOnCollapsedState(s2); } }, { key: "hideSeries", value: function(t3) { for (var e2 = t3.seriesEl, i2 = t3.realIndex, a2 = this.w, s2 = this.getSeriesAfterCollapsing({ realIndex: i2 }), r2 = e2.childNodes, n2 = 0; n2 < r2.length; n2++) r2[n2].classList.contains("apexcharts-series-markers-wrap") && (r2[n2].classList.contains("apexcharts-hide") ? r2[n2].classList.remove("apexcharts-hide") : r2[n2].classList.add("apexcharts-hide")); this.lgCtx.ctx.updateHelpers._updateSeries(s2, a2.config.chart.animations.dynamicAnimation.enabled); } }, { key: "riseCollapsedSeries", value: function(t3, e2, i2) { var a2 = this.w, s2 = v.clone(a2.config.series); if (t3.length > 0) { for (var r2 = 0; r2 < t3.length; r2++) t3[r2].index === i2 && (a2.globals.axisCharts ? s2[i2].data = t3[r2].data.slice() : s2[i2] = t3[r2].data, "number" != typeof s2[i2] && (s2[i2].hidden = false), t3.splice(r2, 1), e2.splice(r2, 1), a2.globals.risingSeries.push(i2)); s2 = this._getSeriesBasedOnCollapsedState(s2), this.lgCtx.ctx.updateHelpers._updateSeries(s2, a2.config.chart.animations.dynamicAnimation.enabled); } } }, { key: "_getSeriesBasedOnCollapsedState", value: function(t3) { var e2 = this.w, i2 = 0; return e2.globals.axisCharts ? t3.forEach((function(a2, s2) { e2.globals.collapsedSeriesIndices.indexOf(s2) < 0 && e2.globals.ancillaryCollapsedSeriesIndices.indexOf(s2) < 0 || (t3[s2].data = [], i2++); })) : t3.forEach((function(a2, s2) { !e2.globals.collapsedSeriesIndices.indexOf(s2) < 0 && (t3[s2] = 0, i2++); })), e2.globals.allSeriesCollapsed = i2 === t3.length, t3; } }]), t2; })(); var ba = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.onLegendClick = this.onLegendClick.bind(this), this.onLegendHovered = this.onLegendHovered.bind(this), this.isBarsDistributed = "bar" === this.w.config.chart.type && this.w.config.plotOptions.bar.distributed && 1 === this.w.config.series.length, this.legendHelpers = new xa(this); } return s(t2, [{ key: "init", value: function() { var t3 = this.w, e2 = t3.globals, i2 = t3.config, a2 = i2.legend.showForSingleSeries && 1 === e2.series.length || this.isBarsDistributed || e2.series.length > 1; if (this.legendHelpers.appendToForeignObject(), (a2 || !e2.axisCharts) && i2.legend.show) { for (; e2.dom.elLegendWrap.firstChild; ) e2.dom.elLegendWrap.removeChild(e2.dom.elLegendWrap.firstChild); this.drawLegends(), "bottom" === i2.legend.position || "top" === i2.legend.position ? this.legendAlignHorizontal() : "right" !== i2.legend.position && "left" !== i2.legend.position || this.legendAlignVertical(); } } }, { key: "createLegendMarker", value: function(t3) { var e2 = t3.i, i2 = t3.fillcolor, a2 = this.w, s2 = document.createElement("span"); s2.classList.add("apexcharts-legend-marker"); var r2 = a2.config.legend.markers.shape || a2.config.markers.shape, n2 = r2; Array.isArray(r2) && (n2 = r2[e2]); var o2 = Array.isArray(a2.config.legend.markers.size) ? parseFloat(a2.config.legend.markers.size[e2]) : parseFloat(a2.config.legend.markers.size), l2 = Array.isArray(a2.config.legend.markers.offsetX) ? parseFloat(a2.config.legend.markers.offsetX[e2]) : parseFloat(a2.config.legend.markers.offsetX), h2 = Array.isArray(a2.config.legend.markers.offsetY) ? parseFloat(a2.config.legend.markers.offsetY[e2]) : parseFloat(a2.config.legend.markers.offsetY), c2 = Array.isArray(a2.config.legend.markers.strokeWidth) ? parseFloat(a2.config.legend.markers.strokeWidth[e2]) : parseFloat(a2.config.legend.markers.strokeWidth), d2 = s2.style; if (d2.height = 2 * (o2 + c2) + "px", d2.width = 2 * (o2 + c2) + "px", d2.left = l2 + "px", d2.top = h2 + "px", a2.config.legend.markers.customHTML) d2.background = "transparent", d2.color = i2[e2], Array.isArray(a2.config.legend.markers.customHTML) ? a2.config.legend.markers.customHTML[e2] && (s2.innerHTML = a2.config.legend.markers.customHTML[e2]()) : s2.innerHTML = a2.config.legend.markers.customHTML(); else { var g2 = new Vi(this.ctx).getMarkerConfig({ cssClass: "apexcharts-legend-marker apexcharts-marker apexcharts-marker-".concat(n2), seriesIndex: e2, strokeWidth: c2, size: o2 }), p2 = window.SVG().addTo(s2).size("100%", "100%"), f2 = new Mi(this.ctx).drawMarker(0, 0, u(u({}, g2), {}, { pointFillColor: Array.isArray(i2) ? i2[e2] : g2.pointFillColor, shape: n2 })); a2.globals.dom.Paper.find(".apexcharts-legend-marker.apexcharts-marker").forEach((function(t4) { t4.node.classList.contains("apexcharts-marker-triangle") ? t4.node.style.transform = "translate(50%, 45%)" : t4.node.style.transform = "translate(50%, 50%)"; })), p2.add(f2); } return s2; } }, { key: "drawLegends", value: function() { var t3 = this, e2 = this, i2 = this.w, a2 = i2.config.legend.fontFamily, s2 = i2.globals.seriesNames, r2 = i2.config.legend.markers.fillColors ? i2.config.legend.markers.fillColors.slice() : i2.globals.colors.slice(); if ("heatmap" === i2.config.chart.type) { var n2 = i2.config.plotOptions.heatmap.colorScale.ranges; s2 = n2.map((function(t4) { return t4.name ? t4.name : t4.from + " - " + t4.to; })), r2 = n2.map((function(t4) { return t4.color; })); } else this.isBarsDistributed && (s2 = i2.globals.labels.slice()); i2.config.legend.customLegendItems.length && (s2 = i2.config.legend.customLegendItems); var o2 = i2.globals.legendFormatter, l2 = i2.config.legend.inverseOrder, h2 = []; i2.globals.seriesGroups.length > 1 && i2.config.legend.clusterGroupedSeries && i2.globals.seriesGroups.forEach((function(t4, e3) { h2[e3] = document.createElement("div"), h2[e3].classList.add("apexcharts-legend-group", "apexcharts-legend-group-".concat(e3)), "horizontal" === i2.config.legend.clusterGroupedSeriesOrientation ? i2.globals.dom.elLegendWrap.classList.add("apexcharts-legend-group-horizontal") : h2[e3].classList.add("apexcharts-legend-group-vertical"); })); for (var c2 = function(e3) { var n3, l3 = o2(s2[e3], { seriesIndex: e3, w: i2 }), c3 = false, d3 = false; if (i2.globals.collapsedSeries.length > 0) for (var u2 = 0; u2 < i2.globals.collapsedSeries.length; u2++) i2.globals.collapsedSeries[u2].index === e3 && (c3 = true); if (i2.globals.ancillaryCollapsedSeriesIndices.length > 0) for (var g2 = 0; g2 < i2.globals.ancillaryCollapsedSeriesIndices.length; g2++) i2.globals.ancillaryCollapsedSeriesIndices[g2] === e3 && (d3 = true); var p2 = t3.createLegendMarker({ i: e3, fillcolor: r2 }); Mi.setAttrs(p2, { rel: e3 + 1, "data:collapsed": c3 || d3 }), (c3 || d3) && p2.classList.add("apexcharts-inactive-legend"); var f2 = document.createElement("div"), x2 = document.createElement("span"); x2.classList.add("apexcharts-legend-text"), x2.innerHTML = Array.isArray(l3) ? l3.join(" ") : l3; var b2 = i2.config.legend.labels.useSeriesColors ? i2.globals.colors[e3] : Array.isArray(i2.config.legend.labels.colors) ? null === (n3 = i2.config.legend.labels.colors) || void 0 === n3 ? void 0 : n3[e3] : i2.config.legend.labels.colors; b2 || (b2 = i2.config.chart.foreColor), x2.style.color = b2, x2.style.fontSize = parseFloat(i2.config.legend.fontSize) + "px", x2.style.fontWeight = i2.config.legend.fontWeight, x2.style.fontFamily = a2 || i2.config.chart.fontFamily, Mi.setAttrs(x2, { rel: e3 + 1, i: e3, "data:default-text": encodeURIComponent(l3), "data:collapsed": c3 || d3 }), f2.appendChild(p2), f2.appendChild(x2); var m2 = new Pi(t3.ctx); i2.config.legend.showForZeroSeries || 0 === m2.getSeriesTotalByIndex(e3) && m2.seriesHaveSameValues(e3) && !m2.isSeriesNull(e3) && -1 === i2.globals.collapsedSeriesIndices.indexOf(e3) && -1 === i2.globals.ancillaryCollapsedSeriesIndices.indexOf(e3) && f2.classList.add("apexcharts-hidden-zero-series"); i2.config.legend.showForNullSeries || m2.isSeriesNull(e3) && -1 === i2.globals.collapsedSeriesIndices.indexOf(e3) && -1 === i2.globals.ancillaryCollapsedSeriesIndices.indexOf(e3) && f2.classList.add("apexcharts-hidden-null-series"), h2.length ? i2.globals.seriesGroups.forEach((function(t4, a3) { var s3; t4.includes(null === (s3 = i2.config.series[e3]) || void 0 === s3 ? void 0 : s3.name) && (i2.globals.dom.elLegendWrap.appendChild(h2[a3]), h2[a3].appendChild(f2)); })) : i2.globals.dom.elLegendWrap.appendChild(f2), i2.globals.dom.elLegendWrap.classList.add("apexcharts-align-".concat(i2.config.legend.horizontalAlign)), i2.globals.dom.elLegendWrap.classList.add("apx-legend-position-" + i2.config.legend.position), f2.classList.add("apexcharts-legend-series"), f2.style.margin = "".concat(i2.config.legend.itemMargin.vertical, "px ").concat(i2.config.legend.itemMargin.horizontal, "px"), i2.globals.dom.elLegendWrap.style.width = i2.config.legend.width ? i2.config.legend.width + "px" : "", i2.globals.dom.elLegendWrap.style.height = i2.config.legend.height ? i2.config.legend.height + "px" : "", Mi.setAttrs(f2, { rel: e3 + 1, seriesName: v.escapeString(s2[e3]), "data:collapsed": c3 || d3 }), (c3 || d3) && f2.classList.add("apexcharts-inactive-legend"), i2.config.legend.onItemClick.toggleDataSeries || f2.classList.add("apexcharts-no-click"); }, d2 = l2 ? s2.length - 1 : 0; l2 ? d2 >= 0 : d2 <= s2.length - 1; l2 ? d2-- : d2++) c2(d2); i2.globals.dom.elWrap.addEventListener("click", e2.onLegendClick, true), i2.config.legend.onItemHover.highlightDataSeries && 0 === i2.config.legend.customLegendItems.length && (i2.globals.dom.elWrap.addEventListener("mousemove", e2.onLegendHovered, true), i2.globals.dom.elWrap.addEventListener("mouseout", e2.onLegendHovered, true)); } }, { key: "setLegendWrapXY", value: function(t3, e2) { var i2 = this.w, a2 = i2.globals.dom.elLegendWrap, s2 = a2.clientHeight, r2 = 0, n2 = 0; if ("bottom" === i2.config.legend.position) n2 = i2.globals.svgHeight - Math.min(s2, i2.globals.svgHeight / 2) - 5; else if ("top" === i2.config.legend.position) { var o2 = new fa(this.ctx), l2 = o2.dimHelpers.getTitleSubtitleCoords("title").height, h2 = o2.dimHelpers.getTitleSubtitleCoords("subtitle").height; n2 = (l2 > 0 ? l2 - 10 : 0) + (h2 > 0 ? h2 - 10 : 0); } a2.style.position = "absolute", r2 = r2 + t3 + i2.config.legend.offsetX, n2 = n2 + e2 + i2.config.legend.offsetY, a2.style.left = r2 + "px", a2.style.top = n2 + "px", "right" === i2.config.legend.position && (a2.style.left = "auto", a2.style.right = 25 + i2.config.legend.offsetX + "px"); ["width", "height"].forEach((function(t4) { a2.style[t4] && (a2.style[t4] = parseInt(i2.config.legend[t4], 10) + "px"); })); } }, { key: "legendAlignHorizontal", value: function() { var t3 = this.w; t3.globals.dom.elLegendWrap.style.right = 0; var e2 = new fa(this.ctx), i2 = e2.dimHelpers.getTitleSubtitleCoords("title"), a2 = e2.dimHelpers.getTitleSubtitleCoords("subtitle"), s2 = 0; "top" === t3.config.legend.position && (s2 = i2.height + a2.height + t3.config.title.margin + t3.config.subtitle.margin - 10), this.setLegendWrapXY(20, s2); } }, { key: "legendAlignVertical", value: function() { var t3 = this.w, e2 = this.legendHelpers.getLegendDimensions(), i2 = 0; "left" === t3.config.legend.position && (i2 = 20), "right" === t3.config.legend.position && (i2 = t3.globals.svgWidth - e2.clww - 10), this.setLegendWrapXY(i2, 20); } }, { key: "onLegendHovered", value: function(t3) { var e2 = this.w, i2 = t3.target.classList.contains("apexcharts-legend-series") || t3.target.classList.contains("apexcharts-legend-text") || t3.target.classList.contains("apexcharts-legend-marker"); if ("heatmap" === e2.config.chart.type || this.isBarsDistributed) { if (i2) { var a2 = parseInt(t3.target.getAttribute("rel"), 10) - 1; this.ctx.events.fireEvent("legendHover", [this.ctx, a2, this.w]), new $i(this.ctx).highlightRangeInSeries(t3, t3.target); } } else !t3.target.classList.contains("apexcharts-inactive-legend") && i2 && new $i(this.ctx).toggleSeriesOnHover(t3, t3.target); } }, { key: "onLegendClick", value: function(t3) { var e2 = this.w; if (!e2.config.legend.customLegendItems.length && (t3.target.classList.contains("apexcharts-legend-series") || t3.target.classList.contains("apexcharts-legend-text") || t3.target.classList.contains("apexcharts-legend-marker"))) { var i2 = parseInt(t3.target.getAttribute("rel"), 10) - 1, a2 = "true" === t3.target.getAttribute("data:collapsed"), s2 = this.w.config.chart.events.legendClick; "function" == typeof s2 && s2(this.ctx, i2, this.w), this.ctx.events.fireEvent("legendClick", [this.ctx, i2, this.w]); var r2 = this.w.config.legend.markers.onClick; "function" == typeof r2 && t3.target.classList.contains("apexcharts-legend-marker") && (r2(this.ctx, i2, this.w), this.ctx.events.fireEvent("legendMarkerClick", [this.ctx, i2, this.w])), "treemap" !== e2.config.chart.type && "heatmap" !== e2.config.chart.type && !this.isBarsDistributed && e2.config.legend.onItemClick.toggleDataSeries && this.legendHelpers.toggleDataSeries(i2, a2); } } }]), t2; })(); var ma = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; var a2 = this.w; this.ev = this.w.config.chart.events, this.selectedClass = "apexcharts-selected", this.localeValues = this.w.globals.locale.toolbar, this.minX = a2.globals.minX, this.maxX = a2.globals.maxX; } return s(t2, [{ key: "createToolbar", value: function() { var t3 = this, e2 = this.w, i2 = function() { return document.createElement("div"); }, a2 = i2(); if (a2.setAttribute("class", "apexcharts-toolbar"), a2.style.top = e2.config.chart.toolbar.offsetY + "px", a2.style.right = 3 - e2.config.chart.toolbar.offsetX + "px", e2.globals.dom.elWrap.appendChild(a2), this.elZoom = i2(), this.elZoomIn = i2(), this.elZoomOut = i2(), this.elPan = i2(), this.elSelection = i2(), this.elZoomReset = i2(), this.elMenuIcon = i2(), this.elMenu = i2(), this.elCustomIcons = [], this.t = e2.config.chart.toolbar.tools, Array.isArray(this.t.customIcons)) for (var s2 = 0; s2 < this.t.customIcons.length; s2++) this.elCustomIcons.push(i2()); var r2 = [], n2 = function(i3, a3, s3) { var n3 = i3.toLowerCase(); t3.t[n3] && e2.config.chart.zoom.enabled && r2.push({ el: a3, icon: "string" == typeof t3.t[n3] ? t3.t[n3] : s3, title: t3.localeValues[i3], class: "apexcharts-".concat(n3, "-icon") }); }; n2("zoomIn", this.elZoomIn, '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">\n <path d="M0 0h24v24H0z" fill="none"/>\n <path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\n</svg>\n'), n2("zoomOut", this.elZoomOut, '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">\n <path d="M0 0h24v24H0z" fill="none"/>\n <path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\n</svg>\n'); var o2 = function(i3) { t3.t[i3] && e2.config.chart[i3].enabled && r2.push({ el: "zoom" === i3 ? t3.elZoom : t3.elSelection, icon: "string" == typeof t3.t[i3] ? t3.t[i3] : "zoom" === i3 ? '<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" height="24" viewBox="0 0 24 24" width="24">\n <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>\n <path d="M0 0h24v24H0V0z" fill="none"/>\n <path d="M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z"/>\n</svg>' : '<svg fill="#6E8192" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">\n <path d="M0 0h24v24H0z" fill="none"/>\n <path d="M3 5h2V3c-1.1 0-2 .9-2 2zm0 8h2v-2H3v2zm4 8h2v-2H7v2zM3 9h2V7H3v2zm10-6h-2v2h2V3zm6 0v2h2c0-1.1-.9-2-2-2zM5 21v-2H3c0 1.1.9 2 2 2zm-2-4h2v-2H3v2zM9 3H7v2h2V3zm2 18h2v-2h-2v2zm8-8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2zm0-12h2V7h-2v2zm0 8h2v-2h-2v2zm-4 4h2v-2h-2v2zm0-16h2V3h-2v2z"/>\n</svg>', title: t3.localeValues["zoom" === i3 ? "selectionZoom" : "selection"], class: "apexcharts-".concat(i3, "-icon") }); }; o2("zoom"), o2("selection"), this.t.pan && e2.config.chart.zoom.enabled && r2.push({ el: this.elPan, icon: "string" == typeof this.t.pan ? this.t.pan : '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#000000" height="24" viewBox="0 0 24 24" width="24">\n <defs>\n <path d="M0 0h24v24H0z" id="a"/>\n </defs>\n <clipPath id="b">\n <use overflow="visible" xlink:href="#a"/>\n </clipPath>\n <path clip-path="url(#b)" d="M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z"/>\n</svg>', title: this.localeValues.pan, class: "apexcharts-pan-icon" }), n2("reset", this.elZoomReset, '<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">\n <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>\n <path d="M0 0h24v24H0z" fill="none"/>\n</svg>'), this.t.download && r2.push({ el: this.elMenuIcon, icon: "string" == typeof this.t.download ? this.t.download : '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>', title: this.localeValues.menu, class: "apexcharts-menu-icon" }); for (var l2 = 0; l2 < this.elCustomIcons.length; l2++) r2.push({ el: this.elCustomIcons[l2], icon: this.t.customIcons[l2].icon, title: this.t.customIcons[l2].title, index: this.t.customIcons[l2].index, class: "apexcharts-toolbar-custom-icon " + this.t.customIcons[l2].class }); r2.forEach((function(t4, e3) { t4.index && v.moveIndexInArray(r2, e3, t4.index); })); for (var h2 = 0; h2 < r2.length; h2++) Mi.setAttrs(r2[h2].el, { class: r2[h2].class, title: r2[h2].title }), r2[h2].el.innerHTML = r2[h2].icon, a2.appendChild(r2[h2].el); this._createHamburgerMenu(a2), e2.globals.zoomEnabled ? this.elZoom.classList.add(this.selectedClass) : e2.globals.panEnabled ? this.elPan.classList.add(this.selectedClass) : e2.globals.selectionEnabled && this.elSelection.classList.add(this.selectedClass), this.addToolbarEventListeners(); } }, { key: "_createHamburgerMenu", value: function(t3) { this.elMenuItems = [], t3.appendChild(this.elMenu), Mi.setAttrs(this.elMenu, { class: "apexcharts-menu" }); for (var e2 = [{ name: "exportSVG", title: this.localeValues.exportToSVG }, { name: "exportPNG", title: this.localeValues.exportToPNG }, { name: "exportCSV", title: this.localeValues.exportToCSV }], i2 = 0; i2 < e2.length; i2++) this.elMenuItems.push(document.createElement("div")), this.elMenuItems[i2].innerHTML = e2[i2].title, Mi.setAttrs(this.elMenuItems[i2], { class: "apexcharts-menu-item ".concat(e2[i2].name), title: e2[i2].title }), this.elMenu.appendChild(this.elMenuItems[i2]); } }, { key: "addToolbarEventListeners", value: function() { var t3 = this; this.elZoomReset.addEventListener("click", this.handleZoomReset.bind(this)), this.elSelection.addEventListener("click", this.toggleZoomSelection.bind(this, "selection")), this.elZoom.addEventListener("click", this.toggleZoomSelection.bind(this, "zoom")), this.elZoomIn.addEventListener("click", this.handleZoomIn.bind(this)), this.elZoomOut.addEventListener("click", this.handleZoomOut.bind(this)), this.elPan.addEventListener("click", this.togglePanning.bind(this)), this.elMenuIcon.addEventListener("click", this.toggleMenu.bind(this)), this.elMenuItems.forEach((function(e3) { e3.classList.contains("exportSVG") ? e3.addEventListener("click", t3.handleDownload.bind(t3, "svg")) : e3.classList.contains("exportPNG") ? e3.addEventListener("click", t3.handleDownload.bind(t3, "png")) : e3.classList.contains("exportCSV") && e3.addEventListener("click", t3.handleDownload.bind(t3, "csv")); })); for (var e2 = 0; e2 < this.t.customIcons.length; e2++) this.elCustomIcons[e2].addEventListener("click", this.t.customIcons[e2].click.bind(this, this.ctx, this.ctx.w)); } }, { key: "toggleZoomSelection", value: function(t3) { this.ctx.getSyncedCharts().forEach((function(e2) { e2.ctx.toolbar.toggleOtherControls(); var i2 = "selection" === t3 ? e2.ctx.toolbar.elSelection : e2.ctx.toolbar.elZoom, a2 = "selection" === t3 ? "selectionEnabled" : "zoomEnabled"; e2.w.globals[a2] = !e2.w.globals[a2], i2.classList.contains(e2.ctx.toolbar.selectedClass) ? i2.classList.remove(e2.ctx.toolbar.selectedClass) : i2.classList.add(e2.ctx.toolbar.selectedClass); })); } }, { key: "getToolbarIconsReference", value: function() { var t3 = this.w; this.elZoom || (this.elZoom = t3.globals.dom.baseEl.querySelector(".apexcharts-zoom-icon")), this.elPan || (this.elPan = t3.globals.dom.baseEl.querySelector(".apexcharts-pan-icon")), this.elSelection || (this.elSelection = t3.globals.dom.baseEl.querySelector(".apexcharts-selection-icon")); } }, { key: "enableZoomPanFromToolbar", value: function(t3) { this.toggleOtherControls(), "pan" === t3 ? this.w.globals.panEnabled = true : this.w.globals.zoomEnabled = true; var e2 = "pan" === t3 ? this.elPan : this.elZoom, i2 = "pan" === t3 ? this.elZoom : this.elPan; e2 && e2.classList.add(this.selectedClass), i2 && i2.classList.remove(this.selectedClass); } }, { key: "togglePanning", value: function() { this.ctx.getSyncedCharts().forEach((function(t3) { t3.ctx.toolbar.toggleOtherControls(), t3.w.globals.panEnabled = !t3.w.globals.panEnabled, t3.ctx.toolbar.elPan.classList.contains(t3.ctx.toolbar.selectedClass) ? t3.ctx.toolbar.elPan.classList.remove(t3.ctx.toolbar.selectedClass) : t3.ctx.toolbar.elPan.classList.add(t3.ctx.toolbar.selectedClass); })); } }, { key: "toggleOtherControls", value: function() { var t3 = this, e2 = this.w; e2.globals.panEnabled = false, e2.globals.zoomEnabled = false, e2.globals.selectionEnabled = false, this.getToolbarIconsReference(), [this.elPan, this.elSelection, this.elZoom].forEach((function(e3) { e3 && e3.classList.remove(t3.selectedClass); })); } }, { key: "handleZoomIn", value: function() { var t3 = this.w; t3.globals.isRangeBar && (this.minX = t3.globals.minY, this.maxX = t3.globals.maxY); var e2 = (this.minX + this.maxX) / 2, i2 = (this.minX + e2) / 2, a2 = (this.maxX + e2) / 2, s2 = this._getNewMinXMaxX(i2, a2); t3.globals.disableZoomIn || this.zoomUpdateOptions(s2.minX, s2.maxX); } }, { key: "handleZoomOut", value: function() { var t3 = this.w; if (t3.globals.isRangeBar && (this.minX = t3.globals.minY, this.maxX = t3.globals.maxY), !("datetime" === t3.config.xaxis.type && new Date(this.minX).getUTCFullYear() < 1e3)) { var e2 = (this.minX + this.maxX) / 2, i2 = this.minX - (e2 - this.minX), a2 = this.maxX - (e2 - this.maxX), s2 = this._getNewMinXMaxX(i2, a2); t3.globals.disableZoomOut || this.zoomUpdateOptions(s2.minX, s2.maxX); } } }, { key: "_getNewMinXMaxX", value: function(t3, e2) { var i2 = this.w.config.xaxis.convertedCatToNumeric; return { minX: i2 ? Math.floor(t3) : t3, maxX: i2 ? Math.floor(e2) : e2 }; } }, { key: "zoomUpdateOptions", value: function(t3, e2) { var i2 = this.w; if (void 0 !== t3 || void 0 !== e2) { if (!(i2.config.xaxis.convertedCatToNumeric && (t3 < 1 && (t3 = 1, e2 = i2.globals.dataPoints), e2 - t3 < 2))) { var a2 = { min: t3, max: e2 }, s2 = this.getBeforeZoomRange(a2); s2 && (a2 = s2.xaxis); var r2 = { xaxis: a2 }, n2 = v.clone(i2.globals.initialConfig.yaxis); i2.config.chart.group || (r2.yaxis = n2), this.w.globals.zoomed = true, this.ctx.updateHelpers._updateOptions(r2, false, this.w.config.chart.animations.dynamicAnimation.enabled), this.zoomCallback(a2, n2); } } else this.handleZoomReset(); } }, { key: "zoomCallback", value: function(t3, e2) { "function" == typeof this.ev.zoomed && (this.ev.zoomed(this.ctx, { xaxis: t3, yaxis: e2 }), this.ctx.events.fireEvent("zoomed", { xaxis: t3, yaxis: e2 })); } }, { key: "getBeforeZoomRange", value: function(t3, e2) { var i2 = null; return "function" == typeof this.ev.beforeZoom && (i2 = this.ev.beforeZoom(this, { xaxis: t3, yaxis: e2 })), i2; } }, { key: "toggleMenu", value: function() { var t3 = this; window.setTimeout((function() { t3.elMenu.classList.contains("apexcharts-menu-open") ? t3.elMenu.classList.remove("apexcharts-menu-open") : t3.elMenu.classList.add("apexcharts-menu-open"); }), 0); } }, { key: "handleDownload", value: function(t3) { var e2 = this.w, i2 = new Qi(this.ctx); switch (t3) { case "svg": i2.exportToSVG(this.ctx); break; case "png": i2.exportToPng(this.ctx); break; case "csv": i2.exportToCSV({ series: e2.config.series, columnDelimiter: e2.config.chart.toolbar.export.csv.columnDelimiter }); } } }, { key: "handleZoomReset", value: function(t3) { this.ctx.getSyncedCharts().forEach((function(t4) { var e2 = t4.w; if (e2.globals.lastXAxis.min = e2.globals.initialConfig.xaxis.min, e2.globals.lastXAxis.max = e2.globals.initialConfig.xaxis.max, t4.updateHelpers.revertDefaultAxisMinMax(), "function" == typeof e2.config.chart.events.beforeResetZoom) { var i2 = e2.config.chart.events.beforeResetZoom(t4, e2); i2 && t4.updateHelpers.revertDefaultAxisMinMax(i2); } "function" == typeof e2.config.chart.events.zoomed && t4.ctx.toolbar.zoomCallback({ min: e2.config.xaxis.min, max: e2.config.xaxis.max }), e2.globals.zoomed = false; var a2 = t4.ctx.series.emptyCollapsedSeries(v.clone(e2.globals.initialSeries)); t4.updateHelpers._updateSeries(a2, e2.config.chart.animations.dynamicAnimation.enabled); })); } }, { key: "destroy", value: function() { this.elZoom = null, this.elZoomIn = null, this.elZoomOut = null, this.elPan = null, this.elSelection = null, this.elZoomReset = null, this.elMenuIcon = null; } }]), t2; })(); var va = (function(t2) { h(a2, ma); var e2 = n(a2); function a2(t3) { var s2; return i(this, a2), (s2 = e2.call(this, t3)).ctx = t3, s2.w = t3.w, s2.dragged = false, s2.graphics = new Mi(s2.ctx), s2.eventList = ["mousedown", "mouseleave", "mousemove", "touchstart", "touchmove", "mouseup", "touchend", "wheel"], s2.clientX = 0, s2.clientY = 0, s2.startX = 0, s2.endX = 0, s2.dragX = 0, s2.startY = 0, s2.endY = 0, s2.dragY = 0, s2.moveDirection = "none", s2.debounceTimer = null, s2.debounceDelay = 100, s2.wheelDelay = 400, s2; } return s(a2, [{ key: "init", value: function(t3) { var e3 = this, i2 = t3.xyRatios, a3 = this.w, s2 = this; this.xyRatios = i2, this.zoomRect = this.graphics.drawRect(0, 0, 0, 0), this.selectionRect = this.graphics.drawRect(0, 0, 0, 0), this.gridRect = a3.globals.dom.baseEl.querySelector(".apexcharts-grid"), this.constraints = new kt(0, 0, a3.globals.gridWidth, a3.globals.gridHeight), this.zoomRect.node.classList.add("apexcharts-zoom-rect"), this.selectionRect.node.classList.add("apexcharts-selection-rect"), a3.globals.dom.Paper.add(this.zoomRect), a3.globals.dom.Paper.add(this.selectionRect), "x" === a3.config.chart.selection.type ? this.slDraggableRect = this.selectionRect.draggable({ minX: 0, minY: 0, maxX: a3.globals.gridWidth, maxY: a3.globals.gridHeight }).on("dragmove.namespace", this.selectionDragging.bind(this, "dragging")) : "y" === a3.config.chart.selection.type ? this.slDraggableRect = this.selectionRect.draggable({ minX: 0, maxX: a3.globals.gridWidth }).on("dragmove.namespace", this.selectionDragging.bind(this, "dragging")) : this.slDraggableRect = this.selectionRect.draggable().on("dragmove.namespace", this.selectionDragging.bind(this, "dragging")), this.preselectedSelection(), this.hoverArea = a3.globals.dom.baseEl.querySelector("".concat(a3.globals.chartClass, " .apexcharts-svg")), this.hoverArea.classList.add("apexcharts-zoomable"), this.eventList.forEach((function(t4) { e3.hoverArea.addEventListener(t4, s2.svgMouseEvents.bind(s2, i2), { capture: false, passive: true }); })), a3.config.chart.zoom.enabled && a3.config.chart.zoom.allowMouseWheelZoom && this.hoverArea.addEventListener("wheel", s2.mouseWheelEvent.bind(s2), { capture: false, passive: false }); } }, { key: "destroy", value: function() { this.slDraggableRect && (this.slDraggableRect.draggable(false), this.slDraggableRect.off(), this.selectionRect.off()), this.selectionRect = null, this.zoomRect = null, this.gridRect = null; } }, { key: "svgMouseEvents", value: function(t3, e3) { var i2 = this.w, a3 = this.ctx.toolbar, s2 = i2.globals.zoomEnabled ? i2.config.chart.zoom.type : i2.config.chart.selection.type, r2 = i2.config.chart.toolbar.autoSelected; if (e3.shiftKey ? (this.shiftWasPressed = true, a3.enableZoomPanFromToolbar("pan" === r2 ? "zoom" : "pan")) : this.shiftWasPressed && (a3.enableZoomPanFromToolbar(r2), this.shiftWasPressed = false), e3.target) { var n2, o2 = e3.target.classList; if (e3.target.parentNode && null !== e3.target.parentNode && (n2 = e3.target.parentNode.classList), !(o2.contains("apexcharts-legend-marker") || o2.contains("apexcharts-legend-text") || n2 && n2.contains("apexcharts-toolbar"))) { if (this.clientX = "touchmove" === e3.type || "touchstart" === e3.type ? e3.touches[0].clientX : "touchend" === e3.type ? e3.changedTouches[0].clientX : e3.clientX, this.clientY = "touchmove" === e3.type || "touchstart" === e3.type ? e3.touches[0].clientY : "touchend" === e3.type ? e3.changedTouches[0].clientY : e3.clientY, "mousedown" === e3.type && 1 === e3.which || "touchstart" === e3.type) { var l2 = this.gridRect.getBoundingClientRect(); this.startX = this.clientX - l2.left - i2.globals.barPadForNumericAxis, this.startY = this.clientY - l2.top, this.dragged = false, this.w.globals.mousedown = true; } ("mousemove" === e3.type && 1 === e3.which || "touchmove" === e3.type) && (this.dragged = true, i2.globals.panEnabled ? (i2.globals.selection = null, this.w.globals.mousedown && this.panDragging({ context: this, zoomtype: s2, xyRatios: t3 })) : (this.w.globals.mousedown && i2.globals.zoomEnabled || this.w.globals.mousedown && i2.globals.selectionEnabled) && (this.selection = this.selectionDrawing({ context: this, zoomtype: s2 }))), "mouseup" !== e3.type && "touchend" !== e3.type && "mouseleave" !== e3.type || this.handleMouseUp({ zoomtype: s2 }), this.makeSelectionRectDraggable(); } } } }, { key: "handleMouseUp", value: function(t3) { var e3, i2 = t3.zoomtype, a3 = t3.isResized, s2 = this.w, r2 = null === (e3 = this.gridRect) || void 0 === e3 ? void 0 : e3.getBoundingClientRect(); r2 && (this.w.globals.mousedown || a3) && (this.endX = this.clientX - r2.left - s2.globals.barPadForNumericAxis, this.endY = this.clientY - r2.top, this.dragX = Math.abs(this.endX - this.startX), this.dragY = Math.abs(this.endY - this.startY), (s2.globals.zoomEnabled || s2.globals.selectionEnabled) && this.selectionDrawn({ context: this, zoomtype: i2 })), s2.globals.zoomEnabled && this.hideSelectionRect(this.selectionRect), this.dragged = false, this.w.globals.mousedown = false; } }, { key: "mouseWheelEvent", value: function(t3) { var e3 = this, i2 = this.w; t3.preventDefault(); var a3 = Date.now(); a3 - i2.globals.lastWheelExecution > this.wheelDelay && (this.executeMouseWheelZoom(t3), i2.globals.lastWheelExecution = a3), this.debounceTimer && clearTimeout(this.debounceTimer), this.debounceTimer = setTimeout((function() { a3 - i2.globals.lastWheelExecution > e3.wheelDelay && (e3.executeMouseWheelZoom(t3), i2.globals.lastWheelExecution = a3); }), this.debounceDelay); } }, { key: "executeMouseWheelZoom", value: function(t3) { var e3, i2 = this.w; this.minX = i2.globals.isRangeBar ? i2.globals.minY : i2.globals.minX, this.maxX = i2.globals.isRangeBar ? i2.globals.maxY : i2.globals.maxX; var a3 = null === (e3 = this.gridRect) || void 0 === e3 ? void 0 : e3.getBoundingClientRect(); if (a3) { var s2, r2, n2, o2 = (t3.clientX - a3.left) / a3.width, l2 = this.minX, h2 = this.maxX, c2 = h2 - l2; if (t3.deltaY < 0) { var d2 = l2 + o2 * c2; r2 = d2 - (s2 = 0.5 * c2) / 2, n2 = d2 + s2 / 2; } else r2 = l2 - (s2 = 1.5 * c2) / 2, n2 = h2 + s2 / 2; if (!i2.globals.isRangeBar) { r2 = Math.max(r2, i2.globals.initialMinX), n2 = Math.min(n2, i2.globals.initialMaxX); var u2 = 0.01 * (i2.globals.initialMaxX - i2.globals.initialMinX); if (n2 - r2 < u2) { var g2 = (r2 + n2) / 2; r2 = g2 - u2 / 2, n2 = g2 + u2 / 2; } } var p2 = this._getNewMinXMaxX(r2, n2); isNaN(p2.minX) || isNaN(p2.maxX) || this.zoomUpdateOptions(p2.minX, p2.maxX); } } }, { key: "makeSelectionRectDraggable", value: function() { var t3 = this, e3 = this.w; if (this.selectionRect) { var i2 = this.selectionRect.node.getBoundingClientRect(); i2.width > 0 && i2.height > 0 && (this.selectionRect.select(false).resize(false), this.selectionRect.select({ createRot: function() { }, updateRot: function() { }, createHandle: function(t4, e4, i3, a3, s2) { return "l" === s2 || "r" === s2 ? t4.circle(8).css({ "stroke-width": 1, stroke: "#333", fill: "#fff" }) : t4.circle(0); }, updateHandle: function(t4, e4) { return t4.center(e4[0], e4[1]); } }).resize().on("resize", (function() { var i3 = e3.globals.zoomEnabled ? e3.config.chart.zoom.type : e3.config.chart.selection.type; t3.handleMouseUp({ zoomtype: i3, isResized: true }); }))); } } }, { key: "preselectedSelection", value: function() { var t3 = this.w, e3 = this.xyRatios; if (!t3.globals.zoomEnabled) { if (void 0 !== t3.globals.selection && null !== t3.globals.selection) this.drawSelectionRect(u(u({}, t3.globals.selection), {}, { translateX: t3.globals.translateX, translateY: t3.globals.translateY })); else if (void 0 !== t3.config.chart.selection.xaxis.min && void 0 !== t3.config.chart.selection.xaxis.max) { var i2 = (t3.config.chart.selection.xaxis.min - t3.globals.minX) / e3.xRatio, a3 = t3.globals.gridWidth - (t3.globals.maxX - t3.config.chart.selection.xaxis.max) / e3.xRatio - i2; t3.globals.isRangeBar && (i2 = (t3.config.chart.selection.xaxis.min - t3.globals.yAxisScale[0].niceMin) / e3.invertedYRatio, a3 = (t3.config.chart.selection.xaxis.max - t3.config.chart.selection.xaxis.min) / e3.invertedYRatio); var s2 = { x: i2, y: 0, width: a3, height: t3.globals.gridHeight, translateX: t3.globals.translateX, translateY: t3.globals.translateY, selectionEnabled: true }; this.drawSelectionRect(s2), this.makeSelectionRectDraggable(), "function" == typeof t3.config.chart.events.selection && t3.config.chart.events.selection(this.ctx, { xaxis: { min: t3.config.chart.selection.xaxis.min, max: t3.config.chart.selection.xaxis.max }, yaxis: {} }); } } } }, { key: "drawSelectionRect", value: function(t3) { var e3 = t3.x, i2 = t3.y, a3 = t3.width, s2 = t3.height, r2 = t3.translateX, n2 = void 0 === r2 ? 0 : r2, o2 = t3.translateY, l2 = void 0 === o2 ? 0 : o2, h2 = this.w, c2 = this.zoomRect, d2 = this.selectionRect; if (this.dragged || null !== h2.globals.selection) { var u2 = { transform: "translate(" + n2 + ", " + l2 + ")" }; h2.globals.zoomEnabled && this.dragged && (a3 < 0 && (a3 = 1), c2.attr({ x: e3, y: i2, width: a3, height: s2, fill: h2.config.chart.zoom.zoomedArea.fill.color, "fill-opacity": h2.config.chart.zoom.zoomedArea.fill.opacity, stroke: h2.config.chart.zoom.zoomedArea.stroke.color, "stroke-width": h2.config.chart.zoom.zoomedArea.stroke.width, "stroke-opacity": h2.config.chart.zoom.zoomedArea.stroke.opacity }), Mi.setAttrs(c2.node, u2)), h2.globals.selectionEnabled && (d2.attr({ x: e3, y: i2, width: a3 > 0 ? a3 : 0, height: s2 > 0 ? s2 : 0, fill: h2.config.chart.selection.fill.color, "fill-opacity": h2.config.chart.selection.fill.opacity, stroke: h2.config.chart.selection.stroke.color, "stroke-width": h2.config.chart.selection.stroke.width, "stroke-dasharray": h2.config.chart.selection.stroke.dashArray, "stroke-opacity": h2.config.chart.selection.stroke.opacity }), Mi.setAttrs(d2.node, u2)); } } }, { key: "hideSelectionRect", value: function(t3) { t3 && t3.attr({ x: 0, y: 0, width: 0, height: 0 }); } }, { key: "selectionDrawing", value: function(t3) { var e3 = t3.context, i2 = t3.zoomtype, a3 = this.w, s2 = e3, r2 = this.gridRect.getBoundingClientRect(), n2 = s2.startX - 1, o2 = s2.startY, l2 = false, h2 = false, c2 = s2.clientX - r2.left - a3.globals.barPadForNumericAxis, d2 = s2.clientY - r2.top, g2 = c2 - n2, p2 = d2 - o2, f2 = { translateX: a3.globals.translateX, translateY: a3.globals.translateY }; return Math.abs(g2 + n2) > a3.globals.gridWidth ? g2 = a3.globals.gridWidth - n2 : c2 < 0 && (g2 = n2), n2 > c2 && (l2 = true, g2 = Math.abs(g2)), o2 > d2 && (h2 = true, p2 = Math.abs(p2)), f2 = u(u({}, f2 = "x" === i2 ? { x: l2 ? n2 - g2 : n2, y: 0, width: g2, height: a3.globals.gridHeight } : "y" === i2 ? { x: 0, y: h2 ? o2 - p2 : o2, width: a3.globals.gridWidth, height: p2 } : { x: l2 ? n2 - g2 : n2, y: h2 ? o2 - p2 : o2, width: g2, height: p2 }), {}, { translateX: a3.globals.translateX, translateY: a3.globals.translateY }), s2.drawSelectionRect(f2), s2.selectionDragging("resizing"), f2; } }, { key: "selectionDragging", value: function(t3, e3) { var i2 = this, a3 = this.w; if (e3) { e3.preventDefault(); var s2 = e3.detail, r2 = s2.handler, n2 = s2.box, o2 = n2.x, l2 = n2.y; o2 < this.constraints.x && (o2 = this.constraints.x), l2 < this.constraints.y && (l2 = this.constraints.y), n2.x2 > this.constraints.x2 && (o2 = this.constraints.x2 - n2.w), n2.y2 > this.constraints.y2 && (l2 = this.constraints.y2 - n2.h), r2.move(o2, l2); var h2 = this.xyRatios, c2 = this.selectionRect, d2 = 0; "resizing" === t3 && (d2 = 30); var u2 = function(t4) { return parseFloat(c2.node.getAttribute(t4)); }, g2 = { x: u2("x"), y: u2("y"), width: u2("width"), height: u2("height") }; a3.globals.selection = g2, "function" == typeof a3.config.chart.events.selection && a3.globals.selectionEnabled && (clearTimeout(this.w.globals.selectionResizeTimer), this.w.globals.selectionResizeTimer = window.setTimeout((function() { var t4, e4, s3, r3, n3 = i2.gridRect.getBoundingClientRect(), o3 = c2.node.getBoundingClientRect(); a3.globals.isRangeBar ? (t4 = a3.globals.yAxisScale[0].niceMin + (o3.left - n3.left) * h2.invertedYRatio, e4 = a3.globals.yAxisScale[0].niceMin + (o3.right - n3.left) * h2.invertedYRatio, s3 = 0, r3 = 1) : (t4 = a3.globals.xAxisScale.niceMin + (o3.left - n3.left) * h2.xRatio, e4 = a3.globals.xAxisScale.niceMin + (o3.right - n3.left) * h2.xRatio, s3 = a3.globals.yAxisScale[0].niceMin + (n3.bottom - o3.bottom) * h2.yRatio[0], r3 = a3.globals.yAxisScale[0].niceMax - (o3.top - n3.top) * h2.yRatio[0]); var l3 = { xaxis: { min: t4, max: e4 }, yaxis: { min: s3, max: r3 } }; a3.config.chart.events.selection(i2.ctx, l3), a3.config.chart.brush.enabled && void 0 !== a3.config.chart.events.brushScrolled && a3.config.chart.events.brushScrolled(i2.ctx, l3); }), d2)); } } }, { key: "selectionDrawn", value: function(t3) { var e3, i2, a3 = t3.context, s2 = t3.zoomtype, r2 = this.w, n2 = a3, o2 = this.xyRatios, l2 = this.ctx.toolbar, h2 = r2.globals.zoomEnabled ? n2.zoomRect.node.getBoundingClientRect() : n2.selectionRect.node.getBoundingClientRect(), c2 = n2.gridRect.getBoundingClientRect(), d2 = h2.left - c2.left - r2.globals.barPadForNumericAxis, u2 = h2.right - c2.left - r2.globals.barPadForNumericAxis, g2 = h2.top - c2.top, p2 = h2.bottom - c2.top; r2.globals.isRangeBar ? (e3 = r2.globals.yAxisScale[0].niceMin + d2 * o2.invertedYRatio, i2 = r2.globals.yAxisScale[0].niceMin + u2 * o2.invertedYRatio) : (e3 = r2.globals.xAxisScale.niceMin + d2 * o2.xRatio, i2 = r2.globals.xAxisScale.niceMin + u2 * o2.xRatio); var f2 = [], x2 = []; if (r2.config.yaxis.forEach((function(t4, e4) { var i3 = r2.globals.seriesYAxisMap[e4][0], a4 = r2.globals.yAxisScale[e4].niceMax - o2.yRatio[i3] * g2, s3 = r2.globals.yAxisScale[e4].niceMax - o2.yRatio[i3] * p2; f2.push(a4), x2.push(s3); })), n2.dragged && (n2.dragX > 10 || n2.dragY > 10) && e3 !== i2) { if (r2.globals.zoomEnabled) { var b2 = v.clone(r2.globals.initialConfig.yaxis), m2 = v.clone(r2.globals.initialConfig.xaxis); if (r2.globals.zoomed = true, r2.config.xaxis.convertedCatToNumeric && (e3 = Math.floor(e3), i2 = Math.floor(i2), e3 < 1 && (e3 = 1, i2 = r2.globals.dataPoints), i2 - e3 < 2 && (i2 = e3 + 1)), "xy" !== s2 && "x" !== s2 || (m2 = { min: e3, max: i2 }), "xy" !== s2 && "y" !== s2 || b2.forEach((function(t4, e4) { b2[e4].min = x2[e4], b2[e4].max = f2[e4]; })), l2) { var y2 = l2.getBeforeZoomRange(m2, b2); y2 && (m2 = y2.xaxis ? y2.xaxis : m2, b2 = y2.yaxis ? y2.yaxis : b2); } var w2 = { xaxis: m2 }; r2.config.chart.group || (w2.yaxis = b2), n2.ctx.updateHelpers._updateOptions(w2, false, n2.w.config.chart.animations.dynamicAnimation.enabled), "function" == typeof r2.config.chart.events.zoomed && l2.zoomCallback(m2, b2); } else if (r2.globals.selectionEnabled) { var k2, A2 = null; k2 = { min: e3, max: i2 }, "xy" !== s2 && "y" !== s2 || (A2 = v.clone(r2.config.yaxis)).forEach((function(t4, e4) { A2[e4].min = x2[e4], A2[e4].max = f2[e4]; })), r2.globals.selection = n2.selection, "function" == typeof r2.config.chart.events.selection && r2.config.chart.events.selection(n2.ctx, { xaxis: k2, yaxis: A2 }); } } } }, { key: "panDragging", value: function(t3) { var e3 = t3.context, i2 = this.w, a3 = e3; if (void 0 !== i2.globals.lastClientPosition.x) { var s2 = i2.globals.lastClientPosition.x - a3.clientX, r2 = i2.globals.lastClientPosition.y - a3.clientY; Math.abs(s2) > Math.abs(r2) && s2 > 0 ? this.moveDirection = "left" : Math.abs(s2) > Math.abs(r2) && s2 < 0 ? this.moveDirection = "right" : Math.abs(r2) > Math.abs(s2) && r2 > 0 ? this.moveDirection = "up" : Math.abs(r2) > Math.abs(s2) && r2 < 0 && (this.moveDirection = "down"); } i2.globals.lastClientPosition = { x: a3.clientX, y: a3.clientY }; var n2 = i2.globals.isRangeBar ? i2.globals.minY : i2.globals.minX, o2 = i2.globals.isRangeBar ? i2.globals.maxY : i2.globals.maxX; a3.panScrolled(n2, o2); } }, { key: "panScrolled", value: function(t3, e3) { var i2 = this.w, a3 = this.xyRatios, s2 = v.clone(i2.globals.initialConfig.yaxis), r2 = a3.xRatio, n2 = i2.globals.minX, o2 = i2.globals.maxX; i2.globals.isRangeBar && (r2 = a3.invertedYRatio, n2 = i2.globals.minY, o2 = i2.globals.maxY), "left" === this.moveDirection ? (t3 = n2 + i2.globals.gridWidth / 15 * r2, e3 = o2 + i2.globals.gridWidth / 15 * r2) : "right" === this.moveDirection && (t3 = n2 - i2.globals.gridWidth / 15 * r2, e3 = o2 - i2.globals.gridWidth / 15 * r2), i2.globals.isRangeBar || (t3 < i2.globals.initialMinX || e3 > i2.globals.initialMaxX) && (t3 = n2, e3 = o2); var l2 = { xaxis: { min: t3, max: e3 } }; i2.config.chart.group || (l2.yaxis = s2), this.updateScrolledChart(l2, t3, e3); } }, { key: "updateScrolledChart", value: function(t3, e3, i2) { var a3 = this.w; if (this.ctx.updateHelpers._updateOptions(t3, false, false), "function" == typeof a3.config.chart.events.scrolled) { var s2 = { xaxis: { min: e3, max: i2 } }; a3.config.chart.events.scrolled(this.ctx, s2), this.ctx.events.fireEvent("scrolled", s2); } } }]), a2; })(); var ya = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.ttCtx = e2, this.ctx = e2.ctx; } return s(t2, [{ key: "getNearestValues", value: function(t3) { var e2 = t3.hoverArea, i2 = t3.elGrid, a2 = t3.clientX, s2 = t3.clientY, r2 = this.w, n2 = i2.getBoundingClientRect(), o2 = n2.width, l2 = n2.height, h2 = o2 / (r2.globals.dataPoints - 1), c2 = l2 / r2.globals.dataPoints, d2 = this.hasBars(); !r2.globals.comboCharts && !d2 || r2.config.xaxis.convertedCatToNumeric || (h2 = o2 / r2.globals.dataPoints); var u2 = a2 - n2.left - r2.globals.barPadForNumericAxis, g2 = s2 - n2.top; u2 < 0 || g2 < 0 || u2 > o2 || g2 > l2 ? (e2.classList.remove("hovering-zoom"), e2.classList.remove("hovering-pan")) : r2.globals.zoomEnabled ? (e2.classList.remove("hovering-pan"), e2.classList.add("hovering-zoom")) : r2.globals.panEnabled && (e2.classList.remove("hovering-zoom"), e2.classList.add("hovering-pan")); var p2 = Math.round(u2 / h2), f2 = Math.floor(g2 / c2); d2 && !r2.config.xaxis.convertedCatToNumeric && (p2 = Math.ceil(u2 / h2), p2 -= 1); var x2 = null, b2 = null, m2 = r2.globals.seriesXvalues.map((function(t4) { return t4.filter((function(t5) { return v.isNumber(t5); })); })), y2 = r2.globals.seriesYvalues.map((function(t4) { return t4.filter((function(t5) { return v.isNumber(t5); })); })); if (r2.globals.isXNumeric) { var w2 = this.ttCtx.getElGrid().getBoundingClientRect(), k2 = u2 * (w2.width / o2), A2 = g2 * (w2.height / l2); x2 = (b2 = this.closestInMultiArray(k2, A2, m2, y2)).index, p2 = b2.j, null !== x2 && r2.globals.hasNullValues && (m2 = r2.globals.seriesXvalues[x2], p2 = (b2 = this.closestInArray(k2, m2)).j); } return r2.globals.capturedSeriesIndex = null === x2 ? -1 : x2, (!p2 || p2 < 1) && (p2 = 0), r2.globals.isBarHorizontal ? r2.globals.capturedDataPointIndex = f2 : r2.globals.capturedDataPointIndex = p2, { capturedSeries: x2, j: r2.globals.isBarHorizontal ? f2 : p2, hoverX: u2, hoverY: g2 }; } }, { key: "getFirstActiveXArray", value: function(t3) { for (var e2 = this.w, i2 = 0, a2 = t3.map((function(t4, e3) { return t4.length > 0 ? e3 : -1; })), s2 = 0; s2 < a2.length; s2++) if (-1 !== a2[s2] && -1 === e2.globals.collapsedSeriesIndices.indexOf(s2) && -1 === e2.globals.ancillaryCollapsedSeriesIndices.indexOf(s2)) { i2 = a2[s2]; break; } return i2; } }, { key: "closestInMultiArray", value: function(t3, e2, i2, a2) { for (var s2, r2 = this.w, n2 = 1 / 0, o2 = null, l2 = null, h2 = 0; h2 < i2.length; h2++) if (s2 = h2, -1 === r2.globals.collapsedSeriesIndices.indexOf(s2) && -1 === r2.globals.ancillaryCollapsedSeriesIndices.indexOf(s2)) for (var c2 = i2[h2], d2 = a2[h2], u2 = Math.min(c2.length, d2.length), g2 = 0; g2 < u2; g2++) { var p2 = t3 - c2[g2], f2 = Math.sqrt(p2 * p2); if (!r2.globals.allSeriesHasEqualX) { var x2 = e2 - d2[g2]; f2 = Math.sqrt(p2 * p2 + x2 * x2); } f2 < n2 && (n2 = f2, o2 = h2, l2 = g2); } return { index: o2, j: l2 }; } }, { key: "closestInArray", value: function(t3, e2) { for (var i2 = e2[0], a2 = null, s2 = Math.abs(t3 - i2), r2 = 0; r2 < e2.length; r2++) { var n2 = Math.abs(t3 - e2[r2]); n2 < s2 && (s2 = n2, a2 = r2); } return { j: a2 }; } }, { key: "isXoverlap", value: function(t3) { var e2 = [], i2 = this.w.globals.seriesX.filter((function(t4) { return void 0 !== t4[0]; })); if (i2.length > 0) for (var a2 = 0; a2 < i2.length - 1; a2++) void 0 !== i2[a2][t3] && void 0 !== i2[a2 + 1][t3] && i2[a2][t3] !== i2[a2 + 1][t3] && e2.push("unEqual"); return 0 === e2.length; } }, { key: "isInitialSeriesSameLen", value: function() { for (var t3 = true, e2 = this.w.globals.initialSeries, i2 = 0; i2 < e2.length - 1; i2++) if (e2[i2].data.length !== e2[i2 + 1].data.length) { t3 = false; break; } return t3; } }, { key: "getBarsHeight", value: function(t3) { return f(t3).reduce((function(t4, e2) { return t4 + e2.getBBox().height; }), 0); } }, { key: "getElMarkers", value: function(t3) { return "number" == typeof t3 ? this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series[data\\:realIndex='".concat(t3, "'] .apexcharts-series-markers-wrap > *")) : this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers-wrap > *"); } }, { key: "getAllMarkers", value: function() { var t3 = this, e2 = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], i2 = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers-wrap"); i2 = f(i2), e2 && (i2 = i2.filter((function(e3) { var i3 = Number(e3.getAttribute("data:realIndex")); return -1 === t3.w.globals.collapsedSeriesIndices.indexOf(i3); }))), i2.sort((function(t4, e3) { var i3 = Number(t4.getAttribute("data:realIndex")), a3 = Number(e3.getAttribute("data:realIndex")); return a3 < i3 ? 1 : a3 > i3 ? -1 : 0; })); var a2 = []; return i2.forEach((function(t4) { a2.push(t4.querySelector(".apexcharts-marker")); })), a2; } }, { key: "hasMarkers", value: function(t3) { return this.getElMarkers(t3).length > 0; } }, { key: "getPathFromPoint", value: function(t3, e2) { var i2 = Number(t3.getAttribute("cx")), a2 = Number(t3.getAttribute("cy")), s2 = t3.getAttribute("shape"); return new Mi(this.ctx).getMarkerPath(i2, a2, s2, e2); } }, { key: "getElBars", value: function() { return this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-bar-series, .apexcharts-candlestick-series, .apexcharts-boxPlot-series, .apexcharts-rangebar-series"); } }, { key: "hasBars", value: function() { return this.getElBars().length > 0; } }, { key: "getHoverMarkerSize", value: function(t3) { var e2 = this.w, i2 = e2.config.markers.hover.size; return void 0 === i2 && (i2 = e2.globals.markers.size[t3] + e2.config.markers.hover.sizeOffset), i2; } }, { key: "toggleAllTooltipSeriesGroups", value: function(t3) { var e2 = this.w, i2 = this.ttCtx; 0 === i2.allTooltipSeriesGroups.length && (i2.allTooltipSeriesGroups = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-tooltip-series-group")); for (var a2 = i2.allTooltipSeriesGroups, s2 = 0; s2 < a2.length; s2++) "enable" === t3 ? (a2[s2].classList.add("apexcharts-active"), a2[s2].style.display = e2.config.tooltip.items.display) : (a2[s2].classList.remove("apexcharts-active"), a2[s2].style.display = "none"); } }]), t2; })(); var wa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.ctx = e2.ctx, this.ttCtx = e2, this.tooltipUtil = new ya(e2); } return s(t2, [{ key: "drawSeriesTexts", value: function(t3) { var e2 = t3.shared, i2 = void 0 === e2 || e2, a2 = t3.ttItems, s2 = t3.i, r2 = void 0 === s2 ? 0 : s2, n2 = t3.j, o2 = void 0 === n2 ? null : n2, l2 = t3.y1, h2 = t3.y2, c2 = t3.e, d2 = this.w; void 0 !== d2.config.tooltip.custom ? this.handleCustomTooltip({ i: r2, j: o2, y1: l2, y2: h2, w: d2 }) : this.toggleActiveInactiveSeries(i2, r2); var u2 = this.getValuesToPrint({ i: r2, j: o2 }); this.printLabels({ i: r2, j: o2, values: u2, ttItems: a2, shared: i2, e: c2 }); var g2 = this.ttCtx.getElTooltip(); this.ttCtx.tooltipRect.ttWidth = g2.getBoundingClientRect().width, this.ttCtx.tooltipRect.ttHeight = g2.getBoundingClientRect().height; } }, { key: "printLabels", value: function(t3) { var e2, i2 = this, a2 = t3.i, s2 = t3.j, r2 = t3.values, n2 = t3.ttItems, o2 = t3.shared, l2 = t3.e, h2 = this.w, c2 = [], d2 = function(t4) { return h2.globals.seriesGoals[t4] && h2.globals.seriesGoals[t4][s2] && Array.isArray(h2.globals.seriesGoals[t4][s2]); }, g2 = r2.xVal, p2 = r2.zVal, f2 = r2.xAxisTTVal, x2 = "", b2 = h2.globals.colors[a2]; null !== s2 && h2.config.plotOptions.bar.distributed && (b2 = h2.globals.colors[s2]); for (var m2 = function(t4, r3) { var m3 = i2.getFormatters(a2); x2 = i2.getSeriesName({ fn: m3.yLbTitleFormatter, index: a2, seriesIndex: a2, j: s2 }), "treemap" === h2.config.chart.type && (x2 = m3.yLbTitleFormatter(String(h2.config.series[a2].data[s2].x), { series: h2.globals.series, seriesIndex: a2, dataPointIndex: s2, w: h2 })); var v3 = h2.config.tooltip.inverseOrder ? r3 : t4; if (h2.globals.axisCharts) { var y3 = function(t5) { var e3, i3, a3, r4; return h2.globals.isRangeData ? m3.yLbFormatter(null === (e3 = h2.globals.seriesRangeStart) || void 0 === e3 || null === (i3 = e3[t5]) || void 0 === i3 ? void 0 : i3[s2], { series: h2.globals.seriesRangeStart, seriesIndex: t5, dataPointIndex: s2, w: h2 }) + " - " + m3.yLbFormatter(null === (a3 = h2.globals.seriesRangeEnd) || void 0 === a3 || null === (r4 = a3[t5]) || void 0 === r4 ? void 0 : r4[s2], { series: h2.globals.seriesRangeEnd, seriesIndex: t5, dataPointIndex: s2, w: h2 }) : m3.yLbFormatter(h2.globals.series[t5][s2], { series: h2.globals.series, seriesIndex: t5, dataPointIndex: s2, w: h2 }); }; if (o2) m3 = i2.getFormatters(v3), x2 = i2.getSeriesName({ fn: m3.yLbTitleFormatter, index: v3, seriesIndex: a2, j: s2 }), b2 = h2.globals.colors[v3], e2 = y3(v3), d2(v3) && (c2 = h2.globals.seriesGoals[v3][s2].map((function(t5) { return { attrs: t5, val: m3.yLbFormatter(t5.value, { seriesIndex: v3, dataPointIndex: s2, w: h2 }) }; }))); else { var w2, k2 = null == l2 || null === (w2 = l2.target) || void 0 === w2 ? void 0 : w2.getAttribute("fill"); k2 && (-1 !== k2.indexOf("url") ? -1 !== k2.indexOf("Pattern") && (b2 = h2.globals.dom.baseEl.querySelector(k2.substr(4).slice(0, -1)).childNodes[0].getAttribute("stroke")) : b2 = k2), e2 = y3(a2), d2(a2) && Array.isArray(h2.globals.seriesGoals[a2][s2]) && (c2 = h2.globals.seriesGoals[a2][s2].map((function(t5) { return { attrs: t5, val: m3.yLbFormatter(t5.value, { seriesIndex: a2, dataPointIndex: s2, w: h2 }) }; }))); } } null === s2 && (e2 = m3.yLbFormatter(h2.globals.series[a2], u(u({}, h2), {}, { seriesIndex: a2, dataPointIndex: a2 }))), i2.DOMHandling({ i: a2, t: v3, j: s2, ttItems: n2, values: { val: e2, goalVals: c2, xVal: g2, xAxisTTVal: f2, zVal: p2 }, seriesName: x2, shared: o2, pColor: b2 }); }, v2 = 0, y2 = h2.globals.series.length - 1; v2 < h2.globals.series.length; v2++, y2--) m2(v2, y2); } }, { key: "getFormatters", value: function(t3) { var e2, i2 = this.w, a2 = i2.globals.yLabelFormatters[t3]; return void 0 !== i2.globals.ttVal ? Array.isArray(i2.globals.ttVal) ? (a2 = i2.globals.ttVal[t3] && i2.globals.ttVal[t3].formatter, e2 = i2.globals.ttVal[t3] && i2.globals.ttVal[t3].title && i2.globals.ttVal[t3].title.formatter) : (a2 = i2.globals.ttVal.formatter, "function" == typeof i2.globals.ttVal.title.formatter && (e2 = i2.globals.ttVal.title.formatter)) : e2 = i2.config.tooltip.y.title.formatter, "function" != typeof a2 && (a2 = i2.globals.yLabelFormatters[0] ? i2.globals.yLabelFormatters[0] : function(t4) { return t4; }), "function" != typeof e2 && (e2 = function(t4) { return t4 ? t4 + ": " : ""; }), { yLbFormatter: a2, yLbTitleFormatter: e2 }; } }, { key: "getSeriesName", value: function(t3) { var e2 = t3.fn, i2 = t3.index, a2 = t3.seriesIndex, s2 = t3.j, r2 = this.w; return e2(String(r2.globals.seriesNames[i2]), { series: r2.globals.series, seriesIndex: a2, dataPointIndex: s2, w: r2 }); } }, { key: "DOMHandling", value: function(t3) { t3.i; var e2 = t3.t, i2 = t3.j, a2 = t3.ttItems, s2 = t3.values, r2 = t3.seriesName, n2 = t3.shared, o2 = t3.pColor, l2 = this.w, h2 = this.ttCtx, c2 = s2.val, d2 = s2.goalVals, u2 = s2.xVal, g2 = s2.xAxisTTVal, p2 = s2.zVal, f2 = null; f2 = a2[e2].children, l2.config.tooltip.fillSeriesColor && (a2[e2].style.backgroundColor = o2, f2[0].style.display = "none"), h2.showTooltipTitle && (null === h2.tooltipTitle && (h2.tooltipTitle = l2.globals.dom.baseEl.querySelector(".apexcharts-tooltip-title")), h2.tooltipTitle.innerHTML = u2), h2.isXAxisTooltipEnabled && (h2.xaxisTooltipText.innerHTML = "" !== g2 ? g2 : u2); var x2 = a2[e2].querySelector(".apexcharts-tooltip-text-y-label"); x2 && (x2.innerHTML = r2 || ""); var b2 = a2[e2].querySelector(".apexcharts-tooltip-text-y-value"); b2 && (b2.innerHTML = void 0 !== c2 ? c2 : ""), f2[0] && f2[0].classList.contains("apexcharts-tooltip-marker") && (l2.config.tooltip.marker.fillColors && Array.isArray(l2.config.tooltip.marker.fillColors) && (o2 = l2.config.tooltip.marker.fillColors[e2]), l2.config.tooltip.fillSeriesColor ? f2[0].style.backgroundColor = o2 : f2[0].style.color = o2), l2.config.tooltip.marker.show || (f2[0].style.display = "none"); var m2 = a2[e2].querySelector(".apexcharts-tooltip-text-goals-label"), v2 = a2[e2].querySelector(".apexcharts-tooltip-text-goals-value"); if (d2.length && l2.globals.seriesGoals[e2]) { var y2 = function() { var t4 = "<div>", e3 = "<div>"; d2.forEach((function(i3, a3) { t4 += ' <div style="display: flex"><span class="apexcharts-tooltip-marker" style="background-color: '.concat(i3.attrs.strokeColor, '; height: 3px; border-radius: 0; top: 5px;"></span> ').concat(i3.attrs.name, "</div>"), e3 += "<div>".concat(i3.val, "</div>"); })), m2.innerHTML = t4 + "</div>", v2.innerHTML = e3 + "</div>"; }; n2 ? l2.globals.seriesGoals[e2][i2] && Array.isArray(l2.globals.seriesGoals[e2][i2]) ? y2() : (m2.innerHTML = "", v2.innerHTML = "") : y2(); } else m2.innerHTML = "", v2.innerHTML = ""; null !== p2 && (a2[e2].querySelector(".apexcharts-tooltip-text-z-label").innerHTML = l2.config.tooltip.z.title, a2[e2].querySelector(".apexcharts-tooltip-text-z-value").innerHTML = void 0 !== p2 ? p2 : ""); if (n2 && f2[0]) { if (l2.config.tooltip.hideEmptySeries) { var w2 = a2[e2].querySelector(".apexcharts-tooltip-marker"), k2 = a2[e2].querySelector(".apexcharts-tooltip-text"); 0 == parseFloat(c2) ? (w2.style.display = "none", k2.style.display = "none") : (w2.style.display = "block", k2.style.display = "block"); } null == c2 || l2.globals.ancillaryCollapsedSeriesIndices.indexOf(e2) > -1 || l2.globals.collapsedSeriesIndices.indexOf(e2) > -1 || Array.isArray(h2.tConfig.enabledOnSeries) && -1 === h2.tConfig.enabledOnSeries.indexOf(e2) ? f2[0].parentNode.style.display = "none" : f2[0].parentNode.style.display = l2.config.tooltip.items.display; } else Array.isArray(h2.tConfig.enabledOnSeries) && -1 === h2.tConfig.enabledOnSeries.indexOf(e2) && (f2[0].parentNode.style.display = "none"); } }, { key: "toggleActiveInactiveSeries", value: function(t3, e2) { var i2 = this.w; if (t3) this.tooltipUtil.toggleAllTooltipSeriesGroups("enable"); else { this.tooltipUtil.toggleAllTooltipSeriesGroups("disable"); var a2 = i2.globals.dom.baseEl.querySelector(".apexcharts-tooltip-series-group-".concat(e2)); a2 && (a2.classList.add("apexcharts-active"), a2.style.display = i2.config.tooltip.items.display); } } }, { key: "getValuesToPrint", value: function(t3) { var e2 = t3.i, i2 = t3.j, a2 = this.w, s2 = this.ctx.series.filteredSeriesX(), r2 = "", n2 = "", o2 = null, l2 = null, h2 = { series: a2.globals.series, seriesIndex: e2, dataPointIndex: i2, w: a2 }, c2 = a2.globals.ttZFormatter; null === i2 ? l2 = a2.globals.series[e2] : a2.globals.isXNumeric && "treemap" !== a2.config.chart.type ? (r2 = s2[e2][i2], 0 === s2[e2].length && (r2 = s2[this.tooltipUtil.getFirstActiveXArray(s2)][i2])) : r2 = new Ji(this.ctx).isFormatXY() ? void 0 !== a2.config.series[e2].data[i2] ? a2.config.series[e2].data[i2].x : "" : void 0 !== a2.globals.labels[i2] ? a2.globals.labels[i2] : ""; var d2 = r2; a2.globals.isXNumeric && "datetime" === a2.config.xaxis.type ? r2 = new Xi(this.ctx).xLabelFormat(a2.globals.ttKeyFormatter, d2, d2, { i: void 0, dateFormatter: new zi(this.ctx).formatDate, w: this.w }) : r2 = a2.globals.isBarHorizontal ? a2.globals.yLabelFormatters[0](d2, h2) : a2.globals.xLabelFormatter(d2, h2); return void 0 !== a2.config.tooltip.x.formatter && (r2 = a2.globals.ttKeyFormatter(d2, h2)), a2.globals.seriesZ.length > 0 && a2.globals.seriesZ[e2].length > 0 && (o2 = c2(a2.globals.seriesZ[e2][i2], a2)), n2 = "function" == typeof a2.config.xaxis.tooltip.formatter ? a2.globals.xaxisTooltipFormatter(d2, h2) : r2, { val: Array.isArray(l2) ? l2.join(" ") : l2, xVal: Array.isArray(r2) ? r2.join(" ") : r2, xAxisTTVal: Array.isArray(n2) ? n2.join(" ") : n2, zVal: o2 }; } }, { key: "handleCustomTooltip", value: function(t3) { var e2 = t3.i, i2 = t3.j, a2 = t3.y1, s2 = t3.y2, r2 = t3.w, n2 = this.ttCtx.getElTooltip(), o2 = r2.config.tooltip.custom; Array.isArray(o2) && o2[e2] && (o2 = o2[e2]); var l2 = o2({ ctx: this.ctx, series: r2.globals.series, seriesIndex: e2, dataPointIndex: i2, y1: a2, y2: s2, w: r2 }); "string" == typeof l2 || "number" == typeof l2 ? n2.innerHTML = l2 : (l2 instanceof Element || "string" == typeof l2.nodeName) && (n2.innerHTML = "", n2.appendChild(l2.cloneNode(true))); } }]), t2; })(); var ka = (function() { function t2(e2) { i(this, t2), this.ttCtx = e2, this.ctx = e2.ctx, this.w = e2.w; } return s(t2, [{ key: "moveXCrosshairs", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, i2 = this.ttCtx, a2 = this.w, s2 = i2.getElXCrosshairs(), r2 = t3 - i2.xcrosshairsWidth / 2, n2 = a2.globals.labels.slice().length; if (null !== e2 && (r2 = a2.globals.gridWidth / n2 * e2), null === s2 || a2.globals.isBarHorizontal || (s2.setAttribute("x", r2), s2.setAttribute("x1", r2), s2.setAttribute("x2", r2), s2.setAttribute("y2", a2.globals.gridHeight), s2.classList.add("apexcharts-active")), r2 < 0 && (r2 = 0), r2 > a2.globals.gridWidth && (r2 = a2.globals.gridWidth), i2.isXAxisTooltipEnabled) { var o2 = r2; "tickWidth" !== a2.config.xaxis.crosshairs.width && "barWidth" !== a2.config.xaxis.crosshairs.width || (o2 = r2 + i2.xcrosshairsWidth / 2), this.moveXAxisTooltip(o2); } } }, { key: "moveYCrosshairs", value: function(t3) { var e2 = this.ttCtx; null !== e2.ycrosshairs && Mi.setAttrs(e2.ycrosshairs, { y1: t3, y2: t3 }), null !== e2.ycrosshairsHidden && Mi.setAttrs(e2.ycrosshairsHidden, { y1: t3, y2: t3 }); } }, { key: "moveXAxisTooltip", value: function(t3) { var e2 = this.w, i2 = this.ttCtx; if (null !== i2.xaxisTooltip && 0 !== i2.xcrosshairsWidth) { i2.xaxisTooltip.classList.add("apexcharts-active"); var a2 = i2.xaxisOffY + e2.config.xaxis.tooltip.offsetY + e2.globals.translateY + 1 + e2.config.xaxis.offsetY; if (t3 -= i2.xaxisTooltip.getBoundingClientRect().width / 2, !isNaN(t3)) { t3 += e2.globals.translateX; var s2; s2 = new Mi(this.ctx).getTextRects(i2.xaxisTooltipText.innerHTML), i2.xaxisTooltipText.style.minWidth = s2.width + "px", i2.xaxisTooltip.style.left = t3 + "px", i2.xaxisTooltip.style.top = a2 + "px"; } } } }, { key: "moveYAxisTooltip", value: function(t3) { var e2 = this.w, i2 = this.ttCtx; null === i2.yaxisTTEls && (i2.yaxisTTEls = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxistooltip")); var a2 = parseInt(i2.ycrosshairsHidden.getAttribute("y1"), 10), s2 = e2.globals.translateY + a2, r2 = i2.yaxisTTEls[t3].getBoundingClientRect(), n2 = r2.height, o2 = e2.globals.translateYAxisX[t3] - 2; e2.config.yaxis[t3].opposite && (o2 -= r2.width), s2 -= n2 / 2, -1 === e2.globals.ignoreYAxisIndexes.indexOf(t3) && s2 > 0 && s2 < e2.globals.gridHeight ? (i2.yaxisTTEls[t3].classList.add("apexcharts-active"), i2.yaxisTTEls[t3].style.top = s2 + "px", i2.yaxisTTEls[t3].style.left = o2 + e2.config.yaxis[t3].tooltip.offsetX + "px") : i2.yaxisTTEls[t3].classList.remove("apexcharts-active"); } }, { key: "moveTooltip", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a2 = this.w, s2 = this.ttCtx, r2 = s2.getElTooltip(), n2 = s2.tooltipRect, o2 = null !== i2 ? parseFloat(i2) : 1, l2 = parseFloat(t3) + o2 + 5, h2 = parseFloat(e2) + o2 / 2; if (l2 > a2.globals.gridWidth / 2 && (l2 = l2 - n2.ttWidth - o2 - 10), l2 > a2.globals.gridWidth - n2.ttWidth - 10 && (l2 = a2.globals.gridWidth - n2.ttWidth), l2 < -20 && (l2 = -20), a2.config.tooltip.followCursor) { var c2 = s2.getElGrid().getBoundingClientRect(); (l2 = s2.e.clientX - c2.left) > a2.globals.gridWidth / 2 && (l2 -= s2.tooltipRect.ttWidth), (h2 = s2.e.clientY + a2.globals.translateY - c2.top) > a2.globals.gridHeight / 2 && (h2 -= s2.tooltipRect.ttHeight); } else a2.globals.isBarHorizontal || n2.ttHeight / 2 + h2 > a2.globals.gridHeight && (h2 = a2.globals.gridHeight - n2.ttHeight + a2.globals.translateY); isNaN(l2) || (l2 += a2.globals.translateX, r2.style.left = l2 + "px", r2.style.top = h2 + "px"); } }, { key: "moveMarkers", value: function(t3, e2) { var i2 = this.w, a2 = this.ttCtx; if (i2.globals.markers.size[t3] > 0) for (var s2 = i2.globals.dom.baseEl.querySelectorAll(" .apexcharts-series[data\\:realIndex='".concat(t3, "'] .apexcharts-marker")), r2 = 0; r2 < s2.length; r2++) parseInt(s2[r2].getAttribute("rel"), 10) === e2 && (a2.marker.resetPointsSize(), a2.marker.enlargeCurrentPoint(e2, s2[r2])); else a2.marker.resetPointsSize(), this.moveDynamicPointOnHover(e2, t3); } }, { key: "moveDynamicPointOnHover", value: function(t3, e2) { var i2, a2, s2, r2, n2 = this.w, o2 = this.ttCtx, l2 = new Mi(this.ctx), h2 = n2.globals.pointsArray, c2 = o2.tooltipUtil.getHoverMarkerSize(e2), d2 = n2.config.series[e2].type; if (!d2 || "column" !== d2 && "candlestick" !== d2 && "boxPlot" !== d2) { s2 = null === (i2 = h2[e2][t3]) || void 0 === i2 ? void 0 : i2[0], r2 = (null === (a2 = h2[e2][t3]) || void 0 === a2 ? void 0 : a2[1]) || 0; var u2 = n2.globals.dom.baseEl.querySelector(".apexcharts-series[data\\:realIndex='".concat(e2, "'] .apexcharts-series-markers path")); if (u2 && r2 < n2.globals.gridHeight && r2 > 0) { var g2 = u2.getAttribute("shape"), p2 = l2.getMarkerPath(s2, r2, g2, 1.5 * c2); u2.setAttribute("d", p2); } this.moveXCrosshairs(s2), o2.fixedTooltip || this.moveTooltip(s2, r2, c2); } } }, { key: "moveDynamicPointsOnHover", value: function(t3) { var e2, i2 = this.ttCtx, a2 = i2.w, s2 = 0, r2 = 0, n2 = a2.globals.pointsArray, o2 = new $i(this.ctx), l2 = new Mi(this.ctx); e2 = o2.getActiveConfigSeriesIndex("asc", ["line", "area", "scatter", "bubble"]); var h2 = i2.tooltipUtil.getHoverMarkerSize(e2); if (n2[e2] && (s2 = n2[e2][t3][0], r2 = n2[e2][t3][1]), !isNaN(s2)) { var c2 = i2.tooltipUtil.getAllMarkers(); if (c2.length) for (var d2 = 0; d2 < a2.globals.series.length; d2++) { var u2 = n2[d2]; if (a2.globals.comboCharts && void 0 === u2 && c2.splice(d2, 0, null), u2 && u2.length) { var g2 = n2[d2][t3][1], p2 = void 0; c2[d2].setAttribute("cx", s2); var f2 = c2[d2].getAttribute("shape"); if ("rangeArea" === a2.config.chart.type && !a2.globals.comboCharts) { var x2 = t3 + a2.globals.series[d2].length; p2 = n2[d2][x2][1], g2 -= Math.abs(g2 - p2) / 2; } if (null !== g2 && !isNaN(g2) && g2 < a2.globals.gridHeight + h2 && g2 + h2 > 0) { var b2 = l2.getMarkerPath(s2, g2, f2, h2); c2[d2].setAttribute("d", b2); } else c2[d2].setAttribute("d", ""); } } this.moveXCrosshairs(s2), i2.fixedTooltip || this.moveTooltip(s2, r2 || a2.globals.gridHeight, h2); } } }, { key: "moveStickyTooltipOverBars", value: function(t3, e2) { var i2 = this.w, a2 = this.ttCtx, s2 = i2.globals.columnSeries ? i2.globals.columnSeries.length : i2.globals.series.length; i2.config.chart.stacked && (s2 = i2.globals.barGroups.length); var r2 = s2 >= 2 && s2 % 2 == 0 ? Math.floor(s2 / 2) : Math.floor(s2 / 2) + 1; i2.globals.isBarHorizontal && (r2 = new $i(this.ctx).getActiveConfigSeriesIndex("desc") + 1); var n2 = i2.globals.dom.baseEl.querySelector(".apexcharts-bar-series .apexcharts-series[rel='".concat(r2, "'] path[j='").concat(t3, "'], .apexcharts-candlestick-series .apexcharts-series[rel='").concat(r2, "'] path[j='").concat(t3, "'], .apexcharts-boxPlot-series .apexcharts-series[rel='").concat(r2, "'] path[j='").concat(t3, "'], .apexcharts-rangebar-series .apexcharts-series[rel='").concat(r2, "'] path[j='").concat(t3, "']")); n2 || "number" != typeof e2 || (n2 = i2.globals.dom.baseEl.querySelector(".apexcharts-bar-series .apexcharts-series[data\\:realIndex='".concat(e2, "'] path[j='").concat(t3, "'],\n .apexcharts-candlestick-series .apexcharts-series[data\\:realIndex='").concat(e2, "'] path[j='").concat(t3, "'],\n .apexcharts-boxPlot-series .apexcharts-series[data\\:realIndex='").concat(e2, "'] path[j='").concat(t3, "'],\n .apexcharts-rangebar-series .apexcharts-series[data\\:realIndex='").concat(e2, "'] path[j='").concat(t3, "']"))); var o2 = n2 ? parseFloat(n2.getAttribute("cx")) : 0, l2 = n2 ? parseFloat(n2.getAttribute("cy")) : 0, h2 = n2 ? parseFloat(n2.getAttribute("barWidth")) : 0, c2 = a2.getElGrid().getBoundingClientRect(), d2 = n2 && (n2.classList.contains("apexcharts-candlestick-area") || n2.classList.contains("apexcharts-boxPlot-area")); i2.globals.isXNumeric ? (n2 && !d2 && (o2 -= s2 % 2 != 0 ? h2 / 2 : 0), n2 && d2 && (o2 -= h2 / 2)) : i2.globals.isBarHorizontal || (o2 = a2.xAxisTicksPositions[t3 - 1] + a2.dataPointsDividedWidth / 2, isNaN(o2) && (o2 = a2.xAxisTicksPositions[t3] - a2.dataPointsDividedWidth / 2)), i2.globals.isBarHorizontal ? l2 -= a2.tooltipRect.ttHeight : i2.config.tooltip.followCursor ? l2 = a2.e.clientY - c2.top - a2.tooltipRect.ttHeight / 2 : l2 + a2.tooltipRect.ttHeight + 15 > i2.globals.gridHeight && (l2 = i2.globals.gridHeight), i2.globals.isBarHorizontal || this.moveXCrosshairs(o2), a2.fixedTooltip || this.moveTooltip(o2, l2 || i2.globals.gridHeight); } }]), t2; })(); var Aa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.ttCtx = e2, this.ctx = e2.ctx, this.tooltipPosition = new ka(e2); } return s(t2, [{ key: "drawDynamicPoints", value: function() { var t3 = this.w, e2 = new Mi(this.ctx), i2 = new Vi(this.ctx), a2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-series"); a2 = f(a2), t3.config.chart.stacked && a2.sort((function(t4, e3) { return parseFloat(t4.getAttribute("data:realIndex")) - parseFloat(e3.getAttribute("data:realIndex")); })); for (var s2 = 0; s2 < a2.length; s2++) { var r2 = a2[s2].querySelector(".apexcharts-series-markers-wrap"); if (null !== r2) { var n2 = void 0, o2 = "apexcharts-marker w".concat((Math.random() + 1).toString(36).substring(4)); "line" !== t3.config.chart.type && "area" !== t3.config.chart.type || t3.globals.comboCharts || t3.config.tooltip.intersect || (o2 += " no-pointer-events"); var l2 = i2.getMarkerConfig({ cssClass: o2, seriesIndex: Number(r2.getAttribute("data:realIndex")) }); (n2 = e2.drawMarker(0, 0, l2)).node.setAttribute("default-marker-size", 0); var h2 = document.createElementNS(t3.globals.SVGNS, "g"); h2.classList.add("apexcharts-series-markers"), h2.appendChild(n2.node), r2.appendChild(h2); } } } }, { key: "enlargeCurrentPoint", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, a2 = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null, s2 = this.w; "bubble" !== s2.config.chart.type && this.newPointSize(t3, e2); var r2 = e2.getAttribute("cx"), n2 = e2.getAttribute("cy"); if (null !== i2 && null !== a2 && (r2 = i2, n2 = a2), this.tooltipPosition.moveXCrosshairs(r2), !this.fixedTooltip) { if ("radar" === s2.config.chart.type) { var o2 = this.ttCtx.getElGrid().getBoundingClientRect(); r2 = this.ttCtx.e.clientX - o2.left; } this.tooltipPosition.moveTooltip(r2, n2, s2.config.markers.hover.size); } } }, { key: "enlargePoints", value: function(t3) { for (var e2 = this.w, i2 = this, a2 = this.ttCtx, s2 = t3, r2 = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker"), n2 = e2.config.markers.hover.size, o2 = 0; o2 < r2.length; o2++) { var l2 = r2[o2].getAttribute("rel"), h2 = r2[o2].getAttribute("index"); if (void 0 === n2 && (n2 = e2.globals.markers.size[h2] + e2.config.markers.hover.sizeOffset), s2 === parseInt(l2, 10)) { i2.newPointSize(s2, r2[o2]); var c2 = r2[o2].getAttribute("cx"), d2 = r2[o2].getAttribute("cy"); i2.tooltipPosition.moveXCrosshairs(c2), a2.fixedTooltip || i2.tooltipPosition.moveTooltip(c2, d2, n2); } else i2.oldPointSize(r2[o2]); } } }, { key: "newPointSize", value: function(t3, e2) { var i2 = this.w, a2 = i2.config.markers.hover.size, s2 = 0 === t3 ? e2.parentNode.firstChild : e2.parentNode.lastChild; if ("0" !== s2.getAttribute("default-marker-size")) { var r2 = parseInt(s2.getAttribute("index"), 10); void 0 === a2 && (a2 = i2.globals.markers.size[r2] + i2.config.markers.hover.sizeOffset), a2 < 0 && (a2 = 0); var n2 = this.ttCtx.tooltipUtil.getPathFromPoint(e2, a2); e2.setAttribute("d", n2); } } }, { key: "oldPointSize", value: function(t3) { var e2 = parseFloat(t3.getAttribute("default-marker-size")), i2 = this.ttCtx.tooltipUtil.getPathFromPoint(t3, e2); t3.setAttribute("d", i2); } }, { key: "resetPointsSize", value: function() { for (var t3 = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series:not(.apexcharts-series-collapsed) .apexcharts-marker"), e2 = 0; e2 < t3.length; e2++) { var i2 = parseFloat(t3[e2].getAttribute("default-marker-size")); if (v.isNumber(i2) && i2 > 0) { var a2 = this.ttCtx.tooltipUtil.getPathFromPoint(t3[e2], i2); t3[e2].setAttribute("d", a2); } else t3[e2].setAttribute("d", "M0,0"); } } }]), t2; })(); var Ca = (function() { function t2(e2) { i(this, t2), this.w = e2.w; var a2 = this.w; this.ttCtx = e2, this.isVerticalGroupedRangeBar = !a2.globals.isBarHorizontal && "rangeBar" === a2.config.chart.type && a2.config.plotOptions.bar.rangeBarGroupRows; } return s(t2, [{ key: "getAttr", value: function(t3, e2) { return parseFloat(t3.target.getAttribute(e2)); } }, { key: "handleHeatTreeTooltip", value: function(t3) { var e2 = t3.e, i2 = t3.opt, a2 = t3.x, s2 = t3.y, r2 = t3.type, n2 = this.ttCtx, o2 = this.w; if (e2.target.classList.contains("apexcharts-".concat(r2, "-rect"))) { var l2 = this.getAttr(e2, "i"), h2 = this.getAttr(e2, "j"), c2 = this.getAttr(e2, "cx"), d2 = this.getAttr(e2, "cy"), u2 = this.getAttr(e2, "width"), g2 = this.getAttr(e2, "height"); if (n2.tooltipLabels.drawSeriesTexts({ ttItems: i2.ttItems, i: l2, j: h2, shared: false, e: e2 }), o2.globals.capturedSeriesIndex = l2, o2.globals.capturedDataPointIndex = h2, a2 = c2 + n2.tooltipRect.ttWidth / 2 + u2, s2 = d2 + n2.tooltipRect.ttHeight / 2 - g2 / 2, n2.tooltipPosition.moveXCrosshairs(c2 + u2 / 2), a2 > o2.globals.gridWidth / 2 && (a2 = c2 - n2.tooltipRect.ttWidth / 2 + u2), n2.w.config.tooltip.followCursor) { var p2 = o2.globals.dom.elWrap.getBoundingClientRect(); a2 = o2.globals.clientX - p2.left - (a2 > o2.globals.gridWidth / 2 ? n2.tooltipRect.ttWidth : 0), s2 = o2.globals.clientY - p2.top - (s2 > o2.globals.gridHeight / 2 ? n2.tooltipRect.ttHeight : 0); } } return { x: a2, y: s2 }; } }, { key: "handleMarkerTooltip", value: function(t3) { var e2, i2, a2 = t3.e, s2 = t3.opt, r2 = t3.x, n2 = t3.y, o2 = this.w, l2 = this.ttCtx; if (a2.target.classList.contains("apexcharts-marker")) { var h2 = parseInt(s2.paths.getAttribute("cx"), 10), c2 = parseInt(s2.paths.getAttribute("cy"), 10), d2 = parseFloat(s2.paths.getAttribute("val")); if (i2 = parseInt(s2.paths.getAttribute("rel"), 10), e2 = parseInt(s2.paths.parentNode.parentNode.parentNode.getAttribute("rel"), 10) - 1, l2.intersect) { var u2 = v.findAncestor(s2.paths, "apexcharts-series"); u2 && (e2 = parseInt(u2.getAttribute("data:realIndex"), 10)); } if (l2.tooltipLabels.drawSeriesTexts({ ttItems: s2.ttItems, i: e2, j: i2, shared: !l2.showOnIntersect && o2.config.tooltip.shared, e: a2 }), "mouseup" === a2.type && l2.markerClick(a2, e2, i2), o2.globals.capturedSeriesIndex = e2, o2.globals.capturedDataPointIndex = i2, r2 = h2, n2 = c2 + o2.globals.translateY - 1.4 * l2.tooltipRect.ttHeight, l2.w.config.tooltip.followCursor) { var g2 = l2.getElGrid().getBoundingClientRect(); n2 = l2.e.clientY + o2.globals.translateY - g2.top; } d2 < 0 && (n2 = c2), l2.marker.enlargeCurrentPoint(i2, s2.paths, r2, n2); } return { x: r2, y: n2 }; } }, { key: "handleBarTooltip", value: function(t3) { var e2, i2, a2 = t3.e, s2 = t3.opt, r2 = this.w, n2 = this.ttCtx, o2 = n2.getElTooltip(), l2 = 0, h2 = 0, c2 = 0, d2 = this.getBarTooltipXY({ e: a2, opt: s2 }); if (null !== d2.j || 0 !== d2.barHeight || 0 !== d2.barWidth) { e2 = d2.i; var u2 = d2.j; if (r2.globals.capturedSeriesIndex = e2, r2.globals.capturedDataPointIndex = u2, r2.globals.isBarHorizontal && n2.tooltipUtil.hasBars() || !r2.config.tooltip.shared ? (h2 = d2.x, c2 = d2.y, i2 = Array.isArray(r2.config.stroke.width) ? r2.config.stroke.width[e2] : r2.config.stroke.width, l2 = h2) : r2.globals.comboCharts || r2.config.tooltip.shared || (l2 /= 2), isNaN(c2) && (c2 = r2.globals.svgHeight - n2.tooltipRect.ttHeight), parseInt(s2.paths.parentNode.getAttribute("data:realIndex"), 10), h2 + n2.tooltipRect.ttWidth > r2.globals.gridWidth ? h2 -= n2.tooltipRect.ttWidth : h2 < 0 && (h2 = 0), n2.w.config.tooltip.followCursor) { var g2 = n2.getElGrid().getBoundingClientRect(); c2 = n2.e.clientY - g2.top; } null === n2.tooltip && (n2.tooltip = r2.globals.dom.baseEl.querySelector(".apexcharts-tooltip")), r2.config.tooltip.shared || (r2.globals.comboBarCount > 0 ? n2.tooltipPosition.moveXCrosshairs(l2 + i2 / 2) : n2.tooltipPosition.moveXCrosshairs(l2)), !n2.fixedTooltip && (!r2.config.tooltip.shared || r2.globals.isBarHorizontal && n2.tooltipUtil.hasBars()) && (c2 = c2 + r2.globals.translateY - n2.tooltipRect.ttHeight / 2, o2.style.left = h2 + r2.globals.translateX + "px", o2.style.top = c2 + "px"); } } }, { key: "getBarTooltipXY", value: function(t3) { var e2 = this, i2 = t3.e, a2 = t3.opt, s2 = this.w, r2 = null, n2 = this.ttCtx, o2 = 0, l2 = 0, h2 = 0, c2 = 0, d2 = 0, u2 = i2.target.classList; if (u2.contains("apexcharts-bar-area") || u2.contains("apexcharts-candlestick-area") || u2.contains("apexcharts-boxPlot-area") || u2.contains("apexcharts-rangebar-area")) { var g2 = i2.target, p2 = g2.getBoundingClientRect(), f2 = a2.elGrid.getBoundingClientRect(), x2 = p2.height; d2 = p2.height; var b2 = p2.width, m2 = parseInt(g2.getAttribute("cx"), 10), v2 = parseInt(g2.getAttribute("cy"), 10); c2 = parseFloat(g2.getAttribute("barWidth")); var y2 = "touchmove" === i2.type ? i2.touches[0].clientX : i2.clientX; r2 = parseInt(g2.getAttribute("j"), 10), o2 = parseInt(g2.parentNode.getAttribute("rel"), 10) - 1; var w2 = g2.getAttribute("data-range-y1"), k2 = g2.getAttribute("data-range-y2"); s2.globals.comboCharts && (o2 = parseInt(g2.parentNode.getAttribute("data:realIndex"), 10)); var A2 = function(t4) { return s2.globals.isXNumeric ? m2 - b2 / 2 : e2.isVerticalGroupedRangeBar ? m2 + b2 / 2 : m2 - n2.dataPointsDividedWidth + b2 / 2; }, C2 = function() { return v2 - n2.dataPointsDividedHeight + x2 / 2 - n2.tooltipRect.ttHeight / 2; }; n2.tooltipLabels.drawSeriesTexts({ ttItems: a2.ttItems, i: o2, j: r2, y1: w2 ? parseInt(w2, 10) : null, y2: k2 ? parseInt(k2, 10) : null, shared: !n2.showOnIntersect && s2.config.tooltip.shared, e: i2 }), s2.config.tooltip.followCursor ? s2.globals.isBarHorizontal ? (l2 = y2 - f2.left + 15, h2 = C2()) : (l2 = A2(), h2 = i2.clientY - f2.top - n2.tooltipRect.ttHeight / 2 - 15) : s2.globals.isBarHorizontal ? ((l2 = m2) < n2.xyRatios.baseLineInvertedY && (l2 = m2 - n2.tooltipRect.ttWidth), h2 = C2()) : (l2 = A2(), h2 = v2); } return { x: l2, y: h2, barHeight: d2, barWidth: c2, i: o2, j: r2 }; } }]), t2; })(); var Sa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.ttCtx = e2; } return s(t2, [{ key: "drawXaxisTooltip", value: function() { var t3 = this.w, e2 = this.ttCtx, i2 = "bottom" === t3.config.xaxis.position; e2.xaxisOffY = i2 ? t3.globals.gridHeight + 1 : -t3.globals.xAxisHeight - t3.config.xaxis.axisTicks.height + 3; var a2 = i2 ? "apexcharts-xaxistooltip apexcharts-xaxistooltip-bottom" : "apexcharts-xaxistooltip apexcharts-xaxistooltip-top", s2 = t3.globals.dom.elWrap; e2.isXAxisTooltipEnabled && (null === t3.globals.dom.baseEl.querySelector(".apexcharts-xaxistooltip") && (e2.xaxisTooltip = document.createElement("div"), e2.xaxisTooltip.setAttribute("class", a2 + " apexcharts-theme-" + t3.config.tooltip.theme), s2.appendChild(e2.xaxisTooltip), e2.xaxisTooltipText = document.createElement("div"), e2.xaxisTooltipText.classList.add("apexcharts-xaxistooltip-text"), e2.xaxisTooltipText.style.fontFamily = t3.config.xaxis.tooltip.style.fontFamily || t3.config.chart.fontFamily, e2.xaxisTooltipText.style.fontSize = t3.config.xaxis.tooltip.style.fontSize, e2.xaxisTooltip.appendChild(e2.xaxisTooltipText))); } }, { key: "drawYaxisTooltip", value: function() { for (var t3 = this.w, e2 = this.ttCtx, i2 = 0; i2 < t3.config.yaxis.length; i2++) { var a2 = t3.config.yaxis[i2].opposite || t3.config.yaxis[i2].crosshairs.opposite; e2.yaxisOffX = a2 ? t3.globals.gridWidth + 1 : 1; var s2 = "apexcharts-yaxistooltip apexcharts-yaxistooltip-".concat(i2, a2 ? " apexcharts-yaxistooltip-right" : " apexcharts-yaxistooltip-left"), r2 = t3.globals.dom.elWrap; null === t3.globals.dom.baseEl.querySelector(".apexcharts-yaxistooltip apexcharts-yaxistooltip-".concat(i2)) && (e2.yaxisTooltip = document.createElement("div"), e2.yaxisTooltip.setAttribute("class", s2 + " apexcharts-theme-" + t3.config.tooltip.theme), r2.appendChild(e2.yaxisTooltip), 0 === i2 && (e2.yaxisTooltipText = []), e2.yaxisTooltipText[i2] = document.createElement("div"), e2.yaxisTooltipText[i2].classList.add("apexcharts-yaxistooltip-text"), e2.yaxisTooltip.appendChild(e2.yaxisTooltipText[i2])); } } }, { key: "setXCrosshairWidth", value: function() { var t3 = this.w, e2 = this.ttCtx, i2 = e2.getElXCrosshairs(); if (e2.xcrosshairsWidth = parseInt(t3.config.xaxis.crosshairs.width, 10), t3.globals.comboCharts) { var a2 = t3.globals.dom.baseEl.querySelector(".apexcharts-bar-area"); if (null !== a2 && "barWidth" === t3.config.xaxis.crosshairs.width) { var s2 = parseFloat(a2.getAttribute("barWidth")); e2.xcrosshairsWidth = s2; } else if ("tickWidth" === t3.config.xaxis.crosshairs.width) { var r2 = t3.globals.labels.length; e2.xcrosshairsWidth = t3.globals.gridWidth / r2; } } else if ("tickWidth" === t3.config.xaxis.crosshairs.width) { var n2 = t3.globals.labels.length; e2.xcrosshairsWidth = t3.globals.gridWidth / n2; } else if ("barWidth" === t3.config.xaxis.crosshairs.width) { var o2 = t3.globals.dom.baseEl.querySelector(".apexcharts-bar-area"); if (null !== o2) { var l2 = parseFloat(o2.getAttribute("barWidth")); e2.xcrosshairsWidth = l2; } else e2.xcrosshairsWidth = 1; } t3.globals.isBarHorizontal && (e2.xcrosshairsWidth = 0), null !== i2 && e2.xcrosshairsWidth > 0 && i2.setAttribute("width", e2.xcrosshairsWidth); } }, { key: "handleYCrosshair", value: function() { var t3 = this.w, e2 = this.ttCtx; e2.ycrosshairs = t3.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs"), e2.ycrosshairsHidden = t3.globals.dom.baseEl.querySelector(".apexcharts-ycrosshairs-hidden"); } }, { key: "drawYaxisTooltipText", value: function(t3, e2, i2) { var a2 = this.ttCtx, s2 = this.w, r2 = s2.globals, n2 = r2.seriesYAxisMap[t3]; if (a2.yaxisTooltips[t3] && n2.length > 0) { var o2 = r2.yLabelFormatters[t3], l2 = a2.getElGrid().getBoundingClientRect(), h2 = n2[0], c2 = 0; i2.yRatio.length > 1 && (c2 = h2); var d2 = (e2 - l2.top) * i2.yRatio[c2], u2 = r2.maxYArr[h2] - r2.minYArr[h2], g2 = r2.minYArr[h2] + (u2 - d2); s2.config.yaxis[t3].reversed && (g2 = r2.maxYArr[h2] - (u2 - d2)), a2.tooltipPosition.moveYCrosshairs(e2 - l2.top), a2.yaxisTooltipText[t3].innerHTML = o2(g2), a2.tooltipPosition.moveYAxisTooltip(t3); } } }]), t2; })(); var La = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; var a2 = this.w; this.tConfig = a2.config.tooltip, this.tooltipUtil = new ya(this), this.tooltipLabels = new wa(this), this.tooltipPosition = new ka(this), this.marker = new Aa(this), this.intersect = new Ca(this), this.axesTooltip = new Sa(this), this.showOnIntersect = this.tConfig.intersect, this.showTooltipTitle = this.tConfig.x.show, this.fixedTooltip = this.tConfig.fixed.enabled, this.xaxisTooltip = null, this.yaxisTTEls = null, this.isBarShared = !a2.globals.isBarHorizontal && this.tConfig.shared, this.lastHoverTime = Date.now(); } return s(t2, [{ key: "getElTooltip", value: function(t3) { return t3 || (t3 = this), t3.w.globals.dom.baseEl ? t3.w.globals.dom.baseEl.querySelector(".apexcharts-tooltip") : null; } }, { key: "getElXCrosshairs", value: function() { return this.w.globals.dom.baseEl.querySelector(".apexcharts-xcrosshairs"); } }, { key: "getElGrid", value: function() { return this.w.globals.dom.baseEl.querySelector(".apexcharts-grid"); } }, { key: "drawTooltip", value: function(t3) { var e2 = this.w; this.xyRatios = t3, this.isXAxisTooltipEnabled = e2.config.xaxis.tooltip.enabled && e2.globals.axisCharts, this.yaxisTooltips = e2.config.yaxis.map((function(t4, i3) { return !!(t4.show && t4.tooltip.enabled && e2.globals.axisCharts); })), this.allTooltipSeriesGroups = [], e2.globals.axisCharts || (this.showTooltipTitle = false); var i2 = document.createElement("div"); if (i2.classList.add("apexcharts-tooltip"), e2.config.tooltip.cssClass && i2.classList.add(e2.config.tooltip.cssClass), i2.classList.add("apexcharts-theme-".concat(this.tConfig.theme || "light")), e2.globals.dom.elWrap.appendChild(i2), e2.globals.axisCharts) { this.axesTooltip.drawXaxisTooltip(), this.axesTooltip.drawYaxisTooltip(), this.axesTooltip.setXCrosshairWidth(), this.axesTooltip.handleYCrosshair(); var a2 = new Ki(this.ctx); this.xAxisTicksPositions = a2.getXAxisTicksPositions(); } if (!e2.globals.comboCharts && !this.tConfig.intersect && "rangeBar" !== e2.config.chart.type || this.tConfig.shared || (this.showOnIntersect = true), 0 !== e2.config.markers.size && 0 !== e2.globals.markers.largestSize || this.marker.drawDynamicPoints(this), e2.globals.collapsedSeries.length !== e2.globals.series.length) { this.dataPointsDividedHeight = e2.globals.gridHeight / e2.globals.dataPoints, this.dataPointsDividedWidth = e2.globals.gridWidth / e2.globals.dataPoints, this.showTooltipTitle && (this.tooltipTitle = document.createElement("div"), this.tooltipTitle.classList.add("apexcharts-tooltip-title"), this.tooltipTitle.style.fontFamily = this.tConfig.style.fontFamily || e2.config.chart.fontFamily, this.tooltipTitle.style.fontSize = this.tConfig.style.fontSize, i2.appendChild(this.tooltipTitle)); var s2 = e2.globals.series.length; (e2.globals.xyCharts || e2.globals.comboCharts) && this.tConfig.shared && (s2 = this.showOnIntersect ? 1 : e2.globals.series.length), this.legendLabels = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-legend-text"), this.ttItems = this.createTTElements(s2), this.addSVGEvents(); } } }, { key: "createTTElements", value: function(t3) { for (var e2 = this, i2 = this.w, a2 = [], s2 = this.getElTooltip(), r2 = function(r3) { var n3 = document.createElement("div"); n3.classList.add("apexcharts-tooltip-series-group", "apexcharts-tooltip-series-group-".concat(r3)), n3.style.order = i2.config.tooltip.inverseOrder ? t3 - r3 : r3 + 1; var o2 = document.createElement("span"); o2.classList.add("apexcharts-tooltip-marker"), i2.config.tooltip.fillSeriesColor ? o2.style.backgroundColor = i2.globals.colors[r3] : o2.style.color = i2.globals.colors[r3]; var l2 = i2.config.markers.shape, h2 = l2; Array.isArray(l2) && (h2 = l2[r3]), o2.setAttribute("shape", h2), n3.appendChild(o2); var c2 = document.createElement("div"); c2.classList.add("apexcharts-tooltip-text"), c2.style.fontFamily = e2.tConfig.style.fontFamily || i2.config.chart.fontFamily, c2.style.fontSize = e2.tConfig.style.fontSize, ["y", "goals", "z"].forEach((function(t4) { var e3 = document.createElement("div"); e3.classList.add("apexcharts-tooltip-".concat(t4, "-group")); var i3 = document.createElement("span"); i3.classList.add("apexcharts-tooltip-text-".concat(t4, "-label")), e3.appendChild(i3); var a3 = document.createElement("span"); a3.classList.add("apexcharts-tooltip-text-".concat(t4, "-value")), e3.appendChild(a3), c2.appendChild(e3); })), n3.appendChild(c2), s2.appendChild(n3), a2.push(n3); }, n2 = 0; n2 < t3; n2++) r2(n2); return a2; } }, { key: "addSVGEvents", value: function() { var t3 = this.w, e2 = t3.config.chart.type, i2 = this.getElTooltip(), a2 = !("bar" !== e2 && "candlestick" !== e2 && "boxPlot" !== e2 && "rangeBar" !== e2), s2 = "area" === e2 || "line" === e2 || "scatter" === e2 || "bubble" === e2 || "radar" === e2, r2 = t3.globals.dom.Paper.node, n2 = this.getElGrid(); n2 && (this.seriesBound = n2.getBoundingClientRect()); var o2, l2 = [], h2 = [], c2 = { hoverArea: r2, elGrid: n2, tooltipEl: i2, tooltipY: l2, tooltipX: h2, ttItems: this.ttItems }; if (t3.globals.axisCharts && (s2 ? o2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-series[data\\:longestSeries='true'] .apexcharts-marker") : a2 ? o2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-series .apexcharts-bar-area, .apexcharts-series .apexcharts-candlestick-area, .apexcharts-series .apexcharts-boxPlot-area, .apexcharts-series .apexcharts-rangebar-area") : "heatmap" !== e2 && "treemap" !== e2 || (o2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-series .apexcharts-heatmap, .apexcharts-series .apexcharts-treemap")), o2 && o2.length)) for (var d2 = 0; d2 < o2.length; d2++) l2.push(o2[d2].getAttribute("cy")), h2.push(o2[d2].getAttribute("cx")); if (t3.globals.xyCharts && !this.showOnIntersect || t3.globals.comboCharts && !this.showOnIntersect || a2 && this.tooltipUtil.hasBars() && this.tConfig.shared) this.addPathsEventListeners([r2], c2); else if (a2 && !t3.globals.comboCharts || s2 && this.showOnIntersect) this.addDatapointEventsListeners(c2); else if (!t3.globals.axisCharts || "heatmap" === e2 || "treemap" === e2) { var u2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-series"); this.addPathsEventListeners(u2, c2); } if (this.showOnIntersect) { var g2 = t3.globals.dom.baseEl.querySelectorAll(".apexcharts-line-series .apexcharts-marker, .apexcharts-area-series .apexcharts-marker"); g2.length > 0 && this.addPathsEventListeners(g2, c2), this.tooltipUtil.hasBars() && !this.tConfig.shared && this.addDatapointEventsListeners(c2); } } }, { key: "drawFixedTooltipRect", value: function() { var t3 = this.w, e2 = this.getElTooltip(), i2 = e2.getBoundingClientRect(), a2 = i2.width + 10, s2 = i2.height + 10, r2 = this.tConfig.fixed.offsetX, n2 = this.tConfig.fixed.offsetY, o2 = this.tConfig.fixed.position.toLowerCase(); return o2.indexOf("right") > -1 && (r2 = r2 + t3.globals.svgWidth - a2 + 10), o2.indexOf("bottom") > -1 && (n2 = n2 + t3.globals.svgHeight - s2 - 10), e2.style.left = r2 + "px", e2.style.top = n2 + "px", { x: r2, y: n2, ttWidth: a2, ttHeight: s2 }; } }, { key: "addDatapointEventsListeners", value: function(t3) { var e2 = this.w.globals.dom.baseEl.querySelectorAll(".apexcharts-series-markers .apexcharts-marker, .apexcharts-bar-area, .apexcharts-candlestick-area, .apexcharts-boxPlot-area, .apexcharts-rangebar-area"); this.addPathsEventListeners(e2, t3); } }, { key: "addPathsEventListeners", value: function(t3, e2) { for (var i2 = this, a2 = function(a3) { var s3 = { paths: t3[a3], tooltipEl: e2.tooltipEl, tooltipY: e2.tooltipY, tooltipX: e2.tooltipX, elGrid: e2.elGrid, hoverArea: e2.hoverArea, ttItems: e2.ttItems }; ["mousemove", "mouseup", "touchmove", "mouseout", "touchend"].map((function(e3) { return t3[a3].addEventListener(e3, i2.onSeriesHover.bind(i2, s3), { capture: false, passive: true }); })); }, s2 = 0; s2 < t3.length; s2++) a2(s2); } }, { key: "onSeriesHover", value: function(t3, e2) { var i2 = this, a2 = Date.now() - this.lastHoverTime; a2 >= 20 ? this.seriesHover(t3, e2) : (clearTimeout(this.seriesHoverTimeout), this.seriesHoverTimeout = setTimeout((function() { i2.seriesHover(t3, e2); }), 20 - a2)); } }, { key: "seriesHover", value: function(t3, e2) { var i2 = this; this.lastHoverTime = Date.now(); var a2 = [], s2 = this.w; s2.config.chart.group && (a2 = this.ctx.getGroupedCharts()), s2.globals.axisCharts && (s2.globals.minX === -1 / 0 && s2.globals.maxX === 1 / 0 || 0 === s2.globals.dataPoints) || (a2.length ? a2.forEach((function(a3) { var s3 = i2.getElTooltip(a3), r2 = { paths: t3.paths, tooltipEl: s3, tooltipY: t3.tooltipY, tooltipX: t3.tooltipX, elGrid: t3.elGrid, hoverArea: t3.hoverArea, ttItems: a3.w.globals.tooltip.ttItems }; a3.w.globals.minX === i2.w.globals.minX && a3.w.globals.maxX === i2.w.globals.maxX && a3.w.globals.tooltip.seriesHoverByContext({ chartCtx: a3, ttCtx: a3.w.globals.tooltip, opt: r2, e: e2 }); })) : this.seriesHoverByContext({ chartCtx: this.ctx, ttCtx: this.w.globals.tooltip, opt: t3, e: e2 })); } }, { key: "seriesHoverByContext", value: function(t3) { var e2 = t3.chartCtx, i2 = t3.ttCtx, a2 = t3.opt, s2 = t3.e, r2 = e2.w, n2 = this.getElTooltip(e2); if (n2) { if (i2.tooltipRect = { x: 0, y: 0, ttWidth: n2.getBoundingClientRect().width, ttHeight: n2.getBoundingClientRect().height }, i2.e = s2, i2.tooltipUtil.hasBars() && !r2.globals.comboCharts && !i2.isBarShared) { if (this.tConfig.onDatasetHover.highlightDataSeries) new $i(e2).toggleSeriesOnHover(s2, s2.target.parentNode); } r2.globals.axisCharts ? i2.axisChartsTooltips({ e: s2, opt: a2, tooltipRect: i2.tooltipRect }) : i2.nonAxisChartsTooltips({ e: s2, opt: a2, tooltipRect: i2.tooltipRect }), i2.fixedTooltip && i2.drawFixedTooltipRect(); } } }, { key: "axisChartsTooltips", value: function(t3) { var e2, i2, a2 = t3.e, s2 = t3.opt, r2 = this.w, n2 = s2.elGrid.getBoundingClientRect(), o2 = "touchmove" === a2.type ? a2.touches[0].clientX : a2.clientX, l2 = "touchmove" === a2.type ? a2.touches[0].clientY : a2.clientY; if (this.clientY = l2, this.clientX = o2, r2.globals.capturedSeriesIndex = -1, r2.globals.capturedDataPointIndex = -1, l2 < n2.top || l2 > n2.top + n2.height) this.handleMouseOut(s2); else { if (Array.isArray(this.tConfig.enabledOnSeries) && !r2.config.tooltip.shared) { var h2 = parseInt(s2.paths.getAttribute("index"), 10); if (this.tConfig.enabledOnSeries.indexOf(h2) < 0) return void this.handleMouseOut(s2); } var c2 = this.getElTooltip(), d2 = this.getElXCrosshairs(), u2 = []; r2.config.chart.group && (u2 = this.ctx.getSyncedCharts()); var g2 = r2.globals.xyCharts || "bar" === r2.config.chart.type && !r2.globals.isBarHorizontal && this.tooltipUtil.hasBars() && this.tConfig.shared || r2.globals.comboCharts && this.tooltipUtil.hasBars(); if ("mousemove" === a2.type || "touchmove" === a2.type || "mouseup" === a2.type) { if (r2.globals.collapsedSeries.length + r2.globals.ancillaryCollapsedSeries.length === r2.globals.series.length) return; null !== d2 && d2.classList.add("apexcharts-active"); var p2 = this.yaxisTooltips.filter((function(t4) { return true === t4; })); if (null !== this.ycrosshairs && p2.length && this.ycrosshairs.classList.add("apexcharts-active"), g2 && !this.showOnIntersect || u2.length > 1) this.handleStickyTooltip(a2, o2, l2, s2); else if ("heatmap" === r2.config.chart.type || "treemap" === r2.config.chart.type) { var f2 = this.intersect.handleHeatTreeTooltip({ e: a2, opt: s2, x: e2, y: i2, type: r2.config.chart.type }); e2 = f2.x, i2 = f2.y, c2.style.left = e2 + "px", c2.style.top = i2 + "px"; } else this.tooltipUtil.hasBars() && this.intersect.handleBarTooltip({ e: a2, opt: s2 }), this.tooltipUtil.hasMarkers() && this.intersect.handleMarkerTooltip({ e: a2, opt: s2, x: e2, y: i2 }); if (this.yaxisTooltips.length) for (var x2 = 0; x2 < r2.config.yaxis.length; x2++) this.axesTooltip.drawYaxisTooltipText(x2, l2, this.xyRatios); r2.globals.dom.baseEl.classList.add("apexcharts-tooltip-active"), s2.tooltipEl.classList.add("apexcharts-active"); } else "mouseout" !== a2.type && "touchend" !== a2.type || this.handleMouseOut(s2); } } }, { key: "nonAxisChartsTooltips", value: function(t3) { var e2 = t3.e, i2 = t3.opt, a2 = t3.tooltipRect, s2 = this.w, r2 = i2.paths.getAttribute("rel"), n2 = this.getElTooltip(), o2 = s2.globals.dom.elWrap.getBoundingClientRect(); if ("mousemove" === e2.type || "touchmove" === e2.type) { s2.globals.dom.baseEl.classList.add("apexcharts-tooltip-active"), n2.classList.add("apexcharts-active"), this.tooltipLabels.drawSeriesTexts({ ttItems: i2.ttItems, i: parseInt(r2, 10) - 1, shared: false }); var l2 = s2.globals.clientX - o2.left - a2.ttWidth / 2, h2 = s2.globals.clientY - o2.top - a2.ttHeight - 10; if (n2.style.left = l2 + "px", n2.style.top = h2 + "px", s2.config.legend.tooltipHoverFormatter) { var c2 = r2 - 1, d2 = (0, s2.config.legend.tooltipHoverFormatter)(this.legendLabels[c2].getAttribute("data:default-text"), { seriesIndex: c2, dataPointIndex: c2, w: s2 }); this.legendLabels[c2].innerHTML = d2; } } else "mouseout" !== e2.type && "touchend" !== e2.type || (n2.classList.remove("apexcharts-active"), s2.globals.dom.baseEl.classList.remove("apexcharts-tooltip-active"), s2.config.legend.tooltipHoverFormatter && this.legendLabels.forEach((function(t4) { var e3 = t4.getAttribute("data:default-text"); t4.innerHTML = decodeURIComponent(e3); }))); } }, { key: "handleStickyTooltip", value: function(t3, e2, i2, a2) { var s2 = this.w, r2 = this.tooltipUtil.getNearestValues({ context: this, hoverArea: a2.hoverArea, elGrid: a2.elGrid, clientX: e2, clientY: i2 }), n2 = r2.j, o2 = r2.capturedSeries; s2.globals.collapsedSeriesIndices.includes(o2) && (o2 = null); var l2 = a2.elGrid.getBoundingClientRect(); if (r2.hoverX < 0 || r2.hoverX > l2.width) this.handleMouseOut(a2); else if (null !== o2) this.handleStickyCapturedSeries(t3, o2, a2, n2); else if (this.tooltipUtil.isXoverlap(n2) || s2.globals.isBarHorizontal) { var h2 = s2.globals.series.findIndex((function(t4, e3) { return !s2.globals.collapsedSeriesIndices.includes(e3); })); this.create(t3, this, h2, n2, a2.ttItems); } } }, { key: "handleStickyCapturedSeries", value: function(t3, e2, i2, a2) { var s2 = this.w; if (!this.tConfig.shared && null === s2.globals.series[e2][a2]) return void this.handleMouseOut(i2); if (void 0 !== s2.globals.series[e2][a2]) this.tConfig.shared && this.tooltipUtil.isXoverlap(a2) && this.tooltipUtil.isInitialSeriesSameLen() ? this.create(t3, this, e2, a2, i2.ttItems) : this.create(t3, this, e2, a2, i2.ttItems, false); else if (this.tooltipUtil.isXoverlap(a2)) { var r2 = s2.globals.series.findIndex((function(t4, e3) { return !s2.globals.collapsedSeriesIndices.includes(e3); })); this.create(t3, this, r2, a2, i2.ttItems); } } }, { key: "deactivateHoverFilter", value: function() { for (var t3 = this.w, e2 = new Mi(this.ctx), i2 = t3.globals.dom.Paper.find(".apexcharts-bar-area"), a2 = 0; a2 < i2.length; a2++) e2.pathMouseLeave(i2[a2]); } }, { key: "handleMouseOut", value: function(t3) { var e2 = this.w, i2 = this.getElXCrosshairs(); if (e2.globals.dom.baseEl.classList.remove("apexcharts-tooltip-active"), t3.tooltipEl.classList.remove("apexcharts-active"), this.deactivateHoverFilter(), "bubble" !== e2.config.chart.type && this.marker.resetPointsSize(), null !== i2 && i2.classList.remove("apexcharts-active"), null !== this.ycrosshairs && this.ycrosshairs.classList.remove("apexcharts-active"), this.isXAxisTooltipEnabled && this.xaxisTooltip.classList.remove("apexcharts-active"), this.yaxisTooltips.length) { null === this.yaxisTTEls && (this.yaxisTTEls = e2.globals.dom.baseEl.querySelectorAll(".apexcharts-yaxistooltip")); for (var a2 = 0; a2 < this.yaxisTTEls.length; a2++) this.yaxisTTEls[a2].classList.remove("apexcharts-active"); } e2.config.legend.tooltipHoverFormatter && this.legendLabels.forEach((function(t4) { var e3 = t4.getAttribute("data:default-text"); t4.innerHTML = decodeURIComponent(e3); })); } }, { key: "markerClick", value: function(t3, e2, i2) { var a2 = this.w; "function" == typeof a2.config.chart.events.markerClick && a2.config.chart.events.markerClick(t3, this.ctx, { seriesIndex: e2, dataPointIndex: i2, w: a2 }), this.ctx.events.fireEvent("markerClick", [t3, this.ctx, { seriesIndex: e2, dataPointIndex: i2, w: a2 }]); } }, { key: "create", value: function(t3, e2, i2, a2, s2) { var r2, n2, o2, l2, h2, c2, d2, g2, p2, f2, x2, b2, m2, v2, y2, w2, k2 = arguments.length > 5 && void 0 !== arguments[5] ? arguments[5] : null, A2 = this.w, C2 = e2; "mouseup" === t3.type && this.markerClick(t3, i2, a2), null === k2 && (k2 = this.tConfig.shared); var S2 = this.tooltipUtil.hasMarkers(i2), L2 = this.tooltipUtil.getElBars(), M2 = function() { A2.globals.markers.largestSize > 0 ? C2.marker.enlargePoints(a2) : C2.tooltipPosition.moveDynamicPointsOnHover(a2); }; if (A2.config.legend.tooltipHoverFormatter) { var P2 = A2.config.legend.tooltipHoverFormatter, I2 = Array.from(this.legendLabels); I2.forEach((function(t4) { var e3 = t4.getAttribute("data:default-text"); t4.innerHTML = decodeURIComponent(e3); })); for (var T2 = 0; T2 < I2.length; T2++) { var z2 = I2[T2], X2 = parseInt(z2.getAttribute("i"), 10), R2 = decodeURIComponent(z2.getAttribute("data:default-text")), E2 = P2(R2, { seriesIndex: k2 ? X2 : i2, dataPointIndex: a2, w: A2 }); if (k2) z2.innerHTML = A2.globals.collapsedSeriesIndices.indexOf(X2) < 0 ? E2 : R2; else if (z2.innerHTML = X2 === i2 ? E2 : R2, i2 === X2) break; } } var Y2 = u(u({ ttItems: s2, i: i2, j: a2 }, void 0 !== (null === (r2 = A2.globals.seriesRange) || void 0 === r2 || null === (n2 = r2[i2]) || void 0 === n2 || null === (o2 = n2[a2]) || void 0 === o2 || null === (l2 = o2.y[0]) || void 0 === l2 ? void 0 : l2.y1) && { y1: null === (h2 = A2.globals.seriesRange) || void 0 === h2 || null === (c2 = h2[i2]) || void 0 === c2 || null === (d2 = c2[a2]) || void 0 === d2 || null === (g2 = d2.y[0]) || void 0 === g2 ? void 0 : g2.y1 }), void 0 !== (null === (p2 = A2.globals.seriesRange) || void 0 === p2 || null === (f2 = p2[i2]) || void 0 === f2 || null === (x2 = f2[a2]) || void 0 === x2 || null === (b2 = x2.y[0]) || void 0 === b2 ? void 0 : b2.y2) && { y2: null === (m2 = A2.globals.seriesRange) || void 0 === m2 || null === (v2 = m2[i2]) || void 0 === v2 || null === (y2 = v2[a2]) || void 0 === y2 || null === (w2 = y2.y[0]) || void 0 === w2 ? void 0 : w2.y2 }); if (k2) { if (C2.tooltipLabels.drawSeriesTexts(u(u({}, Y2), {}, { shared: !this.showOnIntersect && this.tConfig.shared })), S2) M2(); else if (this.tooltipUtil.hasBars() && (this.barSeriesHeight = this.tooltipUtil.getBarsHeight(L2), this.barSeriesHeight > 0)) { var H2 = new Mi(this.ctx), O2 = A2.globals.dom.Paper.find(".apexcharts-bar-area[j='".concat(a2, "']")); this.deactivateHoverFilter(), C2.tooltipUtil.getAllMarkers(true).length && !this.barSeriesHeight && M2(), C2.tooltipPosition.moveStickyTooltipOverBars(a2, i2); for (var F2 = 0; F2 < O2.length; F2++) H2.pathMouseEnter(O2[F2]); } } else C2.tooltipLabels.drawSeriesTexts(u({ shared: false }, Y2)), this.tooltipUtil.hasBars() && C2.tooltipPosition.moveStickyTooltipOverBars(a2, i2), S2 && C2.tooltipPosition.moveMarkers(i2, a2); } }]), t2; })(); var Ma = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.barCtx = e2, this.totalFormatter = this.w.config.plotOptions.bar.dataLabels.total.formatter, this.totalFormatter || (this.totalFormatter = this.w.config.dataLabels.formatter); } return s(t2, [{ key: "handleBarDataLabels", value: function(t3) { var e2, i2, a2 = t3.x, s2 = t3.y, r2 = t3.y1, n2 = t3.y2, o2 = t3.i, l2 = t3.j, h2 = t3.realIndex, c2 = t3.columnGroupIndex, d2 = t3.series, g2 = t3.barHeight, p2 = t3.barWidth, f2 = t3.barXPosition, x2 = t3.barYPosition, b2 = t3.visibleSeries, m2 = this.w, v2 = new Mi(this.barCtx.ctx), y2 = Array.isArray(this.barCtx.strokeWidth) ? this.barCtx.strokeWidth[h2] : this.barCtx.strokeWidth; m2.globals.isXNumeric && !m2.globals.isBarHorizontal ? (e2 = a2 + parseFloat(p2 * (b2 + 1)), i2 = s2 + parseFloat(g2 * (b2 + 1)) - y2) : (e2 = a2 + parseFloat(p2 * b2), i2 = s2 + parseFloat(g2 * b2)); var w2, k2 = null, A2 = a2, C2 = s2, S2 = {}, L2 = m2.config.dataLabels, M2 = this.barCtx.barOptions.dataLabels, P2 = this.barCtx.barOptions.dataLabels.total; void 0 !== x2 && this.barCtx.isRangeBar && (i2 = x2, C2 = x2), void 0 !== f2 && this.barCtx.isVerticalGroupedRangeBar && (e2 = f2, A2 = f2); var I2 = L2.offsetX, T2 = L2.offsetY, z2 = { width: 0, height: 0 }; if (m2.config.dataLabels.enabled) { var X2 = m2.globals.series[o2][l2]; z2 = v2.getTextRects(m2.config.dataLabels.formatter ? m2.config.dataLabels.formatter(X2, u(u({}, m2), {}, { seriesIndex: o2, dataPointIndex: l2, w: m2 })) : m2.globals.yLabelFormatters[0](X2), parseFloat(L2.style.fontSize)); } var R2 = { x: a2, y: s2, i: o2, j: l2, realIndex: h2, columnGroupIndex: c2, bcx: e2, bcy: i2, barHeight: g2, barWidth: p2, textRects: z2, strokeWidth: y2, dataLabelsX: A2, dataLabelsY: C2, dataLabelsConfig: L2, barDataLabelsConfig: M2, barTotalDataLabelsConfig: P2, offX: I2, offY: T2 }; return S2 = this.barCtx.isHorizontal ? this.calculateBarsDataLabelsPosition(R2) : this.calculateColumnsDataLabelsPosition(R2), w2 = this.drawCalculatedDataLabels({ x: S2.dataLabelsX, y: S2.dataLabelsY, val: this.barCtx.isRangeBar ? [r2, n2] : "100%" === m2.config.chart.stackType ? d2[h2][l2] : m2.globals.series[h2][l2], i: h2, j: l2, barWidth: p2, barHeight: g2, textRects: z2, dataLabelsConfig: L2 }), m2.config.chart.stacked && P2.enabled && (k2 = this.drawTotalDataLabels({ x: S2.totalDataLabelsX, y: S2.totalDataLabelsY, barWidth: p2, barHeight: g2, realIndex: h2, textAnchor: S2.totalDataLabelsAnchor, val: this.getStackedTotalDataLabel({ realIndex: h2, j: l2 }), dataLabelsConfig: L2, barTotalDataLabelsConfig: P2 })), { dataLabelsPos: S2, dataLabels: w2, totalDataLabels: k2 }; } }, { key: "getStackedTotalDataLabel", value: function(t3) { var e2 = t3.realIndex, i2 = t3.j, a2 = this.w, s2 = this.barCtx.stackedSeriesTotals[i2]; return this.totalFormatter && (s2 = this.totalFormatter(s2, u(u({}, a2), {}, { seriesIndex: e2, dataPointIndex: i2, w: a2 }))), s2; } }, { key: "calculateColumnsDataLabelsPosition", value: function(t3) { var e2 = this, i2 = this.w, a2 = t3.i, s2 = t3.j, r2 = t3.realIndex; t3.columnGroupIndex; var n2, o2, l2 = t3.y, h2 = t3.bcx, c2 = t3.barWidth, d2 = t3.barHeight, u2 = t3.textRects, g2 = t3.dataLabelsX, p2 = t3.dataLabelsY, f2 = t3.dataLabelsConfig, x2 = t3.barDataLabelsConfig, b2 = t3.barTotalDataLabelsConfig, m2 = t3.strokeWidth, v2 = t3.offX, y2 = t3.offY, w2 = h2; d2 = Math.abs(d2); var k2 = "vertical" === i2.config.plotOptions.bar.dataLabels.orientation, A2 = this.barCtx.barHelpers.getZeroValueEncounters({ i: a2, j: s2 }).zeroEncounters; h2 -= m2 / 2; var C2 = i2.globals.gridWidth / i2.globals.dataPoints; if (this.barCtx.isVerticalGroupedRangeBar ? g2 += c2 / 2 : (g2 = i2.globals.isXNumeric ? h2 - c2 / 2 + v2 : h2 - C2 + c2 / 2 + v2, !i2.config.chart.stacked && A2 > 0 && i2.config.plotOptions.bar.hideZeroBarsWhenGrouped && (g2 -= c2 * A2)), k2) { g2 = g2 + u2.height / 2 - m2 / 2 - 2; } var S2 = i2.globals.series[a2][s2] < 0, L2 = l2; switch (this.barCtx.isReversed && (L2 = l2 + (S2 ? d2 : -d2)), x2.position) { case "center": p2 = k2 ? S2 ? L2 - d2 / 2 + y2 : L2 + d2 / 2 - y2 : S2 ? L2 - d2 / 2 + u2.height / 2 + y2 : L2 + d2 / 2 + u2.height / 2 - y2; break; case "bottom": p2 = k2 ? S2 ? L2 - d2 + y2 : L2 + d2 - y2 : S2 ? L2 - d2 + u2.height + m2 + y2 : L2 + d2 - u2.height / 2 + m2 - y2; break; case "top": p2 = k2 ? S2 ? L2 + y2 : L2 - y2 : S2 ? L2 - u2.height / 2 - y2 : L2 + u2.height + y2; } var M2 = L2; if (i2.globals.seriesGroups.forEach((function(t4) { var i3; null === (i3 = e2.barCtx[t4.join(",")]) || void 0 === i3 || i3.prevY.forEach((function(t5) { M2 = S2 ? Math.max(t5[s2], M2) : Math.min(t5[s2], M2); })); })), this.barCtx.lastActiveBarSerieIndex === r2 && b2.enabled) { var P2 = new Mi(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({ realIndex: r2, j: s2 }), f2.fontSize); n2 = S2 ? M2 - P2.height / 2 - y2 - b2.offsetY + 18 : M2 + P2.height + y2 + b2.offsetY - 18; var I2 = C2; o2 = w2 + (i2.globals.isXNumeric ? -c2 * i2.globals.barGroups.length / 2 : i2.globals.barGroups.length * c2 / 2 - (i2.globals.barGroups.length - 1) * c2 - I2) + b2.offsetX; } return i2.config.chart.stacked || (p2 < 0 ? p2 = 0 + m2 : p2 + u2.height / 3 > i2.globals.gridHeight && (p2 = i2.globals.gridHeight - m2)), { bcx: h2, bcy: l2, dataLabelsX: g2, dataLabelsY: p2, totalDataLabelsX: o2, totalDataLabelsY: n2, totalDataLabelsAnchor: "middle" }; } }, { key: "calculateBarsDataLabelsPosition", value: function(t3) { var e2 = this, i2 = this.w, a2 = t3.x, s2 = t3.i, r2 = t3.j, n2 = t3.realIndex, o2 = t3.bcy, l2 = t3.barHeight, h2 = t3.barWidth, c2 = t3.textRects, d2 = t3.dataLabelsX, u2 = t3.strokeWidth, g2 = t3.dataLabelsConfig, p2 = t3.barDataLabelsConfig, f2 = t3.barTotalDataLabelsConfig, x2 = t3.offX, b2 = t3.offY, m2 = i2.globals.gridHeight / i2.globals.dataPoints, v2 = this.barCtx.barHelpers.getZeroValueEncounters({ i: s2, j: r2 }).zeroEncounters; h2 = Math.abs(h2); var y2, w2, k2 = o2 - (this.barCtx.isRangeBar ? 0 : m2) + l2 / 2 + c2.height / 2 + b2 - 3; !i2.config.chart.stacked && v2 > 0 && i2.config.plotOptions.bar.hideZeroBarsWhenGrouped && (k2 -= l2 * v2); var A2 = "start", C2 = i2.globals.series[s2][r2] < 0, S2 = a2; switch (this.barCtx.isReversed && (S2 = a2 + (C2 ? -h2 : h2), A2 = C2 ? "start" : "end"), p2.position) { case "center": d2 = C2 ? S2 + h2 / 2 - x2 : Math.max(c2.width / 2, S2 - h2 / 2) + x2; break; case "bottom": d2 = C2 ? S2 + h2 - u2 - x2 : S2 - h2 + u2 + x2; break; case "top": d2 = C2 ? S2 - u2 - x2 : S2 - u2 + x2; } var L2 = S2; if (i2.globals.seriesGroups.forEach((function(t4) { var i3; null === (i3 = e2.barCtx[t4.join(",")]) || void 0 === i3 || i3.prevX.forEach((function(t5) { L2 = C2 ? Math.min(t5[r2], L2) : Math.max(t5[r2], L2); })); })), this.barCtx.lastActiveBarSerieIndex === n2 && f2.enabled) { var M2 = new Mi(this.barCtx.ctx).getTextRects(this.getStackedTotalDataLabel({ realIndex: n2, j: r2 }), g2.fontSize); C2 ? (y2 = L2 - u2 - x2 - f2.offsetX, A2 = "end") : y2 = L2 + x2 + f2.offsetX + (this.barCtx.isReversed ? -(h2 + u2) : u2), w2 = k2 - c2.height / 2 + M2.height / 2 + f2.offsetY + u2, i2.globals.barGroups.length > 1 && (w2 -= i2.globals.barGroups.length / 2 * (l2 / 2)); } return i2.config.chart.stacked || ("start" === g2.textAnchor ? d2 - c2.width < 0 ? d2 = C2 ? c2.width + u2 : u2 : d2 + c2.width > i2.globals.gridWidth && (d2 = C2 ? i2.globals.gridWidth - u2 : i2.globals.gridWidth - c2.width - u2) : "middle" === g2.textAnchor ? d2 - c2.width / 2 < 0 ? d2 = c2.width / 2 + u2 : d2 + c2.width / 2 > i2.globals.gridWidth && (d2 = i2.globals.gridWidth - c2.width / 2 - u2) : "end" === g2.textAnchor && (d2 < 1 ? d2 = c2.width + u2 : d2 + 1 > i2.globals.gridWidth && (d2 = i2.globals.gridWidth - c2.width - u2))), { bcx: a2, bcy: o2, dataLabelsX: d2, dataLabelsY: k2, totalDataLabelsX: y2, totalDataLabelsY: w2, totalDataLabelsAnchor: A2 }; } }, { key: "drawCalculatedDataLabels", value: function(t3) { var e2 = t3.x, i2 = t3.y, a2 = t3.val, s2 = t3.i, r2 = t3.j, n2 = t3.textRects, o2 = t3.barHeight, l2 = t3.barWidth, h2 = t3.dataLabelsConfig, c2 = this.w, d2 = "rotate(0)"; "vertical" === c2.config.plotOptions.bar.dataLabels.orientation && (d2 = "rotate(-90, ".concat(e2, ", ").concat(i2, ")")); var g2 = new qi(this.barCtx.ctx), p2 = new Mi(this.barCtx.ctx), f2 = h2.formatter, x2 = null, b2 = c2.globals.collapsedSeriesIndices.indexOf(s2) > -1; if (h2.enabled && !b2) { x2 = p2.group({ class: "apexcharts-data-labels", transform: d2 }); var m2 = ""; void 0 !== a2 && (m2 = f2(a2, u(u({}, c2), {}, { seriesIndex: s2, dataPointIndex: r2, w: c2 }))), !a2 && c2.config.plotOptions.bar.hideZeroBarsWhenGrouped && (m2 = ""); var v2 = c2.globals.series[s2][r2] < 0, y2 = c2.config.plotOptions.bar.dataLabels.position; if ("vertical" === c2.config.plotOptions.bar.dataLabels.orientation && ("top" === y2 && (h2.textAnchor = v2 ? "end" : "start"), "center" === y2 && (h2.textAnchor = "middle"), "bottom" === y2 && (h2.textAnchor = v2 ? "end" : "start")), this.barCtx.isRangeBar && this.barCtx.barOptions.dataLabels.hideOverflowingLabels) l2 < p2.getTextRects(m2, parseFloat(h2.style.fontSize)).width && (m2 = ""); c2.config.chart.stacked && this.barCtx.barOptions.dataLabels.hideOverflowingLabels && (this.barCtx.isHorizontal ? n2.width / 1.6 > Math.abs(l2) && (m2 = "") : n2.height / 1.6 > Math.abs(o2) && (m2 = "")); var w2 = u({}, h2); this.barCtx.isHorizontal && a2 < 0 && ("start" === h2.textAnchor ? w2.textAnchor = "end" : "end" === h2.textAnchor && (w2.textAnchor = "start")), g2.plotDataLabelsText({ x: e2, y: i2, text: m2, i: s2, j: r2, parent: x2, dataLabelsConfig: w2, alwaysDrawDataLabel: true, offsetCorrection: true }); } return x2; } }, { key: "drawTotalDataLabels", value: function(t3) { var e2 = t3.x, i2 = t3.y, a2 = t3.val, s2 = t3.realIndex, r2 = t3.textAnchor, n2 = t3.barTotalDataLabelsConfig; this.w; var o2, l2 = new Mi(this.barCtx.ctx); return n2.enabled && void 0 !== e2 && void 0 !== i2 && this.barCtx.lastActiveBarSerieIndex === s2 && (o2 = l2.drawText({ x: e2, y: i2, foreColor: n2.style.color, text: a2, textAnchor: r2, fontFamily: n2.style.fontFamily, fontSize: n2.style.fontSize, fontWeight: n2.style.fontWeight })), o2; } }]), t2; })(); var Pa = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.barCtx = e2; } return s(t2, [{ key: "initVariables", value: function(t3) { var e2 = this.w; this.barCtx.series = t3, this.barCtx.totalItems = 0, this.barCtx.seriesLen = 0, this.barCtx.visibleI = -1, this.barCtx.visibleItems = 1; for (var i2 = 0; i2 < t3.length; i2++) if (t3[i2].length > 0 && (this.barCtx.seriesLen = this.barCtx.seriesLen + 1, this.barCtx.totalItems += t3[i2].length), e2.globals.isXNumeric) for (var a2 = 0; a2 < t3[i2].length; a2++) e2.globals.seriesX[i2][a2] > e2.globals.minX && e2.globals.seriesX[i2][a2] < e2.globals.maxX && this.barCtx.visibleItems++; else this.barCtx.visibleItems = e2.globals.dataPoints; this.arrBorderRadius = this.createBorderRadiusArr(e2.globals.series), v.isSafari() && (this.arrBorderRadius = this.arrBorderRadius.map((function(t4) { return t4.map((function(t5) { return "none"; })); }))), 0 === this.barCtx.seriesLen && (this.barCtx.seriesLen = 1), this.barCtx.zeroSerieses = [], e2.globals.comboCharts || this.checkZeroSeries({ series: t3 }); } }, { key: "initialPositions", value: function(t3) { var e2, i2, a2, s2, r2, n2, o2, l2, h2 = this.w, c2 = h2.globals.dataPoints; this.barCtx.isRangeBar && (c2 = h2.globals.labels.length); var d2 = this.barCtx.seriesLen; if (h2.config.plotOptions.bar.rangeBarGroupRows && (d2 = 1), this.barCtx.isHorizontal) r2 = (a2 = h2.globals.gridHeight / c2) / d2, h2.globals.isXNumeric && (r2 = (a2 = h2.globals.gridHeight / this.barCtx.totalItems) / this.barCtx.seriesLen), r2 = r2 * parseInt(this.barCtx.barOptions.barHeight, 10) / 100, -1 === String(this.barCtx.barOptions.barHeight).indexOf("%") && (r2 = parseInt(this.barCtx.barOptions.barHeight, 10)), l2 = this.barCtx.baseLineInvertedY + h2.globals.padHorizontal + (this.barCtx.isReversed ? h2.globals.gridWidth : 0) - (this.barCtx.isReversed ? 2 * this.barCtx.baseLineInvertedY : 0), this.barCtx.isFunnel && (l2 = h2.globals.gridWidth / 2), i2 = (a2 - r2 * this.barCtx.seriesLen) / 2; else { if (s2 = h2.globals.gridWidth / this.barCtx.visibleItems, h2.config.xaxis.convertedCatToNumeric && (s2 = h2.globals.gridWidth / h2.globals.dataPoints), n2 = s2 / d2 * parseInt(this.barCtx.barOptions.columnWidth, 10) / 100, h2.globals.isXNumeric) { var u2 = this.barCtx.xRatio; h2.globals.minXDiff && 0.5 !== h2.globals.minXDiff && h2.globals.minXDiff / u2 > 0 && (s2 = h2.globals.minXDiff / u2), (n2 = s2 / d2 * parseInt(this.barCtx.barOptions.columnWidth, 10) / 100) < 1 && (n2 = 1); } if (-1 === String(this.barCtx.barOptions.columnWidth).indexOf("%") && (n2 = parseInt(this.barCtx.barOptions.columnWidth, 10)), o2 = h2.globals.gridHeight - this.barCtx.baseLineY[this.barCtx.translationsIndex] - (this.barCtx.isReversed ? h2.globals.gridHeight : 0) + (this.barCtx.isReversed ? 2 * this.barCtx.baseLineY[this.barCtx.translationsIndex] : 0), h2.globals.isXNumeric) e2 = this.barCtx.getBarXForNumericXAxis({ x: e2, j: 0, realIndex: t3, barWidth: n2 }).x; else e2 = h2.globals.padHorizontal + v.noExponents(s2 - n2 * this.barCtx.seriesLen) / 2; } return h2.globals.barHeight = r2, h2.globals.barWidth = n2, { x: e2, y: i2, yDivision: a2, xDivision: s2, barHeight: r2, barWidth: n2, zeroH: o2, zeroW: l2 }; } }, { key: "initializeStackedPrevVars", value: function(t3) { t3.w.globals.seriesGroups.forEach((function(e2) { t3[e2] || (t3[e2] = {}), t3[e2].prevY = [], t3[e2].prevX = [], t3[e2].prevYF = [], t3[e2].prevXF = [], t3[e2].prevYVal = [], t3[e2].prevXVal = []; })); } }, { key: "initializeStackedXYVars", value: function(t3) { t3.w.globals.seriesGroups.forEach((function(e2) { t3[e2] || (t3[e2] = {}), t3[e2].xArrj = [], t3[e2].xArrjF = [], t3[e2].xArrjVal = [], t3[e2].yArrj = [], t3[e2].yArrjF = [], t3[e2].yArrjVal = []; })); } }, { key: "getPathFillColor", value: function(t3, e2, i2, a2) { var s2, r2, n2, o2, l2 = this.w, h2 = this.barCtx.ctx.fill, c2 = null, d2 = this.barCtx.barOptions.distributed ? i2 : e2, u2 = false; this.barCtx.barOptions.colors.ranges.length > 0 && this.barCtx.barOptions.colors.ranges.map((function(a3) { t3[e2][i2] >= a3.from && t3[e2][i2] <= a3.to && (c2 = a3.color, u2 = true); })); return { color: h2.fillPath({ seriesNumber: this.barCtx.barOptions.distributed ? d2 : a2, dataPointIndex: i2, color: c2, value: t3[e2][i2], fillConfig: null === (s2 = l2.config.series[e2].data[i2]) || void 0 === s2 ? void 0 : s2.fill, fillType: null !== (r2 = l2.config.series[e2].data[i2]) && void 0 !== r2 && null !== (n2 = r2.fill) && void 0 !== n2 && n2.type ? null === (o2 = l2.config.series[e2].data[i2]) || void 0 === o2 ? void 0 : o2.fill.type : Array.isArray(l2.config.fill.type) ? l2.config.fill.type[a2] : l2.config.fill.type }), useRangeColor: u2 }; } }, { key: "getStrokeWidth", value: function(t3, e2, i2) { var a2 = 0, s2 = this.w; return void 0 === this.barCtx.series[t3][e2] || null === this.barCtx.series[t3][e2] || "bar" === s2.config.chart.type && !this.barCtx.series[t3][e2] ? this.barCtx.isNullValue = true : this.barCtx.isNullValue = false, s2.config.stroke.show && (this.barCtx.isNullValue || (a2 = Array.isArray(this.barCtx.strokeWidth) ? this.barCtx.strokeWidth[i2] : this.barCtx.strokeWidth)), a2; } }, { key: "createBorderRadiusArr", value: function(t3) { var e2, i2 = this.w, a2 = !this.w.config.chart.stacked || i2.config.plotOptions.bar.borderRadius <= 0, s2 = t3.length, n2 = 0 | (null === (e2 = t3[0]) || void 0 === e2 ? void 0 : e2.length), o2 = Array.from({ length: s2 }, (function() { return Array(n2).fill(a2 ? "top" : "none"); })); if (a2) return o2; for (var l2 = 0; l2 < n2; l2++) { for (var h2 = [], c2 = [], d2 = 0, u2 = 0; u2 < s2; u2++) { var g2 = t3[u2][l2]; g2 > 0 ? (h2.push(u2), d2++) : g2 < 0 && (c2.push(u2), d2++); } if (h2.length > 0 && 0 === c2.length) if (1 === h2.length) o2[h2[0]][l2] = "both"; else { var p2, f2 = h2[0], x2 = h2[h2.length - 1], b2 = r(h2); try { for (b2.s(); !(p2 = b2.n()).done; ) { var m2 = p2.value; o2[m2][l2] = m2 === f2 ? "bottom" : m2 === x2 ? "top" : "none"; } } catch (t4) { b2.e(t4); } finally { b2.f(); } } else if (c2.length > 0 && 0 === h2.length) if (1 === c2.length) o2[c2[0]][l2] = "both"; else { var v2, y2 = Math.max.apply(Math, c2), w2 = Math.min.apply(Math, c2), k2 = r(c2); try { for (k2.s(); !(v2 = k2.n()).done; ) { var A2 = v2.value; o2[A2][l2] = A2 === y2 ? "bottom" : A2 === w2 ? "top" : "none"; } } catch (t4) { k2.e(t4); } finally { k2.f(); } } else if (h2.length > 0 && c2.length > 0) { var C2, S2 = h2[h2.length - 1], L2 = r(h2); try { for (L2.s(); !(C2 = L2.n()).done; ) { var M2 = C2.value; o2[M2][l2] = M2 === S2 ? "top" : "none"; } } catch (t4) { L2.e(t4); } finally { L2.f(); } var P2, I2 = Math.max.apply(Math, c2), T2 = r(c2); try { for (T2.s(); !(P2 = T2.n()).done; ) { var z2 = P2.value; o2[z2][l2] = z2 === I2 ? "bottom" : "none"; } } catch (t4) { T2.e(t4); } finally { T2.f(); } } else if (1 === d2) { o2[h2[0] || c2[0]][l2] = "both"; } } return o2; } }, { key: "barBackground", value: function(t3) { var e2 = t3.j, i2 = t3.i, a2 = t3.x1, s2 = t3.x2, r2 = t3.y1, n2 = t3.y2, o2 = t3.elSeries, l2 = this.w, h2 = new Mi(this.barCtx.ctx), c2 = new $i(this.barCtx.ctx).getActiveConfigSeriesIndex(); if (this.barCtx.barOptions.colors.backgroundBarColors.length > 0 && c2 === i2) { e2 >= this.barCtx.barOptions.colors.backgroundBarColors.length && (e2 %= this.barCtx.barOptions.colors.backgroundBarColors.length); var d2 = this.barCtx.barOptions.colors.backgroundBarColors[e2], u2 = h2.drawRect(void 0 !== a2 ? a2 : 0, void 0 !== r2 ? r2 : 0, void 0 !== s2 ? s2 : l2.globals.gridWidth, void 0 !== n2 ? n2 : l2.globals.gridHeight, this.barCtx.barOptions.colors.backgroundBarRadius, d2, this.barCtx.barOptions.colors.backgroundBarOpacity); o2.add(u2), u2.node.classList.add("apexcharts-backgroundBar"); } } }, { key: "getColumnPaths", value: function(t3) { var e2, i2 = t3.barWidth, a2 = t3.barXPosition, s2 = t3.y1, r2 = t3.y2, n2 = t3.strokeWidth, o2 = t3.isReversed, l2 = t3.series, h2 = t3.seriesGroup, c2 = t3.realIndex, d2 = t3.i, u2 = t3.j, g2 = t3.w, p2 = new Mi(this.barCtx.ctx); (n2 = Array.isArray(n2) ? n2[c2] : n2) || (n2 = 0); var f2 = i2, x2 = a2; null !== (e2 = g2.config.series[c2].data[u2]) && void 0 !== e2 && e2.columnWidthOffset && (x2 = a2 - g2.config.series[c2].data[u2].columnWidthOffset / 2, f2 = i2 + g2.config.series[c2].data[u2].columnWidthOffset); var b2 = n2 / 2, m2 = x2 + b2, v2 = x2 + f2 - b2, y2 = (l2[d2][u2] >= 0 ? 1 : -1) * (o2 ? -1 : 1); s2 += 1e-3 - b2 * y2, r2 += 1e-3 + b2 * y2; var w2 = p2.move(m2, s2), k2 = p2.move(m2, s2), A2 = p2.line(v2, s2); if (g2.globals.previousPaths.length > 0 && (k2 = this.barCtx.getPreviousPath(c2, u2, false)), w2 = w2 + p2.line(m2, r2) + p2.line(v2, r2) + A2 + ("around" === g2.config.plotOptions.bar.borderRadiusApplication || "both" === this.arrBorderRadius[c2][u2] ? " Z" : " z"), k2 = k2 + p2.line(m2, s2) + A2 + A2 + A2 + A2 + A2 + p2.line(m2, s2) + ("around" === g2.config.plotOptions.bar.borderRadiusApplication || "both" === this.arrBorderRadius[c2][u2] ? " Z" : " z"), "none" !== this.arrBorderRadius[c2][u2] && (w2 = p2.roundPathCorners(w2, g2.config.plotOptions.bar.borderRadius)), g2.config.chart.stacked) { var C2 = this.barCtx; (C2 = this.barCtx[h2]).yArrj.push(r2 - b2 * y2), C2.yArrjF.push(Math.abs(s2 - r2 + n2 * y2)), C2.yArrjVal.push(this.barCtx.series[d2][u2]); } return { pathTo: w2, pathFrom: k2 }; } }, { key: "getBarpaths", value: function(t3) { var e2, i2 = t3.barYPosition, a2 = t3.barHeight, s2 = t3.x1, r2 = t3.x2, n2 = t3.strokeWidth, o2 = t3.isReversed, l2 = t3.series, h2 = t3.seriesGroup, c2 = t3.realIndex, d2 = t3.i, u2 = t3.j, g2 = t3.w, p2 = new Mi(this.barCtx.ctx); (n2 = Array.isArray(n2) ? n2[c2] : n2) || (n2 = 0); var f2 = i2, x2 = a2; null !== (e2 = g2.config.series[c2].data[u2]) && void 0 !== e2 && e2.barHeightOffset && (f2 = i2 - g2.config.series[c2].data[u2].barHeightOffset / 2, x2 = a2 + g2.config.series[c2].data[u2].barHeightOffset); var b2 = n2 / 2, m2 = f2 + b2, v2 = f2 + x2 - b2, y2 = (l2[d2][u2] >= 0 ? 1 : -1) * (o2 ? -1 : 1); s2 += 1e-3 + b2 * y2, r2 += 1e-3 - b2 * y2; var w2 = p2.move(s2, m2), k2 = p2.move(s2, m2); g2.globals.previousPaths.length > 0 && (k2 = this.barCtx.getPreviousPath(c2, u2, false)); var A2 = p2.line(s2, v2); if (w2 = w2 + p2.line(r2, m2) + p2.line(r2, v2) + A2 + ("around" === g2.config.plotOptions.bar.borderRadiusApplication || "both" === this.arrBorderRadius[c2][u2] ? " Z" : " z"), k2 = k2 + p2.line(s2, m2) + A2 + A2 + A2 + A2 + A2 + p2.line(s2, m2) + ("around" === g2.config.plotOptions.bar.borderRadiusApplication || "both" === this.arrBorderRadius[c2][u2] ? " Z" : " z"), "none" !== this.arrBorderRadius[c2][u2] && (w2 = p2.roundPathCorners(w2, g2.config.plotOptions.bar.borderRadius)), g2.config.chart.stacked) { var C2 = this.barCtx; (C2 = this.barCtx[h2]).xArrj.push(r2 + b2 * y2), C2.xArrjF.push(Math.abs(s2 - r2 - n2 * y2)), C2.xArrjVal.push(this.barCtx.series[d2][u2]); } return { pathTo: w2, pathFrom: k2 }; } }, { key: "checkZeroSeries", value: function(t3) { for (var e2 = t3.series, i2 = this.w, a2 = 0; a2 < e2.length; a2++) { for (var s2 = 0, r2 = 0; r2 < e2[i2.globals.maxValsInArrayIndex].length; r2++) s2 += e2[a2][r2]; 0 === s2 && this.barCtx.zeroSerieses.push(a2); } } }, { key: "getXForValue", value: function(t3, e2) { var i2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2] ? e2 : null; return null != t3 && (i2 = e2 + t3 / this.barCtx.invertedYRatio - 2 * (this.barCtx.isReversed ? t3 / this.barCtx.invertedYRatio : 0)), i2; } }, { key: "getYForValue", value: function(t3, e2, i2) { var a2 = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3] ? e2 : null; return null != t3 && (a2 = e2 - t3 / this.barCtx.yRatio[i2] + 2 * (this.barCtx.isReversed ? t3 / this.barCtx.yRatio[i2] : 0)), a2; } }, { key: "getGoalValues", value: function(t3, e2, i2, a2, s2, r2) { var n2 = this, l2 = this.w, h2 = [], c2 = function(a3, s3) { var l3; h2.push((o(l3 = {}, t3, "x" === t3 ? n2.getXForValue(a3, e2, false) : n2.getYForValue(a3, i2, r2, false)), o(l3, "attrs", s3), l3)); }; if (l2.globals.seriesGoals[a2] && l2.globals.seriesGoals[a2][s2] && Array.isArray(l2.globals.seriesGoals[a2][s2]) && l2.globals.seriesGoals[a2][s2].forEach((function(t4) { c2(t4.value, t4); })), this.barCtx.barOptions.isDumbbell && l2.globals.seriesRange.length) { var d2 = this.barCtx.barOptions.dumbbellColors ? this.barCtx.barOptions.dumbbellColors : l2.globals.colors, g2 = { strokeHeight: "x" === t3 ? 0 : l2.globals.markers.size[a2], strokeWidth: "x" === t3 ? l2.globals.markers.size[a2] : 0, strokeDashArray: 0, strokeLineCap: "round", strokeColor: Array.isArray(d2[a2]) ? d2[a2][0] : d2[a2] }; c2(l2.globals.seriesRangeStart[a2][s2], g2), c2(l2.globals.seriesRangeEnd[a2][s2], u(u({}, g2), {}, { strokeColor: Array.isArray(d2[a2]) ? d2[a2][1] : d2[a2] })); } return h2; } }, { key: "drawGoalLine", value: function(t3) { var e2 = t3.barXPosition, i2 = t3.barYPosition, a2 = t3.goalX, s2 = t3.goalY, r2 = t3.barWidth, n2 = t3.barHeight, o2 = new Mi(this.barCtx.ctx), l2 = o2.group({ className: "apexcharts-bar-goals-groups" }); l2.node.classList.add("apexcharts-element-hidden"), this.barCtx.w.globals.delayedElements.push({ el: l2.node }), l2.attr("clip-path", "url(#gridRectMarkerMask".concat(this.barCtx.w.globals.cuid, ")")); var h2 = null; return this.barCtx.isHorizontal ? Array.isArray(a2) && a2.forEach((function(t4) { if (t4.x >= -1 && t4.x <= o2.w.globals.gridWidth + 1) { var e3 = void 0 !== t4.attrs.strokeHeight ? t4.attrs.strokeHeight : n2 / 2, a3 = i2 + e3 + n2 / 2; h2 = o2.drawLine(t4.x, a3 - 2 * e3, t4.x, a3, t4.attrs.strokeColor ? t4.attrs.strokeColor : void 0, t4.attrs.strokeDashArray, t4.attrs.strokeWidth ? t4.attrs.strokeWidth : 2, t4.attrs.strokeLineCap), l2.add(h2); } })) : Array.isArray(s2) && s2.forEach((function(t4) { if (t4.y >= -1 && t4.y <= o2.w.globals.gridHeight + 1) { var i3 = void 0 !== t4.attrs.strokeWidth ? t4.attrs.strokeWidth : r2 / 2, a3 = e2 + i3 + r2 / 2; h2 = o2.drawLine(a3 - 2 * i3, t4.y, a3, t4.y, t4.attrs.strokeColor ? t4.attrs.strokeColor : void 0, t4.attrs.strokeDashArray, t4.attrs.strokeHeight ? t4.attrs.strokeHeight : 2, t4.attrs.strokeLineCap), l2.add(h2); } })), l2; } }, { key: "drawBarShadow", value: function(t3) { var e2 = t3.prevPaths, i2 = t3.currPaths, a2 = t3.color, s2 = this.w, r2 = e2.x, n2 = e2.x1, o2 = e2.barYPosition, l2 = i2.x, h2 = i2.x1, c2 = i2.barYPosition, d2 = o2 + i2.barHeight, u2 = new Mi(this.barCtx.ctx), g2 = new v(), p2 = u2.move(n2, d2) + u2.line(r2, d2) + u2.line(l2, c2) + u2.line(h2, c2) + u2.line(n2, d2) + ("around" === s2.config.plotOptions.bar.borderRadiusApplication || "both" === this.arrBorderRadius[realIndex][j] ? " Z" : " z"); return u2.drawPath({ d: p2, fill: g2.shadeColor(0.5, v.rgb2hex(a2)), stroke: "none", strokeWidth: 0, fillOpacity: 1, classes: "apexcharts-bar-shadow apexcharts-decoration-element" }); } }, { key: "getZeroValueEncounters", value: function(t3) { var e2, i2 = t3.i, a2 = t3.j, s2 = this.w, r2 = 0, n2 = 0; return (s2.config.plotOptions.bar.horizontal ? s2.globals.series.map((function(t4, e3) { return e3; })) : (null === (e2 = s2.globals.columnSeries) || void 0 === e2 ? void 0 : e2.i.map((function(t4) { return t4; }))) || []).forEach((function(t4) { var e3 = s2.globals.seriesPercent[t4][a2]; e3 && r2++, t4 < i2 && 0 === e3 && n2++; })), { nonZeroColumns: r2, zeroEncounters: n2 }; } }, { key: "getGroupIndex", value: function(t3) { var e2 = this.w, i2 = e2.globals.seriesGroups.findIndex((function(i3) { return i3.indexOf(e2.globals.seriesNames[t3]) > -1; })), a2 = this.barCtx.columnGroupIndices, s2 = a2.indexOf(i2); return s2 < 0 && (a2.push(i2), s2 = a2.length - 1), { groupIndex: i2, columnGroupIndex: s2 }; } }]), t2; })(); var Ia = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.w = e2.w; var s2 = this.w; this.barOptions = s2.config.plotOptions.bar, this.isHorizontal = this.barOptions.horizontal, this.strokeWidth = s2.config.stroke.width, this.isNullValue = false, this.isRangeBar = s2.globals.seriesRange.length && this.isHorizontal, this.isVerticalGroupedRangeBar = !s2.globals.isBarHorizontal && s2.globals.seriesRange.length && s2.config.plotOptions.bar.rangeBarGroupRows, this.isFunnel = this.barOptions.isFunnel, this.xyRatios = a2, null !== this.xyRatios && (this.xRatio = a2.xRatio, this.yRatio = a2.yRatio, this.invertedXRatio = a2.invertedXRatio, this.invertedYRatio = a2.invertedYRatio, this.baseLineY = a2.baseLineY, this.baseLineInvertedY = a2.baseLineInvertedY), this.yaxisIndex = 0, this.translationsIndex = 0, this.seriesLen = 0, this.pathArr = []; var r2 = new $i(this.ctx); this.lastActiveBarSerieIndex = r2.getActiveConfigSeriesIndex("desc", ["bar", "column"]), this.columnGroupIndices = []; var n2 = r2.getBarSeriesIndices(), o2 = new Pi(this.ctx); this.stackedSeriesTotals = o2.getStackedSeriesTotals(this.w.config.series.map((function(t3, e3) { return -1 === n2.indexOf(e3) ? e3 : -1; })).filter((function(t3) { return -1 !== t3; }))), this.barHelpers = new Pa(this); } return s(t2, [{ key: "draw", value: function(t3, e2) { var i2 = this.w, a2 = new Mi(this.ctx), s2 = new Pi(this.ctx, i2); t3 = s2.getLogSeries(t3), this.series = t3, this.yRatio = s2.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t3); var r2 = a2.group({ class: "apexcharts-bar-series apexcharts-plot-series" }); i2.config.dataLabels.enabled && this.totalItems > this.barOptions.dataLabels.maxItems && console.warn("WARNING: DataLabels are enabled but there are too many to display. This may cause performance issue when rendering - ApexCharts"); for (var n2 = 0, o2 = 0; n2 < t3.length; n2++, o2++) { var l2, h2, c2, d2, g2 = void 0, p2 = void 0, f2 = [], x2 = [], b2 = i2.globals.comboCharts ? e2[n2] : n2, m2 = this.barHelpers.getGroupIndex(b2).columnGroupIndex, y2 = a2.group({ class: "apexcharts-series", rel: n2 + 1, seriesName: v.escapeString(i2.globals.seriesNames[b2]), "data:realIndex": b2 }); this.ctx.series.addCollapsedClassToSeries(y2, b2), t3[n2].length > 0 && (this.visibleI = this.visibleI + 1); var w2 = 0, k2 = 0; this.yRatio.length > 1 && (this.yaxisIndex = i2.globals.seriesYAxisReverseMap[b2], this.translationsIndex = b2); var A2 = this.translationsIndex; this.isReversed = i2.config.yaxis[this.yaxisIndex] && i2.config.yaxis[this.yaxisIndex].reversed; var C2 = this.barHelpers.initialPositions(b2); p2 = C2.y, w2 = C2.barHeight, h2 = C2.yDivision, d2 = C2.zeroW, g2 = C2.x, k2 = C2.barWidth, l2 = C2.xDivision, c2 = C2.zeroH, this.isHorizontal || x2.push(g2 + k2 / 2); var S2 = a2.group({ class: "apexcharts-datalabels", "data:realIndex": b2 }); i2.globals.delayedElements.push({ el: S2.node }), S2.node.classList.add("apexcharts-element-hidden"); var L2 = a2.group({ class: "apexcharts-bar-goals-markers" }), M2 = a2.group({ class: "apexcharts-bar-shadows" }); i2.globals.delayedElements.push({ el: M2.node }), M2.node.classList.add("apexcharts-element-hidden"); for (var P2 = 0; P2 < t3[n2].length; P2++) { var I2 = this.barHelpers.getStrokeWidth(n2, P2, b2), T2 = null, z2 = { indexes: { i: n2, j: P2, realIndex: b2, translationsIndex: A2, bc: o2 }, x: g2, y: p2, strokeWidth: I2, elSeries: y2 }; this.isHorizontal ? (T2 = this.drawBarPaths(u(u({}, z2), {}, { barHeight: w2, zeroW: d2, yDivision: h2 })), k2 = this.series[n2][P2] / this.invertedYRatio) : (T2 = this.drawColumnPaths(u(u({}, z2), {}, { xDivision: l2, barWidth: k2, zeroH: c2 })), w2 = this.series[n2][P2] / this.yRatio[A2]); var X2 = this.barHelpers.getPathFillColor(t3, n2, P2, b2); if (this.isFunnel && this.barOptions.isFunnel3d && this.pathArr.length && P2 > 0) { var R2, E2 = this.barHelpers.drawBarShadow({ color: "string" == typeof X2.color && -1 === (null === (R2 = X2.color) || void 0 === R2 ? void 0 : R2.indexOf("url")) ? X2.color : v.hexToRgba(i2.globals.colors[n2]), prevPaths: this.pathArr[this.pathArr.length - 1], currPaths: T2 }); if (M2.add(E2), i2.config.chart.dropShadow.enabled) new Li(this.ctx).dropShadow(E2, i2.config.chart.dropShadow, b2); } this.pathArr.push(T2); var Y2 = this.barHelpers.drawGoalLine({ barXPosition: T2.barXPosition, barYPosition: T2.barYPosition, goalX: T2.goalX, goalY: T2.goalY, barHeight: w2, barWidth: k2 }); Y2 && L2.add(Y2), p2 = T2.y, g2 = T2.x, P2 > 0 && x2.push(g2 + k2 / 2), f2.push(p2), this.renderSeries(u(u({ realIndex: b2, pathFill: X2.color }, X2.useRangeColor ? { lineFill: X2.color } : {}), {}, { j: P2, i: n2, columnGroupIndex: m2, pathFrom: T2.pathFrom, pathTo: T2.pathTo, strokeWidth: I2, elSeries: y2, x: g2, y: p2, series: t3, barHeight: Math.abs(T2.barHeight ? T2.barHeight : w2), barWidth: Math.abs(T2.barWidth ? T2.barWidth : k2), elDataLabelsWrap: S2, elGoalsMarkers: L2, elBarShadows: M2, visibleSeries: this.visibleI, type: "bar" })); } i2.globals.seriesXvalues[b2] = x2, i2.globals.seriesYvalues[b2] = f2, r2.add(y2); } return r2; } }, { key: "renderSeries", value: function(t3) { var e2 = t3.realIndex, i2 = t3.pathFill, a2 = t3.lineFill, s2 = t3.j, r2 = t3.i, n2 = t3.columnGroupIndex, o2 = t3.pathFrom, l2 = t3.pathTo, h2 = t3.strokeWidth, c2 = t3.elSeries, d2 = t3.x, u2 = t3.y, g2 = t3.y1, p2 = t3.y2, f2 = t3.series, x2 = t3.barHeight, b2 = t3.barWidth, m2 = t3.barXPosition, v2 = t3.barYPosition, y2 = t3.elDataLabelsWrap, w2 = t3.elGoalsMarkers, k2 = t3.elBarShadows, A2 = t3.visibleSeries, C2 = t3.type, S2 = t3.classes, L2 = this.w, M2 = new Mi(this.ctx), P2 = false; if (!a2) { var I2 = "function" == typeof L2.globals.stroke.colors[e2] ? (function(t4) { var e3, i3 = L2.config.stroke.colors; return Array.isArray(i3) && i3.length > 0 && ((e3 = i3[t4]) || (e3 = ""), "function" == typeof e3) ? e3({ value: L2.globals.series[t4][s2], dataPointIndex: s2, w: L2 }) : e3; })(e2) : L2.globals.stroke.colors[e2]; a2 = this.barOptions.distributed ? L2.globals.stroke.colors[s2] : I2; } var T2 = new Ma(this).handleBarDataLabels({ x: d2, y: u2, y1: g2, y2: p2, i: r2, j: s2, series: f2, realIndex: e2, columnGroupIndex: n2, barHeight: x2, barWidth: b2, barXPosition: m2, barYPosition: v2, visibleSeries: A2 }); L2.globals.isBarHorizontal || (T2.dataLabelsPos.dataLabelsX + Math.max(b2, L2.globals.barPadForNumericAxis) < 0 || T2.dataLabelsPos.dataLabelsX - Math.max(b2, L2.globals.barPadForNumericAxis) > L2.globals.gridWidth) && (P2 = true), L2.config.series[r2].data[s2] && L2.config.series[r2].data[s2].strokeColor && (a2 = L2.config.series[r2].data[s2].strokeColor), this.isNullValue && (i2 = "none"); var z2 = s2 / L2.config.chart.animations.animateGradually.delay * (L2.config.chart.animations.speed / L2.globals.dataPoints) / 2.4; if (!P2) { var X2 = M2.renderPaths({ i: r2, j: s2, realIndex: e2, pathFrom: o2, pathTo: l2, stroke: a2, strokeWidth: h2, strokeLineCap: L2.config.stroke.lineCap, fill: i2, animationDelay: z2, initialSpeed: L2.config.chart.animations.speed, dataChangeSpeed: L2.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-".concat(C2, "-area ").concat(S2), chartType: C2 }); X2.attr("clip-path", "url(#gridRectBarMask".concat(L2.globals.cuid, ")")); var R2 = L2.config.forecastDataPoints; R2.count > 0 && s2 >= L2.globals.dataPoints - R2.count && (X2.node.setAttribute("stroke-dasharray", R2.dashArray), X2.node.setAttribute("stroke-width", R2.strokeWidth), X2.node.setAttribute("fill-opacity", R2.fillOpacity)), void 0 !== g2 && void 0 !== p2 && (X2.attr("data-range-y1", g2), X2.attr("data-range-y2", p2)), new Li(this.ctx).setSelectionFilter(X2, e2, s2), c2.add(X2), X2.attr({ cy: T2.dataLabelsPos.bcy, cx: T2.dataLabelsPos.bcx, j: s2, val: L2.globals.series[r2][s2], barHeight: x2, barWidth: b2 }), null !== T2.dataLabels && y2.add(T2.dataLabels), T2.totalDataLabels && y2.add(T2.totalDataLabels), c2.add(y2), w2 && c2.add(w2), k2 && c2.add(k2); } return c2; } }, { key: "drawBarPaths", value: function(t3) { var e2, i2 = t3.indexes, a2 = t3.barHeight, s2 = t3.strokeWidth, r2 = t3.zeroW, n2 = t3.x, o2 = t3.y, l2 = t3.yDivision, h2 = t3.elSeries, c2 = this.w, d2 = i2.i, u2 = i2.j; if (c2.globals.isXNumeric) e2 = (o2 = (c2.globals.seriesX[d2][u2] - c2.globals.minX) / this.invertedXRatio - a2) + a2 * this.visibleI; else if (c2.config.plotOptions.bar.hideZeroBarsWhenGrouped) { var g2 = this.barHelpers.getZeroValueEncounters({ i: d2, j: u2 }), p2 = g2.nonZeroColumns, f2 = g2.zeroEncounters; p2 > 0 && (a2 = this.seriesLen * a2 / p2), e2 = o2 + a2 * this.visibleI, e2 -= a2 * f2; } else e2 = o2 + a2 * this.visibleI; this.isFunnel && (r2 -= (this.barHelpers.getXForValue(this.series[d2][u2], r2) - r2) / 2), n2 = this.barHelpers.getXForValue(this.series[d2][u2], r2); var x2 = this.barHelpers.getBarpaths({ barYPosition: e2, barHeight: a2, x1: r2, x2: n2, strokeWidth: s2, isReversed: this.isReversed, series: this.series, realIndex: i2.realIndex, i: d2, j: u2, w: c2 }); return c2.globals.isXNumeric || (o2 += l2), this.barHelpers.barBackground({ j: u2, i: d2, y1: e2 - a2 * this.visibleI, y2: a2 * this.seriesLen, elSeries: h2 }), { pathTo: x2.pathTo, pathFrom: x2.pathFrom, x1: r2, x: n2, y: o2, goalX: this.barHelpers.getGoalValues("x", r2, null, d2, u2), barYPosition: e2, barHeight: a2 }; } }, { key: "drawColumnPaths", value: function(t3) { var e2, i2 = t3.indexes, a2 = t3.x, s2 = t3.y, r2 = t3.xDivision, n2 = t3.barWidth, o2 = t3.zeroH, l2 = t3.strokeWidth, h2 = t3.elSeries, c2 = this.w, d2 = i2.realIndex, u2 = i2.translationsIndex, g2 = i2.i, p2 = i2.j, f2 = i2.bc; if (c2.globals.isXNumeric) { var x2 = this.getBarXForNumericXAxis({ x: a2, j: p2, realIndex: d2, barWidth: n2 }); a2 = x2.x, e2 = x2.barXPosition; } else if (c2.config.plotOptions.bar.hideZeroBarsWhenGrouped) { var b2 = this.barHelpers.getZeroValueEncounters({ i: g2, j: p2 }), m2 = b2.nonZeroColumns, v2 = b2.zeroEncounters; m2 > 0 && (n2 = this.seriesLen * n2 / m2), e2 = a2 + n2 * this.visibleI, e2 -= n2 * v2; } else e2 = a2 + n2 * this.visibleI; s2 = this.barHelpers.getYForValue(this.series[g2][p2], o2, u2); var y2 = this.barHelpers.getColumnPaths({ barXPosition: e2, barWidth: n2, y1: o2, y2: s2, strokeWidth: l2, isReversed: this.isReversed, series: this.series, realIndex: d2, i: g2, j: p2, w: c2 }); return c2.globals.isXNumeric || (a2 += r2), this.barHelpers.barBackground({ bc: f2, j: p2, i: g2, x1: e2 - l2 / 2 - n2 * this.visibleI, x2: n2 * this.seriesLen + l2 / 2, elSeries: h2 }), { pathTo: y2.pathTo, pathFrom: y2.pathFrom, x: a2, y: s2, goalY: this.barHelpers.getGoalValues("y", null, o2, g2, p2, u2), barXPosition: e2, barWidth: n2 }; } }, { key: "getBarXForNumericXAxis", value: function(t3) { var e2 = t3.x, i2 = t3.barWidth, a2 = t3.realIndex, s2 = t3.j, r2 = this.w, n2 = a2; return r2.globals.seriesX[a2].length || (n2 = r2.globals.maxValsInArrayIndex), v.isNumber(r2.globals.seriesX[n2][s2]) && (e2 = (r2.globals.seriesX[n2][s2] - r2.globals.minX) / this.xRatio - i2 * this.seriesLen / 2), { barXPosition: e2 + i2 * this.visibleI, x: e2 }; } }, { key: "getPreviousPath", value: function(t3, e2) { for (var i2 = this.w, a2 = "M 0 0", s2 = 0; s2 < i2.globals.previousPaths.length; s2++) { var r2 = i2.globals.previousPaths[s2]; r2.paths && r2.paths.length > 0 && parseInt(r2.realIndex, 10) === parseInt(t3, 10) && void 0 !== i2.globals.previousPaths[s2].paths[e2] && (a2 = i2.globals.previousPaths[s2].paths[e2].d); } return a2; } }]), t2; })(); var Ta = (function(t2) { h(a2, Ia); var e2 = n(a2); function a2() { return i(this, a2), e2.apply(this, arguments); } return s(a2, [{ key: "draw", value: function(t3, e3) { var i2 = this, a3 = this.w; this.graphics = new Mi(this.ctx), this.bar = new Ia(this.ctx, this.xyRatios); var s2 = new Pi(this.ctx, a3); t3 = s2.getLogSeries(t3), this.yRatio = s2.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t3), "100%" === a3.config.chart.stackType && (t3 = a3.globals.comboCharts ? e3.map((function(t4) { return a3.globals.seriesPercent[t4]; })) : a3.globals.seriesPercent.slice()), this.series = t3, this.barHelpers.initializeStackedPrevVars(this); for (var r2 = this.graphics.group({ class: "apexcharts-bar-series apexcharts-plot-series" }), n2 = 0, o2 = 0, l2 = function(s3, l3) { var h3 = void 0, c3 = void 0, d2 = void 0, g2 = void 0, p2 = a3.globals.comboCharts ? e3[s3] : s3, f2 = i2.barHelpers.getGroupIndex(p2), x2 = f2.groupIndex, b2 = f2.columnGroupIndex; i2.groupCtx = i2[a3.globals.seriesGroups[x2]]; var m2 = [], y2 = [], w2 = 0; i2.yRatio.length > 1 && (i2.yaxisIndex = a3.globals.seriesYAxisReverseMap[p2][0], w2 = p2), i2.isReversed = a3.config.yaxis[i2.yaxisIndex] && a3.config.yaxis[i2.yaxisIndex].reversed; var k2 = i2.graphics.group({ class: "apexcharts-series", seriesName: v.escapeString(a3.globals.seriesNames[p2]), rel: s3 + 1, "data:realIndex": p2 }); i2.ctx.series.addCollapsedClassToSeries(k2, p2); var A2 = i2.graphics.group({ class: "apexcharts-datalabels", "data:realIndex": p2 }), C2 = i2.graphics.group({ class: "apexcharts-bar-goals-markers" }), S2 = 0, L2 = 0, M2 = i2.initialPositions(n2, o2, h3, c3, d2, g2, w2); o2 = M2.y, S2 = M2.barHeight, c3 = M2.yDivision, g2 = M2.zeroW, n2 = M2.x, L2 = M2.barWidth, h3 = M2.xDivision, d2 = M2.zeroH, a3.globals.barHeight = S2, a3.globals.barWidth = L2, i2.barHelpers.initializeStackedXYVars(i2), 1 === i2.groupCtx.prevY.length && i2.groupCtx.prevY[0].every((function(t4) { return isNaN(t4); })) && (i2.groupCtx.prevY[0] = i2.groupCtx.prevY[0].map((function() { return d2; })), i2.groupCtx.prevYF[0] = i2.groupCtx.prevYF[0].map((function() { return 0; }))); for (var P2 = 0; P2 < a3.globals.dataPoints; P2++) { var I2 = i2.barHelpers.getStrokeWidth(s3, P2, p2), T2 = { indexes: { i: s3, j: P2, realIndex: p2, translationsIndex: w2, bc: l3 }, strokeWidth: I2, x: n2, y: o2, elSeries: k2, columnGroupIndex: b2, seriesGroup: a3.globals.seriesGroups[x2] }, z2 = null; i2.isHorizontal ? (z2 = i2.drawStackedBarPaths(u(u({}, T2), {}, { zeroW: g2, barHeight: S2, yDivision: c3 })), L2 = i2.series[s3][P2] / i2.invertedYRatio) : (z2 = i2.drawStackedColumnPaths(u(u({}, T2), {}, { xDivision: h3, barWidth: L2, zeroH: d2 })), S2 = i2.series[s3][P2] / i2.yRatio[w2]); var X2 = i2.barHelpers.drawGoalLine({ barXPosition: z2.barXPosition, barYPosition: z2.barYPosition, goalX: z2.goalX, goalY: z2.goalY, barHeight: S2, barWidth: L2 }); X2 && C2.add(X2), o2 = z2.y, n2 = z2.x, m2.push(n2), y2.push(o2); var R2 = i2.barHelpers.getPathFillColor(t3, s3, P2, p2), E2 = "", Y2 = a3.globals.isBarHorizontal ? "apexcharts-flip-x" : "apexcharts-flip-y"; ("bottom" === i2.barHelpers.arrBorderRadius[p2][P2] && a3.globals.series[p2][P2] > 0 || "top" === i2.barHelpers.arrBorderRadius[p2][P2] && a3.globals.series[p2][P2] < 0) && (E2 = Y2), k2 = i2.renderSeries(u(u({ realIndex: p2, pathFill: R2.color }, R2.useRangeColor ? { lineFill: R2.color } : {}), {}, { j: P2, i: s3, columnGroupIndex: b2, pathFrom: z2.pathFrom, pathTo: z2.pathTo, strokeWidth: I2, elSeries: k2, x: n2, y: o2, series: t3, barHeight: S2, barWidth: L2, elDataLabelsWrap: A2, elGoalsMarkers: C2, type: "bar", visibleSeries: b2, classes: E2 })); } a3.globals.seriesXvalues[p2] = m2, a3.globals.seriesYvalues[p2] = y2, i2.groupCtx.prevY.push(i2.groupCtx.yArrj), i2.groupCtx.prevYF.push(i2.groupCtx.yArrjF), i2.groupCtx.prevYVal.push(i2.groupCtx.yArrjVal), i2.groupCtx.prevX.push(i2.groupCtx.xArrj), i2.groupCtx.prevXF.push(i2.groupCtx.xArrjF), i2.groupCtx.prevXVal.push(i2.groupCtx.xArrjVal), r2.add(k2); }, h2 = 0, c2 = 0; h2 < t3.length; h2++, c2++) l2(h2, c2); return r2; } }, { key: "initialPositions", value: function(t3, e3, i2, a3, s2, r2, n2) { var o2, l2, h2 = this.w; if (this.isHorizontal) { a3 = h2.globals.gridHeight / h2.globals.dataPoints; var c2 = h2.config.plotOptions.bar.barHeight; o2 = -1 === String(c2).indexOf("%") ? parseInt(c2, 10) : a3 * parseInt(c2, 10) / 100, r2 = h2.globals.padHorizontal + (this.isReversed ? h2.globals.gridWidth - this.baseLineInvertedY : this.baseLineInvertedY), e3 = (a3 - o2) / 2; } else { l2 = i2 = h2.globals.gridWidth / h2.globals.dataPoints; var d2 = h2.config.plotOptions.bar.columnWidth; h2.globals.isXNumeric && h2.globals.dataPoints > 1 ? l2 = (i2 = h2.globals.minXDiff / this.xRatio) * parseInt(this.barOptions.columnWidth, 10) / 100 : -1 === String(d2).indexOf("%") ? l2 = parseInt(d2, 10) : l2 *= parseInt(d2, 10) / 100, s2 = this.isReversed ? this.baseLineY[n2] : h2.globals.gridHeight - this.baseLineY[n2], t3 = h2.globals.padHorizontal + (i2 - l2) / 2; } var u2 = h2.globals.barGroups.length || 1; return { x: t3, y: e3, yDivision: a3, xDivision: i2, barHeight: o2 / u2, barWidth: l2 / u2, zeroH: s2, zeroW: r2 }; } }, { key: "drawStackedBarPaths", value: function(t3) { for (var e3, i2 = t3.indexes, a3 = t3.barHeight, s2 = t3.strokeWidth, r2 = t3.zeroW, n2 = t3.x, o2 = t3.y, l2 = t3.columnGroupIndex, h2 = t3.seriesGroup, c2 = t3.yDivision, d2 = t3.elSeries, u2 = this.w, g2 = o2 + l2 * a3, p2 = i2.i, f2 = i2.j, x2 = i2.realIndex, b2 = i2.translationsIndex, m2 = 0, v2 = 0; v2 < this.groupCtx.prevXF.length; v2++) m2 += this.groupCtx.prevXF[v2][f2]; var y2 = p2; if (u2.config.series[x2].name && (y2 = h2.indexOf(u2.config.series[x2].name)), y2 > 0) { var w2 = r2; this.groupCtx.prevXVal[y2 - 1][f2] < 0 ? w2 = this.series[p2][f2] >= 0 ? this.groupCtx.prevX[y2 - 1][f2] + m2 - 2 * (this.isReversed ? m2 : 0) : this.groupCtx.prevX[y2 - 1][f2] : this.groupCtx.prevXVal[y2 - 1][f2] >= 0 && (w2 = this.series[p2][f2] >= 0 ? this.groupCtx.prevX[y2 - 1][f2] : this.groupCtx.prevX[y2 - 1][f2] - m2 + 2 * (this.isReversed ? m2 : 0)), e3 = w2; } else e3 = r2; n2 = null === this.series[p2][f2] ? e3 : e3 + this.series[p2][f2] / this.invertedYRatio - 2 * (this.isReversed ? this.series[p2][f2] / this.invertedYRatio : 0); var k2 = this.barHelpers.getBarpaths({ barYPosition: g2, barHeight: a3, x1: e3, x2: n2, strokeWidth: s2, isReversed: this.isReversed, series: this.series, realIndex: i2.realIndex, seriesGroup: h2, i: p2, j: f2, w: u2 }); return this.barHelpers.barBackground({ j: f2, i: p2, y1: g2, y2: a3, elSeries: d2 }), o2 += c2, { pathTo: k2.pathTo, pathFrom: k2.pathFrom, goalX: this.barHelpers.getGoalValues("x", r2, null, p2, f2, b2), barXPosition: e3, barYPosition: g2, x: n2, y: o2 }; } }, { key: "drawStackedColumnPaths", value: function(t3) { var e3 = t3.indexes, i2 = t3.x, a3 = t3.y, s2 = t3.xDivision, r2 = t3.barWidth, n2 = t3.zeroH, o2 = t3.columnGroupIndex, l2 = t3.seriesGroup, h2 = t3.elSeries, c2 = this.w, d2 = e3.i, u2 = e3.j, g2 = e3.bc, p2 = e3.realIndex, f2 = e3.translationsIndex; if (c2.globals.isXNumeric) { var x2 = c2.globals.seriesX[p2][u2]; x2 || (x2 = 0), i2 = (x2 - c2.globals.minX) / this.xRatio - r2 / 2 * c2.globals.barGroups.length; } for (var b2, m2 = i2 + o2 * r2, v2 = 0, y2 = 0; y2 < this.groupCtx.prevYF.length; y2++) v2 += isNaN(this.groupCtx.prevYF[y2][u2]) ? 0 : this.groupCtx.prevYF[y2][u2]; var w2 = d2; if (l2 && (w2 = l2.indexOf(c2.globals.seriesNames[p2])), w2 > 0 && !c2.globals.isXNumeric || w2 > 0 && c2.globals.isXNumeric && c2.globals.seriesX[p2 - 1][u2] === c2.globals.seriesX[p2][u2]) { var k2, A2, C2, S2 = Math.min(this.yRatio.length + 1, p2 + 1); if (void 0 !== this.groupCtx.prevY[w2 - 1] && this.groupCtx.prevY[w2 - 1].length) for (var L2 = 1; L2 < S2; L2++) { var M2; if (!isNaN(null === (M2 = this.groupCtx.prevY[w2 - L2]) || void 0 === M2 ? void 0 : M2[u2])) { C2 = this.groupCtx.prevY[w2 - L2][u2]; break; } } for (var P2 = 1; P2 < S2; P2++) { var I2, T2; if ((null === (I2 = this.groupCtx.prevYVal[w2 - P2]) || void 0 === I2 ? void 0 : I2[u2]) < 0) { A2 = this.series[d2][u2] >= 0 ? C2 - v2 + 2 * (this.isReversed ? v2 : 0) : C2; break; } if ((null === (T2 = this.groupCtx.prevYVal[w2 - P2]) || void 0 === T2 ? void 0 : T2[u2]) >= 0) { A2 = this.series[d2][u2] >= 0 ? C2 : C2 + v2 - 2 * (this.isReversed ? v2 : 0); break; } } void 0 === A2 && (A2 = c2.globals.gridHeight), b2 = null !== (k2 = this.groupCtx.prevYF[0]) && void 0 !== k2 && k2.every((function(t4) { return 0 === t4; })) && this.groupCtx.prevYF.slice(1, w2).every((function(t4) { return t4.every((function(t5) { return isNaN(t5); })); })) ? n2 : A2; } else b2 = n2; a3 = this.series[d2][u2] ? b2 - this.series[d2][u2] / this.yRatio[f2] + 2 * (this.isReversed ? this.series[d2][u2] / this.yRatio[f2] : 0) : b2; var z2 = this.barHelpers.getColumnPaths({ barXPosition: m2, barWidth: r2, y1: b2, y2: a3, yRatio: this.yRatio[f2], strokeWidth: this.strokeWidth, isReversed: this.isReversed, series: this.series, seriesGroup: l2, realIndex: e3.realIndex, i: d2, j: u2, w: c2 }); return this.barHelpers.barBackground({ bc: g2, j: u2, i: d2, x1: m2, x2: r2, elSeries: h2 }), { pathTo: z2.pathTo, pathFrom: z2.pathFrom, goalY: this.barHelpers.getGoalValues("y", null, n2, d2, u2), barXPosition: m2, x: c2.globals.isXNumeric ? i2 : i2 + s2, y: a3 }; } }]), a2; })(); var za = (function(t2) { h(a2, Ia); var e2 = n(a2); function a2() { return i(this, a2), e2.apply(this, arguments); } return s(a2, [{ key: "draw", value: function(t3, e3, i2) { var a3 = this, s2 = this.w, r2 = new Mi(this.ctx), n2 = s2.globals.comboCharts ? e3 : s2.config.chart.type, o2 = new ji(this.ctx); this.candlestickOptions = this.w.config.plotOptions.candlestick, this.boxOptions = this.w.config.plotOptions.boxPlot, this.isHorizontal = s2.config.plotOptions.bar.horizontal, this.isOHLC = this.candlestickOptions && "ohlc" === this.candlestickOptions.type; var l2 = new Pi(this.ctx, s2); t3 = l2.getLogSeries(t3), this.series = t3, this.yRatio = l2.getLogYRatios(this.yRatio), this.barHelpers.initVariables(t3); for (var h2 = r2.group({ class: "apexcharts-".concat(n2, "-series apexcharts-plot-series") }), c2 = function(e4) { a3.isBoxPlot = "boxPlot" === s2.config.chart.type || "boxPlot" === s2.config.series[e4].type; var n3, l3, c3, d3, g2 = void 0, p2 = void 0, f2 = [], x2 = [], b2 = s2.globals.comboCharts ? i2[e4] : e4, m2 = a3.barHelpers.getGroupIndex(b2).columnGroupIndex, y2 = r2.group({ class: "apexcharts-series", seriesName: v.escapeString(s2.globals.seriesNames[b2]), rel: e4 + 1, "data:realIndex": b2 }); a3.ctx.series.addCollapsedClassToSeries(y2, b2), t3[e4].length > 0 && (a3.visibleI = a3.visibleI + 1); var w2, k2, A2 = 0; a3.yRatio.length > 1 && (a3.yaxisIndex = s2.globals.seriesYAxisReverseMap[b2][0], A2 = b2); var C2 = a3.barHelpers.initialPositions(b2); p2 = C2.y, w2 = C2.barHeight, l3 = C2.yDivision, d3 = C2.zeroW, g2 = C2.x, k2 = C2.barWidth, n3 = C2.xDivision, c3 = C2.zeroH, x2.push(g2 + k2 / 2); for (var S2 = r2.group({ class: "apexcharts-datalabels", "data:realIndex": b2 }), L2 = r2.group({ class: "apexcharts-bar-goals-markers" }), M2 = function(i3) { var r3 = a3.barHelpers.getStrokeWidth(e4, i3, b2), h3 = null, v2 = { indexes: { i: e4, j: i3, realIndex: b2, translationsIndex: A2 }, x: g2, y: p2, strokeWidth: r3, elSeries: y2 }; h3 = a3.isHorizontal ? a3.drawHorizontalBoxPaths(u(u({}, v2), {}, { yDivision: l3, barHeight: w2, zeroW: d3 })) : a3.drawVerticalBoxPaths(u(u({}, v2), {}, { xDivision: n3, barWidth: k2, zeroH: c3 })), p2 = h3.y, g2 = h3.x; var C3 = a3.barHelpers.drawGoalLine({ barXPosition: h3.barXPosition, barYPosition: h3.barYPosition, goalX: h3.goalX, goalY: h3.goalY, barHeight: w2, barWidth: k2 }); C3 && L2.add(C3), i3 > 0 && x2.push(g2 + k2 / 2), f2.push(p2), h3.pathTo.forEach((function(n4, l4) { var c4 = !a3.isBoxPlot && a3.candlestickOptions.wick.useFillColor ? h3.color[l4] : s2.globals.stroke.colors[e4], d4 = o2.fillPath({ seriesNumber: b2, dataPointIndex: i3, color: h3.color[l4], value: t3[e4][i3] }); a3.renderSeries({ realIndex: b2, pathFill: d4, lineFill: c4, j: i3, i: e4, pathFrom: h3.pathFrom, pathTo: n4, strokeWidth: r3, elSeries: y2, x: g2, y: p2, series: t3, columnGroupIndex: m2, barHeight: w2, barWidth: k2, elDataLabelsWrap: S2, elGoalsMarkers: L2, visibleSeries: a3.visibleI, type: s2.config.chart.type }); })); }, P2 = 0; P2 < s2.globals.dataPoints; P2++) M2(P2); s2.globals.seriesXvalues[b2] = x2, s2.globals.seriesYvalues[b2] = f2, h2.add(y2); }, d2 = 0; d2 < t3.length; d2++) c2(d2); return h2; } }, { key: "drawVerticalBoxPaths", value: function(t3) { var e3 = t3.indexes, i2 = t3.x; t3.y; var a3 = t3.xDivision, s2 = t3.barWidth, r2 = t3.zeroH, n2 = t3.strokeWidth, o2 = this.w, l2 = new Mi(this.ctx), h2 = e3.i, c2 = e3.j, d2 = o2.config.plotOptions.candlestick.colors, u2 = this.boxOptions.colors, g2 = e3.realIndex, p2 = function(t4) { return Array.isArray(t4) ? t4[g2] : t4; }, f2 = p2(d2.upward), x2 = p2(d2.downward), b2 = this.yRatio[e3.translationsIndex], m2 = this.getOHLCValue(g2, c2), v2 = r2, y2 = r2, w2 = m2.o < m2.c ? [f2] : [x2]; this.isBoxPlot && (w2 = [p2(u2.lower), p2(u2.upper)]); var k2 = Math.min(m2.o, m2.c), A2 = Math.max(m2.o, m2.c), C2 = m2.m; o2.globals.isXNumeric && (i2 = (o2.globals.seriesX[g2][c2] - o2.globals.minX) / this.xRatio - s2 / 2); var S2 = i2 + s2 * this.visibleI; void 0 === this.series[h2][c2] || null === this.series[h2][c2] ? (k2 = r2, A2 = r2) : (k2 = r2 - k2 / b2, A2 = r2 - A2 / b2, v2 = r2 - m2.h / b2, y2 = r2 - m2.l / b2, C2 = r2 - m2.m / b2); var L2 = l2.move(S2, r2), M2 = l2.move(S2 + s2 / 2, k2); if (o2.globals.previousPaths.length > 0 && (M2 = this.getPreviousPath(g2, c2, true)), this.isOHLC) { var P2 = S2 + s2 / 2, I2 = r2 - m2.o / b2, T2 = r2 - m2.c / b2; L2 = [l2.move(P2, v2) + l2.line(P2, y2) + l2.move(P2, I2) + l2.line(S2, I2) + l2.move(P2, T2) + l2.line(S2 + s2, T2)]; } else L2 = this.isBoxPlot ? [l2.move(S2, k2) + l2.line(S2 + s2 / 2, k2) + l2.line(S2 + s2 / 2, v2) + l2.line(S2 + s2 / 4, v2) + l2.line(S2 + s2 - s2 / 4, v2) + l2.line(S2 + s2 / 2, v2) + l2.line(S2 + s2 / 2, k2) + l2.line(S2 + s2, k2) + l2.line(S2 + s2, C2) + l2.line(S2, C2) + l2.line(S2, k2 + n2 / 2), l2.move(S2, C2) + l2.line(S2 + s2, C2) + l2.line(S2 + s2, A2) + l2.line(S2 + s2 / 2, A2) + l2.line(S2 + s2 / 2, y2) + l2.line(S2 + s2 - s2 / 4, y2) + l2.line(S2 + s2 / 4, y2) + l2.line(S2 + s2 / 2, y2) + l2.line(S2 + s2 / 2, A2) + l2.line(S2, A2) + l2.line(S2, C2) + "z"] : [l2.move(S2, A2) + l2.line(S2 + s2 / 2, A2) + l2.line(S2 + s2 / 2, v2) + l2.line(S2 + s2 / 2, A2) + l2.line(S2 + s2, A2) + l2.line(S2 + s2, k2) + l2.line(S2 + s2 / 2, k2) + l2.line(S2 + s2 / 2, y2) + l2.line(S2 + s2 / 2, k2) + l2.line(S2, k2) + l2.line(S2, A2 - n2 / 2)]; return M2 += l2.move(S2, k2), o2.globals.isXNumeric || (i2 += a3), { pathTo: L2, pathFrom: M2, x: i2, y: A2, goalY: this.barHelpers.getGoalValues("y", null, r2, h2, c2, e3.translationsIndex), barXPosition: S2, color: w2 }; } }, { key: "drawHorizontalBoxPaths", value: function(t3) { var e3 = t3.indexes; t3.x; var i2 = t3.y, a3 = t3.yDivision, s2 = t3.barHeight, r2 = t3.zeroW, n2 = t3.strokeWidth, o2 = this.w, l2 = new Mi(this.ctx), h2 = e3.i, c2 = e3.j, d2 = this.boxOptions.colors.lower; this.isBoxPlot && (d2 = [this.boxOptions.colors.lower, this.boxOptions.colors.upper]); var u2 = this.invertedYRatio, g2 = e3.realIndex, p2 = this.getOHLCValue(g2, c2), f2 = r2, x2 = r2, b2 = Math.min(p2.o, p2.c), m2 = Math.max(p2.o, p2.c), v2 = p2.m; o2.globals.isXNumeric && (i2 = (o2.globals.seriesX[g2][c2] - o2.globals.minX) / this.invertedXRatio - s2 / 2); var y2 = i2 + s2 * this.visibleI; void 0 === this.series[h2][c2] || null === this.series[h2][c2] ? (b2 = r2, m2 = r2) : (b2 = r2 + b2 / u2, m2 = r2 + m2 / u2, f2 = r2 + p2.h / u2, x2 = r2 + p2.l / u2, v2 = r2 + p2.m / u2); var w2 = l2.move(r2, y2), k2 = l2.move(b2, y2 + s2 / 2); return o2.globals.previousPaths.length > 0 && (k2 = this.getPreviousPath(g2, c2, true)), w2 = [l2.move(b2, y2) + l2.line(b2, y2 + s2 / 2) + l2.line(f2, y2 + s2 / 2) + l2.line(f2, y2 + s2 / 2 - s2 / 4) + l2.line(f2, y2 + s2 / 2 + s2 / 4) + l2.line(f2, y2 + s2 / 2) + l2.line(b2, y2 + s2 / 2) + l2.line(b2, y2 + s2) + l2.line(v2, y2 + s2) + l2.line(v2, y2) + l2.line(b2 + n2 / 2, y2), l2.move(v2, y2) + l2.line(v2, y2 + s2) + l2.line(m2, y2 + s2) + l2.line(m2, y2 + s2 / 2) + l2.line(x2, y2 + s2 / 2) + l2.line(x2, y2 + s2 - s2 / 4) + l2.line(x2, y2 + s2 / 4) + l2.line(x2, y2 + s2 / 2) + l2.line(m2, y2 + s2 / 2) + l2.line(m2, y2) + l2.line(v2, y2) + "z"], k2 += l2.move(b2, y2), o2.globals.isXNumeric || (i2 += a3), { pathTo: w2, pathFrom: k2, x: m2, y: i2, goalX: this.barHelpers.getGoalValues("x", r2, null, h2, c2), barYPosition: y2, color: d2 }; } }, { key: "getOHLCValue", value: function(t3, e3) { var i2 = this.w, a3 = new Pi(this.ctx, i2), s2 = a3.getLogValAtSeriesIndex(i2.globals.seriesCandleH[t3][e3], t3), r2 = a3.getLogValAtSeriesIndex(i2.globals.seriesCandleO[t3][e3], t3), n2 = a3.getLogValAtSeriesIndex(i2.globals.seriesCandleM[t3][e3], t3), o2 = a3.getLogValAtSeriesIndex(i2.globals.seriesCandleC[t3][e3], t3), l2 = a3.getLogValAtSeriesIndex(i2.globals.seriesCandleL[t3][e3], t3); return { o: this.isBoxPlot ? s2 : r2, h: this.isBoxPlot ? r2 : s2, m: n2, l: this.isBoxPlot ? o2 : l2, c: this.isBoxPlot ? l2 : o2 }; } }]), a2; })(); var Xa = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "checkColorRange", value: function() { var t3 = this.w, e2 = false, i2 = t3.config.plotOptions[t3.config.chart.type]; return i2.colorScale.ranges.length > 0 && i2.colorScale.ranges.map((function(t4, i3) { t4.from <= 0 && (e2 = true); })), e2; } }, { key: "getShadeColor", value: function(t3, e2, i2, a2) { var s2 = this.w, r2 = 1, n2 = s2.config.plotOptions[t3].shadeIntensity, o2 = this.determineColor(t3, e2, i2); s2.globals.hasNegs || a2 ? r2 = s2.config.plotOptions[t3].reverseNegativeShade ? o2.percent < 0 ? o2.percent / 100 * (1.25 * n2) : (1 - o2.percent / 100) * (1.25 * n2) : o2.percent <= 0 ? 1 - (1 + o2.percent / 100) * n2 : (1 - o2.percent / 100) * n2 : (r2 = 1 - o2.percent / 100, "treemap" === t3 && (r2 = (1 - o2.percent / 100) * (1.25 * n2))); var l2 = o2.color, h2 = new v(); if (s2.config.plotOptions[t3].enableShades) if ("dark" === this.w.config.theme.mode) { var c2 = h2.shadeColor(-1 * r2, o2.color); l2 = v.hexToRgba(v.isColorHex(c2) ? c2 : v.rgb2hex(c2), s2.config.fill.opacity); } else { var d2 = h2.shadeColor(r2, o2.color); l2 = v.hexToRgba(v.isColorHex(d2) ? d2 : v.rgb2hex(d2), s2.config.fill.opacity); } return { color: l2, colorProps: o2 }; } }, { key: "determineColor", value: function(t3, e2, i2) { var a2 = this.w, s2 = a2.globals.series[e2][i2], r2 = a2.config.plotOptions[t3], n2 = r2.colorScale.inverse ? i2 : e2; r2.distributed && "treemap" === a2.config.chart.type && (n2 = i2); var o2 = a2.globals.colors[n2], l2 = null, h2 = Math.min.apply(Math, f(a2.globals.series[e2])), c2 = Math.max.apply(Math, f(a2.globals.series[e2])); r2.distributed || "heatmap" !== t3 || (h2 = a2.globals.minY, c2 = a2.globals.maxY), void 0 !== r2.colorScale.min && (h2 = r2.colorScale.min < a2.globals.minY ? r2.colorScale.min : a2.globals.minY, c2 = r2.colorScale.max > a2.globals.maxY ? r2.colorScale.max : a2.globals.maxY); var d2 = Math.abs(c2) + Math.abs(h2), u2 = 100 * s2 / (0 === d2 ? d2 - 1e-6 : d2); r2.colorScale.ranges.length > 0 && r2.colorScale.ranges.map((function(t4, e3) { if (s2 >= t4.from && s2 <= t4.to) { o2 = t4.color, l2 = t4.foreColor ? t4.foreColor : null, h2 = t4.from, c2 = t4.to; var i3 = Math.abs(c2) + Math.abs(h2); u2 = 100 * s2 / (0 === i3 ? i3 - 1e-6 : i3); } })); return { color: o2, foreColor: l2, percent: u2 }; } }, { key: "calculateDataLabels", value: function(t3) { var e2 = t3.text, i2 = t3.x, a2 = t3.y, s2 = t3.i, r2 = t3.j, n2 = t3.colorProps, o2 = t3.fontSize, l2 = this.w.config.dataLabels, h2 = new Mi(this.ctx), c2 = new qi(this.ctx), d2 = null; if (l2.enabled) { d2 = h2.group({ class: "apexcharts-data-labels" }); var u2 = l2.offsetX, g2 = l2.offsetY, p2 = i2 + u2, f2 = a2 + parseFloat(l2.style.fontSize) / 3 + g2; c2.plotDataLabelsText({ x: p2, y: f2, text: e2, i: s2, j: r2, color: n2.foreColor, parent: d2, fontSize: o2, dataLabelsConfig: l2 }); } return d2; } }, { key: "addListeners", value: function(t3) { var e2 = new Mi(this.ctx); t3.node.addEventListener("mouseenter", e2.pathMouseEnter.bind(this, t3)), t3.node.addEventListener("mouseleave", e2.pathMouseLeave.bind(this, t3)), t3.node.addEventListener("mousedown", e2.pathMouseDown.bind(this, t3)); } }]), t2; })(); var Ra = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.xRatio = a2.xRatio, this.yRatio = a2.yRatio, this.dynamicAnim = this.w.config.chart.animations.dynamicAnimation, this.helpers = new Xa(e2), this.rectRadius = this.w.config.plotOptions.heatmap.radius, this.strokeWidth = this.w.config.stroke.show ? this.w.config.stroke.width : 0; } return s(t2, [{ key: "draw", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a2 = i2.group({ class: "apexcharts-heatmap" }); a2.attr("clip-path", "url(#gridRectMask".concat(e2.globals.cuid, ")")); var s2 = e2.globals.gridWidth / e2.globals.dataPoints, r2 = e2.globals.gridHeight / e2.globals.series.length, n2 = 0, o2 = false; this.negRange = this.helpers.checkColorRange(); var l2 = t3.slice(); e2.config.yaxis[0].reversed && (o2 = true, l2.reverse()); for (var h2 = o2 ? 0 : l2.length - 1; o2 ? h2 < l2.length : h2 >= 0; o2 ? h2++ : h2--) { var c2 = i2.group({ class: "apexcharts-series apexcharts-heatmap-series", seriesName: v.escapeString(e2.globals.seriesNames[h2]), rel: h2 + 1, "data:realIndex": h2 }); if (this.ctx.series.addCollapsedClassToSeries(c2, h2), e2.config.chart.dropShadow.enabled) { var d2 = e2.config.chart.dropShadow; new Li(this.ctx).dropShadow(c2, d2, h2); } for (var u2 = 0, g2 = e2.config.plotOptions.heatmap.shadeIntensity, p2 = 0, f2 = 0; f2 < e2.globals.dataPoints; f2++) if (e2.globals.seriesX.length && !e2.globals.allSeriesHasEqualX && e2.globals.minX + e2.globals.minXDiff * f2 < e2.globals.seriesX[h2][p2]) u2 += s2; else { if (p2 >= l2[h2].length) break; var x2 = this.helpers.getShadeColor(e2.config.chart.type, h2, p2, this.negRange), b2 = x2.color, m2 = x2.colorProps; if ("image" === e2.config.fill.type) b2 = new ji(this.ctx).fillPath({ seriesNumber: h2, dataPointIndex: p2, opacity: e2.globals.hasNegs ? m2.percent < 0 ? 1 - (1 + m2.percent / 100) : g2 + m2.percent / 100 : m2.percent / 100, patternID: v.randomId(), width: e2.config.fill.image.width ? e2.config.fill.image.width : s2, height: e2.config.fill.image.height ? e2.config.fill.image.height : r2 }); var y2 = this.rectRadius, w2 = i2.drawRect(u2, n2, s2, r2, y2); if (w2.attr({ cx: u2, cy: n2 }), w2.node.classList.add("apexcharts-heatmap-rect"), c2.add(w2), w2.attr({ fill: b2, i: h2, index: h2, j: p2, val: t3[h2][p2], "stroke-width": this.strokeWidth, stroke: e2.config.plotOptions.heatmap.useFillColorAsStroke ? b2 : e2.globals.stroke.colors[0], color: b2 }), this.helpers.addListeners(w2), e2.config.chart.animations.enabled && !e2.globals.dataChanged) { var k2 = 1; e2.globals.resized || (k2 = e2.config.chart.animations.speed), this.animateHeatMap(w2, u2, n2, s2, r2, k2); } if (e2.globals.dataChanged) { var A2 = 1; if (this.dynamicAnim.enabled && e2.globals.shouldAnimate) { A2 = this.dynamicAnim.speed; var C2 = e2.globals.previousPaths[h2] && e2.globals.previousPaths[h2][p2] && e2.globals.previousPaths[h2][p2].color; C2 || (C2 = "rgba(255, 255, 255, 0)"), this.animateHeatColor(w2, v.isColorHex(C2) ? C2 : v.rgb2hex(C2), v.isColorHex(b2) ? b2 : v.rgb2hex(b2), A2); } } var S2 = (0, e2.config.dataLabels.formatter)(e2.globals.series[h2][p2], { value: e2.globals.series[h2][p2], seriesIndex: h2, dataPointIndex: p2, w: e2 }), L2 = this.helpers.calculateDataLabels({ text: S2, x: u2 + s2 / 2, y: n2 + r2 / 2, i: h2, j: p2, colorProps: m2, series: l2 }); null !== L2 && c2.add(L2), u2 += s2, p2++; } n2 += r2, a2.add(c2); } var M2 = e2.globals.yAxisScale[0].result.slice(); return e2.config.yaxis[0].reversed ? M2.unshift("") : M2.push(""), e2.globals.yAxisScale[0].result = M2, a2; } }, { key: "animateHeatMap", value: function(t3, e2, i2, a2, s2, r2) { var n2 = new y(this.ctx); n2.animateRect(t3, { x: e2 + a2 / 2, y: i2 + s2 / 2, width: 0, height: 0 }, { x: e2, y: i2, width: a2, height: s2 }, r2, (function() { n2.animationCompleted(t3); })); } }, { key: "animateHeatColor", value: function(t3, e2, i2, a2) { t3.attr({ fill: e2 }).animate(a2).attr({ fill: i2 }); } }]), t2; })(); var Ea = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "drawYAxisTexts", value: function(t3, e2, i2, a2) { var s2 = this.w, r2 = s2.config.yaxis[0], n2 = s2.globals.yLabelFormatters[0]; return new Mi(this.ctx).drawText({ x: t3 + r2.labels.offsetX, y: e2 + r2.labels.offsetY, text: n2(a2, i2), textAnchor: "middle", fontSize: r2.labels.style.fontSize, fontFamily: r2.labels.style.fontFamily, foreColor: Array.isArray(r2.labels.style.colors) ? r2.labels.style.colors[i2] : r2.labels.style.colors }); } }]), t2; })(); var Ya = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; var a2 = this.w; this.chartType = this.w.config.chart.type, this.initialAnim = this.w.config.chart.animations.enabled, this.dynamicAnim = this.initialAnim && this.w.config.chart.animations.dynamicAnimation.enabled, this.animBeginArr = [0], this.animDur = 0, this.donutDataLabels = this.w.config.plotOptions.pie.donut.labels, this.lineColorArr = void 0 !== a2.globals.stroke.colors ? a2.globals.stroke.colors : a2.globals.colors, this.defaultSize = Math.min(a2.globals.gridWidth, a2.globals.gridHeight), this.centerY = this.defaultSize / 2, this.centerX = a2.globals.gridWidth / 2, "radialBar" === a2.config.chart.type ? this.fullAngle = 360 : this.fullAngle = Math.abs(a2.config.plotOptions.pie.endAngle - a2.config.plotOptions.pie.startAngle), this.initialAngle = a2.config.plotOptions.pie.startAngle % this.fullAngle, a2.globals.radialSize = this.defaultSize / 2.05 - a2.config.stroke.width - (a2.config.chart.sparkline.enabled ? 0 : a2.config.chart.dropShadow.blur), this.donutSize = a2.globals.radialSize * parseInt(a2.config.plotOptions.pie.donut.size, 10) / 100; var s2 = a2.config.plotOptions.pie.customScale, r2 = a2.globals.gridWidth / 2, n2 = a2.globals.gridHeight / 2; this.translateX = r2 - r2 * s2, this.translateY = n2 - n2 * s2, this.dataLabelsGroup = new Mi(this.ctx).group({ class: "apexcharts-datalabels-group", transform: "translate(".concat(this.translateX, ", ").concat(this.translateY, ") scale(").concat(s2, ")") }), this.maxY = 0, this.sliceLabels = [], this.sliceSizes = [], this.prevSectorAngleArr = []; } return s(t2, [{ key: "draw", value: function(t3) { var e2 = this, i2 = this.w, a2 = new Mi(this.ctx), s2 = a2.group({ class: "apexcharts-pie" }); if (i2.globals.noData) return s2; for (var r2 = 0, n2 = 0; n2 < t3.length; n2++) r2 += v.negToZero(t3[n2]); var o2 = [], l2 = a2.group(); 0 === r2 && (r2 = 1e-5), t3.forEach((function(t4) { e2.maxY = Math.max(e2.maxY, t4); })), i2.config.yaxis[0].max && (this.maxY = i2.config.yaxis[0].max), "back" === i2.config.grid.position && "polarArea" === this.chartType && this.drawPolarElements(s2); for (var h2 = 0; h2 < t3.length; h2++) { var c2 = this.fullAngle * v.negToZero(t3[h2]) / r2; o2.push(c2), "polarArea" === this.chartType ? (o2[h2] = this.fullAngle / t3.length, this.sliceSizes.push(i2.globals.radialSize * t3[h2] / this.maxY)) : this.sliceSizes.push(i2.globals.radialSize); } if (i2.globals.dataChanged) { for (var d2, u2 = 0, g2 = 0; g2 < i2.globals.previousPaths.length; g2++) u2 += v.negToZero(i2.globals.previousPaths[g2]); for (var p2 = 0; p2 < i2.globals.previousPaths.length; p2++) d2 = this.fullAngle * v.negToZero(i2.globals.previousPaths[p2]) / u2, this.prevSectorAngleArr.push(d2); } if (this.donutSize < 0 && (this.donutSize = 0), "donut" === this.chartType) { var f2 = a2.drawCircle(this.donutSize); f2.attr({ cx: this.centerX, cy: this.centerY, fill: i2.config.plotOptions.pie.donut.background ? i2.config.plotOptions.pie.donut.background : "transparent" }), l2.add(f2); } var x2 = this.drawArcs(o2, t3); if (this.sliceLabels.forEach((function(t4) { x2.add(t4); })), l2.attr({ transform: "translate(".concat(this.translateX, ", ").concat(this.translateY, ") scale(").concat(i2.config.plotOptions.pie.customScale, ")") }), l2.add(x2), s2.add(l2), this.donutDataLabels.show) { var b2 = this.renderInnerDataLabels(this.dataLabelsGroup, this.donutDataLabels, { hollowSize: this.donutSize, centerX: this.centerX, centerY: this.centerY, opacity: this.donutDataLabels.show }); s2.add(b2); } return "front" === i2.config.grid.position && "polarArea" === this.chartType && this.drawPolarElements(s2), s2; } }, { key: "drawArcs", value: function(t3, e2) { var i2 = this.w, a2 = new Li(this.ctx), s2 = new Mi(this.ctx), r2 = new ji(this.ctx), n2 = s2.group({ class: "apexcharts-slices" }), o2 = this.initialAngle, l2 = this.initialAngle, h2 = this.initialAngle, c2 = this.initialAngle; this.strokeWidth = i2.config.stroke.show ? i2.config.stroke.width : 0; for (var d2 = 0; d2 < t3.length; d2++) { var u2 = s2.group({ class: "apexcharts-series apexcharts-pie-series", seriesName: v.escapeString(i2.globals.seriesNames[d2]), rel: d2 + 1, "data:realIndex": d2 }); n2.add(u2), l2 = c2, h2 = (o2 = h2) + t3[d2], c2 = l2 + this.prevSectorAngleArr[d2]; var g2 = h2 < o2 ? this.fullAngle + h2 - o2 : h2 - o2, p2 = r2.fillPath({ seriesNumber: d2, size: this.sliceSizes[d2], value: e2[d2] }), f2 = this.getChangedPath(l2, c2), x2 = s2.drawPath({ d: f2, stroke: Array.isArray(this.lineColorArr) ? this.lineColorArr[d2] : this.lineColorArr, strokeWidth: 0, fill: p2, fillOpacity: i2.config.fill.opacity, classes: "apexcharts-pie-area apexcharts-".concat(this.chartType.toLowerCase(), "-slice-").concat(d2) }); if (x2.attr({ index: 0, j: d2 }), a2.setSelectionFilter(x2, 0, d2), i2.config.chart.dropShadow.enabled) { var b2 = i2.config.chart.dropShadow; a2.dropShadow(x2, b2, d2); } this.addListeners(x2, this.donutDataLabels), Mi.setAttrs(x2.node, { "data:angle": g2, "data:startAngle": o2, "data:strokeWidth": this.strokeWidth, "data:value": e2[d2] }); var m2 = { x: 0, y: 0 }; "pie" === this.chartType || "polarArea" === this.chartType ? m2 = v.polarToCartesian(this.centerX, this.centerY, i2.globals.radialSize / 1.25 + i2.config.plotOptions.pie.dataLabels.offset, (o2 + g2 / 2) % this.fullAngle) : "donut" === this.chartType && (m2 = v.polarToCartesian(this.centerX, this.centerY, (i2.globals.radialSize + this.donutSize) / 2 + i2.config.plotOptions.pie.dataLabels.offset, (o2 + g2 / 2) % this.fullAngle)), u2.add(x2); var y2 = 0; if (!this.initialAnim || i2.globals.resized || i2.globals.dataChanged ? this.animBeginArr.push(0) : (0 === (y2 = g2 / this.fullAngle * i2.config.chart.animations.speed) && (y2 = 1), this.animDur = y2 + this.animDur, this.animBeginArr.push(this.animDur)), this.dynamicAnim && i2.globals.dataChanged ? this.animatePaths(x2, { size: this.sliceSizes[d2], endAngle: h2, startAngle: o2, prevStartAngle: l2, prevEndAngle: c2, animateStartingPos: true, i: d2, animBeginArr: this.animBeginArr, shouldSetPrevPaths: true, dur: i2.config.chart.animations.dynamicAnimation.speed }) : this.animatePaths(x2, { size: this.sliceSizes[d2], endAngle: h2, startAngle: o2, i: d2, totalItems: t3.length - 1, animBeginArr: this.animBeginArr, dur: y2 }), i2.config.plotOptions.pie.expandOnClick && "polarArea" !== this.chartType && x2.node.addEventListener("mouseup", this.pieClicked.bind(this, d2)), void 0 !== i2.globals.selectedDataPoints[0] && i2.globals.selectedDataPoints[0].indexOf(d2) > -1 && this.pieClicked(d2), i2.config.dataLabels.enabled) { var w2 = m2.x, k2 = m2.y, A2 = 100 * g2 / this.fullAngle + "%"; if (0 !== g2 && i2.config.plotOptions.pie.dataLabels.minAngleToShowLabel < t3[d2]) { var C2 = i2.config.dataLabels.formatter; void 0 !== C2 && (A2 = C2(i2.globals.seriesPercent[d2][0], { seriesIndex: d2, w: i2 })); var S2 = i2.globals.dataLabels.style.colors[d2], L2 = s2.group({ class: "apexcharts-datalabels" }), M2 = s2.drawText({ x: w2, y: k2, text: A2, textAnchor: "middle", fontSize: i2.config.dataLabels.style.fontSize, fontFamily: i2.config.dataLabels.style.fontFamily, fontWeight: i2.config.dataLabels.style.fontWeight, foreColor: S2 }); if (L2.add(M2), i2.config.dataLabels.dropShadow.enabled) { var P2 = i2.config.dataLabels.dropShadow; a2.dropShadow(M2, P2); } M2.node.classList.add("apexcharts-pie-label"), i2.config.chart.animations.animate && false === i2.globals.resized && (M2.node.classList.add("apexcharts-pie-label-delay"), M2.node.style.animationDelay = i2.config.chart.animations.speed / 940 + "s"), this.sliceLabels.push(L2); } } } return n2; } }, { key: "addListeners", value: function(t3, e2) { var i2 = new Mi(this.ctx); t3.node.addEventListener("mouseenter", i2.pathMouseEnter.bind(this, t3)), t3.node.addEventListener("mouseleave", i2.pathMouseLeave.bind(this, t3)), t3.node.addEventListener("mouseleave", this.revertDataLabelsInner.bind(this, t3.node, e2)), t3.node.addEventListener("mousedown", i2.pathMouseDown.bind(this, t3)), this.donutDataLabels.total.showAlways || (t3.node.addEventListener("mouseenter", this.printDataLabelsInner.bind(this, t3.node, e2)), t3.node.addEventListener("mousedown", this.printDataLabelsInner.bind(this, t3.node, e2))); } }, { key: "animatePaths", value: function(t3, e2) { var i2 = this.w, a2 = e2.endAngle < e2.startAngle ? this.fullAngle + e2.endAngle - e2.startAngle : e2.endAngle - e2.startAngle, s2 = a2, r2 = e2.startAngle, n2 = e2.startAngle; void 0 !== e2.prevStartAngle && void 0 !== e2.prevEndAngle && (r2 = e2.prevEndAngle, s2 = e2.prevEndAngle < e2.prevStartAngle ? this.fullAngle + e2.prevEndAngle - e2.prevStartAngle : e2.prevEndAngle - e2.prevStartAngle), e2.i === i2.config.series.length - 1 && (a2 + n2 > this.fullAngle ? e2.endAngle = e2.endAngle - (a2 + n2) : a2 + n2 < this.fullAngle && (e2.endAngle = e2.endAngle + (this.fullAngle - (a2 + n2)))), a2 === this.fullAngle && (a2 = this.fullAngle - 0.01), this.animateArc(t3, r2, n2, a2, s2, e2); } }, { key: "animateArc", value: function(t3, e2, i2, a2, s2, r2) { var n2, o2 = this, l2 = this.w, h2 = new y(this.ctx), c2 = r2.size; (isNaN(e2) || isNaN(s2)) && (e2 = i2, s2 = a2, r2.dur = 0); var d2 = a2, u2 = i2, g2 = e2 < i2 ? this.fullAngle + e2 - i2 : e2 - i2; l2.globals.dataChanged && r2.shouldSetPrevPaths && r2.prevEndAngle && (n2 = o2.getPiePath({ me: o2, startAngle: r2.prevStartAngle, angle: r2.prevEndAngle < r2.prevStartAngle ? this.fullAngle + r2.prevEndAngle - r2.prevStartAngle : r2.prevEndAngle - r2.prevStartAngle, size: c2 }), t3.attr({ d: n2 })), 0 !== r2.dur ? t3.animate(r2.dur, r2.animBeginArr[r2.i]).after((function() { "pie" !== o2.chartType && "donut" !== o2.chartType && "polarArea" !== o2.chartType || this.animate(l2.config.chart.animations.dynamicAnimation.speed).attr({ "stroke-width": o2.strokeWidth }), r2.i === l2.config.series.length - 1 && h2.animationCompleted(t3); })).during((function(l3) { d2 = g2 + (a2 - g2) * l3, r2.animateStartingPos && (d2 = s2 + (a2 - s2) * l3, u2 = e2 - s2 + (i2 - (e2 - s2)) * l3), n2 = o2.getPiePath({ me: o2, startAngle: u2, angle: d2, size: c2 }), t3.node.setAttribute("data:pathOrig", n2), t3.attr({ d: n2 }); })) : (n2 = o2.getPiePath({ me: o2, startAngle: u2, angle: a2, size: c2 }), r2.isTrack || (l2.globals.animationEnded = true), t3.node.setAttribute("data:pathOrig", n2), t3.attr({ d: n2, "stroke-width": o2.strokeWidth })); } }, { key: "pieClicked", value: function(t3) { var e2, i2 = this.w, a2 = this, s2 = a2.sliceSizes[t3] + (i2.config.plotOptions.pie.expandOnClick ? 4 : 0), r2 = i2.globals.dom.Paper.findOne(".apexcharts-".concat(a2.chartType.toLowerCase(), "-slice-").concat(t3)); if ("true" !== r2.attr("data:pieClicked")) { var n2 = i2.globals.dom.baseEl.getElementsByClassName("apexcharts-pie-area"); Array.prototype.forEach.call(n2, (function(t4) { t4.setAttribute("data:pieClicked", "false"); var e3 = t4.getAttribute("data:pathOrig"); e3 && t4.setAttribute("d", e3); })), i2.globals.capturedDataPointIndex = t3, r2.attr("data:pieClicked", "true"); var o2 = parseInt(r2.attr("data:startAngle"), 10), l2 = parseInt(r2.attr("data:angle"), 10); e2 = a2.getPiePath({ me: a2, startAngle: o2, angle: l2, size: s2 }), 360 !== l2 && r2.plot(e2); } else { r2.attr({ "data:pieClicked": "false" }), this.revertDataLabelsInner(r2.node, this.donutDataLabels); var h2 = r2.attr("data:pathOrig"); r2.attr({ d: h2 }); } } }, { key: "getChangedPath", value: function(t3, e2) { var i2 = ""; return this.dynamicAnim && this.w.globals.dataChanged && (i2 = this.getPiePath({ me: this, startAngle: t3, angle: e2 - t3, size: this.size })), i2; } }, { key: "getPiePath", value: function(t3) { var e2, i2 = t3.me, a2 = t3.startAngle, s2 = t3.angle, r2 = t3.size, n2 = new Mi(this.ctx), o2 = a2, l2 = Math.PI * (o2 - 90) / 180, h2 = s2 + a2; Math.ceil(h2) >= this.fullAngle + this.w.config.plotOptions.pie.startAngle % this.fullAngle && (h2 = this.fullAngle + this.w.config.plotOptions.pie.startAngle % this.fullAngle - 0.01), Math.ceil(h2) > this.fullAngle && (h2 -= this.fullAngle); var c2 = Math.PI * (h2 - 90) / 180, d2 = i2.centerX + r2 * Math.cos(l2), u2 = i2.centerY + r2 * Math.sin(l2), g2 = i2.centerX + r2 * Math.cos(c2), p2 = i2.centerY + r2 * Math.sin(c2), f2 = v.polarToCartesian(i2.centerX, i2.centerY, i2.donutSize, h2), x2 = v.polarToCartesian(i2.centerX, i2.centerY, i2.donutSize, o2), b2 = s2 > 180 ? 1 : 0, m2 = ["M", d2, u2, "A", r2, r2, 0, b2, 1, g2, p2]; return e2 = "donut" === i2.chartType ? [].concat(m2, ["L", f2.x, f2.y, "A", i2.donutSize, i2.donutSize, 0, b2, 0, x2.x, x2.y, "L", d2, u2, "z"]).join(" ") : "pie" === i2.chartType || "polarArea" === i2.chartType ? [].concat(m2, ["L", i2.centerX, i2.centerY, "L", d2, u2]).join(" ") : [].concat(m2).join(" "), n2.roundPathCorners(e2, 2 * this.strokeWidth); } }, { key: "drawPolarElements", value: function(t3) { var e2 = this.w, i2 = new ea(this.ctx), a2 = new Mi(this.ctx), s2 = new Ea(this.ctx), r2 = a2.group(), n2 = a2.group(), o2 = i2.niceScale(0, Math.ceil(this.maxY), 0), l2 = o2.result.reverse(), h2 = o2.result.length; this.maxY = o2.niceMax; for (var c2 = e2.globals.radialSize, d2 = c2 / (h2 - 1), u2 = 0; u2 < h2 - 1; u2++) { var g2 = a2.drawCircle(c2); if (g2.attr({ cx: this.centerX, cy: this.centerY, fill: "none", "stroke-width": e2.config.plotOptions.polarArea.rings.strokeWidth, stroke: e2.config.plotOptions.polarArea.rings.strokeColor }), e2.config.yaxis[0].show) { var p2 = s2.drawYAxisTexts(this.centerX, this.centerY - c2 + parseInt(e2.config.yaxis[0].labels.style.fontSize, 10) / 2, u2, l2[u2]); n2.add(p2); } r2.add(g2), c2 -= d2; } this.drawSpokes(t3), t3.add(r2), t3.add(n2); } }, { key: "renderInnerDataLabels", value: function(t3, e2, i2) { var a2 = this.w, s2 = new Mi(this.ctx), r2 = e2.total.show; t3.node.innerHTML = "", t3.node.style.opacity = i2.opacity; var n2, o2, l2 = i2.centerX, h2 = this.donutDataLabels.total.label ? i2.centerY : i2.centerY - i2.centerY / 6; n2 = void 0 === e2.name.color ? a2.globals.colors[0] : e2.name.color; var c2 = e2.name.fontSize, d2 = e2.name.fontFamily, u2 = e2.name.fontWeight; o2 = void 0 === e2.value.color ? a2.config.chart.foreColor : e2.value.color; var g2 = e2.value.formatter, p2 = "", f2 = ""; if (r2 ? (n2 = e2.total.color, c2 = e2.total.fontSize, d2 = e2.total.fontFamily, u2 = e2.total.fontWeight, f2 = this.donutDataLabels.total.label ? e2.total.label : "", p2 = e2.total.formatter(a2)) : 1 === a2.globals.series.length && (p2 = g2(a2.globals.series[0], a2), f2 = a2.globals.seriesNames[0]), f2 && (f2 = e2.name.formatter(f2, e2.total.show, a2)), e2.name.show) { var x2 = s2.drawText({ x: l2, y: h2 + parseFloat(e2.name.offsetY), text: f2, textAnchor: "middle", foreColor: n2, fontSize: c2, fontWeight: u2, fontFamily: d2 }); x2.node.classList.add("apexcharts-datalabel-label"), t3.add(x2); } if (e2.value.show) { var b2 = e2.name.show ? parseFloat(e2.value.offsetY) + 16 : e2.value.offsetY, m2 = s2.drawText({ x: l2, y: h2 + b2, text: p2, textAnchor: "middle", foreColor: o2, fontWeight: e2.value.fontWeight, fontSize: e2.value.fontSize, fontFamily: e2.value.fontFamily }); m2.node.classList.add("apexcharts-datalabel-value"), t3.add(m2); } return t3; } }, { key: "printInnerLabels", value: function(t3, e2, i2, a2) { var s2, r2 = this.w; a2 ? s2 = void 0 === t3.name.color ? r2.globals.colors[parseInt(a2.parentNode.getAttribute("rel"), 10) - 1] : t3.name.color : r2.globals.series.length > 1 && t3.total.show && (s2 = t3.total.color); var n2 = r2.globals.dom.baseEl.querySelector(".apexcharts-datalabel-label"), o2 = r2.globals.dom.baseEl.querySelector(".apexcharts-datalabel-value"); i2 = (0, t3.value.formatter)(i2, r2), a2 || "function" != typeof t3.total.formatter || (i2 = t3.total.formatter(r2)); var l2 = e2 === t3.total.label; e2 = this.donutDataLabels.total.label ? t3.name.formatter(e2, l2, r2) : "", null !== n2 && (n2.textContent = e2), null !== o2 && (o2.textContent = i2), null !== n2 && (n2.style.fill = s2); } }, { key: "printDataLabelsInner", value: function(t3, e2) { var i2 = this.w, a2 = t3.getAttribute("data:value"), s2 = i2.globals.seriesNames[parseInt(t3.parentNode.getAttribute("rel"), 10) - 1]; i2.globals.series.length > 1 && this.printInnerLabels(e2, s2, a2, t3); var r2 = i2.globals.dom.baseEl.querySelector(".apexcharts-datalabels-group"); null !== r2 && (r2.style.opacity = 1); } }, { key: "drawSpokes", value: function(t3) { var e2 = this, i2 = this.w, a2 = new Mi(this.ctx), s2 = i2.config.plotOptions.polarArea.spokes; if (0 !== s2.strokeWidth) { for (var r2 = [], n2 = 360 / i2.globals.series.length, o2 = 0; o2 < i2.globals.series.length; o2++) r2.push(v.polarToCartesian(this.centerX, this.centerY, i2.globals.radialSize, i2.config.plotOptions.pie.startAngle + n2 * o2)); r2.forEach((function(i3, r3) { var n3 = a2.drawLine(i3.x, i3.y, e2.centerX, e2.centerY, Array.isArray(s2.connectorColors) ? s2.connectorColors[r3] : s2.connectorColors); t3.add(n3); })); } } }, { key: "revertDataLabelsInner", value: function() { var t3 = this.w; if (this.donutDataLabels.show) { var e2 = t3.globals.dom.Paper.findOne(".apexcharts-datalabels-group"), i2 = this.renderInnerDataLabels(e2, this.donutDataLabels, { hollowSize: this.donutSize, centerX: this.centerX, centerY: this.centerY, opacity: this.donutDataLabels.show }); t3.globals.dom.Paper.findOne(".apexcharts-radialbar, .apexcharts-pie").add(i2); } } }]), t2; })(); var Ha = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.chartType = this.w.config.chart.type, this.initialAnim = this.w.config.chart.animations.enabled, this.dynamicAnim = this.initialAnim && this.w.config.chart.animations.dynamicAnimation.enabled, this.animDur = 0; var a2 = this.w; this.graphics = new Mi(this.ctx), this.lineColorArr = void 0 !== a2.globals.stroke.colors ? a2.globals.stroke.colors : a2.globals.colors, this.defaultSize = a2.globals.svgHeight < a2.globals.svgWidth ? a2.globals.gridHeight : a2.globals.gridWidth, this.isLog = a2.config.yaxis[0].logarithmic, this.logBase = a2.config.yaxis[0].logBase, this.coreUtils = new Pi(this.ctx), this.maxValue = this.isLog ? this.coreUtils.getLogVal(this.logBase, a2.globals.maxY, 0) : a2.globals.maxY, this.minValue = this.isLog ? this.coreUtils.getLogVal(this.logBase, this.w.globals.minY, 0) : a2.globals.minY, this.polygons = a2.config.plotOptions.radar.polygons, this.strokeWidth = a2.config.stroke.show ? a2.config.stroke.width : 0, this.size = this.defaultSize / 2.1 - this.strokeWidth - a2.config.chart.dropShadow.blur, a2.config.xaxis.labels.show && (this.size = this.size - a2.globals.xAxisLabelsWidth / 1.75), void 0 !== a2.config.plotOptions.radar.size && (this.size = a2.config.plotOptions.radar.size), this.dataRadiusOfPercent = [], this.dataRadius = [], this.angleArr = [], this.yaxisLabelsTextsPos = []; } return s(t2, [{ key: "draw", value: function(t3) { var e2 = this, i2 = this.w, a2 = new ji(this.ctx), s2 = [], r2 = new qi(this.ctx); t3.length && (this.dataPointsLen = t3[i2.globals.maxValsInArrayIndex].length), this.disAngle = 2 * Math.PI / this.dataPointsLen; var n2 = i2.globals.gridWidth / 2, o2 = i2.globals.gridHeight / 2, l2 = n2 + i2.config.plotOptions.radar.offsetX, h2 = o2 + i2.config.plotOptions.radar.offsetY, c2 = this.graphics.group({ class: "apexcharts-radar-series apexcharts-plot-series", transform: "translate(".concat(l2 || 0, ", ").concat(h2 || 0, ")") }), d2 = [], g2 = null, p2 = null; if (this.yaxisLabels = this.graphics.group({ class: "apexcharts-yaxis" }), t3.forEach((function(t4, n3) { var o3 = t4.length === i2.globals.dataPoints, l3 = e2.graphics.group().attr({ class: "apexcharts-series", "data:longestSeries": o3, seriesName: v.escapeString(i2.globals.seriesNames[n3]), rel: n3 + 1, "data:realIndex": n3 }); e2.dataRadiusOfPercent[n3] = [], e2.dataRadius[n3] = [], e2.angleArr[n3] = [], t4.forEach((function(t5, i3) { var a3 = Math.abs(e2.maxValue - e2.minValue); t5 -= e2.minValue, e2.isLog && (t5 = e2.coreUtils.getLogVal(e2.logBase, t5, 0)), e2.dataRadiusOfPercent[n3][i3] = t5 / a3, e2.dataRadius[n3][i3] = e2.dataRadiusOfPercent[n3][i3] * e2.size, e2.angleArr[n3][i3] = i3 * e2.disAngle; })), d2 = e2.getDataPointsPos(e2.dataRadius[n3], e2.angleArr[n3]); var h3 = e2.createPaths(d2, { x: 0, y: 0 }); g2 = e2.graphics.group({ class: "apexcharts-series-markers-wrap apexcharts-element-hidden" }), p2 = e2.graphics.group({ class: "apexcharts-datalabels", "data:realIndex": n3 }), i2.globals.delayedElements.push({ el: g2.node, index: n3 }); var c3 = { i: n3, realIndex: n3, animationDelay: n3, initialSpeed: i2.config.chart.animations.speed, dataChangeSpeed: i2.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-radar", shouldClipToGrid: false, bindEventsOnPaths: false, stroke: i2.globals.stroke.colors[n3], strokeLineCap: i2.config.stroke.lineCap }, f3 = null; i2.globals.previousPaths.length > 0 && (f3 = e2.getPreviousPath(n3)); for (var x2 = 0; x2 < h3.linePathsTo.length; x2++) { var b2 = e2.graphics.renderPaths(u(u({}, c3), {}, { pathFrom: null === f3 ? h3.linePathsFrom[x2] : f3, pathTo: h3.linePathsTo[x2], strokeWidth: Array.isArray(e2.strokeWidth) ? e2.strokeWidth[n3] : e2.strokeWidth, fill: "none", drawShadow: false })); l3.add(b2); var m2 = a2.fillPath({ seriesNumber: n3 }), y2 = e2.graphics.renderPaths(u(u({}, c3), {}, { pathFrom: null === f3 ? h3.areaPathsFrom[x2] : f3, pathTo: h3.areaPathsTo[x2], strokeWidth: 0, fill: m2, drawShadow: false })); if (i2.config.chart.dropShadow.enabled) { var w2 = new Li(e2.ctx), k2 = i2.config.chart.dropShadow; w2.dropShadow(y2, Object.assign({}, k2, { noUserSpaceOnUse: true }), n3); } l3.add(y2); } t4.forEach((function(t5, a3) { var s3 = new Vi(e2.ctx).getMarkerConfig({ cssClass: "apexcharts-marker", seriesIndex: n3, dataPointIndex: a3 }), o4 = e2.graphics.drawMarker(d2[a3].x, d2[a3].y, s3); o4.attr("rel", a3), o4.attr("j", a3), o4.attr("index", n3), o4.node.setAttribute("default-marker-size", s3.pSize); var h4 = e2.graphics.group({ class: "apexcharts-series-markers" }); h4 && h4.add(o4), g2.add(h4), l3.add(g2); var c4 = i2.config.dataLabels; if (c4.enabled) { var f4 = c4.formatter(i2.globals.series[n3][a3], { seriesIndex: n3, dataPointIndex: a3, w: i2 }); r2.plotDataLabelsText({ x: d2[a3].x, y: d2[a3].y, text: f4, textAnchor: "middle", i: n3, j: n3, parent: p2, offsetCorrection: false, dataLabelsConfig: u({}, c4) }); } l3.add(p2); })), s2.push(l3); })), this.drawPolygons({ parent: c2 }), i2.config.xaxis.labels.show) { var f2 = this.drawXAxisTexts(); c2.add(f2); } return s2.forEach((function(t4) { c2.add(t4); })), c2.add(this.yaxisLabels), c2; } }, { key: "drawPolygons", value: function(t3) { for (var e2 = this, i2 = this.w, a2 = t3.parent, s2 = new Ea(this.ctx), r2 = i2.globals.yAxisScale[0].result.reverse(), n2 = r2.length, o2 = [], l2 = this.size / (n2 - 1), h2 = 0; h2 < n2; h2++) o2[h2] = l2 * h2; o2.reverse(); var c2 = [], d2 = []; o2.forEach((function(t4, i3) { var a3 = v.getPolygonPos(t4, e2.dataPointsLen), s3 = ""; a3.forEach((function(t5, a4) { if (0 === i3) { var r3 = e2.graphics.drawLine(t5.x, t5.y, 0, 0, Array.isArray(e2.polygons.connectorColors) ? e2.polygons.connectorColors[a4] : e2.polygons.connectorColors); d2.push(r3); } 0 === a4 && e2.yaxisLabelsTextsPos.push({ x: t5.x, y: t5.y }), s3 += t5.x + "," + t5.y + " "; })), c2.push(s3); })), c2.forEach((function(t4, s3) { var r3 = e2.polygons.strokeColors, n3 = e2.polygons.strokeWidth, o3 = e2.graphics.drawPolygon(t4, Array.isArray(r3) ? r3[s3] : r3, Array.isArray(n3) ? n3[s3] : n3, i2.globals.radarPolygons.fill.colors[s3]); a2.add(o3); })), d2.forEach((function(t4) { a2.add(t4); })), i2.config.yaxis[0].show && this.yaxisLabelsTextsPos.forEach((function(t4, i3) { var a3 = s2.drawYAxisTexts(t4.x, t4.y, i3, r2[i3]); e2.yaxisLabels.add(a3); })); } }, { key: "drawXAxisTexts", value: function() { var t3 = this, e2 = this.w, i2 = e2.config.xaxis.labels, a2 = this.graphics.group({ class: "apexcharts-xaxis" }), s2 = v.getPolygonPos(this.size, this.dataPointsLen); return e2.globals.labels.forEach((function(r2, n2) { var o2 = e2.config.xaxis.labels.formatter, l2 = new qi(t3.ctx); if (s2[n2]) { var h2 = t3.getTextPos(s2[n2], t3.size), c2 = o2(r2, { seriesIndex: -1, dataPointIndex: n2, w: e2 }); l2.plotDataLabelsText({ x: h2.newX, y: h2.newY, text: c2, textAnchor: h2.textAnchor, i: n2, j: n2, parent: a2, className: "apexcharts-xaxis-label", color: Array.isArray(i2.style.colors) && i2.style.colors[n2] ? i2.style.colors[n2] : "#a8a8a8", dataLabelsConfig: u({ textAnchor: h2.textAnchor, dropShadow: { enabled: false } }, i2), offsetCorrection: false }).on("click", (function(i3) { if ("function" == typeof e2.config.chart.events.xAxisLabelClick) { var a3 = Object.assign({}, e2, { labelIndex: n2 }); e2.config.chart.events.xAxisLabelClick(i3, t3.ctx, a3); } })); } })), a2; } }, { key: "createPaths", value: function(t3, e2) { var i2 = this, a2 = [], s2 = [], r2 = [], n2 = []; if (t3.length) { s2 = [this.graphics.move(e2.x, e2.y)], n2 = [this.graphics.move(e2.x, e2.y)]; var o2 = this.graphics.move(t3[0].x, t3[0].y), l2 = this.graphics.move(t3[0].x, t3[0].y); t3.forEach((function(e3, a3) { o2 += i2.graphics.line(e3.x, e3.y), l2 += i2.graphics.line(e3.x, e3.y), a3 === t3.length - 1 && (o2 += "Z", l2 += "Z"); })), a2.push(o2), r2.push(l2); } return { linePathsFrom: s2, linePathsTo: a2, areaPathsFrom: n2, areaPathsTo: r2 }; } }, { key: "getTextPos", value: function(t3, e2) { var i2 = "middle", a2 = t3.x, s2 = t3.y; return Math.abs(t3.x) >= 10 ? t3.x > 0 ? (i2 = "start", a2 += 10) : t3.x < 0 && (i2 = "end", a2 -= 10) : i2 = "middle", Math.abs(t3.y) >= e2 - 10 && (t3.y < 0 ? s2 -= 10 : t3.y > 0 && (s2 += 10)), { textAnchor: i2, newX: a2, newY: s2 }; } }, { key: "getPreviousPath", value: function(t3) { for (var e2 = this.w, i2 = null, a2 = 0; a2 < e2.globals.previousPaths.length; a2++) { var s2 = e2.globals.previousPaths[a2]; s2.paths.length > 0 && parseInt(s2.realIndex, 10) === parseInt(t3, 10) && void 0 !== e2.globals.previousPaths[a2].paths[0] && (i2 = e2.globals.previousPaths[a2].paths[0].d); } return i2; } }, { key: "getDataPointsPos", value: function(t3, e2) { var i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.dataPointsLen; t3 = t3 || [], e2 = e2 || []; for (var a2 = [], s2 = 0; s2 < i2; s2++) { var r2 = {}; r2.x = t3[s2] * Math.sin(e2[s2]), r2.y = -t3[s2] * Math.cos(e2[s2]), a2.push(r2); } return a2; } }]), t2; })(); var Oa = (function(t2) { h(r2, Ya); var a2 = n(r2); function r2(t3) { var s2; i(this, r2), (s2 = a2.call(this, t3)).ctx = t3, s2.w = t3.w, s2.animBeginArr = [0], s2.animDur = 0; var n2 = s2.w; return s2.startAngle = n2.config.plotOptions.radialBar.startAngle, s2.endAngle = n2.config.plotOptions.radialBar.endAngle, s2.totalAngle = Math.abs(n2.config.plotOptions.radialBar.endAngle - n2.config.plotOptions.radialBar.startAngle), s2.trackStartAngle = n2.config.plotOptions.radialBar.track.startAngle, s2.trackEndAngle = n2.config.plotOptions.radialBar.track.endAngle, s2.barLabels = s2.w.config.plotOptions.radialBar.barLabels, s2.donutDataLabels = s2.w.config.plotOptions.radialBar.dataLabels, s2.radialDataLabels = s2.donutDataLabels, s2.trackStartAngle || (s2.trackStartAngle = s2.startAngle), s2.trackEndAngle || (s2.trackEndAngle = s2.endAngle), 360 === s2.endAngle && (s2.endAngle = 359.99), s2.margin = parseInt(n2.config.plotOptions.radialBar.track.margin, 10), s2.onBarLabelClick = s2.onBarLabelClick.bind(e(s2)), s2; } return s(r2, [{ key: "draw", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a3 = i2.group({ class: "apexcharts-radialbar" }); if (e2.globals.noData) return a3; var s2 = i2.group(), r3 = this.defaultSize / 2, n2 = e2.globals.gridWidth / 2, o2 = this.defaultSize / 2.05; e2.config.chart.sparkline.enabled || (o2 = o2 - e2.config.stroke.width - e2.config.chart.dropShadow.blur); var l2 = e2.globals.fill.colors; if (e2.config.plotOptions.radialBar.track.show) { var h2 = this.drawTracks({ size: o2, centerX: n2, centerY: r3, colorArr: l2, series: t3 }); s2.add(h2); } var c2 = this.drawArcs({ size: o2, centerX: n2, centerY: r3, colorArr: l2, series: t3 }), d2 = 360; e2.config.plotOptions.radialBar.startAngle < 0 && (d2 = this.totalAngle); var u2 = (360 - d2) / 360; if (e2.globals.radialSize = o2 - o2 * u2, this.radialDataLabels.value.show) { var g2 = Math.max(this.radialDataLabels.value.offsetY, this.radialDataLabels.name.offsetY); e2.globals.radialSize += g2 * u2; } return s2.add(c2.g), "front" === e2.config.plotOptions.radialBar.hollow.position && (c2.g.add(c2.elHollow), c2.dataLabels && c2.g.add(c2.dataLabels)), a3.add(s2), a3; } }, { key: "drawTracks", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a3 = i2.group({ class: "apexcharts-tracks" }), s2 = new Li(this.ctx), r3 = new ji(this.ctx), n2 = this.getStrokeWidth(t3); t3.size = t3.size - n2 / 2; for (var o2 = 0; o2 < t3.series.length; o2++) { var l2 = i2.group({ class: "apexcharts-radialbar-track apexcharts-track" }); a3.add(l2), l2.attr({ rel: o2 + 1 }), t3.size = t3.size - n2 - this.margin; var h2 = e2.config.plotOptions.radialBar.track, c2 = r3.fillPath({ seriesNumber: 0, size: t3.size, fillColors: Array.isArray(h2.background) ? h2.background[o2] : h2.background, solid: true }), d2 = this.trackStartAngle, u2 = this.trackEndAngle; Math.abs(u2) + Math.abs(d2) >= 360 && (u2 = 360 - Math.abs(this.startAngle) - 0.1); var g2 = i2.drawPath({ d: "", stroke: c2, strokeWidth: n2 * parseInt(h2.strokeWidth, 10) / 100, fill: "none", strokeOpacity: h2.opacity, classes: "apexcharts-radialbar-area" }); if (h2.dropShadow.enabled) { var p2 = h2.dropShadow; s2.dropShadow(g2, p2); } l2.add(g2), g2.attr("id", "apexcharts-radialbarTrack-" + o2), this.animatePaths(g2, { centerX: t3.centerX, centerY: t3.centerY, endAngle: u2, startAngle: d2, size: t3.size, i: o2, totalItems: 2, animBeginArr: 0, dur: 0, isTrack: true }); } return a3; } }, { key: "drawArcs", value: function(t3) { var e2 = this.w, i2 = new Mi(this.ctx), a3 = new ji(this.ctx), s2 = new Li(this.ctx), r3 = i2.group(), n2 = this.getStrokeWidth(t3); t3.size = t3.size - n2 / 2; var o2 = e2.config.plotOptions.radialBar.hollow.background, l2 = t3.size - n2 * t3.series.length - this.margin * t3.series.length - n2 * parseInt(e2.config.plotOptions.radialBar.track.strokeWidth, 10) / 100 / 2, h2 = l2 - e2.config.plotOptions.radialBar.hollow.margin; void 0 !== e2.config.plotOptions.radialBar.hollow.image && (o2 = this.drawHollowImage(t3, r3, l2, o2)); var c2 = this.drawHollow({ size: h2, centerX: t3.centerX, centerY: t3.centerY, fill: o2 || "transparent" }); if (e2.config.plotOptions.radialBar.hollow.dropShadow.enabled) { var d2 = e2.config.plotOptions.radialBar.hollow.dropShadow; s2.dropShadow(c2, d2); } var u2 = 1; !this.radialDataLabels.total.show && e2.globals.series.length > 1 && (u2 = 0); var g2 = null; if (this.radialDataLabels.show) { var p2 = e2.globals.dom.Paper.findOne(".apexcharts-datalabels-group"); g2 = this.renderInnerDataLabels(p2, this.radialDataLabels, { hollowSize: l2, centerX: t3.centerX, centerY: t3.centerY, opacity: u2 }); } "back" === e2.config.plotOptions.radialBar.hollow.position && (r3.add(c2), g2 && r3.add(g2)); var f2 = false; e2.config.plotOptions.radialBar.inverseOrder && (f2 = true); for (var x2 = f2 ? t3.series.length - 1 : 0; f2 ? x2 >= 0 : x2 < t3.series.length; f2 ? x2-- : x2++) { var b2 = i2.group({ class: "apexcharts-series apexcharts-radial-series", seriesName: v.escapeString(e2.globals.seriesNames[x2]) }); r3.add(b2), b2.attr({ rel: x2 + 1, "data:realIndex": x2 }), this.ctx.series.addCollapsedClassToSeries(b2, x2), t3.size = t3.size - n2 - this.margin; var m2 = a3.fillPath({ seriesNumber: x2, size: t3.size, value: t3.series[x2] }), y2 = this.startAngle, w2 = void 0, k2 = v.negToZero(t3.series[x2] > 100 ? 100 : t3.series[x2]) / 100, A2 = Math.round(this.totalAngle * k2) + this.startAngle, C2 = void 0; e2.globals.dataChanged && (w2 = this.startAngle, C2 = Math.round(this.totalAngle * v.negToZero(e2.globals.previousPaths[x2]) / 100) + w2), Math.abs(A2) + Math.abs(y2) > 360 && (A2 -= 0.01), Math.abs(C2) + Math.abs(w2) > 360 && (C2 -= 0.01); var S2 = A2 - y2, L2 = Array.isArray(e2.config.stroke.dashArray) ? e2.config.stroke.dashArray[x2] : e2.config.stroke.dashArray, M2 = i2.drawPath({ d: "", stroke: m2, strokeWidth: n2, fill: "none", fillOpacity: e2.config.fill.opacity, classes: "apexcharts-radialbar-area apexcharts-radialbar-slice-" + x2, strokeDashArray: L2 }); if (Mi.setAttrs(M2.node, { "data:angle": S2, "data:value": t3.series[x2] }), e2.config.chart.dropShadow.enabled) { var P2 = e2.config.chart.dropShadow; s2.dropShadow(M2, P2, x2); } if (s2.setSelectionFilter(M2, 0, x2), this.addListeners(M2, this.radialDataLabels), b2.add(M2), M2.attr({ index: 0, j: x2 }), this.barLabels.enabled) { var I2 = v.polarToCartesian(t3.centerX, t3.centerY, t3.size, y2), T2 = this.barLabels.formatter(e2.globals.seriesNames[x2], { seriesIndex: x2, w: e2 }), z2 = ["apexcharts-radialbar-label"]; this.barLabels.onClick || z2.push("apexcharts-no-click"); var X2 = this.barLabels.useSeriesColors ? e2.globals.colors[x2] : e2.config.chart.foreColor; X2 || (X2 = e2.config.chart.foreColor); var R2 = I2.x + this.barLabels.offsetX, E2 = I2.y + this.barLabels.offsetY, Y2 = i2.drawText({ x: R2, y: E2, text: T2, textAnchor: "end", dominantBaseline: "middle", fontFamily: this.barLabels.fontFamily, fontWeight: this.barLabels.fontWeight, fontSize: this.barLabels.fontSize, foreColor: X2, cssClass: z2.join(" ") }); Y2.on("click", this.onBarLabelClick), Y2.attr({ rel: x2 + 1 }), 0 !== y2 && Y2.attr({ "transform-origin": "".concat(R2, " ").concat(E2), transform: "rotate(".concat(y2, " 0 0)") }), b2.add(Y2); } var H2 = 0; !this.initialAnim || e2.globals.resized || e2.globals.dataChanged || (H2 = e2.config.chart.animations.speed), e2.globals.dataChanged && (H2 = e2.config.chart.animations.dynamicAnimation.speed), this.animDur = H2 / (1.2 * t3.series.length) + this.animDur, this.animBeginArr.push(this.animDur), this.animatePaths(M2, { centerX: t3.centerX, centerY: t3.centerY, endAngle: A2, startAngle: y2, prevEndAngle: C2, prevStartAngle: w2, size: t3.size, i: x2, totalItems: 2, animBeginArr: this.animBeginArr, dur: H2, shouldSetPrevPaths: true }); } return { g: r3, elHollow: c2, dataLabels: g2 }; } }, { key: "drawHollow", value: function(t3) { var e2 = new Mi(this.ctx).drawCircle(2 * t3.size); return e2.attr({ class: "apexcharts-radialbar-hollow", cx: t3.centerX, cy: t3.centerY, r: t3.size, fill: t3.fill }), e2; } }, { key: "drawHollowImage", value: function(t3, e2, i2, a3) { var s2 = this.w, r3 = new ji(this.ctx), n2 = v.randomId(), o2 = s2.config.plotOptions.radialBar.hollow.image; if (s2.config.plotOptions.radialBar.hollow.imageClipped) r3.clippedImgArea({ width: i2, height: i2, image: o2, patternID: "pattern".concat(s2.globals.cuid).concat(n2) }), a3 = "url(#pattern".concat(s2.globals.cuid).concat(n2, ")"); else { var l2 = s2.config.plotOptions.radialBar.hollow.imageWidth, h2 = s2.config.plotOptions.radialBar.hollow.imageHeight; if (void 0 === l2 && void 0 === h2) { var c2 = s2.globals.dom.Paper.image(o2, (function(e3) { this.move(t3.centerX - e3.width / 2 + s2.config.plotOptions.radialBar.hollow.imageOffsetX, t3.centerY - e3.height / 2 + s2.config.plotOptions.radialBar.hollow.imageOffsetY); })); e2.add(c2); } else { var d2 = s2.globals.dom.Paper.image(o2, (function(e3) { this.move(t3.centerX - l2 / 2 + s2.config.plotOptions.radialBar.hollow.imageOffsetX, t3.centerY - h2 / 2 + s2.config.plotOptions.radialBar.hollow.imageOffsetY), this.size(l2, h2); })); e2.add(d2); } } return a3; } }, { key: "getStrokeWidth", value: function(t3) { var e2 = this.w; return t3.size * (100 - parseInt(e2.config.plotOptions.radialBar.hollow.size, 10)) / 100 / (t3.series.length + 1) - this.margin; } }, { key: "onBarLabelClick", value: function(t3) { var e2 = parseInt(t3.target.getAttribute("rel"), 10) - 1, i2 = this.barLabels.onClick, a3 = this.w; i2 && i2(a3.globals.seriesNames[e2], { w: a3, seriesIndex: e2 }); } }]), r2; })(); var Fa = (function(t2) { h(a2, Ia); var e2 = n(a2); function a2() { return i(this, a2), e2.apply(this, arguments); } return s(a2, [{ key: "draw", value: function(t3, e3) { var i2 = this.w, a3 = new Mi(this.ctx); this.rangeBarOptions = this.w.config.plotOptions.rangeBar, this.series = t3, this.seriesRangeStart = i2.globals.seriesRangeStart, this.seriesRangeEnd = i2.globals.seriesRangeEnd, this.barHelpers.initVariables(t3); for (var s2 = a3.group({ class: "apexcharts-rangebar-series apexcharts-plot-series" }), r2 = 0; r2 < t3.length; r2++) { var n2, o2, l2, h2, c2 = void 0, d2 = void 0, g2 = i2.globals.comboCharts ? e3[r2] : r2, p2 = this.barHelpers.getGroupIndex(g2).columnGroupIndex, f2 = a3.group({ class: "apexcharts-series", seriesName: v.escapeString(i2.globals.seriesNames[g2]), rel: r2 + 1, "data:realIndex": g2 }); this.ctx.series.addCollapsedClassToSeries(f2, g2), t3[r2].length > 0 && (this.visibleI = this.visibleI + 1); var x2 = 0, b2 = 0, m2 = 0; this.yRatio.length > 1 && (this.yaxisIndex = i2.globals.seriesYAxisReverseMap[g2][0], m2 = g2); var y2 = this.barHelpers.initialPositions(g2); d2 = y2.y, h2 = y2.zeroW, c2 = y2.x, b2 = y2.barWidth, x2 = y2.barHeight, n2 = y2.xDivision, o2 = y2.yDivision, l2 = y2.zeroH; for (var w2 = a3.group({ class: "apexcharts-datalabels", "data:realIndex": g2 }), k2 = a3.group({ class: "apexcharts-rangebar-goals-markers" }), A2 = 0; A2 < i2.globals.dataPoints; A2++) { var C2 = this.barHelpers.getStrokeWidth(r2, A2, g2), S2 = this.seriesRangeStart[r2][A2], L2 = this.seriesRangeEnd[r2][A2], M2 = null, P2 = null, I2 = null, T2 = { x: c2, y: d2, strokeWidth: C2, elSeries: f2 }, z2 = this.seriesLen; if (i2.config.plotOptions.bar.rangeBarGroupRows && (z2 = 1), void 0 === i2.config.series[r2].data[A2]) break; if (this.isHorizontal) { I2 = d2 + x2 * this.visibleI; var X2 = (o2 - x2 * z2) / 2; if (i2.config.series[r2].data[A2].x) { var R2 = this.detectOverlappingBars({ i: r2, j: A2, barYPosition: I2, srty: X2, barHeight: x2, yDivision: o2, initPositions: y2 }); x2 = R2.barHeight, I2 = R2.barYPosition; } b2 = (M2 = this.drawRangeBarPaths(u({ indexes: { i: r2, j: A2, realIndex: g2 }, barHeight: x2, barYPosition: I2, zeroW: h2, yDivision: o2, y1: S2, y2: L2 }, T2))).barWidth; } else { i2.globals.isXNumeric && (c2 = (i2.globals.seriesX[r2][A2] - i2.globals.minX) / this.xRatio - b2 / 2), P2 = c2 + b2 * this.visibleI; var E2 = (n2 - b2 * z2) / 2; if (i2.config.series[r2].data[A2].x) { var Y2 = this.detectOverlappingBars({ i: r2, j: A2, barXPosition: P2, srtx: E2, barWidth: b2, xDivision: n2, initPositions: y2 }); b2 = Y2.barWidth, P2 = Y2.barXPosition; } x2 = (M2 = this.drawRangeColumnPaths(u({ indexes: { i: r2, j: A2, realIndex: g2, translationsIndex: m2 }, barWidth: b2, barXPosition: P2, zeroH: l2, xDivision: n2 }, T2))).barHeight; } var H2 = this.barHelpers.drawGoalLine({ barXPosition: M2.barXPosition, barYPosition: I2, goalX: M2.goalX, goalY: M2.goalY, barHeight: x2, barWidth: b2 }); H2 && k2.add(H2), d2 = M2.y, c2 = M2.x; var O2 = this.barHelpers.getPathFillColor(t3, r2, A2, g2); this.renderSeries({ realIndex: g2, pathFill: O2.color, lineFill: O2.useRangeColor ? O2.color : i2.globals.stroke.colors[g2], j: A2, i: r2, x: c2, y: d2, y1: S2, y2: L2, pathFrom: M2.pathFrom, pathTo: M2.pathTo, strokeWidth: C2, elSeries: f2, series: t3, barHeight: x2, barWidth: b2, barXPosition: P2, barYPosition: I2, columnGroupIndex: p2, elDataLabelsWrap: w2, elGoalsMarkers: k2, visibleSeries: this.visibleI, type: "rangebar" }); } s2.add(f2); } return s2; } }, { key: "detectOverlappingBars", value: function(t3) { var e3 = t3.i, i2 = t3.j, a3 = t3.barYPosition, s2 = t3.barXPosition, r2 = t3.srty, n2 = t3.srtx, o2 = t3.barHeight, l2 = t3.barWidth, h2 = t3.yDivision, c2 = t3.xDivision, d2 = t3.initPositions, u2 = this.w, g2 = [], p2 = u2.config.series[e3].data[i2].rangeName, f2 = u2.config.series[e3].data[i2].x, x2 = Array.isArray(f2) ? f2.join(" ") : f2, b2 = u2.globals.labels.map((function(t4) { return Array.isArray(t4) ? t4.join(" ") : t4; })).indexOf(x2), m2 = u2.globals.seriesRange[e3].findIndex((function(t4) { return t4.x === x2 && t4.overlaps.length > 0; })); return this.isHorizontal ? (a3 = u2.config.plotOptions.bar.rangeBarGroupRows ? r2 + h2 * b2 : r2 + o2 * this.visibleI + h2 * b2, m2 > -1 && !u2.config.plotOptions.bar.rangeBarOverlap && (g2 = u2.globals.seriesRange[e3][m2].overlaps).indexOf(p2) > -1 && (a3 = (o2 = d2.barHeight / g2.length) * this.visibleI + h2 * (100 - parseInt(this.barOptions.barHeight, 10)) / 100 / 2 + o2 * (this.visibleI + g2.indexOf(p2)) + h2 * b2)) : (b2 > -1 && !u2.globals.timescaleLabels.length && (s2 = u2.config.plotOptions.bar.rangeBarGroupRows ? n2 + c2 * b2 : n2 + l2 * this.visibleI + c2 * b2), m2 > -1 && !u2.config.plotOptions.bar.rangeBarOverlap && (g2 = u2.globals.seriesRange[e3][m2].overlaps).indexOf(p2) > -1 && (s2 = (l2 = d2.barWidth / g2.length) * this.visibleI + c2 * (100 - parseInt(this.barOptions.barWidth, 10)) / 100 / 2 + l2 * (this.visibleI + g2.indexOf(p2)) + c2 * b2)), { barYPosition: a3, barXPosition: s2, barHeight: o2, barWidth: l2 }; } }, { key: "drawRangeColumnPaths", value: function(t3) { var e3 = t3.indexes, i2 = t3.x, a3 = t3.xDivision, s2 = t3.barWidth, r2 = t3.barXPosition, n2 = t3.zeroH, o2 = this.w, l2 = e3.i, h2 = e3.j, c2 = e3.realIndex, d2 = e3.translationsIndex, u2 = this.yRatio[d2], g2 = this.getRangeValue(c2, h2), p2 = Math.min(g2.start, g2.end), f2 = Math.max(g2.start, g2.end); void 0 === this.series[l2][h2] || null === this.series[l2][h2] ? p2 = n2 : (p2 = n2 - p2 / u2, f2 = n2 - f2 / u2); var x2 = Math.abs(f2 - p2), b2 = this.barHelpers.getColumnPaths({ barXPosition: r2, barWidth: s2, y1: p2, y2: f2, strokeWidth: this.strokeWidth, series: this.seriesRangeEnd, realIndex: c2, i: c2, j: h2, w: o2 }); if (o2.globals.isXNumeric) { var m2 = this.getBarXForNumericXAxis({ x: i2, j: h2, realIndex: c2, barWidth: s2 }); i2 = m2.x, r2 = m2.barXPosition; } else i2 += a3; return { pathTo: b2.pathTo, pathFrom: b2.pathFrom, barHeight: x2, x: i2, y: g2.start < 0 && g2.end < 0 ? p2 : f2, goalY: this.barHelpers.getGoalValues("y", null, n2, l2, h2, d2), barXPosition: r2 }; } }, { key: "preventBarOverflow", value: function(t3) { var e3 = this.w; return t3 < 0 && (t3 = 0), t3 > e3.globals.gridWidth && (t3 = e3.globals.gridWidth), t3; } }, { key: "drawRangeBarPaths", value: function(t3) { var e3 = t3.indexes, i2 = t3.y, a3 = t3.y1, s2 = t3.y2, r2 = t3.yDivision, n2 = t3.barHeight, o2 = t3.barYPosition, l2 = t3.zeroW, h2 = this.w, c2 = e3.realIndex, d2 = e3.j, u2 = this.preventBarOverflow(l2 + a3 / this.invertedYRatio), g2 = this.preventBarOverflow(l2 + s2 / this.invertedYRatio), p2 = this.getRangeValue(c2, d2), f2 = Math.abs(g2 - u2), x2 = this.barHelpers.getBarpaths({ barYPosition: o2, barHeight: n2, x1: u2, x2: g2, strokeWidth: this.strokeWidth, series: this.seriesRangeEnd, i: c2, realIndex: c2, j: d2, w: h2 }); return h2.globals.isXNumeric || (i2 += r2), { pathTo: x2.pathTo, pathFrom: x2.pathFrom, barWidth: f2, x: p2.start < 0 && p2.end < 0 ? u2 : g2, goalX: this.barHelpers.getGoalValues("x", l2, null, c2, d2), y: i2 }; } }, { key: "getRangeValue", value: function(t3, e3) { var i2 = this.w; return { start: i2.globals.seriesRangeStart[t3][e3], end: i2.globals.seriesRangeEnd[t3][e3] }; } }]), a2; })(); var Da = (function() { function t2(e2) { i(this, t2), this.w = e2.w, this.lineCtx = e2; } return s(t2, [{ key: "sameValueSeriesFix", value: function(t3, e2) { var i2 = this.w; if (("gradient" === i2.config.fill.type || "gradient" === i2.config.fill.type[t3]) && new Pi(this.lineCtx.ctx, i2).seriesHaveSameValues(t3)) { var a2 = e2[t3].slice(); a2[a2.length - 1] = a2[a2.length - 1] + 1e-6, e2[t3] = a2; } return e2; } }, { key: "calculatePoints", value: function(t3) { var e2 = t3.series, i2 = t3.realIndex, a2 = t3.x, s2 = t3.y, r2 = t3.i, n2 = t3.j, o2 = t3.prevY, l2 = this.w, h2 = [], c2 = [], d2 = this.lineCtx.categoryAxisCorrection + l2.config.markers.offsetX; return l2.globals.isXNumeric && (d2 = (l2.globals.seriesX[i2][0] - l2.globals.minX) / this.lineCtx.xRatio + l2.config.markers.offsetX), 0 === n2 && (h2.push(d2), c2.push(v.isNumber(e2[r2][0]) ? o2 + l2.config.markers.offsetY : null)), h2.push(a2 + l2.config.markers.offsetX), c2.push(v.isNumber(e2[r2][n2 + 1]) ? s2 + l2.config.markers.offsetY : null), { x: h2, y: c2 }; } }, { key: "checkPreviousPaths", value: function(t3) { for (var e2 = t3.pathFromLine, i2 = t3.pathFromArea, a2 = t3.realIndex, s2 = this.w, r2 = 0; r2 < s2.globals.previousPaths.length; r2++) { var n2 = s2.globals.previousPaths[r2]; ("line" === n2.type || "area" === n2.type) && n2.paths.length > 0 && parseInt(n2.realIndex, 10) === parseInt(a2, 10) && ("line" === n2.type ? (this.lineCtx.appendPathFrom = false, e2 = s2.globals.previousPaths[r2].paths[0].d) : "area" === n2.type && (this.lineCtx.appendPathFrom = false, i2 = s2.globals.previousPaths[r2].paths[0].d, s2.config.stroke.show && s2.globals.previousPaths[r2].paths[1] && (e2 = s2.globals.previousPaths[r2].paths[1].d))); } return { pathFromLine: e2, pathFromArea: i2 }; } }, { key: "determineFirstPrevY", value: function(t3) { var e2, i2, a2, s2 = t3.i, r2 = t3.realIndex, n2 = t3.series, o2 = t3.prevY, l2 = t3.lineYPosition, h2 = t3.translationsIndex, c2 = this.w, d2 = c2.config.chart.stacked && !c2.globals.comboCharts || c2.config.chart.stacked && c2.globals.comboCharts && (!this.w.config.chart.stackOnlyBar || "bar" === (null === (e2 = this.w.config.series[r2]) || void 0 === e2 ? void 0 : e2.type) || "column" === (null === (i2 = this.w.config.series[r2]) || void 0 === i2 ? void 0 : i2.type)); if (void 0 !== (null === (a2 = n2[s2]) || void 0 === a2 ? void 0 : a2[0])) o2 = (l2 = d2 && s2 > 0 ? this.lineCtx.prevSeriesY[s2 - 1][0] : this.lineCtx.zeroY) - n2[s2][0] / this.lineCtx.yRatio[h2] + 2 * (this.lineCtx.isReversed ? n2[s2][0] / this.lineCtx.yRatio[h2] : 0); else if (d2 && s2 > 0 && void 0 === n2[s2][0]) { for (var u2 = s2 - 1; u2 >= 0; u2--) if (null !== n2[u2][0] && void 0 !== n2[u2][0]) { o2 = l2 = this.lineCtx.prevSeriesY[u2][0]; break; } } return { prevY: o2, lineYPosition: l2 }; } }]), t2; })(); var _a = function(t2) { for (var e2, i2, a2, s2, r2 = (function(t3) { for (var e3 = [], i3 = t3[0], a3 = t3[1], s3 = e3[0] = Ba(i3, a3), r3 = 1, n3 = t3.length - 1; r3 < n3; r3++) i3 = a3, a3 = t3[r3 + 1], e3[r3] = 0.5 * (s3 + (s3 = Ba(i3, a3))); return e3[r3] = s3, e3; })(t2), n2 = t2.length - 1, o2 = [], l2 = 0; l2 < n2; l2++) a2 = Ba(t2[l2], t2[l2 + 1]), Math.abs(a2) < 1e-6 ? r2[l2] = r2[l2 + 1] = 0 : (s2 = (e2 = r2[l2] / a2) * e2 + (i2 = r2[l2 + 1] / a2) * i2) > 9 && (s2 = 3 * a2 / Math.sqrt(s2), r2[l2] = s2 * e2, r2[l2 + 1] = s2 * i2); for (var h2 = 0; h2 <= n2; h2++) s2 = (t2[Math.min(n2, h2 + 1)][0] - t2[Math.max(0, h2 - 1)][0]) / (6 * (1 + r2[h2] * r2[h2])), o2.push([s2 || 0, r2[h2] * s2 || 0]); return o2; }; var Na = function(t2) { var e2 = _a(t2), i2 = t2[1], a2 = t2[0], s2 = [], r2 = e2[1], n2 = e2[0]; s2.push(a2, [a2[0] + n2[0], a2[1] + n2[1], i2[0] - r2[0], i2[1] - r2[1], i2[0], i2[1]]); for (var o2 = 2, l2 = e2.length; o2 < l2; o2++) { var h2 = t2[o2], c2 = e2[o2]; s2.push([h2[0] - c2[0], h2[1] - c2[1], h2[0], h2[1]]); } return s2; }; var Wa = function(t2, e2, i2) { var a2 = t2.slice(e2, i2); if (e2) { if (i2 - e2 > 1 && a2[1].length < 6) { var s2 = a2[0].length; a2[1] = [2 * a2[0][s2 - 2] - a2[0][s2 - 4], 2 * a2[0][s2 - 1] - a2[0][s2 - 3]].concat(a2[1]); } a2[0] = a2[0].slice(-2); } return a2; }; function Ba(t2, e2) { return (e2[1] - t2[1]) / (e2[0] - t2[0]); } var Ga = (function() { function t2(e2, a2, s2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.xyRatios = a2, this.pointsChart = !("bubble" !== this.w.config.chart.type && "scatter" !== this.w.config.chart.type) || s2, this.scatter = new Ui(this.ctx), this.noNegatives = this.w.globals.minX === Number.MAX_VALUE, this.lineHelpers = new Da(this), this.markers = new Vi(this.ctx), this.prevSeriesY = [], this.categoryAxisCorrection = 0, this.yaxisIndex = 0; } return s(t2, [{ key: "draw", value: function(t3, e2, i2, a2) { var s2, r2 = this.w, n2 = new Mi(this.ctx), o2 = r2.globals.comboCharts ? e2 : r2.config.chart.type, l2 = n2.group({ class: "apexcharts-".concat(o2, "-series apexcharts-plot-series") }), h2 = new Pi(this.ctx, r2); this.yRatio = this.xyRatios.yRatio, this.zRatio = this.xyRatios.zRatio, this.xRatio = this.xyRatios.xRatio, this.baseLineY = this.xyRatios.baseLineY, t3 = h2.getLogSeries(t3), this.yRatio = h2.getLogYRatios(this.yRatio), this.prevSeriesY = []; for (var c2 = [], d2 = 0; d2 < t3.length; d2++) { t3 = this.lineHelpers.sameValueSeriesFix(d2, t3); var g2 = r2.globals.comboCharts ? i2[d2] : d2, p2 = this.yRatio.length > 1 ? g2 : 0; this._initSerieVariables(t3, d2, g2); var f2 = [], x2 = [], b2 = [], m2 = r2.globals.padHorizontal + this.categoryAxisCorrection; this.ctx.series.addCollapsedClassToSeries(this.elSeries, g2), r2.globals.isXNumeric && r2.globals.seriesX.length > 0 && (m2 = (r2.globals.seriesX[g2][0] - r2.globals.minX) / this.xRatio), b2.push(m2); var v2, y2 = m2, w2 = void 0, k2 = y2, A2 = this.zeroY, C2 = this.zeroY; A2 = this.lineHelpers.determineFirstPrevY({ i: d2, realIndex: g2, series: t3, prevY: A2, lineYPosition: 0, translationsIndex: p2 }).prevY, "monotoneCubic" === r2.config.stroke.curve && null === t3[d2][0] ? f2.push(null) : f2.push(A2), v2 = A2; "rangeArea" === o2 && (w2 = C2 = this.lineHelpers.determineFirstPrevY({ i: d2, realIndex: g2, series: a2, prevY: C2, lineYPosition: 0, translationsIndex: p2 }).prevY, x2.push(null !== f2[0] ? C2 : null)); var S2 = this._calculatePathsFrom({ type: o2, series: t3, i: d2, realIndex: g2, translationsIndex: p2, prevX: k2, prevY: A2, prevY2: C2 }), L2 = [f2[0]], M2 = [x2[0]], P2 = { type: o2, series: t3, realIndex: g2, translationsIndex: p2, i: d2, x: m2, y: 1, pX: y2, pY: v2, pathsFrom: S2, linePaths: [], areaPaths: [], seriesIndex: i2, lineYPosition: 0, xArrj: b2, yArrj: f2, y2Arrj: x2, seriesRangeEnd: a2 }, I2 = this._iterateOverDataPoints(u(u({}, P2), {}, { iterations: "rangeArea" === o2 ? t3[d2].length - 1 : void 0, isRangeStart: true })); if ("rangeArea" === o2) { for (var T2 = this._calculatePathsFrom({ series: a2, i: d2, realIndex: g2, prevX: k2, prevY: C2 }), z2 = this._iterateOverDataPoints(u(u({}, P2), {}, { series: a2, xArrj: [m2], yArrj: L2, y2Arrj: M2, pY: w2, areaPaths: I2.areaPaths, pathsFrom: T2, iterations: a2[d2].length - 1, isRangeStart: false })), X2 = I2.linePaths.length / 2, R2 = 0; R2 < X2; R2++) I2.linePaths[R2] = z2.linePaths[R2 + X2] + I2.linePaths[R2]; I2.linePaths.splice(X2), I2.pathFromLine = z2.pathFromLine + I2.pathFromLine; } else I2.pathFromArea += "z"; this._handlePaths({ type: o2, realIndex: g2, i: d2, paths: I2 }), this.elSeries.add(this.elPointsMain), this.elSeries.add(this.elDataLabelsWrap), c2.push(this.elSeries); } if (void 0 !== (null === (s2 = r2.config.series[0]) || void 0 === s2 ? void 0 : s2.zIndex) && c2.sort((function(t4, e3) { return Number(t4.node.getAttribute("zIndex")) - Number(e3.node.getAttribute("zIndex")); })), r2.config.chart.stacked) for (var E2 = c2.length - 1; E2 >= 0; E2--) l2.add(c2[E2]); else for (var Y2 = 0; Y2 < c2.length; Y2++) l2.add(c2[Y2]); return l2; } }, { key: "_initSerieVariables", value: function(t3, e2, i2) { var a2 = this.w, s2 = new Mi(this.ctx); this.xDivision = a2.globals.gridWidth / (a2.globals.dataPoints - ("on" === a2.config.xaxis.tickPlacement ? 1 : 0)), this.strokeWidth = Array.isArray(a2.config.stroke.width) ? a2.config.stroke.width[i2] : a2.config.stroke.width; var r2 = 0; if (this.yRatio.length > 1 && (this.yaxisIndex = a2.globals.seriesYAxisReverseMap[i2], r2 = i2), this.isReversed = a2.config.yaxis[this.yaxisIndex] && a2.config.yaxis[this.yaxisIndex].reversed, this.zeroY = a2.globals.gridHeight - this.baseLineY[r2] - (this.isReversed ? a2.globals.gridHeight : 0) + (this.isReversed ? 2 * this.baseLineY[r2] : 0), this.areaBottomY = this.zeroY, (this.zeroY > a2.globals.gridHeight || "end" === a2.config.plotOptions.area.fillTo) && (this.areaBottomY = a2.globals.gridHeight), this.categoryAxisCorrection = this.xDivision / 2, this.elSeries = s2.group({ class: "apexcharts-series", zIndex: void 0 !== a2.config.series[i2].zIndex ? a2.config.series[i2].zIndex : i2, seriesName: v.escapeString(a2.globals.seriesNames[i2]) }), this.elPointsMain = s2.group({ class: "apexcharts-series-markers-wrap", "data:realIndex": i2 }), a2.globals.hasNullValues) { var n2 = this.markers.plotChartMarkers({ pointsPos: { x: [0], y: [a2.globals.gridHeight + a2.globals.markers.largestSize] }, seriesIndex: e2, j: 0, pSize: 0.1, alwaysDrawMarker: true, isVirtualPoint: true }); null !== n2 && this.elPointsMain.add(n2); } this.elDataLabelsWrap = s2.group({ class: "apexcharts-datalabels", "data:realIndex": i2 }); var o2 = t3[e2].length === a2.globals.dataPoints; this.elSeries.attr({ "data:longestSeries": o2, rel: e2 + 1, "data:realIndex": i2 }), this.appendPathFrom = true; } }, { key: "_calculatePathsFrom", value: function(t3) { var e2, i2, a2, s2, r2 = t3.type, n2 = t3.series, o2 = t3.i, l2 = t3.realIndex, h2 = t3.translationsIndex, c2 = t3.prevX, d2 = t3.prevY, u2 = t3.prevY2, g2 = this.w, p2 = new Mi(this.ctx); if (null === n2[o2][0]) { for (var f2 = 0; f2 < n2[o2].length; f2++) if (null !== n2[o2][f2]) { c2 = this.xDivision * f2, d2 = this.zeroY - n2[o2][f2] / this.yRatio[h2], e2 = p2.move(c2, d2), i2 = p2.move(c2, this.areaBottomY); break; } } else e2 = p2.move(c2, d2), "rangeArea" === r2 && (e2 = p2.move(c2, u2) + p2.line(c2, d2)), i2 = p2.move(c2, this.areaBottomY) + p2.line(c2, d2); if (a2 = p2.move(0, this.areaBottomY) + p2.line(0, this.areaBottomY), s2 = p2.move(0, this.areaBottomY) + p2.line(0, this.areaBottomY), g2.globals.previousPaths.length > 0) { var x2 = this.lineHelpers.checkPreviousPaths({ pathFromLine: a2, pathFromArea: s2, realIndex: l2 }); a2 = x2.pathFromLine, s2 = x2.pathFromArea; } return { prevX: c2, prevY: d2, linePath: e2, areaPath: i2, pathFromLine: a2, pathFromArea: s2 }; } }, { key: "_handlePaths", value: function(t3) { var e2 = t3.type, i2 = t3.realIndex, a2 = t3.i, s2 = t3.paths, r2 = this.w, n2 = new Mi(this.ctx), o2 = new ji(this.ctx); this.prevSeriesY.push(s2.yArrj), r2.globals.seriesXvalues[i2] = s2.xArrj, r2.globals.seriesYvalues[i2] = s2.yArrj; var l2 = r2.config.forecastDataPoints; if (l2.count > 0 && "rangeArea" !== e2) { var h2 = r2.globals.seriesXvalues[i2][r2.globals.seriesXvalues[i2].length - l2.count - 1], c2 = n2.drawRect(h2, 0, r2.globals.gridWidth, r2.globals.gridHeight, 0); r2.globals.dom.elForecastMask.appendChild(c2.node); var d2 = n2.drawRect(0, 0, h2, r2.globals.gridHeight, 0); r2.globals.dom.elNonForecastMask.appendChild(d2.node); } this.pointsChart || r2.globals.delayedElements.push({ el: this.elPointsMain.node, index: i2 }); var g2 = { i: a2, realIndex: i2, animationDelay: a2, initialSpeed: r2.config.chart.animations.speed, dataChangeSpeed: r2.config.chart.animations.dynamicAnimation.speed, className: "apexcharts-".concat(e2) }; if ("area" === e2) for (var p2 = o2.fillPath({ seriesNumber: i2 }), f2 = 0; f2 < s2.areaPaths.length; f2++) { var x2 = n2.renderPaths(u(u({}, g2), {}, { pathFrom: s2.pathFromArea, pathTo: s2.areaPaths[f2], stroke: "none", strokeWidth: 0, strokeLineCap: null, fill: p2 })); this.elSeries.add(x2); } if (r2.config.stroke.show && !this.pointsChart) { var b2 = null; if ("line" === e2) b2 = o2.fillPath({ seriesNumber: i2, i: a2 }); else if ("solid" === r2.config.stroke.fill.type) b2 = r2.globals.stroke.colors[i2]; else { var m2 = r2.config.fill; r2.config.fill = r2.config.stroke.fill, b2 = o2.fillPath({ seriesNumber: i2, i: a2 }), r2.config.fill = m2; } for (var v2 = 0; v2 < s2.linePaths.length; v2++) { var y2 = b2; "rangeArea" === e2 && (y2 = o2.fillPath({ seriesNumber: i2 })); var w2 = u(u({}, g2), {}, { pathFrom: s2.pathFromLine, pathTo: s2.linePaths[v2], stroke: b2, strokeWidth: this.strokeWidth, strokeLineCap: r2.config.stroke.lineCap, fill: "rangeArea" === e2 ? y2 : "none" }), k2 = n2.renderPaths(w2); if (this.elSeries.add(k2), k2.attr("fill-rule", "evenodd"), l2.count > 0 && "rangeArea" !== e2) { var A2 = n2.renderPaths(w2); A2.node.setAttribute("stroke-dasharray", l2.dashArray), l2.strokeWidth && A2.node.setAttribute("stroke-width", l2.strokeWidth), this.elSeries.add(A2), A2.attr("clip-path", "url(#forecastMask".concat(r2.globals.cuid, ")")), k2.attr("clip-path", "url(#nonForecastMask".concat(r2.globals.cuid, ")")); } } } } }, { key: "_iterateOverDataPoints", value: function(t3) { var e2, i2, a2 = this, s2 = t3.type, r2 = t3.series, n2 = t3.iterations, o2 = t3.realIndex, l2 = t3.translationsIndex, h2 = t3.i, c2 = t3.x, d2 = t3.y, u2 = t3.pX, g2 = t3.pY, p2 = t3.pathsFrom, f2 = t3.linePaths, x2 = t3.areaPaths, b2 = t3.seriesIndex, m2 = t3.lineYPosition, y2 = t3.xArrj, w2 = t3.yArrj, k2 = t3.y2Arrj, A2 = t3.isRangeStart, C2 = t3.seriesRangeEnd, S2 = this.w, L2 = new Mi(this.ctx), M2 = this.yRatio, P2 = p2.prevY, I2 = p2.linePath, T2 = p2.areaPath, z2 = p2.pathFromLine, X2 = p2.pathFromArea, R2 = v.isNumber(S2.globals.minYArr[o2]) ? S2.globals.minYArr[o2] : S2.globals.minY; n2 || (n2 = S2.globals.dataPoints > 1 ? S2.globals.dataPoints - 1 : S2.globals.dataPoints); var E2 = function(t4, e3) { return e3 - t4 / M2[l2] + 2 * (a2.isReversed ? t4 / M2[l2] : 0); }, Y2 = d2, H2 = S2.config.chart.stacked && !S2.globals.comboCharts || S2.config.chart.stacked && S2.globals.comboCharts && (!this.w.config.chart.stackOnlyBar || "bar" === (null === (e2 = this.w.config.series[o2]) || void 0 === e2 ? void 0 : e2.type) || "column" === (null === (i2 = this.w.config.series[o2]) || void 0 === i2 ? void 0 : i2.type)), O2 = S2.config.stroke.curve; Array.isArray(O2) && (O2 = Array.isArray(b2) ? O2[b2[h2]] : O2[h2]); for (var F2, D2 = 0, _2 = 0; _2 < n2 && 0 !== r2[h2].length; _2++) { var N2 = void 0 === r2[h2][_2 + 1] || null === r2[h2][_2 + 1]; if (S2.globals.isXNumeric) { var W2 = S2.globals.seriesX[o2][_2 + 1]; void 0 === S2.globals.seriesX[o2][_2 + 1] && (W2 = S2.globals.seriesX[o2][n2 - 1]), c2 = (W2 - S2.globals.minX) / this.xRatio; } else c2 += this.xDivision; if (H2) if (h2 > 0 && S2.globals.collapsedSeries.length < S2.config.series.length - 1) { m2 = this.prevSeriesY[(function(t4) { for (var e3 = t4; e3 > 0; e3--) { if (!(S2.globals.collapsedSeriesIndices.indexOf((null == b2 ? void 0 : b2[e3]) || e3) > -1)) return e3; e3--; } return 0; })(h2 - 1)][_2 + 1]; } else m2 = this.zeroY; else m2 = this.zeroY; N2 ? d2 = E2(R2, m2) : (d2 = E2(r2[h2][_2 + 1], m2), "rangeArea" === s2 && (Y2 = E2(C2[h2][_2 + 1], m2))), y2.push(null === r2[h2][_2 + 1] ? null : c2), !N2 || "smooth" !== S2.config.stroke.curve && "monotoneCubic" !== S2.config.stroke.curve ? (w2.push(d2), k2.push(Y2)) : (w2.push(null), k2.push(null)); var B2 = this.lineHelpers.calculatePoints({ series: r2, x: c2, y: d2, realIndex: o2, i: h2, j: _2, prevY: P2 }), G2 = this._createPaths({ type: s2, series: r2, i: h2, realIndex: o2, j: _2, x: c2, y: d2, y2: Y2, xArrj: y2, yArrj: w2, y2Arrj: k2, pX: u2, pY: g2, pathState: D2, segmentStartX: F2, linePath: I2, areaPath: T2, linePaths: f2, areaPaths: x2, curve: O2, isRangeStart: A2 }); x2 = G2.areaPaths, f2 = G2.linePaths, u2 = G2.pX, g2 = G2.pY, D2 = G2.pathState, F2 = G2.segmentStartX, T2 = G2.areaPath, I2 = G2.linePath, !this.appendPathFrom || S2.globals.hasNullValues || "monotoneCubic" === O2 && "rangeArea" === s2 || (z2 += L2.line(c2, this.areaBottomY), X2 += L2.line(c2, this.areaBottomY)), this.handleNullDataPoints(r2, B2, h2, _2, o2), this._handleMarkersAndLabels({ type: s2, pointsPos: B2, i: h2, j: _2, realIndex: o2, isRangeStart: A2 }); } return { yArrj: w2, xArrj: y2, pathFromArea: X2, areaPaths: x2, pathFromLine: z2, linePaths: f2, linePath: I2, areaPath: T2 }; } }, { key: "_handleMarkersAndLabels", value: function(t3) { var e2 = t3.type, i2 = t3.pointsPos, a2 = t3.isRangeStart, s2 = t3.i, r2 = t3.j, n2 = t3.realIndex, o2 = this.w, l2 = new qi(this.ctx); if (this.pointsChart) this.scatter.draw(this.elSeries, r2, { realIndex: n2, pointsPos: i2, zRatio: this.zRatio, elParent: this.elPointsMain }); else { o2.globals.series[s2].length > 1 && this.elPointsMain.node.classList.add("apexcharts-element-hidden"); var h2 = this.markers.plotChartMarkers({ pointsPos: i2, seriesIndex: n2, j: r2 + 1 }); null !== h2 && this.elPointsMain.add(h2); } var c2 = l2.drawDataLabel({ type: e2, isRangeStart: a2, pos: i2, i: n2, j: r2 + 1 }); null !== c2 && this.elDataLabelsWrap.add(c2); } }, { key: "_createPaths", value: function(t3) { var e2 = t3.type, i2 = t3.series, a2 = t3.i; t3.realIndex; var s2, r2 = t3.j, n2 = t3.x, o2 = t3.y, l2 = t3.xArrj, h2 = t3.yArrj, c2 = t3.y2, d2 = t3.y2Arrj, u2 = t3.pX, g2 = t3.pY, p2 = t3.pathState, f2 = t3.segmentStartX, x2 = t3.linePath, b2 = t3.areaPath, m2 = t3.linePaths, v2 = t3.areaPaths, y2 = t3.curve, w2 = t3.isRangeStart, k2 = new Mi(this.ctx), A2 = this.areaBottomY, C2 = "rangeArea" === e2, S2 = "rangeArea" === e2 && w2; switch (y2) { case "monotoneCubic": var L2 = w2 ? h2 : d2; switch (p2) { case 0: if (null === L2[r2 + 1]) break; p2 = 1; case 1: if (!(C2 ? l2.length === i2[a2].length : r2 === i2[a2].length - 2)) break; case 2: var M2 = w2 ? l2 : l2.slice().reverse(), P2 = w2 ? L2 : L2.slice().reverse(), I2 = (s2 = P2, M2.map((function(t4, e3) { return [t4, s2[e3]]; })).filter((function(t4) { return null !== t4[1]; }))), T2 = I2.length > 1 ? Na(I2) : I2, z2 = []; C2 && (S2 ? v2 = I2 : z2 = v2.reverse()); var X2 = 0, R2 = 0; if ((function(t4, e3) { for (var i3 = (function(t5) { var e4 = [], i4 = 0; return t5.forEach((function(t6) { null !== t6 ? i4++ : i4 > 0 && (e4.push(i4), i4 = 0); })), i4 > 0 && e4.push(i4), e4; })(t4), a3 = [], s3 = 0, r3 = 0; s3 < i3.length; r3 += i3[s3++]) a3[s3] = Wa(e3, r3, r3 + i3[s3]); return a3; })(P2, T2).forEach((function(t4) { X2++; var e3 = (function(t5) { for (var e4 = "", i4 = 0; i4 < t5.length; i4++) { var a4 = t5[i4], s3 = a4.length; s3 > 4 ? (e4 += "C".concat(a4[0], ", ").concat(a4[1]), e4 += ", ".concat(a4[2], ", ").concat(a4[3]), e4 += ", ".concat(a4[4], ", ").concat(a4[5])) : s3 > 2 && (e4 += "S".concat(a4[0], ", ").concat(a4[1]), e4 += ", ".concat(a4[2], ", ").concat(a4[3])); } return e4; })(t4), i3 = R2, a3 = (R2 += t4.length) - 1; S2 ? x2 = k2.move(I2[i3][0], I2[i3][1]) + e3 : C2 ? x2 = k2.move(z2[i3][0], z2[i3][1]) + k2.line(I2[i3][0], I2[i3][1]) + e3 + k2.line(z2[a3][0], z2[a3][1]) : (x2 = k2.move(I2[i3][0], I2[i3][1]) + e3, b2 = x2 + k2.line(I2[a3][0], A2) + k2.line(I2[i3][0], A2) + "z", v2.push(b2)), m2.push(x2); })), C2 && X2 > 1 && !S2) { var E2 = m2.slice(X2).reverse(); m2.splice(X2), E2.forEach((function(t4) { return m2.push(t4); })); } p2 = 0; } break; case "smooth": var Y2 = 0.35 * (n2 - u2); if (null === i2[a2][r2]) p2 = 0; else switch (p2) { case 0: if (f2 = u2, x2 = S2 ? k2.move(u2, d2[r2]) + k2.line(u2, g2) : k2.move(u2, g2), b2 = k2.move(u2, g2), null === i2[a2][r2 + 1] || void 0 === i2[a2][r2 + 1]) { m2.push(x2), v2.push(b2); break; } if (p2 = 1, r2 < i2[a2].length - 2) { var H2 = k2.curve(u2 + Y2, g2, n2 - Y2, o2, n2, o2); x2 += H2, b2 += H2; break; } case 1: if (null === i2[a2][r2 + 1]) x2 += S2 ? k2.line(u2, c2) : k2.move(u2, g2), b2 += k2.line(u2, A2) + k2.line(f2, A2) + "z", m2.push(x2), v2.push(b2), p2 = -1; else { var O2 = k2.curve(u2 + Y2, g2, n2 - Y2, o2, n2, o2); x2 += O2, b2 += O2, r2 >= i2[a2].length - 2 && (S2 && (x2 += k2.curve(n2, o2, n2, o2, n2, c2) + k2.move(n2, c2)), b2 += k2.curve(n2, o2, n2, o2, n2, A2) + k2.line(f2, A2) + "z", m2.push(x2), v2.push(b2), p2 = -1); } } u2 = n2, g2 = o2; break; default: var F2 = function(t4, e3, i3) { var a3 = []; switch (t4) { case "stepline": a3 = k2.line(e3, null, "H") + k2.line(null, i3, "V"); break; case "linestep": a3 = k2.line(null, i3, "V") + k2.line(e3, null, "H"); break; case "straight": a3 = k2.line(e3, i3); } return a3; }; if (null === i2[a2][r2]) p2 = 0; else switch (p2) { case 0: if (f2 = u2, x2 = S2 ? k2.move(u2, d2[r2]) + k2.line(u2, g2) : k2.move(u2, g2), b2 = k2.move(u2, g2), null === i2[a2][r2 + 1] || void 0 === i2[a2][r2 + 1]) { m2.push(x2), v2.push(b2); break; } if (p2 = 1, r2 < i2[a2].length - 2) { var D2 = F2(y2, n2, o2); x2 += D2, b2 += D2; break; } case 1: if (null === i2[a2][r2 + 1]) x2 += S2 ? k2.line(u2, c2) : k2.move(u2, g2), b2 += k2.line(u2, A2) + k2.line(f2, A2) + "z", m2.push(x2), v2.push(b2), p2 = -1; else { var _2 = F2(y2, n2, o2); x2 += _2, b2 += _2, r2 >= i2[a2].length - 2 && (S2 && (x2 += k2.line(n2, c2)), b2 += k2.line(n2, A2) + k2.line(f2, A2) + "z", m2.push(x2), v2.push(b2), p2 = -1); } } u2 = n2, g2 = o2; } return { linePaths: m2, areaPaths: v2, pX: u2, pY: g2, pathState: p2, segmentStartX: f2, linePath: x2, areaPath: b2 }; } }, { key: "handleNullDataPoints", value: function(t3, e2, i2, a2, s2) { var r2 = this.w; if (null === t3[i2][a2] && r2.config.markers.showNullDataPoints || 1 === t3[i2].length) { var n2 = this.strokeWidth - r2.config.markers.strokeWidth / 2; n2 > 0 || (n2 = 0); var o2 = this.markers.plotChartMarkers({ pointsPos: e2, seriesIndex: s2, j: a2 + 1, pSize: n2, alwaysDrawMarker: true }); null !== o2 && this.elPointsMain.add(o2); } } }]), t2; })(); window.TreemapSquared = {}, window.TreemapSquared.generate = /* @__PURE__ */ (function() { function t2(e3, i3, a3, s3) { this.xoffset = e3, this.yoffset = i3, this.height = s3, this.width = a3, this.shortestEdge = function() { return Math.min(this.height, this.width); }, this.getCoordinates = function(t3) { var e4, i4 = [], a4 = this.xoffset, s4 = this.yoffset, n3 = r2(t3) / this.height, o2 = r2(t3) / this.width; if (this.width >= this.height) for (e4 = 0; e4 < t3.length; e4++) i4.push([a4, s4, a4 + n3, s4 + t3[e4] / n3]), s4 += t3[e4] / n3; else for (e4 = 0; e4 < t3.length; e4++) i4.push([a4, s4, a4 + t3[e4] / o2, s4 + o2]), a4 += t3[e4] / o2; return i4; }, this.cutArea = function(e4) { var i4; if (this.width >= this.height) { var a4 = e4 / this.height, s4 = this.width - a4; i4 = new t2(this.xoffset + a4, this.yoffset, s4, this.height); } else { var r3 = e4 / this.width, n3 = this.height - r3; i4 = new t2(this.xoffset, this.yoffset + r3, this.width, n3); } return i4; }; } function e2(e3, a3, s3, n3, o2) { n3 = void 0 === n3 ? 0 : n3, o2 = void 0 === o2 ? 0 : o2; var l2 = i2((function(t3, e4) { var i3, a4 = [], s4 = e4 / r2(t3); for (i3 = 0; i3 < t3.length; i3++) a4[i3] = t3[i3] * s4; return a4; })(e3, a3 * s3), [], new t2(n3, o2, a3, s3), []); return (function(t3) { var e4, i3, a4 = []; for (e4 = 0; e4 < t3.length; e4++) for (i3 = 0; i3 < t3[e4].length; i3++) a4.push(t3[e4][i3]); return a4; })(l2); } function i2(t3, e3, s3, n3) { var o2, l2, h2; if (0 !== t3.length) return o2 = s3.shortestEdge(), (function(t4, e4, i3) { var s4; if (0 === t4.length) return true; (s4 = t4.slice()).push(e4); var r3 = a2(t4, i3), n4 = a2(s4, i3); return r3 >= n4; })(e3, l2 = t3[0], o2) ? (e3.push(l2), i2(t3.slice(1), e3, s3, n3)) : (h2 = s3.cutArea(r2(e3), n3), n3.push(s3.getCoordinates(e3)), i2(t3, [], h2, n3)), n3; n3.push(s3.getCoordinates(e3)); } function a2(t3, e3) { var i3 = Math.min.apply(Math, t3), a3 = Math.max.apply(Math, t3), s3 = r2(t3); return Math.max(Math.pow(e3, 2) * a3 / Math.pow(s3, 2), Math.pow(s3, 2) / (Math.pow(e3, 2) * i3)); } function s2(t3) { return t3 && t3.constructor === Array; } function r2(t3) { var e3, i3 = 0; for (e3 = 0; e3 < t3.length; e3++) i3 += t3[e3]; return i3; } function n2(t3) { var e3, i3 = 0; if (s2(t3[0])) for (e3 = 0; e3 < t3.length; e3++) i3 += n2(t3[e3]); else i3 = r2(t3); return i3; } return function t3(i3, a3, r3, o2, l2) { o2 = void 0 === o2 ? 0 : o2, l2 = void 0 === l2 ? 0 : l2; var h2, c2, d2 = [], u2 = []; if (s2(i3[0])) { for (c2 = 0; c2 < i3.length; c2++) d2[c2] = n2(i3[c2]); for (h2 = e2(d2, a3, r3, o2, l2), c2 = 0; c2 < i3.length; c2++) u2.push(t3(i3[c2], h2[c2][2] - h2[c2][0], h2[c2][3] - h2[c2][1], h2[c2][0], h2[c2][1])); } else u2 = e2(i3, a3, r3, o2, l2); return u2; }; })(); var ja = (function() { function t2(e2, a2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.strokeWidth = this.w.config.stroke.width, this.helpers = new Xa(e2), this.dynamicAnim = this.w.config.chart.animations.dynamicAnimation, this.labels = []; } return s(t2, [{ key: "draw", value: function(t3) { var e2 = this, i2 = this.w, a2 = new Mi(this.ctx), s2 = new ji(this.ctx), r2 = a2.group({ class: "apexcharts-treemap" }); if (i2.globals.noData) return r2; var n2 = []; return t3.forEach((function(t4) { var e3 = t4.map((function(t5) { return Math.abs(t5); })); n2.push(e3); })), this.negRange = this.helpers.checkColorRange(), i2.config.series.forEach((function(t4, i3) { t4.data.forEach((function(t5) { Array.isArray(e2.labels[i3]) || (e2.labels[i3] = []), e2.labels[i3].push(t5.x); })); })), window.TreemapSquared.generate(n2, i2.globals.gridWidth, i2.globals.gridHeight).forEach((function(n3, o2) { var l2 = a2.group({ class: "apexcharts-series apexcharts-treemap-series", seriesName: v.escapeString(i2.globals.seriesNames[o2]), rel: o2 + 1, "data:realIndex": o2 }); if (i2.config.chart.dropShadow.enabled) { var h2 = i2.config.chart.dropShadow; new Li(e2.ctx).dropShadow(r2, h2, o2); } var c2 = a2.group({ class: "apexcharts-data-labels" }), d2 = { xMin: 1 / 0, yMin: 1 / 0, xMax: -1 / 0, yMax: -1 / 0 }; n3.forEach((function(r3, n4) { var h3 = r3[0], c3 = r3[1], u3 = r3[2], g3 = r3[3]; d2.xMin = Math.min(d2.xMin, h3), d2.yMin = Math.min(d2.yMin, c3), d2.xMax = Math.max(d2.xMax, u3), d2.yMax = Math.max(d2.yMax, g3); var p3 = e2.helpers.getShadeColor(i2.config.chart.type, o2, n4, e2.negRange), f3 = p3.color, x3 = s2.fillPath({ color: f3, seriesNumber: o2, dataPointIndex: n4 }), b3 = a2.drawRect(h3, c3, u3 - h3, g3 - c3, i2.config.plotOptions.treemap.borderRadius, "#fff", 1, e2.strokeWidth, i2.config.plotOptions.treemap.useFillColorAsStroke ? f3 : i2.globals.stroke.colors[o2]); b3.attr({ cx: h3, cy: c3, index: o2, i: o2, j: n4, width: u3 - h3, height: g3 - c3, fill: x3 }), b3.node.classList.add("apexcharts-treemap-rect"), e2.helpers.addListeners(b3); var m3 = { x: h3 + (u3 - h3) / 2, y: c3 + (g3 - c3) / 2, width: 0, height: 0 }, v2 = { x: h3, y: c3, width: u3 - h3, height: g3 - c3 }; if (i2.config.chart.animations.enabled && !i2.globals.dataChanged) { var y3 = 1; i2.globals.resized || (y3 = i2.config.chart.animations.speed), e2.animateTreemap(b3, m3, v2, y3); } if (i2.globals.dataChanged) { var w3 = 1; e2.dynamicAnim.enabled && i2.globals.shouldAnimate && (w3 = e2.dynamicAnim.speed, i2.globals.previousPaths[o2] && i2.globals.previousPaths[o2][n4] && i2.globals.previousPaths[o2][n4].rect && (m3 = i2.globals.previousPaths[o2][n4].rect), e2.animateTreemap(b3, m3, v2, w3)); } var k3 = e2.getFontSize(r3), A3 = i2.config.dataLabels.formatter(e2.labels[o2][n4], { value: i2.globals.series[o2][n4], seriesIndex: o2, dataPointIndex: n4, w: i2 }); "truncate" === i2.config.plotOptions.treemap.dataLabels.format && (k3 = parseInt(i2.config.dataLabels.style.fontSize, 10), A3 = e2.truncateLabels(A3, k3, h3, c3, u3, g3)); var C3 = null; i2.globals.series[o2][n4] && (C3 = e2.helpers.calculateDataLabels({ text: A3, x: (h3 + u3) / 2, y: (c3 + g3) / 2 + e2.strokeWidth / 2 + k3 / 3, i: o2, j: n4, colorProps: p3, fontSize: k3, series: t3 })), i2.config.dataLabels.enabled && C3 && e2.rotateToFitLabel(C3, k3, A3, h3, c3, u3, g3), l2.add(b3), null !== C3 && l2.add(C3); })); var u2 = i2.config.plotOptions.treemap.seriesTitle; if (i2.config.series.length > 1 && u2 && u2.show) { var g2 = i2.config.series[o2].name || ""; if (g2 && d2.xMin < 1 / 0 && d2.yMin < 1 / 0) { var p2 = u2.offsetX, f2 = u2.offsetY, x2 = u2.borderColor, b2 = u2.borderWidth, m2 = u2.borderRadius, y2 = u2.style, w2 = y2.color || i2.config.chart.foreColor, k2 = { left: y2.padding.left, right: y2.padding.right, top: y2.padding.top, bottom: y2.padding.bottom }, A2 = a2.getTextRects(g2, y2.fontSize, y2.fontFamily), C2 = A2.width + k2.left + k2.right, S2 = A2.height + k2.top + k2.bottom, L2 = d2.xMin + (p2 || 0), M2 = d2.yMin + (f2 || 0), P2 = a2.drawRect(L2, M2, C2, S2, m2, y2.background, 1, b2, x2), I2 = a2.drawText({ x: L2 + k2.left, y: M2 + k2.top + 0.75 * A2.height, text: g2, fontSize: y2.fontSize, fontFamily: y2.fontFamily, fontWeight: y2.fontWeight, foreColor: w2, cssClass: y2.cssClass || "" }); l2.add(P2), l2.add(I2); } } l2.add(c2), r2.add(l2); })), r2; } }, { key: "getFontSize", value: function(t3) { var e2 = this.w; var i2 = (function t4(e3) { var i3, a2 = 0; if (Array.isArray(e3[0])) for (i3 = 0; i3 < e3.length; i3++) a2 += t4(e3[i3]); else for (i3 = 0; i3 < e3.length; i3++) a2 += e3[i3].length; return a2; })(this.labels) / (function t4(e3) { var i3, a2 = 0; if (Array.isArray(e3[0])) for (i3 = 0; i3 < e3.length; i3++) a2 += t4(e3[i3]); else for (i3 = 0; i3 < e3.length; i3++) a2 += 1; return a2; })(this.labels); return (function(t4, a2) { var s2 = t4 * a2, r2 = Math.pow(s2, 0.5); return Math.min(r2 / i2, parseInt(e2.config.dataLabels.style.fontSize, 10)); })(t3[2] - t3[0], t3[3] - t3[1]); } }, { key: "rotateToFitLabel", value: function(t3, e2, i2, a2, s2, r2, n2) { var o2 = new Mi(this.ctx), l2 = o2.getTextRects(i2, e2); if (l2.width + this.w.config.stroke.width + 5 > r2 - a2 && l2.width <= n2 - s2) { var h2 = o2.rotateAroundCenter(t3.node); t3.node.setAttribute("transform", "rotate(-90 ".concat(h2.x, " ").concat(h2.y, ") translate(").concat(l2.height / 3, ")")); } } }, { key: "truncateLabels", value: function(t3, e2, i2, a2, s2, r2) { var n2 = new Mi(this.ctx), o2 = n2.getTextRects(t3, e2).width + this.w.config.stroke.width + 5 > s2 - i2 && r2 - a2 > s2 - i2 ? r2 - a2 : s2 - i2, l2 = n2.getTextBasedOnMaxWidth({ text: t3, maxWidth: o2, fontSize: e2 }); return t3.length !== l2.length && o2 / e2 < 5 ? "" : l2; } }, { key: "animateTreemap", value: function(t3, e2, i2, a2) { var s2 = new y(this.ctx); s2.animateRect(t3, e2, i2, a2, (function() { s2.animationCompleted(t3); })); } }]), t2; })(); var Va = 86400; var Ua = 10 / Va; var qa = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w, this.timeScaleArray = [], this.utc = this.w.config.xaxis.labels.datetimeUTC; } return s(t2, [{ key: "calculateTimeScaleTicks", value: function(t3, e2) { var i2 = this, a2 = this.w; if (a2.globals.allSeriesCollapsed) return a2.globals.labels = [], a2.globals.timescaleLabels = [], []; var s2 = new zi(this.ctx), r2 = (e2 - t3) / 864e5; this.determineInterval(r2), a2.globals.disableZoomIn = false, a2.globals.disableZoomOut = false, r2 < Ua ? a2.globals.disableZoomIn = true : r2 > 5e4 && (a2.globals.disableZoomOut = true); var n2 = s2.getTimeUnitsfromTimestamp(t3, e2, this.utc), o2 = a2.globals.gridWidth / r2, l2 = o2 / 24, h2 = l2 / 60, c2 = h2 / 60, d2 = Math.floor(24 * r2), g2 = Math.floor(1440 * r2), p2 = Math.floor(r2 * Va), f2 = Math.floor(r2), x2 = Math.floor(r2 / 30), b2 = Math.floor(r2 / 365), m2 = { minMillisecond: n2.minMillisecond, minSecond: n2.minSecond, minMinute: n2.minMinute, minHour: n2.minHour, minDate: n2.minDate, minMonth: n2.minMonth, minYear: n2.minYear }, v2 = { firstVal: m2, currentMillisecond: m2.minMillisecond, currentSecond: m2.minSecond, currentMinute: m2.minMinute, currentHour: m2.minHour, currentMonthDate: m2.minDate, currentDate: m2.minDate, currentMonth: m2.minMonth, currentYear: m2.minYear, daysWidthOnXAxis: o2, hoursWidthOnXAxis: l2, minutesWidthOnXAxis: h2, secondsWidthOnXAxis: c2, numberOfSeconds: p2, numberOfMinutes: g2, numberOfHours: d2, numberOfDays: f2, numberOfMonths: x2, numberOfYears: b2 }; switch (this.tickInterval) { case "years": this.generateYearScale(v2); break; case "months": case "half_year": this.generateMonthScale(v2); break; case "months_days": case "months_fortnight": case "days": case "week_days": this.generateDayScale(v2); break; case "hours": this.generateHourScale(v2); break; case "minutes_fives": case "minutes": this.generateMinuteScale(v2); break; case "seconds_tens": case "seconds_fives": case "seconds": this.generateSecondScale(v2); } var y2 = this.timeScaleArray.map((function(t4) { var e3 = { position: t4.position, unit: t4.unit, year: t4.year, day: t4.day ? t4.day : 1, hour: t4.hour ? t4.hour : 0, month: t4.month + 1 }; return "month" === t4.unit ? u(u({}, e3), {}, { day: 1, value: t4.value + 1 }) : "day" === t4.unit || "hour" === t4.unit ? u(u({}, e3), {}, { value: t4.value }) : "minute" === t4.unit ? u(u({}, e3), {}, { value: t4.value, minute: t4.value }) : "second" === t4.unit ? u(u({}, e3), {}, { value: t4.value, minute: t4.minute, second: t4.second }) : t4; })); return y2.filter((function(t4) { var e3 = 1, s3 = Math.ceil(a2.globals.gridWidth / 120), r3 = t4.value; void 0 !== a2.config.xaxis.tickAmount && (s3 = a2.config.xaxis.tickAmount), y2.length > s3 && (e3 = Math.floor(y2.length / s3)); var n3 = false, o3 = false; switch (i2.tickInterval) { case "years": "year" === t4.unit && (n3 = true); break; case "half_year": e3 = 7, "year" === t4.unit && (n3 = true); break; case "months": e3 = 1, "year" === t4.unit && (n3 = true); break; case "months_fortnight": e3 = 15, "year" !== t4.unit && "month" !== t4.unit || (n3 = true), 30 === r3 && (o3 = true); break; case "months_days": e3 = 10, "month" === t4.unit && (n3 = true), 30 === r3 && (o3 = true); break; case "week_days": e3 = 8, "month" === t4.unit && (n3 = true); break; case "days": e3 = 1, "month" === t4.unit && (n3 = true); break; case "hours": "day" === t4.unit && (n3 = true); break; case "minutes_fives": case "seconds_fives": r3 % 5 != 0 && (o3 = true); break; case "seconds_tens": r3 % 10 != 0 && (o3 = true); } if ("hours" === i2.tickInterval || "minutes_fives" === i2.tickInterval || "seconds_tens" === i2.tickInterval || "seconds_fives" === i2.tickInterval) { if (!o3) return true; } else if ((r3 % e3 == 0 || n3) && !o3) return true; })); } }, { key: "recalcDimensionsBasedOnFormat", value: function(t3, e2) { var i2 = this.w, a2 = this.formatDates(t3), s2 = this.removeOverlappingTS(a2); i2.globals.timescaleLabels = s2.slice(), new fa(this.ctx).plotCoords(); } }, { key: "determineInterval", value: function(t3) { var e2 = 24 * t3, i2 = 60 * e2; switch (true) { case t3 / 365 > 5: this.tickInterval = "years"; break; case t3 > 800: this.tickInterval = "half_year"; break; case t3 > 180: this.tickInterval = "months"; break; case t3 > 90: this.tickInterval = "months_fortnight"; break; case t3 > 60: this.tickInterval = "months_days"; break; case t3 > 30: this.tickInterval = "week_days"; break; case t3 > 2: this.tickInterval = "days"; break; case e2 > 2.4: this.tickInterval = "hours"; break; case i2 > 15: this.tickInterval = "minutes_fives"; break; case i2 > 5: this.tickInterval = "minutes"; break; case i2 > 1: this.tickInterval = "seconds_tens"; break; case 60 * i2 > 20: this.tickInterval = "seconds_fives"; break; default: this.tickInterval = "seconds"; } } }, { key: "generateYearScale", value: function(t3) { var e2 = t3.firstVal, i2 = t3.currentMonth, a2 = t3.currentYear, s2 = t3.daysWidthOnXAxis, r2 = t3.numberOfYears, n2 = e2.minYear, o2 = 0, l2 = new zi(this.ctx), h2 = "year"; if (e2.minDate > 1 || e2.minMonth > 0) { var c2 = l2.determineRemainingDaysOfYear(e2.minYear, e2.minMonth, e2.minDate); o2 = (l2.determineDaysOfYear(e2.minYear) - c2 + 1) * s2, n2 = e2.minYear + 1, this.timeScaleArray.push({ position: o2, value: n2, unit: h2, year: n2, month: v.monthMod(i2 + 1) }); } else 1 === e2.minDate && 0 === e2.minMonth && this.timeScaleArray.push({ position: o2, value: n2, unit: h2, year: a2, month: v.monthMod(i2 + 1) }); for (var d2 = n2, u2 = o2, g2 = 0; g2 < r2; g2++) d2++, u2 = l2.determineDaysOfYear(d2 - 1) * s2 + u2, this.timeScaleArray.push({ position: u2, value: d2, unit: h2, year: d2, month: 1 }); } }, { key: "generateMonthScale", value: function(t3) { var e2 = t3.firstVal, i2 = t3.currentMonthDate, a2 = t3.currentMonth, s2 = t3.currentYear, r2 = t3.daysWidthOnXAxis, n2 = t3.numberOfMonths, o2 = a2, l2 = 0, h2 = new zi(this.ctx), c2 = "month", d2 = 0; if (e2.minDate > 1) { l2 = (h2.determineDaysOfMonths(a2 + 1, e2.minYear) - i2 + 1) * r2, o2 = v.monthMod(a2 + 1); var u2 = s2 + d2, g2 = v.monthMod(o2), p2 = o2; 0 === o2 && (c2 = "year", p2 = u2, g2 = 1, u2 += d2 += 1), this.timeScaleArray.push({ position: l2, value: p2, unit: c2, year: u2, month: g2 }); } else this.timeScaleArray.push({ position: l2, value: o2, unit: c2, year: s2, month: v.monthMod(a2) }); for (var f2 = o2 + 1, x2 = l2, b2 = 0, m2 = 1; b2 < n2; b2++, m2++) { 0 === (f2 = v.monthMod(f2)) ? (c2 = "year", d2 += 1) : c2 = "month"; var y2 = this._getYear(s2, f2, d2); x2 = h2.determineDaysOfMonths(f2, y2) * r2 + x2; var w2 = 0 === f2 ? y2 : f2; this.timeScaleArray.push({ position: x2, value: w2, unit: c2, year: y2, month: 0 === f2 ? 1 : f2 }), f2++; } } }, { key: "generateDayScale", value: function(t3) { var e2 = t3.firstVal, i2 = t3.currentMonth, a2 = t3.currentYear, s2 = t3.hoursWidthOnXAxis, r2 = t3.numberOfDays, n2 = new zi(this.ctx), o2 = "day", l2 = e2.minDate + 1, h2 = l2, c2 = function(t4, e3, i3) { return t4 > n2.determineDaysOfMonths(e3 + 1, i3) ? (h2 = 1, o2 = "month", u2 = e3 += 1, e3) : e3; }, d2 = (24 - e2.minHour) * s2, u2 = l2, g2 = c2(h2, i2, a2); 0 === e2.minHour && 1 === e2.minDate ? (d2 = 0, u2 = v.monthMod(e2.minMonth), o2 = "month", h2 = e2.minDate) : 1 !== e2.minDate && 0 === e2.minHour && 0 === e2.minMinute && (d2 = 0, l2 = e2.minDate, u2 = l2, g2 = c2(h2 = l2, i2, a2), 1 !== u2 && (o2 = "day")), this.timeScaleArray.push({ position: d2, value: u2, unit: o2, year: this._getYear(a2, g2, 0), month: v.monthMod(g2), day: h2 }); for (var p2 = d2, f2 = 0; f2 < r2; f2++) { o2 = "day", g2 = c2(h2 += 1, g2, this._getYear(a2, g2, 0)); var x2 = this._getYear(a2, g2, 0); p2 = 24 * s2 + p2; var b2 = 1 === h2 ? v.monthMod(g2) : h2; this.timeScaleArray.push({ position: p2, value: b2, unit: o2, year: x2, month: v.monthMod(g2), day: b2 }); } } }, { key: "generateHourScale", value: function(t3) { var e2 = t3.firstVal, i2 = t3.currentDate, a2 = t3.currentMonth, s2 = t3.currentYear, r2 = t3.minutesWidthOnXAxis, n2 = t3.numberOfHours, o2 = new zi(this.ctx), l2 = "hour", h2 = function(t4, e3) { return t4 > o2.determineDaysOfMonths(e3 + 1, s2) && (f2 = 1, e3 += 1), { month: e3, date: f2 }; }, c2 = function(t4, e3) { return t4 > o2.determineDaysOfMonths(e3 + 1, s2) ? e3 += 1 : e3; }, d2 = 60 - (e2.minMinute + e2.minSecond / 60), u2 = d2 * r2, g2 = e2.minHour + 1, p2 = g2; 60 === d2 && (u2 = 0, p2 = g2 = e2.minHour); var f2 = i2; p2 >= 24 && (p2 = 0, l2 = "day", g2 = f2 += 1); var x2 = h2(f2, a2).month; x2 = c2(f2, x2), g2 > 31 && (g2 = f2 = 1), this.timeScaleArray.push({ position: u2, value: g2, unit: l2, day: f2, hour: p2, year: s2, month: v.monthMod(x2) }), p2++; for (var b2 = u2, m2 = 0; m2 < n2; m2++) { if (l2 = "hour", p2 >= 24) p2 = 0, l2 = "day", x2 = h2(f2 += 1, x2).month, x2 = c2(f2, x2); var y2 = this._getYear(s2, x2, 0); b2 = 60 * r2 + b2; var w2 = 0 === p2 ? f2 : p2; this.timeScaleArray.push({ position: b2, value: w2, unit: l2, hour: p2, day: f2, year: y2, month: v.monthMod(x2) }), p2++; } } }, { key: "generateMinuteScale", value: function(t3) { for (var e2 = t3.currentMillisecond, i2 = t3.currentSecond, a2 = t3.currentMinute, s2 = t3.currentHour, r2 = t3.currentDate, n2 = t3.currentMonth, o2 = t3.currentYear, l2 = t3.minutesWidthOnXAxis, h2 = t3.secondsWidthOnXAxis, c2 = t3.numberOfMinutes, d2 = a2 + 1, u2 = r2, g2 = n2, p2 = o2, f2 = s2, x2 = (60 - i2 - e2 / 1e3) * h2, b2 = 0; b2 < c2; b2++) d2 >= 60 && (d2 = 0, 24 === (f2 += 1) && (f2 = 0)), this.timeScaleArray.push({ position: x2, value: d2, unit: "minute", hour: f2, minute: d2, day: u2, year: this._getYear(p2, g2, 0), month: v.monthMod(g2) }), x2 += l2, d2++; } }, { key: "generateSecondScale", value: function(t3) { for (var e2 = t3.currentMillisecond, i2 = t3.currentSecond, a2 = t3.currentMinute, s2 = t3.currentHour, r2 = t3.currentDate, n2 = t3.currentMonth, o2 = t3.currentYear, l2 = t3.secondsWidthOnXAxis, h2 = t3.numberOfSeconds, c2 = i2 + 1, d2 = a2, u2 = r2, g2 = n2, p2 = o2, f2 = s2, x2 = (1e3 - e2) / 1e3 * l2, b2 = 0; b2 < h2; b2++) c2 >= 60 && (c2 = 0, ++d2 >= 60 && (d2 = 0, 24 === ++f2 && (f2 = 0))), this.timeScaleArray.push({ position: x2, value: c2, unit: "second", hour: f2, minute: d2, second: c2, day: u2, year: this._getYear(p2, g2, 0), month: v.monthMod(g2) }), x2 += l2, c2++; } }, { key: "createRawDateString", value: function(t3, e2) { var i2 = t3.year; return 0 === t3.month && (t3.month = 1), i2 += "-" + ("0" + t3.month.toString()).slice(-2), "day" === t3.unit ? i2 += "day" === t3.unit ? "-" + ("0" + e2).slice(-2) : "-01" : i2 += "-" + ("0" + (t3.day ? t3.day : "1")).slice(-2), "hour" === t3.unit ? i2 += "hour" === t3.unit ? "T" + ("0" + e2).slice(-2) : "T00" : i2 += "T" + ("0" + (t3.hour ? t3.hour : "0")).slice(-2), "minute" === t3.unit ? i2 += ":" + ("0" + e2).slice(-2) : i2 += ":" + (t3.minute ? ("0" + t3.minute).slice(-2) : "00"), "second" === t3.unit ? i2 += ":" + ("0" + e2).slice(-2) : i2 += ":00", this.utc && (i2 += ".000Z"), i2; } }, { key: "formatDates", value: function(t3) { var e2 = this, i2 = this.w; return t3.map((function(t4) { var a2 = t4.value.toString(), s2 = new zi(e2.ctx), r2 = e2.createRawDateString(t4, a2), n2 = s2.getDate(s2.parseDate(r2)); if (e2.utc || (n2 = s2.getDate(s2.parseDateWithTimezone(r2))), void 0 === i2.config.xaxis.labels.format) { var o2 = "dd MMM", l2 = i2.config.xaxis.labels.datetimeFormatter; "year" === t4.unit && (o2 = l2.year), "month" === t4.unit && (o2 = l2.month), "day" === t4.unit && (o2 = l2.day), "hour" === t4.unit && (o2 = l2.hour), "minute" === t4.unit && (o2 = l2.minute), "second" === t4.unit && (o2 = l2.second), a2 = s2.formatDate(n2, o2); } else a2 = s2.formatDate(n2, i2.config.xaxis.labels.format); return { dateString: r2, position: t4.position, value: a2, unit: t4.unit, year: t4.year, month: t4.month }; })); } }, { key: "removeOverlappingTS", value: function(t3) { var e2, i2 = this, a2 = new Mi(this.ctx), s2 = false; t3.length > 0 && t3[0].value && t3.every((function(e3) { return e3.value.length === t3[0].value.length; })) && (s2 = true, e2 = a2.getTextRects(t3[0].value).width); var r2 = 0, n2 = t3.map((function(n3, o2) { if (o2 > 0 && i2.w.config.xaxis.labels.hideOverlappingLabels) { var l2 = s2 ? e2 : a2.getTextRects(t3[r2].value).width, h2 = t3[r2].position; return n3.position > h2 + l2 + 10 ? (r2 = o2, n3) : null; } return n3; })); return n2 = n2.filter((function(t4) { return null !== t4; })); } }, { key: "_getYear", value: function(t3, e2, i2) { return t3 + Math.floor(e2 / 12) + i2; } }]), t2; })(); var Za = (function() { function t2(e2, a2) { i(this, t2), this.ctx = a2, this.w = a2.w, this.el = e2; } return s(t2, [{ key: "setupElements", value: function() { var t3 = this.w, e2 = t3.globals, i2 = t3.config, a2 = i2.chart.type; e2.axisCharts = ["line", "area", "bar", "rangeBar", "rangeArea", "candlestick", "boxPlot", "scatter", "bubble", "radar", "heatmap", "treemap"].includes(a2), e2.xyCharts = ["line", "area", "bar", "rangeBar", "rangeArea", "candlestick", "boxPlot", "scatter", "bubble"].includes(a2), e2.isBarHorizontal = ["bar", "rangeBar", "boxPlot"].includes(a2) && i2.plotOptions.bar.horizontal, e2.chartClass = ".apexcharts".concat(e2.chartID), e2.dom.baseEl = this.el, e2.dom.elWrap = document.createElement("div"), Mi.setAttrs(e2.dom.elWrap, { id: e2.chartClass.substring(1), class: "apexcharts-canvas ".concat(e2.chartClass.substring(1)) }), this.el.appendChild(e2.dom.elWrap), e2.dom.Paper = window.SVG().addTo(e2.dom.elWrap), e2.dom.Paper.attr({ class: "apexcharts-svg", "xmlns:data": "ApexChartsNS", transform: "translate(".concat(i2.chart.offsetX, ", ").concat(i2.chart.offsetY, ")") }), e2.dom.Paper.node.style.background = "dark" !== i2.theme.mode || i2.chart.background ? "light" !== i2.theme.mode || i2.chart.background ? i2.chart.background : "#fff" : "#343A3F", this.setSVGDimensions(), e2.dom.elLegendForeign = document.createElementNS(e2.SVGNS, "foreignObject"), Mi.setAttrs(e2.dom.elLegendForeign, { x: 0, y: 0, width: e2.svgWidth, height: e2.svgHeight }), e2.dom.elLegendWrap = document.createElement("div"), e2.dom.elLegendWrap.classList.add("apexcharts-legend"), e2.dom.elWrap.appendChild(e2.dom.elLegendWrap), e2.dom.Paper.node.appendChild(e2.dom.elLegendForeign), e2.dom.elGraphical = e2.dom.Paper.group().attr({ class: "apexcharts-inner apexcharts-graphical" }), e2.dom.elDefs = e2.dom.Paper.defs(), e2.dom.Paper.add(e2.dom.elGraphical), e2.dom.elGraphical.add(e2.dom.elDefs); } }, { key: "plotChartType", value: function(t3, e2) { var i2 = this.w, a2 = this.ctx, s2 = i2.config, r2 = i2.globals, n2 = { line: { series: [], i: [] }, area: { series: [], i: [] }, scatter: { series: [], i: [] }, bubble: { series: [], i: [] }, bar: { series: [], i: [] }, candlestick: { series: [], i: [] }, boxPlot: { series: [], i: [] }, rangeBar: { series: [], i: [] }, rangeArea: { series: [], seriesRangeEnd: [], i: [] } }, o2 = s2.chart.type || "line", l2 = null, h2 = 0; r2.series.forEach((function(e3, a3) { var s3, c3, d3 = "column" === (null === (s3 = t3[a3]) || void 0 === s3 ? void 0 : s3.type) ? "bar" : (null === (c3 = t3[a3]) || void 0 === c3 ? void 0 : c3.type) || ("column" === o2 ? "bar" : o2); n2[d3] ? ("rangeArea" === d3 ? (n2[d3].series.push(r2.seriesRangeStart[a3]), n2[d3].seriesRangeEnd.push(r2.seriesRangeEnd[a3])) : n2[d3].series.push(e3), n2[d3].i.push(a3), "bar" === d3 && (i2.globals.columnSeries = n2.bar)) : ["heatmap", "treemap", "pie", "donut", "polarArea", "radialBar", "radar"].includes(d3) ? l2 = d3 : console.warn("You have specified an unrecognized series type (".concat(d3, ").")), o2 !== d3 && "scatter" !== d3 && h2++; })), h2 > 0 && (l2 && console.warn("Chart or series type ".concat(l2, " cannot appear with other chart or series types.")), n2.bar.series.length > 0 && s2.plotOptions.bar.horizontal && (h2 -= n2.bar.series.length, n2.bar = { series: [], i: [] }, i2.globals.columnSeries = { series: [], i: [] }, console.warn("Horizontal bars are not supported in a mixed/combo chart. Please turn off `plotOptions.bar.horizontal`"))), r2.comboCharts || (r2.comboCharts = h2 > 0); var c2 = new Ga(a2, e2), d2 = new za(a2, e2); a2.pie = new Ya(a2); var u2 = new Oa(a2); a2.rangeBar = new Fa(a2, e2); var g2 = new Ha(a2), p2 = []; if (r2.comboCharts) { var x2, b2, m2 = new Pi(a2); if (n2.area.series.length > 0) (x2 = p2).push.apply(x2, f(m2.drawSeriesByGroup(n2.area, r2.areaGroups, "area", c2))); if (n2.bar.series.length > 0) if (s2.chart.stacked) { var v2 = new Ta(a2, e2); p2.push(v2.draw(n2.bar.series, n2.bar.i)); } else a2.bar = new Ia(a2, e2), p2.push(a2.bar.draw(n2.bar.series, n2.bar.i)); if (n2.rangeArea.series.length > 0 && p2.push(c2.draw(n2.rangeArea.series, "rangeArea", n2.rangeArea.i, n2.rangeArea.seriesRangeEnd)), n2.line.series.length > 0) (b2 = p2).push.apply(b2, f(m2.drawSeriesByGroup(n2.line, r2.lineGroups, "line", c2))); if (n2.candlestick.series.length > 0 && p2.push(d2.draw(n2.candlestick.series, "candlestick", n2.candlestick.i)), n2.boxPlot.series.length > 0 && p2.push(d2.draw(n2.boxPlot.series, "boxPlot", n2.boxPlot.i)), n2.rangeBar.series.length > 0 && p2.push(a2.rangeBar.draw(n2.rangeBar.series, n2.rangeBar.i)), n2.scatter.series.length > 0) { var y2 = new Ga(a2, e2, true); p2.push(y2.draw(n2.scatter.series, "scatter", n2.scatter.i)); } if (n2.bubble.series.length > 0) { var w2 = new Ga(a2, e2, true); p2.push(w2.draw(n2.bubble.series, "bubble", n2.bubble.i)); } } else switch (s2.chart.type) { case "line": p2 = c2.draw(r2.series, "line"); break; case "area": p2 = c2.draw(r2.series, "area"); break; case "bar": if (s2.chart.stacked) p2 = new Ta(a2, e2).draw(r2.series); else a2.bar = new Ia(a2, e2), p2 = a2.bar.draw(r2.series); break; case "candlestick": p2 = new za(a2, e2).draw(r2.series, "candlestick"); break; case "boxPlot": p2 = new za(a2, e2).draw(r2.series, s2.chart.type); break; case "rangeBar": p2 = a2.rangeBar.draw(r2.series); break; case "rangeArea": p2 = c2.draw(r2.seriesRangeStart, "rangeArea", void 0, r2.seriesRangeEnd); break; case "heatmap": p2 = new Ra(a2, e2).draw(r2.series); break; case "treemap": p2 = new ja(a2, e2).draw(r2.series); break; case "pie": case "donut": case "polarArea": p2 = a2.pie.draw(r2.series); break; case "radialBar": p2 = u2.draw(r2.series); break; case "radar": p2 = g2.draw(r2.series); break; default: p2 = c2.draw(r2.series); } return p2; } }, { key: "setSVGDimensions", value: function() { var t3 = this.w, e2 = t3.globals, i2 = t3.config; i2.chart.width = i2.chart.width || "100%", i2.chart.height = i2.chart.height || "auto", e2.svgWidth = i2.chart.width, e2.svgHeight = i2.chart.height; var a2 = v.getDimensions(this.el), s2 = i2.chart.width.toString().split(/[0-9]+/g).pop(); "%" === s2 ? v.isNumber(a2[0]) && (0 === a2[0].width && (a2 = v.getDimensions(this.el.parentNode)), e2.svgWidth = a2[0] * parseInt(i2.chart.width, 10) / 100) : "px" !== s2 && "" !== s2 || (e2.svgWidth = parseInt(i2.chart.width, 10)); var r2 = String(i2.chart.height).toString().split(/[0-9]+/g).pop(); if ("auto" !== e2.svgHeight && "" !== e2.svgHeight) if ("%" === r2) { var n2 = v.getDimensions(this.el.parentNode); e2.svgHeight = n2[1] * parseInt(i2.chart.height, 10) / 100; } else e2.svgHeight = parseInt(i2.chart.height, 10); else e2.svgHeight = e2.axisCharts ? e2.svgWidth / 1.61 : e2.svgWidth / 1.2; if (e2.svgWidth = Math.max(e2.svgWidth, 0), e2.svgHeight = Math.max(e2.svgHeight, 0), Mi.setAttrs(e2.dom.Paper.node, { width: e2.svgWidth, height: e2.svgHeight }), "%" !== r2) { var o2 = i2.chart.sparkline.enabled ? 0 : e2.axisCharts ? i2.chart.parentHeightOffset : 0; e2.dom.Paper.node.parentNode.parentNode.style.minHeight = "".concat(e2.svgHeight + o2, "px"); } e2.dom.elWrap.style.width = "".concat(e2.svgWidth, "px"), e2.dom.elWrap.style.height = "".concat(e2.svgHeight, "px"); } }, { key: "shiftGraphPosition", value: function() { var t3 = this.w.globals, e2 = t3.translateY, i2 = t3.translateX; Mi.setAttrs(t3.dom.elGraphical.node, { transform: "translate(".concat(i2, ", ").concat(e2, ")") }); } }, { key: "resizeNonAxisCharts", value: function() { var t3 = this.w, e2 = t3.globals, i2 = 0, a2 = t3.config.chart.sparkline.enabled ? 1 : 15; a2 += t3.config.grid.padding.bottom, ["top", "bottom"].includes(t3.config.legend.position) && t3.config.legend.show && !t3.config.legend.floating && (i2 = new ba(this.ctx).legendHelpers.getLegendDimensions().clwh + 7); var s2 = t3.globals.dom.baseEl.querySelector(".apexcharts-radialbar, .apexcharts-pie"), r2 = 2.05 * t3.globals.radialSize; if (s2 && !t3.config.chart.sparkline.enabled && 0 !== t3.config.plotOptions.radialBar.startAngle) { var n2 = v.getBoundingClientRect(s2); r2 = n2.bottom; var o2 = n2.bottom - n2.top; r2 = Math.max(2.05 * t3.globals.radialSize, o2); } var l2 = Math.ceil(r2 + e2.translateY + i2 + a2); e2.dom.elLegendForeign && e2.dom.elLegendForeign.setAttribute("height", l2), t3.config.chart.height && String(t3.config.chart.height).includes("%") || (e2.dom.elWrap.style.height = "".concat(l2, "px"), Mi.setAttrs(e2.dom.Paper.node, { height: l2 }), e2.dom.Paper.node.parentNode.parentNode.style.minHeight = "".concat(l2, "px")); } }, { key: "coreCalculations", value: function() { new ia(this.ctx).init(); } }, { key: "resetGlobals", value: function() { var t3 = this, e2 = function() { return t3.w.config.series.map((function() { return []; })); }, i2 = new Bi(), a2 = this.w.globals, s2 = { dataWasParsed: a2.dataWasParsed, originalSeries: a2.originalSeries }; i2.initGlobalVars(a2), a2.seriesXvalues = e2(), a2.seriesYvalues = e2(), s2.dataWasParsed && (a2.dataWasParsed = s2.dataWasParsed, a2.originalSeries = s2.originalSeries); } }, { key: "isMultipleY", value: function() { return !!(Array.isArray(this.w.config.yaxis) && this.w.config.yaxis.length > 1) && (this.w.globals.isMultipleYAxis = true, true); } }, { key: "xySettings", value: function() { var t3 = this.w, e2 = null; if (t3.globals.axisCharts) { if ("back" === t3.config.xaxis.crosshairs.position && new oa(this.ctx).drawXCrosshairs(), "back" === t3.config.yaxis[0].crosshairs.position && new oa(this.ctx).drawYCrosshairs(), "datetime" === t3.config.xaxis.type && void 0 === t3.config.xaxis.labels.formatter) { this.ctx.timeScale = new qa(this.ctx); var i2 = []; isFinite(t3.globals.minX) && isFinite(t3.globals.maxX) && !t3.globals.isBarHorizontal ? i2 = this.ctx.timeScale.calculateTimeScaleTicks(t3.globals.minX, t3.globals.maxX) : t3.globals.isBarHorizontal && (i2 = this.ctx.timeScale.calculateTimeScaleTicks(t3.globals.minY, t3.globals.maxY)), this.ctx.timeScale.recalcDimensionsBasedOnFormat(i2); } e2 = new Pi(this.ctx).getCalculatedRatios(); } return e2; } }, { key: "updateSourceChart", value: function(t3) { this.ctx.w.globals.selection = void 0, this.ctx.updateHelpers._updateOptions({ chart: { selection: { xaxis: { min: t3.w.globals.minX, max: t3.w.globals.maxX } } } }, false, false); } }, { key: "setupBrushHandler", value: function() { var t3 = this, e2 = this.ctx, i2 = this.w; if (i2.config.chart.brush.enabled && "function" != typeof i2.config.chart.events.selection) { var a2 = Array.isArray(i2.config.chart.brush.targets) ? i2.config.chart.brush.targets : [i2.config.chart.brush.target]; a2.forEach((function(i3) { var a3 = e2.constructor.getChartByID(i3); a3.w.globals.brushSource = t3.ctx, "function" != typeof a3.w.config.chart.events.zoomed && (a3.w.config.chart.events.zoomed = function() { return t3.updateSourceChart(a3); }), "function" != typeof a3.w.config.chart.events.scrolled && (a3.w.config.chart.events.scrolled = function() { return t3.updateSourceChart(a3); }); })), i2.config.chart.events.selection = function(t4, i3) { a2.forEach((function(t5) { e2.constructor.getChartByID(t5).ctx.updateHelpers._updateOptions({ xaxis: { min: i3.xaxis.min, max: i3.xaxis.max } }, false, false, false, false); })); }; } } }]), t2; })(); var $a = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "_updateOptions", value: function(t3) { var e2 = this, i2 = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], a2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], s2 = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], r2 = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; return new Promise((function(n2) { var o2 = [e2.ctx]; s2 && (o2 = e2.ctx.getSyncedCharts()), e2.ctx.w.globals.isExecCalled && (o2 = [e2.ctx], e2.ctx.w.globals.isExecCalled = false), o2.forEach((function(s3, l2) { var h2 = s3.w; if (h2.globals.shouldAnimate = a2, i2 || (h2.globals.resized = true, h2.globals.dataChanged = true, a2 && s3.series.getPreviousPaths()), t3 && "object" === b(t3) && (s3.config = new Wi(t3), t3 = Pi.extendArrayProps(s3.config, t3, h2), s3.w.globals.chartID !== e2.ctx.w.globals.chartID && delete t3.series, h2.config = v.extend(h2.config, t3), r2 && (h2.globals.lastXAxis = t3.xaxis ? v.clone(t3.xaxis) : [], h2.globals.lastYAxis = t3.yaxis ? v.clone(t3.yaxis) : [], h2.globals.initialConfig = v.extend({}, h2.config), h2.globals.initialSeries = v.clone(h2.config.series), t3.series))) { for (var c2 = 0; c2 < h2.globals.collapsedSeriesIndices.length; c2++) { var d2 = h2.config.series[h2.globals.collapsedSeriesIndices[c2]]; h2.globals.collapsedSeries[c2].data = h2.globals.axisCharts ? d2.data.slice() : d2; } for (var u2 = 0; u2 < h2.globals.ancillaryCollapsedSeriesIndices.length; u2++) { var g2 = h2.config.series[h2.globals.ancillaryCollapsedSeriesIndices[u2]]; h2.globals.ancillaryCollapsedSeries[u2].data = h2.globals.axisCharts ? g2.data.slice() : g2; } s3.series.emptyCollapsedSeries(h2.config.series); } return s3.update(t3).then((function() { l2 === o2.length - 1 && n2(s3); })); })); })); } }, { key: "_updateSeries", value: function(t3, e2) { var i2 = this, a2 = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; return new Promise((function(s2) { var r2 = i2.w; return r2.globals.shouldAnimate = e2, r2.globals.dataChanged = true, e2 && i2.ctx.series.getPreviousPaths(), i2.ctx.data.resetParsingFlags(), i2.ctx.data.parseData(t3), a2 && (r2.globals.initialConfig.series = v.clone(r2.config.series), r2.globals.initialSeries = v.clone(r2.config.series)), i2.ctx.update().then((function() { s2(i2.ctx); })); })); } }, { key: "_extendSeries", value: function(t3, e2) { var i2 = this.w, a2 = i2.config.series[e2]; return u(u({}, i2.config.series[e2]), {}, { name: t3.name ? t3.name : null == a2 ? void 0 : a2.name, color: t3.color ? t3.color : null == a2 ? void 0 : a2.color, type: t3.type ? t3.type : null == a2 ? void 0 : a2.type, group: t3.group ? t3.group : null == a2 ? void 0 : a2.group, hidden: void 0 !== t3.hidden ? t3.hidden : null == a2 ? void 0 : a2.hidden, data: t3.data ? t3.data : null == a2 ? void 0 : a2.data, zIndex: void 0 !== t3.zIndex ? t3.zIndex : e2 }); } }, { key: "toggleDataPointSelection", value: function(t3, e2) { var i2 = this.w, a2 = null, s2 = ".apexcharts-series[data\\:realIndex='".concat(t3, "']"); return i2.globals.axisCharts ? a2 = i2.globals.dom.Paper.findOne("".concat(s2, " path[j='").concat(e2, "'], ").concat(s2, " circle[j='").concat(e2, "'], ").concat(s2, " rect[j='").concat(e2, "']")) : void 0 === e2 && (a2 = i2.globals.dom.Paper.findOne("".concat(s2, " path[j='").concat(t3, "']")), "pie" !== i2.config.chart.type && "polarArea" !== i2.config.chart.type && "donut" !== i2.config.chart.type || this.ctx.pie.pieClicked(t3)), a2 ? (new Mi(this.ctx).pathMouseDown(a2, null), a2.node ? a2.node : null) : (console.warn("toggleDataPointSelection: Element not found"), null); } }, { key: "forceXAxisUpdate", value: function(t3) { var e2 = this.w; if (["min", "max"].forEach((function(i3) { void 0 !== t3.xaxis[i3] && (e2.config.xaxis[i3] = t3.xaxis[i3], e2.globals.lastXAxis[i3] = t3.xaxis[i3]); })), t3.xaxis.categories && t3.xaxis.categories.length && (e2.config.xaxis.categories = t3.xaxis.categories), e2.config.xaxis.convertedCatToNumeric) { var i2 = new Ni(t3); t3 = i2.convertCatToNumericXaxis(t3, this.ctx); } return t3; } }, { key: "forceYAxisUpdate", value: function(t3) { return t3.chart && t3.chart.stacked && "100%" === t3.chart.stackType && (Array.isArray(t3.yaxis) ? t3.yaxis.forEach((function(e2, i2) { t3.yaxis[i2].min = 0, t3.yaxis[i2].max = 100; })) : (t3.yaxis.min = 0, t3.yaxis.max = 100)), t3; } }, { key: "revertDefaultAxisMinMax", value: function(t3) { var e2 = this, i2 = this.w, a2 = i2.globals.lastXAxis, s2 = i2.globals.lastYAxis; t3 && t3.xaxis && (a2 = t3.xaxis), t3 && t3.yaxis && (s2 = t3.yaxis), i2.config.xaxis.min = a2.min, i2.config.xaxis.max = a2.max; var r2 = function(t4) { void 0 !== s2[t4] && (i2.config.yaxis[t4].min = s2[t4].min, i2.config.yaxis[t4].max = s2[t4].max); }; i2.config.yaxis.map((function(t4, a3) { i2.globals.zoomed || void 0 !== s2[a3] ? r2(a3) : void 0 !== e2.ctx.opts.yaxis[a3] && (t4.min = e2.ctx.opts.yaxis[a3].min, t4.max = e2.ctx.opts.yaxis[a3].max); })); } }]), t2; })(); !(function() { function t2() { for (var t3 = arguments.length > 0 && arguments[0] !== h2 ? arguments[0] : [], s3 = arguments.length > 1 ? arguments[1] : h2, r2 = arguments.length > 2 ? arguments[2] : h2, n2 = arguments.length > 3 ? arguments[3] : h2, o2 = arguments.length > 4 ? arguments[4] : h2, l2 = arguments.length > 5 ? arguments[5] : h2, h2 = arguments.length > 6 ? arguments[6] : h2, c2 = t3.slice(s3, r2 || h2), d2 = n2.slice(o2, l2 || h2), u2 = 0, g2 = { pos: [0, 0], start: [0, 0] }, p2 = { pos: [0, 0], start: [0, 0] }; ; ) { if (c2[u2] = e2.call(g2, c2[u2]), d2[u2] = e2.call(p2, d2[u2]), c2[u2][0] != d2[u2][0] || "M" == c2[u2][0] || "A" == c2[u2][0] && (c2[u2][4] != d2[u2][4] || c2[u2][5] != d2[u2][5]) ? (Array.prototype.splice.apply(c2, [u2, 1].concat(a2.call(g2, c2[u2]))), Array.prototype.splice.apply(d2, [u2, 1].concat(a2.call(p2, d2[u2])))) : (c2[u2] = i2.call(g2, c2[u2]), d2[u2] = i2.call(p2, d2[u2])), ++u2 == c2.length && u2 == d2.length) break; u2 == c2.length && c2.push(["C", g2.pos[0], g2.pos[1], g2.pos[0], g2.pos[1], g2.pos[0], g2.pos[1]]), u2 == d2.length && d2.push(["C", p2.pos[0], p2.pos[1], p2.pos[0], p2.pos[1], p2.pos[0], p2.pos[1]]); } return { start: c2, dest: d2 }; } function e2(t3) { switch (t3[0]) { case "z": case "Z": t3[0] = "L", t3[1] = this.start[0], t3[2] = this.start[1]; break; case "H": t3[0] = "L", t3[2] = this.pos[1]; break; case "V": t3[0] = "L", t3[2] = t3[1], t3[1] = this.pos[0]; break; case "T": t3[0] = "Q", t3[3] = t3[1], t3[4] = t3[2], t3[1] = this.reflection[1], t3[2] = this.reflection[0]; break; case "S": t3[0] = "C", t3[6] = t3[4], t3[5] = t3[3], t3[4] = t3[2], t3[3] = t3[1], t3[2] = this.reflection[1], t3[1] = this.reflection[0]; } return t3; } function i2(t3) { var e3 = t3.length; return this.pos = [t3[e3 - 2], t3[e3 - 1]], -1 != "SCQT".indexOf(t3[0]) && (this.reflection = [2 * this.pos[0] - t3[e3 - 4], 2 * this.pos[1] - t3[e3 - 3]]), t3; } function a2(t3) { var e3 = [t3]; switch (t3[0]) { case "M": return this.pos = this.start = [t3[1], t3[2]], e3; case "L": t3[5] = t3[3] = t3[1], t3[6] = t3[4] = t3[2], t3[1] = this.pos[0], t3[2] = this.pos[1]; break; case "Q": t3[6] = t3[4], t3[5] = t3[3], t3[4] = 1 * t3[4] / 3 + 2 * t3[2] / 3, t3[3] = 1 * t3[3] / 3 + 2 * t3[1] / 3, t3[2] = 1 * this.pos[1] / 3 + 2 * t3[2] / 3, t3[1] = 1 * this.pos[0] / 3 + 2 * t3[1] / 3; break; case "A": e3 = (function(t4, e4) { var i3, a3, s3, r2, n2, o2, l2, h2, c2, d2, u2, g2, p2, f2, x2, b2, m2, v2, y2, w2, k2, A2, C2, S2, L2, M2, P2 = Math.abs(e4[1]), I2 = Math.abs(e4[2]), T2 = e4[3] % 360, z2 = e4[4], X2 = e4[5], R2 = e4[6], E2 = e4[7], Y2 = new bt(t4), H2 = new bt(R2, E2), O2 = []; if (0 === P2 || 0 === I2 || Y2.x === H2.x && Y2.y === H2.y) return [["C", Y2.x, Y2.y, H2.x, H2.y, H2.x, H2.y]]; i3 = new bt((Y2.x - H2.x) / 2, (Y2.y - H2.y) / 2).transform(new vt().rotate(T2)), a3 = i3.x * i3.x / (P2 * P2) + i3.y * i3.y / (I2 * I2), a3 > 1 && (P2 *= a3 = Math.sqrt(a3), I2 *= a3); s3 = new vt().rotate(T2).scale(1 / P2, 1 / I2).rotate(-T2), Y2 = Y2.transform(s3), H2 = H2.transform(s3), r2 = [H2.x - Y2.x, H2.y - Y2.y], o2 = r2[0] * r2[0] + r2[1] * r2[1], n2 = Math.sqrt(o2), r2[0] /= n2, r2[1] /= n2, l2 = o2 < 4 ? Math.sqrt(1 - o2 / 4) : 0, z2 === X2 && (l2 *= -1); h2 = new bt((H2.x + Y2.x) / 2 + l2 * -r2[1], (H2.y + Y2.y) / 2 + l2 * r2[0]), c2 = new bt(Y2.x - h2.x, Y2.y - h2.y), d2 = new bt(H2.x - h2.x, H2.y - h2.y), u2 = Math.acos(c2.x / Math.sqrt(c2.x * c2.x + c2.y * c2.y)), c2.y < 0 && (u2 *= -1); g2 = Math.acos(d2.x / Math.sqrt(d2.x * d2.x + d2.y * d2.y)), d2.y < 0 && (g2 *= -1); X2 && u2 > g2 && (g2 += 2 * Math.PI); !X2 && u2 < g2 && (g2 -= 2 * Math.PI); for (f2 = Math.ceil(2 * Math.abs(u2 - g2) / Math.PI), b2 = [], m2 = u2, p2 = (g2 - u2) / f2, x2 = 4 * Math.tan(p2 / 4) / 3, k2 = 0; k2 <= f2; k2++) y2 = Math.cos(m2), v2 = Math.sin(m2), w2 = new bt(h2.x + y2, h2.y + v2), b2[k2] = [new bt(w2.x + x2 * v2, w2.y - x2 * y2), w2, new bt(w2.x - x2 * v2, w2.y + x2 * y2)], m2 += p2; for (b2[0][0] = b2[0][1].clone(), b2[b2.length - 1][2] = b2[b2.length - 1][1].clone(), s3 = new vt().rotate(T2).scale(P2, I2).rotate(-T2), k2 = 0, A2 = b2.length; k2 < A2; k2++) b2[k2][0] = b2[k2][0].transform(s3), b2[k2][1] = b2[k2][1].transform(s3), b2[k2][2] = b2[k2][2].transform(s3); for (k2 = 1, A2 = b2.length; k2 < A2; k2++) C2 = (w2 = b2[k2 - 1][2]).x, S2 = w2.y, L2 = (w2 = b2[k2][0]).x, M2 = w2.y, R2 = (w2 = b2[k2][1]).x, E2 = w2.y, O2.push(["C", C2, S2, L2, M2, R2, E2]); return O2; })(this.pos, t3), t3 = e3[0]; } return t3[0] = "C", this.pos = [t3[5], t3[6]], this.reflection = [2 * t3[5] - t3[3], 2 * t3[6] - t3[4]], e3; } function s2() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e3 = arguments.length > 1 ? arguments[1] : void 0; if (false === e3) return false; for (var i3 = e3, a3 = t3.length; i3 < a3; ++i3) if ("M" == t3[i3][0]) return i3; return false; } Q(Ee, { morph: function(e3, i3, a3, r2, n2) { for (var o2 = this.parse(e3), l2 = this.parse(i3), h2 = 0, c2 = 0, d2 = false, u2 = false; false !== h2 || false !== c2; ) { var g2; d2 = s2(o2, false !== h2 && h2 + 1), u2 = s2(l2, false !== c2 && c2 + 1), false === h2 && (h2 = 0 == (g2 = new Ee(p2.start).bbox()).height || 0 == g2.width ? o2.push(o2[0]) - 1 : o2.push(["M", g2.x + g2.width / 2, g2.y + g2.height / 2]) - 1), false === c2 && (c2 = 0 == (g2 = new Ee(p2.dest).bbox()).height || 0 == g2.width ? l2.push(l2[0]) - 1 : l2.push(["M", g2.x + g2.width / 2, g2.y + g2.height / 2]) - 1); var p2 = t2(o2, h2, d2, l2, c2, u2); o2 = o2.slice(0, h2).concat(p2.start, false === d2 ? [] : o2.slice(d2)), l2 = l2.slice(0, c2).concat(p2.dest, false === u2 ? [] : l2.slice(u2)), h2 = false !== d2 && h2 + p2.start.length, c2 = false !== u2 && c2 + p2.dest.length; } this._array = o2, this.destination = new Ee(), this.destination._array = l2; var f2 = this.fromArray(o2.map((function(t3, e4) { var i4 = l2[e4].map((function(i5, s3) { return 0 === s3 ? i5 : r2.step(t3[s3], l2[e4][s3], a3, n2[e4], n2); })); return i4; }))); return f2; } }); })(); var Ja = (t2) => (t2.changedTouches && (t2 = t2.changedTouches[0]), { x: t2.clientX, y: t2.clientY }); var Qa = class { constructor(t2) { t2.remember("_draggable", this), this.el = t2, this.drag = this.drag.bind(this), this.startDrag = this.startDrag.bind(this), this.endDrag = this.endDrag.bind(this); } init(t2) { t2 ? (this.el.on("mousedown.drag", this.startDrag), this.el.on("touchstart.drag", this.startDrag, { passive: false })) : (this.el.off("mousedown.drag"), this.el.off("touchstart.drag")); } startDrag(t2) { const e2 = !t2.type.indexOf("mouse"); if (e2 && 1 !== t2.which && 0 !== t2.buttons) return; if (this.el.dispatch("beforedrag", { event: t2, handler: this }).defaultPrevented) return; t2.preventDefault(), t2.stopPropagation(), this.init(false), this.box = this.el.bbox(), this.lastClick = this.el.point(Ja(t2)); const i2 = (e2 ? "mouseup" : "touchend") + ".drag"; zt(window, (e2 ? "mousemove" : "touchmove") + ".drag", this.drag, this, { passive: false }), zt(window, i2, this.endDrag, this, { passive: false }), this.el.fire("dragstart", { event: t2, handler: this, box: this.box }); } drag(t2) { const { box: e2, lastClick: i2 } = this, a2 = this.el.point(Ja(t2)), s2 = a2.x - i2.x, r2 = a2.y - i2.y; if (!s2 && !r2) return e2; const n2 = e2.x + s2, o2 = e2.y + r2; this.box = new kt(n2, o2, e2.w, e2.h), this.lastClick = a2, this.el.dispatch("dragmove", { event: t2, handler: this, box: this.box }).defaultPrevented || this.move(n2, o2); } move(t2, e2) { "svg" === this.el.type ? gi.prototype.move.call(this.el, t2, e2) : this.el.move(t2, e2); } endDrag(t2) { this.drag(t2), this.el.fire("dragend", { event: t2, handler: this, box: this.box }), Xt(window, "mousemove.drag"), Xt(window, "touchmove.drag"), Xt(window, "mouseup.drag"), Xt(window, "touchend.drag"), this.init(true); } }; function Ka(t2, e2, i2, a2 = null) { return function(s2) { s2.preventDefault(), s2.stopPropagation(); var r2 = s2.pageX || s2.touches[0].pageX, n2 = s2.pageY || s2.touches[0].pageY; e2.fire(t2, { x: r2, y: n2, event: s2, index: a2, points: i2 }); }; } function ts([t2, e2], { a: i2, b: a2, c: s2, d: r2, e: n2, f: o2 }) { return [t2 * i2 + e2 * s2 + n2, t2 * a2 + e2 * r2 + o2]; } Q(Gt, { draggable(t2 = true) { return (this.remember("_draggable") || new Qa(this)).init(t2), this; } }); var es = class { constructor(t2) { this.el = t2, t2.remember("_selectHandler", this), this.selection = new gi(), this.order = ["lt", "t", "rt", "r", "rb", "b", "lb", "l", "rot"], this.mutationHandler = this.mutationHandler.bind(this); const e2 = F(); this.observer = new e2.MutationObserver(this.mutationHandler); } init(t2) { this.createHandle = t2.createHandle || this.createHandleFn, this.createRot = t2.createRot || this.createRotFn, this.updateHandle = t2.updateHandle || this.updateHandleFn, this.updateRot = t2.updateRot || this.updateRotFn, this.el.root().put(this.selection), this.updatePoints(), this.createSelection(), this.createResizeHandles(), this.updateResizeHandles(), this.createRotationHandle(), this.updateRotationHandle(), this.observer.observe(this.el.node, { attributes: true }); } active(t2, e2) { if (!t2) return this.selection.clear().remove(), void this.observer.disconnect(); this.init(e2); } createSelection() { this.selection.polygon(this.handlePoints).addClass("svg_select_shape"); } updateSelection() { this.selection.get(0).plot(this.handlePoints); } createResizeHandles() { this.handlePoints.forEach(((t2, e2, i2) => { const a2 = this.order[e2]; this.createHandle.call(this, this.selection, t2, e2, i2, a2), this.selection.get(e2 + 1).addClass("svg_select_handle svg_select_handle_" + a2).on("mousedown.selection touchstart.selection", Ka(a2, this.el, this.handlePoints, e2)); })); } createHandleFn(t2) { t2.polyline(); } updateHandleFn(t2, e2, i2, a2) { const s2 = a2.at(i2 - 1), r2 = a2[(i2 + 1) % a2.length], n2 = e2, o2 = [n2[0] - s2[0], n2[1] - s2[1]], l2 = [n2[0] - r2[0], n2[1] - r2[1]], h2 = Math.sqrt(o2[0] * o2[0] + o2[1] * o2[1]), c2 = Math.sqrt(l2[0] * l2[0] + l2[1] * l2[1]), d2 = [o2[0] / h2, o2[1] / h2], u2 = [l2[0] / c2, l2[1] / c2], g2 = [n2[0] - 10 * d2[0], n2[1] - 10 * d2[1]], p2 = [n2[0] - 10 * u2[0], n2[1] - 10 * u2[1]]; t2.plot([g2, n2, p2]); } updateResizeHandles() { this.handlePoints.forEach(((t2, e2, i2) => { const a2 = this.order[e2]; this.updateHandle.call(this, this.selection.get(e2 + 1), t2, e2, i2, a2); })); } createRotFn(t2) { t2.line(), t2.circle(5); } getPoint(t2) { return this.handlePoints[this.order.indexOf(t2)]; } getPointHandle(t2) { return this.selection.get(this.order.indexOf(t2) + 1); } updateRotFn(t2, e2) { const i2 = this.getPoint("t"); t2.get(0).plot(i2[0], i2[1], e2[0], e2[1]), t2.get(1).center(e2[0], e2[1]); } createRotationHandle() { const t2 = this.selection.group().addClass("svg_select_handle_rot").on("mousedown.selection touchstart.selection", Ka("rot", this.el, this.handlePoints)); this.createRot.call(this, t2); } updateRotationHandle() { const t2 = this.selection.findOne("g.svg_select_handle_rot"); this.updateRot(t2, this.rotationPoint, this.handlePoints); } updatePoints() { const t2 = this.el.bbox(), e2 = this.el.parent().screenCTM().inverseO().multiplyO(this.el.screenCTM()); this.handlePoints = this.getHandlePoints(t2).map(((t3) => ts(t3, e2))), this.rotationPoint = ts(this.getRotationPoint(t2), e2); } getHandlePoints({ x: t2, x2: e2, y: i2, y2: a2, cx: s2, cy: r2 } = this.el.bbox()) { return [[t2, i2], [s2, i2], [e2, i2], [e2, r2], [e2, a2], [s2, a2], [t2, a2], [t2, r2]]; } getRotationPoint({ y: t2, cx: e2 } = this.el.bbox()) { return [e2, t2 - 20]; } mutationHandler() { this.updatePoints(), this.updateSelection(), this.updateResizeHandles(), this.updateRotationHandle(); } }; var is = (t2) => function(e2 = true, i2 = {}) { "object" == typeof e2 && (i2 = e2, e2 = true); let a2 = this.remember("_" + t2.name); return a2 || (e2.prototype instanceof es ? (a2 = new e2(this), e2 = true) : a2 = new t2(this), this.remember("_" + t2.name, a2)), a2.active(e2, i2), this; }; function as(t2, e2, i2, a2 = null) { return function(s2) { s2.preventDefault(), s2.stopPropagation(); var r2 = s2.pageX || s2.touches[0].pageX, n2 = s2.pageY || s2.touches[0].pageY; e2.fire(t2, { x: r2, y: n2, event: s2, index: a2, points: i2 }); }; } function ss([t2, e2], { a: i2, b: a2, c: s2, d: r2, e: n2, f: o2 }) { return [t2 * i2 + e2 * s2 + n2, t2 * a2 + e2 * r2 + o2]; } Q(Gt, { select: is(es) }), Q([Ge, je, xe], { pointSelect: is(class { constructor(t2) { this.el = t2, t2.remember("_pointSelectHandler", this), this.selection = new gi(), this.order = ["lt", "t", "rt", "r", "rb", "b", "lb", "l", "rot"], this.mutationHandler = this.mutationHandler.bind(this); const e2 = F(); this.observer = new e2.MutationObserver(this.mutationHandler); } init(t2) { this.createHandle = t2.createHandle || this.createHandleFn, this.updateHandle = t2.updateHandle || this.updateHandleFn, this.el.root().put(this.selection), this.updatePoints(), this.createSelection(), this.createPointHandles(), this.updatePointHandles(), this.observer.observe(this.el.node, { attributes: true }); } active(t2, e2) { if (!t2) return this.selection.clear().remove(), void this.observer.disconnect(); this.init(e2); } createSelection() { this.selection.polygon(this.points).addClass("svg_select_shape_pointSelect"); } updateSelection() { this.selection.get(0).plot(this.points); } createPointHandles() { this.points.forEach(((t2, e2, i2) => { this.createHandle.call(this, this.selection, t2, e2, i2), this.selection.get(e2 + 1).addClass("svg_select_handle_point").on("mousedown.selection touchstart.selection", Ka("point", this.el, this.points, e2)); })); } createHandleFn(t2) { t2.circle(5); } updateHandleFn(t2, e2) { t2.center(e2[0], e2[1]); } updatePointHandles() { this.points.forEach(((t2, e2, i2) => { this.updateHandle.call(this, this.selection.get(e2 + 1), t2, e2, i2); })); } updatePoints() { const t2 = this.el.parent().screenCTM().inverseO().multiplyO(this.el.screenCTM()); this.points = this.el.array().map(((e2) => ts(e2, t2))); } mutationHandler() { this.updatePoints(), this.updateSelection(), this.updatePointHandles(); } }) }); var rs = class { constructor(t2) { this.el = t2, t2.remember("_selectHandler", this), this.selection = new gi(), this.order = ["lt", "t", "rt", "r", "rb", "b", "lb", "l", "rot"], this.mutationHandler = this.mutationHandler.bind(this); const e2 = F(); this.observer = new e2.MutationObserver(this.mutationHandler); } init(t2) { this.createHandle = t2.createHandle || this.createHandleFn, this.createRot = t2.createRot || this.createRotFn, this.updateHandle = t2.updateHandle || this.updateHandleFn, this.updateRot = t2.updateRot || this.updateRotFn, this.el.root().put(this.selection), this.updatePoints(), this.createSelection(), this.createResizeHandles(), this.updateResizeHandles(), this.createRotationHandle(), this.updateRotationHandle(), this.observer.observe(this.el.node, { attributes: true }); } active(t2, e2) { if (!t2) return this.selection.clear().remove(), void this.observer.disconnect(); this.init(e2); } createSelection() { this.selection.polygon(this.handlePoints).addClass("svg_select_shape"); } updateSelection() { this.selection.get(0).plot(this.handlePoints); } createResizeHandles() { this.handlePoints.forEach(((t2, e2, i2) => { const a2 = this.order[e2]; this.createHandle.call(this, this.selection, t2, e2, i2, a2), this.selection.get(e2 + 1).addClass("svg_select_handle svg_select_handle_" + a2).on("mousedown.selection touchstart.selection", as(a2, this.el, this.handlePoints, e2)); })); } createHandleFn(t2) { t2.polyline(); } updateHandleFn(t2, e2, i2, a2) { const s2 = a2.at(i2 - 1), r2 = a2[(i2 + 1) % a2.length], n2 = e2, o2 = [n2[0] - s2[0], n2[1] - s2[1]], l2 = [n2[0] - r2[0], n2[1] - r2[1]], h2 = Math.sqrt(o2[0] * o2[0] + o2[1] * o2[1]), c2 = Math.sqrt(l2[0] * l2[0] + l2[1] * l2[1]), d2 = [o2[0] / h2, o2[1] / h2], u2 = [l2[0] / c2, l2[1] / c2], g2 = [n2[0] - 10 * d2[0], n2[1] - 10 * d2[1]], p2 = [n2[0] - 10 * u2[0], n2[1] - 10 * u2[1]]; t2.plot([g2, n2, p2]); } updateResizeHandles() { this.handlePoints.forEach(((t2, e2, i2) => { const a2 = this.order[e2]; this.updateHandle.call(this, this.selection.get(e2 + 1), t2, e2, i2, a2); })); } createRotFn(t2) { t2.line(), t2.circle(5); } getPoint(t2) { return this.handlePoints[this.order.indexOf(t2)]; } getPointHandle(t2) { return this.selection.get(this.order.indexOf(t2) + 1); } updateRotFn(t2, e2) { const i2 = this.getPoint("t"); t2.get(0).plot(i2[0], i2[1], e2[0], e2[1]), t2.get(1).center(e2[0], e2[1]); } createRotationHandle() { const t2 = this.selection.group().addClass("svg_select_handle_rot").on("mousedown.selection touchstart.selection", as("rot", this.el, this.handlePoints)); this.createRot.call(this, t2); } updateRotationHandle() { const t2 = this.selection.findOne("g.svg_select_handle_rot"); this.updateRot(t2, this.rotationPoint, this.handlePoints); } updatePoints() { const t2 = this.el.bbox(), e2 = this.el.parent().screenCTM().inverseO().multiplyO(this.el.screenCTM()); this.handlePoints = this.getHandlePoints(t2).map(((t3) => ss(t3, e2))), this.rotationPoint = ss(this.getRotationPoint(t2), e2); } getHandlePoints({ x: t2, x2: e2, y: i2, y2: a2, cx: s2, cy: r2 } = this.el.bbox()) { return [[t2, i2], [s2, i2], [e2, i2], [e2, r2], [e2, a2], [s2, a2], [t2, a2], [t2, r2]]; } getRotationPoint({ y: t2, cx: e2 } = this.el.bbox()) { return [e2, t2 - 20]; } mutationHandler() { this.updatePoints(), this.updateSelection(), this.updateResizeHandles(), this.updateRotationHandle(); } }; var ns = (t2) => function(e2 = true, i2 = {}) { "object" == typeof e2 && (i2 = e2, e2 = true); let a2 = this.remember("_" + t2.name); return a2 || (e2.prototype instanceof rs ? (a2 = new e2(this), e2 = true) : a2 = new t2(this), this.remember("_" + t2.name, a2)), a2.active(e2, i2), this; }; Q(Gt, { select: ns(rs) }), Q([Ge, je, xe], { pointSelect: ns(class { constructor(t2) { this.el = t2, t2.remember("_pointSelectHandler", this), this.selection = new gi(), this.order = ["lt", "t", "rt", "r", "rb", "b", "lb", "l", "rot"], this.mutationHandler = this.mutationHandler.bind(this); const e2 = F(); this.observer = new e2.MutationObserver(this.mutationHandler); } init(t2) { this.createHandle = t2.createHandle || this.createHandleFn, this.updateHandle = t2.updateHandle || this.updateHandleFn, this.el.root().put(this.selection), this.updatePoints(), this.createSelection(), this.createPointHandles(), this.updatePointHandles(), this.observer.observe(this.el.node, { attributes: true }); } active(t2, e2) { if (!t2) return this.selection.clear().remove(), void this.observer.disconnect(); this.init(e2); } createSelection() { this.selection.polygon(this.points).addClass("svg_select_shape_pointSelect"); } updateSelection() { this.selection.get(0).plot(this.points); } createPointHandles() { this.points.forEach(((t2, e2, i2) => { this.createHandle.call(this, this.selection, t2, e2, i2), this.selection.get(e2 + 1).addClass("svg_select_handle_point").on("mousedown.selection touchstart.selection", as("point", this.el, this.points, e2)); })); } createHandleFn(t2) { t2.circle(5); } updateHandleFn(t2, e2) { t2.center(e2[0], e2[1]); } updatePointHandles() { this.points.forEach(((t2, e2, i2) => { this.updateHandle.call(this, this.selection.get(e2 + 1), t2, e2, i2); })); } updatePoints() { const t2 = this.el.parent().screenCTM().inverseO().multiplyO(this.el.screenCTM()); this.points = this.el.array().map(((e2) => ss(e2, t2))); } mutationHandler() { this.updatePoints(), this.updateSelection(), this.updatePointHandles(); } }) }); var os = (t2) => (t2.changedTouches && (t2 = t2.changedTouches[0]), { x: t2.clientX, y: t2.clientY }); var ls = (t2) => { let e2 = 1 / 0, i2 = 1 / 0, a2 = -1 / 0, s2 = -1 / 0; for (let r2 = 0; r2 < t2.length; r2++) { const n2 = t2[r2]; e2 = Math.min(e2, n2[0]), i2 = Math.min(i2, n2[1]), a2 = Math.max(a2, n2[0]), s2 = Math.max(s2, n2[1]); } return new kt(e2, i2, a2 - e2, s2 - i2); }; var hs = class { constructor(t2) { this.el = t2, t2.remember("_ResizeHandler", this), this.lastCoordinates = null, this.eventType = "", this.lastEvent = null, this.handleResize = this.handleResize.bind(this), this.resize = this.resize.bind(this), this.endResize = this.endResize.bind(this), this.rotate = this.rotate.bind(this), this.movePoint = this.movePoint.bind(this); } active(t2, e2) { this.preserveAspectRatio = e2.preserveAspectRatio ?? false, this.aroundCenter = e2.aroundCenter ?? false, this.grid = e2.grid ?? 0, this.degree = e2.degree ?? 0, this.el.off(".resize"), t2 && (this.el.on(["lt.resize", "rt.resize", "rb.resize", "lb.resize", "t.resize", "r.resize", "b.resize", "l.resize", "rot.resize", "point.resize"], this.handleResize), this.lastEvent && ("rot" === this.eventType ? this.rotate(this.lastEvent) : "point" === this.eventType ? this.movePoint(this.lastEvent) : this.resize(this.lastEvent))); } handleResize(t2) { this.eventType = t2.type; const { event: e2, index: i2, points: a2 } = t2.detail, s2 = !e2.type.indexOf("mouse"); if (s2 && 1 !== (e2.which || e2.buttons)) return; if (this.el.dispatch("beforeresize", { event: t2, handler: this }).defaultPrevented) return; this.box = this.el.bbox(), this.startPoint = this.el.point(os(e2)), this.index = i2, this.points = a2.slice(); const r2 = (s2 ? "mousemove" : "touchmove") + ".resize", n2 = (s2 ? "mouseup" : "touchcancel.resize touchend") + ".resize"; "point" === t2.type ? zt(window, r2, this.movePoint) : "rot" === t2.type ? zt(window, r2, this.rotate) : zt(window, r2, this.resize), zt(window, n2, this.endResize); } resize(t2) { this.lastEvent = t2; const e2 = this.snapToGrid(this.el.point(os(t2))); let i2 = e2.x - this.startPoint.x, a2 = e2.y - this.startPoint.y; this.preserveAspectRatio && this.aroundCenter && (i2 *= 2, a2 *= 2); const s2 = this.box.x + i2, r2 = this.box.y + a2, n2 = this.box.x2 + i2, o2 = this.box.y2 + a2; let l2 = new kt(this.box); if (this.eventType.includes("l") && (l2.x = Math.min(s2, this.box.x2), l2.x2 = Math.max(s2, this.box.x2)), this.eventType.includes("r") && (l2.x = Math.min(n2, this.box.x), l2.x2 = Math.max(n2, this.box.x)), this.eventType.includes("t") && (l2.y = Math.min(r2, this.box.y2), l2.y2 = Math.max(r2, this.box.y2)), this.eventType.includes("b") && (l2.y = Math.min(o2, this.box.y), l2.y2 = Math.max(o2, this.box.y)), l2.width = l2.x2 - l2.x, l2.height = l2.y2 - l2.y, this.preserveAspectRatio) { const t3 = l2.width / this.box.width, e3 = l2.height / this.box.height, i3 = ["lt", "t", "rt", "r", "rb", "b", "lb", "l"], a3 = (i3.indexOf(this.eventType) + 4) % i3.length, s3 = this.aroundCenter ? [this.box.cx, this.box.cy] : this.points[a3]; let r3 = this.eventType.includes("t") || this.eventType.includes("b") ? e3 : t3; r3 = 2 === this.eventType.length ? Math.max(t3, e3) : r3, l2 = (function(t4, e4, i4) { const a4 = [[t4.x, t4.y], [t4.x + t4.width, t4.y], [t4.x + t4.width, t4.y + t4.height], [t4.x, t4.y + t4.height]].map((([t5, a5]) => { const s4 = t5 - e4[0], r4 = (a5 - e4[1]) * i4; return [s4 * i4 + e4[0], r4 + e4[1]]; })); return ls(a4); })(this.box, s3, r3); } this.el.dispatch("resize", { box: new kt(l2), angle: 0, eventType: this.eventType, event: t2, handler: this }).defaultPrevented || this.el.size(l2.width, l2.height).move(l2.x, l2.y); } movePoint(t2) { this.lastEvent = t2; const { x: e2, y: i2 } = this.snapToGrid(this.el.point(os(t2))), a2 = this.el.array().slice(); a2[this.index] = [e2, i2], this.el.dispatch("resize", { box: ls(a2), angle: 0, eventType: this.eventType, event: t2, handler: this }).defaultPrevented || this.el.plot(a2); } rotate(t2) { this.lastEvent = t2; const e2 = this.startPoint, i2 = this.el.point(os(t2)), { cx: a2, cy: s2 } = this.box, r2 = e2.x - a2, n2 = e2.y - s2, o2 = i2.x - a2, l2 = i2.y - s2, h2 = Math.sqrt(r2 * r2 + n2 * n2) * Math.sqrt(o2 * o2 + l2 * l2); if (0 === h2) return; let c2 = Math.acos((r2 * o2 + n2 * l2) / h2) / Math.PI * 180; if (!c2) return; i2.x < e2.x && (c2 = -c2); const d2 = new vt(this.el), { x: u2, y: g2 } = new bt(a2, s2).transformO(d2), { rotate: p2 } = d2.decompose(), f2 = this.snapToAngle(p2 + c2) - p2; this.el.dispatch("resize", { box: this.box, angle: f2, eventType: this.eventType, event: t2, handler: this }).defaultPrevented || this.el.transform(d2.rotateO(f2, u2, g2)); } endResize(t2) { "rot" !== this.eventType && "point" !== this.eventType && this.resize(t2), this.lastEvent = null, this.eventType = "", Xt(window, "mousemove.resize touchmove.resize"), Xt(window, "mouseup.resize touchend.resize"); } snapToGrid(t2) { return this.grid && (t2.x = Math.round(t2.x / this.grid) * this.grid, t2.y = Math.round(t2.y / this.grid) * this.grid), t2; } snapToAngle(t2) { return this.degree && (t2 = Math.round(t2 / this.degree) * this.degree), t2; } }; Q(Gt, { resize: function(t2 = true, e2 = {}) { "object" == typeof t2 && (e2 = t2, t2 = true); let i2 = this.remember("_ResizeHandler"); return i2 || (t2.prototype instanceof hs ? (i2 = new t2(this), t2 = true) : i2 = new hs(this), this.remember("_resizeHandler", i2)), i2.active(t2, e2), this; } }), void 0 === window.SVG && (window.SVG = yi), void 0 === window.Apex && (window.Apex = {}); var cs = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "initModules", value: function() { this.ctx.publicMethods = ["updateOptions", "updateSeries", "appendData", "appendSeries", "isSeriesHidden", "highlightSeries", "toggleSeries", "showSeries", "hideSeries", "setLocale", "resetSeries", "zoomX", "toggleDataPointSelection", "dataURI", "exportToCSV", "addXaxisAnnotation", "addYaxisAnnotation", "addPointAnnotation", "clearAnnotations", "removeAnnotation", "paper", "destroy"], this.ctx.eventList = ["click", "mousedown", "mousemove", "mouseleave", "touchstart", "touchmove", "touchleave", "mouseup", "touchend"], this.ctx.animations = new y(this.ctx), this.ctx.axes = new na(this.ctx), this.ctx.core = new Za(this.ctx.el, this.ctx), this.ctx.config = new Wi({}), this.ctx.data = new Ji(this.ctx), this.ctx.grid = new ta(this.ctx), this.ctx.graphics = new Mi(this.ctx), this.ctx.coreUtils = new Pi(this.ctx), this.ctx.crosshairs = new oa(this.ctx), this.ctx.events = new sa(this.ctx), this.ctx.exports = new Qi(this.ctx), this.ctx.fill = new ji(this.ctx), this.ctx.localization = new ra(this.ctx), this.ctx.options = new Oi(), this.ctx.responsive = new la(this.ctx), this.ctx.series = new $i(this.ctx), this.ctx.theme = new ha(this.ctx), this.ctx.formatters = new Xi(this.ctx), this.ctx.titleSubtitle = new ca(this.ctx), this.ctx.legend = new ba(this.ctx), this.ctx.toolbar = new ma(this.ctx), this.ctx.tooltip = new La(this.ctx), this.ctx.dimensions = new fa(this.ctx), this.ctx.updateHelpers = new $a(this.ctx), this.ctx.zoomPanSelection = new va(this.ctx), this.ctx.w.globals.tooltip = new La(this.ctx); } }]), t2; })(); var ds = (function() { function t2(e2) { i(this, t2), this.ctx = e2, this.w = e2.w; } return s(t2, [{ key: "clear", value: function(t3) { var e2 = t3.isUpdating; this.ctx.zoomPanSelection && this.ctx.zoomPanSelection.destroy(), this.ctx.toolbar && this.ctx.toolbar.destroy(), this.ctx.animations = null, this.ctx.axes = null, this.ctx.annotations = null, this.ctx.core = null, this.ctx.data = null, this.ctx.grid = null, this.ctx.series = null, this.ctx.responsive = null, this.ctx.theme = null, this.ctx.formatters = null, this.ctx.titleSubtitle = null, this.ctx.legend = null, this.ctx.dimensions = null, this.ctx.options = null, this.ctx.crosshairs = null, this.ctx.zoomPanSelection = null, this.ctx.updateHelpers = null, this.ctx.toolbar = null, this.ctx.localization = null, this.ctx.w.globals.tooltip = null, this.clearDomElements({ isUpdating: e2 }); } }, { key: "killSVG", value: function(t3) { t3.each((function() { this.removeClass("*"), this.off(); }), true), t3.clear(); } }, { key: "clearDomElements", value: function(t3) { var e2 = this, i2 = t3.isUpdating, a2 = this.w.globals.dom.Paper.node; a2.parentNode && a2.parentNode.parentNode && !i2 && (a2.parentNode.parentNode.style.minHeight = "unset"); var s2 = this.w.globals.dom.baseEl; s2 && this.ctx.eventList.forEach((function(t4) { s2.removeEventListener(t4, e2.ctx.events.documentEvent); })); var r2 = this.w.globals.dom; if (null !== this.ctx.el) for (; this.ctx.el.firstChild; ) this.ctx.el.removeChild(this.ctx.el.firstChild); this.killSVG(r2.Paper), r2.Paper.remove(), r2.elWrap = null, r2.elGraphical = null, r2.elLegendWrap = null, r2.elLegendForeign = null, r2.baseEl = null, r2.elGridRect = null, r2.elGridRectMask = null, r2.elGridRectBarMask = null, r2.elGridRectMarkerMask = null, r2.elForecastMask = null, r2.elNonForecastMask = null, r2.elDefs = null; } }]), t2; })(); var us = /* @__PURE__ */ new WeakMap(); var gs = (function() { function t2(e2, a2) { i(this, t2), this.opts = a2, this.ctx = this, this.w = new Gi(a2).init(), this.el = e2, this.w.globals.cuid = v.randomId(), this.w.globals.chartID = this.w.config.chart.id ? v.escapeString(this.w.config.chart.id) : this.w.globals.cuid, new cs(this).initModules(), this.lastUpdateOptions = null, this.create = v.bind(this.create, this), this.windowResizeHandler = this._windowResizeHandler.bind(this), this.parentResizeHandler = this._parentResizeCallback.bind(this); } return s(t2, [{ key: "render", value: function() { var t3 = this; return new Promise((function(e2, i2) { if (v.elementExists(t3.el)) { void 0 === Apex._chartInstances && (Apex._chartInstances = []), t3.w.config.chart.id && Apex._chartInstances.push({ id: t3.w.globals.chartID, group: t3.w.config.chart.group, chart: t3 }), t3.setLocale(t3.w.config.chart.defaultLocale); var a2 = t3.w.config.chart.events.beforeMount; "function" == typeof a2 && a2(t3, t3.w), t3.events.fireEvent("beforeMount", [t3, t3.w]), window.addEventListener("resize", t3.windowResizeHandler), (function(t4, e3) { var i3 = false; if (t4.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { var a3 = t4.getBoundingClientRect(); "none" !== t4.style.display && 0 !== a3.width || (i3 = true); } var s3 = new ResizeObserver((function(a4) { i3 && e3.call(t4, a4), i3 = true; })); t4.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? Array.from(t4.children).forEach((function(t5) { return s3.observe(t5); })) : s3.observe(t4), us.set(e3, s3); })(t3.el.parentNode, t3.parentResizeHandler); var s2 = t3.el.getRootNode && t3.el.getRootNode(), r2 = v.is("ShadowRoot", s2), n2 = t3.el.ownerDocument, o2 = r2 ? s2.getElementById("apexcharts-css") : n2.getElementById("apexcharts-css"); if (!o2) { var l2; (o2 = document.createElement("style")).id = "apexcharts-css", o2.textContent = '@keyframes opaque {\n 0% {\n opacity: 0\n }\n\n to {\n opacity: 1\n }\n}\n\n@keyframes resizeanim {\n\n 0%,\n to {\n opacity: 0\n }\n}\n\n.apexcharts-canvas {\n position: relative;\n direction: ltr !important;\n user-select: none\n}\n\n.apexcharts-canvas ::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 6px\n}\n\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, .5);\n box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5)\n}\n\n.apexcharts-inner {\n position: relative\n}\n\n.apexcharts-text tspan {\n font-family: inherit\n}\n\nrect.legend-mouseover-inactive,\n.legend-mouseover-inactive rect,\n.legend-mouseover-inactive path,\n.legend-mouseover-inactive circle,\n.legend-mouseover-inactive line,\n.legend-mouseover-inactive text.apexcharts-yaxis-title-text,\n.legend-mouseover-inactive text.apexcharts-yaxis-label {\n transition: .15s ease all;\n opacity: .2\n}\n\n.apexcharts-legend-text {\n padding-left: 15px;\n margin-left: -15px;\n}\n\n.apexcharts-series-collapsed {\n opacity: 0\n}\n\n.apexcharts-tooltip {\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px #999;\n cursor: default;\n font-size: 14px;\n left: 62px;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n top: 20px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n white-space: nowrap;\n z-index: 12;\n transition: .15s ease all\n}\n\n.apexcharts-tooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-tooltip.apexcharts-theme-light {\n border: 1px solid #e3e3e3;\n background: rgba(255, 255, 255, .96)\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark {\n color: #fff;\n background: rgba(30, 30, 30, .8)\n}\n\n.apexcharts-tooltip * {\n font-family: inherit\n}\n\n.apexcharts-tooltip-title {\n padding: 6px;\n font-size: 15px;\n margin-bottom: 4px\n}\n\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {\n background: #eceff1;\n border-bottom: 1px solid #ddd\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\n background: rgba(0, 0, 0, .7);\n border-bottom: 1px solid #333\n}\n\n.apexcharts-tooltip-text-goals-value,\n.apexcharts-tooltip-text-y-value,\n.apexcharts-tooltip-text-z-value {\n display: inline-block;\n margin-left: 5px;\n font-weight: 600\n}\n\n.apexcharts-tooltip-text-goals-label:empty,\n.apexcharts-tooltip-text-goals-value:empty,\n.apexcharts-tooltip-text-y-label:empty,\n.apexcharts-tooltip-text-y-value:empty,\n.apexcharts-tooltip-text-z-value:empty,\n.apexcharts-tooltip-title:empty {\n display: none\n}\n\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n padding: 6px 0 5px\n}\n\n.apexcharts-tooltip-goals-group,\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n display: flex\n}\n\n.apexcharts-tooltip-text-goals-label:not(:empty),\n.apexcharts-tooltip-text-goals-value:not(:empty) {\n margin-top: -6px\n}\n\n.apexcharts-tooltip-marker {\n display: inline-block;\n position: relative;\n width: 16px;\n height: 16px;\n font-size: 16px;\n line-height: 16px;\n margin-right: 4px;\n text-align: center;\n vertical-align: middle;\n color: inherit;\n}\n\n.apexcharts-tooltip-marker::before {\n content: "";\n display: inline-block;\n width: 100%;\n text-align: center;\n color: currentcolor;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n font-size: 26px;\n font-family: Arial, Helvetica, sans-serif;\n line-height: 14px;\n font-weight: 900;\n}\n\n.apexcharts-tooltip-marker[shape="circle"]::before {\n content: "\\25CF";\n}\n\n.apexcharts-tooltip-marker[shape="square"]::before,\n.apexcharts-tooltip-marker[shape="rect"]::before {\n content: "\\25A0";\n transform: translate(-1px, -2px);\n}\n\n.apexcharts-tooltip-marker[shape="line"]::before {\n content: "\\2500";\n}\n\n.apexcharts-tooltip-marker[shape="diamond"]::before {\n content: "\\25C6";\n font-size: 28px;\n}\n\n.apexcharts-tooltip-marker[shape="triangle"]::before {\n content: "\\25B2";\n font-size: 22px;\n}\n\n.apexcharts-tooltip-marker[shape="cross"]::before {\n content: "\\2715";\n font-size: 18px;\n}\n\n.apexcharts-tooltip-marker[shape="plus"]::before {\n content: "\\2715";\n transform: rotate(45deg) translate(-1px, -1px);\n font-size: 18px;\n}\n\n.apexcharts-tooltip-marker[shape="star"]::before {\n content: "\\2605";\n font-size: 18px;\n}\n\n.apexcharts-tooltip-marker[shape="sparkle"]::before {\n content: "\\2726";\n font-size: 20px;\n}\n\n.apexcharts-tooltip-series-group {\n padding: 0 10px;\n display: none;\n text-align: left;\n justify-content: left;\n align-items: center\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\n opacity: 1\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active,\n.apexcharts-tooltip-series-group:last-child {\n padding-bottom: 4px\n}\n\n.apexcharts-tooltip-y-group {\n padding: 6px 0 5px\n}\n\n.apexcharts-custom-tooltip,\n.apexcharts-tooltip-box {\n padding: 4px 8px\n}\n\n.apexcharts-tooltip-boxPlot {\n display: flex;\n flex-direction: column-reverse\n}\n\n.apexcharts-tooltip-box>div {\n margin: 4px 0\n}\n\n.apexcharts-tooltip-box span.value {\n font-weight: 700\n}\n\n.apexcharts-tooltip-rangebar {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-rangebar .category {\n font-weight: 600;\n color: #777\n}\n\n.apexcharts-tooltip-rangebar .series-name {\n font-weight: 700;\n display: block;\n margin-bottom: 5px\n}\n\n.apexcharts-xaxistooltip,\n.apexcharts-yaxistooltip {\n opacity: 0;\n pointer-events: none;\n color: #373d3f;\n font-size: 13px;\n text-align: center;\n border-radius: 2px;\n position: absolute;\n z-index: 10;\n background: #eceff1;\n border: 1px solid #90a4ae\n}\n\n.apexcharts-xaxistooltip {\n padding: 9px 10px;\n transition: .15s ease all\n}\n\n.apexcharts-xaxistooltip.apexcharts-theme-dark {\n background: rgba(0, 0, 0, .7);\n border: 1px solid rgba(0, 0, 0, .5);\n color: #fff\n}\n\n.apexcharts-xaxistooltip:after,\n.apexcharts-xaxistooltip:before {\n left: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-xaxistooltip:after {\n border-color: transparent;\n border-width: 6px;\n margin-left: -6px\n}\n\n.apexcharts-xaxistooltip:before {\n border-color: transparent;\n border-width: 7px;\n margin-left: -7px\n}\n\n.apexcharts-xaxistooltip-bottom:after,\n.apexcharts-xaxistooltip-bottom:before {\n bottom: 100%\n}\n\n.apexcharts-xaxistooltip-top:after,\n.apexcharts-xaxistooltip-top:before {\n top: 100%\n}\n\n.apexcharts-xaxistooltip-bottom:after {\n border-bottom-color: #eceff1\n}\n\n.apexcharts-xaxistooltip-bottom:before {\n border-bottom-color: #90a4ae\n}\n\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after,\n.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {\n border-bottom-color: rgba(0, 0, 0, .5)\n}\n\n.apexcharts-xaxistooltip-top:after {\n border-top-color: #eceff1\n}\n\n.apexcharts-xaxistooltip-top:before {\n border-top-color: #90a4ae\n}\n\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after,\n.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {\n border-top-color: rgba(0, 0, 0, .5)\n}\n\n.apexcharts-xaxistooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-yaxistooltip {\n padding: 4px 10px\n}\n\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\n background: rgba(0, 0, 0, .7);\n border: 1px solid rgba(0, 0, 0, .5);\n color: #fff\n}\n\n.apexcharts-yaxistooltip:after,\n.apexcharts-yaxistooltip:before {\n top: 50%;\n border: solid transparent;\n content: " ";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-yaxistooltip:after {\n border-color: transparent;\n border-width: 6px;\n margin-top: -6px\n}\n\n.apexcharts-yaxistooltip:before {\n border-color: transparent;\n border-width: 7px;\n margin-top: -7px\n}\n\n.apexcharts-yaxistooltip-left:after,\n.apexcharts-yaxistooltip-left:before {\n left: 100%\n}\n\n.apexcharts-yaxistooltip-right:after,\n.apexcharts-yaxistooltip-right:before {\n right: 100%\n}\n\n.apexcharts-yaxistooltip-left:after {\n border-left-color: #eceff1\n}\n\n.apexcharts-yaxistooltip-left:before {\n border-left-color: #90a4ae\n}\n\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after,\n.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {\n border-left-color: rgba(0, 0, 0, .5)\n}\n\n.apexcharts-yaxistooltip-right:after {\n border-right-color: #eceff1\n}\n\n.apexcharts-yaxistooltip-right:before {\n border-right-color: #90a4ae\n}\n\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after,\n.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {\n border-right-color: rgba(0, 0, 0, .5)\n}\n\n.apexcharts-yaxistooltip.apexcharts-active {\n opacity: 1\n}\n\n.apexcharts-yaxistooltip-hidden {\n display: none\n}\n\n.apexcharts-xcrosshairs,\n.apexcharts-ycrosshairs {\n pointer-events: none;\n opacity: 0;\n transition: .15s ease all\n}\n\n.apexcharts-xcrosshairs.apexcharts-active,\n.apexcharts-ycrosshairs.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-ycrosshairs-hidden {\n opacity: 0\n}\n\n.apexcharts-selection-rect {\n cursor: move\n}\n\n.svg_select_shape {\n stroke-width: 1;\n stroke-dasharray: 10 10;\n stroke: black;\n stroke-opacity: 0.1;\n pointer-events: none;\n fill: none;\n}\n\n.svg_select_handle {\n stroke-width: 3;\n stroke: black;\n fill: none;\n}\n\n.svg_select_handle_r {\n cursor: e-resize;\n}\n\n.svg_select_handle_l {\n cursor: w-resize;\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\n cursor: crosshair\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\n cursor: move\n}\n\n.apexcharts-menu-icon,\n.apexcharts-pan-icon,\n.apexcharts-reset-icon,\n.apexcharts-selection-icon,\n.apexcharts-toolbar-custom-icon,\n.apexcharts-zoom-icon,\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon {\n cursor: pointer;\n width: 20px;\n height: 20px;\n line-height: 24px;\n color: #6e8192;\n text-align: center\n}\n\n.apexcharts-menu-icon svg,\n.apexcharts-reset-icon svg,\n.apexcharts-zoom-icon svg,\n.apexcharts-zoomin-icon svg,\n.apexcharts-zoomout-icon svg {\n fill: #6e8192\n}\n\n.apexcharts-selection-icon svg {\n fill: #444;\n transform: scale(.76)\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon svg,\n.apexcharts-theme-dark .apexcharts-pan-icon svg,\n.apexcharts-theme-dark .apexcharts-reset-icon svg,\n.apexcharts-theme-dark .apexcharts-selection-icon svg,\n.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg,\n.apexcharts-theme-dark .apexcharts-zoom-icon svg,\n.apexcharts-theme-dark .apexcharts-zoomin-icon svg,\n.apexcharts-theme-dark .apexcharts-zoomout-icon svg {\n fill: #f3f4f5\n}\n\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg,\n.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,\n.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg {\n fill: #008ffb\n}\n\n.apexcharts-theme-light .apexcharts-menu-icon:hover svg,\n.apexcharts-theme-light .apexcharts-reset-icon:hover svg,\n.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,\n.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,\n.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,\n.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg {\n fill: #333\n}\n\n.apexcharts-menu-icon,\n.apexcharts-selection-icon {\n position: relative\n}\n\n.apexcharts-reset-icon {\n margin-left: 5px\n}\n\n.apexcharts-menu-icon,\n.apexcharts-reset-icon,\n.apexcharts-zoom-icon {\n transform: scale(.85)\n}\n\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon {\n transform: scale(.7)\n}\n\n.apexcharts-zoomout-icon {\n margin-right: 3px\n}\n\n.apexcharts-pan-icon {\n transform: scale(.62);\n position: relative;\n left: 1px;\n top: 0\n}\n\n.apexcharts-pan-icon svg {\n fill: #fff;\n stroke: #6e8192;\n stroke-width: 2\n}\n\n.apexcharts-pan-icon.apexcharts-selected svg {\n stroke: #008ffb\n}\n\n.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {\n stroke: #333\n}\n\n.apexcharts-toolbar {\n position: absolute;\n z-index: 11;\n max-width: 176px;\n text-align: right;\n border-radius: 3px;\n padding: 0 6px 2px;\n display: flex;\n justify-content: space-between;\n align-items: center\n}\n\n.apexcharts-menu {\n background: #fff;\n position: absolute;\n top: 100%;\n border: 1px solid #ddd;\n border-radius: 3px;\n padding: 3px;\n right: 10px;\n opacity: 0;\n min-width: 110px;\n transition: .15s ease all;\n pointer-events: none\n}\n\n.apexcharts-menu.apexcharts-menu-open {\n opacity: 1;\n pointer-events: all;\n transition: .15s ease all\n}\n\n.apexcharts-menu-item {\n padding: 6px 7px;\n font-size: 12px;\n cursor: pointer\n}\n\n.apexcharts-theme-light .apexcharts-menu-item:hover {\n background: #eee\n}\n\n.apexcharts-theme-dark .apexcharts-menu {\n background: rgba(0, 0, 0, .7);\n color: #fff\n}\n\n@media screen and (min-width:768px) {\n .apexcharts-canvas:hover .apexcharts-toolbar {\n opacity: 1\n }\n}\n\n.apexcharts-canvas .apexcharts-element-hidden,\n.apexcharts-datalabel.apexcharts-element-hidden,\n.apexcharts-hide .apexcharts-series-points {\n opacity: 0;\n}\n\n.apexcharts-hidden-element-shown {\n opacity: 1;\n transition: 0.25s ease all;\n}\n\n.apexcharts-datalabel,\n.apexcharts-datalabel-label,\n.apexcharts-datalabel-value,\n.apexcharts-datalabels,\n.apexcharts-pie-label {\n cursor: default;\n pointer-events: none\n}\n\n.apexcharts-pie-label-delay {\n opacity: 0;\n animation-name: opaque;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n animation-timing-function: ease\n}\n\n.apexcharts-radialbar-label {\n cursor: pointer;\n}\n\n.apexcharts-annotation-rect,\n.apexcharts-area-series .apexcharts-area,\n.apexcharts-gridline,\n.apexcharts-line,\n.apexcharts-point-annotation-label,\n.apexcharts-radar-series path:not(.apexcharts-marker),\n.apexcharts-radar-series polygon,\n.apexcharts-toolbar svg,\n.apexcharts-tooltip .apexcharts-marker,\n.apexcharts-xaxis-annotation-label,\n.apexcharts-yaxis-annotation-label,\n.apexcharts-zoom-rect,\n.no-pointer-events {\n pointer-events: none\n}\n\n.apexcharts-tooltip-active .apexcharts-marker {\n transition: .15s ease all\n}\n\n.apexcharts-radar-series .apexcharts-yaxis {\n pointer-events: none;\n}\n\n.resize-triggers {\n animation: 1ms resizeanim;\n visibility: hidden;\n opacity: 0;\n height: 100%;\n width: 100%;\n overflow: hidden\n}\n\n.contract-trigger:before,\n.resize-triggers,\n.resize-triggers>div {\n content: " ";\n display: block;\n position: absolute;\n top: 0;\n left: 0\n}\n\n.resize-triggers>div {\n height: 100%;\n width: 100%;\n background: #eee;\n overflow: auto\n}\n\n.contract-trigger:before {\n overflow: hidden;\n width: 200%;\n height: 200%\n}\n\n.apexcharts-bar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-bar-shadows {\n pointer-events: none\n}\n\n.apexcharts-rangebar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-disable-transitions * {\n transition: none !important;\n}'; var h2 = (null === (l2 = t3.opts.chart) || void 0 === l2 ? void 0 : l2.nonce) || t3.w.config.chart.nonce; h2 && o2.setAttribute("nonce", h2), r2 ? s2.prepend(o2) : false !== t3.w.config.chart.injectStyleSheet && n2.head.appendChild(o2); } var c2 = t3.create(t3.w.config.series, {}); if (!c2) return e2(t3); t3.mount(c2).then((function() { "function" == typeof t3.w.config.chart.events.mounted && t3.w.config.chart.events.mounted(t3, t3.w), t3.events.fireEvent("mounted", [t3, t3.w]), e2(c2); })).catch((function(t4) { i2(t4); })); } else i2(new Error("Element not found")); })); } }, { key: "create", value: function(t3, e2) { var i2 = this, a2 = this.w; new cs(this).initModules(); var s2 = this.w.globals; if (s2.noData = false, s2.animationEnded = false, !v.elementExists(this.el)) return s2.animationEnded = true, null; (this.responsive.checkResponsiveConfig(e2), a2.config.xaxis.convertedCatToNumeric) && new Ni(a2.config).convertCatToNumericXaxis(a2.config, this.ctx); if (this.core.setupElements(), "treemap" === a2.config.chart.type && (a2.config.grid.show = false, a2.config.yaxis[0].show = false), 0 === s2.svgWidth) return s2.animationEnded = true, null; var r2 = t3; t3.forEach((function(t4, e3) { t4.hidden && (r2 = i2.legend.legendHelpers.getSeriesAfterCollapsing({ realIndex: e3 })); })); var n2 = Pi.checkComboSeries(r2, a2.config.chart.type); s2.comboCharts = n2.comboCharts, s2.comboBarCount = n2.comboBarCount; var o2 = r2.every((function(t4) { return t4.data && 0 === t4.data.length; })); (0 === r2.length || o2 && s2.collapsedSeries.length < 1) && this.series.handleNoData(), this.events.setupEventHandlers(), this.data.parseData(r2), this.theme.init(), new Vi(this).setGlobalMarkerSize(), this.formatters.setLabelFormatters(), this.titleSubtitle.draw(), s2.noData && s2.collapsedSeries.length !== s2.series.length && !a2.config.legend.showForSingleSeries || this.legend.init(), this.series.hasAllSeriesEqualX(), s2.axisCharts && (this.core.coreCalculations(), "category" !== a2.config.xaxis.type && this.formatters.setLabelFormatters(), this.ctx.toolbar.minX = a2.globals.minX, this.ctx.toolbar.maxX = a2.globals.maxX), this.formatters.heatmapLabelFormatters(), new Pi(this).getLargestMarkerSize(), this.dimensions.plotCoords(); var l2 = this.core.xySettings(); this.grid.createGridMask(); var h2 = this.core.plotChartType(r2, l2), c2 = new qi(this); return c2.bringForward(), a2.config.dataLabels.background.enabled && c2.dataLabelsBackground(), this.core.shiftGraphPosition(), a2.globals.dataPoints > 50 && a2.globals.dom.elWrap.classList.add("apexcharts-disable-transitions"), { elGraph: h2, xyRatios: l2, dimensions: { plot: { left: a2.globals.translateX, top: a2.globals.translateY, width: a2.globals.gridWidth, height: a2.globals.gridHeight } } }; } }, { key: "mount", value: function() { var t3 = this, e2 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, i2 = this, a2 = i2.w; return new Promise((function(s2, r2) { if (null === i2.el) return r2(new Error("Not enough data to display or target element not found")); (null === e2 || a2.globals.allSeriesCollapsed) && i2.series.handleNoData(), i2.grid = new ta(i2); var n2, o2, l2 = i2.grid.drawGrid(); (i2.annotations = new Fi(i2), i2.annotations.drawImageAnnos(), i2.annotations.drawTextAnnos(), "back" === a2.config.grid.position) && (l2 && a2.globals.dom.elGraphical.add(l2.el), null != l2 && null !== (n2 = l2.elGridBorders) && void 0 !== n2 && n2.node && a2.globals.dom.elGraphical.add(l2.elGridBorders)); if (Array.isArray(e2.elGraph)) for (var h2 = 0; h2 < e2.elGraph.length; h2++) a2.globals.dom.elGraphical.add(e2.elGraph[h2]); else a2.globals.dom.elGraphical.add(e2.elGraph); "front" === a2.config.grid.position && (l2 && a2.globals.dom.elGraphical.add(l2.el), null != l2 && null !== (o2 = l2.elGridBorders) && void 0 !== o2 && o2.node && a2.globals.dom.elGraphical.add(l2.elGridBorders)); "front" === a2.config.xaxis.crosshairs.position && i2.crosshairs.drawXCrosshairs(), "front" === a2.config.yaxis[0].crosshairs.position && i2.crosshairs.drawYCrosshairs(), "treemap" !== a2.config.chart.type && i2.axes.drawAxis(a2.config.chart.type, l2); var c2 = new Ki(t3.ctx, l2), d2 = new aa(t3.ctx, l2); if (null !== l2 && (c2.xAxisLabelCorrections(l2.xAxisTickWidth), d2.setYAxisTextAlignments(), a2.config.yaxis.map((function(t4, e3) { -1 === a2.globals.ignoreYAxisIndexes.indexOf(e3) && d2.yAxisTitleRotate(e3, t4.opposite); }))), i2.annotations.drawAxesAnnotations(), !a2.globals.noData) { if (a2.config.tooltip.enabled && !a2.globals.noData && i2.w.globals.tooltip.drawTooltip(e2.xyRatios), a2.globals.axisCharts && (a2.globals.isXNumeric || a2.config.xaxis.convertedCatToNumeric || a2.globals.isRangeBar)) (a2.config.chart.zoom.enabled || a2.config.chart.selection && a2.config.chart.selection.enabled || a2.config.chart.pan && a2.config.chart.pan.enabled) && i2.zoomPanSelection.init({ xyRatios: e2.xyRatios }); else { var u2 = a2.config.chart.toolbar.tools; ["zoom", "zoomin", "zoomout", "selection", "pan", "reset"].forEach((function(t4) { u2[t4] = false; })); } a2.config.chart.toolbar.show && !a2.globals.allSeriesCollapsed && i2.toolbar.createToolbar(); } a2.globals.memory.methodsToExec.length > 0 && a2.globals.memory.methodsToExec.forEach((function(t4) { t4.method(t4.params, false, t4.context); })), a2.globals.axisCharts || a2.globals.noData || i2.core.resizeNonAxisCharts(), s2(i2); })); } }, { key: "destroy", value: function() { window.removeEventListener("resize", this.windowResizeHandler), (function(t4, e2) { var i2 = us.get(e2); i2 && (i2.disconnect(), us.delete(e2)); })(this.el.parentNode, this.parentResizeHandler); var t3 = this.w.config.chart.id; t3 && Apex._chartInstances.forEach((function(e2, i2) { e2.id === v.escapeString(t3) && Apex._chartInstances.splice(i2, 1); })), new ds(this.ctx).clear({ isUpdating: false }); } }, { key: "updateOptions", value: function(t3) { var e2 = this, i2 = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], a2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], s2 = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], r2 = !(arguments.length > 4 && void 0 !== arguments[4]) || arguments[4], n2 = this.w; return n2.globals.selection = void 0, this.lastUpdateOptions && JSON.stringify(this.lastUpdateOptions) === JSON.stringify(t3) ? this : (t3.series && (this.data.resetParsingFlags(), this.series.resetSeries(false, true, false), t3.series.length && t3.series[0].data && (t3.series = t3.series.map((function(t4, i3) { return e2.updateHelpers._extendSeries(t4, i3); }))), this.updateHelpers.revertDefaultAxisMinMax()), t3.xaxis && (t3 = this.updateHelpers.forceXAxisUpdate(t3)), t3.yaxis && (t3 = this.updateHelpers.forceYAxisUpdate(t3)), n2.globals.collapsedSeriesIndices.length > 0 && this.series.clearPreviousPaths(), t3.theme && (t3 = this.theme.updateThemeOptions(t3)), this.updateHelpers._updateOptions(t3, i2, a2, s2, r2)); } }, { key: "updateSeries", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; return this.data.resetParsingFlags(), this.series.resetSeries(false), this.updateHelpers.revertDefaultAxisMinMax(), this.updateHelpers._updateSeries(t3, e2, i2); } }, { key: "appendSeries", value: function(t3) { var e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; this.data.resetParsingFlags(); var a2 = this.w.config.series.slice(); return a2.push(t3), this.series.resetSeries(false), this.updateHelpers.revertDefaultAxisMinMax(), this.updateHelpers._updateSeries(a2, e2, i2); } }, { key: "appendData", value: function(t3) { var e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = this; i2.data.resetParsingFlags(), i2.w.globals.dataChanged = true, i2.series.getPreviousPaths(); for (var a2 = i2.w.config.series.slice(), s2 = 0; s2 < a2.length; s2++) if (null !== t3[s2] && void 0 !== t3[s2]) for (var r2 = 0; r2 < t3[s2].data.length; r2++) a2[s2].data.push(t3[s2].data[r2]); return i2.w.config.series = a2, e2 && (i2.w.globals.initialSeries = v.clone(i2.w.config.series)), this.update(); } }, { key: "update", value: function(t3) { var e2 = this; return new Promise((function(i2, a2) { if (e2.lastUpdateOptions && JSON.stringify(e2.lastUpdateOptions) === JSON.stringify(t3)) return i2(e2); e2.lastUpdateOptions = v.clone(t3), new ds(e2.ctx).clear({ isUpdating: true }); var s2 = e2.create(e2.w.config.series, t3); if (!s2) return i2(e2); e2.mount(s2).then((function() { "function" == typeof e2.w.config.chart.events.updated && e2.w.config.chart.events.updated(e2, e2.w), e2.events.fireEvent("updated", [e2, e2.w]), e2.w.globals.isDirty = true, i2(e2); })).catch((function(t4) { a2(t4); })); })); } }, { key: "getSyncedCharts", value: function() { var t3 = this.getGroupedCharts(), e2 = [this]; return t3.length && (e2 = [], t3.forEach((function(t4) { e2.push(t4); }))), e2; } }, { key: "getGroupedCharts", value: function() { var t3 = this; return Apex._chartInstances.filter((function(t4) { if (t4.group) return true; })).map((function(e2) { return t3.w.config.chart.group === e2.group ? e2.chart : t3; })); } }, { key: "toggleSeries", value: function(t3) { return this.series.toggleSeries(t3); } }, { key: "highlightSeriesOnLegendHover", value: function(t3, e2) { return this.series.toggleSeriesOnHover(t3, e2); } }, { key: "showSeries", value: function(t3) { this.series.showSeries(t3); } }, { key: "hideSeries", value: function(t3) { this.series.hideSeries(t3); } }, { key: "highlightSeries", value: function(t3) { this.series.highlightSeries(t3); } }, { key: "isSeriesHidden", value: function(t3) { this.series.isSeriesHidden(t3); } }, { key: "resetSeries", value: function() { var t3 = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; this.series.resetSeries(t3, e2); } }, { key: "addEventListener", value: function(t3, e2) { this.events.addEventListener(t3, e2); } }, { key: "removeEventListener", value: function(t3, e2) { this.events.removeEventListener(t3, e2); } }, { key: "addXaxisAnnotation", value: function(t3) { var e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a2 = this; i2 && (a2 = i2), a2.annotations.addXaxisAnnotationExternal(t3, e2, a2); } }, { key: "addYaxisAnnotation", value: function(t3) { var e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a2 = this; i2 && (a2 = i2), a2.annotations.addYaxisAnnotationExternal(t3, e2, a2); } }, { key: "addPointAnnotation", value: function(t3) { var e2 = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, a2 = this; i2 && (a2 = i2), a2.annotations.addPointAnnotationExternal(t3, e2, a2); } }, { key: "clearAnnotations", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : void 0, e2 = this; t3 && (e2 = t3), e2.annotations.clearAnnotations(e2); } }, { key: "removeAnnotation", value: function(t3) { var e2 = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : void 0, i2 = this; e2 && (i2 = e2), i2.annotations.removeAnnotation(i2, t3); } }, { key: "getChartArea", value: function() { return this.w.globals.dom.baseEl.querySelector(".apexcharts-inner"); } }, { key: "getSeriesTotalXRange", value: function(t3, e2) { return this.coreUtils.getSeriesTotalsXRange(t3, e2); } }, { key: "getHighestValueInSeries", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; return new ia(this.ctx).getMinYMaxY(t3).highestY; } }, { key: "getLowestValueInSeries", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; return new ia(this.ctx).getMinYMaxY(t3).lowestY; } }, { key: "getSeriesTotal", value: function() { return this.w.globals.seriesTotals; } }, { key: "toggleDataPointSelection", value: function(t3, e2) { return this.updateHelpers.toggleDataPointSelection(t3, e2); } }, { key: "zoomX", value: function(t3, e2) { this.ctx.toolbar.zoomUpdateOptions(t3, e2); } }, { key: "setLocale", value: function(t3) { this.localization.setCurrentLocaleValues(t3); } }, { key: "dataURI", value: function(t3) { return new Qi(this.ctx).dataURI(t3); } }, { key: "getSvgString", value: function(t3) { return new Qi(this.ctx).getSvgString(t3); } }, { key: "exportToCSV", value: function() { var t3 = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; return new Qi(this.ctx).exportToCSV(t3); } }, { key: "paper", value: function() { return this.w.globals.dom.Paper; } }, { key: "_parentResizeCallback", value: function() { this.w.globals.animationEnded && this.w.config.chart.redrawOnParentResize && this._windowResize(); } }, { key: "_windowResize", value: function() { var t3 = this; clearTimeout(this.w.globals.resizeTimer), this.w.globals.resizeTimer = window.setTimeout((function() { t3.w.globals.resized = true, t3.w.globals.dataChanged = false, t3.ctx.update(); }), 150); } }, { key: "_windowResizeHandler", value: function() { var t3 = this.w.config.chart.redrawOnWindowResize; "function" == typeof t3 && (t3 = t3()), t3 && this._windowResize(); } }], [{ key: "getChartByID", value: function(t3) { var e2 = v.escapeString(t3); if (Apex._chartInstances) { var i2 = Apex._chartInstances.filter((function(t4) { return t4.id === e2; }))[0]; return i2 && i2.chart; } } }, { key: "initOnLoad", value: function() { for (var e2 = document.querySelectorAll("[data-apexcharts]"), i2 = 0; i2 < e2.length; i2++) { new t2(e2[i2], JSON.parse(e2[i2].getAttribute("data-options"))).render(); } } }, { key: "exec", value: function(t3, e2) { var i2 = this.getChartByID(t3); if (i2) { i2.w.globals.isExecCalled = true; var a2 = null; if (-1 !== i2.publicMethods.indexOf(e2)) { for (var s2 = arguments.length, r2 = new Array(s2 > 2 ? s2 - 2 : 0), n2 = 2; n2 < s2; n2++) r2[n2 - 2] = arguments[n2]; a2 = i2[e2].apply(i2, r2); } return a2; } } }, { key: "merge", value: function(t3, e2) { return v.extend(t3, e2); } }, { key: "getThemePalettes", value: function() { return { palette1: ["#008FFB", "#00E396", "#FEB019", "#FF4560", "#775DD0"], palette2: ["#3F51B5", "#03A9F4", "#4CAF50", "#F9CE1D", "#FF9800"], palette3: ["#33B2DF", "#546E7A", "#D4526E", "#13D8AA", "#A5978B"], palette4: ["#4ECDC4", "#C7F464", "#81D4FA", "#FD6A6A", "#546E7A"], palette5: ["#2B908F", "#F9A3A4", "#90EE7E", "#FA4443", "#69D2E7"], palette6: ["#449DD1", "#F86624", "#EA3546", "#662E9B", "#C5D86D"], palette7: ["#D7263D", "#1B998B", "#2E294E", "#F46036", "#E2C044"], palette8: ["#662E9B", "#F86624", "#F9C80E", "#EA3546", "#43BCCD"], palette9: ["#5C4742", "#A5978B", "#8D5B4C", "#5A2A27", "#C4BBAF"], palette10: ["#A300D6", "#7D02EB", "#5653FE", "#2983FF", "#00B1F2"] }; } }]), t2; })(); // <stdin> var whenVisible = (ele, cbk) => { let observer = new IntersectionObserver(function(entries) { if (entries[0].isIntersecting === true) { observer.unobserve(ele); cbk(); return; } }, { threshold: [0] }); observer.observe(ele); }; core.ApexCharts = async (args, env) => { const options = await interpretate(args[0], env); const chart = new gs(env.element, options); whenVisible(env.element, () => chart.render()); }; /*! Bundled license information: apexcharts/dist/apexcharts.esm.js: (*! * ApexCharts v5.3.6 * (c) 2018-2025 ApexCharts *) (*! * @svgdotjs/svg.select.js - An extension of svg.js which allows to select elements with mouse * @version 4.0.1 * https://github.com/svgdotjs/svg.select.js * * @copyright Ulrich-Matthias Schäfer * @license MIT * * BUILT: Mon Jul 01 2024 15:04:42 GMT+0200 (Central European Summer Time) *) (*! * @svgdotjs/svg.resize.js - An extension for svg.js which allows to resize elements which are selected * @version 2.0.4 * https://github.com/svgdotjs/svg.resize.js * * @copyright [object Object] * @license MIT * * BUILT: Fri Sep 13 2024 12:43:14 GMT+0200 (Central European Summer Time) *) */ ``` Let's look at the documentation and create a simple example: ``` .mjs import ApexCharts from 'apexcharts' const dom = document.createElement('div'); this.return(dom); const chart = new ApexCharts(dom, { "series" : [44, 55, 67, 83], "labels" : ["Apples", "Oranges", "Bananas", "Berries"], "chart" : { "height" : 350, "type" : "radialBar" } }); this.after = () => { chart.render(); }; ``` ``` (*VB[*)(ApexCharts[<|"series" -> {44, 55, 67, 83}, "labels" -> {"Apples", "Oranges", "Bananas", "Berries"}, "chart" -> <|"height" -> 250, "type" -> "radialBar"|>|>])(*,*)(*"1:eJyFjs0KwjAQhKtWRX0K79492148CELzBNt20y6EJiQR9NU9udufgz8ggeHbWWYz+9IWepYkSUhZztbUw7RlOTm85y34GPRCvJ14IdiKIJLt9HyKFTeDaiUTesKg02lxoRDpwEBHkVxEsfyIGijRfET7xck5g0GtGa8eumbkDDp+I6Pv/32/umSopP7g/2/fIjVtpOd3QYH4cKg2DB5qApOBfwG1E0WT"*)(*]VB*) ``` ApexCharts requires the DOM element `dom` to be mounted to the document before calling the `render` method. This is why we used the "hook" `after`, which is called after the element is already in the document. Next, we can turn it into a frontend symbol with its own state and lifecycle. Let's adjust our script accordingly: ``` .mjs import ApexCharts from 'apexcharts' const whenVisible = (ele, cbk) => { let observer = new IntersectionObserver(function(entries) { if(entries[0].isIntersecting === true) { observer.unobserve(ele); cbk(); return; } }, { threshold: [0] }); observer.observe(ele); }; core.ApexCharts = async (args, env) => { const options = await interpretate(args[0], env); const chart = new ApexCharts(env.element, options); whenVisible(env.element, () => chart.render()) } ``` Here we added a `whenVisible` helper function that renders the chart when it becomes visible in the viewport. Therefore, if you have a long notebook, the animation will play at the right time. We provide chart data via the `chart` object, which will be represented as an `Association` on the Wolfram Language side. For the next step we need to define `ApexCharts` on the evaluation kernel: ``` ApexCharts; ``` That's it 😀 Actually, we need to define the [output form](./../Decorating-symbols) of `ApexCharts`. For now, we'll avoid data transformation and pass it as is: ``` ApexCharts /: MakeBoxes[a: ApexCharts[_Association], StandardForm] := ViewBox[a,a] ``` Now let's create an example chart: ``` ApexCharts[<| "series" -> { <|"name" -> "Net Profit", "data" -> RandomInteger[{2,4}, 5]|>, <|"name" -> "Revenue", "data" -> RandomInteger[{2,4}, 5]|>, <|"name" -> "Free Cash Flow", "data" -> RandomInteger[{2,4}, 5]|> }, "chart" -> <|"type" -> "bar", "width"->300|> |>] ``` ``` (*VB[*)(ApexCharts[<|"series" -> {<|"name" -> "Net Profit", "data" -> {3, 3, 4, 2, 4}|>, <|"name" -> "Revenue", "data" -> {2, 3, 3, 4, 4}|>, <|"name" -> "Free Cash Flow", "data" -> {4, 2, 4, 4, 2}|>}, "chart" -> <|"type" -> "bar", "width" -> 300|>|>])(*,*)(*"1:eJyVUVsKwjAQrG9Q8Az136/qBaRQFESkPUHabkigNiXZWr29WYtQpUL6M+xOsjOz7CZVMR95nmemFo6qyNtuaeFQwSMUTKPhY+JWxBmjMslQqrIlaSyuC0jm1IGWYPjk83CWBl1mqSjZDRKyvQD6V624xJ5fOUPGZ139E+XddXD/xqCtB7kviIE7lDW4Wwd/AgyzXtsi0gB+yIzwo0I17gm+Fu4yPxI0mdE9XZPhs4KEjpky3aPVyByF3FqrF4yWcaM="*)(*]VB*) ``` To use it in [slides](./../../Cell-types/Slide) or [Markdown](./../../Cell-types/Markdown) cells, define `WLXForm`: `WLXForm` requires any passed expression to be [frontend object](./../../Frontend-Objects/CreateFrontEndObject) ``` ApexCharts /: MakeBoxes[a: ApexCharts[_Association], WLXForm] := With[{ f = CreateFrontEndObject[a] }, MakeBoxes[f, WLXForm] ] ``` Final improvements [#final-improvements] Even if we set the `StandardForm` output form for `ApexCharts`, the input expression itself is still in the output cell. You can verify this by evaluating the output again. It may become an issue if the data reaches a few kilobytes, as it can slow down the editor. To solve this, we can compress it to a single reference represented as a [frontend object](./../../Frontend-Objects/CreateFrontEndObject). The data won't be lost and will remain valid for evaluation: ``` ApexCharts /: MakeBoxes[a: ApexCharts[_Association], form: StandardForm ] := With[{ o = CreateFrontEndObject[a] }, MakeBoxes[o, form] ] /; ByteCount[a] > 1024*4 ``` # Custom input elements An advanced guide how to define frontend symbols and make them do funky stuff for you </Cards> <wljs-store json="/attachments/90cb419b-f9ddf02e-6c0c-4ef1-a79e-3917e61abdbc.txt" /> This guide demonstrates how to create custom input components using pure JavaScript and WLX, providing interactive elements that integrate seamlessly with the Wolfram Language expressions. Creating a Basic Custom Component [#creating-a-basic-custom-component] You can define custom components using JavaScript cells and [defining a frontend symbol](./Overview). Here's a simple button component that fires events when clicked: ``` .js core.MyCustomComponent = async (args, env) => { const label = await interpretate(args[0], env); const ev = await interpretate(args[1], env); const button = document.createElement('button'); button.innerText = label; button.style.backgroundColor = "lightblue"; button.addEventListener('click', () => { server.kernel.io.fire(ev, true); }); env.element.appendChild(button); } ``` ``` core.MyCustomComponent = async (args, env) => { const label = await interpretate(args[0], env); const ev = await interpretate(args[1], env); const button = document.createElement('button'); button.innerText = label; button.style.backgroundColor = "lightblue"; button.addEventListener('click', () => { server.kernel.io.fire(ev, true); }); env.element.appendChild(button); } ``` Defining the Display Rules [#defining-the-display-rules] To make the component work with Wolfram Language's display system, you need to [define the output form](./../Decorating-symbols), that will use our frontend symbol as a display function: ``` MyCustomComponent /: MakeBoxes[m_MyCustomComponent, StandardForm] := With[{}, ViewBox[m, m] ] ``` and for slides, markdown cells use need to define `WLXForm` as well. This form does not have its own `ViewBox` and uses [frontend objects](./Overview) instead: ``` MyCustomComponent /: MakeBoxes[m_MyCustomComponent, WLXForm] := With[{ o = CreateFrontEndObject[m] }, MakeBoxes[o, WLXForm] ] ``` Example [#example] Now you can use the custom component in your notebook: ``` MyCustomComponent["Click me pls", "event1"] EventHandler["event1", Print]; ``` ``` (*VB[*)(MyCustomComponent["Click me pls", "event1"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWlMIJ4gkPCtdC4tLsnPdc7PLcjPS80rCeYBijrnZCZnK+SmKhTkFAezAQVSy4BShgB8pBLc"*)(*]VB*) ``` Integrating with Standard Inputs [#integrating-with-standard-inputs] For better integration with the standard input system, you can wrap your component in an `EventObject`. This approach makes your component behave like built-in input elements such as `InputRange` or `InputButton`: ``` ClearAll[MyCustomComponent] MyCustomInput[label_String] := With[{uid = CreateUUID[]}, EventObject[<|"Id"->uid, "View"->MyCustomComponent[label, uid]|>] ] ``` This pattern automatically generates a unique event ID and wraps your component in an `EventObject`, making it compatible with `EventHandler`. You do not need to define the output form, if the symbol is a `View` field of `EventObject` Example [#example-1] Easy and natural: ``` EventHandler[MyCustomInput["Click me"], Print] ``` When clicked, the button will trigger the event handler and print to the output. Using WLX [#using-wlx] [WLX](./../../Cell-types/WLX) provides a more intuitive way to write markup compared to pure JavaScript: ``` .wlx MyCustomComponent2[OptionsPattern[]] := With[{ Event = OptionValue["Event"], Label = OptionValue["Label"], Uid = CreateUUID[] }, <div> <button id="{Uid}" style="background: lightblue" class="p-1"> <Label/> </button> <script type="module"> document.getElementById('<Uid/>').addEventListener('click', () => { server.kernel.io.fire('<Event/>', true); }) </script> </div> ] Options[MyCustomComponent2] = {"Event" -> "", "Label" -> "Click me"}; ``` In order to use it the output cells of Wolfram Language, you need to wrap it with [HTMLView](./../../GUI/HTMLView) with WLX processor: ``` HTMLView[MyCustomComponent2["Event"->"test", "Label"->"Hello World!"], Prolog->HTMLView`WLXProcessor[]] EventHandler["test", Print]; ``` However, there is a caveat - `UId` for DOM element is generated per `MyCustomComponent2` constructor call. This means, you can't simply have multiple copies of the same input element in the notebook (if created by accident). To account this problem, we can generate DOM Id dynamically using string templates. Let's fix it: ``` .wlx MyCustomComponent2[OptionsPattern[]] := With[{ Event = OptionValue["Event"], Label = OptionValue["Label"] }, <div> <button id="#uid" style="background: lightblue" class="p-1"> <Label/> </button> <script type="module"> document.getElementById('#uid').addEventListener('click', () => { server.kernel.io.fire('<Event/>', true); }) </script> </div> ] Options[MyCustomComponent2] = {"Event" -> "", "Label" -> "Click me"}; ``` And provide a post-processor to `HTMLView`, that will generate unique ids: ``` HTMLView[MyCustomComponent2["Event"->"test", "Label"->"Hello World!"], Prolog->{ HTMLView`TemplateProcessor[<|"uid" -> CreateUUID[]|>], HTMLView`WLXProcessor[] }] EventHandler["test", Print]; ``` ``` (*VB[*)(FrontEndRef["90a96bea-5cd8-4d8c-ab0c-4dd2c38ebd1b"])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKWxokWpolpSbqmianWOiapFgk6yYmGSQDWSlGycYWqUkphkkAlGkWuw=="*)(*]VB*) ``` Combining WLX with EventObject [#combining-wlx-with-eventobject] You can combine the WLX approach with the `EventObject` pattern from earlier: ``` MyCustomInput2[label_String] := With[{id = CreateUUID[]}, EventObject[<|"Id"->id, "View"-> HTMLView[MyCustomComponent2["Event"->id, "Label"->label], Prolog->{ HTMLView\`TemplateProcessor[<|"uid" -> CreateUUID[]|>], HTMLView\`WLXProcessor[] }]|>] ] ``` This creates a reusable input component that: * Uses WLX for cleaner markup * Integrates with the `EventObject` system * Works seamlessly with `EventHandler` Example [#example-2] You can now use it as a standard input element: ``` EventHandler[MyCustomInput2["Click me"], Print] ``` # Custom effects and materials An advanced guide on how to define frontend symbols and create custom behaviors </Cards> Custom Graphics attributes [#custom-graphics-attributes] Since most primitives of `Graphics` are frontend symbols too, you can extend the set of their properties and attribute modifiers (such as `RGBColor`, `Opacity`, etc.) by writing your own frontend symbol. The easiest example would be creating something similar to `Translate`, which creates an SVG group and evaluates all children within a new group. By accessing the env object, you can interact with the canvas and the properties of the children. Animated Rainbow stroke [#animated-rainbow-stroke] Let's define our custom frontend symbol: ``` .js core.RainboxStroke = async (args, env) => { const group = env.svg.append("g"); env.local.group = group; let hue = 0; let frame = 0; function animateColor() { if (frame % 2 === 0) { hue = (hue + 4) % 360; group.style('color', 'hsl('+hue+', 100%, 50%)'); } frame++; env.local.uid = requestAnimationFrame(animateColor); } animateColor(); //apply special SVG attribute value //that all nested elements can inherit color of the group await interpretate(args[0], {...env, svg: group, color:'currentColor', stroke:'currentColor'}); return group; } core.RainboxStroke.destroy = (args, env) => { cancelAnimationFrame(env.local.uid); env.local.group.remove(); } core.RainboxStroke.virtual = true ``` ``` core.RainboxStroke = async (args, env) => { const group = env.svg.append("g"); env.local.group = group; let hue = 0; let frame = 0; function animateColor() { if (frame % 2 === 0) { hue = (hue + 4) % 360; group.style('color', 'hsl('+hue+', 100%, 50%)'); } frame++; env.local.uid = requestAnimationFrame(animateColor); } animateColor(); //apply special SVG attribute value //that all nested elements can inherit color of the group await interpretate(args[0], {...env, svg: group, color:'currentColor', stroke:'currentColor'}); return group; } core.RainboxStroke.destroy = (args, env) => { cancelAnimationFrame(env.local.uid); env.local.group.remove(); } core.RainboxStroke.virtual = true ``` The `RainboxStroke` symbol does not need any definitions on the Wolfram Kernel, since `Graphics`-like expressions are evaluated on the frontend. Here you can apply it directly to `Line`, `Text`, `Disk`, or any other primitives or groups of primitives that use stroke or fill color: ``` Graphics[{ RegularPolygon[4], RainboxStroke[{ RegularPolygon[3], Translate[Rotate[Text[Style["Hello World", FontSize->20], {0,0}], 45Degree],{0.4,0.4}] }] }] ``` ``` (*VB[*)(Graphics[{RegularPolygon[4], RainboxStroke[{RegularPolygon[3], Translate[Rotate[Text[Style["Hello World", FontSize -> 20], {0, 0}], 45*Degree], {0.4, 0.4}]}]}, ImageSize -> 270, "Controls" -> False])(*,*)(*"1:eJyNT0tuwjAQDS1UrSpY9QD0AD1DF1S0lVigOBJrA5N0xCRT2UZKuAncjNvUYxO3YlUvnj2a5/d5XnNeDrIss0MPH0zb8lamew/vRn9/4caWN/1+gdZF9sRDDtWetFkydRU3KIS4HMtSY7PmVjnDO/ingjhH6oOHwujGknaX33fCZ5dmUSugdXEaeVCuI1CP0gOIeLpi4+skcr4nCL3m3DiFB8Cn5NdHQ39nAX5lC6zB4kuf4Q0qA1eNzOko5/yaHle20uez1hUE38ngr68QlOSa+VyGyQbXuSYLP5ccXy8="*)(*]VB*) ``` Custom Graphics3D material [#custom-graphics3d-material] Let's do something similar, but with custom shader materials used in a 3D scene. For this, we need to access the internals of the `Graphics3D` renderer library - THREE.js. Luckily, we expose all shared libraries via a special interface: ```js await interpretate.shared.THREE.load(); const THREE = interpretate.shared.THREE.THREE; ``` Here is a basic example of low-level shaders used to colorize the primitives: ``` .js function vertexShader() { return ` varying vec3 vUv; void main() { vUv = position; vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * modelViewPosition; } `; } function fragmentShader() { return ` uniform vec3 colorA; uniform vec3 colorB; varying vec3 vUv; void main() { gl_FragColor = vec4(mix(colorA, colorB, vUv.z), 1.0); } `; } let THREE; interpretate.shared.THREE.load().then(() => { THREE = interpretate.shared.THREE.THREE; }) core.CustomMaterial = async (args, env) => { let uniforms = { colorB: {type: 'vec3', value: new THREE.Color(0xACB6E5)}, colorA: {type: 'vec3', value: new THREE.Color(0x74ebd5)} } return (function() { return new THREE.ShaderMaterial({ uniforms: uniforms, fragmentShader: fragmentShader(), vertexShader: vertexShader(), }); }) } ``` ``` function vertexShader() { return ` varying vec3 vUv; void main() { vUv = position; vec4 modelViewPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * modelViewPosition; } `; } function fragmentShader() { return ` uniform vec3 colorA; uniform vec3 colorB; varying vec3 vUv; void main() { gl_FragColor = vec4(mix(colorA, colorB, vUv.z), 1.0); } `; } let THREE; interpretate.shared.THREE.load().then(() => { THREE = interpretate.shared.THREE.THREE; }) core.CustomMaterial = async (args, env) => { let uniforms = { colorB: {type: 'vec3', value: new THREE.Color(0xACB6E5)}, colorA: {type: 'vec3', value: new THREE.Color(0x74ebd5)} } return (function() { return new THREE.ShaderMaterial({ uniforms: uniforms, fragmentShader: fragmentShader(), vertexShader: vertexShader(), }); }) } ``` Now let's hook it up to some basic graphics primitives: ``` Graphics3D[{ Translate[Tetrahedron[], {-1,-2,0}], MeshMaterial[CustomMaterial[]], Translate[Octahedron[], {1,2,0}] }] ``` ``` (*VB[*)(Graphics3D[{Translate[Tetrahedron[], {-1, -2, 0}], MeshMaterial[CustomMaterial[]], Translate[Octahedron[], {1, 2, 0}]}, ImageSize -> 270])(*,*)(*"1:eJx1jl0KwjAQhGP1xR96B8/gERRUsAjVC6ztxi6kjWTTFw+v7hoqCLoPH+xkdibLiy/tyBjDE8HOu9pmus0E2wC3hipebex4cByIY3JMBecAHTuIaI1Kc5UwBmiwDr77vqKnDD0Uak6lC0GB3BSSEQhcyskF656jbz/6v0r957GKvxu1gvQyNWbDY9k7fIftW7jiie5IuXhftrZAqQ=="*)(*]VB*) ``` *Try to drag it, it is alive* # Overview import { Accordion, Accordions } from 'fumadocs-ui/components/accordion'; In this guide, we explore the core ideas behind the WLJS project, what powers the UI, interactivity, and how to extend it to your own needs. As you may know from the [introduction](./../../Overview), WLJS Notebooks are web-based, which means that graphical objects, sliders, buttons, and UI elements are made with HTML/CSS and JavaScript code. If you want to create your own display function or input element that cannot be easily derived from the basic primitives of the Wolfram Language Standard library (or would be inefficient to do so), **you need to write supporting JavaScript code** to achieve that. To bridge the Wolfram Kernel and JavaScript environments seamlessly, we made the latter speak the same language and called it WLJS Interpreter—a small subset of the Wolfram Kernel running in the browser. You can define symbols and contexts that can be evaluated on the frontend only, with results fetched by the Wolfram Kernel—we refer to them as **frontend symbols**. You can also define **instanced symbols** that are evaluated into scoped runtime instances with local state and reactive bindings to other symbols. This is how [reactivity](./../../Guides/Dynamic) in WLJS Notebooks works under the hood. The possibilities are limitless: from creating DOM elements and emitting sound, to using [3rd party libraries](./3rd-party-libs) like `ApexCharts` or `Charts.js` to visualize your data in fascinating ways. Frontend symbols give you the full power to go **completely beyond the Wolfram Language ecosystem** and even access [Bluetooth HID](https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API), [GPU](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API), and [serial](https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API) devices to pipe data in and out. Quick and Dirty [#quick-and-dirty] Create a [JavaScript cell](./../../Cell-types/Javascript), then define a function within the `core` object—or as we call it later, the global frontend symbol context: ``` .js core.totalSum = async (args, env) => { const data = await interpretate(args[0], env); const sum = data.reduce((p, a) => p + a, 0); return sum; } ``` To evaluate it directly from the Wolfram Kernel and get the result back, use [FrontFetch](./../../Frontend-IO/FrontFetch): ```wolfram totalSum[{1,2,3,4,5}] // FrontFetch ``` `FrontFetch` is a blocking function. Use `FrontFetchAsync` in buttons, timers, or asynchronous functions. Since [Alert](./../../Interpreter/Alert) is also a frontend symbol, we can chain it with our `totalSum` to display the result in a popup box. In this case, we don't need to fetch the result; instead, we use: ```wolfram totalSum[{1,2,3,4,5}] // Alert // FrontSubmit ``` [FrontSubmit](./../../Frontend-IO/FrontSubmit) acts similarly to `LocalSubmit` or `SessionSubmit`. Here is another example using the Canvas API to display a cellular automaton: ``` .js const canvas = document.createElement("canvas"); canvas.width = 400; canvas.height = 400; let context = canvas.getContext("2d"); context.fillStyle = "lightgray"; context.fillRect(0, 0, 500, 500); core.drawArray = async (args, env) => { const data = await interpretate(args[0], env); //draw our boxes for(let i=0; i<40; ++i) { for (let j=0; j<40; ++j) { if (data[i][j] > 0) { context.fillStyle = "rgba(255,0,0,0.6)"; context.fillRect(i*10 + 1, j*10 + 1, 8, 8); } else { context.fillStyle = "rgba(255,255,255,0.6)"; context.fillRect(i*10 + 1, j*10 + 1, 8, 8); } } } } return canvas ``` Now we can call `drawArray` repeatedly in a loop to update the field: ``` board = RandomInteger[1, {40, 40}]; Do[ board = CellularAutomaton["GameOfLife", board]; drawArray[board] // FrontSubmit; Pause[0.1]; , {i,1,50}] ``` <LazyAutoplayVideo url={"/board-1.mp4"} /> However, this is not yet the most optimal way of doing that. The output canvas is fixed to a JavaScript cell and cannot be represented as a normal Wolfram Expression. To solve this, we need to go deeper... A Deeper Look [#a-deeper-look] First, you need to understand how symbols are defined and evaluated: * Basic (as shown above) * Instanced (with methods) Basics [#basics] When a symbol is evaluated, the runtime does not create or store its state—following the *call (evaluate) and forget principle*—except for the side effects made by evaluating this symbol. Here are a few rules for them: * A frontend symbol is an asynchronous JavaScript function with 2 arguments * A frontend symbol should return either nothing or a normal JavaScript expression: string, number, array, or object. It can also return a function only if the result is used by the parent frontend symbol, but not by the Wolfram Kernel via `FrontFetch` * Passed arguments must be evaluated using the `window.interpretate` function * The starting frontend context is always `core`; you can then diverge the evaluation to any other context Let's look at the basic structure: ```js core.MySymbol = async (args, env) => { //number of arguments + options args.length //extract passed options const options = await core._getRules(args, env); //evaluate 1st argument const arg1 = await interpretate(args[0], env); //access shared memory (side-effects) env.prop = "Hey!"; //return evaluation result return 3; } ``` By convention, if `MySymbol` is used in [ViewBox](./../../Formatting/Low-level/ViewBox) as a [display function](./../Decorating-symbols) or in the output form of [FrontEndExecutable](./../../Frontend-Objects/FrontEndExecutable), a visible DOM element is accessible as the `element` property of `env`. Shared memory and side effects [#shared-memory-and-side-effects] The second argument of the `MySymbol` asynchronous function is a shared object for the entire expression tree, which can be used to create side effects or pass data implicitly from parent to child expressions. For example, here is a brief implementation of `RGBColor` in `Graphics`: ```js core.RGBColor = async (args, env) => { const r = await interpretate(args[0], env); const g = await interpretate(args[1], env); const b = await interpretate(args[2], env); // Modify env env.color = new whatever.Color(r, g, b); // Return in case it's used directly return env.color; }; ``` `env` can be scoped using `List` expression for example: ```wolfram {Blue, {Red, Sphere[] (* I am red *)}, Sphere[] (* I am blue *)} // Graphics3D ``` You can also scope it in JavaScript for the children and pass additional properties: ```js const arg1 = await interpretate(args[0], {...env, boo: true}); ``` For example, this is how `Graphics3D` works under the hood: ```js core.Graphics3D = async (args, env) => { ... const scene = {}; await interpretate(args[0], { ...env, scene }); rendered.add(scene); // All objects are there! }; core.Sphere = async (args, env) => { ... env.scene.add(new sphere({ color: env.color })); }; ``` Thus, the desired data ends up in the scene. To access the **non-scopable part** of `env`, use: ```js //this will be global for all expressions //no matter if it is passed as {...env} or scoped within List[] env.global.myParam = "Hey!" ``` `env.global` is shared across all branches of the expression tree being evaluated. Namespaces [#namespaces] Please do not confuse this with Wolfram Language symbol contexts To prevent name collisions and reduce clutter when a symbol like `SymbolA` can be interpreted differently depending on its parent expressions, you can specify a namespace context for symbols in JavaScript using: ```js var subSpace = {}; subSpace.SymbolA = (args, env) => { // One thing }; core.SymbolA = (args, env) => { // Completely different thing }; ``` The interpreter will check all available contexts and **use the first match**. However, you can **prioritize a context** by providing it in the `env` object: ```js core.GrantSymbol = (args, env) => { const data = interpretate(args, { ...env, context: subSpace }); // ... // First match should be in the `subSpace` object // "One thing" }; ``` If you have multiple prioritized contexts, you can **pass them as an array**: ```js core.GrantSymbol = (args, env) => { const data = interpretate(args, { ...env, context: [subSpace1, subSpace2] }); // ... // First match in `subSpace1`, if not found, then in `subSpace2`, and finally in the `core` context }; ``` This emulates the pattern matching of Wolfram Language down-values, i.e.: ```wolfram GrantSymbol[SymbolA[]] := "One thing" SymbolA[] := "Completely different thing" ``` Exposing namespaces [#exposing-namespaces] You can also expose a namespace to the interpreter, so if it doesn't find the desired symbol in the `core` context, it tries all exposed namespaces: ```js const namespace = {}; namespace.name = "Plumbus"; namespace.Symbol = async (args, env) => {} //HERE -> interpretate.contextExpand(namespace); ``` Packed and Numeric Arrays [#packed-and-numeric-arrays] When sending large chunks of numeric data, the Wolfram Kernel may use `PackedArray`, which becomes a `NumericArrayObject` in JavaScript (a wrapper for `TypedArray`). Always check for this: ```js let data = await interpretate(args[0], env); if (data instanceof NumericArrayObject) { // handle TypedArray } else { // handle normal array } ``` You can convert to a normal JS array with: ```js data = data.normal(); ``` Symbol Methods [#symbol-methods] The symbol itself is an asynchronous function that is called during normal evaluation. However, in WLJS we add more: when data changes occur, this may trigger a propagating chain of calls to the `update` method of symbols. If an expression is destroyed, this may trigger chain calls to the `destroy` method of all involved symbols (if applicable). For example: ```js //evaluation core.MySymbol = (args, env) => {} //update chain core.MySymbol.update = (args, env) => {} //destroy chain core.MySymbol.destroy = (args, env) => {} //custom handler core.MySymbol.whatever = (args, env) => {} ``` As you can see, you can specify your own method and invoke it for all tree branches by providing it as: ```js await interpretate(args[1], {...env, method: 'whatever'}); ``` System handles these methods automatically following the rules: 1. The `update` method can be called for any symbol in the expression tree **automatically** when the data changes. 2. Only **instanced symbols** (see later) can invoke `update` in response to changes in other dependent **instanced symbols** 3. `destroy` only propagates through **instanced symbols**, skipping any basic frontend symbols, assuming they do not have internal state to clean up For most stateless frontend symbols like `List`, `Plus`, etc., we define: ```js namespace.SymbolName.update = namespace.SymbolName ``` Instanced symbols [#instanced-symbols] By setting the `virtual` property to `true` ```js core.MySymbol.virtual = true ``` we allow `MySymbol` to have state. In combination with `update` and `destroy` methods, it basically becomes a class definition. To sum up: 1. Instanced symbols inherit all features of stateless frontend symbols 2. Instanced symbols have state 3. Instanced symbols can be destroyed with the `destroy` method (handled automatically) 4. Instanced symbols listen for any changes from dependent instanced symbols down the expression tree; the change event bubbles up and invokes `update` Local state and methods [#local-state-and-methods] State is an object that can be accessed using the shared object `env` (2nd argument) from the constructor as well as from all defined methods: ```js core.MySymbol = async (args, env) => { env.local // local state for this instance env.global // global state for the call tree env.exposed // state shared outside the instance env.element // usually some visible DOM element associated to a symbol env // sharable memory within the instance and its children }; core.MySymbol.update = async (args, env) => {...} core.MySymbol.destroy = async (args, env) => {...} //............ core.MySymbol.virtual = true ``` Let's look at a simple example that demonstrates local state: <Accordions> <Accordion title="Clocks"> Create a Javascript cell ``` .js core.PlaceholderClock = async (args, env) => { env.local.start = new Date(); env.local.clock = setInterval(() => { const d = new Date() - env.local.start; env.element.innerHTML = d; }, 10); }; core.PlaceholderClock.destroy = async (args, env) => { clearInterval(env.local.clock); const passed = new Date() - env.local.start; alert(passed+'ms passed'); }; core.PlaceholderClock.virtual = true; ``` ``` core.PlaceholderClock = async (args, env) => { env.local.start = new Date(); env.local.clock = setInterval(() => { const d = new Date() - env.local.start; env.element.innerHTML = d; }, 10); }; core.PlaceholderClock.destroy = async (args, env) => { clearInterval(env.local.clock); const passed = new Date() - env.local.start; alert(passed+'ms passed'); }; core.PlaceholderClock.virtual = true; ``` This `PlaceholderClock` symbol represents a ticking timer that is displayed live on a provided DOM element and pops up a window with the elapsed time when removed. To provide a DOM element, we can define an output form for this symbol on the Wolfram Kernel with our display function defined in JavaScript: ``` PlaceholderClock /: MakeBoxes[p_PlaceholderClock, StandardForm] := ViewBox[p, p]; PlaceholderClock[] ``` The first argument of `ViewBox` is the actual underlying expression, while the second one will be evaluated on the frontend. In this case, the `PlaceholderClock` symbol is defined on both ends: kernel and frontend. On the kernel it does nothing, whereas as a frontend symbol it shows a ticking timer: ``` (*VB[*)(PlaceholderClock[])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KWkMIJ4AkAjISUxOzQAKpRY55+QnZwMAy3MK4g=="*)(*]VB*) ``` Try to copy/paste/delete it across cells. Note, that `WLXForm` does not support `ViewBox`, and all frontend symbols must be passed as [FrontEndExecutable](./../../Frontend-Objects/FrontEndExecutable) (see later in this guide) </Accordion> </Accordions> The `destroy` method is especially helpful for heavy expressions such as `Graphics3D`, which is re-rendered at 60FPS and, if not disposed of properly, may run in the background like a stray cat occupying your GPU resources. We can take advantage of having a different method **for update events to avoid costly reevaluation of the entire expression tree**. For example, instead of redrawing everything on a graph when the data changes, we update only the changed points rather than disposing of and recreating the graph from scratch: ``` .js core.NiceChartPlot = async (args, env) => { // Create the element, draw axes, etc... (SLOW) const arg1 = await interpretate(args[0], env); const arg2 = await interpretate(args[1], env); const data = await interpretate(args[2], env); const chart = new Charts.newPlot(arg1, arg2, data); // Save to the state env.local.chart = chart; }; core.NiceChartPlot.update = async (args, env) => { const newdata = await interpretate(args[2], env); // Quickly redraw only changed elements const chart = env.local.chart; chart.points.update(newdata); }; core.NiceChartPlot.destroy = (args, env) => { env.local.chart.dispose(); } core.NiceChartPlot.virtual = true; ``` By having dedicated methods, we **not only eliminate lots of resources from being freed and allocated**, but also **cut subtrees of the expression from evaluating** that are not involved in the update. Dynamic symbols [#dynamic-symbols] Here we discuss the relationship between *instanced frontend symbols* and [dynamic symbols](./../../Guides/Dynamic). In short, **these are the same entities**. We use the term *dynamic symbols* as shorthand. The only difference between: ```js core.MySymbol = async () => {} //.... core.MySymbol.virtual = true; ``` and this: ```wolfram MySymbol = "Hey"; TextView[MySymbol // Offload] ``` is that in the latter, `MySymbol` is automatically generated during runtime into `core.MySymbol`, which returns its own value in both the constructor and `update` calls. However, there is one more thing: the Wolfram Kernel also provides automatic one-way synchronization. When `MySymbol` is changed on the kernel: ```wolfram MySymbol = "Hoy!"; ``` the data is copied to the frontend definition of `core.MySymbol.data`, and an `update` event will bubble up for all instances. This means that if you have multiple expressions that depend on `MySymbol`, each having a unique instance of it, the updated data will be shared among all of them. This allows you to redraw and recalculate many things in a single synchronization cycle. Knowing all of this, let's improve our very first Game of Life board example: <Accordions> <Accordion title="Game of Life board (improved)"> Let's enhance our previous animation and turn it into a functional and easily reusable block: ``` .js function fillScreen(context, data) { for (let i = 0; i < 40; ++i) { for (let j = 0; j < 40; ++j) { if (data[i][j] > 0) { context.fillStyle = "rgba(255,0,0,0.4)"; context.fillRect(i * 10 + 1, j * 10 + 1, 8, 8); } else { context.fillStyle = "rgba(255,255,255,0.4)"; context.fillRect(i * 10 + 1, j * 10 + 1, 8, 8); } } } } core.drawArray = async (args, env) => { let data = await interpretate(args[0], env); if (data instanceof NumericArrayObject) { data = data.normal(); } const canvas = document.createElement("canvas"); canvas.width = 400; canvas.height = 400; let context = canvas.getContext("2d"); context.fillStyle = "lightgray"; context.fillRect(0, 0, 500, 500); fillScreen(context, data); env.element.appendChild(canvas); env.local.ctx = context; }; core.drawArray.update = async (args, env) => { let data = await interpretate(args[0], env); if (data instanceof NumericArrayObject) { data = data.normal(); } //now we are using new data const context = env.local.ctx; fillScreen(context, data); }; core.drawArray.destroy = (args, env) => delete env.local.ctx; core.drawArray.virtual = true; ``` Let's try to use it with defined output forms: ``` board = RandomInteger[1, {40, 40}]; drawArray /: MakeBoxes[a_drawArray, StandardForm] := ViewBox[a,a] ``` and then create our first instance using the output form of the `drawArray` symbol: ``` drawArray[board // Offload] ``` If you want to display this board on a slide or markdown cell, wrap the expression with `CreateFrontEndObject`, i.e ```wolfram drawArray /: MakeBoxes[a_drawArray, WLXForm] := With[{f = CreateFrontEndObject[a]}, MakeBoxes[f, WLXForm]] ``` `ViewBox` only works in `StandardForm` output. Now let's perform an update cycle of the `board` symbol, which should be immediately reflected in our array renderer above. ``` Do[ board = CellularAutomaton["GameOfLife", board]; Pause[0.1]; , {i, 1, 100}] ``` <LazyAutoplayVideo url={"/board-1.mp4"} /> All instances update live! Even if you copy and paste the same expression, its display will be unique and will still be properly updated. </Accordion> </Accordions> Accessing instances [#accessing-instances] Sometimes you want to add new objects to an existing instance (like a `Graphics` canvas) without reevaluating everything. You can access the partial instance and evaluate an expression within it if it was placed there before. First, we create a pointer to reference it later—[FrontInstanceReference](./../../Frontend-IO/FrontInstanceReference). For example: ```wolfram ref = FrontInstanceReference[]; Plot[x, {x, 0, 1}, Epilog -> {ref}] ``` then we evaluate a new expression within the instance referenced as `ref`: ```wolfram FrontSubmit[Text["Plot", {0.5,0.5}, {0,0}], ref]; ``` A text box will appear in the center. Some of the frontend symbols are meant to be evaluated later and associated with some actions, for example [ZoomAt](./../../Graphics/ZoomAt): ```wolfram FrontSubmit[ZoomAt[{0.5,0.5}, 2.0], ref]; ``` In a similar way, you can remove side effects of expressions using [FrontInstanceGroup](./../../Frontend-IO/FrontInstanceGroup). This groups all instances and allows you to dispose of them if needed: ```wolfram g = FrontInstanceGroup[]; FrontSubmit[g[{Opacity[0.5], Triangle[{{-1,0}, {0,1}, {1,0}}]}], ref]; ``` then to remove it: ```wolfram FrontInstanceGroupRemove[g]; ``` Here `FrontInstanceGroupRemove` effectively calls `destroy` on all created instances of frontend symbols. Read more about this technique at: A guide on interactive evaluation, updates and animation </Cards> Frontend Objects [#frontend-objects] Any interactive widgets or syntax sugar made with `ViewBox` stores the displayed expression inline, hidden within a code line. This takes up space and adds more load to the cell editor. It's one thing if we keep only `MySymbol[data//Offload]` inside a ViewBox, and a completely different story if we try to keep `Plot[x,{x,0,1}]` there, which expands into a bulky 10-100kB expression. To address this issue, [frontend objects](./../../Frontend-Objects/CreateFrontEndObject) are used. Here's what they do: * Compress an expression into a reference * Upload original data to notebook storage and sync with the frontend on-demand in the form of `ExpressionJSON` * Upon evaluation, expand the reference back to the Wolfram Expression * Automatically garbage collect if not used or referenced anywhere For example, you can compress individual arguments of your expression or an entire expression: ```wolfram SomeSymbol /: MakeBoxes[SomeSymbol[arg1_, arg2_], StandardForm] := With[{ fe1 = CreateFrontEndObject[arg1] }, ViewBox[..., displaySymbol[fe1, arg2]] ] ``` The example below is also valid if your definitions match on the Wolfram Kernel and frontend: ```wolfram SomeSymbol /: MakeBoxes[s_SomeSymbol, StandardForm] := With[{ display = CreateFrontEndObject[s] }, ViewBox[..., display] ] ``` This method is widely used for entire `Graphics`, `Image`, `Graphics3D` expressions and others when their serialized sizes exceed a certain threshold. Javascript IO API [#javascript-io-api] A guide on crafting UI elements using Javascript </Cards> An additional to interact with Wolfram Kernel besides `ViewBox`, `FrontSubmit` or `FrontFetch` is to use event-based IO interface exposed globally as: ```js server.kernel.io ``` Fire events [#fire-events] To fire events catch by [EventHandler](./../../Misc/Events) - use `fire` method: ```js server.kernel.io.fire(id: string, payload: any, pattern?: string = "Default"): void ``` where `id` is string id of `EventObject`, `payload` can be any Javascript object, except functions or promises. For example: ``` EventHandler["someRandomId", { _ -> Beep }] ``` ``` .js setTimeout(() => { server.kernel.io.fire('someRandomId', true); }, 2000); ``` To fire event without payload - use `poke` method: ```js server.kernel.io.poke(id: string): void ``` Fetching the data [#fetching-the-data] To evaluate and fetch a own-values or down-values of a symbol - use `fetch`: ```js server.kernel.io.fetch(id: string) : Promise server.kernel.io.fetch(id: string, [arg1 : any, arg2 : any, ...]) : Promise ``` it always return `Promise`. For example, let's define a symbol: ``` GetTime := TextString[Now]; ``` Now fetch and display it: ``` .js const dom = document.createElement('span'); server.kernel.io.fetch('GetTime').then(async (res) => { dom.innerHTML = await interpretate(res, {}); }) return dom; ``` Return `Promise` object to defer io fetch request, i.e. ```wolfram GetTime := With[{p = Promise[]}, (* do something or set a scheldule, call external *) p ] ``` Fire event and fetch the result [#fire-event-and-fetch-the-result] Here is the signature of method `request`: ```js server.kernel.io.request(id: string, payload: any, pattern?: string = "Default"): Promise ``` WLJS [event system](./../../Misc/Events) provides extra features to mimic full-duplex architecture. If one fires and event, it is possible to read the results of all subscribed listeners (if provided) or their handler functions: ```wolfram EventHandler[ev, Function[dataA, (* do something *) dataB (* <--- here *) ]] EventHandler[ev // EventClone, Function[dataA, (* do something *) dataC (* <--- here *) ]] EventFire[ev, ...] (* ---> {dataB, dataC} *) ``` Here is an example: ``` .js const button = document.createElement('button'); button.innerText = "Press me"; button.style.background = "pink"; button.style.padding = "1rem"; button.addEventListener('click', async () => { const data = await server.kernel.io.request('eventUid', true); button.innerHTML = await interpretate(data, {}); }); return button; ``` and now we define a handler function: ``` EventHandler["eventUid", Function[Null, RandomWord[] ]]; ``` Return `Promise` if you need to do some deferred calculations. # Web IO Microphone capture [#microphone-capture] The WebAPI provides access to many peripherals and has the advantage that no special drivers or libraries are needed. In this guide, we capture microphone audio and process it in real time using Wolfram Language. We will use [event system](./Overview) as a main way of piping data from Javascript to Wolfram side. You need to have WLJS Notebook installed as a desktop application or run it as a Docker container or server script with secure HTTPS connection. Otherwise, your browser will not allow audio capture. ``` .js const sign = document.createElement("div"); sign.style.color = "gray"; sign.innerText = "Idle"; const audioContext = new (window.AudioContext || window.webkitAudioContext)(); const analyser = audioContext.createAnalyser(); const scriptProcessor = audioContext.createScriptProcessor(2048, 1, 1); let isRunning = false; let mediaStream = null; let inputNode = null; analyser.smoothingTimeConstant = 0.3; analyser.fftSize = 1024; function setStatus(text, color) { sign.innerText = text; sign.style.color = color; } function connectGraph(stream) { mediaStream = stream; inputNode = audioContext.createMediaStreamSource(stream); inputNode.connect(analyser); analyser.connect(scriptProcessor); scriptProcessor.connect(audioContext.destination); scriptProcessor.onaudioprocess = onAudioProcess; } function disconnectGraph() { scriptProcessor.onaudioprocess = null; try { inputNode?.disconnect(); } catch {} try { analyser?.disconnect(); } catch {} try { scriptProcessor?.disconnect(); } catch {} inputNode = null; // Optional: stop mic hardware capture mediaStream?.getTracks?.().forEach((t) => t.stop()); mediaStream = null; } function onAudioProcess() { const data = new Uint8Array(analyser.frequencyBinCount); analyser.getByteTimeDomainData(data); server.kernel.io.fire("audio", Array.from(data)); } async function requestMicrophoneAccess() { try { return await navigator.mediaDevices.getUserMedia({ audio: true }); } catch (err) { alert( "Could not access the microphone. " + "Make sure you're using https and you granted permission." ); return null; } } core.MicStart = async () => { if (isRunning) return; isRunning = true; // Some browsers need this on a user gesture if (audioContext.state === "suspended") { await audioContext.resume(); } const stream = await requestMicrophoneAccess(); if (!stream) { isRunning = false; setStatus("Idle", "gray"); return; } connectGraph(stream); setStatus("Recording...", "red"); }; core.MicStop = async () => { if (!isRunning) return; isRunning = false; disconnectGraph(); setStatus("Stopped", "blue"); }; this.ondestroy = () => { if (!isRunning) return; isRunning = false; disconnectGraph(); }; // Return UI element return sign; ``` Here we introduce two frontend symbols, `MicStart` and `MicStop`, to control the streaming. The rest is boilerplate code for handling the standard WebAudio API. The actual data is sent via ```js const data = new Uint8Array(analyser.frequencyBinCount); analyser.getByteTimeDomainData(data); server.kernel.io.fire("audio", Array.from(data)); ``` as a list of bytes in integer representation. Unfortunately, the `JS->WL` binary format is not yet available. Let's add control buttons: ``` {Button["Start", MicStart // FrontSubmit], Button["Stop", MicStop // FrontSubmit]} // Row ``` And finally to handle the incoming data we use `EventHandler` and hook it to some `Graphics` primitive: ``` Module[{line = {}}, EventHandler["audio", Function[data, line = Transpose[{Range[data//Length], data}]; ]]; Graphics[ Line[line // Offload], PlotRange -> {{0,512}, {127-50, 127+50}}, "TransitionDuration"->30, Axes->True, AspectRatio->1/2 ] ] ``` Let's add fourier transform as well: ``` Module[{line = {}, fft={}}, EventHandler["audio", Function[data, line = Transpose[{Range[data//Length], data}]; fft = Drop[Transpose[{Range[128]//N, Log@Take[Fourier[data], 128]//Abs}],1]; ]]; {Graphics[ {Blue, Line[line // Offload]}, PlotRange -> {{0,512}, {127-50, 127+50}}, TransitionDuration->30, Axes->True, AspectRatio->1/2 ], Graphics[ {Red, Line[fft // Offload]}, PlotRange -> {{1,128}, {0,6}}, TransitionDuration->30, Axes->True, AspectRatio->1/2 ]} // Row ] ``` <LazyAutoplayVideo url={"/mic-2.mp4"} /> You can also accumulate the buffer for more samples and perform the computations asynchronously with a timer or similar mechanism. Canvas [#canvas] Here we will perform a small experiment with the JavaScript Canvas API. Optimizing drawing operations on a canvas is itself a challenging task. However, we will skip that part and focus on what we have: * animated bubbles that fade away with time * we provide an XY array of points where bubbles can appear * we animate them continuously * we define a frontend symbol `Spark` to update XY array Let's create Javascript cell and evaluate it: ``` .js const canvas = document.createElement("canvas"); const CSS_WIDTH = 500; const CSS_HEIGHT = 200; const MAX_PARTICLES = 5000; const SPAWN_PER_FRAME = 10; const AGE_STEP = 0.1; const FADE_START = 4; const FADE_END = 18; const ctx = canvas.getContext("2d"); // HiDPI / DPR let dpr = 1; function resizeCanvas(cssW = CSS_WIDTH, cssH = CSS_HEIGHT) { dpr = Math.max(1, Math.min(window.devicePixelRatio || 1, 3)); // cap optional // Set the displayed size canvas.style.width = Math.round(cssW)+'px'; canvas.style.height = Math.round(cssH)+'px'; // Set the backing-store size canvas.width = Math.floor(cssW * dpr); canvas.height = Math.floor(cssH * dpr); // Draw in CSS pixels ctx.setTransform(dpr, 0, 0, dpr, 0, 0); } resizeCanvas(); const rand = (min, max) => Math.random() * (max - min) + min; const randInt = (min, maxInclusive) => Math.floor(rand(min, maxInclusive + 1)); const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v)); function convertRange(value, [a1, a2], [b1, b2]) { if (a1 === a2) return (b1 + b2) / 2; return ((value - a1) * (b2 - b1)) / (a2 - a1) + b1; } function getMinMax(points) { let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; for (const [x, y] of points) { if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y; } return { minX, minY, maxX, maxY }; } function alphaForAge(age) { if (age <= FADE_START) return 1; if (age >= FADE_END) return 0; const t = (age - FADE_START) / (FADE_END - FADE_START); return (1 - t) * (1 - t); // smooth-ish fade } const rgba = (rgb, a) => 'rgba('+rgb[0]+','+rgb[1]+','+rgb[2]+','+a+')'; const particles = new Array(MAX_PARTICLES); let writeIndex = 0; let liveCount = 0; // Positions are stored in CSS pixels (not device pixels) let data = []; function putParticle(x, y) { const p = particles[writeIndex] ?? (particles[writeIndex] = { x: 0, y: 0, xvel: 0, yvel: 0, rgb: [0, 0, 0], baseAlpha: 0.6, size: 5, age: 1, }); p.x = x; p.y = y; p.xvel = rand(-1, 1); p.yvel = rand(-1, 1); p.rgb[0] = randInt(0, 255); p.rgb[1] = randInt(0, 255); p.rgb[2] = randInt(0, 255); p.baseAlpha = 0.6; p.size = 5; p.age = 1; writeIndex = (writeIndex + 1) % MAX_PARTICLES; if (liveCount < MAX_PARTICLES) liveCount++; } function spawnParticles() { if (!data.length) return; for (let j = 0; j < SPAWN_PER_FRAME; j++) { const idx = randInt(0, data.length - 1); const [x, y] = data[idx]; putParticle(x, y); } } function drawParticles() { // Clear using CSS pixel dimensions ctx.clearRect(0, 0, CSS_WIDTH, CSS_HEIGHT); // Oldest -> newest ordering when full const start = liveCount === MAX_PARTICLES ? writeIndex : 0; for (let i = 0; i < liveCount; i++) { const idx = (start + i) % MAX_PARTICLES; const p = particles[idx]; if (!p) continue; const a = p.baseAlpha * alphaForAge(p.age); if (a <= 0) continue; const radius = p.size / Math.max(p.age, 0.001); ctx.beginPath(); ctx.arc(p.x, p.y, radius, 0, Math.PI * 2); ctx.fillStyle = rgba(p.rgb, a); ctx.fill(); p.age += AGE_STEP; p.x += p.xvel; p.y -= p.yvel; } } let rafId = 0; let destroyed = false; function animate() { if (destroyed) return; const currentDpr = Math.max(1, Math.min(window.devicePixelRatio || 1, 3)); if (currentDpr !== dpr) resizeCanvas(); spawnParticles(); drawParticles(); rafId = window.requestAnimationFrame(animate); } this.ondestroy = () => { destroyed = true; if (rafId) window.cancelAnimationFrame(rafId); }; core.Spark = async (args, env) => { const raw = await interpretate(args[0], env); if (!Array.isArray(raw) || raw.length === 0) { data = []; return; } const { minX, minY, maxX, maxY } = getMinMax(raw); const pad = 50; const x0 = pad, x1 = CSS_WIDTH - pad; const y0 = pad, y1 = CSS_HEIGHT - pad; data = raw.map(([x, y]) => { const mx = convertRange(x, [minX, maxX], [x0, x1]); const my = convertRange(y, [maxY, minY], [y0, y1]); // invert Y return [clamp(mx, x0, x1), clamp(my, y0, y1)]; }); }; // Start animate(); return canvas; ``` From the evaluation kernel, we need to design a function like `Plot` that accepts a function, samples it in the provided interval, and pipes the data to the `Spark` symbol on the frontend: ``` SparkPlot[func_, range_] := With[{var = Extract[range,1, Inactivate], min = range[[2]], max = range[[3]]}, Table[{var, func}, {var, min, max, (max-min)/200.0}]] // FrontSubmit[Spark[#]] & SetAttributes[SparkPlot, HoldAll] ``` Here we go: ``` SparkPlot[Sinc[1.5 x], {x,-10,10}] ``` <LazyAutoplayVideo url={"/spark-1.mp4"} /> # Structure A template repository is available at Github [wljs-plugin-template](https://github.com/WLJSTeam/wljs-plugin-template) Most extensions have the following folder structure ``` name-of-package/ package.json <--- most important src/ Kernel.wl <--- usually loaded to Evaluation Kernel Frontend.wl <--- usually loaded to Main Kernel kernel.js <--- usually some JS libraries dist/ kernel.js <--- bundled JS libraries (if applicable) kernel.min.js templates/ <--- usually WLX templates for UI element Button.wlx Item.wlx ... ... ``` The most important file is `package.json`, while the rest is only the recommendation, but you will anyway configure all paths in JSON file. package.json [#packagejson] This is standard package declaration file from NodeJS, but modified with extra field for WLJS-specific features ```json title="package.json" { "name": "<name-of-package>", "version": "<X.Y.Z>", "description": "<short-description>", "wljs-meta": { "js": "dist/kernel.js" | Array<string>, //will be injected to HEAD "minjs": "dist/kernel.min.js" | Array<string>, //will used when exported to HTML "kernel": "src/Kernel.wl" | Array<string>, //loaded to Evaluation Kernel "deferred": "src/package" | Array<string>, //will be exposed to PATH of Evaluation Kernel "frontend": "src/Frontend.wl" | Array<string>, //loaded to Main Kernel "category": "<catergory-name>", "priority": 5000, "menu": [ //top-menu items { "label": "<label>", "event": "<unique-event-id>", "section": "kernel" | "edit" | "view" | "file" | "misc", "spawnWindow": true | false, "accelerator": [ "<hotkey-mac>", "<hotkey-winlin>" ], "type": "button" //reserved } ] } ... } ``` All fields inside `wljs-meta` are optional, there is no need in putting all listed in the example above. It is worth to note, that `deferred` can be used to load paclets or standard Wolfram Packages to Evaluation Kernel, since the content will not be loaded to the kernel, but only exposed to be required later by `Needs`. Documentation is not yet complete. Please open on issue on Github for us to prioritize this direction. Please see examples in this section for more information. # BoxBox ```wolfram BoxBox[expr_Boxes | _String, decorator_, opts___] ``` is a low-level box used to decorate `expr` visibly with custom HTML/JS elements in `StandardForm`. This is used by `Ket`, `Frame`, `Style` and other editable decorations * the expression is **editable** * a common WL editor is spawned inside * only the container of the editor can be decorated (see [`Head`](#`Head`)) `decorator` must be a [frontend symbol](./../../Advanced/Frontend-functions/Overview) (i.e., executed by WLJS Interpreter) and must be defined in advance Options [#options] Head [#head] Provides the head symbol of the wrapper expression, which will be hidden from the inner editor. It comes in handy when you need to preserve the original form of the expression during editing Use `Head` option to keep the wrapping expression "String" [#string] Default is false. If it is set to `True`, double quotes will be cut and a simplified version of a widget will be used. "HeadString" [#headstring] Only works if `"String" -> True`. Specifies the opening sequence of a string that will not be shown in the view. "TailString" [#tailstring] Only works if `"String" -> True`. The same as above, but for the ending sequence. Examples [#examples] Change the display value and call arbitrary WLJS function [#change-the-display-value-and-call-arbitrary-wljs-function] This is a dummy example ```wolfram special /: MakeBoxes[special, StandardForm] := BoxBox["1+1", Alert["Hi"]] special ``` Note that here `Alert` is a JavaScript function that lives only on the frontend (see [Alert](./../../Interpreter/Alert)). Styling expression using JS [#styling-expression-using-js] You can define your own style for cell boxes. The visible DOM element with an expression in it is provided as `element` property of `env` object: ```js .js core.MyStyler = async (args, env) => { env.element.style.boxShadow = "1px 1px 5px black"; } ``` ```wolfram wrapper /: MakeBoxes[wrapper[expr_], StandardForm] := With[{ b = MakeBoxes[expr, StandardForm] }, BoxBox[b, MyStyler, Head->wrapper] ] ``` and then try ```wolfram wrapper[1/2] ``` The neat thing is that **you can edit the inner expression** Supported output forms [#supported-output-forms] * [StandardForm](../../Formatting/StandardForm) # InterpretationBox Make a formatting structure whose interpretation is not based on its appearance ```wolfram InterpretationBox[display_, expr_] ``` where `display` will be shown in the output cell, instead of `expr`, keeping `expr` for the evaluation. Consider to use [Interpretation](../../Formatting/Interpretation) instead Supported output forms [#supported-output-forms] * [StandardForm](../../Formatting/StandardForm) # ViewBox ```wolfram ViewBox[expr_, displayView_, opts___] ``` is a low-level box used to alter `expr` visibly with custom HTML/JS elements in `StandardForm`, while keeping the input form of `expr` behind. Most decorations generated by `TemplateBox`, graphics functions `Graphics`, `Graphics3D`, `InputButton` and etc are `ViewBox`-es. * the expression is **not editable by a user** and is fully replaced in the editor by the provided `displayView` * the inner `expr` **is revealed** on the next evaluation `RGBColor`, `DateObject` and [InterpretationBox](../../Formatting/Low-level/InterpretationBox) (together with [EditorView](../../GUI/EditorView)) and many more use this structure to display a human-readable form of the content behind. `displayView` must be [frontend symbol](./../../Advanced/Frontend-functions/Overview) (i.e., executed by WLJS Interpreter) and must be defined in advance Options [#options] "Event" [#event] Manually enables events generation. Using the provided event object identifier (`_String`), it fires various events based on its state. You can attach a normal [`EventHandler`](../../Misc/Events) to the given id ```wolfram uid = CreateUUID[]; EventHandler[uid, {pattern_String :> handler_, ..}] ViewBox[.., "Event"->uid] ``` The following `pattern`s are available to be attached to * `"Mounted"` fires once a widget is visible. A unique identifier is provided as a payload in a form of association * `"Destroy"` fires once it was removed Once mounted, it provides a unique ID as a string from the key `Instance` in the `"Mounted"` event, which can be used in the constructor [FrontInstanceReference](../../Frontend-IO/FrontInstanceReference). You can also apply [``ViewBox`InnerExpression``](#``ViewBox`InnerExpression``) and [``ViewBox`OuterExpression``](#``ViewBox`OuterExpression``). Examples [#examples] This method **is much faster** than [InterpretationBox](../../Formatting/Low-level/InterpretationBox) or [Interpretation](../../Formatting/Interpretation), since it does not spawn [EditorView](../../GUI/EditorView) inside for displaying regular boxes. Replacing expression with custom DOM element [#replacing-expression-with-custom-dom-element] You can define your own style for cell boxes. The visible DOM element in the editor is provided as `element` property of `env` object: ```js .js core.MyView = async (args, env) => { env.element.style.background = "red"; env.element.style.width = "2em"; env.element.style.height = "1em"; } ``` ```wolfram myBox /: MakeBoxes[myBox[expr_], StandardForm] := ViewBox[myBox[expr], MyView] ``` and then try ```wolfram myBox[1/2] ``` This is basically how `RGBColor`, `DateObject` are implemented Mutability [#mutability] In general it is possible to update the expression underneath indirectly. For this reason, there are multiple way of accessing this feature From Wolfram Kernel [#from-wolfram-kernel] Please see methods below ViewBox`InnerExpression [#viewboxinnerexpression] Used to replace a covered expression in a `ViewBox` with a given string. It must be evaluated in the context of an instance of `ViewBox`, use [FrontInstanceReference](../../Frontend-IO/FrontInstanceReference) and [FrontSubmit](../../Frontend-IO/FrontSubmit) in order to apply this to a specific box **Returns the current content if no string is specified as an argument**. Use it with [FrontInstanceReference](../../Frontend-IO/FrontInstanceReference) and [FrontFetch](../../Frontend-IO/FrontFetch). For example, let's make a dummy view-box that covers a simple string with a disk ```wolfram dummy /: MakeBoxes[_dummy, StandardForm] := With[{uid = CreateUUID[]}, EventHandler[uid, { "Mounted" -> Function[res, ref = res["Instance"]] }]; ViewBox["Covered", Graphics[Disk[]], "Event"->uid] ] dummy[] ``` Now our element has reported itself to the `ref` global symbol. Let's fetch this covered expression ```wolfram FrontFetch[ViewBox`InnerExpression[], FrontInstanceReference[ref]] ``` ``` "\"Covered\"" ``` Now let's change it ```wolfram FrontSubmit[ViewBox`InnerExpression["1+1"], FrontInstanceReference[ref]] ``` Now if you evaluate our disk, you will see ``` 2 ``` ViewBox`OuterExpression [#viewboxouterexpression] Used to replace or update the content string within the box (including the box itself) This will destroy an instance of the ViewBox once applied. **Example** ```wolfram ref = FrontInstanceReference[]; Plot[x, {x,0,1}, Epilog->{ref}] ``` and then we can destroy it and replace with our text ```wolfram FrontSubmit[ViewBox`OuterExpression["Hello World"], ref] ``` From JavaScript function [#from-javascript-function] The `displayView` expression must be a frontend symbol Overview of frontend symbols / function An advanced guide on how alter or enchance the displayed expression of a symbol </Cards> ```js core.displayView = async (args, env) => { env.global.EditorWidget } ``` this object contains a property to update the content ```js EditorWidget.applyChanges('"new content"') ``` Example [#example] Let's create a special object that will act like a checkbox ```wolfram CheckObject /: MakeBoxes[CheckObject[state_:(True | False)], StandardForm] := With[{}, ViewBox[CheckObject[state], CheckBoxDecorator[]] ] ``` now JS part ```js .js core.CheckBoxDecorator = async (args, env) => { let state = false; //check the raw data from the viewbox to determine the state if (env.global.EditorWidget.getDoc() == 'CheckObject[True]') state = true; //make a rectangle env.element.style.width = "1em"; env.element.style.height = "1em"; const update = (s) => env.element.style.background = s ? 'red' : 'blue'; //color it depending on state update(state); //logic for updates when a user click on it env.element.addEventListener("click", () => { state = !state; update(state); const stringState = state ? 'True' : 'False'; env.global.EditorWidget.applyChanges('CheckObject['+stringState+']'); }); } ``` Let's test it! ```wolfram CheckObject[True] ``` *then try to click on it, copy and paste it* whatever you do, it will keep its state synced. No communication with WL Kernel happens, everything is running within the code-editor in the browser. Or even cooler ```wolfram Table[CheckObject[True], {i, 3}, {j, 3}] // MatrixForm ``` Supported output forms [#supported-output-forms] * [StandardForm](../../Formatting/StandardForm) # Action button A ready-to-go example is available in [this repository](https://github.com/WLJSTeam/wljs-plugin-example-2). Clone it to `<Documents>/WLJS Notebooks/Extensions/` with: ```bash git clone https://github.com/JerryI/wljs-plugin-example-2 ``` Then restart WLJS Notebook. Folder name of the extension must match with its **unique name** In this short tutorial, we will discuss how to add a basic UI element to the WLJS Notebook interface and cover some fundamentals of cell evaluation. In general, we need to create a package for the *main kernel*. Summary [#summary] This tutorial will cover: * Creating a package for the *main kernel* that adds a new UI action button and a handler function to evaluate all cells in a notebook. * Writing a UI action button template using WLX. * Adding a native top-menu button that duplicates the action of the UI button. Preparations [#preparations] Use [wljs-plugin-template](https://github.com/WLJSTeam/wljs-plugin-template) template and create a new repository or use a ready-to-go example given in the heading of this tutorial. Next, edit the contents of `package.json`: ```json title="package.json" { "name": "wljs-plugin-example-2", "version": "0.0.1", "description": "An example plugin for WLJS Notebook", "wljs-meta": { "frontend": ["src/Frontend.wl"], "priority": 5000, "category": "Notebook Extensions", "menu": [ { "label": "Example Button Evaluate", "event": "example-eval-all", "spawnWindow": false, "type": "button" } ] }, "repository": { "type": "git", "url": "https://github.com/JerryI/wljs-plugin-example-2" }, "dependencies": { "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-terser": "^0.4.4", "rollup": "^3.21.6" } } ``` This defines an action button placed in the top-bar menu. When clicked, it triggers the `example-eval-all` event in the global event pool, which we will handle later. Main Kernel Package [#main-kernel-package] UI Element [#ui-element] To inject new UI elements, we use the `` CoffeeLiqueur`Notebook`AppExtensions` `` interface: ```wolfram title="src/Frontend.wl" BeginPackage["CoffeeLiqueur`Extensions`EvalAllButton`", { "CoffeeLiqueur`Misc`Events`", "CoffeeLiqueur`Misc`Events`Promise`", "CoffeeLiqueur`WLX`Importer`", "CoffeeLiqueur`WLX`WebUI`" }] Needs["CoffeeLiqueur`Notebook`AppExtensions`" -> "AppExtensions`"]; Begin["`Private`"] rootFolder = $InputFileName // DirectoryName // ParentDirectory; buttonTemplate = ImportComponent[FileNameJoin[{rootFolder, "templates", "Button.wlx"}]]; AppExtensions`TemplateInjection["AppNotebookTopBar"] = buttonTemplate[##, "HandlerFunction" -> processRequest]&; End[] EndPackage[] ``` The packages: ``` CoffeeLiqueur`Misc`Events` CoffeeLiqueur`Misc`Events`Promise` ``` are used for event handling. The new UI element is injected via: ```wolfram AppExtensions`TemplateInjection["AppNotebookTopBar"] = buttonTemplate[##, "HandlerFunction" -> processRequest]&; ``` Creating the Button [#creating-the-button] A more convenient way to create UI elements is through WLX. We include the necessary contexts: ``` CoffeeLiqueur`WLX`Importer`, CoffeeLiqueur`WLX`WebUI` ``` Now, let's create our button: ```jsx title="templates/Button.wlx" Component[OptionsPattern[]] := With[{ messager = OptionValue["Messanger"], globalControls = OptionValue["Controls"], appEvents = OptionValue["AppEvent"], modals = OptionValue["Modals"], UId = CreateUUID[], listener = CreateUUID[], processRequest = OptionValue["HandlerFunction"] }, EventHandler[listener, { "Button" -> Function[Null, processRequest[globalControls, modals, messager, Global`$Client (*`*)] ] }]; EventHandler[EventClone[globalControls], { "example-eval-all" -> Function[Null, processRequest[globalControls, modals, messager, Global`$Client (*`*)]] }]; { <button style="-webkit-app-region: no-drag" title="Evaluate all" id="{UId}" class="text-red-400 hover:bg-gray-50 dark:hover:bg-gray-700 rounded-md w-6 h-6"> <svg class="w-5 h-5" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="currentColor"> <path d="M2.78 2L2 2.41v12l.78.42 9-6V8l-9-6zM3 13.48V3.35l7.6 5.07L3 13.48z"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M6 14.683l8.78-5.853V8L6 2.147V3.35l7.6 5.07L6 13.48v1.203z"/> </svg> </button>, <WebUIEventListener Type={"click"} Id={UId} Pattern={"Button"} Event={listener} /> } ] Options[Component] = {"Controls"->"", "AppEvent"->"", "Modals"->"", "HandlerFunction" -> Print}; Component ``` After restarting the app, you should see a new icon in the top bar and a new menu item. Processing cells [#processing-cells] As it was mentioned, we want to evaluate all cells, when a user clicks on an icon. Let us go back to `Frontend.wl` and add more packages to work with cells and notebooks ```wolfram Needs["CoffeeLiqueur`Notebook`Cells`" -> "cell`"]; Needs["CoffeeLiqueur`Notebook`" -> "nb`"]; ``` Next define `processRequest` ```wolfram processRequest[globalControls_String, modals_String, messager_String, client_] := With[{ notebookOnline = findNotebook[globalControls] }, ... ``` To find a notebook available in the current window one can *echo-locate* it using a global controls event pool ```wolfram findNotebook[messagesPort_] := EventFire[messagesPort, "NotebookQ", True] /. {{___, n_nb`NotebookObj, ___} :> n}; ``` **If at least one notebook component is attached to the global events network, it will respond to this pattern.** Then we can sort out input cells and synchronously one by another ```wolfram processRequest[globalControls_String, modals_String, messager_String, client_] := With[{ notebookOnline = findNotebook[globalControls] }, If[!MatchQ[notebookOnline, _nb`NotebookObj], EvetFire[messager, "Warning", "No active notebooks"]; Return[]; ]; Echo["Processing!"]; With[{ inputCells = Select[notebookOnline["Cells"], cell`InputCellQ] }, (* If you don't want to handle Kernel requests and prepare the rest -> use Notebooks public API *) runNext[inputCells, Function[cell, EventFire[globalControls, "NotebookCellEvaluate", cell] ] ]; ] ] runNext[l_List, f_] := With[{rest = Drop[l, 1]}, Then[f[l // First], Function[Null, runNext[rest, f] ] ] ] /; Length[l] > 0 runNext[_List, f_] := Echo["Done!"]; ``` We took a shortcut here. To avoid complexity with requesting kernels, showing dialogs we evaluate cells indirectly using Notebook API interface by firing pattern ```wolfram EventFire[globalControls, "NotebookCellEvaluate", cell] _Promise ``` as a result an attached notebook (if any) on the events network returns `Promise`, which we can handle using `Then` and propagate to other cell and etc. Global controls event network interconnects modules and temporary exposes end-points of different services. Here is the final result: <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div> # Javascript Library A ready to-go example is in [this repository](https://github.com/WLJSTeam/wljs-plugin-example-1) Clone it to `<Documents>/WLJS Notebooks/Extensions/` using: ```bash git clone https://github.com/WLJSTeam/wljs-plugin-example-1 ``` Then restart WLJS Notebook. Folder name of the extension must match with its **unique name** Here is the simples example on what you can do with extensions. Why not to add [ApexCharts](https://apexcharts.com/)? They looks beautiful and already animated. What we need * Kernel package, which implements `ApexCharts[]` symbols * Javascript bundle, which should include *ApexCharts* and bridge it with Wolfram Kernel using [frontend symbols](./../../../Advanced/Frontend-functions/Overview) **Summary** what will be done * package for *evaluation kernel*, which adds a new symbol `ApexCharts` * Javascript module, which renders the content of `ApexCharts` expression Preparations [#preparations] Use [wljs-plugin-template](https://github.com/WLJSTeam/wljs-plugin-template) template and create a new repository or use a ready-to-go example given in the heading of this tutorial. Then edit the content of `package.json` ```json title="package.json" { "name": "wljs-plugin-example-1", "version": "0.0.1", "scripts": { "build": "node --max-old-space-size=8192 ./node_modules/.bin/rollup --config rollup.config.mjs" }, "description": "An example plugin for WLJS Notebook. Library functions", "wljs-meta": { "kernel": [ "src/Kernel.wl" ], "js": "dist/kernel.js", "minjs": "dist/kernel.min.js", "priority": 5000, "category": "Notebook Extensions" }, "repository": { "type": "git", "url": "https://github.com/WLJSTeam/wljs-plugin-example-1" }, "dependencies": { "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-terser": "^0.4.4", "rollup": "^3.21.6" } } ``` By the default a template implies, that we will use *rollup.js* for bundling. Run in the root directory of this package ```bash npm i ``` And then install `apexcharts` ```bash npm i apexcharts ``` Kernel package [#kernel-package] Create a new file in `src/Kernel.wl`, which is going to be our package for evaluation kernel. Looking at ApexCharts API, it is easy to imagine the way how it can be used ```wolfram ApexCharts[<| "series" -> {44, 55, 67, 83}, "labels" -> {"Apples", "Oranges", "Bananas", "Berries"}, "chart" -> <| "height" -> 350, "type" -> "radialBar" |> |>] ``` or any other way, one can pre-transform the data and use intermediate symbols. Following the simplest path, we write to our Kernel file ```wolfram title="src/Kernel.wl" BeginPackage["CoffeeLiqueur`Extensions`ApexCharts`"] (* Public context *) ApexCharts::usage = "ApexCharts[a_Association] constructor" Begin["`Private`"] End[] EndPackage[] ``` We can put a few checks to ensure that input is an association ```wolfram nonAssocHeadQ[_] = True nonAssocHeadQ[_Association] = False ApexCharts::notassoc = "Input is not an association" ApexCharts[_?nonAssocHeadQ ] := (Message[ApexCharts::notassoc]; $Failed) ``` Now we can think about `ApexCharts` as if it was a new entity, and the interpretation of this entity will be our graphs. To draw actual graphs instead of a symbolic representation we need to define an output form. For that [ViewBox](./../../../Formatting/Low-level/ViewBox) comes in hand, which is provided in ``CoffeeLiqueur`Extensions`Boxes` `` context ```wolfram BeginPackage["CoffeeLiqueur`Extensions`ApexCharts`", { "CoffeeLiqueur`Extensions`Boxes`" }] (* Public context *) ... (* Output forms *) ApexCharts /: MakeBoxes[a: ApexCharts[_Association], StandardForm ] := With[{}, ViewBox[a, a] ] ``` First `a` will be an underlying expression (behind the graph), while second `a` is going to be rendered instead of it. However, if you try to evaluate this with defined output form, you get a similar error ``` BROKEN BOX ``` `ViewBox` tries to evaluate a non-existing frontend symbol `ApexCharts`. Javascript Library [#javascript-library] Now we need to define `ApexCharts` symbol on the frontend. The idea is simple: take the provided data and using Apex API render a graph on the given DOM element ```js title="src/kernel.js" let ApexCharts; core.ApexCharts = async (args, env) => { if (!ApexCharts) ApexCharts = (await import('apexcharts')).default; //lazy loading const options = await interpretate(args[0], env); const chart = new ApexCharts(env.element, options); chart.render(); } ``` Our association will be in `options` object after the interpretation. Implement dynamic imports (lazy) if possible Now we need to bundle this ```bash npm run build ``` After the restart, it should work with our extension like a charm <div className="invertColor"> <img alt="" src={__img0} /> </div> However, after several evaluation dead instances of `ApexCharts` will pile up as a garbage in Javascript memory. It is recommended to properly remove them. For that we need to identify each instance of `ApexCharts` and assign destructor function. We use [instanced frontend symbools](./../../../Advanced/Frontend-functions/Overview), which behave like classes ```js title="src/kernel.js" let ApexCharts; core.ApexCharts = async (args, env) => { if (!ApexCharts) ApexCharts = (await import('apexcharts')).default; //lazy loading const options = await interpretate(args[0], env); const chart = new ApexCharts(env.element, options); chart.render(); env.local.chart = chart; } core.ApexCharts.destroy = (args, env) => { env.local.chart.destroy(); } core.ApexCharts.virtual = true ``` Now we need to bundle this ```bash npm run build ``` Polishing [#polishing] We might do a few more tweaks. If our `ApexCharts` expression becomes too big, it might slow down the editor. For that reason we use [Frontend Objects](./../../../Frontend-Objects/CreateFrontEndObject) ```wolfram BeginPackage["CoffeeLiqueur`Extensions`ApexCharts`", { "CoffeeLiqueur`Extensions`Boxes`", "CoffeeLiqueur`Extensions`FrontendObject`" }] (* Public context *) ``` ```wolfram ApexCharts /: MakeBoxes[a: ApexCharts[_Association], form: StandardForm ] := With[{o = CreateFrontEndObject[a]}, MakeBoxes[o, form] ] /; ByteCount[a] > 1024*4 ``` Frontend objects has a special predefined `StandardForm` (and `WLXForm`), where it uses a reference to a Wolfram Expression stored separately. Another improvement can be `WLXForm`, if we decide to use those charts on slides or markdown cells: ```wolfram ApexCharts /: MakeBoxes[a: ApexCharts[_Association], form: WLXForm ] := With[{o = CreateFrontEndObject[a]}, MakeBoxes[o, form] ] ``` # New cell type A ready to-go example is in [this repository](https://github.com/WLJSTeam/wljs-plugin-example-3) Clone it to `<Documents>/WLJS Notebooks/Extensions/` using: ```bash git clone https://github.com/WLJSTeam/wljs-plugin-example-3 ``` Then restart WLJS Notebook. Folder name of the extension must match with its **unique name** In this tutorial we will add new cell type, which implements basic Wolfram expression evaluation and returns the result in `InputForm`. Our new cell type will start from a simple ```wolfram .m Red ``` to avoid conflicts with a default wolfram language input. **Summary** what will be done: * package for *main kernel*, which implement a new evaluator * working with kernel transactions * loading packages on-demand to *evaluation kernel* Preparations [#preparations] Use [wljs-plugin-template](https://github.com/WLJSTeam/wljs-plugin-template) template and create a new repository or use a ready-to-go example given in the heading of this tutorial. Then edit the content of `package.json` ```json title="package.json" { "name": "wljs-plugin-example-3", "version": "0.0.1", "description": "An example plugin for WLJS Notebook", "wljs-meta": { "frontend": [ "src/Frontend.wl" ], "priority": 5000, "category": "Notebook Extensions" }, "repository": { "type": "git", "url": "https://github.com/WLJSTeam/wljs-plugin-example-3" } } ``` In principle we need `.wl` files for both *main kernel* and *evaluation kernel*. However, the last one we can defer and load only when a user firstly evaluates our new cell type. This will reduce the total loading time of a new evaluation kernel. Main kernel package [#main-kernel-package] Let's define our package and include the necessary libraries ```wolfram title="src/Frontend.wl" BeginPackage["CoffeeLiqueur`Extensions`BasicEval`", { "CoffeeLiqueur`Notebook`Transactions`", "CodeParser`" }] Needs["CoffeeLiqueur`Notebook`Kernel`" -> "GenericKernel`"]; Needs["CoffeeLiqueur`Notebook`Evaluator`" -> "StandardEvaluator`"]; Begin["`Private`"] End[] EndPackage[] ``` Here we import a few important contexts ```wolfram CoffeeLiqueur`Notebook`Transactions` ``` provides `Transaction[]` constructor. Evaluation of any content is done via such objects, which contain the evaluation data and meta-data and abstracted from the actual cells. `CodeParser` we need for syntax check of our expressions before the evaluation. The rest two ```wolfram CoffeeLiqueur`Notebook`Kernel` CoffeeLiqueur`Notebook`Evaluator` ``` we need for submitting transactions to evaluation kernels, while the last one defines an abstract class for *evaluator*. For each cell type one can define an *evaluator*, which is applied and perform the evaluation of the transaction based on the pattern matching. Here is how we can do that for our `.m` cells ```wolfram Q[t_Transaction] := StringMatchQ[t["Data"], ".m\n"~~___] evaluator = StandardEvaluator`StandardEvaluator["Name" -> "Basic InputForm Evaluator", "Pattern" -> (_?Q), "Priority"->(2)]; ``` `Q` function simply checks the content of the transaction for our notation. Now we can define the necessary methods for our `evaluator` ```wolfram StandardEvaluator`ReadyQ[evaluator, k_] := ( If[! TrueQ[k["ReadyQ"] ] || ! TrueQ[k["ContainerReadyQ"] ], EventFire[t, "Error", "Kernel is not ready"]; Print[evaluator, "Kernel is not ready"]; False , True ] ); ``` This one checks if kernel is ready. The evaluation itself is abstracted from kernels. Some of cell types do not involve *evaluation kernel* at all: [Javascript](./../../../Cell-types/Javascript), [Shell](./../../../Cell-types/Misc), [Mermaid](./../../../Cell-types/Misc). That is the reason, we have those checks on the level of evaluators. The second mandatory method is actual evaluation ```wolfram StandardEvaluator`EvaluateTransaction[evaluator, k_, t_] := Module[{list}, t["Data"] = StringDrop[t["Data"], 3]; If[StringLength[StringTrim[t["Data"] ] ] === 0, EventFire[t, "Error", "No input"]; Echo["Syntax Error!"]; Return[$Failed]; ]; With[{check = CheckSyntax[t["Data"] ]}, If[! TrueQ[check], EventFire[t, "Error", check]; Echo["Syntax Error!"]; Return[$Failed]; ]; list = SplitExpression[t["Data"] ]; MapIndexed[ With[{message = StringTrim[#1], index = #2[[1]], transaction = Transaction[]}, If[StringTake[message, -1] === ";", transaction["Nooutput"] = True; transaction["Data"] = StringDrop[message, -1]; , transaction["Data"] = message; ]; transaction["Evaluator"] = Internal`Kernel`BasicEval; (* check if it is the last one *) If[index === Length[list], EventHandler[transaction, { (* capture successfull event of the last transaction to end the process *) "Result" -> Function[data, EventFire[t, "Result", data]; EventFire[t, "Finished", True]; ], (* fwd the rest *) name_ :> Function[data, EventFire[t, name, data] ] }]; , EventHandler[transaction, { name_ :> Function[data, EventFire[t, name, data] ] }]; ]; Print[evaluator, "Submit transaction!"]; GenericKernel`SubmitTransaction[k, transaction]; ]& , list]; ]; ]; ``` Many things happen. First we check the syntax of the provided transaction data, then split a multiple lines of expressions to separate transactions aka ```wolfram 1+1 (* <- break *) 2+2 ``` We assign for each new transaction an evaluation function ```wolfram Internal`Kernel`BasicEval ``` that will be called on the *evaluation kernel* on the given transaction. We will define it later. Transaction objects have defined up-values for event-system methods. It means you can listen and fire events on them. After the line ``` GenericKernel`SubmitTransaction[k, transaction]; ``` a transaction goes to *evaluation kernel* and depending on evaluation function and the content 2 event patterns can usually be emitted * `"Result"` evaluation has been finished and the result is provided in payload * `"Error"` an error occurred However your initial transaction object you receive as a method's argument `t` has **one more pattern** * `"Finished"` indicates that the evaluation is fully complete. Must be fired after all possible `"Result"` events This one ensures, that all extra steps are done (if the expression was split into multiple transactions) and a cell or other handler can change its state to `idle`. The remaining functions for syntax check and splitting are ```wolfram SplitExpression[str_] := With[{}, Select[Select[(StringTake[str, Partition[Join[{1}, #, {StringLength[str]}], 2]] &@ Flatten[{#1 - 1, #2 + 1} & @@@ Sort@ Cases[ CodeParser`CodeConcreteParse[str, CodeParser`SourceConvention -> "SourceCharacterIndex"][[2]], LeafNode[Token`Newline, _, a_] :> Lookup[a, Source, Nothing]]]), StringQ], (StringLength[#]>0) &] ]; CheckSyntax[str_String] := Module[{syntaxErrors = Cases[CodeParser`CodeParse[str],(ErrorNode|AbstractSyntaxErrorNode|UnterminatedGroupNode|UnterminatedCallNode)[___],Infinity]}, If[Length[syntaxErrors]=!=0 , Return[StringRiffle[ TemplateApply["Syntax error `` at line `` column ``", {ToString[#1],Sequence@@#3[CodeParser`Source][[1]]} ]&@@@syntaxErrors , "\n"], Module]; ]; Return[True, Module]; ]; ``` Evaluation kernel package [#evaluation-kernel-package] This package file implements the missing evaluation function ```wolfram title="src/Preload.wl" BeginPackage["CoffeeLiqueur`Extensions`BasicEval`", { "CoffeeLiqueur`Misc`Events`" }] Begin["`Private`"] Internal`Kernel`BasicEval = Function[t, With[{hash = CreateUUID[]}, With[{result = (ToExpression[ t["Data"], InputForm, Hold]) // ReleaseHold }, If[KeyExistsQ[t, "Nooutput"], EventFire[Internal`Kernel`Stdout[ t["Hash"] ], "Result", <|"Data" -> Null |> ]; , With[{string = ToString[result, InputForm]}, EventFire[Internal`Kernel`Stdout[ t["Hash"] ], "Result", <|"Data" -> string, "Display"->"codemirror", "Meta"->Sequence["Hash"->hash] |> ]; ] ]; ]; ] ]; End[] EndPackage[] ``` There is nothing special here. We accept the transaction in a form of `Association` (the serialization of transaction object) and apply `ToExpression` almost directly. The result is then sent using event interface with an additional wrapper symbol `Stdout` which indicates, that the it has to be fired to a remote Wolfram Kernel. In the payload a meta data regarding the output cell type and display function is shared. Display functions are pre-defined on Javascript side. As a rule, if it is possible to defer the loading of some package, you shout do it. This exactly this case, we can load `src/Preload.wl` only when our cell is about to be sent for the evaluation. For that reason we can extend `ReadyQ` method, which is called before the evaluation ```wolfram rootFolder = $InputFileName // DirectoryName // ParentDirectory; preload = Import[FileNameJoin[{rootFolder, "src", "Preload.wl"}], "Text"]; StandardEvaluator`ReadyQ[evaluator, k_] := ( If[! TrueQ[k["ReadyQ"] ] || ! TrueQ[k["ContainerReadyQ"] ], EventFire[t, "Error", "Kernel is not ready"]; Print[evaluator, "Kernel is not ready"]; False , Print[evaluator, "Preload"]; With[{preload = preload}, GenericKernel`Init[k, ImportString[preload, "WL"] , "Once"->True]; ]; True ] ); ``` It is also possible to define a custom display function in Javascript for your new cell type (both: input and output), but this is a topic for the next tutorial. Now restart WLJS Notebook and enjoy pure `InputForm` with no syntax sugar: <div className="invertColor"> <img alt="" src={__img0} placeholder="blur" /> </div>