---
title: "Input Scanner"
description: "capture symbol values from source code/binary files and link to an output\
  \ symbol library"
source: "https://github.com/log-10x/modules/tree/main/pipelines/compile/units/scan/unit.yaml"
icon: "material/code-tags"

---
Scan input source code/binary files to produces symbol files from a variety of programming languages, text and binary formats
using configurable scanner [modules](https://doc.log10x.com/engine/module/).

Scanner modules parse the contents of a target input file to generate an
[AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree){target="\_blank"} from which to
capture [symbol](https://doc.log10x.com/run/transform/structure/#symbols) values and the
[context](https://doc.log10x.com/run/transform/symbol/#contexts) in which they appear (e.g., class, function, printout).

The run pipeline utilizes symbol files to [transform](https://doc.log10x.com/run/transform/ "Transform log and trace events into well-defined TenXObjects")
input log/trace events into typed [TenXObjects](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).").

Once scanner modules complete, the compile pipeline [links](https://doc.log10x.com/compile/link/ "Link symbol unit files to an output symbol library file") symbol files into a single [symbol library](https://doc.log10x.com/run/symbol/#libraries) file for use at run time.

### :material-file-tree: Output

Scanners emit information captured from each input into a respective symbol unit (.json) file.
The path of each output symbol unit within [outputSymbolFolder](https://doc.log10x.com/compile/scan/#outputsymbolfolder "location of output symbol folder") matches its
folder structure within [inputPaths](https://doc.log10x.com/compile/scan/#inputpaths "input folders to scan")

For example, when launching a compile pipeline with the following [config](https://doc.log10x.com/config/yaml/):

```yaml
tenx: compile
inputPaths:
  - ~/dev 
outputSymbolFolder: ~/symbols 
```

For a foo.js file located in:

`~/dev/app/foo.js`

The respective output symbol unit output file is:

`~/symbols/app/foo.js.10x.json`

### :material-card-multiple-outline: Parallel Processing

The compile pipeline supports running multiple instances of the [compiler app](https://doc.log10x.com/apps/compiler/) in parallel by using shared file locks to safely reuse existing symbol unit files residing in the [output path](#outputsymbolfolder "location of output symbol folder"). The underlying storage system must support [advisory locks](https://www.baeldung.com/linux/file-locking#1-advisory-locking){target="\_blank"} for parallel execution to be enabled.

A separate scheduled task periodically can link symbol unit files into a single [symbol library](https://doc.log10x.com/compile/link/#symbol-library) artifact used by edge/cloud apps at runtime.

## :octicons-package-24: Modules


<div class="grid cards" markdown>

-   :material-file-code:{ .lg .middle } __ANTLR Scanner__

    ---

    Extract symbols from any programming language using the ANTLR framework.

    [:octicons-arrow-right-24: More info](/compile/scanner/antlr)

-   :material-language-java:{ .lg .middle } __JavaParser Scanner__

    ---

    Scan Java source code for symbol values using the JavaParser library.

    [:octicons-arrow-right-24: More info](/compile/scanner/javaParser)

-   :material-language-python:{ .lg .middle } __CPython AST Scanner__

    ---

    Scan Python source code for symbol values.

    [:octicons-arrow-right-24: More info](/compile/scanner/pythonAST)

-   :octicons-file-binary-24:{ .lg .middle } __JVM Bytecode Scanner__

    ---

    Scan JVM .class files for symbol values.

    [:octicons-arrow-right-24: More info](/compile/scanner/bytecode)

-   :simple-scala:{ .lg .middle } __Scalameta Scanner__

    ---

    Scan Java source code for symbol values using the Scalameta library.

    [:octicons-arrow-right-24: More info](/compile/scanner/scalameta)

-   :material-launch:{ .lg .middle } __Executable Scanners__

    ---

    Launch a target process from which to read symbol values via its stdout.

    [:octicons-arrow-right-24: More info](/compile/scanner/executable)

-   :material-code-json:{ .lg .middle } __Text File Scanners__

    ---

    Scan text/binary files for symbol values using the Jackson library.

    [:octicons-arrow-right-24: More info](/compile/scanner/text)

-   :material-regex:{ .lg .middle } __Regex Pattern Scanners__

    ---

    Extract symbol values from a files using regular expressions.

    [:octicons-arrow-right-24: More info](/compile/scanner/pattern)

-   :material-zip-box-outline:{ .lg .middle } __Archive Scanner__

    ---

    Scan compressed archives for enclosed files containing symbol values.

    [:octicons-arrow-right-24: More info](/compile/scanner/archive)

-   :material-library-outline:{ .lg .middle } __Symbol Unit Scanner__

    ---

    Discover existing symbol unit files to reuse.

    [:octicons-arrow-right-24: More info](/compile/scanner/symbol)

-   :material-math-log:{ .lg .middle } __Log Method/stream Definitions__

    ---

    Define logger method and output stream names.

    [:octicons-arrow-right-24: More info](/compile/scanner/logMethods)

</div>
## :material-wrench-outline: Config Files

To configure the Input Scanner unit, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files:
??? tenx-scan "Scan"

    <a id="scan"></a>
    ### Scan {.hidden-heading}

    Configure  the [Input Scanner](/compile/scan "Capture symbol values from source code/binary files and link to an output symbol library") to capture symbol values from source code/binary files and link to an output symbol library.

    Below is the default configuration from: [scanners/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/compile/scanners/config.yaml "scanners/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/compile/scanners/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml0-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml0-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit Input Scanner Config Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml0-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/compile/scanners/config.yaml"
                                data-copy-nix="/etc/log10x/config/compile/scanners/config.yaml"
                                data-copy-win="C:\log10x\configs/compile/scanners/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/compile/scanners/config.yaml">$TENX_CONFIG/compile/scanners/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/compile/scanners/config.yaml">./pipelines/compile/scanners/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiaW5wdXRQYXRocyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW5wdXQgZm9sZGVycyB0byBzY2FuXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBmb2xkZXJzIHRoYXQgYXJlIHRyYXZlcnNlZCBpbiBzZWFyY2ggb2Ygc291cmNlIGNvZGUgKGUuZy4gLmpzLCAuY3BwKSwgYmluYXJ5IChlLmcuLCAuc28sIC5qYXIsIC56aXApIGFuZCB0ZXh0IChlLmcuLCAuanNvbiwgLnhtbCkgZmlsZXMgdG8gY2FwdHVyZSBzeW1ib2wgdmFsdWVzIGZyb20gYW5kIG91dHB1dCB0byBzeW1ib2wgdW5pdCBmaWxlcy4gSW5wdXQgZm9sZGVycyBtYXkgY29udGFpbiBmaWxlcyBhbmQgZm9sZGVycyBwdWxsZWQgZnJvbSBbR2l0SHViXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvcHVsbC9naXRodWIvKSBvciAgYW5kIFtBcnRpZmFjdG9yeV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3B1bGwvYXJ0aWZhY3RvcnkpLiIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfQogICAgfSwKICAgICJvdXRwdXRTeW1ib2xGb2xkZXIiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgInN0cmluZyIsCiAgICAgICAgIm51bGwiCiAgICAgIF0sCiAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJMb2NhdGlvbiBvZiBvdXRwdXQgc3ltYm9sIGZvbGRlclxuXG5TcGVjaWZpZXMgdGhlIHJvb3QgZm9sZGVyIGluIHdoaWNoIHRvIHdyaXRlIG91dHB1dCBzeW1ib2wgdW5pdCBmaWxlcy4gVGhpcyBjb21waWxlciBbc2NhbiBwaGFzZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4vKSBtaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFtpbnB1dFBhdGhzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jaW5wdXRwYXRocykgYXJndW1lbnQsIHBsYWNpbmcgZWFjaCBvdXRwdXQgc3ltYm9sIHVuaXQgaW4gdGhlIHNhbWUgcmVsYXRpdmUgcGF0aCB1bmRlciBbb3V0cHV0U3ltYm9sRm9sZGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jb3V0cHV0c3ltYm9sZm9sZGVyKSBhcyBpdHMgc291cmNlL2JpbmFyeSBpbnB1dCBmaWxlIHVuZGVyIGl0cyByZXNwZWN0aXZlIGBpbnB1dFBhdGhzYCBmb2xkZXIgZW50cnkuICBGb3IgZXhhbXBsZSwgaWYgW2lucHV0UGF0aHNdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS9zY2FuLyNpbnB1dHBhdGhzKSBpcyBgfi9kZXZgIGFuZCBpdCBjb250YWlucyB0aGUgZmlsZSBgfi9kZXYvYXBwL2Zvby5qc2AsIGFuZCB0aGlzIHZhbHVlIGlzIGB+L3N5bWJvbHNgLCB0aGUgcmVzcGVjdGl2ZSBvdXRwdXQgc3ltYm9sIHVuaXQgZmlsZSBpczogYH4vc3ltYm9scy9hcHAvZm9vLmpzLjEweC5qc29uYC4iCiAgICB9LAogICAgInNjYW4iIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZvcmNlIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgd2hldGhlciB0byBzY2FuIGlucHV0IGZpbGVzIGV2ZW4gaWYgYSBtYXRjaGluZyBleGlzdGluZyBzeW1ib2wgZmlsZSBleGlzdHNcblxuQ29udHJvbHMgd2hldGhlciB0byByZXVzZSBtYXRjaGluZyBzeW1ib2wgZmlsZXMgd2l0aGluIFtpbnB1dFBhdGhzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jaW5wdXRwYXRocykuIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgYSBuZXcgc2Nhbm5lciBtb2R1bGUgY29uZmlndXJhdGlvbiAoZS5nLiwgQU5UTFIgZ3JhbW1hcikgIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFtzY2FubmVyIGRlYnVnZ2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4pIG9wdGlvbnMuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgICAgICB9LAogICAgICAgICJpblByb2Nlc3MiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQ29udHJvbHMgd2hldGhlciB0byBzY2FuIHNvdXJjZS9iaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgc3ViLXByb2Nlc3MoZXMpXG5cblRoZSBzY2FubmVyIGNhbiBsYXVuY2ggW3N1YnByb2Nlc3Nlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4vI3N1YnByb2Nlc3NfMSkgdG8gY2FwdHVyZSBbc3ltYm9sXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi90cmFuc2Zvcm0vc3RydWN0dXJlLyNzeW1ib2xzKSBpbmZvcm1hdGlvbiBmcm9tIHNwZWNpZmljIHRhcmdldCBzb3VyY2UvYmluYXJ5IGlucHV0IGZpbGVzLiAgIEdlbmVyYXRpbmcgaW5wdXQgZmlsZSBbQVNUc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWJzdHJhY3Rfc3ludGF4X3RyZWUpIHRvIHNjYW4gZm9yIHN5bWJvbHMgdmFsdWVzIGZvciBjb21wbGV4IHN5bnRheGVzIGNhbiBiZSBhIGxlbmd0aHksIHJlc291cmNlLWNvbnN1bWluZyBvcGVyYXRpb24sIHdoaWNoIGluIHRoZSBjYXNlIG9mICBbQU5UTFIgc3ludGF4ZXNdKGh0dHBzOi8vdG9tYXNzZXR0aS5tZS9pbXByb3ZpbmctdGhlLXBlcmZvcm1hbmNlLW9mLWFuLWFudGxyLXBhcnNlci8pIG1heSB0aW1lb3V0IG9yIHJ1biBvdXQgb2YgbWVtb3J5LiAgICAgUHJvY2VzcyBbaXNvbGF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qcm9jZXNzX2lzb2xhdGlvbikgYWxsb3dzIGZvciB0ZXJtaW5hdGluZyBzY2FuIG9wZXJhdGlvbnMgdGhhdCB0aW1lb3V0IGZvciBzcGVjaWZpYyBmaWxlcywgd2hpbGUgYWxsb3dpbmcgb3RoZXJzIHRvIHByb2NlZWQuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgICAgICB9LAogICAgICAgICJ0aHJlYWRQb29sU2l6ZSIgOiB7CiAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIGNvbmN1cnJlbnRseSBwcm9jZXNzIGlucHV0IHNvdXJjZSBjb2RlIC9iaW5hcnkgZmlsZXNcblxuQ29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gcHJvY2VzcyBpbnB1dCBzb3VyY2UgY29kZS9iaW5hcnkgZmlsZXMgY29uY3VycmVudGx5OiAtIElmIHRoZSB2YWx1ZSBpcyBiZXR3ZWVuIDAgYW5kIDEsIHRoZSBudW1iZXIgY2FsY3VsYXRlcyBhIHBlcmNlbnRhZ2Ugb2YgYXZhaWxhYmxlIGNvcmVzIChlLmcuLCAwLjUgPSB1c2UgdXAgdG8gNTAlIG9mIGF2YWlsYWJsZSBjb3JlcykuICAgLSBJZiB0aGUgdmFsdWUgaXMgPj0gMSwgdGhlIHZhbHVlIHNldHMgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcyAoZS5nLiwgMTAgPSAxMCB0aHJlYWRzKS4gICAtIElmIHRoZSB2YWx1ZSBpcyAxLCBhbGxvY2F0ZSBhIHNpbmdsZSB0aHJlYWQgdG8gcHJvY2VzcyBpbnB1dCBmaWxlcy4gKERlZmF1bHQ6IDAuNSkiLAogICAgICAgICAgImRlZmF1bHQiIDogIjAuNSIKICAgICAgICB9LAogICAgICAgICJ1bml0VGltZW91dCIgOiB7CiAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiVGltZW91dCBpbnRlcnZhbCBmb3Igc2Nhbm5pbmcgYSBzb3VyY2UgY29kZSAvYmluYXJ5IGlucHV0IGZpbGVcblxuU2V0cyB0aGUgdGltZW91dCBpbnRlcnZhbCB3aGVuIHNjYW5uaW5nIGEgc291cmNlIGNvZGUgL2JpbmFyeSBpbnB1dCBmaWxlIGJlZm9yZSBkcm9wcGluZyBpdC4gU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoRGVmYXVsdDogMjBzKSIsCiAgICAgICAgICAiZGVmYXVsdCIgOiAiMjBzIgogICAgICAgIH0sCiAgICAgICAgIm9wZXJhdGlvblRpbWVvdXQiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRpbWVvdXQgaW50ZXJ2YWwgZm9yIHRoZSBlbnRpcmUgc2Nhbm5pbmcgb3BlcmF0aW9uXG5cblNldHMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIHRoZSBlbnRpcmUgc2Nhbm5pbmcgb3BlcmF0aW9uIGJlZm9yZSB0ZXJtaW5hdGluZyBpdC4gU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoRGVmYXVsdDogMTBtKSIsCiAgICAgICAgICAiZGVmYXVsdCIgOiAiMTBtIgogICAgICAgIH0sCiAgICAgICAgImRlYnVnIiA6IHsKICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAib3JpZ2lucyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBpbnB1dCBmaWxlIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb25cblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnB1dCBmaWxlIG5hbWVzIChlLmcuLCBteS5zY2FsYSwgZm9vLmphdmEpIHRvIGxvZyBpbmZvcm1hdGlvbiByZWxhdGluZyB0byB3aGljaCBzeW1ib2xzIHdlcmUgY2FwdHVyZWQvc2tpcHBlZC4gU3BlY2lmeSAnKicgZm9yIGFsbCBmaWxlcy4iLAogICAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN5bWJvbHMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICJhcnJheSIsCiAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2Ygbm9kZSB0eXBlcyB3aXRoaW4gYSBzY2FubmVyIEFTVCB0cmVlIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb25cblxuTGlzdCBvZiBub2RlcyB3aXRoaW4gYW4gaW5wdXQgQVNUIHRyZWUsIHN1Y2ggYXMgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyhlLmcuLCAnTXlDbGFzcycsICdmb28nKSBmb3Igd2hpY2ggdG8gbG9nIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZXkgd2VyZSBjYXB0dXJlZC9za2lwcGVkIGFzIHN5bWJvbHMuICBTcGVjaWZ5ICcqJyBmb3IgYWxsIG5vZGVzLiIsCiAgICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibG9nZ2VyTmFtZSIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJEZWJ1ZyBsb2dnZXIgbmFtZVxuXG5TcGVjaWZpZXMgdGhlIGxvZzRqIGxvZ2dlciBmb3IgbG9nZ2luZyB2YWx1ZXMgZm9yIHN5bWJvbHMvZmlsZXMgbWF0Y2hpbmcgJ2RlYnVnT3JpZ2lucycgYW5kICdkZWJ1Z1N5bWJvbHMnLiAoRGVmYXVsdDogW2NvbnNvbGVPdXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L2NvbmZpZy9ibG9iL21haW4vbG9nNGoyLnlhbWwjTDY2KSkiLAogICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJbY29uc29sZU91dF0oaHR0cHM6Ly9naXRodWIuY29tL2xvZy0xMHgvY29uZmlnL2Jsb2IvbWFpbi9sb2c0ajIueWFtbCNMNjYpIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgInByaW50T3V0cHV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2xzIHdoZXRoZXIgdG8gZW1pdCBvdXRwdXQgc2NhbiBvcGVyYXRpb25zIHByb2dyZXNzIHRvIHRoZSBjb25zb2xlXG5cbkNvbnRyb2xzIHdoZXRoZXIgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gc3ltYm9sIHVuaXRzIHNjYW5uaW5nIGlzIGVtaXR0ZWQgdG8gdGhlIHN0ZG91dCBzdHJlYW0uIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgMTB4IHByb2Nlc3MgaXMgIHNwYXduZWQgYnkgYSBwYXJlbnQgMTB4ICdjb21waWxlJyBwaXBlbGluZSB0byByZXBvcnQgaXRzIHByb2dyZXNzLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSAoRGVmYXVsdDogZmFsc2UpIiwKICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgIH0sCiAgICAidW5pdHNUb1NjYW5QZXJCYXRjaCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAibnVtYmVyIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1heGltdW0gbnVtYmVyIG9mIGlucHV0IGZpbGVzIHRvIHNjYW4gcGVyIHN1Yi1wcm9jZXNzLlxuXG5TZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzb3VyY2UvYmluYXJ5IGlucHV0IGZpbGVzIHRvIHNjYW4gYnkgYSBzaW5nbGUgJ2NvbXBpbGUnIHN1Yi1wcm9jZXNzLiBTZXQgdG8gMCB0byB1bmxpbWl0ZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikgKERlZmF1bHQ6IDQwKSIsCiAgICAgICJkZWZhdWx0IiA6IDQwCiAgICB9LAogICAgInRva2VuRGVsaW1zIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiVG9rZW4gZGVsaW1pdGVyc1xuXG5EZWZpbmVzIHdoaWNoIGNoYXJhY3RlcnMgYnJlYWsgYSBzdHJpbmcgb2YgZXZlbnQgY2hhcmFjdGVycyBpbnRvIHRva2VucyB0byBjbGFzc2lmeSBhcyBzeW1ib2xzIG9yIHZhcmlhYmxlcy4gKERlZmF1bHQ6IDw+fC4gXVs6LSsvKj1cXFxcLHt9XygpOydcXFwiJFxcdFxcbkApIiwKICAgICAgImRlZmF1bHQiIDogIjw+fC4gXVs6LSsvKj1cXFxcLHt9XygpOydcXFwiJFxcdFxcbkAiCiAgICB9LAogICAgImZpbGVFeHRTdHJpbmdGb3JtYXRzIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJhcnJheSIsCiAgICAgICAgInN0cmluZyIsCiAgICAgICAgIm51bGwiCiAgICAgIF0sCiAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJTdHJpbmcgZm9ybWF0IHNwZWNpZmllciBjaGFyYWN0ZXJzXG5cbkNvbnRyb2xzIHdoaWNoIGNoYXJhY3RlcnMgaWRlbnRpZnkgdGhlIHN0YXJ0IG9mIGEgW2Zvcm1hdCBzcGVjaWZpZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByaW50ZiNGb3JtYXRfc3BlY2lmaWVyKSBmb3IgZWFjaCBwcm9ncmFtbWluZyBsYW5ndWFnZSBleHRlbnNpb24gaW4gdGhlIGZvcm0gb2YgPGV4dD46PGZvcm1hdFByZWZpeD4gKGUuZy4sIGAuamF2YTolYCkuICBJdCBpcyBhIHN0YW5kYXJkIHByb2dyYW1taW5nIHByYWN0aWNlIHRvIHVzZSBzdHJpbmcgZm9ybWF0cyB0byBsb2cgbWVzc2FnZXMgaW4gdGhlIGZvcm0gb2Y6ICBgYGAgamF2YSBsb2cuZXJyb3IoXCJjb3VsZCBub3QgY29ubmVjdCB0byB7fSB3aXRoIHN0YXR1cyB7fVwiLCBob3N0LCBzdGF0dXMpOyBgYGAgIFdoZW4gYW4gVGVuWFRlbXBsYXRlIHRva2VuaXplciBwcm9jZXNzaW5nIGFuIGV2ZW50IGlkZW50aWZpZXMgYSBmb3JtYXQgcHJlZml4IChlLmcuLCBgJWApIGl0IHNraXBzIGl0IGFuZCBhcHBlbmRzIHN1YnNlcXVlbnQgc3ltYm9sIHRva2VucyAoZS5nLiwgYHdpdGggc3RhdHVzYCkgdG8gdGhlIHN5bWJvbCBzZXF1ZW5jZSBwcmVjZWRpbmcgdGhlbSAoZS5nLiwgYGNvdWxkIG5vdCBjb25uZWN0IHRvYCkuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgIm1heFN5bWJvbCIgOiB7CiAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAidW5pdFNlY3Rpb25TaXplIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4aW11bSBudW1iZXIgb2Ygc3ltYm9sIHRva2VucyB0byBzdG9yZSBpbiBhIHNpbmdsZSBzeW1ib2wgdW5pdCBmaWxlXG5cbkNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2wgdG9rZW5zIHRvIHN0b3JlIGluIGEgc3ltYm9sIHVuaXQgYmVmb3JlIHNwbGl0dGluZyBpdC4gVGhpcyBvcHRpb24gc3VwcG9ydHMgbGFyZ2Ugc291cmNlIGNvZGUgL2JpbmFyeSBpbnB1dCBmaWxlcyB0aGF0IG1heSBoYXZlIHRob3VzYW5kcyBvZiB0ZXh0IHN5bWJvbHMgdG8gYXZvaWQgIGNyZWF0aW5nIHNpemVhYmxlIGluZGl2aWR1YWwgc3ltYm9sIHVuaXQgZmlsZXMuICAgICAgICAgU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDApIiwKICAgICAgICAgICJkZWZhdWx0IiA6IDUwMAogICAgICAgIH0sCiAgICAgICAgInVuaXRzUGVyVG9rZW4iIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOdW1iZXIgb2Ygc3ltYm9sIHVuaXRzIHRvIHJldHJpZXZlIHdoZW4gc2VhcmNoaW5nIGZvciB0aGUgb3JpZ2luIG9mIGFuIFRlblhUZW1wbGF0ZSBzeW1ib2wgc2VxdWVuY2VcblxuQ29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN5bWJvbCB1bml0cyB0byBsb2FkIGZyb20gdGhlIHBpcGVsaW5lJ3Mgc3ltYm9sIGxpYnJhcnkgd2hlbiBzZWFyY2hpbmcgZm9yIHRoZSBvcmlnaW4gb2YgYSBzcGVjaWZpYyBbVGVuWFRlbXBsYXRlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi90ZW1wbGF0ZS8pIHN5bWJvbC4gICBUaGUgW3N5bWJvbFNlcXVlbmNlXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWE9iamVjdCtzeW1ib2xTZXF1ZW5jZSkgZnVuY3Rpb24gcXVlcmllcyB0aGUgc291cmNlIGNvZGUvYmluYXJ5IG9yaWdpbiBvZiBzeW1ib2wgc2VxdWVuY2VzIGluIGEgdGFyZ2V0IFRlblhUZW1wbGF0ZSB0byBpZGVudGlmeSB0aGUgbG9naWNhbCBbbWVzc2FnZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vaW5pdGlhbGl6ZS9tZXNzYWdlLykgcG9ydGlvbiBvZiBhIHRhcmdldCBhcHAvaW5mcmEgZXZlbnRzIHZzLiB2YXJpYWJsZSBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiAoZS5nLiwgdXNlciwgaG9zdCwgc2V2ZXJpdHkpLiAgIFNpbmNlIGEgW3N5bWJvbF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vdHJhbnNmb3JtL3N0cnVjdHVyZS8jc3ltYm9scykgdmFsdWUgbWF5IGFwcGVhciBpbiBodW5kcmVkcyBvciBtb3JlIGxvY2F0aW9ucyBhY3Jvc3MgYSBjb2RlIGJhc2UsICBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIHN5bWJvbCB1bml0cyB0byBsb2FkIGlzIG5lY2Vzc2FyeSB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLiAgIEEgc2Vjb25kIGNvbnNpZGVyYXRpb24gaXMgcGxhY2luZyBhbiB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHVuaXRzIHRvIGxvYWQgZnJvbSB0aGUgc3ltYm9sIGxpYnJhcnksICB3aGljaCBpcyB0aGUgbW9yZSBmcmVxdWVudCBhIHN5bWJvbCBpcywgdGhlIGxvd2VyIHRoZSBwcm9iYWJpbGl0eSBvZiBzZWxlY3RpbmcgdGhlIGNvcnJlY3Qgb3JpZ2luLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiAxMjgpIiwKICAgICAgICAgICJkZWZhdWx0IiA6IDEyOAogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCiAgInJlcXVpcmVkIiA6IFsKICAgICJpbnB1dFBhdGhzIgogIF0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'compile' symbol scanner config
    
    # Configure input and output options for the compile pipeline.
    # To learn more see https://doc.log10x.com/compile/scan
    
    tenx: compile
    
    # ========================== Configure I/O Paths ==============================
    
    # 'inputPaths' lists folders on disk containing source code and binary files to scan.
    #  To learn more see https://doc.log10x.com/compile/scan/#inputpaths
    inputPaths:
      - $=path("data/compile/sources", "")   # Default to none ("") if source folder not found
      # - <path-to-input-files>              # uncomment to specify additional input paths
    
    # 'outputSymbolFolder' specifies the folder for output symbol unit files.
    #  To learn more see https://doc.log10x.com/compile/scan/#outputsymbolfolder
    outputSymbolFolder: $=TenXEnv.get("TENX_OUTPUT_SYMBOL_FOLDER", path("data/shared/symbols", "<tenx.io.tmpdir>")) # Default to 10x temp dir
    ```

??? tenx-advanced "Advanced"

    <a id="advanced"></a>
    ### Advanced {.hidden-heading}



    Below is the default configuration from: [advanced/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/compile/scanners/advanced/config.yaml "advanced/config.yaml"){target="\_blank"}.  
  
    <div class="edit-options">
        <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/compile/scanners/advanced/config.yaml" target="_blank" rel="noopener noreferrer">
            <span class="twemoji" style="margin-right: 0.3rem;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
                </svg>
            </span> Edit Online
        </a>
        <button class="md-button tenx-config.yaml1-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml1-dialog">
            <span style="margin-right: 0.3rem;">
                <span class="twemoji">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                        <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                    </svg>
                </span>
            </span>Edit Locally
        </button>
    </div>
    
    <dialog id="config-yaml1-dialog" class="md-dialog md-dialog--editor">
        <div class="editor-dialog-wrapper">
            <div class="editor-dialog-header">
                <span class="editor-dialog-title">Edit config.yaml Locally</span>
                <div class="editor-header-actions">
                    <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                    </button>
                    <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                        <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                        <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                        <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                        <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                    </button>
                    <span class="header-divider"></span>
                    <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml1-dialog')" data-tooltip="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                    </button>
                </div>
            </div>
            <div class="editor-dialog-content">
                <div class="yaml-editor-container"></div>
            </div>
            <div class="yaml-editor-statusbar">
                <span class="yaml-editor-status"></span>
            </div>
        </div>
        <!-- Locations Popup -->
        <div class="locations-popup" style="display: none;">
            <div class="locations-popup-content">
                <div class="locations-popup-header">
                    <span class="locations-header-label">Download and save to:</span>
                    <button class="locations-popup-close" aria-label="Close">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                            <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                        </svg>
                    </button>
                </div>
                <ul class="locations-list">
                    <li>
                        <span class="location-label">Linux / Docker / macOS
                            <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="default-path location-path" data-tooltip=""
                                data-copy-osx="/etc/log10x/config/compile/scanners/advanced/config.yaml"
                                data-copy-nix="/etc/log10x/config/compile/scanners/advanced/config.yaml"
                                data-copy-win="C:\log10x\configs/compile/scanners/advanced/config.yaml"></code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Custom directory
                            <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="$TENX_CONFIG/compile/scanners/advanced/config.yaml">$TENX_CONFIG/compile/scanners/advanced/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                    <li>
                        <span class="location-label">Within cloned repo
                            <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                            </span>
                        </span>
                        <div class="location-path-row">
                            <code class="location-path" data-tooltip="./pipelines/compile/scanners/advanced/config.yaml">./pipelines/compile/scanners/advanced/config.yaml</code>
                            <button class="copy-btn" data-tooltip="Copy path">
                                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                    <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                                </svg>
                            </button>
                        </div>
                    </li>
                </ul>
                <div class="locations-popup-footer">
                    <button class="locations-download-btn" title="Download config file">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                            <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                        </svg>
                        <span>Download</span>
                    </button>
                </div>
            </div>
        </div>
    </dialog>
    
    <template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAiaW5wdXRQYXRocyIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAiYXJyYXkiLAogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiSW5wdXQgZm9sZGVycyB0byBzY2FuXG5cblByb3ZpZGVzIGEgbGlzdCBvZiBmb2xkZXJzIHRoYXQgYXJlIHRyYXZlcnNlZCBpbiBzZWFyY2ggb2Ygc291cmNlIGNvZGUgKGUuZy4gLmpzLCAuY3BwKSwgYmluYXJ5IChlLmcuLCAuc28sIC5qYXIsIC56aXApIGFuZCB0ZXh0IChlLmcuLCAuanNvbiwgLnhtbCkgZmlsZXMgdG8gY2FwdHVyZSBzeW1ib2wgdmFsdWVzIGZyb20gYW5kIG91dHB1dCB0byBzeW1ib2wgdW5pdCBmaWxlcy4gSW5wdXQgZm9sZGVycyBtYXkgY29udGFpbiBmaWxlcyBhbmQgZm9sZGVycyBwdWxsZWQgZnJvbSBbR2l0SHViXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvcHVsbC9naXRodWIvKSBvciAgYW5kIFtBcnRpZmFjdG9yeV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3B1bGwvYXJ0aWZhY3RvcnkpLiIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgfQogICAgfSwKICAgICJvdXRwdXRTeW1ib2xGb2xkZXIiIDogewogICAgICAidHlwZSIgOiBbCiAgICAgICAgInN0cmluZyIsCiAgICAgICAgIm51bGwiCiAgICAgIF0sCiAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJMb2NhdGlvbiBvZiBvdXRwdXQgc3ltYm9sIGZvbGRlclxuXG5TcGVjaWZpZXMgdGhlIHJvb3QgZm9sZGVyIGluIHdoaWNoIHRvIHdyaXRlIG91dHB1dCBzeW1ib2wgdW5pdCBmaWxlcy4gVGhpcyBjb21waWxlciBbc2NhbiBwaGFzZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4vKSBtaXJyb3JzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFtpbnB1dFBhdGhzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jaW5wdXRwYXRocykgYXJndW1lbnQsIHBsYWNpbmcgZWFjaCBvdXRwdXQgc3ltYm9sIHVuaXQgaW4gdGhlIHNhbWUgcmVsYXRpdmUgcGF0aCB1bmRlciBbb3V0cHV0U3ltYm9sRm9sZGVyXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jb3V0cHV0c3ltYm9sZm9sZGVyKSBhcyBpdHMgc291cmNlL2JpbmFyeSBpbnB1dCBmaWxlIHVuZGVyIGl0cyByZXNwZWN0aXZlIGBpbnB1dFBhdGhzYCBmb2xkZXIgZW50cnkuICBGb3IgZXhhbXBsZSwgaWYgW2lucHV0UGF0aHNdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vY29tcGlsZS9zY2FuLyNpbnB1dHBhdGhzKSBpcyBgfi9kZXZgIGFuZCBpdCBjb250YWlucyB0aGUgZmlsZSBgfi9kZXYvYXBwL2Zvby5qc2AsIGFuZCB0aGlzIHZhbHVlIGlzIGB+L3N5bWJvbHNgLCB0aGUgcmVzcGVjdGl2ZSBvdXRwdXQgc3ltYm9sIHVuaXQgZmlsZSBpczogYH4vc3ltYm9scy9hcHAvZm9vLmpzLjEweC5qc29uYC4iCiAgICB9LAogICAgInNjYW4iIDogewogICAgICAidHlwZSIgOiAib2JqZWN0IiwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgImZvcmNlIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2wgd2hldGhlciB0byBzY2FuIGlucHV0IGZpbGVzIGV2ZW4gaWYgYSBtYXRjaGluZyBleGlzdGluZyBzeW1ib2wgZmlsZSBleGlzdHNcblxuQ29udHJvbHMgd2hldGhlciB0byByZXVzZSBtYXRjaGluZyBzeW1ib2wgZmlsZXMgd2l0aGluIFtpbnB1dFBhdGhzXShodHRwczovL2RvYy5sb2cxMHguY29tL2NvbXBpbGUvc2Nhbi8jaW5wdXRwYXRocykuIFRoaXMgb3B0aW9uIGlzIHByaW1hcmlseSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgYSBuZXcgc2Nhbm5lciBtb2R1bGUgY29uZmlndXJhdGlvbiAoZS5nLiwgQU5UTFIgZ3JhbW1hcikgIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFtzY2FubmVyIGRlYnVnZ2luZ10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4pIG9wdGlvbnMuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgICAgICB9LAogICAgICAgICJpblByb2Nlc3MiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQ29udHJvbHMgd2hldGhlciB0byBzY2FuIHNvdXJjZS9iaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgc3ViLXByb2Nlc3MoZXMpXG5cblRoZSBzY2FubmVyIGNhbiBsYXVuY2ggW3N1YnByb2Nlc3Nlc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9jb21waWxlL3NjYW4vI3N1YnByb2Nlc3NfMSkgdG8gY2FwdHVyZSBbc3ltYm9sXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi90cmFuc2Zvcm0vc3RydWN0dXJlLyNzeW1ib2xzKSBpbmZvcm1hdGlvbiBmcm9tIHNwZWNpZmljIHRhcmdldCBzb3VyY2UvYmluYXJ5IGlucHV0IGZpbGVzLiAgIEdlbmVyYXRpbmcgaW5wdXQgZmlsZSBbQVNUc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWJzdHJhY3Rfc3ludGF4X3RyZWUpIHRvIHNjYW4gZm9yIHN5bWJvbHMgdmFsdWVzIGZvciBjb21wbGV4IHN5bnRheGVzIGNhbiBiZSBhIGxlbmd0aHksIHJlc291cmNlLWNvbnN1bWluZyBvcGVyYXRpb24sIHdoaWNoIGluIHRoZSBjYXNlIG9mICBbQU5UTFIgc3ludGF4ZXNdKGh0dHBzOi8vdG9tYXNzZXR0aS5tZS9pbXByb3ZpbmctdGhlLXBlcmZvcm1hbmNlLW9mLWFuLWFudGxyLXBhcnNlci8pIG1heSB0aW1lb3V0IG9yIHJ1biBvdXQgb2YgbWVtb3J5LiAgICAgUHJvY2VzcyBbaXNvbGF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qcm9jZXNzX2lzb2xhdGlvbikgYWxsb3dzIGZvciB0ZXJtaW5hdGluZyBzY2FuIG9wZXJhdGlvbnMgdGhhdCB0aW1lb3V0IGZvciBzcGVjaWZpYyBmaWxlcywgd2hpbGUgYWxsb3dpbmcgb3RoZXJzIHRvIHByb2NlZWQuIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgICAgICB9LAogICAgICAgICJ0aHJlYWRQb29sU2l6ZSIgOiB7CiAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIGNvbmN1cnJlbnRseSBwcm9jZXNzIGlucHV0IHNvdXJjZSBjb2RlIC9iaW5hcnkgZmlsZXNcblxuQ29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gcHJvY2VzcyBpbnB1dCBzb3VyY2UgY29kZS9iaW5hcnkgZmlsZXMgY29uY3VycmVudGx5OiAtIElmIHRoZSB2YWx1ZSBpcyBiZXR3ZWVuIDAgYW5kIDEsIHRoZSBudW1iZXIgY2FsY3VsYXRlcyBhIHBlcmNlbnRhZ2Ugb2YgYXZhaWxhYmxlIGNvcmVzIChlLmcuLCAwLjUgPSB1c2UgdXAgdG8gNTAlIG9mIGF2YWlsYWJsZSBjb3JlcykuICAgLSBJZiB0aGUgdmFsdWUgaXMgPj0gMSwgdGhlIHZhbHVlIHNldHMgYSBmaXhlZCBudW1iZXIgb2YgdGhyZWFkcyAoZS5nLiwgMTAgPSAxMCB0aHJlYWRzKS4gICAtIElmIHRoZSB2YWx1ZSBpcyAxLCBhbGxvY2F0ZSBhIHNpbmdsZSB0aHJlYWQgdG8gcHJvY2VzcyBpbnB1dCBmaWxlcy4gKERlZmF1bHQ6IDAuNSkiLAogICAgICAgICAgImRlZmF1bHQiIDogIjAuNSIKICAgICAgICB9LAogICAgICAgICJ1bml0VGltZW91dCIgOiB7CiAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiVGltZW91dCBpbnRlcnZhbCBmb3Igc2Nhbm5pbmcgYSBzb3VyY2UgY29kZSAvYmluYXJ5IGlucHV0IGZpbGVcblxuU2V0cyB0aGUgdGltZW91dCBpbnRlcnZhbCB3aGVuIHNjYW5uaW5nIGEgc291cmNlIGNvZGUgL2JpbmFyeSBpbnB1dCBmaWxlIGJlZm9yZSBkcm9wcGluZyBpdC4gU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoRGVmYXVsdDogMjBzKSIsCiAgICAgICAgICAiZGVmYXVsdCIgOiAiMjBzIgogICAgICAgIH0sCiAgICAgICAgIm9wZXJhdGlvblRpbWVvdXQiIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlRpbWVvdXQgaW50ZXJ2YWwgZm9yIHRoZSBlbnRpcmUgc2Nhbm5pbmcgb3BlcmF0aW9uXG5cblNldHMgdGhlIHRpbWVvdXQgaW50ZXJ2YWwgZm9yIHRoZSBlbnRpcmUgc2Nhbm5pbmcgb3BlcmF0aW9uIGJlZm9yZSB0ZXJtaW5hdGluZyBpdC4gU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoRGVmYXVsdDogMTBtKSIsCiAgICAgICAgICAiZGVmYXVsdCIgOiAiMTBtIgogICAgICAgIH0sCiAgICAgICAgImRlYnVnIiA6IHsKICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAib3JpZ2lucyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTGlzdCBvZiBpbnB1dCBmaWxlIG5hbWVzIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb25cblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBpbnB1dCBmaWxlIG5hbWVzIChlLmcuLCBteS5zY2FsYSwgZm9vLmphdmEpIHRvIGxvZyBpbmZvcm1hdGlvbiByZWxhdGluZyB0byB3aGljaCBzeW1ib2xzIHdlcmUgY2FwdHVyZWQvc2tpcHBlZC4gU3BlY2lmeSAnKicgZm9yIGFsbCBmaWxlcy4iLAogICAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN5bWJvbHMiIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICJhcnJheSIsCiAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2Ygbm9kZSB0eXBlcyB3aXRoaW4gYSBzY2FubmVyIEFTVCB0cmVlIGZvciB3aGljaCB0byBsb2cgaW5mb3JtYXRpb25cblxuTGlzdCBvZiBub2RlcyB3aXRoaW4gYW4gaW5wdXQgQVNUIHRyZWUsIHN1Y2ggYXMgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyhlLmcuLCAnTXlDbGFzcycsICdmb28nKSBmb3Igd2hpY2ggdG8gbG9nIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZXkgd2VyZSBjYXB0dXJlZC9za2lwcGVkIGFzIHN5bWJvbHMuICBTcGVjaWZ5ICcqJyBmb3IgYWxsIG5vZGVzLiIsCiAgICAgICAgICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibG9nZ2VyTmFtZSIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJEZWJ1ZyBsb2dnZXIgbmFtZVxuXG5TcGVjaWZpZXMgdGhlIGxvZzRqIGxvZ2dlciBmb3IgbG9nZ2luZyB2YWx1ZXMgZm9yIHN5bWJvbHMvZmlsZXMgbWF0Y2hpbmcgJ2RlYnVnT3JpZ2lucycgYW5kICdkZWJ1Z1N5bWJvbHMnLiAoRGVmYXVsdDogW2NvbnNvbGVPdXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9sb2ctMTB4L2NvbmZpZy9ibG9iL21haW4vbG9nNGoyLnlhbWwjTDY2KSkiLAogICAgICAgICAgICAgICJkZWZhdWx0IiA6ICJbY29uc29sZU91dF0oaHR0cHM6Ly9naXRodWIuY29tL2xvZy0xMHgvY29uZmlnL2Jsb2IvbWFpbi9sb2c0ajIueWFtbCNMNjYpIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgInByaW50T3V0cHV0IiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJib29sZWFuIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2xzIHdoZXRoZXIgdG8gZW1pdCBvdXRwdXQgc2NhbiBvcGVyYXRpb25zIHByb2dyZXNzIHRvIHRoZSBjb25zb2xlXG5cbkNvbnRyb2xzIHdoZXRoZXIgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gc3ltYm9sIHVuaXRzIHNjYW5uaW5nIGlzIGVtaXR0ZWQgdG8gdGhlIHN0ZG91dCBzdHJlYW0uIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgMTB4IHByb2Nlc3MgaXMgIHNwYXduZWQgYnkgYSBwYXJlbnQgMTB4ICdjb21waWxlJyBwaXBlbGluZSB0byByZXBvcnQgaXRzIHByb2dyZXNzLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSAoRGVmYXVsdDogZmFsc2UpIiwKICAgICAgImRlZmF1bHQiIDogZmFsc2UKICAgIH0sCiAgICAidW5pdHNUb1NjYW5QZXJCYXRjaCIgOiB7CiAgICAgICJ0eXBlIiA6IFsKICAgICAgICAibnVtYmVyIiwKICAgICAgICAic3RyaW5nIiwKICAgICAgICAibnVsbCIKICAgICAgXSwKICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1heGltdW0gbnVtYmVyIG9mIGlucHV0IGZpbGVzIHRvIHNjYW4gcGVyIHN1Yi1wcm9jZXNzLlxuXG5TZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzb3VyY2UvYmluYXJ5IGlucHV0IGZpbGVzIHRvIHNjYW4gYnkgYSBzaW5nbGUgJ2NvbXBpbGUnIHN1Yi1wcm9jZXNzLiBTZXQgdG8gMCB0byB1bmxpbWl0ZWQuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikgKERlZmF1bHQ6IDQwKSIsCiAgICAgICJkZWZhdWx0IiA6IDQwCiAgICB9LAogICAgInRva2VuRGVsaW1zIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJzdHJpbmciLAogICAgICAgICJudWxsIgogICAgICBdLAogICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiVG9rZW4gZGVsaW1pdGVyc1xuXG5EZWZpbmVzIHdoaWNoIGNoYXJhY3RlcnMgYnJlYWsgYSBzdHJpbmcgb2YgZXZlbnQgY2hhcmFjdGVycyBpbnRvIHRva2VucyB0byBjbGFzc2lmeSBhcyBzeW1ib2xzIG9yIHZhcmlhYmxlcy4gKERlZmF1bHQ6IDw+fC4gXVs6LSsvKj1cXFxcLHt9XygpOydcXFwiJFxcdFxcbkApIiwKICAgICAgImRlZmF1bHQiIDogIjw+fC4gXVs6LSsvKj1cXFxcLHt9XygpOydcXFwiJFxcdFxcbkAiCiAgICB9LAogICAgImZpbGVFeHRTdHJpbmdGb3JtYXRzIiA6IHsKICAgICAgInR5cGUiIDogWwogICAgICAgICJhcnJheSIsCiAgICAgICAgInN0cmluZyIsCiAgICAgICAgIm51bGwiCiAgICAgIF0sCiAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJTdHJpbmcgZm9ybWF0IHNwZWNpZmllciBjaGFyYWN0ZXJzXG5cbkNvbnRyb2xzIHdoaWNoIGNoYXJhY3RlcnMgaWRlbnRpZnkgdGhlIHN0YXJ0IG9mIGEgW2Zvcm1hdCBzcGVjaWZpZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByaW50ZiNGb3JtYXRfc3BlY2lmaWVyKSBmb3IgZWFjaCBwcm9ncmFtbWluZyBsYW5ndWFnZSBleHRlbnNpb24gaW4gdGhlIGZvcm0gb2YgPGV4dD46PGZvcm1hdFByZWZpeD4gKGUuZy4sIGAuamF2YTolYCkuICBJdCBpcyBhIHN0YW5kYXJkIHByb2dyYW1taW5nIHByYWN0aWNlIHRvIHVzZSBzdHJpbmcgZm9ybWF0cyB0byBsb2cgbWVzc2FnZXMgaW4gdGhlIGZvcm0gb2Y6ICBgYGAgamF2YSBsb2cuZXJyb3IoXCJjb3VsZCBub3QgY29ubmVjdCB0byB7fSB3aXRoIHN0YXR1cyB7fVwiLCBob3N0LCBzdGF0dXMpOyBgYGAgIFdoZW4gYW4gVGVuWFRlbXBsYXRlIHRva2VuaXplciBwcm9jZXNzaW5nIGFuIGV2ZW50IGlkZW50aWZpZXMgYSBmb3JtYXQgcHJlZml4IChlLmcuLCBgJWApIGl0IHNraXBzIGl0IGFuZCBhcHBlbmRzIHN1YnNlcXVlbnQgc3ltYm9sIHRva2VucyAoZS5nLiwgYHdpdGggc3RhdHVzYCkgdG8gdGhlIHN5bWJvbCBzZXF1ZW5jZSBwcmVjZWRpbmcgdGhlbSAoZS5nLiwgYGNvdWxkIG5vdCBjb25uZWN0IHRvYCkuIiwKICAgICAgIml0ZW1zIiA6IHsKICAgICAgICAidHlwZSIgOiAic3RyaW5nIgogICAgICB9CiAgICB9LAogICAgIm1heFN5bWJvbCIgOiB7CiAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAidW5pdFNlY3Rpb25TaXplIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAibnVsbCIKICAgICAgICAgIF0sCiAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4aW11bSBudW1iZXIgb2Ygc3ltYm9sIHRva2VucyB0byBzdG9yZSBpbiBhIHNpbmdsZSBzeW1ib2wgdW5pdCBmaWxlXG5cbkNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2wgdG9rZW5zIHRvIHN0b3JlIGluIGEgc3ltYm9sIHVuaXQgYmVmb3JlIHNwbGl0dGluZyBpdC4gVGhpcyBvcHRpb24gc3VwcG9ydHMgbGFyZ2Ugc291cmNlIGNvZGUgL2JpbmFyeSBpbnB1dCBmaWxlcyB0aGF0IG1heSBoYXZlIHRob3VzYW5kcyBvZiB0ZXh0IHN5bWJvbHMgdG8gYXZvaWQgIGNyZWF0aW5nIHNpemVhYmxlIGluZGl2aWR1YWwgc3ltYm9sIHVuaXQgZmlsZXMuICAgICAgICAgU2V0IHRvIG51bGwgdG8gaWdub3JlLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiA1MDApIiwKICAgICAgICAgICJkZWZhdWx0IiA6IDUwMAogICAgICAgIH0sCiAgICAgICAgInVuaXRzUGVyVG9rZW4iIDogewogICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJOdW1iZXIgb2Ygc3ltYm9sIHVuaXRzIHRvIHJldHJpZXZlIHdoZW4gc2VhcmNoaW5nIGZvciB0aGUgb3JpZ2luIG9mIGFuIFRlblhUZW1wbGF0ZSBzeW1ib2wgc2VxdWVuY2VcblxuQ29udHJvbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN5bWJvbCB1bml0cyB0byBsb2FkIGZyb20gdGhlIHBpcGVsaW5lJ3Mgc3ltYm9sIGxpYnJhcnkgd2hlbiBzZWFyY2hpbmcgZm9yIHRoZSBvcmlnaW4gb2YgYSBzcGVjaWZpYyBbVGVuWFRlbXBsYXRlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi90ZW1wbGF0ZS8pIHN5bWJvbC4gICBUaGUgW3N5bWJvbFNlcXVlbmNlXShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWE9iamVjdCtzeW1ib2xTZXF1ZW5jZSkgZnVuY3Rpb24gcXVlcmllcyB0aGUgc291cmNlIGNvZGUvYmluYXJ5IG9yaWdpbiBvZiBzeW1ib2wgc2VxdWVuY2VzIGluIGEgdGFyZ2V0IFRlblhUZW1wbGF0ZSB0byBpZGVudGlmeSB0aGUgbG9naWNhbCBbbWVzc2FnZV0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vaW5pdGlhbGl6ZS9tZXNzYWdlLykgcG9ydGlvbiBvZiBhIHRhcmdldCBhcHAvaW5mcmEgZXZlbnRzIHZzLiB2YXJpYWJsZSBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiAoZS5nLiwgdXNlciwgaG9zdCwgc2V2ZXJpdHkpLiAgIFNpbmNlIGEgW3N5bWJvbF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vdHJhbnNmb3JtL3N0cnVjdHVyZS8jc3ltYm9scykgdmFsdWUgbWF5IGFwcGVhciBpbiBodW5kcmVkcyBvciBtb3JlIGxvY2F0aW9ucyBhY3Jvc3MgYSBjb2RlIGJhc2UsICBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIHN5bWJvbCB1bml0cyB0byBsb2FkIGlzIG5lY2Vzc2FyeSB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLiAgIEEgc2Vjb25kIGNvbnNpZGVyYXRpb24gaXMgcGxhY2luZyBhbiB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHVuaXRzIHRvIGxvYWQgZnJvbSB0aGUgc3ltYm9sIGxpYnJhcnksICB3aGljaCBpcyB0aGUgbW9yZSBmcmVxdWVudCBhIHN5bWJvbCBpcywgdGhlIGxvd2VyIHRoZSBwcm9iYWJpbGl0eSBvZiBzZWxlY3RpbmcgdGhlIGNvcnJlY3Qgb3JpZ2luLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiAxMjgpIiwKICAgICAgICAgICJkZWZhdWx0IiA6IDEyOAogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCiAgInJlcXVpcmVkIiA6IFsKICAgICJpbnB1dFBhdGhzIgogIF0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

    ```yaml
    # 🔟❎ 'compile' symbol scanner advanced config
    
    # Configure input and output options for the compile pipeline.
    # To learn more see https://doc.log10x.com/compile/scan/
    
    # Set the 10x pipeline to 'compile'
    tenx: compile
    
    inputPaths: []
    
    # ============================ Advanced options ===============================
    
    # ----------------------------- Tokenizer options -----------------------------
    
    # Tokenization options provide control over how the symbol scanners parse source and config file input.
    # To learn more https://doc.log10x.com/compile/scan/#tokenize
    
    # 'tokenDelims' defines which characters break a string of event characters into tokens to 
    #  classify as symbols or variables.
    tokenDelims: "<>|. ][:-+/*=\\,{}_();'\"$\t\n@"
    
    # 'fileExtStringFormats' controls which characters identify the start of a format specifier (https://en.wikipedia.org/wiki/Printf#Format_specifier). 
    fileExtStringFormats: 
      - .java:{
      - .py:{
      - .js:${
      - .php:$
      - .swift:\(
      - .kt:$
      - .rb:#{
      - .ex:#{
      - .c:%
      - .cpp:%
      - .cs:{
      - .go:%
      - .rs:{
      - .ts:${
      - .pl:$
      - .sh:$
      - .r:%
      - .m:%
      - .scala:$
    
    
    maxSymbol:
    
    # 'unitsPerToken' controls the maximum number of symbol units to load from the 
    #  pipeline's symbol library when searching for the origin of a specific TenXTemplate symbol. 
      unitsPerToken: 128
    
    # ----------------------------- Subprocess options ----------------------------
    
    # Subprocess options control whether scanners execute in the current 10x Engine instance
    # or via a sub-process to provide better isolation over parsing of complex source code ASTs. 
    
    # To learn more https://doc.log10x.com/compile/scan/#subprocess_1
    
    # 'unitsToScanPerBatch' sets the maximum number of input files to scan per subprocess instance.
    #  When this threshold is exceeded the current subprocess terminated and a new one is spawned until scan is complete.
    unitsToScanPerBatch: 200
    
    scan:
    
    # ----------------------------- Threading  options ----------------------------
    
      # 'threadPoolSize'controls the maximum number of threads to concurrently
      #  process input source/binary files. If the value is between 0 and 1, the number calculates 
      #  a percentage of available cores (e.g., 0.5 = use up to 50% of available cores).
      #  If the value is >= 1, the value sets a fixed number of threads (e.g., 10 = 10 threads).
      #  If the value is 1, allocate a single thread to process input files.
    
      # To learn more see https://doc.log10x.com/compile/scan/#parallel
    
      threadPoolSize: "0.5"
    
      # 'scanUnitTimeout' sets the timeout interval when scanning a source/binary input
      #  file before dropping it. 
      unitTimeout: 30s
    
      # 'scanOperationTimeout' sets the timeout interval for the entire scanning operation
      #  before terminating it.
      operationTimeout: 10m
    
    # -------------------------------- Debug Option -------------------------------
    
    # The settings below provide control over what information is logged
    # to console/file when scanning input source code/text/binary files for symbol values.
    
    # These options are primarily used when adding support for a new programming language
    # syntax via the 'ANTLR' scanner, text file formats via the Jackson 'text' scanner
    # or an external command using the 'executable' scanner.
    
      debug:
    
      # 'origins' lists names of input source/binary files 
      #  (e.g. .class, .js, .yaml, .exe) for which debug information
      #  is printed to the console via 'consoleOut' log4j logger.
    
      #  Printed output is dependent on the scanner assigned to process the input file  
      #  and usually includes the AST of the input file from which tokens are selected.
    
      #  This information can be used when debugging which symbols are extracted
      #  from an input file in the context of an 'antlr', 'text' or 'executable' scanner. 
      #  Set to '*' to match all input files. 
        origins: [
      #   '*'
        ]
    
      # 'symbols' lists the values of nodes within the AST of a
      #  target input file (e.g. MyClass, MyEnum, myFunc, ..) for which 
      #  debug information is printed to the console via the 'consoleOut' logger.
      #  This includes source context (e.g. class, enum) and path within the AST 
      #  in which the node was detected. Set to '*' to match all AST nodes. 
        symbols: [
         #'*'
        ]
    
      # 'inProcess' controls whether to scan source/binary input files from within the current
      #  10x process or launch a sequential series subprocesses for better isolation
      # inProcess: true  
    
      # 'force' enables scanning of source/binary input files even if a matching
      #  symbol unit was found in 'inputPaths'. This flag is useful when debugging
      #  an Antlr/text/exec scanner using 'debugOrigins' and 'debugSymbols'
      #  to ensure a scan takes place even if a matching symbol unit is found.
      
      # force: false 
    ```

## :material-menu: Options

Specify the options below to [configure](/config "configure") the Input Scanner:

|Name|Description|Category|
|---|---|---|
|[inputPaths](#inputpaths "input folders to scan")|Input folders to scan|Input|
|[outputSymbolFolder](#outputsymbolfolder "location of output symbol folder")|Location of output symbol folder|Output|
|[scanForce](#scanforce "control whether to scan input files even if a matching existing symbol file exists")|Control whether to scan input files even if a matching existing symbol file exists|Output|
|[maxSymbolUnitSectionSize](#maxsymbolunitsectionsize "maximum number of symbol tokens to store in a single symbol unit file")|Maximum number of symbol tokens to store in a single symbol unit file|Output|
|[scanInProcess](#scaninprocess "controls whether to scan source/binary input files using sub-process(es)")|Controls whether to scan source/binary input files using sub-process(es)|Subprocess|
|[printOutput](#printoutput "controls whether to emit output scan operations progress to the console")|Controls whether to emit output scan operations progress to the console|Subprocess|
|[unitsToScanPerBatch](#unitstoscanperbatch "maximum number of input files to scan per sub-process.")|Maximum number of input files to scan per sub-process.|Subprocess|
|[scanThreadPoolSize](#scanthreadpoolsize "maximum number of threads to use concurrently process input source code /binary files")|Maximum number of threads to use concurrently process input source code /binary files|Parallel|
|[scanUnitTimeout](#scanunittimeout "timeout interval for scanning a source code /binary input file")|Timeout interval for scanning a source code /binary input file|Parallel|
|[scanOperationTimeout](#scanoperationtimeout "timeout interval for the entire scanning operation")|Timeout interval for the entire scanning operation|Parallel|
|[tokenDelims](#tokendelims "token delimiters")|Token delimiters|Tokenize|
|[fileExtStringFormats](#fileextstringformats "string format specifier characters")|String format specifier characters|Tokenize|
|[maxSymbolUnitsPerToken](#maxsymbolunitspertoken "number of symbol units to retrieve when searching for the origin of an TenXTemplate symbol sequence")|Number of symbol units to retrieve when searching for the origin of an TenXTemplate symbol sequence|Tokenize|
|[scanDebugOrigins](#scandebugorigins "list of input file names for which to log information")|List of input file names for which to log information|Debug|
|[scanDebugSymbols](#scandebugsymbols "list of node types within a scanner AST tree for which to log information")|List of node types within a scanner AST tree for which to log information|Debug|
|[scanDebugLoggerName](#scandebugloggername "debug logger name")|Debug logger name|Debug|

### Input

#### :material-menu-right-outline:**`inputPaths`**

Input folders to scan.

|Type|Required|Category|
|---|---|---|
|List|✔|Input|

Provides a list of folders that are traversed in search of source code (e.g. .js, .cpp),
binary (e.g., .so, .jar, .zip) and text (e.g., .json, .xml) files to capture symbol values from and
output to symbol unit files. Input folders may contain files and folders pulled from [GitHub](https://doc.log10x.com/compile/pull/github/ "Pull folders from GitHub repositories to scan for symbol content") or
and [Artifactory](https://doc.log10x.com/compile/pull/artifactory "Pull files from Artifactory repositories to scan for symbol content").


### Output

#### :material-menu-right-outline:**`outputSymbolFolder`**

Location of output symbol folder.

|Type|Default|Category|
|---|---|---|
|File||Output|

Specifies the root folder in which to write output symbol unit files.
This compiler [scan phase](https://doc.log10x.com/compile/scan/ "Capture symbol values from source code/binary files and link to an output symbol library") mirrors the structure of the [inputPaths](https://doc.log10x.com/compile/scan/#inputpaths "input folders to scan") argument, placing each
output symbol unit in the same relative path under [outputSymbolFolder](https://doc.log10x.com/compile/scan/#outputsymbolfolder "location of output symbol folder")
as its source/binary input file under its respective `inputPaths` folder entry.

For example, if [inputPaths](https://doc.log10x.com/compile/scan/#inputpaths "input folders to scan") is `~/dev` and it contains the file `~/dev/app/foo.js`,
and this value is `~/symbols`, the respective output symbol unit file is: `~/symbols/app/foo.js.10x.json`.


#### :material-menu-right-outline:**`scanForce`**

Control whether to scan input files even if a matching existing symbol file exists.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Output|

Controls whether to reuse matching symbol files within [inputPaths](https://doc.log10x.com/compile/scan/#inputpaths "input folders to scan").
This option is primarily useful when debugging a new scanner module configuration (e.g., ANTLR grammar)
in conjunction with the [scanner debugging](https://doc.log10x.com/compile/scan "Capture symbol values from source code/binary files and link to an output symbol library") options.


#### :material-menu-right-outline:**`maxSymbolUnitSectionSize`**

Maximum number of symbol tokens to store in a single symbol unit file.

|Type|Default|Category|
|---|---|---|
|Number|500|Output|

Controls the maximum number of symbol tokens to store in a symbol unit before splitting it.
This option supports large source code /binary input files that may have thousands of text symbols to avoid
creating sizeable individual symbol unit files.  
Set to null to ignore.


### Subprocess

#### :material-menu-right-outline:**`scanInProcess`**

Controls whether to scan source/binary input files using sub-process(es).

|Type|Default|Category|
|---|---|---|
|Boolean|false|Subprocess|

The scanner can launch [subprocesses](https://doc.log10x.com/compile/scan/#subprocess_1) to capture [symbol](https://doc.log10x.com/run/transform/structure/#symbols)
information from specific target source/binary input files.

Generating input file [ASTs](https://en.wikipedia.org/wiki/Abstract_syntax_tree){target="\_blank"} to scan for symbols values for complex syntaxes can be a lengthy, resource-consuming operation, which in the case of
[ANTLR syntaxes](https://tomassetti.me/improving-the-performance-of-an-antlr-parser/){target="\_blank"} may timeout or run out of memory.

Process [isolation](https://en.wikipedia.org/wiki/Process_isolation){target="\_blank"} allows for terminating scan operations that timeout for specific files, while allowing others to proceed.


#### :material-menu-right-outline:**`printOutput`**

Controls whether to emit output scan operations progress to the console.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Subprocess|

Controls whether information relating to symbol units scanning
is emitted to the stdout stream. This value should be set to true when the current 10x process is
spawned by a parent 10x 'compile' pipeline to report its progress.


#### :material-menu-right-outline:**`unitsToScanPerBatch`**

Maximum number of input files to scan per sub-process.

|Type|Default|Category|
|---|---|---|
|Number|40|Subprocess|

Sets the maximum number of source/binary input files to scan by a single 'compile' sub-process.  
Set to 0 to unlimited.


### Parallel

#### :material-menu-right-outline:**`scanThreadPoolSize`**

Maximum number of threads to use concurrently process input source code /binary files.

|Type|Default|Category|
|---|---|---|
|String|0.5|Parallel|

Controls the maximum number of threads to process input source code/binary files concurrently:

  - If the value is between 0 and 1, the number calculates a percentage of available cores (e.g., 0.5 = use up to 50% of available cores).
  - If the value is \>= 1, the value sets a fixed number of threads (e.g., 10 = 10 threads).
  - If the value is 1, allocate a single thread to process input files.


#### :material-menu-right-outline:**`scanUnitTimeout`**

Timeout interval for scanning a source code /binary input file.

|Type|Default|Category|
|---|---|---|
|String|20s|Parallel|

Sets the timeout interval when scanning a source code /binary input file before dropping it.
Set to null to ignore.


#### :material-menu-right-outline:**`scanOperationTimeout`**

Timeout interval for the entire scanning operation.

|Type|Default|Category|
|---|---|---|
|String|10m|Parallel|

Sets the timeout interval for the entire scanning operation before terminating it.  
Set to null to ignore.


### Tokenize

#### :material-menu-right-outline:**`tokenDelims`**

Token delimiters.

|Type|Default|Category|
|---|---|---|
|String|\<\>\|. \]\[:-+/\*=\\\\,{}\_();'\\"$\\t\\n@|Tokenize|

Defines which characters break a string of event characters into tokens to classify as symbols or variables.


#### :material-menu-right-outline:**`fileExtStringFormats`**

String format specifier characters.

|Type|Default|Category|
|---|---|---|
|List|\[\]|Tokenize|

Controls which characters identify the start of a [format specifier](https://en.wikipedia.org/wiki/Printf#Format_specifier){target="\_blank"}
for each programming language extension in the form of <ext>:<formatPrefix> (e.g., `.java:%`).

It is a standard programming practice to use string formats to log messages in the form of:

```java
log.error("could not connect to {} with status {}", host, status);
```

When an TenXTemplate tokenizer processing an event identifies a format prefix (e.g., `%`)
it skips it and appends subsequent symbol tokens (e.g., `with status`)
to the symbol sequence preceding them (e.g., `could not connect to`).


#### :material-menu-right-outline:**`maxSymbolUnitsPerToken`**

Number of symbol units to retrieve when searching for the origin of an TenXTemplate symbol sequence.

|Type|Default|Category|
|---|---|---|
|Number|128|Tokenize|

Controls the maximum number of symbol units to load from the pipeline's symbol library
when searching for the origin of a specific [TenXTemplate](https://doc.log10x.com/run/template/ "Import joint JSON schemas files to expand events into well-defined TenXObjects.") symbol.

The [symbolSequence](https://doc.log10x.com/api/js/#TenXObject+symbolSequence) function queries the source code/binary origin
of symbol sequences in a target TenXTemplate to identify the logical [message](https://doc.log10x.com/run/initialize/message/ "Enrich TenXObjects with logical message symbol sequence and origin values") portion of a target app/infra
events vs. variable and context information (e.g., user, host, severity).

Since a [symbol](https://doc.log10x.com/run/transform/structure/#symbols) value may appear in hundreds or more locations across a code base,
limiting the number of symbol units to load is necessary to reduce memory consumption.

A second consideration is placing an upper limit on the number of units to load from the symbol library,
which is the more frequent a symbol is, the lower the probability of selecting the correct origin.


### Debug

#### :material-menu-right-outline:**`scanDebugOrigins`**

List of input file names for which to log information.

|Type|Default|Category|
|---|---|---|
|List|\[\]|Debug|

Specifies a list of input file names (e.g., my.scala, foo.java) to log information relating to which symbols were captured/skipped.

Specify '\*' for all files.


#### :material-menu-right-outline:**`scanDebugSymbols`**

List of node types within a scanner AST tree for which to log information.

|Type|Default|Category|
|---|---|---|
|List|\[\]|Debug|

List of nodes within an input AST tree, such as class and method names(e.g., 'MyClass', 'foo')
for which to log information relating to the context in which they were captured/skipped as symbols.

Specify '\*' for all nodes.


#### :material-menu-right-outline:**`scanDebugLoggerName`**

Debug logger name.

|Type|Default|Category|
|---|---|---|
|String|[consoleOut](https://github.com/log-10x/config/blob/main/log4j2.yaml#L66 "consoleOut"){target="\_blank"}|Debug|

Specifies the log4j logger for logging values for symbols/files matching 'debugOrigins' and 'debugSymbols'.


<br/>:material-github: This unit is defined in [scan/unit.yaml](https://github.com/log-10x/modules/tree/main/pipelines/compile/units/scan/unit.yaml "scan/unit.yaml"){target="\_blank"}.

