From b872fe3548737edfa9579bf9253d8fad388cff91 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 9 Jul 2026 12:59:51 -0400 Subject: [PATCH 01/54] replace monolithic setup.py with pyproject.toml + scripts - all the metadata has been moved to pyproject and setup.py is now only responsible for building the c/objc/swift extension - CI helpers and app/package building now live in the `build.py` script - builds & tests now use standard `python3 -m build` and `python3 -m tests` --- .github/workflows/publish.yml | 11 +- .github/workflows/release.yml | 23 +- BUILDING.md | 63 ++++ build.py | 332 +++++++++++++++++++ pyproject.toml | 57 ++++ setup.py | 586 +++------------------------------- 6 files changed, 518 insertions(+), 554 deletions(-) create mode 100644 BUILDING.md create mode 100644 build.py create mode 100644 pyproject.toml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 77ac5b3..bf31674 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,14 +13,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel twine build setuptools + + - name: Install PlotDevice and run tests run: | - pip3 install -U pip wheel twine - python3 setup.py test + pip3 install . + python3 -m tests - name: Build sdist run: | - python3 setup.py sdist + python3 -m build --sdist - name: Upload to PyPI env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc27eb7..2ba8cb8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,13 +38,17 @@ jobs: # collect notarization credentials xcrun notarytool store-credentials "AC_NOTARY" --apple-id "$AC_ID" --team-id "$AC_TEAM" --password "${{ secrets.AC_PASSWORD }}" - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel setuptools + + - name: Install PlotDevice and run tests run: | - python3 setup.py test + pip3 install . + python3 -m tests - name: Build & Notarize App run: | - python3 setup.py dist + python3 build.py dist - name: Create Draft Release uses: softprops/action-gh-release@v1 @@ -55,7 +59,7 @@ jobs: files: | dist/*.zip - sdist: + packages: name: Post to test.pypi.org runs-on: macos-latest @@ -63,13 +67,17 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Run Tests + - name: Install build dependencies + run: pip3 install -U pip wheel twine build setuptools + + - name: Install PlotDevice and run tests run: | - python3 setup.py test + pip3 install . + python3 -m tests - name: Build Source Distribution run: | - python3 setup.py sdist + python3 -m build --sdist - name: Upload to test.pypi.org env: @@ -78,6 +86,5 @@ jobs: TWINE_REPOSITORY: https://test.pypi.org/legacy/ TWINE_NON_INTERACTIVE: 1 run: | - pip3 install twine twine check dist/* twine upload -r testpypi dist/* diff --git a/BUILDING.md b/BUILDING.md new file mode 100644 index 0000000..f1ca4e0 --- /dev/null +++ b/BUILDING.md @@ -0,0 +1,63 @@ +# Building PlotDevice from Source + +If you’re interested in using the bleeding edge code from the repository (or doing development work on the +library/app itself), there are a few different ways to build it. + +## Requirements + +- macOS 11+ and Xcode or the Xcode command line tools (`xcode-select --install`) +- A Python 3.8+ interpreter with wheel availability for `pyobjc-core==11.0` + (i.e. not a brand-new Python release that predates PyObjC’s own support for it) + +## Local dev environment + +`python3 build.py dev` sets up a self-contained virtualenv at `deps/local//` +and ensures PlotDevice’s dependencies (including its native-code extensions) are installed. +Once this environment has been set up you can use `python3 -m plotdevice ` or +`app/plotdevice ` to run scripts directly from the repo. + +## Module builds + +The `plotdevice` Python module depends on native code in the `deps/extensions` directory +but can be installed like any other `pyproject.toml`-based package. From the repo root, type one of: +```console +pip3 install . # for a regular install +pip3 install -e . # editable install, for dev work on plotdevice/*.py +``` +You can run the test suite with: +```console +python3 -m tests +``` + +Redistributable `sdists` and wheels can be built via: +```console +python3 -m build --sdist +python3 -m build --wheel +``` + +## Application builds + +The `build.py` script contains utilites for building **PlotDevice.app** (i.e., the full GUI application). +If you have the full Xcode installed on your system, you can build the app (including its own embedded copy +of Python) with: +```console +python3 build.py app +``` + +Alternatively (if you only have the Xcode command line tools installed) you can use `py2app`, which can +be especially useful for quick, local tests: +```console +python3 build.py py2app +``` + +## CI/Maintainer scripts + +The `build.py` script contains other subcommands that are primarily useful for packaging: +```console +python3 build.py clean # remove build artifacts +python3 build.py distclean # also remove the embedded Python.framework and deps/local +python3 build.py dist # build app (codesigned, notarized, and zipped) and update release.json +``` + +Note that `dist` requires a "Developer ID Application" signing identity and a `notarytool` keychain profile +named `AC_NOTARY`, and is intended for release builds only. diff --git a/build.py b/build.py new file mode 100644 index 0000000..fce1210 --- /dev/null +++ b/build.py @@ -0,0 +1,332 @@ +#!/usr/bin/env python3 +"""Maintainer/CI build tool for PlotDevice (not part of the pip-installable package) + +Subcommands: + dev set up virtualenv in deps/local with required dependencies + app build PlotDevice.app (requires full Xcode install + py2app build PlotDevice.app via py2app (requires Xcode command line tools) + dist build app (codesigned, notarized, & zipped) and update release.json + clean remove build artifacts + distclean also remove the embedded Python.framework and deps/local +""" +import argparse, os, sys, json, plistlib +from glob import glob +from shutil import rmtree +from subprocess import call, run, Popen, PIPE +from os.path import join, exists, dirname, basename, abspath, getsize + +ROOT = dirname(abspath(__file__)) +sys.path.insert(0, ROOT) + +APP_NAME = 'PlotDevice' +SPARKLE_VERSION = '2.1.0' +SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.xz' % {'v': SPARKLE_VERSION} + +## Helpers ## + +# helpers for dealing with plists & git (spiritual cousins if ever there were) +def info_plist(pth='app/info.plist'): + info = plistlib.load(open(pth, 'rb')) + # overwrite the xcode placeholder vars + info['CFBundleExecutable'] = info['CFBundleName'] = APP_NAME + return info + +def update_plist(pth, **modifications): + info = plistlib.load(open(pth, 'rb')) + for key, val in modifications.items(): + if val is None: + info.pop(key) + else: + info[key] = val + with open(pth, 'wb') as f: + plistlib.dump(info, f) + +def gosub(cmd, on_err=True): + """Run a shell command and return the output""" + shell = isinstance(cmd, str) + proc = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=shell) + out, err = proc.communicate() + ret = proc.returncode + if on_err: + msg = '%s:\n' % on_err if isinstance(on_err, str) else '' + if ret != 0: + print(msg + out.decode('utf8') + err.decode('utf8')) + return out, err, ret + +def last_commit(): + commit_count, _, _ = gosub('git log --oneline | wc -l') + return 'r%s' % commit_count.decode('utf-8').strip() + +def timestamp(): + from datetime import datetime + return datetime.now().strftime("%a, %d %b %Y %H:%M:%S") + +def spawn(cmd, **kwargs): + run(cmd, check=True, **kwargs) + + +## Subcommands ## + +def cmd_dev(args): + # install pyobjc, requests and the other pypi dependencies in deps/local + import platform, venv + venv_dir = join('deps/local', platform.python_version()) + if not exists(venv_dir): + venv.create(venv_dir, symlinks=True, with_pip=True) + PIP = join(venv_dir, 'bin/pip3') + call([PIP, 'install', '-q', '--upgrade', 'pip', 'setuptools', 'wheel', 'py2app', 'twine']) + call([PIP, 'install', '-q', '-e', ROOT]) + + print("\nA local development environment has been set up in %s" % venv_dir) + + +def cmd_clean(args): + paths = [ + 'build', + 'dist', + '*.egg', + '*.egg-info', + '.eggs', + 'PKG', + 'tests/_out', + 'tests/_diff', + 'details.html', + '_plotdevice.*.so', + 'plotdevice/rsrc', + '**/*.pyc', + '**/__pycache__', + '**/.DS_Store', + ] + + # Add framework paths if --dist flag is used + if args.dist: + paths.extend([ + 'deps/local', + 'deps/frameworks/Python.framework', + 'deps/frameworks/relocatable-python', + ]) + + for path_pattern in paths: + for path in glob(path_pattern, recursive=True): + if exists(path): + print('removing %s' % path) + if os.path.isdir(path): + rmtree(path) + else: + os.unlink(path) + + # Run make clean in svg extensions dir + if exists('deps/extensions/svg'): + os.system('cd deps/extensions/svg && make clean') + + +def cmd_distclean(args): + cmd_clean(argparse.Namespace(dist=True)) + + +def cmd_app(args): + # make sure the embedded framework exists (and has updated app/python.xcconfig) + print("Set up Python.framework for app build") + env = os.environ.copy() + if args.no_cache: + env['PIP_NO_CACHE_DIR'] = '1' + call('cd deps/frameworks && make', shell=True, env=env) + + spawn(['xcodebuild', '-configuration', 'Release']) + dsym = 'dist/PlotDevice.app.dSYM' + if exists(dsym): + rmtree(dsym) + print("done building PlotDevice.app in ./dist") + + +def cmd_py2app(args): + try: + import py2app + except ImportError: + print("""build.py: py2app build failed + Couldn't find the py2app module. To set up a virtualenv that contains all the necessary + dependencies in the deps/local directory, call the `dev` command first: + > python3 build.py dev + > ./deps/local//bin/python3 build.py py2app""") + sys.exit(1) + + from py2app.build_app import py2app as build_py2app + + # make sure _plotdevice.so + plotdevice/rsrc/ are built first + call([sys.executable, 'setup.py', 'build_ext', '--inplace']) + + class BuildPy2AppCommand(build_py2app): + def finalize_options(self): + # pyproject.toml's [project.dependencies] gets merged into + # self.distribution.install_requires automatically since setup() + # below runs from the same directory as pyproject.toml; py2app + # bundles dependencies directly and rejects install_requires, so + # clear it before py2app's own finalize_options checks for it. + self.distribution.install_requires = None + build_py2app.finalize_options(self) + + def run(self): + build_py2app.run(self) + if self.dry_run: + return + + # undo py2app's weird treatment of the config.version value + update_plist('dist/PlotDevice.app/Contents/Info.plist', CFBundleShortVersionString=None) + + # place the command line tool in SharedSupport + BIN = join(dirname(self.resdir), 'SharedSupport') + self.mkpath(BIN) + self.copy_file("app/plotdevice", BIN) + + print("done building PlotDevice.app in ./dist") + + from setuptools import setup + old_argv = sys.argv + try: + sys.argv = ['build.py', 'py2app'] + setup( + name='plotdevice', + app=[{ + 'script': "app/plotdevice-app.py", + 'plist': info_plist(), + }], + data_files=[ # type: ignore[list-item] + "app/Resources/ui", + "app/Resources/colors.json", + "app/Resources/en.lproj", + "app/Resources/PlotDevice.icns", + "app/Resources/PlotDeviceFile.icns", + "examples", + ], + options={ # type: ignore[dict-item] + "py2app": { + "iconfile": "app/Resources/PlotDevice.icns", + "semi_standalone": True, + "site_packages": True, + "strip": False, + } + }, + cmdclass={'py2app': BuildPy2AppCommand}, + ) + finally: + sys.argv = old_argv + +## Packaging Commands (really only useful to the maintainer) ## + +def cmd_dist(args): + import plotdevice + VERSION = plotdevice.__version__ + + APP = 'dist/PlotDevice.app' + ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION + + # run the Xcode build + cmd_app(args) + + # set the bundle version to the current commit number and prime the updater + info_pth = 'dist/PlotDevice.app/Contents/Info.plist' + update_plist(info_pth, + CFBundleVersion=last_commit(), + CFBundleShortVersionString=VERSION, + SUFeedURL='https://plotdevice.io/app.xml', + SUEnableSystemProfiling='YES' + ) + + # download Sparkle (if necessary) and copy it into the bundle + ORIG = 'deps/frameworks/Sparkle.framework' + SPARKLE = join(APP, 'Contents/Frameworks/Sparkle.framework') + if not exists(ORIG): + os.makedirs(dirname(ORIG), exist_ok=True) + print("Downloading Sparkle.framework") + os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s' % (SPARKLE_URL, dirname(ORIG), basename(ORIG))) + os.makedirs(dirname(SPARKLE), exist_ok=True) + spawn(['ditto', ORIG, SPARKLE]) + + # code-sign the app and embedded frameworks, then verify + def codesign(root, name=None, exec_=False, entitlement=False): + test = [] + if name: + test += ['-name', name] + if exec_: + test += ['-perm', '-u=x'] + + codesign_cmd = ['codesign', '--deep', '--strict', '--timestamp', '-o', 'runtime', '-f', '-v', '-s', 'Developer ID Application'] + if entitlement: + codesign_cmd += ['--entitlements', 'app/PlotDevice.entitlements'] + + if test: + spawn(['find', root, '-type', 'f', *test, '-exec', *codesign_cmd, "{}", ";"]) + else: + spawn([*codesign_cmd, root]) + + PYTHON = join(APP, 'Contents/Frameworks/Python.framework') + codesign('%s/Versions/Current/lib' % PYTHON, name="*.dylib") + codesign('%s/Versions/Current/lib' % PYTHON, name="*.o") + codesign('%s/Versions/Current/lib' % PYTHON, name="*.a") + codesign('%s/Versions/Current/lib' % PYTHON, exec_=True) + codesign('%s/Versions/Current/bin' % PYTHON, exec_=True) + codesign('%s/Versions/Current/bin' % PYTHON, name="python3.*", entitlement=True) + codesign('%s/Versions/Current/Resources/Python.app' % PYTHON, entitlement=True) + codesign(PYTHON) + + codesign('%s/Versions/Current/Updater.app' % SPARKLE) + codesign(SPARKLE) + + codesign(APP, entitlement=True) + spawn(['codesign', '--verify', '--deep', '-vv', APP]) + + # create versioned zipfile of the app & notarize it + spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) + spawn(['xcrun', 'notarytool', 'submit', ZIP, '--keychain-profile', 'AC_NOTARY', '--wait']) + + # staple notarization ticket and regenerate zip + spawn(['xcrun', 'stapler', 'staple', APP]) + spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) + + # write out the release metadata for plotdevice-site to consume/merge + with open('dist/release.json', 'w') as f: + release = dict(zipfile=basename(ZIP), bytes=getsize(ZIP), + version=VERSION, revision=last_commit(), + timestamp=timestamp()) + json.dump(release, f) + + print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) + + +def main(): + # make sure we're at the project root regardless of the cwd + # (this means the various commands don't have to play path games) + os.chdir(ROOT) + + # clear away any finder droppings that may have accumulated + call(['find', '.', '-name', '.DS_Store', '-delete']) + + parser = argparse.ArgumentParser(prog='build.py') + sub = parser.add_subparsers(dest='command', required=True) + + p_dev = sub.add_parser('dev', help='set up virtualenv in deps/local with required dependencies') + p_dev.set_defaults(func=cmd_dev) + + p_clean = sub.add_parser('clean', help='remove build artifacts') + p_clean.add_argument('--dist', action='store_true', help='also remove Python.framework and deps/local') + p_clean.set_defaults(func=cmd_clean) + + p_distclean = sub.add_parser('distclean', help='also remove the embedded Python.framework and deps/local') + p_distclean.set_defaults(func=cmd_distclean) + + p_app = sub.add_parser('app', help='build PlotDevice.app (requires full Xcode install') + p_app.add_argument('--no-cache', action='store_true', help='do not use pip cache when installing dependencies') + p_app.set_defaults(func=cmd_app) + + p_py2app = sub.add_parser('py2app', help='build PlotDevice.app via py2app (requires Xcode command line tools)') + p_py2app.set_defaults(func=cmd_py2app) + + p_dist = sub.add_parser('dist', help='build, code-sign, notarize, and zip the app for release') + p_dist.add_argument('--no-cache', action='store_true', help='do not use pip cache when installing dependencies') + p_dist.set_defaults(func=cmd_dist) + + args = parser.parse_args() + args.func(args) + +if __name__ == '__main__': + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b76c623 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,57 @@ +[build-system] +requires = ["setuptools>=64", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "plotdevice" +dynamic = ["version"] +description = "Create two-dimensional graphics and animations with code" +readme = { file = "README.md", content-type = "text/markdown" } +requires-python = ">=3.8" +license = { text = "MIT" } +authors = [{ name = "Christian Swinehart", email = "drafting@samizdat.co" }] +urls = { Homepage = "https://plotdevice.io/" } +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: MacOS X :: Cocoa", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: End Users/Desktop", + "Operating System :: MacOS :: MacOS X", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Topic :: Artistic Software", + "Topic :: Multimedia :: Graphics", + "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", + "Topic :: Multimedia :: Video", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Software Development :: User Interfaces", + "Topic :: Text Editors :: Integrated Development Environments (IDE)", +] +dependencies = [ + "requests", + "cachecontrol[filecache]", + "pyobjc-core==11.0", + "pyobjc-framework-Quartz==11.0", + "pyobjc-framework-LaunchServices==11.0", + "pyobjc-framework-WebKit==11.0", +] + +[tool.setuptools] +script-files = ["app/plotdevice"] +zip-safe = false + +[tool.setuptools.dynamic] +version = { attr = "plotdevice.__version__" } + +[tool.setuptools.packages.find] +include = ["plotdevice*"] +exclude = ["tests*"] + +[tool.setuptools.package-data] +plotdevice = ["rsrc/*"] diff --git a/setup.py b/setup.py index 61b181a..bee8802 100644 --- a/setup.py +++ b/setup.py @@ -1,573 +1,75 @@ -# encoding:utf-8 +# encoding: utf-8 +"""setup.py for building the mixed C/Objective-C/Swift `_plotdevice` extension -# To install the module & command line tool in site-packages, use: -# python3 setup.py install -# -# In addition to the `install' command, there are a few other variants: -# app: builds ./dist/PlotDevice.app using Xcode -# py2app: builds the application using py2app -# clean: discard anything already built and start fresh -# test: run unit tests and generate the file "details.html" with the test output -# dev: puts the module in a usable state within the source distribution. after running, -# you should be able to run the `python3 -m plotdevice` command line interface. -# If you're having trouble building the app, this can be a good way to sanity -# check your setup -# -# We require some dependencies: -# - Mac OS X 11+ and Xcode command line tools (type `xcode-select --install` in the terminal) -# - the python3.8 provided by Xcode or a homebrew- or pyenv-built python3 interpreter -# - Sparkle.framework (auto-downloaded only for `dist` builds) -# -import os, sys, json, re, platform +This file exists only for the things `pyproject.toml` can't handle, in particular +the prebuild and compilation steps necessary for setuptools to package the module. +You needn't run this script directly, just use one of the ordinary installation +approaches like `pip install .` or `python -m build`. +""" from glob import glob -from shutil import rmtree -from setuptools import setup, find_packages, Command +from subprocess import call +from os.path import dirname, abspath, exists, join, getmtime + +from setuptools import setup from setuptools.extension import Extension -from setuptools.command.build_py import build_py from setuptools.command.build_ext import build_ext -from pkg_resources import DistributionNotFound -from os.path import join, exists, dirname, basename, abspath, getmtime -from subprocess import call, getoutput -import plotdevice - - -## Metadata ## - -# PyPI fields -APP_NAME = 'PlotDevice' -MODULE = APP_NAME.lower() -VERSION = plotdevice.__version__ -AUTHOR = plotdevice.__author__ -AUTHOR_EMAIL = plotdevice.__email__ -LICENSE = plotdevice.__license__ -URL = "https://plotdevice.io/" -CLASSIFIERS = [ - "Development Status :: 5 - Production/Stable", - "Environment :: MacOS X :: Cocoa", - "Intended Audience :: Developers", - "Intended Audience :: Education", - "Intended Audience :: End Users/Desktop", - "Operating System :: MacOS :: MacOS X", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Artistic Software", - "Topic :: Multimedia :: Graphics", - "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", - "Topic :: Multimedia :: Video", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development :: User Interfaces", - "Topic :: Text Editors :: Integrated Development Environments (IDE)", -] -DESCRIPTION = "Create two-dimensional graphics and animations with code" -LONG_DESCRIPTION = """PlotDevice is a Macintosh application used for computational graphic design. It -provides an interactive Python environment where you can create two-dimensional -graphics and output them in a variety of vector, bitmap, and animation formats. -It is meant both as a sketch environment for exploring generative design and as -a general purpose graphics library for use in external Python programs. - -PlotDevice scripts can create images from simple geometric primitives, text, and -external vector or bitmap images. Drawing commands provide a thin abstraction -over macOS's Quartz graphics engine, providing high-quality rendering -of 2D imagery and powerful compositing operations. - -PlotDevice is a fork of NodeBox 1.9.7rc1 with support for modern versions of -Python and Mac OS. - -The new version features: - -* Runs natively on Intel and Apple Silicon and supports retina displays -* Python 3 only (including a bundled 3.10 installation in the app) -* images can now be exported in HEIC format and videos support H.265 (HEVC) -* SVG files can now be drawn to the canvas using the `image()` command (thanks to the magical [SwiftDraw](https://github.com/swhitty/SwiftDraw) library) -* image exports have a configurable `zoom` to create 2x/3x/etc ‘retina’ images -* revamped `var()` command for creating GUIs to modify values via sliders, buttons, toggles, etc. -* updated text editor with multiple tabs, new themes, and additional key-binding modes emulating Sublime Text and VS Code -* the module's command line interface is now accessible through `python3 -m plotdevice` -* the command line tool has a new `--install` option to download [PyPI](https://pypi.org) packages for use within the app -* document autosaving is now user-configurable -* Bugfixes and misc. improvements detailed in the [changelog](https://github.com/plotdevice/plotdevice/blob/main/CHANGES.md) - -Version 0.9.5 added: - -* Python 3 compatible -* Can now be built with system Python or Homebrew versions of the interpreter -* Much faster import times on Yosemite thanks to a bundled copy of PyObjC 3.0.4 -* HTTP is now handled by the ``requests`` module and caches responses locally -* Totally revamped typography system with support for OpenType features, - pagination, multi-column text, character geometry, and more -* Added 130+ unit tests (run them with ``python setup.py test``) plus bugfixes for - for ``measure()``, ``textpath()``, ``Bezier.fit()``, ``read()``, and the Preferences dialog - -Version 0.9.4 added: - -* Enhanced command line interface. -* New text editor with tab completion, syntax color themes, and emacs/vi bindings. -* Video export in H.264 or animated gif formats (with GCD-based i/o). -* Added support for external editors by reloading the source when changed. -* Build system now works with Xcode or ``py2app`` for the application and ``pip`` for the module. -* Virtualenv support (for both installation of the module and running scripts with dependencies). -* External scripts can use ``from plotdevice import *`` to create a drawing environment. -* Simplified bezier & affine transform api using the python ‘with’ statement -* New compositing operations for blend mode, global opacity, and dropshadows -* Simplified typography commands with stylesheet-based character styles -* Now uses the system's Python 2.7 interpreter. - -Requirements: - -* Mac OS X 11+ -* Python 3.6+ -""" - -## Basic Utils ## - -# the sparkle updater framework will be fetched as needed -SPARKLE_VERSION = '2.1.0' -SPARKLE_URL = 'https://github.com/sparkle-project/Sparkle/releases/download/%(v)s/Sparkle-%(v)s.tar.xz' % {'v':SPARKLE_VERSION} - -# helpers for dealing with plists & git (spiritual cousins if ever there were) -import plistlib -def info_plist(pth='app/info.plist'): - info = plistlib.load(open(pth, 'rb')) - # overwrite the xcode placeholder vars - info['CFBundleExecutable'] = info['CFBundleName'] = APP_NAME - return info - -def update_plist(pth, **modifications): - info = plistlib.load(open(pth, 'rb')) - for key, val in modifications.items(): - if val is None: - info.pop(key) - else: - info[key] = val - with open(pth, 'wb') as f: - plistlib.dump(info, f) - -def update_shebang(pth, interpreter): - body = open(pth).readlines()[1:] - body.insert(0,'#!%s\n'%interpreter) - with open(pth, 'w') as f: - f.writelines(body) - -def last_commit(): - commit_count, _, _ = gosub('git log --oneline | wc -l') - return 'r%s' % commit_count.decode('utf-8').strip() - -def gosub(cmd, on_err=True): - """Run a shell command and return the output""" - from subprocess import Popen, PIPE - shell = isinstance(cmd, str) - proc = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=shell) - out, err = proc.communicate() - ret = proc.returncode - if on_err: - msg = '%s:\n' % on_err if isinstance(on_err, str) else '' - if ret != 0: - print(msg + out.decode('utf8') + err.decode('utf8')) - return out, err, ret - -def timestamp(): - from datetime import datetime - return datetime.now().strftime("%a, %d %b %Y %H:%M:%S") - -def stale(dst, src): - if exists(src): - if not exists(dst) or getmtime(dst) < getmtime(src): - yield dst, src - -## Build Commands ## - -class CleanCommand(Command): - description = "wipe out generated files and build artifacts" - user_options = [ - ('dist', None, 'also remove Python.framework and local dependencies'), - ] - - def initialize_options(self): - self.dist = None - - def finalize_options(self): - pass - - def run(self): - paths = [ - 'build', - 'dist', - '*.egg', - '*.egg-info', - '.eggs', - 'MANIFEST.in', - 'PKG', - 'tests/_out', - 'tests/_diff', - 'details.html', - '_plotdevice.*.so', - '**/*.pyc', - '**/__pycache__', - '**/.DS_Store', - ] - - # Add framework paths if --dist flag is used - if self.dist: - paths.extend([ - 'deps/local', - 'deps/frameworks/Python.framework', - 'deps/frameworks/relocatable-python', - ]) - - for path_pattern in paths: - for path in glob(path_pattern, recursive=True): - if exists(path): - print('removing %s'%path) - if os.path.isdir(path): - rmtree(path) - else: - os.unlink(path) - - # Run make clean in svg extensions dir - if exists('deps/extensions/svg'): - os.system('cd deps/extensions/svg && make clean') - -class DistCleanCommand(CleanCommand): - """Alias for `clean --dist` for backward compatibility""" - description = "delete Python.framework, local pypi dependencies, and all generated files" - - def initialize_options(self): - super().initialize_options() - self.dist = True # always do a deep clean - -class LocalDevCommand(Command): - description = "set up environment to allow for running `python -m plotdevice` within the repo" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass - def run(self): - # install pyobjc, requests and the other pypi dependencies in deps/local - import platform - venv_dir = join('deps/local', platform.python_version()) - if not exists(venv_dir): - import venv - venv.create(venv_dir, symlinks=True, with_pip=True) - PIP = '%s/bin/pip3' % venv_dir - call([PIP, 'install', '-q', '--upgrade', 'pip', 'wheel', 'py2app', 'twine']) - call([PIP, '--isolated', 'install', *config['install_requires']]) - - # place the compiled c-extensions in the main repo dir - build_ext = self.distribution.get_command_obj('build_ext') - build_ext.inplace = 1 - self.run_command('build_ext') - - print("\nA local development environment has been set up in %s" % venv_dir) - from setuptools.command.sdist import sdist -class BuildDistCommand(sdist): - def finalize_options(self): - with open('MANIFEST.in','w') as f: - f.write(""" - graft app/Resources - prune app/Resources/en.lproj - prune app/Resources/ui - include app/plotdevice - include deps/extensions/*/*.h - recursive-include deps/extensions/svg *.swift Makefile - include tests/*.py - graft tests/_in - graft examples - include *.md - include *.url - """) - sdist.finalize_options(self) - - def run(self): - # include a compiled nib in the sdist so ibtool (and thus Xcode.app) isn't required to install - for dst, src in stale('app/Resources/viewer.nib', "app/Resources/en.lproj/PlotDeviceScript.xib"): - self.spawn(['/usr/bin/ibtool','--compile', dst, src]) - # make sure we have the sources for SwiftDraw - call('cd deps/extensions/svg && make SwiftDraw', shell=True) +ROOT = dirname(abspath(__file__)) - # build the sdist based on our MANIFEST additions - sdist.run(self) +def stale(dst, src): + return exists(src) and (not exists(dst) or getmtime(dst) < getmtime(src)) - # clean up - rmtree('plotdevice.egg-info') - os.unlink('MANIFEST.in') +class BuildExtCommand(build_ext): + """Build SwiftDraw.o before linking _plotdevice, then populate + plotdevice/rsrc/ with the runtime resources plotdevice.util.rsrc_path() + depends on (icns, colors.json, an ibtool-compiled nib).""" -class BuildCommand(build_py): def run(self): - - # let the real build_py routine do its thing - build_py.run(self) + call('cd deps/extensions/svg && make', shell=True, cwd=ROOT) + build_ext.run(self) # include some ui resources for running a script from the command line - rsrc_dir = '%s/plotdevice/rsrc'%self.build_lib + rsrc_dir = join(ROOT, self.build_lib if not self.inplace else '.', 'plotdevice', 'rsrc') self.mkpath(rsrc_dir) - self.copy_file("app/Resources/PlotDeviceFile.icns", rsrc_dir) - self.copy_file("app/Resources/colors.json", rsrc_dir) + self.copy_file(join(ROOT, 'app/Resources/PlotDeviceFile.icns'), rsrc_dir) + self.copy_file(join(ROOT, 'app/Resources/colors.json'), rsrc_dir) # recompile the command-line UI nib if necessary - xib = 'app/Resources/en.lproj/PlotDeviceScript.xib' - nib = 'app/Resources/viewer.nib' - for dst, src in stale(nib, xib): - self.spawn(['/usr/bin/ibtool','--compile', nib, xib]) + xib = join(ROOT, 'app/Resources/en.lproj/PlotDeviceScript.xib') + nib = join(ROOT, 'app/Resources/viewer.nib') + if stale(nib, xib): + self.spawn(['/usr/bin/ibtool', '--compile', nib, xib]) self.copy_file(nib, rsrc_dir) -class BuildExtCommand(build_ext): - def run(self): - call('cd deps/extensions/svg && make', shell=True) - build_ext.run(self) - -class TestCommand(Command): - description = "Run unit tests" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass - def run(self): - from subprocess import call - test_cmd = [sys.executable, '-m', 'tests'] + sys.argv[2:] - print(" ".join(test_cmd)) - call(test_cmd) - -class BuildAppCommand(Command): - description = "Build PlotDevice.app with xcode" - user_options = [ - ('no-cache', None, 'do not use pip cache when installing dependencies'), - ] - - def initialize_options(self): - self.no_cache = None - - def finalize_options(self): - # make sure the embedded framework exists (and has updated app/python.xcconfig) - print("Set up Python.framework for app build") - env = os.environ.copy() - if self.no_cache: - env['PIP_NO_CACHE_DIR'] = '1' - call('cd deps/frameworks && make', shell=True, env=env) - - def run(self): - self.spawn(['xcodebuild', '-configuration', 'Release']) - rmtree('dist/PlotDevice.app.dSYM') - print("done building PlotDevice.app in ./dist") - -try: - import py2app - from py2app.build_app import py2app as build_py2app - class BuildPy2AppCommand(build_py2app): - description = """Build PlotDevice.app with py2app (then undo some of its questionable layout defaults)""" - def initialize_options(self): - build_py2app.initialize_options(self) - def finalize_options(self): - self.verbose=0 - build_py2app.finalize_options(self) - def run(self): - build_py2app.run(self) - if self.dry_run: - return - - # undo py2app's weird treatment of the config.version value - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, CFBundleShortVersionString=None) - - # place the command line tool in SharedSupport - BIN = join(dirname(self.resdir), 'SharedSupport') - self.mkpath(BIN) - self.copy_file("app/plotdevice", BIN) - - # success! - print("done building PlotDevice.app in ./dist") - -except (DistributionNotFound, ImportError): - # virtualenv doesn't include pyobjc, py2app, etc. in the sys.path for some reason. - # not being able to access py2app isn't a big deal for 'build', 'app', 'dist', or 'clean' - # so only abort the build if the 'py2app' command was given - if 'py2app' in sys.argv: - print("""setup.py: py2app build failed - Couldn't find the py2app module. To set up a virtualenv that contains all the necessary - dependencies in the deps/local directory, call the `dev` command first: - > python3 setup.py dev - > ./deps/local//bin/python3 setup.py py2app""") - sys.exit(1) +class SdistPrepCommand(sdist): + """Make sure an sdist can be installed without needing Xcode/ibtool, and + bundles the SwiftDraw sources for offline/reproducible builds.""" - -## Packaging Commands (really only useful to the maintainer) ## - -class DistCommand(Command): - description = "Create distributable zip of the app and release metadata" - user_options = [] - def initialize_options(self): - pass - def finalize_options(self): - pass def run(self): - APP = 'dist/PlotDevice.app' - ZIP = 'dist/PlotDevice_app-%s.zip' % VERSION - - # run the Xcode build - self.run_command('app') - - # set the bundle version to the current commit number and prime the updater - info_pth = 'dist/PlotDevice.app/Contents/Info.plist' - update_plist(info_pth, - CFBundleVersion = last_commit(), - CFBundleShortVersionString = VERSION, - SUFeedURL = 'https://plotdevice.io/app.xml', - SUEnableSystemProfiling = 'YES' - ) - - # Download Sparkle (if necessary) and copy it into the bundle - ORIG = 'deps/frameworks/Sparkle.framework' - SPARKLE = join(APP,'Contents/Frameworks/Sparkle.framework') - if not exists(ORIG): - self.mkpath(dirname(ORIG)) - print("Downloading Sparkle.framework") - os.system('curl -L -# %s | xz -dc | tar xf - -C %s %s'%(SPARKLE_URL, dirname(ORIG), basename(ORIG))) - self.mkpath(dirname(SPARKLE)) - self.spawn(['ditto', ORIG, SPARKLE]) - - # code-sign the app and embedded frameworks, then verify - def codesign(root, name=None, exec=False, entitlement=False): - test = [] - if name: - test += ['-name', name] - if exec: - test += ['-perm', '-u=x'] - - codesign = ['codesign', '--deep', '--strict', '--timestamp', '-o', 'runtime', '-f', '-v', '-s', 'Developer ID Application'] - if entitlement: - codesign += ['--entitlements', 'app/PlotDevice.entitlements'] - - if test: - self.spawn(['find', root, '-type', 'f', *test, '-exec', *codesign, "{}", ";"]) - else: - self.spawn([*codesign, root]) - - PYTHON = join(APP,'Contents/Frameworks/Python.framework') - codesign('%s/Versions/Current/lib'%PYTHON, name="*.dylib") - codesign('%s/Versions/Current/lib'%PYTHON, name="*.o") - codesign('%s/Versions/Current/lib'%PYTHON, name="*.a") - codesign('%s/Versions/Current/lib'%PYTHON, exec=True) - codesign('%s/Versions/Current/bin'%PYTHON, exec=True) - codesign('%s/Versions/Current/bin'%PYTHON, name="python3.*", entitlement=True) - codesign('%s/Versions/Current/Resources/Python.app'%PYTHON, entitlement=True) - codesign(PYTHON) - - codesign('%s/Versions/Current/Updater.app'%SPARKLE) - codesign(SPARKLE) - - codesign(APP, entitlement=True) - self.spawn(['codesign', '--verify', '--deep', '-vv', APP]) - - # create versioned zipfile of the app & notarize it - self.spawn(['ditto', '-ck', '--keepParent', APP, ZIP]) - self.spawn(['xcrun', 'notarytool', 'submit', ZIP, '--keychain-profile', 'AC_NOTARY', '--wait']) - - # staple notarization ticket and regenerate zip - self.spawn(['xcrun', 'stapler', 'staple', APP]) - self.spawn(['ditto','-ck', '--keepParent', APP, ZIP]) + # include a compiled nib in the sdist so ibtool (and thus Xcode.app) isn't required to install + xib = join(ROOT, 'app/Resources/en.lproj/PlotDeviceScript.xib') + nib = join(ROOT, 'app/Resources/viewer.nib') + if stale(nib, xib): + self.spawn(['/usr/bin/ibtool', '--compile', nib, xib]) - # write out the release metadata for plotdevice-site to consume/merge - with open('dist/release.json','w') as f: - release = dict(zipfile=basename(ZIP), bytes=os.path.getsize(ZIP), - version=VERSION, revision=last_commit(), - timestamp=timestamp()) - json.dump(release, f) + # make sure we have the sources for SwiftDraw + call('cd deps/extensions/svg && make SwiftDraw', shell=True, cwd=ROOT) - print("\nBuilt PlotDevice.app, %s, and release.json in ./dist" % basename(ZIP)) + # build the sdist based on MANIFEST.in + sdist.run(self) -# common config between module and app builds -config = dict( - name = MODULE, - version = VERSION, - description = DESCRIPTION, - long_description = LONG_DESCRIPTION, - long_description_content_type = 'text/markdown', - author = AUTHOR, - author_email = AUTHOR_EMAIL, - url = URL, - license = LICENSE, - classifiers = CLASSIFIERS, - packages = find_packages(exclude=['tests']), - ext_modules = [Extension( +setup( + ext_modules=[Extension( '_plotdevice', - sources = ['deps/extensions/module.m', *glob('deps/extensions/*/*.[cm]')], + sources=['deps/extensions/module.m', *glob('deps/extensions/*/*.[cm]')], extra_objects=['deps/extensions/svg/SwiftDraw.o'], extra_link_args=sum((['-framework', fmwk] for fmwk in ['AppKit', 'Foundation', 'Quartz', 'Security', 'AVFoundation', 'CoreMedia', 'CoreVideo', 'CoreText'] - ), []) + ), []), )], - install_requires = [ - 'requests', - 'cachecontrol[filecache]', - 'pyobjc-core==11.0', - 'pyobjc-framework-Quartz==11.0', - 'pyobjc-framework-LaunchServices==11.0', - 'pyobjc-framework-WebKit==11.0', - ], - scripts = ["app/plotdevice"], - zip_safe=False, cmdclass={ - 'app': BuildAppCommand, - 'build_py': BuildCommand, 'build_ext': BuildExtCommand, - 'clean': CleanCommand, - 'distclean': DistCleanCommand, - 'dist': DistCommand, - 'sdist': BuildDistCommand, - 'test': TestCommand, - 'dev': LocalDevCommand, + 'sdist': SdistPrepCommand, }, ) - -## Run Build ## - -if __name__=='__main__': - # make sure we're at the project root regardless of the cwd - # (this means the various commands don't have to play path games) - os.chdir(dirname(abspath(__file__))) - - # clear away any finder droppings that may have accumulated - call('find . -name .DS_Store -delete', shell=True) - - # py2app-specific config - if 'py2app' in sys.argv: - config.update(dict( - app = [{ - 'script': "app/plotdevice-app.py", - "plist":info_plist(), - }], - data_files = [ - "app/Resources/ui", - "app/Resources/colors.json", - "app/Resources/en.lproj", - "app/Resources/PlotDevice.icns", - "app/Resources/PlotDeviceFile.icns", - "examples", - ], - options = { - "py2app": { - "iconfile": "app/Resources/PlotDevice.icns", - "semi_standalone":True, - "site_packages":True, - "strip":False, - } - }, - cmdclass={ - 'build_py': BuildCommand, - 'py2app': BuildPy2AppCommand, - } - )) - - # include a backport of dataclasses on 3.6 - if sys.version_info < (3,7): - config['install_requires'].append('dataclasses') - - # begin the build process - setup(**config) From 19809d0be44f334c9f99df0ea4532bd1edad7ca2 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 9 Jul 2026 13:05:40 -0400 Subject: [PATCH 02/54] bump minimum python version to 3.9 - pyobjc doesn't ship wheels for 3.8 anyway --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b76c623..a5e6dfe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "plotdevice" dynamic = ["version"] description = "Create two-dimensional graphics and animations with code" readme = { file = "README.md", content-type = "text/markdown" } -requires-python = ">=3.8" +requires-python = ">=3.9" license = { text = "MIT" } authors = [{ name = "Christian Swinehart", email = "drafting@samizdat.co" }] urls = { Homepage = "https://plotdevice.io/" } @@ -19,7 +19,6 @@ classifiers = [ "Intended Audience :: End Users/Desktop", "Operating System :: MacOS :: MacOS X", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", From 3256a87b6d52ba9b8a23416d9638681d3fe7cd92 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 9 Jul 2026 13:05:56 -0400 Subject: [PATCH 03/54] publish wheels containing the native extension --- .github/workflows/publish.yml | 7 ++++++- .github/workflows/release.yml | 5 +++++ pyproject.toml | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bf31674..2d5a4d5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,7 +21,12 @@ jobs: pip3 install . python3 -m tests - - name: Build sdist + - name: Build Wheels + uses: pypa/cibuildwheel@v4 + with: + output-dir: dist + + - name: Build Source Distribution run: | python3 -m build --sdist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2ba8cb8..efe0cb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,6 +75,11 @@ jobs: pip3 install . python3 -m tests + - name: Build Wheels + uses: pypa/cibuildwheel@v4 + with: + output-dir: dist + - name: Build Source Distribution run: | python3 -m build --sdist diff --git a/pyproject.toml b/pyproject.toml index a5e6dfe..1137ffe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,3 +54,10 @@ exclude = ["tests*"] [tool.setuptools.package-data] plotdevice = ["rsrc/*"] + +[tool.cibuildwheel] +build = "cp39-* cp310-* cp311-* cp312-* cp313-*" + +[tool.cibuildwheel.macos] +archs = ["universal2"] +environment = { MACOSX_DEPLOYMENT_TARGET = "11.0" } From 18f985c6f410dd0227a05092bcd4d738051d0bd6 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 9 Jul 2026 13:08:18 -0400 Subject: [PATCH 04/54] reflect test results in exit code - previously they would never interrupt CI, even with a failure --- tests/__main__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/__main__.py b/tests/__main__.py index f303567..0f2d0da 100644 --- a/tests/__main__.py +++ b/tests/__main__.py @@ -14,5 +14,6 @@ tests = suites() verb = 2 if '-v' in sys.argv else 1 -unittest.TextTestRunner(verbosity=verb).run(tests) -report() \ No newline at end of file +result = unittest.TextTestRunner(verbosity=verb).run(tests) +report() +sys.exit(0 if result.wasSuccessful() else 1) From d486a29f1d5abdb4332fca8ec527d6305b301e6d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Thu, 9 Jul 2026 13:09:00 -0400 Subject: [PATCH 05/54] test for presence of pyobjc+extension, not just paths --- tests/module.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/module.py b/tests/module.py index 77a30bb..4f55a64 100644 --- a/tests/module.py +++ b/tests/module.py @@ -1,4 +1,4 @@ -import os +import os, sys import unittest from . import PlotDeviceTestCase, reference from subprocess import check_output, STDOUT @@ -9,7 +9,7 @@ class ModuleTests(PlotDeviceTestCase): def test_pyobjc(self): import objc - self.assertIn(sdist_path, objc.__file__) + self.assertIsNotNone(objc.lookUpClass('Vandercook')) @reference('module/nodebox-compat.png') def test_nodebox_compat(self): @@ -27,10 +27,9 @@ def test_compliance(self): def test_cli(self): self._image = 'module/cli.png' - plod_bin = '%s/app/plotdevice'%sdist_path script = '%s/tests/_in/cli.pv'%sdist_path output = '%s/tests/_out/%s'%(sdist_path, self._image) - check_output([plod_bin, script, '--export', output], stderr=STDOUT, cwd=sdist_path) + check_output([sys.executable, '-m', 'plotdevice', script, '--export', output], stderr=STDOUT, cwd=sdist_path) self.render(save_output=False) @@ -40,4 +39,4 @@ def suite(): suite = TestSuite() suite.addTest(defaultTestLoader.loadTestsFromTestCase(ModuleTests)) - return suite \ No newline at end of file + return suite From cafc691efcc1d0b6545790f3403eff7c6f4cea41 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 10:16:47 -0400 Subject: [PATCH 06/54] fix regex escape --- plotdevice/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/__main__.py b/plotdevice/__main__.py index ed9e1eb..510fe27 100644 --- a/plotdevice/__main__.py +++ b/plotdevice/__main__.py @@ -143,7 +143,7 @@ def main(): # if it's a multiframe pdf, check for a telltale "{n}" to determine whether # it's a `single' doc or a sequence of numbered pdf files - opts.single = bool(ext=='pdf' and not re.search('{\d+}', opts.export) and opts.last and opts.first < opts.last) + opts.single = bool(ext=='pdf' and not re.search(r'{\d+}', opts.export) and opts.last and opts.first < opts.last) if m:= re.search(r'@(\d+)[xX]$', outname): opts.zoom = float(m.group(1)) From 62e9ca22568f90abd5878045f64d8ce6ec70f4ac Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 13:23:00 -0400 Subject: [PATCH 07/54] fix objc.super use in ConsoleScript --- plotdevice/run/console.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index 294d790..f3c4ab1 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -17,6 +17,7 @@ import json import select import signal +from objc import super from math import floor, ceil from os.path import dirname, abspath, exists, join from io import open @@ -122,7 +123,7 @@ class ConsoleScript(ScriptController): def init(self): self._init_state() self._buf = '' # cache the export progress message between stdout writes - return super(ScriptController, self).init() + return super(ConsoleScript, self).init() def setScript_options_(self, path, opts): self.vm.path = path From 665bc579bf7e1d868deb69b0a22e15660f06b8ed Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 13:58:18 -0400 Subject: [PATCH 08/54] fix `ordered()` crash on grobs and silent dotted-path failures --- plotdevice/util/__init__.py | 22 ++++++++++------------ tests/__init__.py | 4 ++-- tests/canvas.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 tests/canvas.py diff --git a/plotdevice/util/__init__.py b/plotdevice/util/__init__.py index 14351df..dee5f49 100644 --- a/plotdevice/util/__init__.py +++ b/plotdevice/util/__init__.py @@ -5,8 +5,9 @@ import json import csv from contextlib import contextmanager -from functools import cmp_to_key +from functools import cmp_to_key, reduce from collections import OrderedDict, defaultdict +from collections.abc import Mapping from os.path import abspath, dirname, exists, join, splitext from random import choice, shuffle @@ -106,18 +107,15 @@ def _key(seq, names): # treat objects without a given key and objects with the key set to None equivalently MISSING = None - # look for dict items by default - getter = lambda obj: tuple(obj.get(n, MISSING) for n in names) + def getter(obj): + # use item lookup if obj is dict-like + if isinstance(obj, Mapping): + return tuple(obj.get(n, MISSING) for n in names) - # walk through the objects and see if any of them lacks the dict fields but has attrs - for obj in seq: - try: - if any(n in obj for n in names): - break # dict fields exist so use the itemgetter - except TypeError: - # for non-dict objects like namedtuples and dataclasses use an attrgetter - if any(hasattr(obj, n) for n in names): - getter = lambda obj: tuple(getattr(obj, n, MISSING) for n in names) + # otherwise check attrs + return tuple( + reduce(lambda o, part: getattr(o, part, MISSING), n.split('.'), obj) for n in names + ) def compare(a, b): default = 0 diff --git a/tests/__init__.py b/tests/__init__.py index a28c5fd..b310a78 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -70,10 +70,10 @@ def render(self, save_output=True): pass def suites(): - from . import typography, primitives, drawing, compositing, geometry, module + from . import typography, primitives, drawing, compositing, geometry, module, canvas suite = unittest.TestSuite() - for mod in (typography, primitives, drawing, compositing, geometry, module): + for mod in (typography, primitives, drawing, compositing, geometry, module, canvas): suite.addTest(mod.suite()) return suite diff --git a/tests/canvas.py b/tests/canvas.py new file mode 100644 index 0000000..82532a9 --- /dev/null +++ b/tests/canvas.py @@ -0,0 +1,32 @@ +# encoding: utf-8 +import unittest +from types import SimpleNamespace +from collections import UserDict +from . import PlotDeviceTestCase +from plotdevice import * + +class CanvasTests(PlotDeviceTestCase): + def test_ordered_by_dotted_attr(self): + size(100, 100) + positions = [80, 20, 50] + for y in positions: + rect(10, y, 10, 10) + + sorted_grobs = ordered(canvas, 'bounds.y') + self.assertEqual([g.bounds.y for g in sorted_grobs], sorted(positions)) + + def test_ordered_by_dict_like_non_dict(self): + items = [UserDict({'y': 80}), UserDict({'y': 20}), UserDict({'y': 50})] + sorted_items = ordered(items, 'y') + self.assertEqual([d['y'] for d in sorted_items], [20, 50, 80]) + + def test_ordered_heterogeneous_items(self): + items = [{'y': 80}, SimpleNamespace(y=20), {'y': 50}] + sorted_items = ordered(items, 'y') + ys = [it['y'] if isinstance(it, dict) else it.y for it in sorted_items] + self.assertEqual(ys, [20, 50, 80]) + +def suite(): + suite = unittest.TestSuite() + suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(CanvasTests)) + return suite From 3f69b4cc3e0abaed6e76ac1522fd8bd1912c5ef5 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 14:18:58 -0400 Subject: [PATCH 09/54] add python 3.14 support by bumping pyobjc to 11.1 --- BUILDING.md | 2 +- deps/frameworks/requirements.txt | 2 +- pyproject.toml | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index f1ca4e0..4e75b02 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -6,7 +6,7 @@ library/app itself), there are a few different ways to build it. ## Requirements - macOS 11+ and Xcode or the Xcode command line tools (`xcode-select --install`) -- A Python 3.8+ interpreter with wheel availability for `pyobjc-core==11.0` +- A Python 3.8+ interpreter with wheel availability for `pyobjc-core==11.1` (i.e. not a brand-new Python release that predates PyObjC’s own support for it) ## Local dev environment diff --git a/deps/frameworks/requirements.txt b/deps/frameworks/requirements.txt index 150f105..ebf4abc 100644 --- a/deps/frameworks/requirements.txt +++ b/deps/frameworks/requirements.txt @@ -2,7 +2,7 @@ xattr cachecontrol[filecache] cffi -pyobjc==11.0 +pyobjc==11.1 py2app requests six \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 1137ffe..5b829ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,10 +35,10 @@ classifiers = [ dependencies = [ "requests", "cachecontrol[filecache]", - "pyobjc-core==11.0", - "pyobjc-framework-Quartz==11.0", - "pyobjc-framework-LaunchServices==11.0", - "pyobjc-framework-WebKit==11.0", + "pyobjc-core==11.1", + "pyobjc-framework-Quartz==11.1", + "pyobjc-framework-LaunchServices==11.1", + "pyobjc-framework-WebKit==11.1", ] [tool.setuptools] @@ -56,7 +56,7 @@ exclude = ["tests*"] plotdevice = ["rsrc/*"] [tool.cibuildwheel] -build = "cp39-* cp310-* cp311-* cp312-* cp313-*" +build = "cp39-* cp310-* cp311-* cp312-* cp313-* cp314-*" [tool.cibuildwheel.macos] archs = ["universal2"] From 3639d4920f473d3d297847c8e1c11b282c66ffbc Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 15:09:14 -0400 Subject: [PATCH 10/54] ignore rsrc files resulting from in-place build --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6da63f0..43cff44 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ dist/ plotdevice.egg-info app/Resources/viewer.nib Manifest.in +plotdevice/rsrc # local development deps/local From dc2ac7fb8a895bdaf58a981cff7a9f2d3def9938 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 15:09:48 -0400 Subject: [PATCH 11/54] generate MANIFEST.in only when needed for sdist --- .gitignore | 2 +- build.py | 1 + setup.py | 19 ++++++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 43cff44..28ab5c4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,8 @@ build/ dist/ plotdevice.egg-info app/Resources/viewer.nib -Manifest.in plotdevice/rsrc +MANIFEST.in # local development deps/local diff --git a/build.py b/build.py index fce1210..c4434bc 100644 --- a/build.py +++ b/build.py @@ -93,6 +93,7 @@ def cmd_clean(args): 'details.html', '_plotdevice.*.so', 'plotdevice/rsrc', + 'MANIFEST.in', '**/*.pyc', '**/__pycache__', '**/.DS_Store', diff --git a/setup.py b/setup.py index bee8802..3f7f36f 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,23 @@ class SdistPrepCommand(sdist): """Make sure an sdist can be installed without needing Xcode/ibtool, and bundles the SwiftDraw sources for offline/reproducible builds.""" + def finalize_options(self): + with open(join(ROOT, 'MANIFEST.in'), 'w') as f: + f.write(""" + graft app/Resources + prune app/Resources/en.lproj + prune app/Resources/ui + include app/plotdevice + include deps/extensions/*/*.h + recursive-include deps/extensions/svg *.swift Makefile + include tests/*.py + graft tests/_in + graft examples + include *.md + include *.url + """) + sdist.finalize_options(self) + def run(self): # include a compiled nib in the sdist so ibtool (and thus Xcode.app) isn't required to install xib = join(ROOT, 'app/Resources/en.lproj/PlotDeviceScript.xib') @@ -56,7 +73,7 @@ def run(self): # make sure we have the sources for SwiftDraw call('cd deps/extensions/svg && make SwiftDraw', shell=True, cwd=ROOT) - # build the sdist based on MANIFEST.in + # build the sdist based on our MANIFEST.in additions sdist.run(self) setup( From cb696af5ce169a2eb416f87aaae71fe8243ce058 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 15:15:59 -0400 Subject: [PATCH 12/54] rename build.py to make.py (to prevent `-m build` shadowing) - also fixes local env detection in cli when run from repo --- .github/workflows/release.yml | 2 +- BUILDING.md | 16 ++++++++-------- build.py => make.py | 10 +++++----- plotdevice/run/__init__.py | 6 +++--- 4 files changed, 17 insertions(+), 17 deletions(-) rename build.py => make.py (98%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index efe0cb5..f1a082d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -48,7 +48,7 @@ jobs: - name: Build & Notarize App run: | - python3 build.py dist + python3 make.py dist - name: Create Draft Release uses: softprops/action-gh-release@v1 diff --git a/BUILDING.md b/BUILDING.md index 4e75b02..3e72098 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -11,7 +11,7 @@ library/app itself), there are a few different ways to build it. ## Local dev environment -`python3 build.py dev` sets up a self-contained virtualenv at `deps/local//` +`python3 make.py dev` sets up a self-contained virtualenv at `deps/local//` and ensures PlotDevice’s dependencies (including its native-code extensions) are installed. Once this environment has been set up you can use `python3 -m plotdevice ` or `app/plotdevice ` to run scripts directly from the repo. @@ -37,26 +37,26 @@ python3 -m build --wheel ## Application builds -The `build.py` script contains utilites for building **PlotDevice.app** (i.e., the full GUI application). +The `make.py` script contains utilites for building **PlotDevice.app** (i.e., the full GUI application). If you have the full Xcode installed on your system, you can build the app (including its own embedded copy of Python) with: ```console -python3 build.py app +python3 make.py app ``` Alternatively (if you only have the Xcode command line tools installed) you can use `py2app`, which can be especially useful for quick, local tests: ```console -python3 build.py py2app +python3 make.py py2app ``` ## CI/Maintainer scripts -The `build.py` script contains other subcommands that are primarily useful for packaging: +The `make.py` script contains other subcommands that are primarily useful for packaging: ```console -python3 build.py clean # remove build artifacts -python3 build.py distclean # also remove the embedded Python.framework and deps/local -python3 build.py dist # build app (codesigned, notarized, and zipped) and update release.json +python3 make.py clean # remove build artifacts +python3 make.py distclean # also remove the embedded Python.framework and deps/local +python3 make.py dist # build app (codesigned, notarized, and zipped) and update release.json ``` Note that `dist` requires a "Developer ID Application" signing identity and a `notarytool` keychain profile diff --git a/build.py b/make.py similarity index 98% rename from build.py rename to make.py index c4434bc..d0da150 100644 --- a/build.py +++ b/make.py @@ -144,11 +144,11 @@ def cmd_py2app(args): try: import py2app except ImportError: - print("""build.py: py2app build failed + print("""make.py: py2app build failed Couldn't find the py2app module. To set up a virtualenv that contains all the necessary dependencies in the deps/local directory, call the `dev` command first: - > python3 build.py dev - > ./deps/local//bin/python3 build.py py2app""") + > python3 make.py dev + > ./deps/local//bin/python3 make.py py2app""") sys.exit(1) from py2app.build_app import py2app as build_py2app @@ -184,7 +184,7 @@ def run(self): from setuptools import setup old_argv = sys.argv try: - sys.argv = ['build.py', 'py2app'] + sys.argv = ['make.py', 'py2app'] setup( name='plotdevice', app=[{ @@ -302,7 +302,7 @@ def main(): # clear away any finder droppings that may have accumulated call(['find', '.', '-name', '.DS_Store', '-delete']) - parser = argparse.ArgumentParser(prog='build.py') + parser = argparse.ArgumentParser(prog='make.py') sub = parser.add_subparsers(dest='command', required=True) p_dev = sub.add_parser('dev', help='set up virtualenv in deps/local with required dependencies') diff --git a/plotdevice/run/__init__.py b/plotdevice/run/__init__.py index 5dc8ec2..8c90326 100644 --- a/plotdevice/run/__init__.py +++ b/plotdevice/run/__init__.py @@ -9,13 +9,13 @@ except ImportError: # detect whether we're being run from the repository and set up a local env if so repo = abspath(join(dirname(__file__), '../..')) - setup_py = '%s/setup.py' % repo - if exists(setup_py): + make_py = '%s/make.py' % repo + if exists(make_py): from platform import python_version from sysconfig import get_config_var local_libs = '%s/deps/local/%s/lib/python%s/site-packages' % (repo, python_version(), get_config_var('py_version_short')) if not exists(local_libs): - call([sys.executable, setup_py, 'dev']) + call([sys.executable, make_py, 'dev']) site.addsitedir(local_libs) from Foundation import * import objc From 46052ee1c41246565ebcf493583f34bf48db210e Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 16:14:55 -0400 Subject: [PATCH 13/54] opt into secure restorable state --- plotdevice/gui/app.py | 3 +++ plotdevice/gui/document.py | 4 ++-- plotdevice/lib/cocoa.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plotdevice/gui/app.py b/plotdevice/gui/app.py index 7d31284..61479d3 100644 --- a/plotdevice/gui/app.py +++ b/plotdevice/gui/app.py @@ -31,6 +31,9 @@ def awakeFromNib(self): except OSError: pass except IOError: pass + def applicationSupportsSecureRestorableState_(self, app): + return True + def applicationDidFinishLaunching_(self, note): mm=NSApp().mainMenu() diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 586dfa9..4cc1bd8 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -91,7 +91,7 @@ def encodeRestorableStateWithCoder_(self, coder): def restoreStateWithCoder_(self, coder): super(PlotDeviceDocument, self).restoreStateWithCoder_(coder) - self.stationery = coder.decodeObjectForKey_("plotdevice:stationery") + self.stationery = coder.decodeObjectOfClass_forKey_(NSString, "plotdevice:stationery") if self.stationery: self.script.setStationery_(self.stationery) @@ -259,7 +259,7 @@ def encodeRestorableStateWithCoder_(self, coder): def restoreStateWithCoder_(self, coder): # restore the splitview positions (if rects were autosaved) - split_frames = coder.decodeObjectForKey_("plotdevice:split_rects") + split_frames = coder.decodeObjectOfClasses_forKey_({NSArray, NSString}, "plotdevice:split_rects") if split_frames: it = self.editorView while it.superview(): diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index bf74f74..7807c51 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -50,8 +50,8 @@ NSWindowBackingLocationVideoMemory, NSWindowController, NSWindowTabbingModeAutomatic, \ NSWindowTabbingModePreferred, NSWorkspace from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, CIVector, Foundation, NO, \ - NSAffineTransform, NSAffineTransformStruct, NSAttributedString, NSAutoreleasePool, NSBundle, \ - NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ + NSAffineTransform, NSAffineTransformStruct, NSArray, NSAttributedString, NSAutoreleasePool, \ + NSBundle, NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ NSFileHandleDataAvailableNotification, NSHeight, NSInsetRect, NSIntersectionRange, \ NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, NSMakeRange, NSMidX, NSMidY, \ NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject, NSOffsetRect, \ From ddab30c4cf25ba09dff862c083b01ee96a3fd0ad Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 16:48:45 -0400 Subject: [PATCH 14/54] update embedded python to 3.14.6 --- app/python.xcconfig | 8 ++++---- deps/frameworks/Makefile | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/python.xcconfig b/app/python.xcconfig index 868ff60..20892d0 100644 --- a/app/python.xcconfig +++ b/app/python.xcconfig @@ -1,7 +1,7 @@ // Generated by deps/frameworks/config.py PYTHON_FRAMEWORK = $(PROJECT_DIR)/deps/frameworks/Python.framework -PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.13/bin/python3 -LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.13/lib/python3.13/config-3.13-darwin -HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.13/include/python3.13 -OTHER_LDFLAGS = $(inherited) -lpython3.13 +PYTHON = $(PYTHON_FRAMEWORK)/Versions/3.14/bin/python3 +LIBRARY_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.14/lib/python3.14/config-3.14-darwin +HEADER_SEARCH_PATHS = $(inherited) $(PYTHON_FRAMEWORK)/Versions/3.14/include/python3.14 +OTHER_LDFLAGS = $(inherited) -lpython3.14 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) PYTHON_BIN="$(PYTHON)" PY3K=1 \ No newline at end of file diff --git a/deps/frameworks/Makefile b/deps/frameworks/Makefile index 788b538..8b4b53c 100644 --- a/deps/frameworks/Makefile +++ b/deps/frameworks/Makefile @@ -1,4 +1,4 @@ -PYTHON_VERSION = 3.13.3 +PYTHON_VERSION = 3.14.6 FRAMEWORK_REPO = https://github.com/gregneagle/relocatable-python.git BUILD_OPTS = --os-version=11 --python-version=$(PYTHON_VERSION) --upgrade-pip --pip-requirements=requirements.txt BIN = ./Python.framework/Versions/Current/bin From f8ca3c8a85cad37f2135de1702be1218f32b49d1 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Fri, 10 Jul 2026 16:49:15 -0400 Subject: [PATCH 15/54] update python version compat --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d12a29a..90250d9 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ of 2D imagery and powerful compositing operations. #### Requirements The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) -and comes bundled with a Python 3.10 distribution. The module can be installed via `pip3` -on Python versions ≥3.6 (including the interpreter from the Xcode +and comes bundled with a Python 3.14 distribution. The module can be installed via `pip3` +on Python versions ≥3.8 (including the interpreter from the Xcode [command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode) and those [installed through Homebrew](https://docs.brew.sh/Homebrew-and-Python)). @@ -100,12 +100,14 @@ the Dock or give you access to the menu bar. To set up and run a script using a Framework build, do something along the lines of: ```console -env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.10.4 -pyenv shell 3.10.4 +env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.14.6 +pyenv shell 3.14.6 pip3 install plotdevice python3 -m plotdevice ``` + + #### Building from source You can also clone the git repository and build PlotDevice as a module or application from scratch. From 7df6d3b96e37146a139c1bb5381dbe87f82acaf6 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 12:21:13 -0400 Subject: [PATCH 16/54] update 1.0.1 docs --- BUILDING.md | 4 +- CHANGES.md | 15 ++++++ README.md | 128 +++++++++++++++++++++++++++++----------------------- 3 files changed, 89 insertions(+), 58 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 3e72098..9e8edba 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -37,7 +37,7 @@ python3 -m build --wheel ## Application builds -The `make.py` script contains utilites for building **PlotDevice.app** (i.e., the full GUI application). +The `make.py` script contains utilities for building **PlotDevice.app** (i.e., the full GUI application). If you have the full Xcode installed on your system, you can build the app (including its own embedded copy of Python) with: ```console @@ -50,7 +50,7 @@ be especially useful for quick, local tests: python3 make.py py2app ``` -## CI/Maintainer scripts +## Miscellany The `make.py` script contains other subcommands that are primarily useful for packaging: ```console diff --git a/CHANGES.md b/CHANGES.md index 4cd9fdb..663fcf9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,18 @@ +PlotDevice 1.0.1 +---------------- + +##### Misc. Improvements +* Upgraded bundled Python to 3.14 in app +* Added precompiled wheels for module installs (supporting Python 3.9–3.14) +* No longer requires Xcode command line tools in order to install +* Added support for running under `uv` + +##### Bugfixes +* `ordered()` now works correctly and no longer causes the `Advanced/Sorting.pv` example to crash +* Command line tool now parses `{4}`-style padded number blocks in exported filenames correctly +* Silenced a console error by fixing `super()` use in command line tool +* Document restoration in app now uses modern 'secure restorable state' + PlotDevice 1.0.0 ----------------- diff --git a/README.md b/README.md index 90250d9..7b78300 100644 --- a/README.md +++ b/README.md @@ -15,62 +15,37 @@ of 2D imagery and powerful compositing operations. The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) and comes bundled with a Python 3.14 distribution. The module can be installed via `pip3` -on Python versions ≥3.8 (including the interpreter from the Xcode +on Python versions ≥3.9 (including the interpreter from the Xcode [command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode) and those [installed through Homebrew](https://docs.brew.sh/Homebrew-and-Python)). -#### Latest changes (July 2022) - -Over the years since the last release, progress in both macOS and Python itself led to quite -a bit of breakage. Some of the highlights of this maintenance release include: - -###### New Features -- Runs natively on Intel and Apple Silicon and supports retina displays -- Python 3 support (including a bundled 3.10 installation in the app) -- images can now be exported in HEIC format and videos support H.265 (HEVC) -- SVG files can now be drawn to the canvas using the `image()` command (thanks to the magical [SwiftDraw](https://github.com/swhitty/SwiftDraw) library) -- image exports have a configurable `zoom` to create 2x/3x/etc ‘retina’ images -- revamped `var()` command for creating GUIs to modify values via sliders, buttons, toggles, etc. -- updated text editor with multiple tabs, new themes, and additional key-binding modes emulating Sublime Text and VS Code -- the module's command line interface is now accessible through `python3 -m plotdevice` -- the command line tool has a new `--install` option to download [PyPI](https://pypi.org) packages for use within the app -- document autosaving is now user-configurable - -###### Bugfixes -- exported images generated on retina machines now have the proper dimensions -- hex colors can now use lowercase letters -- automatic variables like `WIDTH` & `HEIGHT` correctly support the `/` operator -- the Color object's `.blend()` method is working again -- the `read()` command can now handle csv files with spaces in their header row names -- the `translate()` command now incorporates non-pixel grid units set via the `size()` command -- cmyk exports are working reliably for command line `--export` and via the `export(cmyk=True)` method -- arguments defined using the command line tool's `--args` options are now passed to the script's `sys.argv` - -###### Misc. Improvements -- the command line tool can be exited via ctrl-c in addtion to being Quit from the menu bar -- simplified unicode handling (and improved support for normalization of user-provided strings) -- building the module now only requires Xcode command line tools—not a full Xcode.app installation -- the `text()` command will always treat its first argument as content (even if it's not a string) unless a `str`, `xml`, or `src` keyword argument is provided -- the mouse pointer is now visible in full-screen mode (and will auto-hide when inactive) - -###### Unfortunate Casualties -- The NodeBox Libraries (`coreimage`, `colors`, and friends) would require quite a bit of attention to get working properly again. - A first pass can be found in the [`plotdevice-libs` repository](https://github.com/plotdevice/plotdevice-libs) but they're not - ready for prime-time. If you're interested in contributing, this would be a terrific place to start! +#### Latest changes (July 2026) + +Version 1.0.1 adds compatibility for more recent python3 versions and no longer requires +the C & Swift extensions to be built when installing (they're now included in binary wheels). +The build system has been updated to use a declarative `pyproject.toml` scheme, with custom +builds now handled by the `make.py` utility script (see [BUILDING.md](BUILDING.md) for details). + +See the [changelog](CHANGES.md) for details of previous releases. Installation ------------ PlotDevice supports being built as either a full-fledged Cocoa application, or as a standard Python module to be installed into a virtualenv alongside your source files. -In both cases it now includes a command line tool called [`plotdevice`](#running-scripts) allowing you to run -scripts and perform batch exports from the console. +In both cases it now includes a command line tool called [`plotdevice`](#running-scripts) +allowing you to run scripts and perform batch exports from the console. + +*This section provides a high-level overview of how to get a working copy of PlotDevice installed. +If you're interested in doing development work on the library itself, take a look at the full +[build instructions](BUILDING.md).* + #### Application builds The application can be built in Xcode with the `PlotDevice.xcodeproj` project. It can also -be built from the command line by using `python3 setup.py app` (which uses Xcode) or -`python3 setup.py py2app` (which uses setuptools). +be built from the command line by using `python3 make.py app` (which uses Xcode) or +`python3 make.py py2app` (which uses setuptools). The resulting binary will appear in the `dist` subdirectory and can be moved to your Applications folder or any other fixed directory. To install a symlink to the command @@ -83,35 +58,76 @@ Prebuilt application binaries can be downloaded from the [PlotDevice site](https PlotDevice can also be built as a Python module, allowing you to rely on an external editor and launch scripts from the command line (or from a ‘shebang’ line at the top of your -script invoking the `plotdevice` tool). To install the module and command line tool use -`python3 setup.py install` +script invoking the `plotdevice` tool). To install the module and command line tool run +`pip3 install .` from the root of the source repo. Easier still, you can install the module directly from PyPI with a simple `pip3 install plotdevice`. -It's a good idea to install the `wheel` module first since it greatly speeds up installation of the -PyObjC libraries PlotDevice depends on. #### Alternative Python Interpreters -When using [pyenv](https://github.com/pyenv/pyenv) (or compiling Python from source) you have the -option of building the interpreter as a **Framework**. This gives you access to a GUI interface for -running PlotDevice scripts via the `python3 -m plotdevice` command. Non-framework builds support the -command line's `--export` functionality and will open a viewer window, but will not show an icon in -the Dock or give you access to the menu bar. +By default, macOS only includes a `python3` interpreter if you install Xcode (or its command line tools). +There are a few other ways to get a usable Python setup worth considering if you're interested in using +PlotDevice from the command line. A key feature distinguishing the different options is whether they +install Python as a ‘framework’ or ‘stand-alone’: -To set up and run a script using a Framework build, do something along the lines of: +> A **framework** Python installation allows PlotDevice to give you access to a GUI interface for +> running scripts via the `python3 -m plotdevice` command. **Stand-alone** Python is slightly more limited: +> it supports ‘headless’ use (via the command line tool’s [`--export`](#imageanimation-export) option) and can open a window displaying +> your canvas, but it will not show an icon in the Dock or give you access to commands in the menu bar. + +##### Homebrew + +The [Homebrew](https://docs.brew.sh/Homebrew-and-Python) package manager provides a **framework** build via its `python3` package. You can install it and run `plotdevice` with: +```console +brew install python3 +pip3 install plotdevice +python3 -m plotdevice +``` + +##### `pyenv` + +The [pyenv](https://github.com/pyenv/pyenv) version manager lets you easily switch between multiple python versions on the same system. +You can install a new **stand-alone** interpreter by specifying the version number: +```console +pyenv install 3.14.6 +``` + +If you want a **framework** install, you need to pass a custom option via environment variables: ```console env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.14.6 +``` + +Once you've installed Python, you can activate a particular version and get `plotdevice` running with: +```console pyenv shell 3.14.6 pip3 install plotdevice python3 -m plotdevice ``` +##### `uv` + +A newer alternative is [`uv`](https://docs.astral.sh/uv/), which uses its own prebuilt interpreters (but currently does not provide **framework** builds). +If you're okay with the limitations of a **stand-alone** interpreter (see above), `uv` gives you a number of ways to +run PlotDevice. +Run a script without permanently installing `plotdevice`: +```console +uvx --from plotdevice plotdevice +``` -#### Building from source +Install `plotdevice` as a standalone CLI tool: +```console +uv tool install plotdevice +plotdevice +``` -You can also clone the git repository and build PlotDevice as a module or application from scratch. -Consult the [build instructions](https://github.com/plotdevice/plotdevice/discussions/59) for details. +Add `plotdevice` as a dependency in a `uv`-managed project: +```console +uv python install 3.14 +uv init myproject && cd myproject +uv add plotdevice +uv run plotdevice +``` Documentation ------------- From ef7093a16b95123db393a19381d3c1245c46f39b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 12:29:31 -0400 Subject: [PATCH 17/54] bump copyright year --- app/info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/info.plist b/app/info.plist index fc9cea2..70253bc 100644 --- a/app/info.plist +++ b/app/info.plist @@ -72,7 +72,7 @@ LSMinimumSystemVersion 11 NSHumanReadableCopyright - © 2014–22 Samizdat Drafting Co. + © 2014–26 Samizdat Drafting Co. NSMainNibFile MainMenu NSPrincipalClass From 2f58879ff498480213ba59e8076cf180bccdf565 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 12:30:02 -0400 Subject: [PATCH 18/54] fix typos --- CHANGES.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 663fcf9..effee83 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,7 +39,7 @@ PlotDevice 1.0.0 * arguments defined using the command line tool's `--args` options are now passed to the script's `sys.argv` ##### Misc. Improvements -* the command line tool can be exited via ctrl-c in addtion to being Quit from the menu bar +* the command line tool can be exited via ctrl-c in addition to being Quit from the menu bar * simplified unicode handling (and improved support for normalization of user-provided strings) * building the module now only requires Xcode command line tools—not a full Xcode.app installation * the `text()` command will always treat its first argument as content (even if it's not a string) unless a `str`, `xml`, or `src` keyword argument is provided @@ -239,7 +239,7 @@ NodeBox 1.8.3 NodeBox 1.8.2 ------------- -* Direct view is turned of because it broke vector output. +* Direct view is turned off because it broke vector output. * AppleScripting is back. NodeBox 1.8.1 @@ -282,8 +282,8 @@ NodeBox 1.0rc4 * Uses a scene graph internally for speeding things up. All objects now have an inheritFromContext that copies all state out of the context and into the objects. * Added animation. Adding a speed method indicates that the script is an animation. Animation scripts have a setup() method that does initial setup, and a draw() method that is called for each frame. You can use the throttle to change parameters while the animation is running. * Removed document properties and variables. NodeBox doesn't touch the code anymore. -* Added measurements for centimeters, milimeters and inches. Just use 5*cm for 5 centimeters. -* All drawing commands are now methods of the Context object. This makes sure that canvases don't interfere with eachother. NOTE: This will have some problems when drawing from libraries. Most notably, "from DrawingPrimitives import *" doesn't work anymore. However, libraries that do drawing can be imported with ximport("mylibrary") to automatically gain access to the _ctx global that has all drawing methods. +* Added measurements for centimeters, millimeters and inches. Just use 5*cm for 5 centimeters. +* All drawing commands are now methods of the Context object. This makes sure that canvases don't interfere with each other. NOTE: This will have some problems when drawing from libraries. Most notably, "from DrawingPrimitives import *" doesn't work anymore. However, libraries that do drawing can be imported with ximport("mylibrary") to automatically gain access to the _ctx global that has all drawing methods. * BezierPaths are no longer lists internally. They can still be accessed as a sequence, but the returned PathElements are not bound to the path. To manipulate the PathElements, iterate over the sequence, do the changes and use the BezierPath constructor with a list of PathElements as argument. NodeBox 1.0rc3 @@ -319,15 +319,15 @@ Version 1.0rc1 * The BezierPath object got a major overhaul: it now integrates nicely with the state model (using the transformedpath method) and is actually a list containing PathElement objects that contain a command, x and y coordinates and (optionally) control points. * All 'w' and 'h' parameters were changed to 'width' and 'height' (image, strokewidth) * All of the major state change commands return their state: font, fontsize, lineheight, align, colormode, fill, stroke, strokewidth, transform. -* Documentation is user-friendler and inside of the DrawBot application, so that it can be accessed through Apple's Help system. +* Documentation is user-friendlier and inside of the DrawBot application, so that it can be accessed through Apple's Help system. Version 0.9b9 ------------- * ValueLadder now respects type of original value: if the original is an integer, the new value will be an integer as well. * Fixed booleans in variables interface. -* Shift-dragging the value ladder now adds hundreths of a number instead of tenths. +* Shift-dragging the value ladder now adds hundredths of a number instead of tenths. * Fixed an obscure bug when using CMYK color objects to set the fill (they used the infamous "DrawBot-black" because the converted from the RGB system instead of CMYK) -* Turned of line highlighting on error because of bugs in PyDETextView. +* Turned off line highlighting on error because of bugs in PyDETextView. Version 0.9b8 ------------- @@ -360,7 +360,7 @@ Version 0.9b6 * text() command returns the text bounds. (In the same way as textmetrics() would do) * size, width and height property for the Image object. You can use imagewidth() and imageheight() also. * Fixed a bug where outlined text could not be stroked when the fill color was not set. -* The drawing region (DrawBotGraphicsView, a subclass of NSView) is acccessible using the graphicsView variable. This is only intented for hackers and will remain undocumented. +* The drawing region (DrawBotGraphicsView, a subclass of NSView) is accessible using the graphicsView variable. This is only intended for hackers and will remain undocumented. * Added the 'New with code' command which invokes OttoBot. Version 0.9b5 @@ -399,4 +399,4 @@ Version 0.9b1 Version 0.9a1 ------------- -* Just's first public release of DrawBot. \ No newline at end of file +* Just's first public release of DrawBot. From e0e6d5915ee80880235d92b362ca4b6b5b85e367 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 13:16:00 -0400 Subject: [PATCH 19/54] add missing 3.14 classifier --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 5b829ef..aec1937 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Artistic Software", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", From 00d7e2201f42979c4aec2dd48be63222fcfa1156 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 15:18:11 -0400 Subject: [PATCH 20/54] use system fonts in typography tests - allows the test suite to run in CI --- tests/_ref/drawing/pathmatics-contours.png | Bin 13249 -> 11770 bytes tests/_ref/drawing/paths-broken.jpg | Bin 24412 -> 22339 bytes tests/_ref/drawing/paths-transform-post.png | Bin 9643 -> 8646 bytes tests/_ref/drawing/paths-transform-pre.png | Bin 9108 -> 7215 bytes .../typography/typography-advanced-flow.png | Bin 26876 -> 22579 bytes .../typography/typography-advanced-flow3.png | Bin 37828 -> 27330 bytes .../typography-layout-fragments.png | Bin 12329 -> 12103 bytes .../typography/typography-layout-select2.png | Bin 39205 -> 33878 bytes .../typography/typography-layout-words.png | Bin 20087 -> 21666 bytes .../typography/typography-styles-font.png | Bin 15710 -> 12417 bytes .../typography/typography-styles-named.png | Bin 18369 -> 16562 bytes tests/drawing.py | 8 +++---- tests/typography.py | 22 +++++++++--------- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/_ref/drawing/pathmatics-contours.png b/tests/_ref/drawing/pathmatics-contours.png index 75381ff8f5722cac9f4676e4bac1f18462d7f681..5b8ab5081c9fbfd7b8434dd1c16616ddcfb628b1 100644 GIT binary patch literal 11770 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 Qe|lh($ literal 13249 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 diff --git a/tests/_ref/drawing/paths-broken.jpg b/tests/_ref/drawing/paths-broken.jpg index 8e284edec7847befa62b9cb4274fe825a824169f..6e123ee2871aaf5c53d975f1b895a6bb7d7c8161 100644 GIT binary patch literal 22339 zcmbrl2~<;O+b$eLMaD2FCL1rPZTBX7( z!2xlCC?uc=2_b>Bwa5$-luWHMMfR=`cFE4>f9!X@bJqITcfS9u|Ae)Ytgy4QpJzY! zeP8!=UC->BStY@G@2)+&2u4N(!fxh`Z=lfkoYYE2xd_IRj$c`n<{U68d1FxSS;B5bV=RaQOl+F3iBaHTy8UN>dLg?p1 zXSIYa`(qf1jI%L}AC_(M_=2!y`<~#rpU(&$|GZ!Q&s*yr=gR{eLiOB{RMVfw(e3Qn zCW6fZLa5O`V3k%fdqbep3y&#f4&BujOG~6oj2cPfvK4}I6z=cm}6vY zJZG-)ym_C0#wZ2+pD@>Ep6&84x6QXZaNK0YnS~qEuH0U*a{Dv!qJy3As!iYhm~Luj z@344@^BaxU-2#=aQM{ zFJxTG%*xKm&AWQ-r|UP0e!f|J=kC4o`xOr!KB}(a3u^10zo>7PNLyNEzx?`JS9ecu zU;mo{xk|1188=YXFiY1h+zC5!vfF$F|z;HxWFVB&6zvbc&^Fk zaT(1?{ycD-x$~BPIp22M0h8lr>{e_{Td;8ZmD|t6rYkocgcp7HW2c$@Do@pF_R}VBX+9I<(gSScBBou%Fp=` zvt32I?8PB4Keq3rc%ynH*X~vP9aJQld0kjnT$JVci(vWpUjA-cx!1>A58kDQ%@VTy zKxPSsm5*^Vqglcw&UpJQp_3Ni(ysT$yJt+a%h>BjYPpu|4cKy|NX&4KAgjSyef4>eSHM-<71V zJB$M65f&2m{}(Stf5Wo`c>m%lhBZ392aVN}*l%VDOD4(LA{*>HTyYp&rUWu&*;1@} zSkdq+=}b|EALIC4t`n95)ACkje1+`eJQ^Xz^xKZYtdifL*TdtC*bc(Jz$5{N+)p` zJ*OxT&A2~W&$-0fS@8;7q)cHmX*yX+*BjIMyFI)HgMaMP1Qy4?a~#~)*f}v3KzuO# z|9$UgJMmkyglI)R^kNr_wqd?)F;M@bu-gz>JHjDF(eK-YIl2RNyY7 zLVvjb5@k6?c@8V2)EvkRqbsR-^)A=Tm}AY9E$9h#{w%?aS+u+F)TAZU66tcw^4--@ z$CGz&Gp`-%=1rF9ovzmhWk2WF5n%EF4c|A2n`MAYcZMBi2}k2~-5ez^9m zE)N#IbdY-FRESk2CX$2CXWB9-+{*KuECKa^*iHc3KdOx zfKp|+8+u&BAYinvNq4u_AtJ)d_#lWlw7YKwT$js=Qsrl?zK-8~6!vzQy|&N2;C}hM z#<#T>1j4)bj}ce~n1mlRpC!yQo+VU6`i0Qwmq=|YHQ@gsmS?*_0N*JPckk+rnn>PkfDs? zIqKq+eonw`+0R;nnk#v^)P>oXzI_=|!)>|B-08Q~QZ2Ywe=phSN`S+517CE4Xw5S2 zrpB#>Vu)Feu1)R-eak4TQH`{ZZp9B?d8nJ=k=PdBJmi)kYg09bi`l;LdqLC#W^xOi zh(%PylzPLwJWp+q#APL{D^gqfOb6Ey{%SXa#CxCv@Bp&D|bgX9`2JN&%UkEn`pkO()R zX$VO@UvT22ya2xfkEx<1mF6v6Tj8?N;?u>Phok3QEa1|Y$@gP(*W86H>|;KanH+(m zG=a?`xvMHVO}H7eLHe`t)z~`pTG=48NF2EtZcz++rkvgLB6h`w%s#ggH@*2U9{k4W zT|JfKQw1i+s(Uwv>5TKuJ?1#j%;`ppMK} zPUKOR!mTf#u&BrpkkYXuWpB`|*S~g2S|V+cz)J$u6S9j5yK$W`pVrD5oX~k2N?G(X zO7dkc-!;|GPTjV?e|Had?B2Ub`ltx5oOHgx)J`%MVRT`Kry(>L^;S0S+G8Bf98{No zxa7A64m^`&;MexmZ7MVA-%p#@WBo3yZBd)x_XF*WGjnr2?Zg{RR}?Raa$ou^$jME% zV$;gI^A8@*2(ShDpTwOdJf&hR_Mk}jFQS|{O9&Pc%8Zp%?4AQ|W-?3oewLtHJ4@(^ z(j*YrssF1~xNJh&b!jL~zlFJ3AtTvi!5*3S%=f}GT3U+SCD>KH0% zj5EJ@E9ej`$`CFeoBrY`dQmkkCFfiSxpfhqP{}x~zz6R}W@R}- zcf=iH2CDE3#$)DS%Vzn(jlVvQh;f{Mmr=e8`Srn`(}e{AF1heywMarMgsd8tBWINp zg$-XKWEF?QXM&5LkA4u>HE+L>8|%I+3S-|+NUBh5 zOGt@7!?2zoD&ZE+5{&ULMsXidG@GfHMP|Zv@d|T631r3kx|6aL+W~V51dMF<@`gfn zc(A$5hmn<3aPU)eSX)m>(U0LH#h6dZ_^B_Lm7LG zSbt`gAl?g|;0)}bbqW;n3{cgV3XR6<>n^i`VmDX7-MXXbk@I>xcAMkQei@XfyYZfk z?)EzQqHv~NDHF#qCL0+V+U3NTul9J+%rQT>T}pL9zcT(_owqr&IX z<)_n5P;M%TnH1BG2Jfi5%yT`)p9Wip78nXe-_Zx#b&qEW>HlVTxHzED18k|G47bE( z@(<&GBjLMH=r}UiDuQ2NUKMy(Kg9R%Z=%g*`F3LG5k_zwlulWQk`bP|u7G8#3MX5R z4cR^IX*mC6te#JqheY71M$<*uBGTc`HQ+ar*quVZ+MdLb$_6JT*$Rt;qjOf)*IhKH zFJx^%vNI_gSl-CatUF5wD|FHMEO*trnX<2O3-Ub_T2H*W+2zo|M%&E`1e)i4-6Fwx~jU{PFSpXo?ph3EtEP)oq4VfeT z8KM*1LW(O)zl?1?vq<<01Zf_Cxd7^l1E`2MPK7>&2DmKJA7Hl>Gny3xCAvJcL`9Tyb$|1bXbCTk?%l>9z(i>p?K;ic_LKSRp zNOj&lU2heL-ZPA+9}Lg?Ms*I zb<#e}TPYee*3|{Oid}5s&_dRU@-SjL$?Cli_cGfBmyt|74Tlb7(_SJWnfF?#xw!YJ zi)Fed9Bo8S%B1Wy4L8QbE;i_y+vpd@D#d`Pd6ppHG!s$x53L|hU3&y{Q(Q{5VJ~41 zC>B$rIoanf{H~L`77AC4MJ@-cDUSI`1GO|pOKN>`x_LKb>Y~(*+YU`lVTd z3Cm4MU&16SmGH4_6*rsZun@O}SNFFnE|VPm&H(fkn$Fszrp=4-A?GCW7Q{#TG@v!= zHkZFh_OX!*dimjg}?zM0DxHK#bJD>6Ol_RQUHM@!ej+>-S*TJ;Qp8iqWdQN)=M|}gouHK;P$5yL})@bOF&ZM^8 z#&3r|!)_e_5FE~6@@Le&ZI&=n*R+tp0-ybq{yElX3FBP6g*0=Sl~86y(>;TybJ%X| z0q(O|LeqJQJ9Y|$rlv(P2Rfz58Cu_so3aif)MkIWG;#wPtroq}?}WWR^3;s^5wUW^ zyBlfuv9FOH>zK+11@@yf>!6F!@nonXW;!g!7uM=_i*j;)yz#tVMYt7FwzPp7fhx^i`nkT{JW~QNcZq&`Ow4rtuuw(#FqC7g!NK6l$#V0sQbonQ@Dzbh7IoR;)^oF zHu&87SfT%h-IH7&ox#ADx795!hQs%~TNC8?jA&PIQ201I0rwh$18D{00X9Wxj&Qmr#!zS88NVKXygHM~!T571psjL;~S(So_dN=#LFH#vuH28yL zmN1tYy*>BTlkaX!>$i;hT&^oF|5H1zB<=p+M#dhvNL{4$RWdk=+Wv7@{nj8PTit&d z5Kxz-xa<?yChQ1U)WXy zw_%A|*6Weq0^e@8yLb(cn4%h zPE=U4en88AsNQ>unCta8+--rMuQFw`%0msZJqYFz_F^Ve zeBJ`)39_U9;H~dEJuUrw0#C%0k@89KzF9&J-DQ@bEXS9_L$~!mFq6gAW1^=HIZzBe zOGIMXsi>CpVY>MgZBQbGZ1D}OjoI5e5(^F;MV88Mv!?-jz@1%6BR{Jk;H`*0<|^G*p5g<>hg!Z%s=TM%eeA?U$u7{O7`|AEHxiY49VG;`U4l9&{A=Z-9Mak zE=>*LAsr?rdf#K%5d#lWa!BTrkTokH{{UbWL7Jvaimc*D3;oXAFW6_!&EYP@=Wfno zolzTHCD{_$;Y(xkuCWV-8<%H1>(kAjKPi7&oOpE^@!$BmS8z0LO4TpGTR}h9LY~JA z)!lxHR_JN$Hqw0ds(6vLAGPA`uy8Xf(6r~yB)54Fahe*RU1sKEVOH023;wuQTN zaslJxhYWGp$81y?*%?2#~3P9GY0}BL-RD}g=r7D=AiEbq?Rz!^2<|hP36n^?f)E8si z0Ya!0pHq!q*Sij}&Y)tIxqDO#7vA6bh}{h>VXf5MvbEe}lFr_W(u4VE1WawEkow&} zCRFhinWUQUsg@MeF`=`lt|X|3>_=9c4?Yeoq4yLtnKVIw;ZxoLrPyD81Ow14Js$sE zXoaT0-2sTVglED24SH6Tk9nycm$-)p8_HR}M2Y_nU12|KdBuplMU)<@B90%>f5|!p zJ4kQ9_pd8oonMB~C3Gj|S7SA+`Rt`#1aGg2H{@2xQt0=NErn_(nj2|i#Zy-;6^3-o zdUTe6Y}#3${@U3=!mV*HDr_(YB_-tLqrvus$D^|ZTTwhn>=EqWxmHtjn|&4Zej%wv zAIN;2lE}QfqifZ-mPAMFYcvDCs~a%zsK?0zjDuYi7j`GT*2r*^?T>9lHbmNYPHBm{ zi|9JnrU~?<=rWbBVUiA}qEQibD6InjEz$v|ruvZ|$=@=gBG5JsJ)_hf*;nG4K4qD3 zhoI-;rpKc04&Y6sn&8$Vm1sWt<(%p$dG&K(iL&EszGn5^9VLF(9d+v^55Dh>_{F!~LbLN;ttOr)Qo(r@`=bWB`N z%%!Zw6(C|$K^40dE}dC(Qw=$hjL?;;TSZbjy1ilR#f$SR)rW4!&zR&*acnJZUr+1T zQ3g{U{Jg^Uw=&ZGg+_nR67&G;%4FJ?fV?Fb%7ElDs5B!`z=ywWgOp{Ejy6m9j$_zG z+1z1b2j75QSYYW(=Yrv8Egmiv91URO_%+SoltSD zj>U&HPIK_J=;NbZUi930C1ts=qrpy9;N46jVoQx~MpIh>#aHmIsv>dA?LD(ucTfY<%@1>7zZUDlB;d+JDL zLg%^xwrlEzstgd*Zw=QIi3?F`>-<;Xs`ouqQXQDdvQmeqXpugSEvMUKE2A~U1*11+ z6q!kS1%Y+o^CZj?=EN5bIrnKd2pSiT4K3|acPHgLIfrzu<&9UKUO_0r&HVMrOk>o>7LbxpwGl-ta!Ct3NlS*gHLl}>hC2Or)-JeC8t-gJLnwFkfnvl& zO={*1WQ!?ZbT#-_p(Q)hFb5THF8V?DkSiIhiVO8Q(VhpLATISDD1Tma4ixgwNSw;r zrkN$6>!x!=aTE3t=tkl|H7x_Gu`j1e5_~!W)li;7z#0EjLy}YISzK%3n)6|-kPD&= z+!FQG_zNqQFD(!14>kzVlKU(Q;&&$29Zr_e*hcRa{C-)mooq$H*D~9<7PqpqUHpKx<5C`l6>SD zOcwL9C~J|v+xO`s6sI2T3BnAxmDyFS<25KKFv`HzHmZ)*%{l}qh94LMAAS(k3*>A+qS76Z0_*F$_|!S1{A7rj7%!@gov4ff6jM^cjvZZs679aB zR38SqdWfWRLcNmgsWnsXG>uhFS*Ch5Tw8~iRFCrzsyhM?3y#r z%;+d2-pY24y&x+{A{pTwq}ssd%9S$6ma>|4te0g659+QUSsBWF;!^BeM3KXG#R7Xh zEzREh2k9LZfT}>EbNvpSDVKj!b@N2ZlZb8QVQ)r$jXx1*^bo|wa6c>l5oV6y`5JBx z0L-@`SfS$^YJ@g1lrPZShlBB@o-biyk$D6Cq$>z#54slF~U_9nR^ed(-oi}G;YKUQB6_0*V!NHcfCY{ zq>d-cAN;E3I^@qOPG@aK_b3}pq#}EKedItx=m@NDs_*08{S9By9p5A|%;62$&C;;Z&e1X2Y?O%NSFzs%Nr)GxpZ;wxL`kMMh64K3=bN7^}F$39YxvM zEyPr)&IDWZX*Vi@t0!7~ocpu+5Fn#J(;J-2kiY@6n`!QsJiQgF-|J73iU`#2$r*M4 z!jM%)7oRX`n)ViYuE?%oi3j(=Xpv*vbCao9P5VHRF1AR+1LSK$dk)3;S+CHGWr_N$ zC$fi#K=pEFNb4&_sg$L0p>|A8%cmI1LQ!8d9C=e6v3+foHi<}*sHTuVhFt1<{5B4) zc5xOpc6$)~G`J~rXEYK(^z_s0COL(7O6PcsJAOvL*--QKHD7*gG`d6O#2sJ$@9+Fg zqaD8rn0H{&)pw$2yi#(1leRL;u!mP>LSW| zRvZvqzrA0ITVDMT3CqT_?_yt~FX1S0eQ(zD>=ti8l0&UG8_0K@!_W9~%&*5U{7i*d1zEmh zx@r`uUIiCrlx5im8=mEdbWxnq5dUP^Om^1z`)kLLh`Oxr;nx|_Q01sRrJ%#)6&L=x z{f$DI3>tl9QRzm*zZ+uj#FMPqCO80NplBxS#*QVZX$zTGsdm_2Aag6^-fBe_wzY~` z(K_Q%S&mj~T86yPWA~Y~V+b{G^4&>ENCQ}S58`UQ&lPN#7vTR&StOxlQ>`H7U1$*q z%Ck*EK>8}_m$-mm9|&r;V@5X#UAh{+R5eoiTOe?g;)4`M=!NdDJ1Y}5ETdVB;0ur> zZR6zw(X@B#G}0Fo24?l9c{85hh; zME}-1vl3C8hiHb5Y4{oXwxn?$q&m(_KEj8oEuh`O-;^$cE&HVj@e*&l=3*$1&#+*5 z!>2RgiCqXKHzoEV8q`t*z_aHzw|8v|gijui?8S9kKAjlX`{nHWq8 zuFGrR*TpYb-{5!ci9z%BTN^y%6+U;2t*H;wa0tm@@CTO{an<{!r);>eHs$CCBSwM0o8Lm=exZn<3 zObNO@6OMTjolz&1Nq)mlWn+lHUF5T#NoTs=P3m*?F$=p4*HiI{11>+UPnEw{i9clW4{#J0`NJ;sysQ@37GicH9tzen?g zw(xJ*wj#+Fs0ZEI(qym8m)FF7Gf!sz6kWQ9Y~kaBkcGJN?b|WyVRu&I13`H1)Lg#9 zS-;-7bp^FEH1O`n^!|PUV;=jr4T7bt02%#aJvB*B1M(*Xp)fk-ttO%7f|@&B4*?3^ZI;>ekqY1uJ=T zx!J(D(3k+hAH+UcY0BN0sha4*JV&wu%)7#N+v8MrUx&#Dz!n2_nnbFdFx)fN0bJJ2 zNL_3EN5Vx7r-e5kjBhuTz)7dqaGOg+Ib1$bs<=dbR+N+IpWGT2o#P3CDNs(Q-R@@l zqU;H^qLs09Kui#JJ(4`6{jRQ}W}$soLp0(b4j_dwFE&B* zAtje;#a_YgR5fz#X{eaI-9Uj;ZoRx zd-gGF5xV4Y3nNMO0>H-YU5TPRT>z>4vr_x#2dysN}_!XK!slInc_-;uCk!9fx{&3*QWUQ%snqnls&W7Yx@MY*?kvowz;A5=QD;@O0Z{<@P`xF| z=n7~x|MqNY^u1>7{A<8cN~Jzjf~;(Du|;?iD!N9dy@>EyUFOrQ1L03Mb$#St%9n=L6svzRYTd- zF`psU8zcET-0+05migPx`V!qvP7`24#U$eRC%(esD0Ud#3McDsqHV|;*Ps4i%G3!8 zj&Lc9A{sEepRXckIPQ%tI?-@KU2;Bv`qcyDPcLF&T@_o^*C?mRsej3g*A|_uT=% zzjA-rXEWD|RpRWryC$2~{Y3qmR+JFUu=w(i58qjQC?@p(gP{8UI|Q}Lz*}i}hPi_Z z7JwS-gVE$8`Ksx0FxQ7)%uP+eRoePOLtM z##usU&AeN$c^(2&R71&p5>x!u(9-<<$O4nm^8Z-U>!^P&5j_nw6w{g*hESh*1g31< z6_GV71pQiInwm!feqJqE3MhPvF_RPEw1h?$ny+ixH zE0N%<5u(;er5I1y3))O=sAR?@JGzIT;&32u40!nr(PhLY1?tAh7A07cbOk{7je!O} zNR3sTW^%fVQ!lUp(bX47bK_?23m&sOM1l|F+f@E0%JwY3FRLQy@i*k6!tQ35hoO^w3YQs0*;uIit3!o_etY6bAgb>YJY%&UM{s;z!IQjJ3U z`aRqOKp`;w8=(T#eF@-{L<2SIMt$sgNX>2}Ig|fOZEWPSZ!J0KT1BSNGhP8&33U0b51DpSIk)K* zi9-_f(3kjm$7}xRY#=^h*7xg9HXt(bJE)aPT;5+v#-bmgtC;3$*IYkKbu#?1<_>e^ zH-eJDo}>u#!@we_r&_17-|qk40vN76nyf1lfV-2y9-xBRJIPoyTDk%W1wok2t&Z&% zolw{@Z}SyE_~(bFHPBR|Ja5W6xa}wTPn>(KP3WIdfK>SNbBUnkA?3oW^^ZWCqduHm zYJzyR@>Bstp=Uvq?sE@TfVW)`6zHxctJ|}LUpxnlS3$!fb$CL!m})1q!}h_up2eSe zz>Jd4upI1NzC?E*-GCG?NE~zC{`zC{r@aV0ofUB}2HybRe_HP8eC`M08enbuOxt}z z+$7X$vi71n7CVxxepOQ7syk$OJmnkjzA4yncSGWsZ~hc|2np9yhT3<)McQapg4J*D z{{nu?YC#wFB{C){PMDTLS+zc=c@&TcTOjgvqW_tT5iQlW=;TW92jPHq!YUHyt*Jr8usVV zvwO@7V=~;c2X}rOduR-Feo2qzk*O)GK{TH;+yrq!l1C{k#0kE-^PQDgpqiLT<%ebi zzfj4}ZeZrvjUGcb)6I{vywGxG?gVbdENP;#4#O8G+zFd66+}-kyB9 zZ&U@=(W%s&In&rWpj*@#NOfW=wr$reVYs5q7+=W67KY=TK_wSob{CpF)B&s@zU;mW z71$!+?qC>h2`ShK;CbOSk>UX;hJ)n)KdU*+m)ab?gpG`BJ?Y+{^KF?`{k2(DwV zj+OHri!M>znXe9X_PiNMz5+#$0bfXUv;Dg!>bZYBBe?0SS;8uwW*WeJ+-&(Qq4FkD z3e4JMd>_~qaUDoo5isDbBS72QVKO`qBx`(-^w&{n& z2Zvkgt)Vdn`}L&J%s(3)jAr|B1xC{!!hfeM=%1pRF}rnzsHKXuFs5iu_c2(Ji<2=* zhnHc+aLZEl;Gs^SHXIw>>@a`Hou79kCoIfb7xga>*`WZEJ0$jG9Z_+dP!o`GqSLWG zWvHmR{(~0Le;YAex&{_Ls~E#ceeO}{-K4l_pU9f>Z-!#!ne`FjZ^QliiZ-^^h&@+d zy5iGeLIO+BAKj{_V=Q18-hw9SS1MveR;S0Qu{tytq3iyI9Ldh`3sp@FOpAdFaW#@G znIYv(f`i#BkfLlaZjQq4KANv#n8Z;{_`%feNOp!h3sN<%*QyVY|BAG&NvKy|DiPCW^LowjGh}LmbV3Ua@=O}C_o7wF`NA#MSoDpf# zBY0du4M7f9qZxY;UP~g)X3Q}(U1-bnjzBg{hxG$DhRfXU1iuwV<33buk-3U{ndNQ+3jgI9}W^tmWc6?$1fGG?}ip)V?jUAz!_GYJq|^ZAYY zS}h|7HG&CgFi3a#tgTO&EX=!?m85RB9(J+r4WO>3CUomVA@L8w`B=E&62*l{00C$@;O_K@u;@8M24z&15rHq~WPMApW_j z4GHDI#>E|fbwAF@O6&vTGjwe|%X-ExF{e~I0ij-XW zX3!@MY?o`%EkM#(!Dkch|EetE6#57hQg;V2?%Md``i60lY7e%$ zq=~zrs_Mgw_=^eND(S}d^IHl&zBTR#&M-a{#hdXZ58MU)L0$6%9ye?(6)CTE?>qw% zj?9o+wd}@L<#WRoiVq;@M=(4n>DuXeaQV7b2U}mQ`f>U9iQoSA`xD1h3LRvQ zGpuh7SJ-ozt~xNdl4-F1(6Q%f%!|6rgMzU)zAo-6{^*kdMdKm?jjUI zyjv-AfUhd)=2Sk(JhphK<_Q!X@7T*tWv}{%`IWJf2>e2)(LpfVFw6rT#eQ^5|20!{ z3@rzmM<5W-{F!SMYFe%*W5BhEYy8;&H`ib&Yd9YdYnnu+z=x6qf9#u3(Q~0_h6!_8 zD&kk4YCtD zGwal}@pt+l>~Lp;`#o%np(3%}IG%0RDY&&#MNXe&IE;y$A=MgWI~E9sJcC0eE*sHc z6~mUr>X@?JaS#o@i{7xL3nuhgxS5H zR)-dN(ruYzAqedfD;@+GWeXAw3fqpo9clqeI}X>06;6{J`EGQ*LLJCyI8cSTfqJ%M zC(?QoeklucugDZEv*LZ0{MY;nrliks4dk81C|w4URjK@&vW(qN7bvvhh-)j!*)IY9 z?V`dA^K{uzA|9H9e2^+~*$aE#!US~I%~PI6>~Zff>2XK|Y|!M8!q?=vv2{O!1;|Od zc%NQgb@#;i<3H+(4nA?HE!uqbda3CF!WPk7EE#o%Ik?$6{rM64BH3wCA$@^gY(;p)4*&8#j)rW+ zY~R%loHLCf^7n(g`j#3uvzM|vaCgI17X3cE4XSgMy18+QabJ$w;B8PXr{HuVWRB7` zkr}r~`ojb=3AM2JMTBc}sWH%QoK<7yZQExU=r!gJO?&2K3BXjPMuIMZ7RZ4F_*;{H z7Y75NlunYDGBbi;ZaOe;rQ%;8A$7j;VWA@|Y5^+DGGspQ>{8oz{=%ZWv5_kpdKe#q z;?I9{aSMw5{^;@>-`&}A>w)nH>fqJ)mcD8_W_R(Ju+%Mr9B2?Gxb}Kft={ckSvf^| z)35ub!@c4~>A|OBi?FI^6`O+G)~_@3er!EzGz2(`x{C3BeK_-#+BFR~Mej=MU-RJU zeO-RR&J#Io5>q1v!1pFRM(=Mpq;huvbfuWMkXf^>%ac?~19iuNwQ&LJ3%_c4HUjZ^QttdgRwOX_XS8w`d8N4G zi}n?%X-1e;ca>+jJLzZ-E6!-f8*FqG2e57Mccs3l-lUn6#wB4+#BoDatjHV-M=q-S zB@8n(NF2EVxfE8EQzWHYu#D7=V0-22-i8BeQkKt+>sx>ucO+4})zA1zd~sw^l{w8i z&UOSLfQFtXuhB)o=UzTy(px}dS=2-|LrcIW4M`Xb66zP2U&qwD6*C*o*M{A{@({h+ zzrXvV#zJ_a@m<5FHL4f$cXbed{tUTGSAhGTFEnArBGgQ;cO)t9*e_y$P9mh@HkvJw z-?|~VJ?4|puDy=juAH)T3+axof7)}ZVt<&^OW)kGpMJdh1%L-zQ5*d>Y%Y344-km> zfF~)B95vlrC->&Cfzw(%BWM96yO=slh#KzFS^7$ShDy%6-~FX9_smjv zbDxd5ORirhQ1>>NA}dvj7I&M5Akc3K&CvptRLK1rvS!+~_>l4^zv`(xxa4%Au9rnk zdGMxkiXXc9FIvoLKlC6oa(C~E?MTpl*qTDhv zZn^la(FFhV#;Xqeis(CqHQwBbLb{uLw62Q%>qE^T30(`weJjN`wP^lB%!TeS@C(>A z(%B6-MRD;kMHu31I2EaZZ5oc`)A|HC?HhuIpYZ`{}t_$p+)GFej^$m z(0%Du#c(MJEr)r#x;BKU)!{EQYXC2Edg!+vTJo7QXTL~aX#1A7q5bCSbKer%7;|obL;UV8m=p;F6FJ6$XQ(nkar*Y#VaczsRM4=SL_}H zxPyr_EEp`MRuORn&m;0Rqj1PyfXLpQ!VbYCu}?LDSvUUoBh*~A=C+E4uGN4I047?V z{v0IU$F^lHMAP&>Kw2U4MOG+7O0^O?AH`o$Yv|c*a%}PDI>cPIS!9Jfp$P(pF%y^s zNw_a_A`(4&cU0b{XjWXh;j;?&%oop?6bAUW;|mn`m_bdXYLWJc{v>m{*^$w7i>j+O z)QA!ogJkIpPa4l7#JYS5^O`LokXtWLU`{5j3TtMxv~+c+pMNFG52h4&vfbeK73x}FktIABN%AcVnY-47il)F$!0-kJ{)*Sw*(RHEipeI$(tw7t=0a-l3 zZHGbEbW20dyV|C4KC7C}V)z9;#sc6)+0CLkk=VLU775TZgBXuLojjtF}w*kyP_f%lK6qzc=&z4nkQz+PeKcrn}CIWSIt8vXIuU*&>Wbt z0=wADSsuv!>krYWBOOUvk59Uv&>9t>)MMJ>J_Yqmen66&AB)m~*NPGQ;3#wBMDTOM zj4y8X`-XnpGzGxLdEuR>YR&ba0IRj9FKz$*7$;M>#x6h2W4V2^bMx`Fe_aZ%Q+e;7 z4|ZX!qQYNK%viCTMd&8f2#|@x#&1pmorp8AiN+T^eQLNXijH@3a$;^6fAR$M{s43)<*i89US86KEjp-kL#$pr z+*=dp)AvG6ODnFegf_PR>q%XG;q8n5fA&0Hct%=Hb9-9o8L)kQ9^vm-x*vOR!YB#Q zfAZzj=(Ziosfp}w4S;kzv8LZa`A(5um3TDip(utpXyF!jS8VHl`NF;0F9r#WFVE?& z1k69ad)Rma>?t)-(o;pToD7n+&=?roj+Qh*cAgGkYl}$b+~?8YuQtCJm6VXeNVy%~ zw?){Qbjt^S-8D=2y7$ygvZsEK>7o5Tk9nZS7%VIK%cfFu!!6L7psvY<6lW%5FHDti z2F~i9fMRk(vArYVhHNK1(M$q6S#b|Tej?30aPE2gA*U`Z1u0TlHLi=QmNQIZi!&$H z@~+V^!r!jASsDa1mm>5Pd`$%?8*ndTXoGG+hD^U5mF!-S2PVe<*88E+%`>vh=e8}USPf%6{kr!I&<=6z3vFX02_67P*G+YslaB zRnJ-)y!zNXCOV#yn7?#un&a}_g(|+yB$E?3BImN{bJj32$Uy>3rdRwGTvYZo2NI9hRd;J?O0G*`PmEB^6T@vpY`AdiYBMhBU9hhj+ypx^> z0E_dmzbZcYieWpHqbeyXUHnv<21#DyEg+<%f*zlLM%MV&^v#q5y|>ZTxBSWa8Z)24d?ITo@wx z#Dx6(wH@tmE}ReedF#89_=~HlQoaq4RuZt3@hM=Vxv$4E2TqGb7w{t|b<|sk1v49w zHEqrR+f^{Thj-+?+74JaUlm3@icP&-L_27jJC=lxF>?3hq~uGq0Ki_h0sGZFk$atg zBSx_n>8x3Sx1umZ7MlZY>siaH24n32l6w;$9FuV2utc;`+*o7hP8<)dD@4mqPMGwI z39O~?U9iIhmg#>4_T953vu$?e_Pc=D2VR0Np{ZtVvn_c>v}~*& zlb=ViV)dcZl9!uhK{FkgrbOz(xxDsY5C!(d?{Ozt9)oO4Le`~fj*O$Kob-zxLfmdBj#j zMNiygu`43;{(1N5=Clfpg|BN!5IS2MQ&mcjN6dA2N!Y__#9`=a)SiNkXmjI(3Q$Qm zIW+`>l|ubIFN{{qq_Rt5QJS&g5(ie4v?q!X!q)WVny`rDa5u*L<}Af zswd;#%nGWQy7Wwm&5UXK~p3us-RQ1N%M-DU0K|BZWw>TiO zN8qx-^Y!bIW>Yi_3qo}y5}+vs8Y5Qi+)6}8h@DZ!OGXhZOs&Au zIbhTZ?Mab44zXNxn1wr{k!ngN8xKjxM**U~lyFI6N-Pa#h3OV@o{n1)(hMAs0TO)> z#zNFn>Cz|f$h&oui>-y5JOpe@m^+EW_reK~z6on)Sf%pda#rD79>Q1^0G2#gc{Gbx zLup(Q>?ts9DRSr&I8_dK7P=5?&TwV@{lnJTo+pA|T)I;f6n_!jt{6=r8B?|54TfK8 z;Kp*KqXrPo;P@op;4~32tvgspCGbAXEmb`DDH9p^K%1_Rs;}jp=kfjTwUKtRo`p2~ z2c>ywEl!xem8Sx-ubqtPzam1fG$b1HalQ{}FGW6aSr1ufVA5ln*BYGAR~lYM`}CJh z+)Gh^r_1Iwj-pE3O-7vOl6Lr!I?rG=+iqL7py06`k#>h2!{V-0`~^uS4sZyqwq;{( zfAW?I$LFICPR-8riYh&KToa$Ue9U~C`~N55>=3i*Sg7)YCf;C;a8fV?^n0-bc6_($ zm$x5SI|@Ml$&PLbM5K(~)t`;&z-{Y!ct7uqp0bcs?F%+48GZn{ed)m}3B1kYmI158 zf;kHM0Wf*9QnoD=#GL_!{GilM@-?#-ECPFrL%Oc%SF$Gphwq$^lu3t5Zdy*BKeoZ9 zufwO|gU{iwsTV7j%#{lC$Jzh!LGE*krzIlinMpx}tfXStr|51uD;N%aO3UZvHm`dl zlDudb39qiNF4}d9o{(O&{p;MAi$^b_yV2t*!A9P*Ah4(!}Iu;3QE`j#|L>q1Z zNOnk32^O0^Hbm+P$`V3l$`pUJ4<-kWkgndUOHmk8k9$fR=(j>Lx=`%VFS1Jzn)El$ z@5|sV-Z?yvwuI}I#3spFX3p8%twXp2Y62H;HnOMj`-q2`vc0jZf=>577Yesz%hz2z z=I*{FhP$nJsiR}>a%aOXaI1bs9T|X308I6!MS@&@YchnhQxZ%JKKd$IG7ft}x9=His&)eJdjasA%a_ zAAyFpVaw{amW8VecfARO$G{YqNp>2*yGixCm|0EtModY)h`qtb_*5wNU~%Bo*r!bl zaLUqs$U?|lCBI{=R%vuOhpJKfgoXbaZ;3706MVB7#F9lC6mNnrw|uXQ%hK4Jv?*2? zXds$IP2~!&sKvd8lcmgrw(Bt%jEtP2^HoXGaSSM09q@l^%vcAYdNuaeoCRIr{uy<$ za@Z4C*khvXjzRBpN|>De16N|AEDnD8#P|)kg}xk!5jg))o!NPOAV%*JlP&LWYwKPS z73FsEJFZ;5P0d@oHZaMRa&9a#E-3$M36=f?Fj@jB&zL&j5EK_Q9P~2|6BvK5>hbOK zvWce6whK?9GRaor*-y5(N6JjOroipdUM`m zRfpPR6)}pY=C7EFcAS6{+T@lEjn$IMm%8|5+@YuvxVAZOh&+?Q&S3E?s(7FNR>Kx!>JnI@_j@#Rw~S3yANI-VI}HF>f^Pc zW$yy>N3sE<4Y8T9;+IzRpV#?iBAY?4l4`ONmk+clFk)9&f3Dzyt}Lg) zpRVG09D$Jh#k}YPkC;GTw6y@t7(jgGoNBOoc*rJ0)#&Ak`UHZWqFeb@wKGPI+f{&G z%6GtPp=c?4^U$U23#VIwi8x#-h$an|a90RIfllS@kf(3GzQeIP*&;%&Rv$UKG1J;* zLqz71G|+AMdRGuVA~Jv)Y}pHe1@3+wil72SL^%JG7e5ILQ}MtU_rZI=1F(3e$-jc5 zN{A0xK9Ju{oC#1&c0QYkkefrpJXO>;nlnWfq~Q7ObAak=?k9Z|T&d8OH2iAw>Q@W@ zbL2xC)_ju`JGbPoB3F0`gYG3h+%>GX8^mBTIO0Y+0bbc_0|7iFo*95IZfZPO~xY~&@c&TB?kaAYlD~|{rO(?s&&rByJ8di^&G<%O0}e= z5Ze-xU5Yy!t#fX6*rz+vGj?$Hd#LE8l4wqo*c;sF<&8p62GmaAA5mhTkvACgk!8%& z3!JQl;6D61n2a7X;!K{gcGkh6KZh-V7>OywVq}JK1?OK%e|LQm6JqSiynA}c0~b_5 z$9UI`WK<`T&W`NqIs(G@28E0=lny(pSa2tf9c3K`o?=~XJZi|``?$@V2!Pi6AN)hy z$nWGieYi@!7m%J+ANl0ON(KxDfH5kx>wD5ThOS-!$NcNLm}i*6c1;AdC&(&6 zF@2lm%OSX~XfA?{hLF3e!VTofD;V#vANrzPD^iDEXAp30S_EeLg-BV}l}Sjl?4aw|gQ=Q{U@{#!-r*iw(%_2k!G z&(}UN>EQg^nY44j0u>vTZ#M12NjJDacFJ}x>(Jxl?jk_~fHW-(YaY>k!h4S#h%TGT ek4ue84FA?I#)?F=F0jvwTbGGi_#!a+JoZ0D9)-GCM3Ug$hgrH0+0s>4J zALjYMqU~G#wgM;=0HBaRU|y(wz|Y&8xN8q#tKSZvzYb_`+Yud4Qd$H6aq)?#_V{kL zK5#JD8vPbf0yF?MU=;uy2|s-@VDHv_0J8b{cw3)FPFj%vxk>sL?hXLGPTO`_TmN(a z|B<8@e)3czGQeHP*=vqPoDN6i3y6FoIq~Geeh`rjkH#*@N-7KTDP(|%Y`P#v{w=Tk z>zu#kjSKRzxcFnpISXSxc`WYOg3Lwai)WG|5LtN#B4?e6jz~u2K18-XkrWq=$S@)s z#zh=C4FD?I3;Poz!lMxRCq&jhwQr9%B6|XWx_0Eh$VdN0PK+QU;{*V2(#f-@q9dac zt(S!_w_de={W|My5y>Ya5)++v9SM&;a_X41H!1Gqk@&L!@VCwjR{{D9b8C%E^4eAF z*RFM1?Tk$SKeqpP@E>RWXJO&p{(Z)`-G99^l=1KX-1pCG|GAHJ9{|?PAanEcKldHI z2>=b50AM=w&waLc0RVFW0P4H`MIYk@dx=U+Jh{QeB{@0SIXWWTd0|5TvHfpP_{W+5 zUig>iIWIi#A9H8DCF1yzq!WqO3zHg7IzdW0WqtbOk?;s>r~j`J|Bo;HmtpdUfkj=0 zfU@{^K*c}{P(De3 zkPJ|O^FS7m3;Yb+015#nPy##xDuHUC0cZkRfezp`@D6wn3MLqaNm)r-$xz8s$zI7tX`Rw0C4Z%TN})=TN(o9SN*9zaEB&H$U+IZb zy;7^vYo+%}e5FaH8D&6OOW9a?iL#UOI%RKVf^x9(aphCWROKAyeC7MfmCB9Eoyxt+ zeB~+SA1Z1p1}fGnPAVQM+f??egsUW|P*pCe6skN_saN5u^r{F{Koy0mj_P7nN7W6g zeyRslBUO`CvsCj{AE?%;wyVBZ{iG^UQ&Tfmb5L_v+opCRRep_0{TI)q~aJ)zj7U)gP;~)O*xN z)ukGXH0(4sXb?1xX`IzyXq0F)YIJFQ(vWKEX*y_nY3|dE(LAsDi)N)}yXGI7-?X%} zmTIln+N~9>m8SKJ)>ExtwFFu}wDq-DXnSiP(oWL8tX-zvqCKenO-Dz^UT33Duuh`R zWt~Sl9GwvzSl2+;S=UeZm@ZBCmTtXnkM0+Y2F4Dv2@{4%!Q^9VFkP6bMH-9j7kMu_ zvWU9q)}j}S1{Tfe8R)IjBk0BHUDA83_eyU}AFXe%@1uWA|AKz8K1W|?x@FXC#5Yzpwm0@OK4Hu-t~TyB zo-?sD*<=!7l5J9H(ql4fYGJz3G{Q8;w953o>71FhnU7hl*%h+}vybK~<}1v1nlL-ZKq96XPnBN1kT3JJDk&<8=Swm*t!I}Tyg1iQT*ig(}|x-ei~k-ziRuc^i_?k zzOG)eI(+r5)qQJp)@)rvTl0JkV(K<|be3zV_7G%C+O}w(f`B zZ@UkyGhDZ8-KBNEu2)^Zc|C1?)A}D9)^14LP`zQ=!^tDor-NsNXNjlCYpK@} zuX|p6oHgz+?k!a_p->1-LWb4wckz32Rg1&CP=X_hXsc!S%c4gaupQT^8-y=V8yZiRk z?OcCt|GoZ&{=ywAcAVPL7@!oeJ>XivA3N=K#_wz(00ck6HNwYT4!aU|z1*#~d)Mw; zyFc$)wTH5&bFaZ(;@-!5CHpq-W9%E=zifZf{OSdsGV3HiVMD@=1n`vq zsRyS~r$bLaPc%fp)bB~lk}{J7XK-h3oq>}BlWWL&6!j>zjb=l;K>L*DoA&U$=K0w3Z_zwG$s`AyrK zKi`xUMisulwfR=n?ZvmVZ_nO2cBiLkV^Jm3l9|h#yBmG?!#&@7_4n=X=NGFLpDF%a z5?In%x~}xm1M>&D59DR>W&DSG9&#VKKYH|d@nc50Qh8GO_>)6V-c@X=cwXsLd9TX2 zD)%YyH0kNYv%}B&tNp9nYSz_M*4owHt~031sYlhHtp^*T8u-r-KJR|9{Y6`&M`PVf z=a*$oOPX#q8#Oannyd?~d3FkWrsZVIRBL3bsEyb*%sIg66ZZTD~gwPR}sr*l&$ z`&X}Dn_g{r_2Rd6zcsvG`?~&jx8LjDxV@=+yY_8;mwVUqckACZc6)ZSdhk81y<2)a z`uzG{zu)=3yMKTGhk-)_{13-Ij18U`goe%xNr%(^Q2it4anKrt>f<|LMA>1k^QF?%q9!gmcHO~dG zhz_cM-+N)W3mZyFSw&S1t*)V|g`7~g2v9;PD=VoetE#FX=m?dH90yeNRP~pv+N5T% z`v`hzg5m1(SMI6XY<|{iw5J=iU32tQx`w8)iK&^noxQ`d*1E4-zrlNp&sN`U ze%tr%+aDN&z_##X5yvB=qGL`cCY?zppH0cQkeNlln4NR=+Vvax1;5-ZykA^W`k?IL zqsP@XwRQCk&tEjQak%Xroxi^Nt*5u|egD9R!6AWA^yjC~qhsR}(ARI@XC$-mkGTcC zkoWVCDf?gQg-ilUNkv6j1-+mbN-23kaXl5)C9Bl*H|<6rNibNt`n^Xe*$N-!CCoY+ou2pk_N-C6`C1f zh~yYNE!{eSx1@!4DY>^YG8HaxK{(hYn4aQ69zvrpFH;2pOGO77-qkU3*^6*E_)J@X zuEIZ}y64YRc>&5B|WE3o>_>&`Q>-x|i%;Ps>Wh+YK0w|Ftsbd&zOd zF%qH?bp>TN=sPta?83lRJF>dCBNmW5XCAmr{R#Xul2JY`K3jeurh6h~=WWy^9(;l4 z-yc~gYN0*Dw{~3!G@$(+B)KhrBJRv_{gd?4LFU*s$QC$s(sW{j9It#Hq_v6PIrYUy z)kR<2e-fi9zbErX284y}_-qx*F{n!HB3Z_)_it}jkYih{lwQ{LRZQ6#|LNmWgqr)dQ58vN zcA@_57fSYnil_$e#?lq4awa>1geH5mSgnKK2&)+LfJH6CSkcXL15ZUuc-r&8@vdw( zxU1^&h&B9rc-aKqfeumaVQN1|bpS~N7KAp|gE zYt!)fd4OMz{hG%ZW+>hi2nQ7RQ}O_6+J73}w*qk{lujI+mF$w2;?@mi+xD>xWLj{U zNUYzl%1eGkW^izt{YeC!abrD9p=eKk(qyW~_FkvGt3!z+At4=FzuirvrYL@A*3;UU z8FRELEvXL003_tH++?^OF~vq|4ChMjf)^Si8m4CW>};YcErNYfv3ef3;LgFh_1S-f zUba_zOYv}qFSLQ;SU(`M;ad#6tc3*j%nMa3JjcmI<)ob7DqUBGKAykzSkLYvDas&+SSDP;{*cc-2yoK_`Y{V)<0 zwxm~_WZ@NPVHx<&^XNpcSYmwbRlN99z@HaCA6y!_6@Xt#s=;Zx%m(sRXlxRYG^2v? zS)Qu|yy1GO4>%9dJ-r?rjB3=)ERJS_JG+L5dUy6D#@Pg<4-0`>@mHv%MrbLSOOXDagd0y?bdZ_Gpzh^kETvXnCPN7$&B6Eggkw;(R z>AT3*^WQ9y`9fHsI(!;z;EXsz_hs&IsNmr|&_G>E7D@GLvD&Rk#nH(or^vZng-JK! zk{(dj2uZqdFQ*6#F)p}$v}w08fR1OEk_$Li_MoCTx_k_`6qLLSS9^4Sve3EW$V$nE zqHE>R4S@r5XYNIM_BYfgFZyHnwe238pD}k>tEj`gXR}jsVH8CVDwF&IF9%0EPY>A_ zo1``QK^V>%mRH=Ww(5z|)>XVW!t322l>eUR7wYEu>+DCDUv8y&B?|~0E*IFAO%~yh z3BQcX17wFl<1)AQI{GDr1^MMBs39vpe(Hmr_<9PD?lNPE7x%Aznx$y3RQ-7UNBS4j z2vq=G{0_Bo@n{YuT!2*`-y6$vg9vm_?7iX9u71ki%IG3&&%KtF6tQn$V{I)%Q_J$3 zF3L+SO1Xn&OdViWGdc+tlWZNF2DKLt;8sz*!TMZ>i?RSdBa>-L#ZopwLG(n^IxVLa zp~OS)n(Tx+#63NUaGjI?&S&`(ijk3JU+T0>L-YM#Cs?Zya@i-?gEcM8TEcmJ1l~}# zv$wYEGEGlh5drcpAV$-)>Fg0B$+HspH4!YJQv!riOZ(AQmKK!E^+F38xZ+p=;{t_P zHCAK;Uwc4V4QC|t@3f8z*&wLUSSXgk8RF%{mwC!ER(%!gAowv_`^i-0Da{NQl#IKy65=^{@f4D zZTM@g#NmH9@j!p3bemekJWx3!XFdGKGI~J!dID#KIGf++f%F*KBr^1f6@VPLtGmV@ z&I4x;K@GW7^Qa;ZF#Z{2(Xt^j%Z+VGR`!Q**$>GBttsw#S(PK&@0$(^V*SVKc)HO= zPNB-7ByC=-@!B(uU&k72qECI)!A-TH1`%WXuefG~hpHrLu%mQ6yvN0Yk^mP7@L5Hc zO??%$0ZT`@jknLtD(oPgFVj==fEJA3eBn^+$ZF{LgWq12l7reBk3SPS1#S%Q{r>u< z+7JNp=rnK_X0S?#=VCNuKjq8=A`=eHoZ|h0T?0pyQQy&Ouwo~v>p|IGcCTx>m@3@{ zM^;kb;Wen{V`1wdyZZB`6GheqZDE#uRk8y`R=p(I#v#-0xCr(xOzlJ9u6F7x+YR22xnfj|QXWA|CVa44BMakVu|hQd^(D-&957iux9rg^y={DDK1> z)?(AG(DF+5ai#@=6MQ;Kqwi9jKvE|r3-LROM@c17g$>zmj^}6^V^+3(No-v2#&=0? zjvpwg_Eo&?uJfXnoH#kLw!d&BH?e=iD1C-(Sn-7}4AA^x`*fgb{gdGX zv4wWBQwL+}jSIFx0A>X|D2Db+pB*7~Ct0Y?~f( z5HPcFKT#~8q=GyamfUFZxu@=yf2#M+7Y*$08IO-z+%QW>Eu$hhdSnU6yyR&o^jfnY zWaoLB3G*DcLBtHo{*oAl8H8h$#x@4tD;rKrDFyyhbipkEp6X7t%zz*nEsEA(c0~RQ z)%o?x>Yug=FXPoG2)0)}7CpRpx29&1(I(rpWy+rr3}MFmCyVJag0dhJ!3VFDBXA3ryS=+=^#~+plaTWIP`EUV`9_%Hd zOLxMW1MQ91H`G6qy2_Trm9q_nSPn0(8ov6io$Aot6nd9TeJz~jFmz+{u^Kp|*f70r z#5%f6;6&vw#Pf&~sA`!WtZD0k-TB0}c|cv}`mV~Ex3`~8PvkNVLV*oyJU+q&9SVn+ zu~i1-$@aoaJ+BkW$qgMFI$j7v!zQ9DXS@Qxe2%s|iOIpo5LBai)wB+hs)EPVelw8i zY8lxP2Ed!739yUrohg|fcFZftYYeW zj(iJ$1aF-V`1Ozc7^v79?I)nY_Dq?Z%tnX+W*+OaFXHX*Mc zN3*Nr3;2u+M2+69{x3raMo~1~x|io(wLq5}5)x4Yb{%%=mIGoZAG{@n&_Jh7@@BYK z8cpqUCn_~*K?Wl2;GM;!`wm;@X94)os!6AHF3jq~Vu&89V z5q-YypbY((k_@$H-8j8+E{6P47{onW3b`7;i%lS#wDg3o%{YqsMiBc5J(wS~DX!1^ z@%(b)VwvSbSs>&!O7~O-rII|@2JDo)0B=kMtL987)0X_Cj_xtR)-c7{(#@e*UFrbQs>z1W%qU## zlsC#@f4Dy?3~Eaa7kzsk9X~_Lp&7Z!VKckopW7C&svV2s#S~%t<3ukv z1Xh#+iTG+_=UH~N%b-*+547J2;=JZ}nZ>LkXS5LwWoiwPyRaCXt85h%_yT+_B63GECZF;#%7M#c)TQ!Y?Amu8BOMJ}%5;w<2B z2rns+v#HJ$75OdPPvdM$&v2<5C3e6`u{f5hC(pxSWtMON-3#&}+=V`Mn zseM%CT8-JIIBQTwM1~vn#>dXoKfB3W>OI*j2=qUb9(bn=_{O`)tD}nxq$?=+e#Ht! z4^0_i0~k42wWj3{=7HEro(T@1_L>K^-HH1?<^1|Q$do+lZPEfoJI)Cqd&UW7U43&x zdDtKA4~Fl*jr-ILi10^M=eb|%OF7tk*u1h1{N@if&P| z=&!R6#_;KF{+8#q_v4n5TN9gu_7$ZPI7Mn;V5X3Eabzu+oH_F|W<{<1IxW`4w5^fX z-UTnmbkcOmkH^fuc&?H>4y;6Vxn|Kr+}9g2YI(C z411_c!xV386hp-7<5$2M0X+jBrLHiVknoJAWy+@!OWEG{1ZTxbsEE~zN-ijLWFqMvCI}cCJqX_sk+Km6tqHP7OLdd(q;^rY<&SXc@F<_1 zw{NIb80zILa}>Tluv_L0_6pZ#c%}?+7`av&O&=G};V&yp;hs((s48RT)_U=mTJgE9 zH8<@wK0BsS+(g)+f{rjGZll3x`|gM#=?oB*fEFT)=Pb zI3*;_q+o;u-LR;kk@FP?WM{f(@EEdxNVm)P)R2I_@Ltk)X~pWV%SzLft3j;Hz`eCF zIo%U0K$65d2eB0Dpy|Tl-tVUEA)>fbx&>bA6c*>WqptcnGlZ6obA^4+ii}?5+h3g! zb*_O6cD?^SE0sFEuQ~tR&5d3Ln~+h4|3#5n?&J}#NxWbU1alY$TlTY7!;knnSdqi! zxZ6L6ZSzckj$_Tq^~)n70t@%`2l@?q?|9o{4hYz>L>(C6X^rsw{JEga?-*UO2d9xH z{!#UNV|+$wbdgo}iF>&U4Usg}%r3+Wr{!T0CCc%9d9izs>+413Eo#K6R>3fS*hGj> z4(S<`&Am(eJ<+AFE8%d31|-Nk-gjtRu?XI@`p_74iTrV`)UkF|h-|C;QGvLCwFp|> z)>uYoA5Y*r8Eh}`VZn4LkP`xo$nPN@qU#a{x;!9Z%IVbAQTUpHPKH6AOY1yfCG!x` zwAh#NkyS(37CPYt`1Xd#B?qgUINDP;u2@G=ukPF1&Qq5q^BE>&h!^gCXS%TzO;I7n}!TKBr@?B!BD;0(xs+khm}@1X{v(fgtbh#(5$hWczt zE^>l8Y9b=a4wS52o2{0???S`0o!v4$aI|%Z%HUTiki|!A1uG`xdw9N4_tOml#&(x#~}AS{IP)8j>euX zHX-wX3C!ezWCna;<#1- zPL@zWLI>kKwhk>$28j|=c}^lbi-z%3Emr)FufeueuSc|DCon`1Fx&3$ zw71PTg<{TVXAC*E2h%$+L&+jakOXH^-;?M>3hPOFgXC`rc?>hSyK&X18El6UVjLG0 zzq55I1gYOg>N~^@&I8e6cfr;x4`tqPgVZBf@pdheVYyD5QCz|IH#({yB@W*`x3()g z3=b7#C~U_Rmi2vZUGyO$H#J09pDFSR-(CyqzN85mIp^ zQ+UC=f!-8Q98F#FE-7SB$MD|ny7FaiPAPA9$XHn27gHdITpU7Q)5m z@@gC|P?Y%$!*QNQV#u8}T%w80Kb22p5UuuZ1i3g{5KnhXa@=MQMdl^G)DZN{JjH|} zE5V3JF_PEN;-^s)cq5!6<=FdpswK69>JCLRSkB~1!Xh}g9k&7UsS+DS3tblZlzbQ- z57Pv_GT&c5e|LOCWCm_AOl(8;DCqa1<^maahkYVGZ%56&+=xXA6?@_|D3J(aFp=jp znFv3|aukc?MV0tS?2w5NBaRhSnM@j6Ed~p+Xpz(Bc~-Pz%)B6DE8BsY?6^dKCuJd~ zy$U6BfTM+zaUr{&)%M}6$S*sfH!J(WKZ1WpNiIJ^?(GQDCA#+@#};07m$(cHk(_-O z_qIYv8uD(%tGNc?1(I6=|5Md5MeZPvGY?!W!h=}xawxZTD1v_HiG4F@!gp^EA?iid z_rw(GB573qTmQS7cyn2}plYa0k}J=qYRJ|Pxbn;>?mZUXh~;I;_CQvdNmj)I>2&4@ zy7py_{JN8|LeK6cHiw8!YQ_k=&XdB=+PqIB43>AsVhb)t0v0^=iUHB6SRmajBlV@R zK++VWc%1!gw)McD_WtW|HZW&1Na|n=m35|^VvQYt&dxXp8-QncyYlp>z5A$!GXL&- zFQPm*Jsy6C9z$s2O+1+eL&AsY$Q1bZB`u%Ix_K7NXvcy(TryHFKT-~h4tCCdB(tV> zFl(_nQ}-_YD97X~exe-iR#=gT{xB-ojjzFHz1Op;&5HdQvk5*o52$>9&su``>%vYX zkTeM0#dgq@CXbTgSaTQ7bT-=rr$&8)q!BaAYR8r|_u}*@PH>!vsPQqTtz+D>0;w_` z?Q1#<(RRO-?tBy>#G=QOL9&N0FwH)aN9*zywEv3USXmbUW@zaV59Hb;R4J2}LQ z%tduuAvBj{Bm>|Aklji%P#DwNTA>}k7Sb3Hcz>|WVPco^hKlHqV6DVJu{wAs@GS(MtGsH<;O^S;zn zOa}K?og)>)v29^`VE+x(kryJ&VlszoGL)RvWX9)V4op}rfr!~jUhbQ_SGu@4PM$jp z;7w`#U+|!RfP>@=1Bp`g4q{q4T-HIfqGDz1-&5Sct(eOSTX5uMs?<(q)#nsnXbfM8ODE>i z+!nFJ`2qncEwYyq2N^2!CAA`#rrXww9W3&Fx0632q&9tri!Ol!b;z_Sr`jS2t>>9baVyLg(FU(qdCiu<%J){q){CZ%;d)U zX+&l#zrfO=Xv^<@f_-VAqp*vM$>!B2i=E26V;wrX%qNj(%tFiJK!;9DHeP#W5=k8{ zYt4q3BA3gGweU;s9=NLgvyOw{Mt_rH)w^1vA(Cfr0rU9ipofaLNFbR9B8kH;3XPY1 zY#LTuwj3OBQf^_^N7M;GNl|VU!iDP41X}PBhfB5)Df`RNWV@AXpQks3U}Hg0j%SFF zWD+ws!WJ@2IdMXQ-UPzoJD2v^1M=f{F|96eAk7lDT*1Lxuv8UYVT-`BOS1hXh;j#6 z8^T5w2;n1OP)4tSg-}1Lt04!mpRmG%Tlhzy`P(wg1ve*qL6b$*5SixFFZ0D_BsFiv zYeuEym&ZPcu1-s7NK$| z!qV_MNOs;xR8_bsx_O9vgoM~MA9L9g4|a7j&G95vIQkJ%eQ~RhE0_Y8EGuU@ofao| z5bZ3BeK5Xva3Y0y(GK=b5XHH-HKtxJyZ1*Z8Q~!PE|Ck`ekF1XccE`n)=mRAbP|U=gzkClV=jaC-#A27wqVV3D4BtCmnApBH>3x~SvK&c{zgS{DP<*W zCcvu6JiyWOD;3M(njOy&vL{Fo$$806SEzO;`mb}M8o;_!%HM%KTmLgSh zyf#jg?7|ImgWW4+G}xnpq5iRt)0)_$>NIP-~7*jw2W!Wif`oW%F~YlSeb(z2HSXyE?tn-}vp$DCNl% zL?wmB{;#ywb@-z%mvDpeQ{TWzPXA-|r5;$Fv8Q9kdd}|*Z3BZ(=q-Jy{`mYpRbZDA zMSmW+o2n?*27mSrK@Un594*NLi z64J||CbI$wnXb2TWONcCm<5Ig(CgQrlLSh);lN~)kwcZ8zd&yfEkkT|O7PEq7OTooxt{A(r44tec% z+AF3>M~>Vb9MAV~l{#*Fr#!6*$dKddM1~mu0b$$qj&VjPXQ5FsO6ni>aj}^*Px7<; z9@5DX_w;ze>rK(c_TUAFD(DJn>;0n%9Q{(QVV;5q^7GTz&-m z+GunNp`TPfLtD}gtFii6t7)zN6gSrr-OBzj?cSr#gU7dp?-1v01PH?fg@3Y4e^k+f zs+b2Rn`xxS3xzz)TL!!$zad<}9Mr|?$0SUg8fRhU6*T_sp^~)QMV1zG1=6EaD4k4R~;D7Hz}xTC0VOsrUv-+ddCG<+bE_a5tbYH93G)EsB-he=@csy)p?EG)o>F#a%slw!*7m$8lF1C z)H>lJE`^JwE1dc|(LwTCbdPCh;(CE<#9qYgnx&u+3SGr7F} z`0m7D)8p4|ccLcQN-RB?#K*MaFW{AAi!(hPkUB-dd8!Hd^eL4q--#$Vd}cX(7YAEAo94j9^Cu=&CXwy zTWErenL)g0Qt}Nk@3hbqghv&?2}h7Rh0L_~%skL?M!F0A8?!ocN)DB^VZnXVL+1`c zqgNFsj{CP3;! zS^6BR%PY(F42=`$1aaq%-&t(6_+_7)e+Y;fY6N79ks)k{9fZ?4?3gZi1zl_-axo@P z^z!dh2Wg9G$EyY#1e75*_l>eZ-bd5Mts*1p*J6;eyyZNQ%@iPznIIzMTG`Y2k{b}7 z0H(6DT`RQs#>IkjPEq5H`A-{vLH|KB!hdq0J#&}eWXcQ?mLQNPGoUW?_9!D$AnBb4 zu6{(;)(fOupB77-nSG6J_nSw*4$loDmD+1Zrzmb1*GFFp{i!+$N=E;&ZA=MLn{Qy}Cg zXo07TjikN^(A&Cm$e%A%(x^_f35SPB zHia z{kc{qwa;n_{07|AXD(a|PWP9a)#+>)8QA~gWv(9!kOzPR^zUp9^68CWC7mP*FyU;l zzafxY4Oq)>`FEc<+?yz+q}~0oHve7c&yRISfboqMiKrjr$gJ19uf;xNW_aoj7#CLF z0AqzT@p37iOlS}M$v-w$)TN^6V%IX;nHg3X=xeb5X|mHNh(T|{luZ`g@BcEny-4w8 zVtVt77w;-v2mb^bK!3%aZ2?FSb2Ihfa7s>L! zL*D|?pZ@a?swVPvj@mn-59(ADT$sUL%-GcN7+#75!8*5a%Q8rfSb3yrp z@rJM)(K?rzk;rqj1N(pW(GIV+Hbj+g#1>#df{w4yeM)phz=Z8do#zNTJhDh~RDN5b zM*#gr4(V|&wKTM%hY2(}7LOA(XRxLXnMrqI!}^=_AfkYmS9>lLD>Au&RKF6{#Z5_I zXGf7aWGGR1vOspmM*QwEWeBk%y(EapZDh)f+=cEPAs<8bLoT@pXsqPbA>AVs?8C`m z+d`w?X{tDlgGj|m0}S8tG%dYj!yqg94!y2T{o)mKDbVoyB2lMc($pG=$G}mQOOfVzY;eBGW6Mc#! zls2b~9`c3tgxhAY>DJhXDLX4lV}}B7RgR?;F)N}9`r!DDlrO^EqQx=?zsySL@Seh;j3)0mK0c49 z(-cr53zgqyE&C(*HJPbHT}NK+C=z&)cGor>YwVMm2`!ww55ngl0_UW^7P(V^za&c# zpbJ$7c0fRk;x~4!U4hsMJm&{}AF*l#9T={uA%_qOfGId$mSps~0n8OercE<9!8brr z(DUr@kWcUGV7uqw=*6R1PWTR%W}oLOQL}o0VA?R+WN#WdNIZhcZQ6u1Sn8M+VlLqu z+}lD)hw2VhSJBxKJT2K~c}+2^c_ZylODsYk)0Cojbp0~Cum5}QL8Hufdr)(#8?g@5 zA$IM+Mf|a@v@lz^hTk1|s-v>dYIWysbD zrECDFuB2;K$nFIAIZG<(~Ht5C=jpEJS`-}!7h6Sm{Jd+OGdn#^z^gKswq2o==Lve<>dN5(hyb$k8KM7CW}D4M=rIm@KY@tni04lZURBww25H7y~7T`idO6qNirRRb>G_PiO^ zyF0d_ET>5$8PcB=qT8`L!Lp$DGNLfRrh{f!<+-Ucw#egoKg$tj1VE$N1MO7T7uR+{ z^)+$AxL}Xh<42mW{)AD7AI$^HJ>=Q!DWs)~f1fv3k9^(wj+#UL)sI=vl;uyuc3lV~ zjs(Pk6a{bJ--mcL2#I@vE(4j1~IZWZY(S(f_*~k`;8%!JHFYnhmh>bw8-Lpcz-$q#!Cg#;CO64{rl1rz!2&*>OUuNYvg7a< zS7FxpHVja)(lHF>zb(B(YKo)TW0_h&{cTe)@;uS?GQ=)zi0 z-V?GB)AJhun@DQlK~XA=dj|WAHpQv9MHnIqJLvZYvuh z?Ajk6tf*)rJ>-y{Ahq&1Fs!7)or}-OXAjkk&*F7)Rx-l-+Mh5LEIrB!5Z}_3$-}U8 zDQ?{Zn?MW)s~&|@2lH=?`X#y5XA3@V&{_Mcid5#5^k^b^RjZ^qB(V8voOfW~=*zx3 zjnU@DqDbHehF>5n*(;evtkOlQMH|D{A(&vH7J~3Y^T4O&^8ku1MjB`8suZ=vsl9*I z!oLy486ZALUd%qu$mO9aYbp=G;T^1HU|%v%*OTx#TQSLOrqvfSdr+Lqd~dQW_*F#H??bjokAW99)3MUTRAz;&|OViz0&eG{a9WM|={ zh=Z>?f{YVn+h8YAU0(k=r|m-{K^fc;C1l|ylp`!`ouI7G69omeVIqVy^rU-z&&N&2 zP%{w#^&EAGt}rTVpZ*XlxqDGw*d-VhV=z;*ki#wkTDAf|?7p)B_KGeGNN8!Oy(VGS z%WupKzp{6VmC$t8-Q44?`tc$91J;!4OjhQ*ASvo%SvXu;CT8_X+Ghl`-%_2RB19F0;QQs8A|m?m9ISqYi6S7p1W-8{AryJ%BRaG8}F2|VCyx9 z+E7B~Go&r{B5u)BI2-yVNvrSW%MpG!`eURI#Ax?&@b6pNpGdo)z<{4J`|p4>$w`n^ zr{o(~j#OpJvg*9H@&X6MOS4{g@Qh@8A%f87PF-eI-o4(H8`oq0T}FyftpCfVdz}2L z>kX^ryKOITiTd-hkM32Q^vcVZG#fWueey*8@HXp=jo6zsU5ZT^6(NgjM>&i%BIbnX z9s3w&Xhpo72asMKUPo1?0t-Ka9JU}` zH9iqYd7iZaJ|dg}^YSV)Amd?g@K^MBGeC`^AVBic8hLTz^e}b@g1hBRmd6N!gdD_m zNKRgcuvAcUS%v~d?f=@&H9j+9_Pnu|ik7AHhahZgW@7_~XgN7sPc?&;lSk812;x_K z=EbgJijMp~ZV`FSKKK@7AlU@JrLHY&V_^Kse1uiGG~Jo1%y~ecsx3PVr}7{4lM+7~ zlP(&_Ho&EoWR8G!vpgmRcSnf7$kGOxnRVDjWZI4aQeEy(nES}1&%%CEUm3oa>L4?L zSl2{M^n}63=x?D1%*06q44e`0^QKC&cL&nrdank;q&Fo9Zhf4K%xN+ZHm~u82w84X zkv%gX?c3(e4)4N*-o<3n;u&3L6dG6{>+YNIe%ig#~hUy~NUN()!=ti9On&5indmGE%r zz`gojstN4E8Ce5Wi$Q%Qa2J{v8zS3yN^EhmiP%UqorkYoAPEhz*{rql z0#AdL=GdthBHsC*d7=2rvPSkadkH;CvQlW;6Orc2*)r%a-85+om zmwAEL+Ji^ibX=7`VPN-MkvkoMbDFePpLrl|viw$@uW(e1l~Tw>SgXb;^UNEgX-x*; zYyM~(0VC6gby9`ra!qU5W&|*@W$xPewU`l$_ilI8Lgc4+_0%lq#HMP7^i1fqe~>P!<`oAVSe2PAX=%FkhCrFbD-UW`P3JmSp7mVY-kA?r@n1=2k)z-O{+s#gyUXlzj-K1^(AJ3jb+e=-73C@jBQs=6 zEV^fMtF)2Wl>v5j5Y0ZYZ=~`ugN&^ZLwp1>Zad{}$0|j3lyPWAvLmHkD}II^l-(bS z&$}?VNbxldhfo^nH>fnM55|>0}(*j~V#B&M73M@5>C5_>+4(tnA-A%QlG!7jd4@)>7M{s$9>rBBnu% zIWxN{R2Ua{wyG{Qc6Z~8D_7STt^z1bNJ~-+HFS_n;9Nd>${<$Ig@wOudhd+%L69VO zAk~r~B*A|pUCkS2-*_?}ocX2T;drO0tg~Xdduc%n37FjND`?&^?2p`osqH%c{T4w# zEfphmqyEl9$$x1wc?6$pYe<>Rl|_gGQbs#?rqtE2R9knO{P4bI~bHSz~ zKeZr%Xpu|1OD?t=VX`yX#)`#%sC$O;dFGTu@^YLO#k1GVaxpHgAQV!y3L(W@i%5i!pa@|#tyZaUA>smBS;}4@ zB#^LNFSTJuppZ zvQyVOU9qc30@xk^lakpatNJ3k+*3%cG3I)=L#2?Z zlnLfw$eC&qiTC9tLK!^A!ObAUcWQ|031+m_C~nSaf={$nVIiOey(QVv>s6ir8;M^4 z*Syk#Q*aRVtz=cjk!*^+Z&3C>!qUT#ws#LJqtkdnyb%y<^gCku3t)qkNH6izp-o(x zigvT*vQ)KJ$`WmgodWh4NXYw$`z7j^)&RN8mFzGU8_rKxui^EP$i^a1$}tsLAlW;_ zj}-|bpxe~Vm|swTIaY+EAHuXqE!~b2&_mcnH`v(Y<{@Z$*OUYH1$YL-h(oo$F@-xirHO~#S2Xk|mp!e0b*@E<>eNe%Fl$&fskXfwfa4oAdO z_P|+Id;!7AJEcT?6Q`gf%-8o3)W2Z$Ol&pLeJNIz^XaMbl9U%?TY_>fH#gs96=fei z`87b=Vjh0jT1(0MHHgZ>{-@t!ur@x{ih=U$G?T0lP^W^@v2Fv;0B^G_gt#;DDKs7*!BM;mUvM@_5Z|Q z{d9$L<9vcX)v#*tJ)6P?I|kV}@fJUx{L$=&x4dUyA3C*35R8TBk59a5uZ@lym9DM; z#r4o9!FD2;cvEEEFx&ov>8K%rgV_$PC@_Hv7mc*AR-`<~+eq%D+M*(`2Ns7snO(V`p~?FS+H6># zt4lYwP~Etnj__H;TP0qYi;DQB_hjEzAf2=AVhb~cj{u(1#LtX(P0{9*nBB#_o3IRE z*R-^rz*<$rJPmL7F+hi2sC&tF^%3-JX^du%JHfaPkQ@5L++D^(idD&{Sb5c#5!=gu zio{|%s8)U66N-)8BLKFnJmUCAAHK=33n2+z6j=uTwARX**?k|bCXPi#{pi{{q|JYj zUmh26|3|Z5rK@wx{u~oVzMdjdiR-@#)71$ zaV1{p_Lol_y&(u6n)2^wzgyHgVebc~!;w*$)N*RdumkgX@g>tq(8+^K>-_Argox8T>;=72-{Hwdd^j_G0(8G%-}JQxZ_%NrpTEVOCFP- zMyEtxrNo;LIU?I>|iDSTIon7(BaC1YWJJsQ`68|&Zztzmx|)WRV-*dz6+zN$(def zj*e1@>PWf;)_Sz9C~Q!?uM$h>CYhmC882pf=mYf%E7l{(j5h)`LUQ)_Minu);j$5Y zAtrkhuVaOr!`p;OyG4!5a>x$Uq+(He0nF&snsY-Cg$6-X~pr1o4>>14iWi@I%JEZIXC?NId6P4z$Rmpgag>bh*xOhH)5gwp9}m`5-{P~CZ`x;<_f*L( z453)hV}t2vgsZ}>v#G=mYgM~Y4_gN~M~;=oTub`hL<>1fS;8@)jx7oq#6ROEVljx4 zF*-_hMA%uBFUo{jBro>V1!y&wQd_9)A?pI7fd<9e zm}!VoX>B->>ZR%)myIwnj~h_Ix!7H@4b$k&@d=s*PM9mPLP?^8r>sWaPOKTdsJn)g zcg#@8FPTXN*ON1*YNnl2x1>0hf4E}VeEE^7&Jru7Wn5`cypeWO1B7a7DI%0PxdWBr zGA+-tdIEeJt9(=5ndDJs@I;5Ay_%X^o4_c=+wl7hXf^MX`LoLf%gMvKV(@QAh)4Rl z@qL;gvnuWdV;0ZOa1`y*c2^5lmcjD#a`pI;xsl&S_~RC;)i261dN*}jdPr#Dkph%0 z8?U-w4M@~w__Yt=mK-D*XNtviYn0vCGpb#Iyh%eUwKBU~t_ek7>Q1-Sf`q17e#|*C z4M%lNR^5Nhn`ErK|kNj1ThHEmekfM!Omx`gk6n3-@$G7f8FXY{X8t zWH9o3q~-v~vG4dm;C*+{J8Z+@tL)tg9TcYbKH2>4GlzEx?u0)*@M`O~Zf3zpcFi5! z`S*OamP6O={9CcTtjuR@l}yeThqpla-0M29dFRI%>D~AEGGI0b)KUx_ zfBjF$!mw>b;=Mf^)`U%yTF(cT+)E&5E(KnfDfbUiQqa@D8`Dk-(oy$;^7-TM??%1> z3%0lT+SfL)rat7&610wc*w}VHC#pYcUUy~pl7fJDH^HY<7{p1h;%UbC^^WOOo>DIQ z$ZKmq?wyvR?Gdduco-k>FR;f!MTS@3d&+ywbL!(+0IA#|k!EGE>7(parP6^8C_%`% z;!A2#&WiW3(kRX~j?VJzXWUby=E|8u@kW;K^}4tR$r(?N45!hYX&1FQO6Nt9g@IzM zkirheI;pB+iv0Kc9aDKwm6XHt!!CYq{88d$@XgVl5yFAsPudUj$1K_bH9^dkvY;%x zXg|ykHu|Z}?r_=DWLxIAR!A|e!pz{{&J>X&U&c`Vm_|!nVvJAgIQ{$>h{zjB7Iqf< zlGCQV5aDeK6NVgm%IA~9N<0T8uJSVJO>e#hc4RcPs5^QyD$UdSi5&`m4BXMcOmT zf=|3q5%XIF9g|z$s+zhO=}ISWnt-|&Rpj97=A-vuk@`?yp|SX7cyBev2*w1&&Onk{ z-z{CsWg%}v2^d?hZ0hMEPAqrwk6)S!|!HlSAA!do0dT0zVj7f6hny9&$NFXWUuBaei;=sw#$|0*G&Cdy` z&-B1B)TOMI6eJ+k2kWrjzY_!qp?lm*2-Kkz@*B@SOR461VGJ0w;H(dz32c%J&8G~< zhD&P^flQjlvl_0TZkohWV0Ssg0%LSZZN>4%{Ax@QF<@Z0Nb`AHBMGUmOYte_<1742 zf%dvuG`}g2N8+$fk1Wvyqf*PnHj@Tzo*lGl5z6*gbVTuW+(E9biY2t6Pcw3LG$%?x zm4RFX{4QSHW5g`VvGQYH8L9jyEpdlTr$hafoiyNDPyC4yx00lJ2+Ewo`0|=!OnzWU z485G;?E%=q_E?%Tc;(*k+~VHL%Q(`GLeP$al0v^do|KPU8;+n`QO?_-nt?^W?aTw3 zjo9}ZaPsdOT-wodJB^wO9>^(fg7GDvrJRuKX0dxfU3f5plkr!75o+qsDr=G!{^uv) zZak0FwKGWE8|ukmAagn59)=VYaCzshTqE0KfK?+EBcmOV1&}+hL<$M{-1y1dDWAPQuyjuZFoab>J@fm;FAUTF1V#b~$)_ zNY(OlTef@V&IbWMZarMM!qCk7ui)-|2J;bF65-+0;{o*UO6fx5INm=sRxBCeSs1!76le-VgrB{pbzI^|5+ z1dBvM{RBQQ&+TpqbqgE3G7yr|8qmv({%phOuA_H-kDYP}qFK{`N{{U<5b#J0jtE~X zEsN#b0s@9SQLg&}l?r+5rm&5NS`YxchO%JVZA0)2;61a!w{gD){z;lCXFW)Koivkj z#I6C|yDTqpMc)bwx*8?Bi^ZFNn)@*JX3iD59IE%h2c-?GFB$8p9Q|t=3hLIG)BkQF zK*=2E_L8;OMVPqWK*iWFaUEvXUb108Q%^I;_I0$79>O9E4*N)5)Pt62!K0axk>u$6 z=dUzxh&UG^H@}n>6n@uaxX{>Sz8USaIXk5P|D?F9J={_;{7B^DQCwQ=HLY zId$tO?!tAhYbt0T;FP>$XY;59-O0a4n+=N1O?2*>VT9k!sD~DU_2;>!SON)1;Z{^% zyjKKCHgGmj4ySIv|A^?o4aUx>rDmK<4f)5NBWJG}_j<;htG)aFy~nYs@k!F>d9~{Z zU*W$>YyVi5dnjxT7qHnXEJ3}ji9%z}4TwWf4|PU?KuHJjpK%_+g;iKeyV9JxcDAsq z`(*`ZA54>J*I_TaBJ2g5i%#ETphsR#Ls=3UdZ`n%J@?e%N6p6m{{{&3K-o|&2wn)T z!j^IK&yXMTo!iIP-vtw+lxG!Q@d+mZl*10i+OhAe@IDD?Kvofvq}ho;va6HxD9itJ z7atvj@1!SzUu`wNqPvHjiNvm%+(SO#=43T}BKP<(gs&|^^artG)x2kfULG;3IfuSm z0X25CUAlVS*Ux%v&WZ`Gf$vV}?qZed_${oI0){z*6QF9kwN$g|R2N!)-1?!KuyRqw zSV)AmnG(OE>FTcPO_)%3*Z9K6bJvGMt=K$DQqXIu>ydY5eZ9{Cy+xN-x)N6#%(1Hp z+uDAS0BtYcJ%@W?_o7~#Bl!#ysx2H6#|e5;+P;QtA5MM#Sq5>OIl8i#oVZxH?M}_} zD5n46cU2Dt8jF}e%{4|`Zn#m#9JRmYz;3Vzh0eCrHQu=L)gbwge9ub+!w^WAQQ$FA zfoofPbH$B&5xx99D$uo|)fx2xG$F&u8+(?zJ#3Ke6aTFoPLjQq40s0yAIE5_$&}8L zt;5%TaqnLY4elZNqVD-rPmc6>BPzPH^xQLTFBPo6X@&&-A$)>iMcu|dilsk3hj)oK zNG~hLs^J*03`oN_iK5fHrSQ= zmWmYl1x|Z0zn%dm!@>>V>^%3hRK7lv>o_9u#e0dwCE-q4{I9!L!VKIjgg*@Bm<3n)PL8lP%2|Rmz5L$nQXUk;_G#Dd0 zMoHU{;Ji~@k7*@jAfvuTYN3F%r=OClYD)=1wKDBS@S{tdhOd!rv81EJ@oaIRI&|+J zg+mjeyBqKQzJJGRatCoNOn22-bbi>ZU3m)>1&Q+<)%Co4j+p)k|S_DF}JH@IX{2(2!vd^4Nd;hCB!1B#ov1sDWuL03-eZG)89Wq&y1H zG!`7z*-IW<08aK2^Sa?hmW#!-CD17;tVgj<_Z3}yhsl{V=*15v^pk@NJ}DL&k1uNK zh8EjS{PvbUR6luO+g;Vach9U322siz!yM(4R4OGTS{1a))i{FYS<=})4)I&xkHVs{4EVK$Y&X0c{ zQTFoD8=vmx^0d@cm}bt2Y3JD?%9{rJN3&F0Bq_b##Z5M4gLJ1~WS7PAT#%`oF9oS$mI4LtjvrJu&MLk!5a{$@VWb_xa^LjR~S5z<35cLP}S1r;GDG5wgVKSiw$4~bV zp=lh^&58MOifMO&*dDz=yLEMpDI!#OzxIlB0K!h-zK&=zl7MN$M-5c!M&|gC$jT51 zWr@!}<|GBR5oV>|Xy1J3Vpsti8e~no0HFPD+HJ-vtszVWT!juuE~htSgf8c=F}T;G zX6fS3rdusuL-OlRnbm4X6}I!dI^Rs5ylt?9RXu;2=@gdbqj5V1{Cv4VM6eqc0k<9y zqgxRrZbdc)OPqOsNo#c+FA#f)`gLkqsi^ZbyGvo+17y~IST!DuOpa zYiJTmzlK(EPIyK$OmT&19iK_hpQ2(fDzTFAL}Nf`!54r}-V%u>O5%)Fiag4Fl7i$? fv9{c|f55wv^y>OXcG+yB@2T(EEOS@0zsCL#JLCGL diff --git a/tests/_ref/drawing/paths-transform-post.png b/tests/_ref/drawing/paths-transform-post.png index a9bee54831a54b366905c8d931395f8d84ea41d1..fe6ec7dba9d976f24a3cc1d0bd25934f527ed41a 100644 GIT binary patch literal 8646 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 Z`16bR$7j7I$e*wPa#G5Y4dN!D{{e|DIq3iZ diff --git a/tests/_ref/drawing/paths-transform-pre.png b/tests/_ref/drawing/paths-transform-pre.png index 776d9f15426f36148941943b79a50692b6caed59..27cd56bb5dcb676ee26f7b8cb5d97e17aa972e41 100644 GIT binary patch literal 7215 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 literal 9108 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 diff --git a/tests/_ref/typography/typography-advanced-flow.png b/tests/_ref/typography/typography-advanced-flow.png index 3f60681461a2c3439e9bf52edce602f64eaa51ad..a3cc9d9d9468f348a7b8a8bf8ba02c1a97ddd411 100644 GIT binary patch literal 22579 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 literal 26876 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 diff --git a/tests/_ref/typography/typography-advanced-flow3.png b/tests/_ref/typography/typography-advanced-flow3.png index fb7e9e70cda29e9e997838604a2d7c7367d28bd1..f7619f84a779580328a6755df3b16b0618d786b0 100644 GIT binary patch literal 27330 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 literal 37828 zcmd42<8x+B)IA(cY}>Xmv2ELSGO_Jkv2EwdBoo`V?M!UzH}~^AAKpLV{c`G5o$gcJ zRlWCKd#%+`N(zz)u(+@wARq|RQer9~AfWXB-fy5G|2^BEv{OMqV1=zkMU|vQMTwPM z94)Nv%t1h;5OUKz)Ku3nBWAj|x@J*Hi76g%yNT8$8 zXqc(>f=Wh^nu?>tg#??dz}z7#4fiRFi63pn+QMAda@=oceU51Ftev#1tXW?Bt+azE zeFQ`F|Iz{tWG~c0zdG;JLq(eyd)4?0QKEER{tiea15A~?NHjzqSz~rg(%d^pxCu6_JuO>fle9Z>2yJidF8Rn1Mw`gJdB2jk~S$rS;??I`a5dz zcH5}>YQjR7G9bSf=_xn!&;%dPj1^e#m?jQNp>3aOm3Uc;e|f3Bd~EgFv$jL%ulmV9 z>iw>MOL;MqCmfrny<>M#!_+V)FriUa9btSyS_zD1u%Q7lQ$wby=aF$ zIbl-O<0p84nF~b`Jx=jXs9hfzY68@+0$BDSMrJU2BLw_FHYf0HVvx{4DP-_8a7HOG zYaxi=!UC)Rjv&h_sC$Tw6Ubta_bh}$FsBow9)xBuf)gBkprjCNc%LjY=ys4bbnp!_ zMv-t;0%i$PrpPifo({B^sIU?@I{1)iR0496(CaK^1vYI+RiUU7{{z`C+;(XFkhcP; zSz>m`Pf)*5lnk&1V}w}UVoN{P9^MTIeVAc? zGPKYrH29o^7Bt?im`H*aIVcK=Z6aw2SfzMY0%8eXTbxv)^C387M4@p8Hs&zSL4vWX1yQif@Uh8)&0rv)-w&}(q1$x=g^7FCU)I}9gEb{xZ?h7rI>7nt4vzG{5I zi;paS3|~yK7sxWMd@c(4ysW6MH-ImHK=Do(-6NZ+$oJusgR5= z9Zrs=LQa#}6r?6?L#j{7PuWG1JoeK}(gj;v$Uw1jB1`!d&-=`Uw9B_o#7P z1+t&n=!H!Mr!+P>wj&mB&wkuCb1<{PS#NFd-AR-BO6x%Dn@XB$kqVj$sFG86TtZ*U zt+KCDTx7PPv@y0>vw2@)td5&0pYh0>$u(sEKKzI{1GYzbx4zjt4xI6yCF5q{cH`pU zs^g}!4|CvTIb@Ax9c7)ck2G27!2N;HInp`#W5Ar6c{QnKLD3k)Q&?MfS$ylxaD zoZVMZ7+u(7oM&9TXG&I;SUpEutW(T8%x&829DOTrpi2pi%9T!%jvJF#U0vK(Gisk{ znt``HwxVRO=I9tH0&Z$+*GMcE@C@*c`WAa-ztX|+$7sdmVs2p?(qGc6GMv*BY13%` z(6Vnj1HKKc4`$iwoBEA}+Z>oSPM2*R|EaBH*m3W<^yAIa2X0|@D0Iv`AwH45Q@*o6 z@ke+@bRj;k{&J`82=!Y+Isd!YI(-{^07d0P)vzF4zLTpxO*4%!T?_}0b%V9YfbBBp zyw{5FlE`Sr7;EV1RJf?Vk$RwW{x&JU5_jT0Xg|2M%D?v6`c8)=i-;(rfa&2>6F7Q(zN+3=Et=ql3+K=hQ_!I2Y{cY=h<>usVJK-Ffj-c_j$k6Dc|&r&MNBY}4^j6pJ{S&oeT+9(Y({$a8p;c= zR&`H*PY(zN6LB%o!44_F==`W;OdO^xria9sXPAqX5 zKPC|#h7Y;BOXc(YmTbhq#Xju86(gHoTI0pK%b%mliJ7_t!#-_iT0%S`f*s`VD75~{ zBe}W2H1<4Mcc=%m#);&iiGA8<)~e? zEjlvdzvLdJV#%{9LbTx;ZGLZCN}A`7D^H>vKOANqI!q9Z-H*Ndb69YAxLJ0)e}#Ya zaa`FV)`l(D>20(rc%;(1MG?IrPgjHBqrj_@pc@dw-=QQl!4twR*l!k!y;`W z%6nZ5)4GUuLv|Q;ms=K%wKf~+qy}@3CKLP7`-&8sN#{G-ewwdalTV?SU8PT@?;gAE z&>ovxr|tJznI_r>YqNE``n5-scSUzC9hw*28pgWLMo88GGe8q-#qTbedK<~5^0Sh& zAY4G!ao3qo%VqBR$i_;~j(xxaXdL(ulmH<*erLewvyyGCu>Fwn=3dRf%z4pSdyi#+ zVSw1B)NSI7WSC^>NI$@BiFa{@tAZSeIuD+2%`4ik>Xhm;|EYOaCt9a)d2>0cxrEc&N6u&GG;kr8V48qIF#Fs0A@(UV zt8v^?b|!HeBPW|D-^2e-WH{_LCJHO!r{*t#_NK%6+&W<0_C!#6y}@mpOXWt_`-ggZ zwPhWTKCfS{U)N>$XWTMjM_!uYg}?RbpKJTBQ>Vtyw1e9C?jL?9Z~E^{+fVI&NAcge zc;GRRZ&!@nKHmnL{HK1~pL0-^NCtwF-rS#7pQaZFMO3hgw0Tv6wVz8bD;AYq4;KY1 zMl+3(mVoe9QKs+I*LuZ)A2XFRbP`PxXOgv&GqJC+Tiy*1LpKw#=?e#8Jv3j<PO z`Tid7U6v+egEzKw=b3^s+ZEkBZ_7{iCuV;S7d))5%gUp-tGflCf<6o1O&>-QPcIZ- z6jSr#1U-CVKJGjz?JbUXoaC zR2-aN2>kg01P22J1A!V>iM`iW2nU$L6#PG*B*4c5mrMm{#g)Xtqajm3WnU5h8#8Ol zUI4Gfe_X5rq0U}l_1}c+|NYnhUncZUr_s(@vCn>u1nh46TrX+9&!|^FoLn3xrqUs- zY$}fWUAjHA&mcG`Jbn1BxwbDDd#&B)&$`IR1h(w-@pr+?H|gfBf8A2;8ufQ1#INf+ z5?R@|g-h;u<2_43She`&M$VroJU)Ve_S(EZbNv$HQDvVM<#2jDQ|EgZ zUPC2qYidFl^lQUtY^@z z9*%quv!c!C;CMj0)b7_~ytNF>LojZKYNPC)PsPNHTV`t-m#cYgb8FSaI0&-F6Nfph*beiZOP+*D*>w>#V= zI_EO>5T@pYDB0K7>E}$bAF9$r=$ttQt@3=>=!Wx&#~1I^q{fuz1GFqu-S+M_QupE4 z0Q{hJL!gXrX$*UPV7dXW!qMFq-ePhDqXBXVL)O>=J}hcY@NoKXuuilvD0GS-ZEe_@ zK=6h}$U?gXo5SrJ5mN)4y!98sj5F&^a|CztI*GX>HtKoEy@7H@l9xF?aHh;a^T*IrE}sF+tcSh+-`YxYY=gT2$r#p7_vl!&+ci8az^TB4>ph- z^|O;w)O89+kpW(!H;^V0fhhRJKsjT@7b1uex8%X4w66*WjS5Pbpb@3vOUPuGPg=Xy z07UWIG7%SMQV})+F3V|>0>ZIAdZ-{lz?1%&FZC1jtfbMC)1SSQ@_ko_P2MjSs-{fm z!{%6}=B`d`_rYQsHO3iIICIVRuV#E_iEn1<3vT8ZHv2E3XKnp4c+`JcrVJN&8c3lQfHVbE*b5G?)7xaZ-6Ou>am68f z0%5w!feRREYceY`R}Q0=qr)9iW$oyI1ey9}e+|tI6ntn}uc#5=&E0I(nn|~OM@IbY z+?5&O?({BtfT6FdQ>+0M;#>=u=3dY(*(T(qCTm$!p`7)Eh%iuD9a648&e-qI=gT`}Y8`G;J4 z)C|4*=(0TDYI{Bi+T8B%Aoe#Nfe3Vb@o5O0hXZ!r*t#7E0VCz|;X4%rNx#u<6Ixp3 z*TbXT0LE*5J}fUI$y&&dRGu@4;`P4)4Ie~*p#4vgUS=AVZ?Zozrq!_q%`K;(3GEyGANT+^g^&jao|@`Rlw{OJ?&;Jd43GT49X zjH)n2lilfr!zo@)j2;1>I>X71BvF0~SK;&0ao68&pnmCgGFl#uhL`&%E~T?QgZyk$ zdvESAp2dL$TPkPP+-d{;LyfR0l%gUh_MZl6?10c*vLmCVD076z2K<^_%B-oj4%rj_ z546wxv@*)3dApgRii(WF+OUt23%%V%O8lu~+e(T32_loHVRdXedl|cY*fG1yMa=UM zGPmhjf2z-)emX#77TvTYbc6>d1ZFO(b<(Cv-4J=Gnk(cRhu6t*t>M5Fk z_3$QUE>Iqd{y1W(qi&jWoGe@YXwIh6vE2UbPkS0>PF;;y$fS_D8$}w1Q8S&RCgUXw0keqiMGmrxXIzigD95XWwHl_{qPu~l^ z&^d=_2dwUw7I>6l7g0J|QsMdyQVLsyHpPFNon`nJuZ(*LF325gH~dAYs=I0ka)gG# zR9GvdDxZ95-K;Ph+po|kjK^TY8x0mZ1R`C8KTH;#rsG0f?J$x=e3jbheprW@jSF*n zMa_^A)%+|GuN{a3)oJ2u!k-KJNyRQtfqDS{*znt=YBG9+*BlYsr4o0&4~f`nn7Cr6 zH8LmI310zz_&wfvG#;BIhGa979VeUOHpcB5QQSlYMuNX!2==at36+k^m41eye{vRE zkG~yWSLTe_AZ1Q&8_|)*UyGnh(yPL%w+vk408MfC&co2?Qcz#{@faW81t%f{ud9K! zpGZD+D5Fge;o63Zuj`rgLWFQ|FpxMlCT3{y2yKsxA4|T6D1xG~-Uts1?zx$Uy1=uO z^S4QAt$tiY4DHP(Hq$57vYL;$1`#o$mi(wMC7f}sB=a9WLjSfeDO{u)aRx*8{YfGA zlV&gpmQbBgsr`?Oguh$_idUsC63>{MqhH_-XS$pMJaL=BY)-CQknk|Q>klDXXxRO{ z9k?eK58exuLrB%C6f`*gW4OTEq#LSDHY?ik6Asgt0`=A#GN;qU9|k>)bt^#gDeprf zK{!n=%XUjemI#Q*k-T=#z78e=4lG~4V`+3>Z+}O#nw_$n|d0#9lO8w9dK#_U3wcc#jT0Bxd;cg zDJhm+%iF56)Sb%1RXj!#-=2O_`9pBvovd-Z-!V#{y3e z7IsF{8($^-ym*($gndQtCE7Px3uV5lxYH9S1w(DTkaZ}sBwV^B zFc}}u98ZbR7w)ecN$`x<=9L9?2(U}`4!pr!xrRKp|8XrbvfN57MvTov&>^6Z^x))H zLgj+72Hvo%_S*R|lt$_}qn@Anv5a>SzDtOi>@yegvk2+f<&F*KtL`>>D&hxfxzgiH zwlcwrgrtfg^5U+VMM+Tm$Fg=aO)U0>1xG9exui%&LzeVR=f`m3e>N2V1xV@s!T0I< zWImZ%!gj=t^JnZ*dn>fs#i|6g#bV$Wkrw?tF~#`Q{C94|!3CKRRu}(He*jm%^RjiE znv9^_FY4JZ)YgG)2uqU6Tf`2C8I>8Y#!HJCUIm*f|N4_a>wkfcc|XuDHWv^x zyck=M1yb2i=2>q(zS~|uuX!48Ze>_OCpH*8uAbqt_^~sLl_dr4zwV0sUs{Ea*)!I! zf5&`6Gc0=P-I#RwU>SYCkQQ#77fb0|F*xq+<9xl;#*>TQ z;n0*vL!u)@;sPlEzwEWJHQ)Ce^%5MxMpjR4SqHe)B@lA0+st-Aikuw}qwi!-tMXLe zA#c&2z|6aZaPo;xCn{se^{%JF^a34OkFZp1{RB?n{s>9dGZftu*X0nVQ9>y5bc-{> z8|z`1J2J@c`kKPF4U7B?r*P%r!O;u;nOgnf0SPs(s--@`(Q-y>0cB5vg-+Z=ky^<- zoE|fGJCjcN;sRQEl+scWA|P`{F0D$Y>ZK3t5Qjk}UZ5~tUE_)AtBf-?wxGJz zCL2g*V#CdudNi|ofLzQQoQug9RN<{Ca;&dsc@LDKJ0RscEcxa%rQTF!!-V=ZFJ36%Nehf zu($ohzjEY=NJC|EHn(K^TAQ4Nl8u@w+iaH)4e($0Bj+iWP%G=)lL$~r1Lb?7XT12q zH|J3imA;(rdNQIGMtnKm7)sxrEKGesvCFKdRF!B*|7~2LH9g6U?CKMl|EEPxKAVe)i~+6@{&0B;Cpj zvqA-kd8~ON7Gjnt9Fxn_tq@0*KM)XbY4xM$cJE5PkTmmuco^;f zc$j2CesTAIwS^fWqjB(;_K!)V7*n-#4^flOa4I|&yBYvI>ahcItv*i1W%L>_rQ{z* z4Ae$g{S|I5Yar4%uj9O6(HSo0-e4-J-2x$+{Y!F>f?YYvMRYDu4V;qzSc0*0>Z*H- z+q`%ssx%8KLa6>f>DEIBe2dd4s=?g^D$ewF@O{46x-}oAzEB#zu&HUzi;lb}+faiau?B08^ z&J9vW_H!fQ#HRZ3#XN~5fFqED>}Vx2?bdR8sZ+Adq9eAgo{31?UysGqRGfbs;JEr+ zPoR45@qn8xV2xCVWR>n@LqBAKkuS&aa&y>LC=5vEqv$8ccZ8k8rtez&;{baD>B+my z%}ntcwk*!;su{~ZOxwv$xRCMP(QUWxR(yA~3MCoi+!d5?vfDHRt0d`4wFI%&iu{0A z)d=^?g@*8Sr*(EwJi)EOxkCVpN#~#emEW|>)rRHh%(UIZN4Z9Sn_~ym^!HD*GJixt z=PoBjCU0_E!w}m8%ibuEr$h7B>Pv8(9sm0J(czWZmFWNe73J4b5!1oiZ zfmZMVw+XWm7K(Up{xkCVZ^RfG2lscq+#rG%irxbR`I9&N!FJpLBB0boVSp;~nIrFW z^^$owHWqLhKax;d8u`Q&VOU>(>!5-KMMudtFkq66IZ0IASfX+6x_IRW)m?ub(JXXm zQ6iai@)kRfmd)ol&@jb@67;xASDT%y`pMP36SULg2^QeLgjWg|;%qT$CWmttxd4^6 zS8$K_BEz4&PrNS8nOL9OUOVT?t4`f=9s94Y8Z|Il{n63uu8H}w{RgDP*&002!B?f^ z9*R0V9kbx251va{!bs~$j&^%CyMEZd=*b#Lwh4g zfHdrUSfOjKmeGjLHmxLbvtt{);#m{_8u1&ne);K)3+Z#tjc_^sQc9tk!h>;?Pi-anE?5^9fJM5eb+6Umz_EwF(c_sevoI!f-XIex)ksv!ysVg zpFgrlBptiq#YTp#z{JYO1HVV~95KMYA8W_7Ce{5^rFr!%hp_6~i_2+1<0;vo05(FPUrY>BK=X6(5FaCf5t+(1q%+C5P&Jbu`@^w0LQI zJ3D|i^ce%?=_X^|=)>Uhr8_R(CI(ZB z_pG{2G_I&30}p{3mAa5u1A6Llo%Y`M0lWw}3n9zFlt<9v=Q0L;h9HV5ht($cUE3Nc zwD-rXePZ-9H-^uN^qEBjge*uS>k{XIYOh-att607nN09K7wMlH=V36@$CM6vklVEbii_L4VA zjA9kpFa4q~ z7_UPaTIUP11_VsD_M*NE<8Ik4*yA{uAgWsV*DHK-d{q7Pc2$mfJoxZ&ySf3Wvll6FktxwaDV2Q z2jR#qQWMt<<-SqTm_Z`$u0Pe!KZD;n<7M`(xU@4go6|UF8G&UipsxyAN5lGQfQJ>e z+T>)PC&I|=yCCeHL}cj3AJhMHlUZZICd11bk&M%US*FcOZ4ip|eXoV(sk_liVER}n zFN1XgukF{mn$Him^y)qR%h2*?gHZj^5O2Kw5UPEaqvSR2Bz6o2P_7$KPC8rpc8j)7 z?8vC(kb*qS5Up>C&}W^n@;3I)p9`R9zpGIAr_p+{+R&>z=}@>o@mvI9_Uea|8r~gbn&P7vUFInxjD+}abQQ0D za#!cBa0c7ugG6P^y|ZIE4+PG^VK_^ebUEyj7p8;|VCMpIG^Bj>W23fy%!hCw{{jy2 zY5dUL?=?=PB`Z|g=C@eXEV0vTFweeN1!EkUD2r2U?HNx< zX$*x*vSJFKJRw%rAsK_N#*j_jey^mTI3I!sRO+J zW65{Y(5hn%L!bM&MB==M8ygKfB9+r?NNGlD(DB2xvaC$QC#%p(SVFuX!j#(#ceSmx zAdVpSS0kB)=;4Mbwy6#`N;l4DSO;9@V5Vkm@h0^Q`<#T!&9FOU%dPK|G_M-6? za85{>%!C&YsP(a(ckY>E6lYIcpxxH)-H2e=&4+&;LZ@U@4QjhUIq?C^3&_LDIxQP0 zWxo8|7E=+??qD-6FdPklD&X`(@64*}<+Xzhza19CA`l`C=sR&Q>5Hb|v^q`x0yl0J z+UwTpkB6jl9g8O+yOZXFP5oPq3YVFv>AN_WxW?lpy=t_iEODDz>Wz6%H_{;i?k#z6 zm2O2GoNSF^Dtv}>>*JnrtHT;Bd2T0(`Ec$qy3Z;ACXUmabwt-7&;m1&jHUfV)`J(S zY4$Q?yUU5FWuMS~5!n#_W*!u(s)XCKqM{!dY}1@lKoNbIqaWi2bWK~2xo4XycT}gA z3NZf&x^VDuj$ue0rLDjmf5b#Q{?b9^wXV~9-f<+2_E+>JPs2cqD@R}Rz;~2vbH@p(!XCRD}hP$}*C$HeAooohzTdo>a)I8xQOlB@; zGkA2ZA1dpw){|H-pMNt`WR(uN%3KpX#-xr=Rqh{sBh(Uu1QX8K zNBlXVFHYj3aY|HB;7zNn?0wL~%J8mty zZIi_7&T{pCA;;PquN;t{Ej7$NE>N>p`5oQRJE2w@EIuu<-C&$t-TT8DeXOv?fDo?0 z@~yII&(B{oUVA!>dth+#X3J`~n-h!A68kmaESL?Iw@LJM4Q0{3$(Y%<@B*uxywul0}yBYLx4{h@8m}Kb+Cjnnz1Xh0*8|7BE=dT z{SkD#y7M!$73mrId5_XAIw0ai!0fi&#KpzEcimD1rRNmR&Y&gMto%hH_aZ;x0#y0( z56QAo^#MXO#pVnzED-n6{bxr5dQuY_+CvCN%m7HC5f_E%rdmqxd}G=8A_tkwFi$QRGyD7ed7 zAr6e+6pepEesV_kMuU%;VLH?iY5>Xo^WFgh!pR}IS>d&O41HbVCw4Zqn)qhYN`T6T zp9|V-8|be=zfn(An8~rlqu}O1 z{MxSfk{%hWt^+_U8)ca-KfPaaBL{xt7Qc+JU?Dq(I&uaqIw!YB(0%~kW}0{v+Xs+h zUgg*5-A1yOEczcqqklHZ()FsOv-U&`m8f{E)Ymp(qBVh%1dS$mxn+~XQ^TH zPjmx!z0bMA|CQQqUjgbzUpReCrM2*jCE#gAxeLnE`9$x9ce*sw7F+>P7c4n#i~Rr@ zgjqJn&l1%v{L7&yBpEpD;!>8`XoFp+F=2}75h^)mioF4i6jxB?mL||3{VB@0f(3 z=>0hl?DAea25^NkM>Pu}iA*}pQ0Wrup&YVhwV39S>K1I&XAm@^*C^hXN03a3Kt+B!RlFvE?XO#JDBniD@!X|sIdMuOieTZ_@nP;w=GxL-ZZb%RIx?>0iIi1 zefibxOHV??D_Ku?>~k)~;x)f0@e!M)0o!4mIhwXAbj+ow*d=a|zGQ@FR=Ux+V?BRiNZ>-oO|`YL3e4?*KnT9b`28|c1{T`m48Nxg zfO)a7g%W9e|G|TaiFTsu^4KCaqasdwqVW&0*=b$8TQ?5g0GqJlO+D{rU3{JCbgim4 z07q4&+~TSqEYp@w!`7Uri}x(Rn0bwWS6bhdnO2I-nu}mYA3T|5gn?peFf7}?Kyw;} zWJb*C_~6M>SBm0>==8qn!~%~&eTC>hY(Y?HE_0Mo#>lQE!ou{VmmV8`@K!}P9Iob9 zMbi4XA(dS0%hASj?BLO+?2>$^=UpgQEzm`&ALJ93A$IJxxj$rdK$+-18`Nej!c-l$ zr4d#)Yx~ChKum%qvp@TF*OfbhRBuT^$K(+K163t)8A%-=L}~Mj1uxgI}$uNpvCkZ-ERo2i+U5X}}IC}NbfgAY6k3+q7OJ~4{|@x|iM zMC0@l(}J5`jQH-IkuBn#B{xn9pyA~XJp7-~;AEX-aJ2AuZ`Oo8=_n0|$Pp6qXC{ho zYWe{&9rLh+xsl3SIpSpjsBI#kL9c)(tVTVJ4ef3zFWtT&BDXCi0R%O!F znh6s<%v!k5bB9@LWi~c)4%wSGPmrqtEG&5X+JCmA)H*+11)4dQ_I`!zO^w=xr7mGk zf6y=8&u9nnH#z>JP_YS@OGkc0h@qhIG15aw(lVM5&$$d$jnZ{4!3hxZjPl4r?k`tk zSd5M%{&7&P`u+A>xRrc^BV1zabjCk-0hC8}`0SR<0IvowwnmKj?YAy-TA(%O$-(u@liYYkn>ICMSQOuzPaoNcwUoxyKuL(wvl9QuZzKmpgV6;$sbwIdV7|l z3U>2F1E?z_pwVG&l5;Z=`Z}>B4kX8I3sVQ^Y+e#XY-8(2B?Ylu4g8a?Y301Aj>Xk% z`xF=P;q8qI9YHSxF+ox;xDn!CKWqGdn=?}AT5M0gV%t2(6G&lyB!(cKSq%TwHFo!a ztyuKq`sWQ`qhBsuH!aobFd?{$cK`n<(#k>;%#!(QQk2-~2_v7kgG89be@l(v?PMSNz#6|b`fD3x4)xK zVac+}IaTh&CvNNfjk%x>TcOw?2!ES0LDK!J_Y~`|BQIYYOCL6Z>S6q{-?;-IK~$a?RW>3ZBD){tZ}S%OAHGp75vF~G;wG&h}z;ja~&?$jBYe#0=c z!Xjo5!(@y%&RHvQg}}sqoVr&T7cg|29)WxNB0oU&rqy%8ayl%T(HzUSOrz7#bXEWI zb1tPGnZ<_tWVnx~8CIG^pkh<}X(S1gJ9jm#Pbp-(v6u#Jsg5TLOmhdd z#9}ghU@H6XRtH!7=QY^ow*eXHaEtNzIJuR?ldwTI*|K94F&L2YH%8suEg7SPvJnj| zDg7$uzw>|TD>rUG!9Gj&0mO#+aX?`J#^AHA+eWNqzqB z+CUG{LiEPtJxZg@N7$flnrR*yMp``docM@$??lZvL6%8gjD3?&(?67I$E<%$VfPcl zZC;xXPY~B2+0UtVZGs*^g2aeEbek)IJ? zxE?Wvx#YOuLzU0hVDBM8L8Y}%wve-cq@RVK;Bo;q@N}m{_(+NP#Z&SV#AghBwn>lx zCjCmXQ&LclP&(+EonjGRdt?K)_E@s%-xmFq#zS~ZK|g2C6=0lN{?HlamEUBXZ2JSY zmoiS?v_w>jN;%t`kKso9z+XZyBIpMb;@~ivE>I_fTnGi{AgvsU-`GsE7l#;sBh3%N zZTl(q#&@3o6GrzC_SHDDrgJ&07w{uUY|HB-(r=RHyDHvV=jL0;Cru_JNji;3%%{0Z!|n%VDvfI=F|5Bp#9V_#*T=-m+1ld z&3vhM$ToIwjEu4bgCv36Am_SmZ@xT+#_nGl1kZ*Tnt7sDFoOUstsQb}ve*e~ev-B_ zPTTBBC+uZcoKTgC!*S}`6SpND!$I-4vlsY)m$VZRv4m*27`Y=G?4l}de=&mon#-oz z#YJ(1Ur;(B^7dM}x2W4uEISr@ku79|bFh5$%@0?&OocZzP3#HsKR7o7P zoOG&Eq(=nkk2?IeZM%+#2`K0WbEQgiC5eZfk#L6i!Jxu=EXck%*{M!Jin~{y>=Dj~ z^DO?Q*7l$2qgMuDH7EUMJEr{hbR_?@4TK2q9(;d$t>%R0fv+v^guGK4$WmS28U2nK zZgL2SxCuUYI^68UGVBr{_>l+4VjD|0-rP-g0EO@Bl^rTLOSDbcFH-0tNxHq36E>&` zxA%Pq|Ii`f8>-<<@^*0J!*;87i`~ik8?%rU%OoGgb9O^i$$EprF6-%MciS_wL4F?W z^{f%REq`dap5bu93g)ga?k%YTiNRoYKG}Y5eL)aPCcwAWzviQvUUqj56^ zoEMB^jzD;ot-{|E<3p=8YqG7(!XHbLbT_6uU#&A)nk0=#Y55TwAV|gLMQ*>dj)>Vc z!%Dq5H8t8S8z8+Qn2d)46jGc)H84=aTSLp02G1-i_T#(~bC>`VwF4xUczkhQIrWaL zD^_VlO8rC?J8f3~c`%}Ifd5Pwtn{w?kQZQBMJX#v0OvZ#5Cv#aetOo3o`HKh)?O!m z|DU>nfCVQkAnLJ$`=HI}w*_-i?EJ{S$#Qt{l>Gileu zN%g><|pL! z6W(Y)E%wRv7UU=O+&qtuKjPO{OimObKcAjG2&U7vX1~Q;N+3fRn*3tAn&jzA`h}^_ z?oWK1EcP7|3H6{pbcTPtTyNcFbObZuXmB~B&Nul|Il~;|^94qaGkM|P{bxrz;(mK(Cz zM^Pk1JKWZEK{x!$AC1w9WlypkST@OFWGL*mKx2HR`N+j5UD*bME~Jj|{J5oJO=z&P zWs@d+rUIO>H8e_(<854t=@ygAmX{+IDWSgSI(LasU=EAOoUz#Uqzv=HeqdXer<@Pk zVIEl^%?fe78V^aeg2b6z(QkP#)675^Zt86kZ!K8Ss0~N0n@AG)x7oKMGrXdQ3HLGU zn_IRU;^y8dQ(geZG`f|y(%zs@mvun1>l2VgT8*7o5;Yr9{wY|a++b+sIl@Ju z>9gM(Jtp%J5F4WA`}=Q&BH5wJ`*u>pirBCKM*-pgb;TQ7szAF-{wT6AMkMV-B3m^D zXOVRb+R(i9ET04wWmFgCeF5cr{P4v$V3eS|5V{DxN8KJM)hYp3qgT+4 zl#a3WG8ihYf9dDObV-v$_-7SmiJ^<|mFEkKDU4Pl`*rFogC=zYU^nvm$V=l)CDR zGg-SvDxfh0?U>i>W7R1Hz&aO}g?*Bw&-P7>86&NANkDlwU_-|X06EEwj3-1&HAIK3 zU5_EnSL=WA{y%*y@L}Z}3p`D%D1XJws_u`;ISXytR;@H{>cfS(aCKW03uHR-!@4=+yZ{%ff2-S&$z4UWH zN#XOpZaQ*j7cFLp$lGqi=6z%?MWtqu%J(aTu3s^iarmpM(yl+Zq=bq3g&yAta;#lH z-TjI|;t;)eIP)f(k-rKz!^cp`0RO@eA14NpsN6@k*w+~-SI@|82q*4|*Cv}X71&i~ zZmGA$RK=2s=`moLuSYN3xcH01-{gnGhb`(**85xl+sNB6ZW> zxHEyVvRaS6d@A7U`Gs*_gFm)m+O!xEHEI~D&$uwJ7^xj4N_5-IUGbJ{p^H=gh=9kE zIfdc=bEb;R&GQ^eDoB7hgIUNqi95ZBh?Oqx&kV|PM|r|vg-4Lp-jF+%Z@2;>%Fp9T zvu}nG3AyQQl^i=Jcq4~wVGa3oxz7XVw|g9*l1g@^HIWA6H$Nfn41;W6e7HNQ*a93bVdt919n0$rpi3cse0bm zp%rV{HXE6Mna;=##A+MuWPCk)RH5>eD`Oh^F4q#R=X{18L z(U)?RXu2gBrVWua|KRW8$*OjT$6MP!V6)X=VcyL_#nfhUL9H0`Ye~rueX5RZx7aXA zNA2S3|B-c$-I;}3l&vHc=Z$UKwr$(CZQD-8PAax-+qR90)46?HWAs1R=hJz{UURNJ zYW%ZgnFd>6eeoq|j&1FDtkB#ZUXdiA?&lUBmRhx-1AGMkHU*=hsmL}jO~c91h#x|2 zURUbUq{%WTRZ9Q=DcG13zDfn5u6Yg}tfu_@S1qqS5mJVzD{!N6B9MgcZU6`99=miW@D0~60hi(LA7>|Z^@G&N=@y@wS0r|H zTT1@lwLCFtivA*qCbh0Bw#d{P{vz%|5ryb&vSATk#4HF>z4YV^ebp&;>>;OtPdTRA za+u*fqbAMpFAb4tb@_xqyD`bOG6KiIB@aJAA8G{z0DZ-$LK1Fln9N z3r3N}-t@43PoBs}#K)^4nY(QdAiJ*s^=qwwHKh9l<&K2iiKiWEB@eDPC7}{PtTgs^ zb_P3Vx!Ch+sxLZB)!w^VZr-Vn9&J~aho*$06GdskJHwfX>dS`unbv})h>gEgRqZ^2 zIH74AyNNl#!NE;c*#_Z6${aQ%c(=D{*|FRpLA!iT%-0OGQQ)HJglVCxHJuO)pdk4v zvx`~2BLFmZ7%<|nK5tCx|Ju)@YX4f?zqr`DL3j4Vh>zSL1gGyA)+ zx^K82ofbboYeCh-5t3sv;dWUu?smY@z6b7X+bd;bZ%n zZc}U*lMRdXVjDP-Ux&TZi64J13pY-pi{rxGCT*_wbm|l54wlNtXmPa zGW)`VnPChLyI1J)~-z3Q?dRy z4sS!nD0_wi2!Xus@M=nhw+J~RZ;p7C**Kv<5?t^&X}QZB?Rz^e3K_;#nV_XUgGS+?*=P?=gE`O{ zwnri{E^OXZB{B&f=f;y_&{>~p6BnR(*b^}u?<$r%^3SL=R%+e?YMzCa-90-44! zt$t)Vb5$_IoaQ;KMn_WnJrXYU=kz_pvjH(+jBXmJCx_#-_0S)5^+M+<5qD_=d_$2{ z1U`VkwDJzGq)R(H^ulPF5v3W%C*hPk(<^ZSd&hP|k1Bh?X?_>wT-NK8cH^cJ>J8T? zibjm)RdNo_#s}m!m3xT;^RE~9di6l^R-|_!)VA@<*Hcv}S(@2oNu@veXVe(M`!B8U z_r$5-A*e(j{Qn!4ny}Ut1dG!qnV=oKOb!#*H+lI_SM#43|C3y8h`Iz1j?G9KD<&nj z_fSFPLLWjHjtBS`_oLSj+&KgrFNxnC0V__tzO%j>h1iU<-np?Rv=2z0KVU$W-?q7> z-?{QOs?W6Fh!T8<>_;jRwJqjm=gXG5n}#XBI-Ywkt8Elr^W(F^EVl6Gom=9IX70ok zWar+A%esWrjL;XU%~q!vf&Q6r+f&wJz7A9H&VMfqhx5j&j`IoYx3OT9NcUHLU7k&> z?Xevm7`e-ckubhNQS(%)E6Li0-;MhEr_%>TRO$4rEL|`&+azTiKTEVj#zh7)9r|#V|dYwMV zG5ETn?UGM!(G+;4lbBTP?oiMv4=WA<-5|fqu11;Y+MYS;(E40Y<;?i)Dnle)XXCH) zi?r|-JCMM6BKRM&`PRh~UCAYOMKBGkHsxpXUBsV|=3fe+JzFHsRb-F>r8^&d zC=2ywAQb)Es|)f7co_bN=e_|!?9E3Qa#Abm{~@Qt?haFBbp_Qih4Os1PZTh+f|rm+ z2$<|Se=ufz>7y7ANGq7=#m<@8|6+h98RVY$$eE1g&2gP|1{*Ke@6MbR8i73|y-;qd zy`eK2FgpTX!KZ>Y>Qj@|C+3&;JCY!rp#GUslX&3-aoba44rP1=YG<9(H>Lu1Dy&>` zzo*-^Xw(v?*G%up78SpS&^B8(_)at-WksdFi_2B0w4p~-tJ@N2+D=!gsk_D(kXpS1 zy!aI>Q);4?O22C=!mO6&U90AJ+nMpWO8pA3*M~i;yET%_6Z8;|m6w#>_j&R)Y>bF# zWJm~4Wwk7zTNSJ`QS+ako|HRc7D{BW({i>widhLr%<#7jbYFv7G6gu zDXW|5Q<`^z%q6sjOoYK41R4jcYo<<=yD16%;EAuvXVTtzPYBC-QD}OY*6Lfkn@d8ny_FoR;o5D(4=`l~7gJpRB8%jVb%Jyg`*XHR5;XB=osYCd3rMG zNe6arHK#A^%)~;J!Jao{?`7# znrr;i)=^_3{iBQdI&rV42|I}2NflEBUaG`ygM)Zw7k^Ke6HzzXZ3Uq26Cw#R?F?jr z(K2j};jTt&;{W*&r4rP4K+z$3LJH5j$Orb4F9wKLH9aCi-5+@e8MgMXUt_^|1>>a} z-<#f9=$vO=#^?PwH#ni zH6~#HwSmr7hv8e@ed;0~LVrV{-bUKFfTyv-;&MSEvVpzvm%%&_CsT)OYV6Ww5?ub| zdREqT;3`(yyRq&G*T$je3nSl(+XLo%#*1M71we*6QYHk?U}R;Sf;7gOwSMQ2ye1@~ z5yNE{f7_hn5`>o;V-#jx9J|p+;s>ktwOSV^3#$$sJ45y3#Ow*ZRt zCc680aB|px^20B3hYn3H>b;NwXIAXok4R2wZHveEGtN{<s7DxCZG zqFOm`ls7cs5=19Bp(3u17#V)c-!-F)F(hy-E5+6eT}R21!U$9U9|TsiE;L+Wpp85V zxB<<-05t)@Epi{G0VY!s(V?hxYcGt%$3T4Je7+3`u0m?4qX~Y7s?`^)5tNtJuC!hs z{O6~GeZW(tWF}>Tnp&(glxc-(fKO#fA&YcCl1w}dH=3A@3nP6$d#xYi|K+tI5g&vro|_en_)>^0O=>WV+?PN!A&MBFiQfhBcT0(koGH>bDETX7>szFel`oCkr`u* zSR{DO+^VfR)A9)2*p(o#@;^)ern#`rLocG3)T{;^-~^qjd?2Z}*NF>5wXJ}#B|tt$ zN#G8^ZSo#!UAPt%xeF(_rh{MBe8ms@%W4s!@+EJTG?6^TISI_!ij2%mGq*f6fa!Ut zV=gj(<_qN$EpGU6%UEpucPK*UeA$WFKBrwxW?-As2@z*%YIiK>7w|TC{NWPatND~m zImXKBeAL#01JJ3La2bX*m=*0Bm#5M64cJ2AMcK9xyr$gb(8sNL@C-5xP-oR#8Ge*Y zGMzo(dG_Prf3mDIB-+rpyy;A?;qp<1RM^)I*GJUIjeR??tVor<#9Jt{=Q_Ve#kP!z z3Nj{UsFOX)S|k}GXyI|7^)g0q+{`2XSdQ5?^=?yE{K>-~b0w_Q&8DAsnmFC$?a>6= zONS+|*r*3W(hU6wJ@p!aCtcpKkxLSu(K#>0k5BluczSPxsmX}liPH`0L@|7u-AF>+ zzH9!F-QEb^FKnU15NYItx4>5GaVc1kiEN(H+%w|@?rTfV73>4+L2UK~q@&n8duE0q-!WzhFUwEGw+% zZ(P-(8@$w^R~GS?w|gQA)rhWG;yMpfbRHQPq*3PQ$yGja%`jhT)*vZk_mWJ5j4`8K zg31#_@?rXbtQST_q}IhwN{pSnZdy);WCMl}nD_9vq3udyE-&b1<4_06oGf`X5Q(@L zBmB(q1r8PtFU{=AbOLo9HW9C5vtxub;vpGEK3bydfgHpEbDy56WPBbyKLgIN(Ty`A zbJ18_PpS6(dKI+jP%DSW%eOj}4d7e~IYU|*k>mQ7{y8ILN+GR{SD~V9X(e2HCw5JV8LGTX%rI4}P#)h(1hckvcEjQp4y5YF z>iCg7ev4@bp2VCvM&}6TwAA{yeiXIx^0Pd^yiL#6L}M)sFj za?m0eBt%8rK~?M2!M@Ao(2p7QVuKeLv!9kifOq}!a)n$yG}O5)qicAe0>b;e7-0V+ z<1QNQRCmqHtI?8vJJfP^H{>+A8>L74%?0N1nO%luop#u|Z|$LkjIdoT#6?M6s zoz4&9K;^W|FybTL@-&9+o1RQ1pH^4sYJz_77D+-@&w5Hic#}w6SS5GGu-gJhNJyxS zQE6SZPP=TTgq7+aCgQ7JHz-xcup60~BoljLqkaHQ?E7&TS{qn|#IN*??|~yo<)}>v z6t&svv%u{*>0pHA@8F>$H4A^2k7Q69rFb6{YR6DY06U${hKUMa^9dMH~xi(0)e zhhd73r$V67jZdgDfWw@~R_4^M6%kZK+am1TZX2Ht4nU z5|yy_i<}>wRkIC^xD}UfI72{^R9(eRP=ayFP97l{$ay&i^+BV5Q4IxxS{-G~yunrP z$<*=P{sS0i!lB0`jUR250U2fLDjkq$cTaveo0~;=yPngI*I50P?K7)0*RmGavcOCB zI@Ev3Yf;edQgrKvVyUVC&9dveEW2qR^&wve-uOcY&p-1MpzkBQ9P|3Dox9F(_9`Sn8WlqScieSxTp0~c-uv{R!14nItG}<3 zSD{~Ii9{^u9~ILtu$6~$^gG%uJ56nXiVYG~%v~0J>xK6xsk+hZJ&~;7JqWdvy*{#wm_!fur^xst3<$bcf3YkTge9lLyJ#@qFU;W~?r&Y858d%wjQ~~uFQ%0iQ=Q>>S zG)+k752IIZqBqDsw6763-@yAvEQw)9R^_z(0jug*noiVOLZI7gCsFRn}(}cSQ zHf)(aZ6#T^zS7*{Q^#FSY)#rSA|Vk%+W!m@CDt3EO3#WQOVD3c>|>r{5VL3ttuR8- z1?Ep5BxjD+?TQ&;-YdG~s(C)>ZJY|XGg8Nvczw~EWYCR0#k4#gK2q`l2xu}DGj_OQ zQ_>{!TB@gQmsk3Z?$Eo0OO4*P`pPaq+R>bfz1T!#^UIzEvxJ?skH(Hh1mJQOeC{h~ zj%Ezg3(5&Z1K1U0Fb$)>1A)n)s_zMp%b;XMq+&35*Ma4N!W@>290E~8mL4a5t~=UR1HsFr@j1U$ZAoX@_lcR-|3jkw!{j7 zBw-0k)Nm+ObX#W#Ts5l7DNK`M(Z#ur zq9E>A^sASWQL;aaD~zRK_XSj+$4Dl;5?{;yS*%KB$jTJ(c?kT<1d;$e}c z)#w$Iw;cbSp&$s9tZO?s3Q=+hzxlgS&=H;uZMG?M&Oy<&Df0{akM<2=`NDIhUD%~eP zEV~fSExxVBl}twRBM=Oew@(&I<6o;Qo&bqn#6aa~ggAg+u?Ap+K-2UNkL(OGwdp>P zHn$+1xg7BwHRaP`zgYC;>jVCX_9&xgf+}aWuVr?;KtHY2@+|~;oX&GeCTSDy(CSc^ zvkEh2BCn@LRKbUtqajLH8yOXWf;* zOB~bnzYmGi$kYU;#@p#X*6HUrRZa!Wo}dyGF{_?$_@qcVNyhpMub>E>aJfaVAzY6w zJd?P0-ModbNeX*wE#jGmz6)ptM3@U3g2mGto6X9nr$n|*wN0H#J!2;c&<9u&u` zI}Q!6xu>6s^lM06d(ukc|E&yIt|IpD%DPi2UA4h)VdECn&+YiEADgY-%H2PtDlPa^*{E691MdQeFd{`(>XLI z;VBy=(VJ{%Li7v}qih|74W&}Tl$uF0%*VlN(Uxx})7>ImN^8dyOqj_R0s3VN)4N4D z9fO)fKM#!tKLTAr&Ky=RX2E0Ba0L~e^R73%*SSaX7|`|x0O6W05FijUC;3MT>}{kd zY+&Yd_wvZNU#1ADfez%c0-Ci{u(OXF9y3tdxhZimi_-`=q;q9Tik10K;pvu>^nw$~ z$U)KPZEApzs6#52s#yD2a@G1fab^dmYeDV*HYe?yj3_K-0ltS9j1};ahHDMlyPKT! zJA)gEgJIz+vbA-(x9rhn^3)qjk*Kfb53gCE3xOQ#+D zbi>mhuxnCF@gu9Hv#>J3gS&!K&fTEAH4fASO`_Ow08B2;f`+yMs|O02sF08+ z0>)~DL*PHQeWPP^4$xPiyVM0t-f`Zr!1Lcm#THrl0-|@)w1ssw$>>(A;)y>&*SR|a z#d7?*v3Ha<+Go(u(1WHpa?s)KB5yA7|#O{dkf@? z5wd5^cqbTGXDgw$YYObG(bJXa3PkJslh~}`@js4-)L1cWx|R9r3}UV4`#4W3>rY`V zHFTaEQFbZ|Pu@x<7_^T#LRgUPE$FX&5+;=@*-5LEr+|_umPR6v=>&f^61&Ft$yK63 z+Rf>MS0nJci%2Zm8-mI^F>+!Od)_*8zetC3^KJU5TT*MlKYulQ&OZ%k5|`91N|MD@ zdVj&%N8l=|fVh_J_B?>tF3XBCDtpmd4XhYs(~yXEbF8g*)Yb*0@n~Y4e@d86(3C&u zIvLz>FyCcvf(Lw+J2rvkygme{hhrwh%MKifI%NM4{OJk z2@ePz7x+)ovfTsUq=cDq&=bBxnNX;dKyB%qX^q_&4H+HXm+Lk? zJWfne?Ffn+6dBRO-HM>?>|=@T0`3e%@C{wS2)Sj$jQ3uW8=ZK|iuL#T{EPLzn}zyU zv4}xrXVftOA2g{CQp7$1UePB5d|PEQP&=%j?yFK2ffS_3suaRJ?RQ^JQpR&i##lV- zoqwaV^^PS!fN(y?B;19#EbJ6F6;w`XbKZSEQI~bw(>#aW{3n zg*BB&?r3VzrG*%FkRq+1U=x8KVS-a_%11B^cgVb|xG6?h{v$?G3aWFvzwbfU){%dM~uUWD?>xJ9OpHI7mV(sM!wsg4ih|2>dz&{|kGLo54IC zN)!tPNn*yZ6$`g*GDORpVzS(q1XE0(e7na-D z`Z@I-&Em3}!x744kko`qN?PU%nd`FYf1c#dz2~tkR%Vh0MOkiC`U*IBntq5sdX*G>KVIioRnz-J!ePGqV?!LU<|B`mb34IH`kAJQ;H_d zIC(dSEr>V)%%uhCu+Ul z`OSMwA_ZGgDJdc^6`NDarWikJ9~)2?^5!larROM^+fLN1&OH0L+IF0Mi0-`Nm9`D^ zwB=i+>ur8=JbYp-WuUY}RF{}L zHwTsbV|{%4_jWfrVIv5vS_d!i(gW0f!YHk3@+fcU|2gL1G%GeuTHXYQ*N6X;(=Phu zc&S_dJ^LDP6Zf+!%fNPl0m-Ntv*akQtFISt*67KxwIE}4nqPF$69GiGATL)jZ19Z9 z%*a8?KE2HnUf{}aN5R8_4VE0XWSi2}e#c9Vdc+Jm+5V+*LTpYpWR-Ol?zFsezxckb zI!80wF?Zmwv6#GwHAty|r(hbC218ucSZ$!v5ALE;yQ1c)S6mknD!1n7&F|@~o*$=B zHfKlOb)a`T=P~yVSTx~mxivcaCf)?u2X1Y5d9Egtwa>HR1n0=8F63i6o)|a5HX>pT zhry>BHYbZkhBx&0(`NSBcgsH-dli+ljW|e02Kc*Fv@c0rK`CasJy1HaDLJM9Y%;PT z8f7mJc@xHJR(j&(VlW*fT<=?nL5+}f20g2BqU{7JiYy5kl@vgj#sYF zG%p*iV=S(D)sEc1b*q}EYPYVihUx7a-`sz7I@qa|Pr;Cm0P_Vfc2{Y?Y0HoHZQSF_ z!k)i13fRjtgNua0)Uz#PEYD)2j&=xB$(lmRI<)JBu-!y%#$s=Z3VLQzcOsSGPKOQn zc<182660*wq8{VPjAgd)c*f3C{T3t+IGDG{nvp#9^xYa$GT{UB$;L#FUV&TgTm1PY zXdffb{D$5*^WjXl%nt8e2c1CW6Yp5}zpXKX-~v4*Jvutm3LfRU5Uk*x(gHh7ji6F0 z6p0KHxg!1Km<_J(?;Os4TR%>aPXEfd*%fOo{(uaLE^!+g%wx7gEU3Z78eyrF(ZqomEunq3#Qfzx4N-o zo+arW0W^mXFn%p4X;zN8G;{_lD0p&QLR)CRxO9n3u8H}n=n?4(dg3=~58`pGR}N<4 zyqZ^Y)q$|x2A$%I5i5$ZNo8kq3C3R1vqiPBBIO7ooS0Xa0@f1~i+Z(aP#5-Lj88sJ z-FBO((JDUg8H%P5J}e%PUYL2cuo)f4iIwq+z}LqSxw%a+SUqw_iXy%Voky&rv5~^d zMze*L&;3^kkQg4&_kM9L@5-Lv@c&}fp2_Fh9m{a%F)kZAyWtNp@byJM*hX2212kj^zyB2>K#G- zHH)Lm1F0>`2jOIvL=L(m5Tc=%#}Jpd9DeNnJLZ7!tZ#GmW{edaCw>wJSK*n9^Usn9 zS4#?9^G6oZ=rLt$-zcXYnQd*1ddj%ihbA=Fax z#?ERQ`77*#{pl6*Wpoxml#=%Kw^PK;F6d;o`8jmuSdt;?jl6#2L0b>P^<6XUKlhh) zpm~#O^3rPUNSa_J{4cXZ3kq6Bxe!5+o)f3r3CIyl&o#!b>|n7@ByJ@jF{KwAJq>Z+ zF|?SE#Ng?MK5!EiJXKp;TIi(Sa0DXjJW90k27V(S`gWjBL;V2KTSVROW4hJb1>wr{ zb#T5*y~rMya3M=|KV{WrMqpCU52t)Flh76=p@Us8G|z{>4)*z~s_EZx4q%EhIuy^K z3?v-wb;;c0Y>g$|!o@f8$JEK|>3Ru2Xt0<|F`axT?KIUV*>nZh%0>V0*^F*^F$K~l z*2{m3a7M6SlItml$s&?E>U3JSi1jRY^YhfR>Uh#pS}ULPEpxB6i1Lr3FmI-`VR3S5 z$~bs|XGHJusc)Tz_go6#W`x`ZZwn! z^?WMIxtF)_@z|~O8Tc>F^G6-mOptKOrqJcg{n@Pfn?oovw=Q?*pexvH@~I0aA~I*$ zv*jCxoPcB+`8U|gm>r^ruGMOEQEHw}`}owOMC*q`q|(Sq&k0p;xB?DY?Do>io$|Ij zejlJ+j#M=R+h%Wtnh6!P|0{I6O=ElBy^q7&&$fn(Cbe$~`-iC9)D_J~_pPU`s3&;b z?MCnLP7*wg3;m?_*zUbc+i2qjjDWPVn}61D_t1C5x%T-P+MmQD7k|JyXvOWSvKbf^ z#^%fMgw|R2y)#|4y?e1>7P-4hIJXKX0l!L4qx3$K9B3yBO5s<#qh%ccINyx-gZ`;%^WPvP6Xo@t#g zxWR_AP{>U#X@q=Be^@QuPv%ld!yR?S_xhLIxTvOHIW=$G{CXJHrCKgb)C#)VUN@b? zQ9kYIR$JGQ?UQcaYWu^9buik@rp{r>fn9JGj zPve&YXh_O|e0d0E>2DicJ5z;KR5!%uaba3cR^ z!RG$P_79V2yjk*Z^=@D{)m&J{VR=$1eR~e2Zb2Ja=J^@QVo3D9VS9x0H)g295mk9X zbm`Ec#^u0dRg3fr`LzwjE^3}g-gk70(yU@xK;s6mmiG4yKN2hN_S2VUFS8rlXMs*< zwUS^p)(Mgr4#|E2w@GEXA$-$-4mv4_y+g5YpO3Iv9ktws5a;M?ufqcIcRHhrtPkfX zx)7;+>_xut+36x143O|L0>8z~DGufkG0;_!n%(^7zq9ZEGZykqKwc|<(Yih$W{=W( zvQcMvG7o==DCW#l@7*46*@va&iIi!&No8|bXq-ouqc_rTdF7o(REE!glPhgfpY8*qkIs+g&(TSr)$ngz#QUYjfNRcCNN zL9baK>G+2X&W&t(@KwF;3Ar1IA+!jD=Z{YxeJB|P8U~NOMB8McgT<^Ax*&t3P2e$+ zwFt29%QY2t!3#-=o)0hMg~p0{VzN%%cAH5D`LYeQh@WoQhNGWN;d~F-KPFoy-n4g$ zxWp30sED`(o6mL;@(W2w#V%PVsec2c&FK#Wm@OE&nUOZG&~XEn&5(HhzkaAi)N|Ob zp9d6>r3+4 zPSfKo*Kw-IQMi8HsuCLmZ##dZ<*vWqnO1AbXYr>wxyeG ze2K398)H&l%>%b>g{x1l58L~5Tp`kRg(nFCW)8H)wzh+`-1+o825YIwbR+q7^6)FV zZ5I98tXGBn9eqps6=M3US3f>Og>0&6Zm>RALAQg36%BVe@B2|p z_UgsKb3~ZVL79^3;?n;*4iJ*N1Mzs_8&@+>RXGQOBIerd$O+Q0PiNqHYJcc=%jk;C z9T33R9d;|_bGvwDUHK~7J39`dUbml{&R&XzXiD2(hnw`%ckk%_q!F<5;Q-Wb(bLBB z2GjdCSLo1QMHSoC40z0oXre;XAGtM$kXyvRt8s(>RD}qI^ZMxtR9s`ldhOUAIwm@T za5n{RS1Jopt~OXHJCWz^$7@M4N?2M$`%|goexpwFgav&P6_JkYgY1Kg6SgBu(VsN1 zoOgR}k-T8!WxJ2(P~?f8lR+OYVjF%$&~l9~|AZ+z^7U&48e_HjoxU?r@NS;y&i$as z|IZ|x{mIY@LIGy1fg2lE;|`*p{C+=k>ar4hKHbQ!h?n3t zs500m!b*a+&(RYxH_h1J2M9inEaYUmf?zgtJ1OZ_OgSNA6$-oG;ziKKFosja5|a@n zw+!d6pl9vwg=CzdC{B|1R+Lle1oN`QGYNFY;??8LoMH z#Z^a5YQZ59uGe)=W=zx;?8@CO%+^O{G^@ZYqwDD5L}_Oy3JQbj`FR07<8<-;F#oE~ zKd81U(*tbUT)PdnTKM+fSrV8~O&1N@=)7)hqJfz45(R)ijshoey5!!a@r2!5KQ}b|AigJ7IVcwg}vMVfxtlL{K!u8Y~AQ zypSDH!_DCMkFD19zP|Qp{YF|=n4AN4fAuG_IC!-!lEs8EF4A0 zMyF}Ww-*nx>R*tX9tqDO1N<0|(C)P#j7HlS#N}DUWP;OdT4VfugjCOsBut(IcY;PN zKQPcZ#{@=IUV1|oEN51(VaoVwo|sr{U|Om3T=vk7eA5B@cv#M5l$oI&K5<@)q47o4 zHlJQTh$z?)f=q}(IR!^-Z*L97c7+S7)=pEiY{lBpUu=3O4H)2t(g8blyg_-(R0<>u zr7~`+JJ{tcFfay~UH4!QQbW%X=kYs$PVCKLRPq7WIx`)6&`bIuHQaW=&@0f!@(%^M zeL3X8!TZhSfa5#U3Tu_X|JrNUfW0SlguR#SmL*7TI#XD)czWXUDDP^}?j;|%_i|n= zRCwXJ8o#Y(ehqCpNwZ4sf-WnUX{&Kv!wN<`4{DZ6zi8>ah~TI;P)Hs1iZw+cJ~e#7 zvi$06506PnlYLhU=A>Hpk2UH}pd>PL$!+D=P4-eF zuG`;wc04n1!0YI<{(cGlxSYONF{Fb!-}gUYRvqV{G`F9cT2(8VTqSqCzO9o&0`J{p zoic*7)x8Fgc+{Jy;_DhreYnyHEN-nH%=bdQA%)WJR-b10E-<;?!)}gnnhd$kP~BBd z3#i)@BM1i`1Ai45#~Fp)$5_Md?3#GUH-~Zcz)Fd>QFUHvv(0;?y3_XPR?q3*2T3R! z_N5(QEJUgXPsC?PWmJ3$bZ&d@Bi=;V2bRunz7+^~`?6)=?z{5sO#5zhEiY^9JaqZf zmYs%L(C~V?M$i*1wyfA*RUX;Q-Wu<@$a*80Ruv+E5_h zq(>R?B}^UY782?1o0U^ycnmXt@ngm@Ylg?mKZnhcFfn>6o*0FM7<90l#lPvALeF-A zrGq*Dd$Bt!l4ugqF?%Nu!JI!*n=`xdr6N@8JmYLkEq_liY`7mI27k4NVFU)h2j(SZ z9ez7EwRF}CG&ZdYgT3?}a#pg3Vhd!Y-iz>ga@DJSMc2VX%nN}L+SX}lZ)k;hVV^cRGhr zz5ikf8UOm<$XwcRV~fI|4TYRl% z{~734?wmY$tf;k$miEgC=A|!MI`$j0r`3SSwBMK7hrxq{be3k=(nd}1&IkxBNbb<; zw&JOfhc4xIcy#E-Bs@FrM&#>6_uSc=#Tb(M<2`gZTR-czbeb_NRC=_79H9SfOwRD_ zOi+7@c4U@j3XTP8-ntd2KbG`!v|?e_}hds5vTs65*l(CcStHW{yn!w~U-X&kgd1014Dyu%~4O^!*Io7V{OR6n1q#4vo%fHd(b${l#q zOUlH@j-K(lV$8^C>W=s#C5?-W2guAZJ=L#^GMg?p{>?d6AR&g~iCU_O@^h-YO_`>& z3szp9Kz}=7uGdme&YSD@6K7|e)XR%TOL_px$=lvXPs}Wwl*{s_-{GxzFJlvh@tmtF z1Km!I9})gx-ZMptc^nX|t#9e9!>?KICu>^38ZwHy62{Hy(zDak3L7CY$9BwSup>Ps z9x))g5o88V?ZlfcvUUce+8)C!Ps#a$qM9pz$Znxnf7(z->qnwiEf{&j6ShAEQl5&q zW4&uq$66kP+UPzBY(46=no2gV+qW1@B&5J}c3INw!>JmoYzhuY!>VSMKS5az-WXr# zcuVPJU{ej?q9x-MZB8$n!SgA}eZ)9?#P+eT$-@REXug9Efs6sD8wFmQc>sq4!?S7|Y$0r{Z(Zm9f!#pf_R zZ53xbJ{grNvIXx8Rw)%$RZ;iPqDL8WyJv`jWo6UiYw-ca8e+9Cb9i+g3l2Jy@|8O+ zrwo)?_5L7IvDm|76bt^N?^$YIXsu-Z@(!^32CofjAG#hf6#XwUjOf&{oXE}$Ig0WVKPwPa;v`&)zz15fy{ zhCKC1rVZu<`1*-Qa)JASs@9w#*F_WIDm4ekVaegwJ!uKWkb~eo9TA}U9k+&tgx)hf zVSBlc!`l%i>?ee0%_dE%w0F4Oi*}6nO|KI^*}nXv^G)f(n%da#LCH@G@)<2+X$zY+ z!}d1QHp6J@iPSG(Hz-pH zc!h`$$bkR!dUi54f7(JSVLM8(d^V=`8;&ZeFXNR0|a2c2q9TSo+1G^N0 z)0h`!D3o)1wBhRw34^hQlTSa+<9ZT| zY_Q2w%@2ox-AlRxb1qQxjIT5gy-M=+W@LWuhf#-8G&)s+cKusGMQcTREBP}`3`1n) zDrA?^fvjG1MS^=io{;7R67=Ei92bK*Qb*2y5~23?By2B0V0*b8YV}u)Jhdz+Tnrlr zHNeE@L!s3N9I^ecLgj)DLU8b}E@z!DN6P}Se%tkMHOLk7Z7Yon7H08 z^plfNhvD|0?>hA#s~OC1%x1lwaQ9A{siLVFgJNd)=i0(zPRMq(zw|Hsxg~h~`psBN zSA%`zk$YgY|2)B~6x|v3CED6=GfGP%YAcHgTZ-K~HUo#KX8`6%i=wa7%c|^*8@tsS8o>in20beF~evyfWgbg{_BBahgy`)mBus=9Oyc{JD6|zG)es%57I{7pQ z=`Nd{x}`~(OnCVUP_`!0K8WR6BcGnhXDOb4)2So$fDmni>GK{Be62C0kXKsH&nJ3- ztS9`exuI#f(4t;}ag1fqD>$kSRWlCDD_HWkli%-D(Pq(O8Ph5`U1s+{M3!Q>>{GsZ zy`G!o{}MMJCT}*Uq(oc4Kp#WD+jssV&!alF%V}18CN{+j*f7KiWn^$Ge+qnB1|6}O zDAWd$QJGzqyml(ZZzVlFJ&3*=Qs@L{<%G(?8pbkQ>ce>=FAY=dV%T-s`N7QD&=eDi zgSGTW;CxQEj$b?S1eAp8w<<#rB8{C+mv@Yefw&b!Ax@7RW<#J#c+Fs(go5lNo4}41 z!JYM+#sq|x9q?$F;ui)p>oHVl6g)F=s=kk;_b3-A-3A&nsZWvxe8C&gq|NMKz3Z0i z^pn@#$7)(y{j7of1Y6;}Gv0PsjfvS-x__w42#WzpuYdsdy;=;~zJf!20{eH4e8MPq z91A7#za>)~=kPYX41sp$*hgiOB@b7EKsKWefB6NZM93X+h7arUz}NW1Ro06@nmC4} zS*hDAA6Hb2haeLytdZs*9J(n9lB}~*a-_@-%^r(A#2XpyG(3ap?hqt(WiW|T-;OZe zzR^n!jG}0sK?c+i;f_h;X4Z|N7x#Nuu4!WV;z1cPc}H1l?Zx1@(_UdoF~s;-=_k+A zV!T5Ff2Q4z(i37E2}nmz39alBt~&ZcoR948zsj1KEw@7lCdW@BP*&d!i-tyiTI9K( z6WWil+%%ktocu1CqA+!(f%3z72j-hsxK}Jl;#x;QiepgA{~7Nm&^S9Ze{8Bz%Srf- z1M0-nXPEy0vg|Ll4Fts&`RYBIh)5|yK?|c5K7Pw%s|d>?(KFaVX?6X;oM#I)G~Uu3 ze1;a7-^MSxxgU;|qv(S6NkSd^y?=M6w71fOMKbpg@Rv=b(u;Ng-c7HO10!1A&M%nm zI#%dVih4UOj6e>=Pp%kny`Bbfmkn4_bbI+S1wCSYkMOp`Gkg#D7NC7SSWJ&~n0TV~ zSkp^;F-5<=gb-ujL|AphcND)K@;SRLVo)>Ox99p6vX01&$)g6zXP?^7j6^C-gH{Td6}K#HfY28`(C=P#&;b&Gfp zkZPvobA(P;&ja&#=j&e)aijkqjh$yO98lNC^|pFg#Og#_y%Qz6D9I+m>Q+f?bb=Kn zdbf#Si4r9Vg6L&+tG6gg)Ue9xorq2z=6UCxdB45)e)@g5AI{9ZbN=Vtne%Ud11z8l z7#%6RM=|3QE+SjnGe19F3rBm+64X_MNJSBYiTsNYm3IL9?GU9iPV`-0Cw!FOwrYcX zrm61UF}n*ay`$rh^plq3fxo94YQ7Xrt~k3hM(DSmBLlek5QH0wmiU;393r2U0z&sn z_%j+rAAZZKAkc^+g1H`<57AI)JgK9j$Zch*QD{ZZ7L_M|D@(Pr$O)bL^N9r9W|pJC zF={c`lgc`x63;62LblACC*XjpBq?fXE;t*wf5aZumm8|MjcYN(u;73r(Q+$qrz(Q) z_-d;n-$6K@$c}2GNHcIHq+v@0T3X$g&y@{r3}n3+O*VSuz$NKP0QflY@%>mhEb`u< zOgrv_7Sv6BtH>7GY0C3(c+K9nyp1h5*P~~Af6YN4gXjqjEoEPbOEiLNe-Pj z%0CgT&I8#zOt3MznPm5&TP?GJXbQ*)M{p#A{f!gaO(T(N z#3hL)UX?!M0>0onOHf6;?iP)9Sy&AQG|eM*&QDAiuoy-kb8Oq@_pS@Snur*0w}r+D zR*|alqD1vkE6dQ!l6>$hPy)G7?xrsrw6)y9=1mtiJq{1Y^pfHO$}7+iA&ckTX~N_3 z(A~_QGNY0?Q^S-Cwlz8Rq#}!bQJ0COu&*MX+Xxb`V4zTjgBsgWm)j^jY}}k&SQc1h zG@SUB`S;pbUTpEIQYz<5q&cS&oGtj#{cxTe*R{YEzEf2n*1d0MB=*KHORlfcCnZ>-giXjapg(#@y%M5+nnTlUTO7VpFer(#Db3-zJ*15 z%)d(QZ&8Gc80zs;$Q8Las;0U_zQ!m0f)U#zVk-=I3_|IuAFO6BQ4Z5{<)PuRR3y!B z67(N8cEV;O8%rh3=XeQ>&kvm+43{>P9T8o-kNAlff}i~!Jk5Ovf2Frd_R6CmMVTb| zYm%ft)%kN&dvBp|F_H#zloZr8=4LMX;4U{~H7I_@d3!-EFm{Gd(ERIk%HCsttFmf& z@Zn2{eDq(6lUu!DNnfw_6KtCtXyZmEGC)AxV)&r=pa|4J0ZYNP)iQJ&Iy;-u+mP0) z4OWDFI}B1dIquvvOd)Jz1h&FzJ7`kH`X2((kD4P)e$)j^$gId;1j(G!Y&jpI&HuFr zw7ra%2Vd(V_Hsx$re{R&S-t;6l7f+qoL#dUDzc(@lwIpBq|0y6!y+yHg#U`@ z#2BYi8X(Eaaa2-)*A25$1%~SYi|H80Sp-=nE2Ou`fU4&_vhIr1VteYJd6+AM=kt4u zJk%HP|4$W*SM1Nw;m_F5Dr)!NA~wEkFeFY&_+V~=N`7@YG_IHqs&q~uo83srG-HEu z38WuvYDJnBOD%ZAXeRg=mJX~<--WZp*r*Z&guUj*iqK10(kyXK@F>CRSlWyg-do>| zd3R~s1*XCrHn5{X*FqB}RG0@p_zKo}3_O+XE0CIT#L2Qm9e^JoeJ7-@1J~fQNI22k z`yaBxBrK?5fBRlOwfw@84OIazrrDHU6xzjH!?7Pk5PcbibR6GBMkxW%1wI3Q7b_>r zs&}YntC;DJqE6BjS-AwCZ=HBI&umiOjGH zaY{o31O$1E9y$cj8{k=}Ur~A$iq>fLZc4P{TDO zgTN-Q%3MQU{Xq8Jkbyt`Xe^vIu#s6aX=%yv{Q|$Th3_WT@O@8Dvgl;uWL~DeLNtGr z7G*fURmrCddH1)+5ha)9F(sfao<*T)ac@PzF0*d~H`)Bdd%(+7pm?u-QA6xs!Z}Y# zX=d!(Xgkjw`!1gJ_#l6=1vsd;w~Gd`W*`9?xuVLPoYl77=aElKj_RDGZvXcrZ%S_M zhZC<#J!z68l%GFU04}$Qs=u^sxVO}kT&@m{Fp564O*+NmVb(RvXM4nV#`5rG%~KieV@2<>I1~OA|0c1h8VExM4@N z$QIlF_^p+30$oX*53^12-Yl~ze0Mnd5BLJ?Ib`a!R82;>Ma4cKw0q)<+vK+ z?@Tn#=w6y|nhTj5b;%^$Lc11(AN^-w=QZZI&TM)By1KjUBEyt6C^FgsZuckO*&)RF zL647PJ%YA-Z)B4RWK4PUY53BgHAtDCt;_=>DvFVhExnbi1#qNjiuJV%$&=$8rz(}K zw9(lYnBQn(7st@gyqppcu@;EDn(N77^174<_3%7lb3qw`DsAduV|+Gf&^q zm!NK$U}t!*6XTue$eZF~3$Rwd)-C$yy)5Gv`dWl@5pOTooVg%;0ty;+v9NZ(|1j(1fZ`2r^V^=) zr?oBs<^{Y&kJkn1?TWMTB`*NYo=zT+cbzv1`5q6~1V-64s5IP@*PLh|c}8NNP#Jq3 z500!>W-?NTjpR^I?qJLpe()LF`~$ujYDyTgnqJ@Z1SvmvgAv8wg24dd0)<+kEkv7bY(qrz4Dqg zV(2)WbWS$q=clwZA!f$8fND~R4@VAz&$jBOC=lI7RBj4v|FZYdHDqdOKJ=M*+!mu zItji!9n*FQNQky^Ka(v51x%E6UH`M}`Pk?B8TWJj^#)!(x7=cLQ8Gufa^|s`FOL|F zYe~u2PGxWDv4X52VTs`&u_vGg5Aax}bRfljAFDbG**~W|I=Z9_W#~5=fs$DQqvdIf zrbdVb{}e6_EE_blOBz=SGiKFB-aVpOUPqeIz8`htC*K!H z#s-hr2M~$-=`$<4nJg*QPfwxY%CCoy+kb^mR$%w&^Xn`zf5r&Md<<-6iwiDFMSo15 z9RI!FY$|X5t5W!Z_dN+Tb^qyLmQ1?;Hsw8^QcU)*`9;xzq|;5Cu^>2+q8}UKUy+vZ zZ--sLAs)_pwXt29>q?Ig)zSH@YuvhwWNqKKHj*A!)@YlUsemQ;gVoe{bfjk!-Jv&z zDJQ4n=DE~J9!6%>?}6l`y2rL}9l4F%(M<$*&}8aiV`<4guhvQ2ZER}1U(x!LrTsn7 zSv+Rb6<^|N{`2%h44cEreWUEAFjpnYwl$-6OylODZYSQ~->Yc_{HODOLS4%3IBrY0SFQUj(Hk_u^LF-aeZ;dXe_1ab>qDP!|B2SM14oC2I@8w{ox!zre(=Nmg97G7T;gOmmy-7C7tOA;>OYb3PDh9 zNo$G-z$m_ZvJ9A;qS89^?3p0JY#W3<{5{l)+*%DUI(3Hirz#Q=G;a7?W+B}$2tgy# z+*;ipGhBnO+npHF-(x!6K$x{LDCVw8bx2DuZm!SfWRyO&YQW~;e{Mt_!IR=MR$p}& zN1HOcc@8PCj5?QKV+43|26g3g6z@&N++E{yiAX{)x#2g}h8QBqc6@7PAqh%zu68D( zDHiR&2dhrPD+4mxE{7`HDnkSTRo7#t3FN<;Wi;3>dms|XS4p0g) zg$nV@xxRnY&C^y^|LCO2FRxDWd)l+?-R(QL%v8+0m@3>6=;XJV60GGqv#?tPIrlC; z*or#dxbKV#4ax|x`%6{QKyh#|OK`hU;C5UE*et5v8{h$$$|k;%p?)0XrZE;F7VYnE zsb8`=`xbV=?Q-Cz3thDO{~VJ8>!TKTZo&5jek*KxPN#!$3Ag~PaJV6}DoXdYTTlY* zQw{E_(3jEH9o#j6!QbJx zyYFY%+WOzBzTM~6>F(P{T24RVpOs{=Uz5E?KtRBjla>5}fPm-)FHfVR!ryWso*VEC z(eaCnI6}oZ#Q~hKHqnwZRa8V^gqP6~P!P!wUcIoulQ1Ir|6i6ye20Mi-*+Sggis3v zl>g161kYa{S$KM>^S^SW9Hjrlf#{Wk{C~;_(=V*66v^oD48uCU=6nYoUCFdOIEyUx1t?mWwQe(+g$9Z%&lV|`A& z5#gE;x*E0A$jAjDN&2A!{Kr9d+2hHvuju|4iGqkPOpb&{jU<`FfF679`DKck{)O@j zn&1^h2}8i!$3UWc$Wr5m$h}b1&{}K&BCRNjM*spwCj;Ra82^Qmg;^v2*LoJUX!n_% zRBg%&1#fy8Ugdw9{(oK|rHy*yTocwGhvkT&5>(((B|*g&>nJ*jh3gz286@LS{3W|0 z4y$sJLQJRY>DsXq*LC3rPV1U+dehJ`R}zoA6a1%e2C}RE4`f_s`D^KMx! zKq|D2D}*-WYsc=Eu?YKIFnpIdjdmwK>`qFArX5tvbd0d}uedBP)^c28tnUsU?34hH?AA>%8vpjw9ro)_B0G2nt$JUBPrkRM z1&wuUTV1bt+Afi#uVTPb288;BPArtugZQcRlZe>#to1G;G>xUNlXYEE-G@Hufs|WMJ8k$7YVkF&=kU+0R0+O0C?!cI+hSjJCO7aT=d} zxgQXDGW5AhUvHAp3;+E?%3FVdEMLp|uE2q^ zSW!zj|F!%1y0O!y<08t|_|wtHxbu(f+t=`l`tv=WEfe0SMh#1*O&Skv+iuGeC^>j8 zd0NZf*R|O;KIehJx)6kAXQE*x)<5FNdw$3`gGta-whhP+q4xulEir_Sv`)z4tERg?AuW@{6|mN+D*re zqK})%{nErJ2zWaf?$-uFVxjhXq#U5~Eb}K)+^@ndU>R`9l&Vn;!gXIg(tq}FJZrx( z{Y2`Xr^SFdO1@La`G8QZa-#oymwY={>0?r*?;nj`7mmQ)K|MURa#&jVJ?rW3Ppe9@ z`)XZf(S`Tj17XnkPpql$GFRGkr4oew)1r>p{gKZXDO!f>E_fbvlHE1(?G0zh6^(|?lI7shlJdX(L}J8yT>$ClTh zt`$Do)C|$@p7-D?KZ1jB=M>Wrlnghq@klU`IJ!dvej@{A3A}sCg5E2`UW{){1nzTK z(%E;jKRL1Ypt!znyX~HSyvkEZ@t6Zl@Wt(f2B0HorTW~_zT(1E^j;CRm+7hp-dd}S zCvM-D+AU=B{&hx}2n7LlV5G$`QIwDfg!!e4&Lumo1P!fY@OG>fEizinSvi{PIrTehZvYXf( zcx{7#ayUEZ)qKZQJ)=ZA)=sP?2`Iql>1 zVozE7^`C0y#JhEmqjJ<*^5cN^%?PH^EvlQQ-fMJjiurGjW7B8#2mss1ix^*Sn3(W& zbqr68$83I`K{?D&b-}gsUiT_g^SCe~5beX{GO@ zRRAfDvzT_J$6P6vf(*C4mSD@n<;Yl~rk;gej8M<{f@Nv>JYCCndMA9?yLk{+c{?%6 zv$m^o(-dtcKycpU2JVjNN70ZDXb5>4Ht!;}1=@sLKi6o>QAPUpSyB3T&a1r%WvmnL z%Y&8`=Kc)T;(n}S((o?z6pmHe)5vkS@O2r4b6au#9b!=_U z(TsvBy>^(!;3C))CLdGhT*%U?`u*qjY8k?YpWtU+=x>k``!trq(KD>HJV-n*{5Ka@ zvFC361m69WZ62HHSk3kQdQ6A#UWQ|tHMPoLb$-pvmBB@R`5BtMkKecJz^L#%* zi4ay_4_BnQhg;C%_vW1>iwtpXB9p=9kpdq!8;#ByzVCgqN#0La+1aInox&^aBv!Sy zp3BQ+DUIVM`4t0&$$FMMbZku8)E1<1(W8JPX%qj85xr~9daS){U!N10WUryfP4mRk zp3ojYQB&(>YpD}L{TB1x#<<{Fox{6W?_Lm9+^3Pk1O2|<5bsmR?DW~-Sk=2Iim+PF zRB~VIlV(A}x2f(7uZb)ud<0eW$MTKFADgt)VAVGC&)X$-JZ~Hn!73 zP<<$cLs(*0PNq+{ljp@hV%&_-8g%w{%ZVtz^TL4!&a`2K2w=_Ppaw6vkRJ?cXPuiTUGX&PLgoPQNDElwGjw>w9>mGOO(ayjI3eot>HvJbPlC- z`CRSbo*3nuxP{EB|FB8?X$TQzIz-~09~wj;KjUcfzGayC_nP<3DpRd`!np}i0eG?C zYR=ALx&rO37vPa&fWpYcv>>S*{ZpIgd~KFg_W~n<4|szKt%Sk}A2aLj488(1pCL4a zi8A|O)qe{*=kSPMZMPKAE(F~cp2y46_&lAlUond(3D?p-iV4c;3gW%2_hEnXDL3 zU_VSL@FvoWBjGpJek9lUVA}#!TEkIMP>fIne{%6(QKp}}jb|PA@#pog2}#W=y29Mm znJ$%B-1^UufiTg!E`7%_p46&BT)b{#!YOkyZK)o%tF3UlNNK|RwOa|g&%5Wyj7NOm zyc~B&hh*SgD~mijG4ZN!-iBylQ#Pa&Ds6?3;Ls9tcqC&ST|z6!ZR+9(`OWWikBe}c zKc2ZyK%^32&kuVdjd|pHDQw9i-*ymUx?z4IlAoSFnB3^!4r{*NV)n$K#XjmP49CHv z6p;kvhRp^~RggNc(s(&_IONFD)=Y0+KE|S9A=I^n_05~BpxG=aqWd097xL2cr109L zB|7sk9RZ0Rwv$y_2W$gqDGNQMRyonKGGr@*Mm;kfhTk{aQo=|`XB}QcB^tZqwU?{9eo;F2>%0m>Bi~6&kD~n`Hf8oTSJXja!=p0UaO4RVs9>J z)hyea^B`A<#9%O>xo@=3mD)7y_oNCaGKqMP0kTezEsd_v4E_`2^EbbcOODuV$r-+e zXUWdATIK65y!En^TO6m38PHC#-mUvR?Mf0mOk2@sD^HLMCX(pB!ArQW9T#9)KsTGn zq6~@<5vK!KscH3=>>zaypd-`1Chjy(*5bEk8sZ|l95z04n5;=_GgsO+<(5UJjk9}G zX9pGM!HKoz^XNxMshMTRN%sA=<2LB!MTicJ`V)h81Nf;=73OS-nHW@Gu0MAEWkX4RGW8~?!I>!!emOE z7U+gy4>Rlw66IXRBcLYr6~U79(K@a;qSl^8m8o_q>Wfin%O-Y>Ayw{wAH)_K{icD1 zSTmDJcHY&d;ix1irs1b^2pW}J4xu88i072&R8TFTv!y0qHz!&SMrFKD)AI|@L+fvm z`s$pferCY&Z4{Exde%m6i_j>ElDk~)w{>FzO9PGvizWPDRo|Apg@w7Kig=| zWu!yCgu^X*r4|BCX7Q?N_efkM(WXe#jFKSB)p!gp42DC-MWZ4PlHq+_*u_40zGZi# zHHanS0;4g~*zDe5Ootr9H}TUjzuM=uPMJq;dunPCs+D{SX9^;f9=`L)CN5TLF93%C z_mHX+8k1UjU~(CD_8K^PkRuCwnA zG3bn)N@z<)Z^S(a*TL03BCGxJ@yxeU`fbbJp%c!!B_xz2v&GH6PnJC+1e6Pk5#m&N zHM1u6Z>A5CbpHlf{masRe1|L4F3OUX5YRzEmJPvl8#w6&r-GPr88;8Kv*iMvCA=mAb$uyPQnFDI`FpVVysRATSK1M%f=WF|gJ- z5m%~THTY2=;WIO;O0+e5q*t!zz&vX=uQ77BjCHZ&MzoZ6ELWD;A_q1lzxWIi+SHUX zk%bDXxoIvdO^rYLu&Yhu5ofoI4Am2rigHcq`h>=gr}^I|50^Yf{3k}(q4jn~w6}_v&Gq)ll3j%KM!;y|10U3w^5^krsEV}&&@!mO z_P5fZp`^LH=O9<;!_hr_&(6(vIE~AY-j?@AODq3k>*7qkT01SmC*LCcq~re7VWB08(_6uCi`g?+r+7C{To{fBHx*qzOfXf?0zObP> zAkSq`u;82&y2zVAYMfYPNo7R}NoQf+r;l~OLq3lB-2NRk_v(g?5tAvrH#_9D93mp8 zPwDFqrtvIJ0*j-255Q;G0C5DB$$%xFO-eRwTp# zB7+oX1G}QGGZE%vb>OseoPfxeI zl;BbJ+9Y5QvRvsKrGu%gBAiyoEy*6pF;fdV)hUM=R8x8MD~esSC0(U#o&@>{73652rL*T@E1K!EvO)o(dK0w<=Cfmh@GZ z)Pa$+t|{~i(~@oEkD5ELNETSESHi5>5`>P+e(Ncz5`(;Yi9sPn78dKdxua=3pF9&& zEQm6#K%l_1k2L{?p;-BMc1zk-dsb|i4j zWZr)k>gGz(C0T;)erM7(G@?2P#tBki2$xR3lUt4MiJ{XNZ@@09pR0&-UF_k9A7vlG zbT_TXHJ=O_vhJzRMH#T}HTRE=SKqq{t_--8tJbGzW@r&!m+@5M<>K$+i zkdXW)Ymgx0j2d|hvLck06#mt@n90F6Xrje>-BWy(-ygFWW%}sVE&Hv^=&FZs71EG^ zccH;5i$}AE1VM}J3dX5r9zA4l3GJ~)%Cw1#`xpd?>gQ-7=E9JEg8>*FBoh^XFbQ=J z8=U?fo4$J(T_o~&piKVt+o)u4v?{NM$-^*}pC(^v{|EM*c_-7TGozpwiIHU|n>wpx zAc^@bMdT^=W^dMyu64eZ0y?iLVhv9X1iJJ$AptY&<)(L}(Ug}P5GhGvbG`EbVpw*) z4_ia%EZ-5JgI-*;V6e5UzW74(-;ZEro_7KXB{;~a@F|^AdOMHlyQE7-Tekv!egh|5 z%VBiJ`C$5WIYk=52Pq?$N^N9{b!h2_Mv7s$tsP zA7mNw`WB>HrP}~vLjk_57_o${ejVIoB!NJDDX$Rn}u@86C? zY*T@>Qo$|stx0K^xvfo_ih9bae)7S(W{B^%1vwd*78XVfbFZ3?#+6PN zdX19rRIijk30{YJB}r@x?`GFNqDT`jarL*`2d3kFE1b{{NPqk_;~qoHH0t#f&jKn` zVmq%{0L&U?{J_UC9r_McQn#-UechW$(1~g6%{MoLV*bUh%B_{W+Gp%uH7(JKtw}`a zO>VOQSLeBB?=NTBSfj?J`DOD3*0Y-0^;Oe~z_1@&cu@z2U+_8>>o~xqY{;*Sy|jeF zEo_XDG~IrOi3?|?)HvW-(D+%@cXHo1dwLkTnbT3+%v-cyb0C+g1Zo$c%_Nzkrpn-@^Axhv8S+22 zr?MIq)A=>d{3c)T#9FggMZGMfEo@5I`R}*n6l(cCYZ*u9%Y1KOX=uaF4crm7MR-%X zjwxz4ejU?eLr1<(uEYh`M6LD`@uvsqIdz;A_X==yvyqAMve?2XXUTY`Q0nxlv&%NC zo&c(@k)hr)j)T*1R&=shzCp7p|gg#vOVfd&3zTb&WVHo^D z{^u13<(b0oG+e155yonq@yNNAcj&+wJsXbK4mTwrHEaAC-l-e~8-P#QR&ZK=22O!k z@>P#}^Q7KX#v&U>?D~SeRFJ;rk3c7H!fzr#=U)E(*}AEBrV;9bwgpkCsIvk_6^y&p zXOB`2#Hh750$j{Dy2pQ{TV3o2=6w#w)4q8n90<5{%j5^klRL$GhXV1Os+V1)g5H4A z8m<83U1C4*5_B6A(QH5%n-w!D^*n&&PFgSBlp3ots+?v0de!cZkQ4%f@oG(#XA)>& zT^jS30rbvjEo|hs=0!m`$gf?`-C#%*V38_ z$Nn0LL<)GUbJ*itel?cPvE&DDGolWaNE?D_3F^vQmX~N+W9CLm^&bz1-5n6CKOkTR z<`N{V*Gr~=otPtO-TMP<)X^LgYTx8_RsSk0Axa>UD`Q=Lvq!!9@;hD9O?JrS575Ih zVEF_1@)5`cg^W3XG*G#UbL_*rN;QZrA5qwmqIfn`!kl`yOYzcAeUdnDsxy;QMX`aR zoZ6&f+|DjSmLT5bx4k@JJ+i9HEEpWYByUS8c&r!AD^AB%d;K5GOWL$Be{b6Ah6Zbl z&Eb_o?-!YiN*<_cEw@E7bno5Co#Hs>-`Bq%w8a~#nLW8WD*|Ebn^bf~ zcmSfa((lp%{yb)p<1s+Wc8cgtPxY3VI3j_Z68B4j2s|H3dz?+kPAMbwC3^MYyP4(a z=j9xE0_gE7bTWiD8B$vA5(V2{c};9{D&IXJ_GK0M&npNK%di)FS@0hP+DkwJ7sT7j zxzrQpJ+mi)!%w%mh`)SUVKZo%rU%nK4pq@a{ix6#6As>1tE%Fg+JpPfA8tiSrD~zM z)x~X23N9rLnX(Xp$zv2l@8aPA?#Q+-G8PI`SB_LrLP`Y5 z^i+OSqFjme6k%_VeM)a>&uQZ^bzU7YCN#G^YguAiX`2N$ABg%U#01~C(!$ZO+GT{L zG16OOq;t$ADyT~_ja*IbS06u4XEi{0bTA|dP#wkvml$A?1PWSV?-d|9FtDE(^56ME zj_i4?4GO^WBmq-Cz_^zLCHb9yo=A~VbC8P}QkqX_k<3XVRF$jAJoEF?+U6HF?5CWfUt!1uK*s#lVWRq@9w%4|VR1nC9pkQr2gz|*_v@C>l!5NnKc zg-wH10XfL)q*0Y2JK^o|AO`UAlbQ7}8e;ys$_e+Xy!BOYMnf?vrp}x`j+}DY8I4fU z#JIHkC{csyLYt*_wVjlpQFX;s5);{Dav@?=`J^EuiwrAVdS=D-md0V6EfUIkKqfYD zrp)TsIEa7-u5%x*16dM;(~*VNYmotINwEG;AdbM`Aar-C-cM|nBkq?9zz0h?EHbU` zDCG~^EKg`TXXdX#nvan`-~p*Q=?jP6Z{;W3fnXJGPAktK+|DtE!6gZS_#M1D62g#K@YH)lqi^abKY5pVE;Z_I zWC;48=`E*L`uAyZjy6X=^YXAb{HKT8D@R&_zr`{@ZzrbUUu1F$pU~E=Fb&nWuzSRk zu&w~(U09X2B6LL%EDrHF50cHme_}R8+tZhofcJgdlhs0^I=edScS%4+4}D3PqATVW z8bDhu2&ai+BdbVfhrS{AS2!QqK_7Z&34LU?S*(q<%A_sv(}#WPx+qa4x~7U&Q|E$VhRU0 zvC8rZ*#(h>F17%m#{iv@R4tHZ9%s3gY2kBajor-ujvvp#3K|<}^XtB(jIQgfT@vv; zuz$4Yb4tOzX*(!NPonpZp$PHmRTBJak)aW$h8@!rV=~30D8u_e7g}@gzcY~0;d;{~Hq^?+y zDVZR>K17V`*^cA<8qwy8TS+|cnJC@w9*c1}2IRdxS;b+Tx{VIUI@($b#l|JyO$w&< z?g)+Ie>sbrvjU+!5)SeiuA>q7fF=d_yvtS{n#nm4~Zl3pBspl2Yf9Hp3H9xPrPzLO#&`qwDxhSE93xuDT{jREXb)l@psZq$t+ z)MI*0p32v_2*zZ(4(9ATdIL48EAeL_7vT)1+6h!nGhCB2sbOboJgt(DhfzBMkOxuo zy{l)yQVNOhD~~Cn`-#cpXqCZ6s}U^m#%lgR5}#3Ow&e8>?FWj9J|rYGEwTk|5&jhM|9+P5oVJdz_wXw+)hVKJj}$o z1(SJYYn+fomd)Hv>{Zx_PwHWcaMa8Ko)LL7h~vJ_TcMGa* zS4G44vKfAT{l{`a7z$#+_tXOeT34>3!ROF`N3y3>~03RX zb(zERUl|i~kXZ7Ehe^na;<9Zve#bq%%S-SzBCm!zX0h=+)LhCFsI&^f$Lle-q|k0V zmvB=_ACqa0IKL1#Zl2=f5PZ2fxLijQ-be2d3Y(jyR{JMoK-nL<2fsio^`I*i2OmspSMqsoa@=c zhdE?@w`h~ar6eDmdGgT{Jb55>Nh1uehR;JS7K!4?RhsW1H<`PXC6H?mEqH8w{0fGHP_>bG1#9C;iX|3LA~Gku%P za#y$QtQ5L0{0^KclK3FZCe65rB&u~=O6Np?&Wnz`^cj$yXEy3Y6GCW{5g#AcqiW9V7^$)X~-*A(LcJB^_rie-f_1dr9_x69?1CqpA*wP9oRHFrY2Ts_j| zbEt4oCSi(h*piSvw9YC{h4mQQujQQ!bH5sLJs&i5jAb#N4fC>^I$Y#$G9J#M?^CqY zl#5(+)f@2&ZFOctSZr+WR-}Y{Co4vBD+PD~9ko_gKOYvHoaOTJCIqNxlzChPOm$ zBO4o8Lz{<%3^~dh}O)&(s zL3`4_3*S5e_^rtnF_XahU?Nj+;jPNiYmo7z2=0gLEezr25|H3;>qaTSA`M$z=oATR8sZ!k9qo)I>4Hu)*pa z^%~hgf&yo>tG}KzRE(TAE-#39(qdlK_qN~ zUY!wL)_<0TK8-U+#OZyK%s(Qn*;~5A-tT`Fb6PA5W)euH2ldx@1;|#{5~LqirDDOb zHzyH$ybxunGPMaYf0!H?ZV~bVkwA6CSU8gxb4zl^KM{|9QiJdi-?~fc{Bo?zg^sl8&#zgt?qcl%(JJ}15~KH6X~O|0mTUe4S)W1 zLx|JfF0gQ5njN8a4c=wn-Ys-yY273`|L%oRjxrBwL&WyND2JNB4b!thmyrZ!DXM1K zmZsK15=@p>K6DTCpNDbh!o=8a`*?3X4t-R`VXBP=qwYp1uhBd0GeA#Ok>~ZtqP@#b z{pEch7`tuhL6Z&&A}_!!QDuO6!m$hnDTeP4b1s(uuv#Q=>|zX_7ro+taICj*IF?G@ zSltVx5y=RSb`+65Pvw5WDjNKN!yskCd1q)}a9ojiaHJMVm)Z1xm@XAs(Qe?|KMIil zU|Z5~*p?AWwj99=7)&}G4)^-MqqEY+tVP8Sq_uALM^j2A=o2EoJE;u`jH;mF(abNM z3(jpmGAJet@y$m>MyGA=!^9@H5j&{*lmqT|8Ykv2e}P*{AdhI z9M1yx?hn<-uV$ImCWg!ym9cjp^$%UO2aa5sH>_dR~UNw$?I!)MO`r=M*+ICEYEtA2Q{Pusj}|Mzlh(I!t6Zy_Yn+ zEG`z4uBCPlv|JRmg$yogSg83T^7SWmaIc26%>H_u1M+1J-_1tO+mQa|^5O5rWt+>u z#WpDQ*HE}V4*+y9ZxI0Z;_z;t7(vk`vY$DHl2w(l8YO^2)VeL zdUv4C@xJ_krF|qTlYXy=Sbu`3gEv2}U40{mZo4E7uE;QpZp)@50MV*bTOkK(|ABFK z_VI@@6en)B$@n3Ckz+Ks3@*_{^fe3=QrduEhdV~>lb~%rluwz>UJP8cf_WL%VwT0}ITuS>zsmM^ALYs0X0!xOg5Wxr3>j!TeWz^O% z$Riz%QwDa>7*J!+&K$o%7dWu99Pz&tgu0A&M+!bU*zFOt`#aLl`lFzS;40!sN8>0BIXv37JwhY|ki>3@5)Pc-1`>W| zKqLyvbHKIrG=U0?5L9nfKpb`vg_5FyrF9nfg9$wS`iTo=xU0jqCb{lgBDdfB;WGuQ zVT|*(@)v5YgL||@OLw|rR-%&4aK~O4>?A~wLKNN*c1{>pQ*_c`9#_~6N~rK)`A@JJ zur15KgZL-4zurSWW^ZvR8={dLzUR zDfHhbyy7pQB>bP4*^&#NNDPpCrM{>O;KB|{MJIhqk$9S-uOMU&0~JZBi{8?B5Vs*2 zg*_J{PEqnAyg>(sV`ah2nxQX2{R&>L7bZoL>l@pW_QCssNYJyot=Nh$hVi?PV4LJ0 z6l;V@Un-KsFcR#vEC7k*N?I}rKnsmU<&aGM6Q)uoCkf*x$)9-nWVbz7gs393EJA!R z(QcG}+_t%{*@C$u=X{n$maa0v!Ds7FJRwh^rRMVuWdMe1aWCZ0Sh?|R1G=V(reEtb z8(^2r&V)%ZhI)v0NL_QV=l(E2cPz%Z_{7-bTDt=UWQ`!e*0%0K-Gl; zBn6UhCQ^XA8Iq6<;2c6RsWK>O9ci^c5hEQUy@g}-@oI!rsCiIFe)1hKG-ql^So+eT zKuWKgimMPwOQ1>1l-(Sntzb`WL@!F;NtHSxWGUxPs4roxR!dtzX+npYBCejsNRO+g zNGc<_tSYGZN5WUaSE^JKy~2480Lp61Gf?Z44pa=}kW1ysyvf`hsY$I$c1S#%G+{4bFrfk}zL&kW!f5nL^lF8a)aw?>Za4RdMkvVS6sMbiH_tJTHV@n38`Pld zNC`>#jjdKGaa=z`S4u@JIa}&G)7q@kEVN>^!bv8_|MO)w^?2}>;;8c$*^18U>ptT? z=|1s()2JpwAE)Ufk0w!RTxwiFcBO6jBu8M^v3OU8+J}nk*Yx$PWfuws`$dKWN_=ylSWrb{0kL`b>-Z+D=d4<6 zr>qqEO#1Kur{LTfmO4-;k$0x|g8;;FfMp|m1T|RMmW>_vZ9$yLHTXsZlP-b3EMaEwyQ${Hhz^dQ0 zCmUxFM_DF{PeFp`PwVAg`7pDt6t#P{gR*}Bfx%SrNkM};@VrqNTOUfabTJ%Y&yqm%xM&A)OVTM zHeDWoCI3ijYHje)97qgg7zhp!3B4_j%sR(CT9MrW0@$Iv#cqQH&gyv;#Q&pzcuf#c9xNZM(XE z^0fG*t=k4@0+c?Nze=8zi;ycF>Pz&T7oJ<>ui#Jn+!vn$ZrF7ja(Uajlk&%@I#%Z? z`SS=TKqYv!GxSJtnU5y2>>CpZI%aq)xc@a}5MxlZu(lBW>*r@Xe`Wv8Ql|lHiD|*l2<%Aw3VVw&uN=yxRKOjj@o-I^(N9 z?v<;ZFRwb8RW`MPM#6!4ft}}(Z}AJ{?fDrdXF+zyEtgK6$F5Cp8M`$JUGRa2&qgmC z8~1I2`w1U;B(Sjv&ll`n{vXC`qQ`+7Z_|jCn8xDcegbc{Zx&~}#SAEF%=sYknz#AK zMeEAW+q1$&)5)gqHi?m~QXC)YPjzbj@ROC3EV9kACvr7%lW|XR>wXQlga5|jGG})q zx|!a8J)}=p6$E*|blRAY4E%GLKFtR7)?27xxZ8e!cdgcd|a%dpZ)M* zPmQc<4h@?zhm30$!l#Eih6jeZi&RAoGBQE5M=i1d=S=CdBRK?Iscce}6w#pOVGOuE zA+!m(As4Y#^bf9Z8l`wpl~_)5y1T(eWLd7L=gL$6(Zb28&iCF7So5C{ds*{Wy-;ya zc*TrOZ+cj!n0yy~5%C7*b=J)cz#G#_z|d|%!|3@-$i~RSK<>ieZ0iA7^1*N-Qo#sg zJfPx2$U|O0H7sPvr;-TUC(_YS$EJiPW?g`W43nPKaHb_&Z zzOp*FX>jtv2(g~QaPmDokV!>Km{AlVD})US{kJ9&WYT;MJa{^2?807iGD>Lde`t_N zCo5t?Q=pKiOdBwgppbncq0lpIv}L|11pl`!#Q$yU|8uowG!wQ`)im=h6>*etWZs*^ zmF!Y*QkE!;CVV9eTUlqTYN2PE4C%F%e<%fJ7DfXtJgtm!BOGe+(KLNZ7fj!-Gkf^E zpbde6C^E`!nwjj-mtCj<$4X49KBTEHd0T6g0_E*lHv&7ZPP%W!wKW3B%5ROQ(vG%v z65C13nyss_zPEzoMWf zJ>(_g)P>Vr?IUJkVw(~5KawG}KbHWbo5+mhz*qvpOZbtKdThdiz0q}TM9EQbX>g~* z>QDxG0R{2IBbrGPq%iq>fV+8dLT=sUz6jMVLyG#TDwS$i661GZ`#*|Ip5*2E*sl}; za1I$0(Iub7sG*~K@HC@3?CRM`!DTTBdEk{R1%N=OZGD@X`TCs9QWXojm$Q_S3eLSq zhx+B1KejqfYv@T5BH}ut>*F$mc}>+9yw6+fo6@Wq54EZO%<*9RRwVye@2zHAzH90b zX}H>-LVJQ?d{g(R)oX$R?p9M4V^L%Xzxhem1>87osZNY}Tl{8`zT$r0u#nsu1xbTw^ABs41A=PPr-H__w>NZVbTwyz9mt0Ip2J!QRdr7~)f+XnpL(A^ zbu5yP^vrZuY7z{8Kso0X2T5;E5{87R{%|63I`3>eNs2<#r7#Y3ukloII{sJK3sZ*c zC{gii4Zsc*%rRbuT4ABdm@IREy2G1o*eZRHHR@og#PGGwsJ}c@Ygph+r$6Su#TUaC z*W?jhiXAn%;eEbb4Zlwyr(`4f<16?t&YYHS>Nrl~rU->~69Eo1lP8lVX~N_=Omiti zDE=lsm=a@Y^T|f|xt?<@)`28EZ*=ra{^R87DAkm=7lkthl0$m&sbYmx{t%^y!M!K4e|JyOj{-uV0uTzQqkU!=^Q6F2 zDa}0mg7p2vHbuqXD7)@q^U)OPj=c3ZI`3pChijp$xMK~(#1p>mWmD=BLSnOU2#Cw* z1?lK`5AGj5Hf?K_%s;9ii5SS2&&g{4U@`Pu8fH}>^mUraQ6SnYXd(sF*6X3EOu0e% z^3x-699WtaJ-cV9d<+BPk2d1-%mlt@F_Qj}AL}`LY8u1|v2LuY0O^kEVkzI5I*ALG!=e@rNHPk$4?;Tll;0$7A7nz*Fi}5f#@eyzT zO7&rTVJTAn%!r2jOHJ_iH z%HH^27GDjl3bhg1|EY<0u}3GX^xUfl9%$qY)13{M2i6FF4$42=TZNU(pX(QU1LGp=Gn zU1GM-ztgB$%nI8(Sv(nK-J8oCr2N*6kK(*2EiBN0)`eYj5!cpiWOLGtO%k`wv6wTb zAaB*Md$wqhd(wRV`3Zf22-u=;;v)9bj!hhk$jeqIh=jBnfLsd(Wd@M>9W3#z?0&qr zk`Wp#X44p0MQ>^*nq#xxS65i8FDz~VRoct%$-f>8Bk#?yn~~(3*cldJS1=E0uFqUn z|2S4WU0*PJz=={Aeay&zkK$Cjx)HQ9V2vzJ6?$~_ioD?Gd8NuR*QmbqI5t4k6hC$l z3-3G2)##W78+=M0n7A8D`r}N%UXhB^WftH%`lzn2OLb$K8d!+lzQ7jBL3s%>Q>HmV zIR}rzdvB}f29er8#dBnspM<6_IXO>Bm&m#h|1z7N^Rzunc#bl< znw`P41l$^BH(MPOrpjhXBOoADOuvg*9SorQB*l08*oi5I&5%CM8?GbBUA~VFcEK{D zaf3t0t$E$H6?+V%G91tQ2?)%O{=*Uz9BcL{`Fx>D3;KRo5E+Y(o|Rm~1IXq#Pu`5m zh@~Fpy^4%I1U*du_SvYw6`%4#g6Bt6w$oi8AEbF$52-woIrW#TFR^Ty{&Z%Pxc1Mg znPLr!r;`;|M4Q@D6r+GKHGTXY4}SPWI94SawffBSfXaSPF2_CE}+g z>$jAO+4b1L^s4FZ-JpotIWF_Ab%EvGR>1A90HVw$XSuTXX~M;#-s%DJuelcn zaI;{>cWUk0tf<=G#^8y<;sfIaR3U^1)f@}t{<31FC7>}&Y7RK$1X9H8RLSAQYbZM! z4%BdZz4+^zIh9mMtrp_PdERJRMOCpfT}8%tb8N{pJ27x+F_?n2|0zg0E_>A&&fi_ZH>advvzeAS z=;7EeCTKIaQHXWx(#|kmp9-?<5g2*DO@-)S#l4>!cqUWV6f?8UQ8CRFpM@~Xki~l; zTl~qZV@tlp8Tl=bN*7M9)bC+KmwM7kltB7hX~|9d${EkDS3QdAbfILvjQs;Cilt0x zspEs_c<~Ps9E`_t423SZ={oRk#sL(Sc|zZf+P${7n9ys69I)(W4U7i63|SXdUS7sPgI%UZ)bW02 zSaxTX;t>fvo}a{Z@%3PXT0fcxdD6YhkGc-bI|(@!Ox{O@ZZDRD0|vvxL1)jcR~O>w zK#&iqZ1=9BgR(4B>aGy&3~nlH>1?J#u3`q&TodBMA&EHI*jIxX6S6vPq!|m>(v9s} zuIjE?ANQK8bQaLEV}qW*P@}eieTAITl3>LXW`;or-0DBg&buR3OORiP>Osm14}fPV zq{W>b#0`$ZZJ${+Y_O__%Q+26EqyL@HR!>%x5OlWWDt;i(ljjTX zpuXwmQ7`PwwltM`Qc_c~sSy+53+CP%Hwh6HrDBw(i188R)^R+NI$%+p__K}q z^SMm4+D|c{;{noI;+){}JM082_Gs&Iej4iHqVBCHskX&Xc3dvj(V-#UDxy8T`(2p2aNDJIUmP#2 zUc#)`QL5D^0oCOda3UM)ZThk~V8x%Zk>(35V!bh*4?c0FWyzK)vn6myjyo?({t*W} z400-+ra8GT(p5IC&Pi?EIb3@RZqsorH=#DT0oE-s6SzX~EcE z<^p!9QO>J*hZn=LkB9N_NNqyP9ZSc#Uuylkq(V&kd!{ANLGpta6qDc)D;D~f9APSc z5fuLol*|pZ*=M_t$>+oQ%_NC{Nv`#qnZ}IGvi7K2)y&H?vWDenUBX93F_2e&hFKJ*iaNpt@Ph7;tix_Qlt8Mh0 z+9)Dkij$&xW<)n(S;zJya+c;lPH&PDPrPo`(NICcTn!vSi!SSNE5b5AGi+0=_oy|#r}DJd04FDL2e|Ipx`jphbM){QrszP77Lp0ZsKUEC)@r~$0+zqv3`M6 zZE**B)Mf);WYKr#Ahrvcn!$gHR|yDMrON`&I@)0b-V2Gye z_gE}>js8yc-6-TlXPE3rs#WieMFg9hY;m_t9+RDShv)UdoTN<}eVAD1nA>&pz+Qs& zC$CXEZ0qR1e#7uG0&?Q7g+`mus( z=C~1Ehgdy@Vt%r9;!oyUKaJmq!69trg^6p?>O_{_*L2`^Bi-06KSmrm46T+e)DyZG zy0zE1i8IYsXw_i$7?WX};J!A0&e6T4ugAUt|MDjIJ38{W!q|?1h!*AR$1A3C*hKGL zY*J-CLG(uucv0L5dtZr-+e!>oynJricN%R z?D*GT^o{y&1u>I1fAt#IOF35a_aYu z5byiyerg~RV*`b-@{W3kq5*62Y%b|v^8H|3>2^KkHBjrId?Bh+D173Zk5Mw{+|w$i z)#8{h1VM>)#ed^qsG)>%>dMZY#A2WIEg_4iv2FCKWF|rvbLg-5+Hvh{?XLIM5Y!kW zn#7}dl^q-v^>Q&Sfk=Y?vR3#_-!YCN`TatAsXP+mNL(A%86~FGR4>h8sf>T}BL{!bzn zWhq43BJbSseJrsAgSJszF!)=X!>{xy*vE+DVc!P%n#Q?>HcTmycc5y(e)rcLD>ws# zAQo$5d?Dh1&p%m6eZ4bd?skM#HV?mybDfK5$B;ds?&i$RM?Gxnc0jel^Dp^8i~adI z+JV%CixyO+Nq*gwBv}8+3!Eo6L-weBSCmU}(bQT=|nInQz;qf!q}o z&tF-0*W8E-vId zr=E>4Q?Xj&^L$gSg>>d=6qd6tOzpk59xhqhc_Ngw`KYOl2ruWVvf$NCz1MRylyH0h%XdHN96ikvRc@OD;n0#sLrai%%sMsTr|PAS-F~ zAy@WFGgdd;Sray%zoy{u>Yl{i09-Ouf)7=F6UR;{J&Tk1RTuhx*ZK5V|hU`NnWpJ9tF4XO#Ke{Iv z0slb1>3Q?o<}S&Crop&kzOoYuAvQlyThqif`ts^_Ngcdr40-A1ht=2WnW3f+t11km z*vZWUt>VVtN7_W5%A!N_rj-dlIB%8%>~23oJj`bB1)mcholZqfz>SV?Wm`+`+bL2xQoFj- z6dERU7^0o#objPM-FgQhk#|eL6=N$se zSVt>4A2NBqW+};>c!ER$vNxB@l!pP#4 z9Zy%`4<@vQs5y>Ic(dKsbP7+;eXb{Wl!kuu)9ky+j?n3Z%c`ITwgDdB$qu{P5sn?V zi{JO?o-a&;N+!1|1FLkjMA=brs#70 zy4I3wn{nA9P{Z`B*=o}8u5P-y%`hHMym;Uk`6|fS>YNQ+Wh3X%NSZ$PNx*wrGR%L# z4EQ?+`iEcOs(ka&=IBm0>C2>c@t`LQy~S1OY{fiVnwfTm zR+hE0C9(4%X(!xOz~zwKhJl>?>jUsc7ooTUHablb4HPPK4p@HjFI1fBb0I~`5O9Cz z+D*Pm-mRu!lQ%D%)+TJ|evzCvuf`8pNKMeZjN!i zzjMr%2|nl^TVY2MW~_1R%fA3<^G3RB@txPoL6DU=5eZsO| zJ_djD4nCvDeLRr!L|NqD?~{;+b%zi9yF8j>C188*zq%MFz)y9zyc4W?gt-p#Np-La zcS1w6NmNGADb|>BOyH?Huve(2De9N`!YClj(%-jddLY^gjE@OkGR;o>@sJL$A%w7s zJUOm)scrz26y?F$rb_(kB!11q=ogCJh9>d|bfE2~vXTEW_5g<8r-{l3H#GSq^BjEO z*=xruP45WXF7J@^6vdcpoq`UO^&L~FjLSxC?yVA<<jR$YdA&wCDg@f=0gEX7rS^4aO)h%B*BPQLo_)QxfIB+vNY=z zU$ym(zOYWd2^j}8=|8{<1Wz2uiZoq(WEZx-iS|Dib6mk6?84R9YTY^g|nW*VM?*Cj|rH_&d?&`i?yR+s+nY zOCCTZkU^2T>S}87Qd-qdIOzIOu^+mjpn`1MmsRkj-k$@X?GN8~Qw1NHUO zQ+yJ1u@7&+SE}cUV(0q{eICH-9U7;7;IR4lfS;SC!JzxMcyg5G;2kS|8uNpxZ*j84S+4K2GmH#|M!CC9xbI>>|PGS$W8=ZE}k&wEnEWh zL5U=Z4c>1Wce)Jd*{nZDXjY%HtUBx{wVp9Vt-sc#sut{-n)-5n-4*G)d6a6bTJ;CJ z@7FAaF0`G?PJU-;#u+0}mV4IGqY@P+U@7hFf89rPbsPdE{{jiVGvcv~IntU<$nN9# z9AQ{2y75LozCM1l`rtt%334M(?@L+v!+bhHqfH{r$!kpd=d7XLeCB}Sgte_is)+dh zLZ+SyH< zzCiCeWwv>HT0W@bw>GRG(rnOgk+nz8(0r=0JFUbzJ&nG5mjiN9-e8MkU6 zvn1zS2ph|RY2#z&l*?(v?yO!^m(ITudW5296}w1}62ce;ed zw2@-Q_4h{NAD5!v@xE27G;^DC=THB#W_HdG(41vv)=ZvRDs{W;%<(#!S}GMMXJTm! z2RpVm?;?VlsVg0*PNEM`(`|0urKMzb;z@s__lc6 zcJL~j#nr~^WKOv=@)OYvx8kUnqM+zH5x$y~kQ}K^j^lHYXXgN+Ow0%zr61WOqPHG5`fV>2u4Xki*!;+zpl|`V5tD_g8=^&s%y#j=6 zpl3v&fyU1AfnW$Yb+C#MB*8Ql0vo8Pqsc-#xK|L|fZiA}?LT;d9)cz0781t6$(!y# zzyy^J3`S@O=AZ)c{QQNB5Yo;az$xs_@gY-(fdCP?5KqTYb53l^kZ1;pFup6HLO2LI z@fqT|3^!;BF>%y_5gc|rC6FOBgChifXhe?bg_!jDJvzyGDq8fidyfTul0ARh4KTj* z98UazKA2R~Zx|9S+C-g@gFCEh{n%-3@=htDKUrDdk%*q$7mns*H%okb;9{-Ok7?%m z??d9u3f^j|!CX#pEY%3S3CvC0(e0@}i%sgwuzFHMr zwf<7V{jWS^mAdqJvXPaVzfb?sMq#eee6{ z{5z9%ujtB3vaV!jUwdbwR6fdLppu}%z`$V0%SnBLfq`Xt`+xwXw-Rn*Cb_o=*5#9| z1We5s*}+@J&RkpGLP-gR=`9U_L4YNJLHyU`?E}M-{%=|amH`I-zj8Pjm~rObiq2t*pjBw))^@)M~z)EI+%MRP?y|2;j^cXyH0T4oyfR= zWuBjoWnR;~p-=VNYbdzfc7}iAEjXd_pGSNYC)dL#MJ9O*U*VOEo8tegvEiRUnEURf zQC%1ZANQ{q{Qp#3*93XYgI)#HknlZsws}g4zMer}x^udV3JscXpwD?wZoRuAhj~2c z>q_^N$4bCUE!6FB?qhA7mmqk}+Jv=%yC+5OXlvWm-__h{c#@Vd0D_?+0`o>f9Y}UeRSSQ|$PC>?!EAFQ9cV>1}*akGq!FxwXUB?Y!sYN_Y8$ zJ?Oubh&ATXcK34{bjt4`Ex^m;7j2qr-i=P)Z0A+Zneey5+^6L|cR~YK)w}ZuQQ<34 z9!Q~pb^2`v18_$npl9Q|%e3x}r=@@=M-S2GKG9{rTgw3VJ6fYl+J}qImlMY`ipPlv zcj!F`x^*i0Is{!HE(kbC^Z(v{{NuMEsAuiTC!qGJ2lU*N!x5X`_IOy?E_xp#x*+eL z#q}`7{xWq+h3O@C2Yp?GE`4*|dJ%n&fI4~1YG^6Vy(By*iB5GMo3nrL*O2+w;^~xl z+*9Tb^R-8`{6mDddY4>vOXrFGiih94N6Ca>EF1`WKjdL_A7<1#;_chjHtEj;jO9O% zD!TeR4ZRS3mA%`*3~2S42%(sHiR-@LyWD!*WPjZ}bx!cnM=ee3x-JpmTH9gs(Al~0 z>Av$>d7Ct}+Gjdz^&6=7a1b`&`Mc;%88E%iJz?5=H zFW`3k^)KFQ-a|&-&%H;JoaaHuXPGjV;G6dDr}h>m3qA1j+c1Xiwnf2fE)6+6z~%m+ z0i#8u=a_){Ct2t|$SnZ+hPBgQ%Kl&O+U7gi5L0|z&p9W1tv-j&=A8NNovJ2ytKS7- z`sP3VV1N4Y(Qxh7el0bjWA}aS!Rw{b>+hA$Q@7gFe~_FNc{xxXXI$6|c-`|z@H;lM zv=^axO@m$m&(L>5gwS!ybY2Hgiz}!m&^c?hs zTF<6a*xH*Qy*)Aa$YiD_rsqRzf+gI z?fR|Sm&ICx#8Lw*vV~~)2@;?J=S#@_MECsw`>A8=M))g!t*3NA`_c+qLtIiz!q{Sj zMe5!K)#t@L=tG{-3bbSVsRJCU3=Jmi$nV}FKU;wAL7(%U)?QE6P9?E!9Q}^;*vk!x zs<|=EnS>BzbGr{UYDXH+{LXx?ma%^+FV1(}HhH}Ybzccp?)Ax}%&$NPjGhNNK*80} ze-pTS>kN7&958A|k?iJNC_>eE^^neV%jtG#HZm7Mc`E5-?tRy{I~##fff@8S;{4c* zDSf=_Z5+dvl`jtvC1{0#=u?AemX@jaN-(z9^V38G_?x+4Vft>( zVk)7-<6V={Q&Z*L_SD*QRzL%$eOtnT$E)8Yp`R+$&FIc8qwSEO_h$lQ0Cc7dd{e3q z_HVtZc3crX(itB?)g8^8m{f+ z;nm&yV0ig;%+-awUOHUmL?Y2O;5y-T^0|oC3&b;7v80xJ`Hc<1`)%~w(jRkef!U1&{W5VRK+7R zE{w{9FrV0C7oO~Bg&_lDQW7+Hcfrr*6L`+JDaPnZEXkRttH&06zt<4ztr@5!!~#aj zd`C);3D)u|@5rD4LU;sl){o3huHD+AH;6#3S8F^r`WrmSG7ay3<~{xN>h?^eFA69y zaa()HS<7(ehvSeLQH^$A1OY|o?DIx z%UN4%vZ9ZZ@#mDtwf)p{HJ-dA~avM<-kOIy1o$vUaYp7PzK_R2;g2Nj; zZF~vJua@C69F|ExX#InC-i$ogW#!cKxh)1=W_r)+Le>Z$QC=d3?|@iVr#`r750 zrjBU#XW{w*tE1QNY;Q|xB&f|~FKzF5Fg&PzWX*Mr8hLdyuiKk2#O`u0j&F4#jGPOR zrt4*S{6)WpDC^Q^?1{%z@VSh^EKX4U znLzslwgXrC#GV!Wx{hs;zA(A2XPS-B{Q58e$dNf}Ga7Ot`}2hUwDB|>F*h;9!-%nC zo(~kC5169&`;>}3{S|zytut-}y)ioL-XQIw%1b!-$c7_#^l+az9Z11j2G$(p!U*xQ zLV2P0-=x2dovNQoK|}57;E_u+5d}}oau>*-a7u9VM%<>j0eb2yo}SjAuQs13h;w&H zE2I4Q?Q0GXgtJ|>_FQgqw~PQIETp1lv<;X(8;CM@PG)jlwtMpdFY|j6h=z>JzNJ5^ zW6udVB-XDt^fTQsl&TY8O_YTW`+a)RUT8wSUYqYtod=&Ht$m@-d!nL*oZ)*nzCygf zSb=jCHnNCg%_`bUMi6~b^8udH0p&X=maa8Nsb6(Ni((2c$a08pWdBUrFe|cpaK=fW z;3Uk&3J^LY_0yD$Anrj{l1sYCWXfS=thv#*hN|>e?Aa0yh3<8J%J)7T3I{!z4*~xC zPIhod&vmU$jn4Vb##&?xQ5d#bDb^1>z<;4?OAJ^0sCD}E{aYrR0mu{NR%j?&skkM! z1rdD9HN^{^82-ydZ9;+&H6N(SH7kKa0XNNX+C0w&^StBSb!n=O!u@ZTAR4N-|^>5MCth zbz_-Gb^8FTLp@xf-sPxC8CCJF7+mGC0UVQNuA1yKcFeG9O4(C$F{>ww2+m$r zk6%S5@tR^LNE*{2iDBKeS?;C2IFYT8`9>`g>(laygU5%xnQHFU&7cI|ZJH<^>;e&y zYZTz%(p2{YACxXfiRPQtlC0h%_efB+DN2C~Fb9Z9svW=ULevlY)rB6XpP2xQg#%Bq z99t5r*KNloJo}5U!QCkD9m2;UnELnWtEGY`Br47oO2K7YS@L3H+Qv&b$n!-=9Lvq| ztS^%;#uwktBmDOxxM~zN2Z73X^l1LVM=a9Yd< zRHkq@qw5-vPUfvMv3;0c+`PzsdN^Kmd;0MvjKz=xTrSpGI`M^jdy@l6pq0|&Os z>oB9kChGz* ziVw|nO=Jml(XK-=k?BMV4dO1QuLeg&Nz&X&E`rwLV9#LyGGcCEr6T5#uI5Q8YlX;E zb5vB6U;_Sl`epSpDzUt0)b$CbQwAaH$_)`;)w;G>1(xWEfy`T}j8jE!1%Kk!13cZ|l@;R|=m*|_5d9IyJNPRS|8-B zOZI{;C7&U$-mOc+7x5~4*H`|!6iA`Q1Q2El8%f4wx~6c7#dX9j-#uk@Qg%;ZDeSKX zy&Xv4Jyo6W{^i}%;QK%)ch3S?@z%!51aHn#Zt5(<%UbVk8qiO;>X0U|%MKa7qP`naajB*E|e<)73uLOQX6;Ajm5f}O9$6@0jwNT&H)7- zxD{B}n34;gM5LofWbk>ApRcE1)n!Qm{=Gq!!_8!mrT9sB7*}LO4nv;#45HmXEvR;n zoi;$`cz^iiZS%!8|NMZVA~1ND{%U^9`JzDMsYv_ibbcIgEgQg7`+NRW_=7bNX8a@n z26d8K!fZEK<^9vbEAtWA{Xs@2xhu@F-E?;!0?ZYq3t z%F@vvZMB*SuW?;d1_O&`RS$#C40RXoCR-rEL>uIz;h}6RkqXOugEQFi8=qeVxpnwm zcy}4hhW?h`03zh-{fX;J`PjPh7JPn$l}OF}0|)f`nvCc8F(C|ln-t))ekGD zlAsB@5!q3{%;?JqBrn}zJjjM>5W>gK5S!nnTjJvQd^>BWdGE^Yw97{> z&mYk$ag|*;hwyUSj%@Tqb3bH0`y^U_NIu^4K*Kq|G*)d?uf9TBwC(E zNS-j2dm0#KonGv-H_kEFv{Dzi^NLKL@&WDof_7H(mbSe^tp&_by|6n2(i@F9I{PYc zk!QXnuBZ=A9H=jHjt}1P?eMwfxzwC974XTu@WP^e+?lR<|8|XlyeX|@MC5-Y#m?>m zpm&x!rSO5*{bvONft?-1P(zADo(W`1Vk~rkdYmxzH(J?%L>icL>JHkFbT7ps#zekz zuAs`41EmNiUd&^(L}54lNODh&jG^;2y!|z@^jzzVM==IOFhgWk%friA05mko>)?Y? zX3$*df10sH_PWs8!yNGGY&!hG)&-COD-Q+{4!n%1bWwHr5cWom zoB};sB?&h;a_%B`57ox`gJ(INJe3=}3*FYkKdj2`OvlH;{|YKmmCu6g_Y)$8UNQ+$ zI%E2uhg|srjU7|?{hxEXuRL&$*(8iFzxeVqFT08PV&5;xs<^!(ep3J~C}ptq`g0M~ zimk#)7bIZTB%CKvG<${qysq1WPii1!*Aff*xAC5$??~s&fY*-brSxq7X&l@}vy7p!1nWTJh740i)Rt{x?5e;gA{=$5t6i+1?h{`PmJ z)>6B0lZ)WjeDaRlrdlPu5IFxzUtwfJBr!4u5^dGMgVU(_K#k8N%Uo7H>*-CA{LT~ zQL%M&@kaJFt<`!q~Sn&J-ksu zS3AFDm*&ITQ0ep1%hkX?_Kwon)dj{!QZozZQBD!lFZ(Tj-b>)oEw{%f0{5MZ?wmDL zH)#)`xb6Y=-+P6F;}4r6k}(Hf*IriA_^1CM_>LR=EFgW_*P2H?ExG+lCIuZX8dX}=fZYP7>z(R~&6uxNC#LR_qL#V`gR=PRw2jFTVjbQ9^GuL$$+Z|v z>HkK$eX~Lxk#0<*E=Os^8{FcYTnDsM^<=}j4(0ZO)z&?3HJ*!=AB#<(A1+_rpUw8#W#RZ7OLrTnFOjWmOnNZuUp0H3z;Agk$HrI<1vR$on~N0tPe zzmLB$u?e*@mJeYVOrkKLVXW;x@$Aj@pD4s2XRoJcr$pT-jCCv~T1Tc0ky7*}J@^p) z*|&vy!>;Ax_w1?inJ7A0N`e$8Sa&N~iottoxB`S+Upvmh2@&KeR&u~INtVQg- zsS{QFSUDb?)$m0z@v9Mo$)rXymWp+q_b}cNcaz^42n$(E{EbyzFvo{rNiW4M?{L3C zk8o!hHy$Lf7)XRO(pXG(jG3wMiQjRbiY|VtDKFUQuSymmDh0pB^<1;SFbI_j zSObvBh?oO2v=l3+7RZ_lI|wB_5Gfdfq+#3uPg-zKUc8}FU{cTxi=2`1FUuErU4aKI zK&79e%Tr}-S6c$3CMdobB|VK8<2B`i6f0LS-V5oQvY+WqBc{pp?|Fel$#w7g%lRR( zuk*`j;zGkOTcY+KZIibCvA6x{NeEOGQaIVkOEI-!buVzJneQ8VP4nG~UuZh;k zZ}7eXu39Vjn7xy=)%1|Z-)`K?%IYUh>)xgky*qa58P2ED*+#}s0l_BG!m>oV_|^Eo z70T@HB8t1}vqd{*(jY%1h)5QqF;gNTsBw)ggFFy@+!LJD0Wqkt*P6<|*Wb<#@WKZCQ} zkpP~oqZ+a6d7VTPUA>Sa|2;isQLR#O@2y&WIrYdZvB>$`eEh+f6EEUSnUFM}&J@Dm zu`}b$O!lGujTk*Lys601BHs++moxUM=R63y#7v83^DX82*kHKvkQY+dB!KTJM}vZtoJe$qzgK(e^so-M67mf39Z-BZIY{ zpXHTWQ??iq_7(~}6B=lcMN6*MVK_QE<_M(-*s zww{R0<@D&fCQ2BwfARlE~^0k!bh(7R%!@NZvE-{|!_Y}qvV&>emEzvg~{hvpG? zCVe|!bLZQAMq={!(D{N4nhIGF2*eSTkKQD*BgNWP?p@W7?;uCdKGLuBhgkVRFCPAT z9=EVs(|vWD2W+EqPb!KZevGxW%~n4K{?&1-Vl?~)K?P)Qo7@|imw#N=bq|57)xhcbg30+!{UEC;Oq1tQM)kM|Hxl> zd(S&7MT~wCY)L@I9^-~pV{SR%L{*vv_pLl)yTGIj;yUxW*} zsxyvoCW=R%tksuFF41sLB1c+#W)rj!FlarZ$tC^kcaF78b5Nxr~K ztg$W<&XhEWFijK>%k|AjR1+i4H^~Zdr*V?I^yC#t8Aie2@9SnVIw-F7&559E zm%v6DpjpDeMr5Q9-Lpx-n~FXIWQO~r8qhQjDEi>MvJz->j(qk*`)IE1CDHSR&$vUW z5eQI;Kth8LRrcb<___PKGVADz|*bwayokiHYsz2u%e#OBrBq@gmCo0EOi5_u&6>z zRhbagQ3y=bS508KQ2$N^#E5bKWCy3g1lz?J8HZl)r3+eoI$L>A5sO14NQ-N$B};b> zWn%KAt}o=oP?U!4z$zfhbRa}}BFpBwK)G+>zbEcn7lB=1uBxaA5Qmb8Bu%Psl|{-F zh9n=}OcGnmIsYCdiZW65zf5k2fX4}GcWbNw&zd=Fze_fH+Psg=Kv_2~{u>8)=W<(?K{!cuY*yVbCM0IuhaVfSlE?}Jl`l!S){99JwT@f&k z9Bx@%&5657M`Xy_Kvod@%bF4F?oVFiM82UIZ_Od5OCOs+?IGK794j7-^WPAJi`c|+ z)wGE+FRQYopXH0@x;8WH)ut;xcP#e#hiASuaqqFd>jlAPa*@v@C}n(*6S*PRbwyzw z7eD7{U3jokOqBDbIenlzrU*@=ty65+mWG_aY))GwmTnM3dhF*R73>FE2y~`jCL%UY z(gL}gXw54%W6vLq$cQ`{OI{o9yGmq2W=i?Kgy7Cc-mqaq0_ zF&68F?hX;@iijxkvjr_1QQIS0wQW;-Jbs!0mY7$3l*uQ<^Qu9Fb2dSTnoqh`=UD|@ zf{#q!H6)Piy|if?nJi0wdAY`eRaCgEElXi8cRf{&eK-$q3LftYqUcnpJdzg$tTdwT zIfrbmiM~}^c_pB?pm%B_qKQpbXe=~M@sGBGazwSTt1UJ$1H13jH3zDF&d}##M>Ua8 zUPE>l_gAsdIl!$vOj}DPYJfO>#;e?LA)F133oy^GlnY;N5Lh?2VTz<77+jiJxkM1U z-0*0xk)^5!ri$doFbq{W?B2EQqMKgVQU$bu5j4)0LMC^g5(xu_ofOB`G*_x$!xDd8 zO>9pwjH|HQ11gSxYhrgAt<_lu3g}`>xflLmR!f@IAD@#DHxM18VQgndUHZT)Lx1g~ zNTg@%KvX!5@yja~)u(2NA#pSY+qj4(uR~ZA4@aMYrM6Pp3d8TXDmi%ijQV5tP4MC3 zjH+Oz@RqmMVmd|D=>Y;VZH_%)p@o%wE=6?U$i!QM7$m8-#CujtVUW1m1ABrIM*?ZkSF7vOyinzL%^#l2lv0TE6dpBEJ1~@v_Cg)&lvY<4?+YHm1toOn3HBX|?T~NGLYFL8HD+ zQays)%zBZqK{8qHY%EHaZ;o+yu&hjRl7S}RWbBzi#5lEYXE+Kr3HzPvC95>qsQ;&q z8Yfeg4eOhqed|M?>U?F2$16W%@RxK@&zMDUeLt_@tDi{TFTNd+Tk>ZHx8K z9F1RQ%bnL51oA;##WZLDeI$~TaCl1v z+IE`KeQR#^znr_rS%3Lt@t7Hv+UJUVuvRh&?^u{=PQHBQops52!mqCX!yS<{*UoQ? zhvqC~JEaL1)2D~fUpnM?|E0K7PRSF-MFFiP7~wW1e{HsAFdMDUk%@U!{jlMj2W|?E%e*M`_(1)z~n=`p+TyLT|LAoF$WkO-S! z>HSCX#C1w0cvRmHK^dcYLK{9sPEtL2FswSzB zzr>*-;KW#!;=rv#H0l)CVv)Z}hCPw-PiLS@P>$8~KQ(_df?eg-vGedE{WYYj9{EB2 z9qfwdgv_ye{6u4No&9HbGB&T9*ZqW7EB4TB6YNqIJS=t}9u}|op8L>H04WxmY5&Hv zd^@RN*wiugDsvKk7&%0nDHFcGXwr#oXVPA33+0UOq@E*(DPaStAuCDW&!G>E>bvYso-;uHN+&aH*a2azW>1J`pe+Lb> z2iMwb2dxEb1fikADju^pC)9Yo(h18gW2$cOrq~a%QfRV~bB^g&bB?o9fkxqVc3$5c zbW`mO8sIGD`rF+oQrb$~i||USndS6`_D9M~aA!cKlo-fdw2WB8dkuk7a;(q-GrKIT zVc3?)RP7{Kd?)wE#`maWh}L>MPbXkqIl`{slk^k>v?bywV^+#7E0G6hPA%yHM`5YV z^78e~*{Qs_Rp5X(J9?F%Gg{9$UE zh5C6^L;}_-i@&|F07A_mv8Ag7>J&!5U5+t&-W*LHIfcKvz%*;<;Ezq?wNw87imFN} z#W5ml--hcR6uYJ7PpS0oTxZt&7xt&mQeCx|Xk`mh=(Mpxlh*Lj*sMatwcf&$e>+*o zgH^Bt_@vU%PuR9#DuJf2#q+teCxi~~{KCksYh8j7{#*o2s1gdRjR~z@#QQqD-Ty81 zl}}XTn9cf&i3=k~ zk&rRJxa3}CA8$SWbYctin2<+Fg=->fS)(K`r?31SntUclu_?I{0getmCyMQlmcjaR z8Q@S+_VH5ukrH<_kuq-XZeNHhFzIgp5zlE&|DiYX8j&)4xCO)=`fPZ^8X`c|@nLaf zpCY9_kl#W=7UpnpNhJN7Omn%@$M!iTfnCUbVG!~A8jeHn*cp^V`T*=hP1nF$>7fxW z$Vz`i8o%g8FOC3}%s_n48Xhxvv#LeT6G*1< zl>Vi?i+|8RSz#n%T{{ZjV0a=g0`t&=QPj~6hVbBoRq;{b2K`=`keZK`g90-FXzP|( zhD`Lqd+igqF3u2%o^%$Xa`tDo{w04vSW#zbXCiy=V2T`Y6w8YI-!kTMrm)=;C#s+y zcg-L63FQD~Lu9!EvOPkaD!wGU^79sJHPKi5=w|g>VD(T_c z)AwSR;V;^=tpur8)A}oYc`jkO&u%~kPd&E#ccG1#$N}6ZY#4x z+-lf9R|l?vQ$J}D_7 zp~eH4sYwO8H%4C`ahE?3DD+KOjA!M}Dj4s45EBy$6SNVO4}@LjzNhh;R6${r2*P?F z2Jb01oEe5L|6--Y?z@2&k=7vEmOoD8h4ZfKy#@XvUO^%Hi#4#-vBvl2cFg+Qy%kKc z)Wj#W6r#KfdrLfGipVOdze#-x)_hpg6Jv3t;eQ1AUr zN8LG8@NJC39bl-mM{f-LTa{jD)6%SK(l}*}$Y^K62U1dvc8kMd#Sz%A-UWbs@T7`*?%&OdL#?Cy_eKpK0A3&-M z)*Om1P79z6o-3JET_m#mawCjXsE>~@qJ@Ap-4MHX%H0fq?(*kQ5B+P3E26~#X*nVx zpCs0GdMbp0&GIXma%1j%2p8ky+!Gd(n$fM>o z6@n?DNekOi@V)s>tWnndC|i7AHSK?BtzlmQ?(au!*IUHI3fh! zej&;knKtG|+7XfyB~3HA(I?-P>m~{iQrkI_tihD;WOfv;T%U2r4znskxiAX@>`D z9~;X#xIX@S8gSraSv?pBzn2P+>~72dJA2E+g=D{R=8EV1lHqW;B#>F5=tRKD0x^~0 z;$`#0#nGm+2C!m*X|&9#v)S@$Lzv2LuaKsna48%ac>}uPWUEtCADptmoNbFKq4v-} zVoc~DKw95&ZfTtvkm!#bHOrZY_Q5?dZ~n&Vq7Bx-Wk>xC z-0P!WT@zloNEq^5S-NIXwlQD1ZEi8>N&NMcUh;5>xgRHH* zN~p*>9`Zny?J4UcyILt1M%Ann3NFzS(Z<7~EhMxu#^%Vb<6gQn@;byALpp21<-x8h z?JESBA9T{JZc+1ic1~+cTRII(dk*&*khpyrZ^?h@g2j?OUxV~u$rUn4p`%|#F|JY^ zv-(DB&luvt1``k3W*6-cnb{Z!Ez(bM59D=P5$UYl_e8_CAN#0{m*)vWm3vDE4X3@hUnhzD_}A{^*3#2FJJ6aU zTN@R=+M}(NY;PnYchq+pnSj6~e!W6$&n5N`pbM*C0S`DZizd3jy(5muh~|lR9q(9B zSP*2<#}n_4UjXtFy_M*^9Sb)oSJPKSnkAP87RomO|#qq%}<1?8=MNRR7BHq zOaK?T5f+?x`q=j__n(3zB$J0BHscu1g~CRv`=>!I(!q5bumgbXlbDZ5NiU1Ypr{S7 z*yN?Ii3v(%lRPp{*nX@IdruvMp#7!A>0iahU67}ZcsVbR7@S2ifzLB1N@ zA$%)^_~?jia1r9@h|4IveJuY-|2ufgFFMyKazrEO1<8ITBl^7o!g2g9b^%sl#AFWd zSwkhv8>WlIc1$3ga__bc)M12{na|3NV;&sBkTS%_@?9k$9t9`#-Pf?8T2|=^ElTOLQb-Gm z#U6Uu+>9t7-^UXLUFphQJ)cv7ASYDYQdJRjYC2W%hInxGur3i!WM<4tA}u4veVDzl z1CeR6!Od87m%W(*1^9Hr0Cm7VV&R+t=~N>7$X8(0?HzXSLNI#1uP^b`azh`FS~m)k z_NvM|(`%)fXeCc6n0bl5eQL;i=bRbl#@4*C)-AeN} zfFL|RtGC|e27FNQ1##pIy$Vui%2}bW@IAK0A(Dlh?zwDa zz9iz0JrQq;$qq3j4RFl^Quu-%ZHHJlq>Kqb^Z*R|)%Im>Ryji&DIgQP2`#}4udZ^) ztJoTvEkc|vJtRy`*(N!w9X|VF%JZHhhY}!0MKdkIQOAQe{Y^XScLD+(=9Frjpvmt8 zn1|{<%};4lx|bW1qIZ+a^*lXonDhz}Jc}1p-g@`FRv((Q9u=68;sliel4b}3AC{y- zqpYP$-2R*i&U0>rVFR7M#x6Iq3@MGL%0$Tu{&@VZHLI$FAS}!T5>{l%48`olo5ypE z21G3oQHcYTT$JWJNv8=O@G-np<`ss0?mR7YBP%*xhB%?HGXoM*A8W0)OVcCd6$wUx zBkzn+@Zc8P`;m~=^i)gl>2_7r63e1y5S>Rs6$(Wt&uY=vepkvXyC!*>qBaMpZF4s%bB z@#q|U(Yr19-zm7QN>hu7Lo!(YebAsRb3{&=z^XnhA8YdFuRms_b=(2O(^$&CnU-;U z83#YgY=<=s0p~-R6ZYCY0;P;xM<4U*v7DKJ*qz@`|5WnwC2fpCKVuV7c~hMO6uiYs%qPi zC#P^(hr51TP|#FQ9Q))3nj1JHs{ZmmHjtW3vSFC~V|bv7wrvS3+m5&!+0^jdQ zbo;=ou|GxiV1&LQBJjc@&8AOT?5)bC3VDUrZK6Vu%q4^RiaF4>EzrUF6F=JCoE1&i z1_sJ=D|?RLZ?tCihIUSC>ewj`iJve2-C7{5R@alq_`|}v$cK_r!Oj;v5qfLvSdUFo zhfdv;u71!Wa9ZfU^v&bb6mL+|IG@QhoKV<)M`~JMYU6me`(64hB^q|>fFE9jd}Cp{ z=4Wi4)R6ea(4Z8xQ*<6);SxUzKJ4sJg0+&DM8vNJ-O29Wd@hSm&E{l{{!6JI%LiEy z!Bf785l1pBGVRfzEl@9kRuiq=TaN#XY(dwUlkD{C{aN<=#cQdop@<@O1 zR3E>H-5vco#_X%+m7+zSwyk50>AfxPI2m;HPLIIR+1~5z*=)c>RlvCs zr5v+oF8qfVwtJv7gQOtKm~=suu77SRXaQ3;{&ZAGRNYp=+@zjc z-55WwPyA}Jj4vI@`k*(@x1)0a^q$d7WFoV}UZXhUS{4Fk-Xy&lA`^|sr|5wByj>!w zaLm(ILO_<=z8^p8t!d>Z?D0g|$z?s}tO<*XiC>+TD`nvH>@5w!!ukL^cD7bL){V(J zgOu^}#q+z?j*ZTrYgw1sJ`PJqi-OlHOx-{1uZT-AgPe<*L-g_c4KHJG(ky4^4=oG0 z(T|#s*7S`-B{ev1YOX{pA6Rp72;ddh`u(DmQP11-qu<`9<`Ei*r@)CJ#-kG8ju)~4IuYAkNEM8%-GzEO=0DSYv{l> zUhG-SRiS-uj7k!VmZ97dfa7K(MxAG$5MYW6q_$)a{Hh6_OS z$fBdUD1OdpWezP}jRN5}cwGz-(lp&ya*jK>Dm5x%Mw|8f;NAYf z7c25cIYaTSsM4d04A|r?&_uPy-o*yp*(eb8vMiY@5CyZqUf5L7ma2{xIpGxRGgLh) z!oEZu;4Z#fy)2irGan_<96;%gGTuJ!%WqTil3b`djY)B(2)ZPmX1u+8bCKGv7>`Iz zz4+E!)7!;|mTp;b)|n^MKaS5Ge=ww3ABvD_yiUzdWap6NLt6)j#cmWGs7jtKMxusN z73~c7f!V4h-)x8Pm}9fM!wNQA8Z22l7V$s-1>pYX!Kq90juyVg?;MO|jo3`h8K6Q@ zW|g(qyWv;_(H$x>c|Ztxj`rO@L_ck{(x!l=DDp?81%-Jwa@vnf%Tn``bob&4VH+`H z-Vh`jN|oOOl8E?jn5=&W0t@%3cia&&?V&>}r9Ixk|h3CPgO*{_-EqzKz+a<(xD{ zfbxH+I_sb|8fc5-Qrw;3?ykY5I7N#~vEuHo#c7LsahKvy2u^W#r?|TWdEt9AZ{{U` zWj40i-R#|a&-oo7KEY>c2HW4zWm6uci#`g3>U zkC#cxF+vW}Iy|wr<%h_sXH-mWLehidcuF4M?7I&t{m%AV%X=SMe#+&LEbk7}eQ|e+ zt~9H&P5&Bck{-9EpIV|u#ZZ-lk+z3o7vF332PNm4Atce2cM{i~?6W8?->15QX+11_ zzJGrnx!1VdnN+=PlpbSl$ehGpmDt~W3`_!x zkJghJX`?9lRzXp!nZ<`5SmHfQgS?L!pB(Fv7p_kqoZt2Oz}JJp*wNnWEyo9Op&AP1 zCL+EfLiLD`Y!6j49AADHDPgsLz>ZhzlUJC0Of-+Khbe&d9wC>_>*j7dYdf~wnZ5%X z%uxAi8t7|myJ#AzLwbFWPJ{y>(j)|HFaRmk0 z@*z=3Y@PU=2%gBkwz!SL`$yuZ`O5@C%X$&^;Ya7f*CW;p^YTe|k3X>n>%mlTRGSfZ zmZMYuSrqp&Ulm+bO~Neuz&GF;AKgWym5;>L$4f%hBiwcl$i&ue_na_PeZG?Nq7mn+ z0pp4&ztV{agV=qVmq)A}oZ;tuza#jRB=8ld{bhz3_BU~FAnXZ}$OtOs12nRe$Ejx` zn-SwtZZ~Tg<7#x^o;aeYN!qiPZtH1&kJyZ?FIPs;Ln88OMdncT@lTg9elDc2fxd~u zcQQFdy(+J$RtTy;NVJivmqHQmWS~MTts8DY{5LML-Xxc5;PR1pBeE%p31>VpTb|I< zUZ&p&o1NQnBKU@LwH~8yDCG_@;$Ul>$&UL374=uCUpn6w6RUSM)ZIgdjNHg`WRQ=Y z?G{p|--YjJf!}6v;E{O={xhsgNsb-ExcTzjZ|JxY6njnrA+zD1e!pK96I1>XRfO7j zA}{`26%9v=SW`DzXWbD9lI@gVj{{rGd`lku$0|&{f`KWUrd}txI-;{?j>kcuyy|+E zjlg9&u|MwX97i@DFSX7~Qfhm(auXk6FM4neGMR8;l?+Qfgv}9L(Rdu#OuQ%Bl5*Pb zQ8`7@v@x+cY(D}JYXS6Z*O%eaA~Bvmp7Mp|QuZ;gco_5sOQ8fHIFH7Vg|UHUmaMjS zjl}J=?dVq?uEL;!a?%#De|fNcB$v#USW_P8PwxdaW;0-7kLyQVMT$NWk0}T5*QWC& zGXkEIQW-~9XYH5(ddR})nK;T$*1j1EVx6)iaTp#}*6=&e&4Po2g2LFR)4o~@%6;L% ziYhjb)4uo#TZW8-jvC6+6&Cv}ER`=8oZLc@Z|KS<*-}PLbo>x$E$M&m7%~?_y}Ng5 zZ5*tvAf*4Och`{l{($})1WuA&*gSPK4G{v=ra&H5S*W%zy{iJg3)Dhnql#k0%<3F7 zBXU**s4H48O@9X!esqOSS6`_o*dGN>`T%YoXEYZ=n;J#CVqqcE6GidkCg{6RC<+?t zyN;2e*U*3q#iK#!Pi-y%S!Qc|n_jEbd6Z7O0!Vpl)mKwFl$-0CU@w=IqP@K5oMGP; z+bo{mKwH+9ttRiL8>=u_TfYYUwGZ~zC7=LObiuL+L}%IakvEEl!T|B}p2*@i5F)U) zsni~H*;64#_5tIAb#sN^g(*@CzXL-doXRhl1PsZL8fsZ*K9tNNwtNBzTEVs(E%o2j zbe1SYInle#!oTmQ!)2&;K5!7}+{yyl z@se8+t0lw9>Z|TZ_wn`~jj$Kg=ECKsS5lhrrb*Ni`C5+ED%!rOdWf|=4OSnSMN*EZ zO;?OF1Z%x^IN^^ea&0bRF=*9GH51{g=QX3|F#}E{^S7z=qGHH3vfUjPR6XoEJ(ba< zdzg|N)=|=?XR(WQb-=G{=xt=PxJ!na=mgkddIa<~(C?hv$_}HqJ<#RR>ji_jc4a|} zR0qi~ZKX@ohm(tY1E9ztC41BgPAauGLl4zws-9d% zC)vwjji87e^}vZJzl)r7T1^{NYOjGHJS2VT;`^z~ zt4sT!mp#yGIe9THe4@@maXjc>U)?uo>Fuq)J-lxg5PiSu!klUdOj5;RNsH`+Fuy3? zFU6`3FzKt?z9_;Z1oc#4f{hM16cvPx;n|PE|XjxILp~Byz&IDJn`WyG|>uT zSt=RC+|x7b7w}?tQm*cRJ&RN-JraQ|F44)+4%@)xm4j!9^9S@{?5k=XGg90Z;-(av z9^y$e+-TL+XHOadN46C#^M7q7CJ>6T7Q--*xbcUn1$}UGA*5c~=d9$DVgE+1Wo5-jS zO^hDnw4p#V_H8n=qMb1h8m5L-lY=abtRj?ZK^o!9uvQ9w z=0+q=9Zzwur&Lcf=swr2y~O8s77zTdZUKU|yyW<-(3|U%YGh=##$RaozGIx??8I(M zDLgDQ*L1k}F;Cb~Ts~=QP!PwK^#v5C?Z8+wq5e5O;t#MC+gE(3WiwumV*JIoGw1}1 zr1yc<24|Dpz-4(6vpkiquOwO`XFw@N16|pcOn|yGF781q@NrTJrPA4O?Ks`Tj+EiO zggojl5a<~UfUt8i1Jo?w#G+j$G>Gt7E05~&{y=Zj)UjuEA54S>`3!a-2pQ_CS`ZR!cJr-?ewHdxGg|$44@AZ0I|Dt4U35^;>O5Y3x%;5aY8U=RYzq zvo)Uedk)1WQL z@AIyVuwOs3Q4%F9812J4!WTy^C-9VjlP2k+>@>WWUeC$;J0^ssGU|4u_8Zj5h*L(8 z_#rIBJ<0G4RKsB#66(kTx38T#5V>HTj)-i-9y=W4^3;bjx(k-Tn)LuJP-ZTo99` z?#wEC=Xy=%P_KvMyX&Nx!-EXzEm1pV|c%o%84@VpatJE=1yXg zFwk*?6w}AB2h;j5PCs$hk|(wxiG7~Ka5C^$GGkP39pFKHXhzQ)|EWRtPWO3jJFXrH zhQdG(DN_;0q;m|o&g4G7%&RM81wBSk_+mjiKB@N!w5|lVINuHuU>Bu#ovHGIBvx7t;O#H9E%>D>60!uob@kG~c}E4cb!S z@?xl^L2_z;h4@>HimK|V>I2>5plH%2TSS(BUMVVK4>3=sagb^tvn-n=nQY~cebp6% zUV=&4C6WcdLcmkTqA7APDoc&Q;m@$&D7?3*>HXB_mIh<&tb+q(8gw2}kG1YoNRhuT zqfR^M(Ve==XD(Bn>YBj&xgm(@02`!kE1^rOg%Q5WejS2YnvhrkETrb(YHU$ZN znUUlt+uI1>M`vj=wTBhZ39gZPzB>44TbB2c#%w3VK?rU$^b3=`S9HWg8#_m86}{29 z=2ZtDsx>*xaU38hX}lUf7}ulCo=P>NHZkHq0aW;ga$h zCj*hGRIC4&vVECbZ^0ejeEab_Y{-RB@jK_on-NYkg=D7Jk6@*9!nyOb!#VHWgo*~e zZzA}JvNEHhhE>kxPE*;})X!j;ip>ieK#G)skK!K})84^GCzPki>)_BH4SHq%o6qj5%H>@9JP2E9S*)LD;^L&oUlfw#u@f6!>uK?nFd3G3*oeT&bTo< zzD5};Z&Zo9AcAsz8%+?{q;1e_=*!$@hp#cz(@A9*-yc=I;}uH~41chIiuNxy~d^*O6boc>dS{Q6V= zL-3LeJc(OHQjcR%HI-a@00l}CE(`1ZCXg;U@yhZn+*KNT{#4Z}idlJ!PiO2IG@@v$ zfAVpAagjY`VIkS~HgGdFrf1qV(QKv!aHyd_z#$JNr%h%sbOi0#A_A6)b z7T67ycgZlxW1>!M`<>gTQhDIT>+VV0m^IFgm;n-sXm-S_i+zq3`>^`Z>rjkl-P+mb z<`iBNxMC(XOcxGAo|k0LTvFS=qzzWX(@`>n(fQ@G zG29m#QpA2RNSvuuqr77`I@`G}C~v>W6*pL<=1C|&(Hv+d?!!uvBZV=&0V7K%2` z{~$267>{RH?c>|(O6rAugfr`@i@IH;dr=$Sh3q0XhMR)B)dP{AhT^%%LQztTwJgLS zyt+tlzX9%?q_kjZ>J&aWPi%qh#EokHKaSqnRP~d4@g1=qncRHQ%?yeVx*kbie zaWI93k#j#@`X7P%sDBeJz{?P5jgAkl!OrmfWk}m!+@6ID$$C|OXh_QcG~0tYqYb|6 zTS3lDhkeG;AgHOs=nETVJ`sO;C#}5}0A3E5&RZe2=QTLHX563Epu4`Ae9V*28$D~- z6^tI(6N8%}JwXjs#bGS?H}=a3iTv3pR<|(OhCZB3e7<|TzGipNwwdfUB%^UI8$<~Ivnz9w zjSV#kC#!cggNito>s^E2VR-w=^9F*1YzpNrszN=<)4h}Og4?5|sJwQr<)?6+zjT=K zO;Hb@(afH26b`eXD=>Ut#~&gw&@`sLUc=NaU@xK`hKa#9>oiG^i`W5LQ6R4nm~_$j zJa<#k-N0xS4wFjPk0NLlCY(phe;;`BPC0F@$J3MWJl5Z6LlM{*$Ngx^+&^E4TU)&c^X|}PD3Ha25LaXy*%!*QoD0sU1FkM+^ z;UZCnH0OS58(&3Qc`Y8CxSCkO*bbF1YEr7gzv3?f^yO@b>eM9>b^an@I5OtxV}qm7 z>`)W=M?D{eiTh#pEf}k;iyJg6NWLd ze%B@@yt08c!1l@}s(h4lE$By=3Nh2m@>9RhXV;BbZ(nS-yG!28! z01g^$f)@U=6GEu(KQh%QyB`D#&OX797t)7&dgo;}sDd;kO&L_$=SVgl2Kt8TTj4S> zVY0EA^=y2j7)_TsBs2f|-wj-_Jc>Uvli&-Ze*(4>%7336#qM3J7L4*&c;)=Q-x|oV zvL%b>(Sk+{%B#h)|8@C$x|iLGf9GqE(d$*}zV{qEaHv7FJ3TTL4{%Jr`s8PQfl=*m z4e)2d|2H=&IWuP#<=kH!rn;$(Nsw^xt5tt|)|;;F5Rm0Pv8=TZ;lu=*4GvO#7siFy zz{nzL$gUwfQiQu$gK3p5zdlLq?@16C^EieQio*k(Jh3FkqZm%>D7Z-_S}i%uMT>7IP3!k`nLS_BKOFh<3-rSrmKhv1vI_Z zzi3y=-g%Uny3x|a%tQBmG?zjFSf0MZBt)y3gVv;XtcoI+8qgQxu|!ufr{$3I$TmS~ z1J!WTEu+mHyR5DK+FNR68%~^(KD$_I@NCv7bwY^c{6Ije=>ow0LP@Dt!|5aUU_0%( zH%l#Ki;*RZKEuAs2USCk_0SK*vvw$Qpb_TcNPp}0oxP@O?xA3RG%GUF;oC&IV;`6h6WEpC<$>`$@D^_J9=U4KXb%^$r~3u#$u;6 zoSciWVLBa5(>Msq$J5A=bX^TgYRQ22j?dfL8ps%RMkMZQ8-bt#|*@7a$ zY*K-1m}9rj6z$`8=NlusoqaFNIadR(l11CuvP5p~2)Onto7s_I;SpHJNV}AG<6d*z zb`f`U7Wl>nbK{{dJz@@vC~YO}rTNuw2htl7@u6}IB{Gv*r9CXMr1v|C&ul91rW0X7 zW9}$+?tLdxSk;!V1;>PGIZ=rq{Y~9}7BYX9xDu- zC?y?w`y#Fl;978a-)t}osLcS5>OL{&?gjq(E~f1#kTJj{vC(y6L7*v@ z$AvgoQ2aYurvFa}7%Al2fR2N_0i)dw3BZy)O-wQ}qB-IDK3T^o9Yx+1Eaif+C+F!Z z@B-dl9D6s*Rc@|t_q4aa{Zl;yFOvBvk;+M-5E=t#U8j(tw_HjsNIm!9g4TLYiGjsY z`lA7Xr;Q8oj%1I5U7eu9Ojdp~HE6ak~1VT z7H%O}g|MwB)W{qVmIsM&%gi4JE#!Z2&2{^#k6WY~rr5yTQZ{~>LM%zLZhOKnnP#+|8Aa$_64A}{zZ zxUXTNr9~hqMFF}bC^)&k_3H1w=TGVP#4UE|T}uel6D>IpOCwS>4 zj;#j}Huz>aTD9OkE3P4#soE3i*w_gL8OIU|d zN3JzGDD|0E$zDG0_x11H>N8lJ`Ff zKBY;E!3mfQXrfE~DUXLnPm}BzkCbyxNBH0`XcGUO9m}LkL6W-j-*?5QMfSYFyWhFl z=P^*z`)P6)Q?BOU0kj|!HZF04>NEvdZ;FI3E=iOK1e6909s}dgUomkDnBSnRM!`oJ zdyxVfHQ0U#JR7uBvq*EMB&eVX?{U{FAhZ<-_m8A5bFP!j+`Xb=kuF278g1517gFa$ zx9bDzey{%XN-F5P7;=>)@F!)RX)*|VWiK2rt|Y8jnznZFL+pi&BwJ5nT1gt09SwAy zib<8CYH4|a`nL#)hu9UhkO8?9BX|n%MPn;m%CKPI+Od(&+;|7Fnsm68J~tC(L6X-1 zwv+dzIsa2)w7+~bP&NptIoz3mWve6=yqg1MM_e&p@uNafc|&Q-M)g33-A8>LhyQSb zL2+eH;`m*psNCeTFMp-=2adyX(~6apcNoTgsPiJ=s!OoYB}=8jd-K z%Du#XYT5>z9Js!EwV_=Rrv8XxZ73gyC*nkTfEw%2>=g@FS4@=d0l2xmTHCtcvgT@AB&)M7Om9@;Uen;{}-^H4~w8 zWo~EugDOL}AoP>pT7#HWhJFHdlU`Ciw=D^qa>#>QBF7j%6_w_266~^0={hP18SdiP z`PhyHCZxP*N~v?YH(@Sx?Q49zRrB3xQ9TSRs5g5#0xNrBZ;a3JJNWB+keG(RP=Tjp zVX`?v3EJ0Csy)G(AAZ0Dhk?+OQPh#@MsaBPKLIZWsqVu?w9?WXC))2iI`b4}=7qSWgHyizu$eDPElC}WS>y7kw6>(D zDvUOR8%o^|jqFAL&8)eSOtDbbF%wwMW&5Ue5nO!B94zwZ|0wl#a5R)>+ z;ZS(&)*hvPjYRk%G7Y$8r18KGr^|#&_2zogfnh!gs}K&0Y*~$Nr$Lf})nCJ4wWeh; z{3$o5uLt9!6o$G$yb-#Owm#`tfp!&C%KSYTBttuUOMea=<@Gi+qJ8K)jSeeyy?@Vk z`10&9+V*L&M`{J*RKJ&rRiZyevV9~~^FEd)-)Dah$Ip;M#%J7~L9;)(2`i%Gc?>Wx z^u-lLcxebnmmIMxEt=Mv+{<|3{{bgvEMlw~YLe=YZ~{-`73qMB*Af`P^NfT@wn7Tcc=&mo;D0kwq_ zhFY%IZpQSRIQw!wk^lv2>94g3C+jFy`??m{9L8KLm$^@leR;xoDOyu{UV}{(#udva zCC}fV`Jjn#`n1oXqRf@LzVGv7rAg8o`=21#k$j;b#v`-`bi8hnO-_FOon-nNhC?&I z6$Fz#2X6cv?K1b*m)~po1Wup;6i5iQjG5@>Ikw>oeHV!5L%i4a2xhJ}O%)HNE_0(DIdSk~TfCfC zpBcY2b0t`|{KNs z6Vzu1kgv>UzNKb1k=~lLoA|N#l@sEDF+VFtYNymU-rxI&1rcMq77b>=w$nN((13hJ)R7Q~v!hGvGu5PdX{*MzO`r_;3 zzneGWbtJ@vlO23TOyRmK^ABlvm6$A#E5GDXW0C0?1J4NUT%Tf_!tNTL*6r@LGl1k8 zoehdd#s)-*ug6(cxczK8t>uK{g@@~fZ@7VdOM7mdBm#rkuVyQ+Woe0){4UJq$Y?>FY+()YC?9^QoW|#9T>l|Jb zozvO#;yjUZwTW2xV~ipzHGN8agvS2x8lh6!Ikx3HuNtv`#VM}B zs>0yd;#K7TR3>sGckh=VbH@4@!R${q!%tCYS1=GPL)vml=f_Fnz4#D3)drDms5@`k z5d-3*efMigBMdx{nyTn3$4wCh_UQQ0j?;`mHq7fsgs`2ot|*vs#E9|li9ckt&HA6; zwKRy^;+fdwQU0e}?-v>c|3GDUy1VR}g9Tsom@6RI_f0PWCyL;Hq8pp7uz_OdpM5r* z&xLKedglWD&PI0ckwQ*)f)MU8wj~bM3UhVXjK0rwylB4;GWsDRhMN(Hk9$*;L?t6q z^V3Mv``gh#z}UKy)i-$JWmpgv&Bk*0!c$IKd4aWo*Ph3gU~Zl6*3T4Zkes>$bHRTf zFIcPF`=R-{uMywe6JqN96GH}}7(M=dD87&!d!W$ZhGDI(YlC7RSro4Gx~Qclr43gS zuc*{}PHFC-4Uc~)LW2L?fAcLA`bDMRW# z?VuB}0rb#EV~T*)*B87q?1o+>CneH+6ZKyj(ZV4{NFAtS!NaZe<4BuC*v5p=zaHCP zY~NqKL8@D6s{D74vIBu$GQtT?A4v(`4GQ<7l*o`AhPhx!s>Qv5*%}3tR5~=qE^=}+ zM@)U4BlF~|8MsLHeG5Rg0k&@DBE6rvypsn~0U@=^hmV`e!NXWyd7MH1!T+FwA>frf z$lZjw0L-@3h^~pgjsevGA~}alSLkVTR7|4I>mO2d-W$)1{~$13{5TsV3W7Vl33#a`0U{}&EBA{HL4nI7{ zagqT)1wTR0!*{9v(T>h(YF zG0J~bWOyAt>i0M*6`KF3$V2!I3jZx7d8Z;f7`fY8?|=^XAynj&H?k&t$S3{(1)y(O zy1NzbPoI56SfRcwf>0A6XZP8H9nhH{j^z=HCC43gX6wo>{<24QBZ=Kf0bi!W0>9sC zQyIY%wa7sOwobz0Vtq`Udb>{NRq{6%XT6o_qcwrrZ?KWoru}Tgt*q{LdKnzt7=aJH z!kq?nzHVo>RwIu3p8<^?pdaf^>n2}SsOM7t`OVr9u_yZJ@F09$)#_x;9S9C}*_`C9 zTs&%fPeGb}tTppoJR=CaBxqkm5IH8(ck!%qwZBh?fD;kz2j?eHs^bkE6N*l%n1y|U z68#@XjMw||x4r3`z5|MMJ(w`pz(g~IrOtj`kcbRY0z|fxD&cC#Q2OdSuC~Tfz)G{f zKFrPBp9M&Skzv?*A?9N+;32qeRRWLK9d-{9>Ec~f;tSL}DB$6_jLf|j%>9uUSi8+ad?df1L>&)j(4LtdliyNPD5Uc5daEahyHn~>;N znRu|E)_RV&Uveexs;=hB@%8lmU{4*hV@#zP{h#%HdAYk&hz_l>0M zk_7pIU|9#StW*5*p7R6*Rz9Qga5yzTrAh7?=Vk5vzQUX!oc#O8k5An%%0KMw1`^pK zmi#er-!p*z8oBfK972Bti_4B(Pa?4oF(uMmt-q5mjez+@H!6f@!eWeGv& zz(g%@`}%FQKb-3X3}M9l45ESz@E(HMsZNMf1Y_dA><66fS6^Y6u18YnWy@W77r!m# zzASaz{a^l(T$Bbt;}Qs`@iyPw$t!`6;&%Ctbp=Q^W7yj#tG*Dz^1^8L?Z4-K4T*8) zLxP2jQy=Zik5}6(>X+-BO&~O-wunYer)X-w*X!I3|4V{E=ll2AmTWC4wINxr8Tklb z@xbaju_dn_H-uvRQ)XZu`YadPc52{bDnCAok+%TZQ{}`{Wvm4pu{?J^Z!2GNs!I@B z$Pj0hStM*Eckz2#%7kJAv&J?il}%UsE~}#;iU}b*`}H*irqskVLce|h1Y1u;!0GKU zjI_0VR8gaXhMFL*5i`LuDU(qs6N#jmJ6gcD{WkITJW;}jJTbcQo+UMkp%B?rP}WxM z>zNz~i8X95gP58ygYu0bMyO8yPn_oD0GRzqeMFdS|UMbo(6Uq6&9TOTr&cbu|l zR^-CzT=H;72j(BnPc#l@80i>cXJ+7N=O-IooYYn$5Hy^v874}!LsX>^u=KJfV{=oT zp;3uJ`Qb>BhSkv)#rn_G9LN>MFLTDHi)qzeuTOtV=GF%7anPZ{pnv~h{()Ts%aJu| z7ZY<;T!-H!@&xXB1MC00xGX#g85(v->HzL=1F6H^4Ksyu`aJoyCOl4WoHpf4!i0oa z^P%3Nm3gQ%Dt@&A_02a1kdeN}Dz8Jw<$zu4P9kLI3#j&e18;2nfrOm>4TpgW zD_W|A<*4L3E>$iaCmKcRL87#q)yBWC;W2nJN9qu%u<2^ zr{TD4&Q@_Gi>w|X^^RXJBs49b@;0CG)}34<7YO$W0PrH75f$T88vMx|2gb+j$(b2c z_zcLjzJce_wdmKj{v6RX3z+Q1G)w>T0W^6g2_H+C*>{I}Uq_rav7@i_+r^pEfaoc0 z@7C1y*u2qY4&Nf;LSD*WN$y%`vsbt3xcA;3zJ4ew{$7Iz?rYy$ZU5~9_FV%{CwC9` z0eczbnCtCr_2kwn@u+f!LR7&c$EU6?GqqvVfbsHU)yA0daNAARfi(CIM7&aGJ^|H= z%9i4M`1dht%<9NU2f34$)F?(N+3?eSwALGuI zp?O`@YumAU!A(53XXwXkcKXdJuaNzuZ>2V(a&^9YRv}#rs8L|}<4_G5CE}^B_ESzG zwXA2Sh0K;utyMSZ*6DNUN=$-cSVaBHY2>gM(633GFmfT~mAtFH*NA)h@QoS zcHB^xs(t@3CtTv=*NPrZQrwNXyW$&dUBvvP>jh9pkte5m&(^y5p>Z4TVzl~qq6K((1R%Yxf z@ELl%Sbpf3MuS|rhh1J&2{AN!x~QQy?W;o6-q^a@fAScdpzuNmX4;3a+b3}@gD|1` ze*d|Qb5t7aS8$z=_o(e;z$EW{9_bRv7U<`RR`+|it93tWu83mLZoeaV37|&~X~5H| zoo-Br1Gd{Ng7uPV*0Tam+Jd!KB5P$p9 zm<#b=lq{2S6dWLnI7Juau}yF9~{ zD+jzv@{Ui1KOo3g{)?h_o0f+Bkn4S3Jcic-gb!hu|2aRLK7aF|;@PJ0wF*J}*}-jG z5HovI92cMjn8}Yd&KyB9F;t3sI%r9!0Vc*eqbQZZ1*6y%i(r5i2j0T*Q}-z`xs8-# zO_AEP?#y7#htv0^#JjXYz5&eO=O}slJ5VN7P$@ECOI=l0f9VeXnq_y7O3NT?wXcp*uEbsoef90}ek z$^k{Wvxcc8cpk6EHEbh7zuVUn*hfvCRF{`LfBBx12ncb8 zr$b8PRQm8DgxQDWqzXi6lYzmAmWrEbNGQAKIKBgux`0aEDX0wGBmw)R$>PykwOZIn z896d=spyB)GQkds`&jI$`;*e<N4?*M#I#R$%ii!%4W!v|~ky;_8NJA+tPwl?tMJ68spZV*RzkcO5o|M4$mf zX4UM!3g-pmbrWN+HQ-k^^mN+(E0NvLxdXrVoGK2XNt*OwT?Guy;J;utgcIlODvVGk z0u)ggXKunOg8M@!9op=nkC?i41hoBf zZ8RuY|0xvO%wxk$gi^$P74FMJggO^8ZCDtgl_d)M)Lj13~e%Q-K<<%jz-l)XrZNu zxJ2rE-|-*c#qD9u>988(aqf*WrF@qBB=Ah6#};q|S>AV=?zDa2*de9F3By zy{SvqB(`4iTvTvy&0M*GtHp}*y>5Gp4V~5DSso5B}$^7M{7+5Xz(LxEtM-#_URs}i|WXM+I-;c^`IV!K9 zbL4*Il2%neS^j~70%uvpqf#V%WP79`Qo7S76!!ZZp4of4#+M%-(4iA12KEj#g&CR~ z9sO4vc;!rH6B&$=45}XrItMedbANpsCq*2`)q{mo)JP>fy+0Vc<<3Vt*NT}f*G*k`{By4;R0zzLu!X{E zR{6`I^>|ShTSACHyOA5t&_?l99@C;i1*si>k=VC;$e45A(sz)#5wWbImWuqkr&L-f zO555EDCkrPgQ8#w*Fm0kz193^A1vwY*vGTwPCrCV)F zZT_l@9x5DiUR0|LrY=Kah~iVBHv`6?mv}rQ#0I+O+n?(sgn#n)?`*iAl$vQx`+EmZ?8e40=&dJZ*3 zn1=-&$YhQH`Y5yfH<(WXO)Ni4J6Zy@G!>4E=QK1dFZ*hStu6`9CHQ#?Qwb~rt2FV` zE1K$t;So_n6U6>X1z?5}xl9Z~tAR-F=61YJL-8R$A#P+d9Gp|K#B!?yS9S>KD7NbjeYn-VcmFoIJL(w4%hM`oLhn{y0eT=VIwT`e@ zIH~RtViUR(YnVJ>l9Q+n8!6@R22#$8vP-#9$$R3pBXA_(P-8n_K@8~M@H|RmBT?{Q z-|o&R%A9EtU^(c`MobrLO}o)H5e$N1Yd1gGSx#WJD2e%(s}Gy6Ql@`Y_r@#xK_0QcT*o|U}9n-tLYao5C8zcTBS@RA)Hlz2J~>oTemcVEo=j} zZf|eB0s|))rS~j>K;WJ;_jXU(jmR%b3|A^-VKEVr!Z>3iqfZ3ac!$I)ew$P)*wPV@ zw|vBND9<==ohK?G6g5nhCKd>JvXuUk3Eop%Utiy|%Cg|+=NE?Q%KP>46L8{73d+Y8GP?gqFH(FRJ45K8! z;o^`%pW#d?Q5JBDOnoUhz4@%bzQ1c^M90Ns528sFf8wg}2>$8#`&Y?I{Li(t8x>rP zs=VB#CSzpgH?GTdX6ChosgXLF(9mc?l7X7MuY76P==iS3)r&#ZwZdNU2g9=@gOB5z zY7)!?h_YlO*5Nv#1lV#|co>u0rSI(HxXORXzdr5$vpMJeK}C_Q|`#MznwSEPn_+T@1gpJLQBthWpkXdWC2 zuT#+n1qEySQCdQiY#!Ld+vn7lS%i&r2DyDA*sM#x{{_dGuVp4}@(J!RGRjg=-oKhkyL@*z#FPrUDEW8*(Z zl|IKpO>RGiTiF@cQ#5a=sgftZw4}_Vq7b=U z?SAdD>a*_c^46||B5f`#Pt~A`DdN+C&4PFWV+38BbVXZBfv$*Y$x z-nV{1fFc$|_yAtGI`u*mMroxS4dQ zQhl3~H8n@pTBHADde9dRssb$Z*M##EX&=!Z2^w?gUs8GQ9|dN}$^e;qQzbMAn{?^9 z;A!ZPd>F<&-%kU>o6uU!~ za@TnEgN<+IYdX-U8)WCc>KPlW8?Q#_t+IgYw|bB|y6y2i4~rK*hZY8|I-UPasCzjh z$22d>@18iGp_C?Z{mm{F!sSCO`wmY^A?%4=bezJJ}{z?id1fu;2s?}z`rj}hhH`w zW0~2t4{ic2ea<7B|DWBoofNhLsB#8~bH*t4o>&I=oVh?%bMGo=wvw&oA9G(pmCD_m R=aU$Kz|+;wWt~$(69Djz*0KNq literal 39205 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 LNkvXXu0mjfeZ-MY diff --git a/tests/_ref/typography/typography-layout-words.png b/tests/_ref/typography/typography-layout-words.png index 907515e059fee8bd32c1fe808883174f16ec4f6b..75cdf49b8a6682b187779f2c1dc68b51e16c85a2 100644 GIT binary patch literal 21666 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 diff --git a/tests/_ref/typography/typography-styles-font.png b/tests/_ref/typography/typography-styles-font.png index c0de410c58391339268cdad08db352d91106ce6f..080c28662dfec96fa56206fd7d62ca95d86c6352 100644 GIT binary patch literal 12417 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 MMn$?@(lqeD0XoNm0{{R3 literal 15710 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 z�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 OKwMZxs7gRD;C}(eZ>e?w diff --git a/tests/_ref/typography/typography-styles-named.png b/tests/_ref/typography/typography-styles-named.png index 897be1a5fa820e5bdce7ca51f939b44ea90f1bc0..2fa439bb310447c8f5afb4c13360dcbe5a4766de 100644 GIT binary patch literal 16562 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 QuX!ZgT~RL0&e+_40a#Gi*#H0l diff --git a/tests/drawing.py b/tests/drawing.py index 1d0dbe1..3d01bb3 100644 --- a/tests/drawing.py +++ b/tests/drawing.py @@ -8,7 +8,7 @@ class DrawingTests(PlotDeviceTestCase): def test_paths_transform_pre(self): # tut/Bezier_Paths (1) size(180, 180) - font("Dolly", "bold", 300) + font("Rockwell", "bold", 280) path = textpath("e", 10, 150) bezier(path, stroke='black', fill=None) @@ -16,7 +16,7 @@ def test_paths_transform_pre(self): def test_paths_transform_post(self): # tut/Bezier_Paths (2) size(180, 180) - font("Dolly", "bold", 300) + font("Rockwell", "bold", 280) path = textpath("e", 10, 150) curves = [] for curve in path: @@ -30,7 +30,7 @@ def test_paths_transform_post(self): def test_paths_broken(self): # tut/Bezier_Paths (3) size(334, 87) - font("Dolly", "bold", 100) + font("Rockwell", "bold", 90) path = textpath("broken", 0,80) curves = [] @@ -48,7 +48,7 @@ def test_paths_broken(self): def test_pathmatics_contours(self): # tut/Bezier_Paths (4) size(181, 70) - font("Dolly", "bold", 50) + font("Rockwell", "bold", 50) with pen(2), nofill(): path = textpath("@#$&!", 10, 50) for contour in path.contours: diff --git a/tests/typography.py b/tests/typography.py index 2f777dc..fa6a1dd 100644 --- a/tests/typography.py +++ b/tests/typography.py @@ -88,7 +88,7 @@ def test_typography_align_block(self): def test_typography_styles_font(self): # tut/Typography (8) size(200, 220) - font('jenson', 'medium', 22) + font('Avenir Next', 'medium', 22) text("September 1972", 20,40) font(osf=True) # old-style figures @@ -124,7 +124,7 @@ def test_typography_styles_named(self): text('handgloves', 10,70, style='emph') text('handgloves', 10,100, style='bright') - font('Joanna MT', 28) + font('Hoefler Text', 28) text('handgloves', 10,150) text('handgloves', 10,180, style='emph') text('handgloves', 10,210, style='bright') @@ -183,8 +183,8 @@ def test_typography_layout_lines(self): @reference('typography/typography-layout-fragments.png') def test_typography_layout_fragments(self): # tut/Typography (15) - size(300, 210) - font('Joanna MT', 80, italic=True) + size(380, 210) + font('Palatino', 80, italic=True) t = text(20,120, str='Axiomatic') first = t[0] @@ -213,10 +213,10 @@ def test_typography_layout_glyphs(self): @reference('typography/typography-layout-words.png') def test_typography_layout_words(self): # tut/Typography (17) - size(300, 140) + size(300, 180) rhyme = "Tinker, tailor, soldier, sailor, rich man, poor man, begger man, thief" - font('Joanna MT', 32, italic=True) + font('Palatino', 32, italic=True) t = text(20,40, 270,160, str=rhyme) nofill() @@ -250,10 +250,10 @@ def test_typography_layout_select(self): @reference('typography/typography-layout-select2.png') def test_typography_layout_select2(self): # tut/Typography (20) - size(300, 240) + size(300, 270) flaubert = "“Five hundred lines for all the class!” shouted in a furious voice stopped, like the Quos ego1, a fresh outburst. “Silence!” continued the master indignantly, wiping his brow with his handkerchief, which he had just taken from his cap. “As to you, ‘new boy,’ you will conjugate ‘ridiculus sum’2 twenty times.”\nThen, in a gentler tone, “Come, you’ll find your cap again; it hasn’t been stolen.”" - font('Adobe Jenson', 14) + font('STIX Two Text', 14) layout(hyphenate=True, indent=True) stylesheet('fn', vpos=1, fill='red') @@ -323,7 +323,7 @@ def test_typography_advanced_flow(self): size(300, 150) kafka = 'Someone must have been telling lies about Josef K., he knew he had done nothing wrong but, one morning, he was arrested. Every day at eight in the morning he was brought his breakfast by Mrs. Grubach’s cook. Mrs. Gru-bach was his landlady but today she didn’t come. That had never happened before. K. waited a little while, looked from his pillow at the old woman who lived opposite and who was watching him with an inquisitiveness quite unusual for her, and finally, both hungry and disconcerted, rang the bell. There was immediately a knock at the door and a man entered.' - font('Adobe Garamond', size=10) + font('Hoefler Text', size=10) layout(align=JUSTIFY, hyphenate=True) t = text(20,20, 120,120, str=kafka) for block in t.flow(2): @@ -335,7 +335,7 @@ def test_typography_advanced_flow2(self): size(300, 330) kafka = 'and a man entered. He had never seen the man in this house before. He was slim but firmly built, his clothes were black and close-fitting, with many folds and pockets, buckles and buttons and a belt, all of which gave the impression of being very practical but without making it very clear what they were actually for. “Who are you?” asked K., sitting half upright in his bed. The man, however, ignored the question as if his arrival simply had to be accepted, and merely replied, “You rang?” “Anna should have brought me my breakfast,” said K. He tried to work out who the man actually was, first in silence, just through observation and by thinking about it, but the man didn’t stay still to be looked at for very long. Instead he went over to the door, opened it slightly, and said to someone who was clearly standing immediately behind it, “He wants Anna to bring him his breakfast.” There was a little laughter in the neighbouring room, it was not clear from the sound of it whether there were several people laughing. The strange man could not have learned anything from it that he hadn’t known already, but now he said to K., as if making his report “It is not possible.” “It would be the first time that’s happened,” said K., as he jumped out of bed and quickly pulled on his trousers. “I want to see who that is in the next room, and why it is that Mrs. Grubach has let me be disturbed in this way.” It immediately occurred to him that he needn’t have said this out loud, and that he must to some extent have acknowledged their authority by doing so, but that ...' - font('Adobe Garamond', size=10) + font('Palatino', size=10) layout(align=JUSTIFY, hyphenate=True) def leftright(block): @@ -354,7 +354,7 @@ def test_typography_advanced_flow3(self): size(300, 240) welles = 'Before the law, there stands a guard. A man comes from the country, begging admittance to the law. But the guard cannot admit him. May he hope to enter at a later time? That is possible, said the guard. The man tries to peer through the entrance. He’d been taught that the law was to be accessible to every man. “Do not attempt to enter without my permission”, says the guard. I am very powerful. Yet I am the least of all the guards. From hall to hall, door after door, each guard is more powerful than the last. By the guard’s permission, the man sits by the side of the door, and there he waits. For years, he waits. Everything he has, he gives away in the hope of bribing the guard, who never fails to say to him “I take what you give me only so that you will not feel that you left something undone.” Keeping his watch during the long years, the man has come to know even the fleas on the guard’s fur collar. Growing childish in old age, he begs the fleas to persuade the guard to change his mind and allow him to enter. His sight has dimmed, but in the darkness he perceives a radiance streaming immortally from the door of the law. And now, before he dies, all he’s experienced condenses into one question, a question he’s never asked. He beckons the guard. Says the guard, “You are insatiable! What is it now?” Says the man, “Every man strives to attain the law. How is it then that in all these years, no one else has ever come here, seeking admittance?” His hearing has failed, so the guard yells into his ear. “Nobody else but you could ever have obtained admittance. No one else could enter this door! This door was intended only for you! And now, I’m going to close it.” This tale is told during the story called “The Trial”. It’s been said that the logic of this story is the logic of a dream... a nightmare.' - font('Adobe Garamond', size=10) + font('Hoefler Text', size=10) t = text(20,26, 80,120, str=welles) for block in t.flow(3): block.x += block.width + 10 From 6363a2a31f0c5944f7c6a8a30125761d8bbc71ed Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 15:41:59 -0400 Subject: [PATCH 21/54] fixed Text.flow() when invoked w/ callback - it was using map() which started being lazy in python3 and was failing to invoke the callback --- CHANGES.md | 1 + plotdevice/gfx/text.py | 4 ++-- .../typography/typography-advanced-flow2.png | Bin 61032 -> 50017 bytes tests/typography.py | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index effee83..e5f6105 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ PlotDevice 1.0.1 ##### Bugfixes * `ordered()` now works correctly and no longer causes the `Advanced/Sorting.pv` example to crash +* `Text.flow()` will now invoke user-provided callbacks to determine layout of multi-column runs * Command line tool now parses `{4}`-style padded number blocks in exported filenames correctly * Silenced a console error by fixing `super()` use in command line tool * Document restoration in app now uses modern 'secure restorable state' diff --git a/plotdevice/gfx/text.py b/plotdevice/gfx/text.py index 1039971..4779300 100644 --- a/plotdevice/gfx/text.py +++ b/plotdevice/gfx/text.py @@ -332,7 +332,8 @@ def flow(self, columns=all, layout=None): if not layout: return self._reflow(columns) # return the generator for iteration - map(layout, self._reflow(columns)) # apply the layout function to each block in sequence + for block in self._reflow(columns): + layout(block) # apply the layout function to each block in sequence def _reflow(self, count): # wipe out any previously set blocks then keep adding new ones until @@ -926,4 +927,3 @@ def draw(self): # we inherit from Grob for the methods, not drawability codependent = "TextBlocks can't be drawn directly; plot() the parent Text object instead" raise DeviceError(codependent) - diff --git a/tests/_ref/typography/typography-advanced-flow2.png b/tests/_ref/typography/typography-advanced-flow2.png index 5edc7d91bd42c1a440a6f6b958ad4afd63fb09b7..ff84fb2835aeec1270110ca4363b25b1c0efbd58 100644 GIT binary patch literal 50017 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 VPjWxT!I#fRN=#m~O4z{ve*rK~BUS(a diff --git a/tests/typography.py b/tests/typography.py index fa6a1dd..1c7f150 100644 --- a/tests/typography.py +++ b/tests/typography.py @@ -335,7 +335,7 @@ def test_typography_advanced_flow2(self): size(300, 330) kafka = 'and a man entered. He had never seen the man in this house before. He was slim but firmly built, his clothes were black and close-fitting, with many folds and pockets, buckles and buttons and a belt, all of which gave the impression of being very practical but without making it very clear what they were actually for. “Who are you?” asked K., sitting half upright in his bed. The man, however, ignored the question as if his arrival simply had to be accepted, and merely replied, “You rang?” “Anna should have brought me my breakfast,” said K. He tried to work out who the man actually was, first in silence, just through observation and by thinking about it, but the man didn’t stay still to be looked at for very long. Instead he went over to the door, opened it slightly, and said to someone who was clearly standing immediately behind it, “He wants Anna to bring him his breakfast.” There was a little laughter in the neighbouring room, it was not clear from the sound of it whether there were several people laughing. The strange man could not have learned anything from it that he hadn’t known already, but now he said to K., as if making his report “It is not possible.” “It would be the first time that’s happened,” said K., as he jumped out of bed and quickly pulled on his trousers. “I want to see who that is in the next room, and why it is that Mrs. Grubach has let me be disturbed in this way.” It immediately occurred to him that he needn’t have said this out loud, and that he must to some extent have acknowledged their authority by doing so, but that ...' - font('Palatino', size=10) + font('Hoefler Text', size=10) layout(align=JUSTIFY, hyphenate=True) def leftright(block): From 30f574fcb66f26087f0a920a5e242b80f04a61a8 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 16:01:45 -0400 Subject: [PATCH 22/54] fix the test for blend-only effects - comparing to a tuple was always a non-match --- plotdevice/gfx/effects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/gfx/effects.py b/plotdevice/gfx/effects.py index 76bf721..5eade8c 100644 --- a/plotdevice/gfx/effects.py +++ b/plotdevice/gfx/effects.py @@ -142,7 +142,7 @@ def set(self, *effs): # i *think* it's better to skip the transparency layer when only blending, # but am bracing for the discovery that it's not... - return bool(fx) and fx.keys() != ('blend',) + return bool(fx) and fx.keys() != {'blend'} # return bool(fx) # return whether any state was just changed @contextmanager From e4b666a1c14059d8179c06d07a2dbe565dd9ff0d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sat, 11 Jul 2026 16:53:11 -0400 Subject: [PATCH 23/54] fix MagicNumber's numeric-protocol implementation - add missing dunder methods and drop otiose ones from MagicNumber (the base class for Dimension & Unit) - add unit tests exercising numeric comparison ops - fixes #67 --- plotdevice/gfx/geometry.py | 14 +++++------ tests/canvas.py | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/plotdevice/gfx/geometry.py b/plotdevice/gfx/geometry.py index 0ea76b8..8e61b94 100644 --- a/plotdevice/gfx/geometry.py +++ b/plotdevice/gfx/geometry.py @@ -431,16 +431,20 @@ class MagicNumber(object): # be a well-behaved pseudo-number (based on the float in self.value) def __int__(self): return int(self.value) def __float__(self): return float(self.value) - def __cmp__(self, n): return cmp(self.value, n) + def __index__(self): return int(self.value) def __eq__(self, n): return n == self.value + def __hash__(self): return hash(self.value) def __lt__(self, n): return self.value < n def __gt__(self, n): return self.value > n + def __le__(self, n): return self.value <= n + def __ge__(self, n): return self.value >= n def __abs__(self): return abs(self.value) def __pos__(self): return +self.value def __neg__(self): return -self.value - def __invert__(self): return ~self.value def __trunc__(self): return math.trunc(self.value) + def __round__(self, ndigits=None): return round(self.value, ndigits) + def __format__(self, spec): return format(self.value, spec) def __add__(self, n): return self.value + n def __sub__(self, n): return self.value - n @@ -449,18 +453,14 @@ def __truediv__(self, n): return self.value/n def __floordiv__(self, n): return self.value // n def __mod__(self, n): return self.value % n def __pow__(self, n): return self.value ** n - def __lshift__(self, n): return self.value << n - def __rshift__(self, n): return self.value >> n def __radd__(self, n): return n + self.value def __rsub__(self, n): return n - self.value def __rmul__(self, n): return n * self.value - def __rdiv__(self, n): return n / self.value + def __rtruediv__(self, n): return n / self.value def __rfloordiv__(self, n): return n // self.value def __rmod__(self, n): return n % self.value def __rpow__(self, n): return n ** self.value - def __rlshift__(self, n): return n << self.value - def __rrshift__(self, n): return n >> self.value # the WIDTH and HEIGHT globals are Dimension objects class Dimension(MagicNumber): diff --git a/tests/canvas.py b/tests/canvas.py index 82532a9..0bfbd52 100644 --- a/tests/canvas.py +++ b/tests/canvas.py @@ -26,6 +26,56 @@ def test_ordered_heterogeneous_items(self): ys = [it['y'] if isinstance(it, dict) else it.y for it in sorted_items] self.assertEqual(ys, [20, 50, 80]) + def test_dimension_range(self): + # reproduces https://github.com/plotdevice/plotdevice/issues/67 + size(300, 200) + self.assertEqual(list(range(0, WIDTH)), list(range(0, 300))) + self.assertEqual(list(range(0, HEIGHT)), list(range(0, 200))) + + def test_magicnumber_protocol(self): + # exercise the dunder methods on MagicNumber that make it behave like a real float + size(300, 200) + for magic in (WIDTH, HEIGHT, px, inch, pica, cm, mm): + expected = float(magic) + with self.subTest(magic=magic): + self.assertEqual(list(range(0, magic)), list(range(0, int(expected)))) + self.assertEqual(round(magic), round(expected)) + self.assertEqual(hash(magic), hash(expected)) + self.assertTrue(magic <= expected) + self.assertTrue(magic >= expected) + self.assertEqual(format(magic, '.2f'), format(expected, '.2f')) + self.assertEqual(144 / magic, 144 / expected) + + def test_magicnumber_cross_comparisons(self): + # confirm dimension-to-unit comparisons work + size(10 * cm, 20 * cm) + self.assertEqual(WIDTH / cm, 10) + self.assertEqual(HEIGHT / cm, 20) + for a, b in [(inch, pica), (cm, mm), (WIDTH, cm), (HEIGHT, inch), (WIDTH, HEIGHT)]: + with self.subTest(a=a, b=b): + self.assertEqual(a <= b, float(a) <= float(b)) + self.assertEqual(a >= b, float(a) >= float(b)) + + def test_magicnumber_unsupported_operators(self): + # confirm errors blame the actual type (Dimension or Unit) rather than + # the spurious 'float' comparison from earlier releases + size(300, 200) + for magic in (WIDTH, HEIGHT, px, inch, pica, cm, mm): + typename = type(magic).__name__ + ops = [ + lambda m: m << 2, + lambda m: m >> 2, + lambda m: 2 << m, + lambda m: 2 >> m, + lambda m: ~m, + ] + for op in ops: + with self.subTest(magic=magic, op=op): + with self.assertRaises(TypeError) as exc: + op(magic) + self.assertIn(typename, str(exc.exception)) + self.assertNotIn('float', str(exc.exception)) + def suite(): suite = unittest.TestSuite() suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(CanvasTests)) From 41556e2bd82509ee3470ebffefa400ac23e1e55a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 12 Jul 2026 20:15:01 -0400 Subject: [PATCH 24/54] fix rasterization of clipping masks based on vector images - previously the vector would be rasterized at the width/height of the PDF or SVG, then that bitmap mask would be scaled - now the vector image is scaled to the size it will occupy on the canvas *before* being rasterized, so the masking is still pixel-based, but will no longer be super-low res - partially addresses #83 (though it doesn't provide the vector-based mask the user exptected) --- plotdevice/gfx/effects.py | 2 +- plotdevice/gfx/image.py | 61 +++++++++++++++++-- plotdevice/lib/cocoa.py | 5 +- tests/_in/tiny-triangle.pdf | Bin 0 -> 3704 bytes tests/_ref/compositing/clip-vector-image.png | Bin 0 -> 6141 bytes tests/_ref/compositing/mask-vector-image.png | Bin 0 -> 6366 bytes tests/compositing.py | 14 +++++ 7 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 tests/_in/tiny-triangle.pdf create mode 100644 tests/_ref/compositing/clip-vector-image.png create mode 100644 tests/_ref/compositing/mask-vector-image.png diff --git a/plotdevice/gfx/effects.py b/plotdevice/gfx/effects.py index 5eade8c..092a7c1 100644 --- a/plotdevice/gfx/effects.py +++ b/plotdevice/gfx/effects.py @@ -320,7 +320,7 @@ def set(self): singlechannel = ciFilter(self.channel, self.bmp._ciImage) greyscale = ciFilter(self.invert, singlechannel) ci_ctx = CIContext.contextWithOptions_(None) - maskRef = ci_ctx.createCGImage_fromRect_(greyscale, ((0,0), self.bmp.size)) + maskRef = ci_ctx.createCGImage_fromRect_(greyscale, ((0,0), self.bmp._screen_size)) # turn the image into an ‘imagemask’ cg-image cg_mask = CGImageMaskCreate(CGImageGetWidth(maskRef), diff --git a/plotdevice/gfx/image.py b/plotdevice/gfx/image.py index 8817cf0..195c224 100644 --- a/plotdevice/gfx/image.py +++ b/plotdevice/gfx/image.py @@ -15,7 +15,7 @@ from .geometry import Region, Size, Point, Transform, CENTER from .atoms import TransformMixin, EffectsMixin, FrameMixin, Grob from .colors import CMYK -from . import _ns_context +from . import _ns_context, _cg_port _ctx = None __all__ = ("Image", 'ImageWriter') @@ -174,8 +174,9 @@ def _nsBitmap(self): if isinstance(bitmap, NSBitmapImageRep): break else: - # ...otherwise convert the vector image to a bitmap - # (note that this should use _screen_transform somehow but currently doesn't) + # ...otherwise convert the vector image to a bitmap at its native size. + # it will only be used for a hasAlpha() check in effects.py, so the actual + # pixel data needn't match its _screen_size tiffdata = self._nsImage.TIFFRepresentation() image = NSImage.alloc().initWithData_(tiffdata) bitmap = image.representations()[0] @@ -183,12 +184,38 @@ def _nsBitmap(self): @property def _ciImage(self): + """A CIImage suitable for use as a clip()/mask() stencil. + + Raster sources are used as-is. Vector sources are scaled to the size + they'll actually occupy on the canvas before being rasterized. + """ + + # if the image is raster-based, use its bitmap as-is + for bitmap in self._nsImage.representations(): + if isinstance(bitmap, NSBitmapImageRep): + break + else: + # if vector-based, rasterize it at its 'actual' on-screen size + w, h = self._screen_size + + # create an offscreen bitmap context and rasterize the scaled image into it + bitmap_opts = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host + bitmap_ctx = CGBitmapContextCreate(None, w, h, 8, w*4, CGColorSpaceCreateDeviceRGB(), bitmap_opts) + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.setCurrentContext_( + NSGraphicsContext.graphicsContextWithCGContext_flipped_(bitmap_ctx, True) + ) + self._nsImage.drawInRect_fromRect_operation_fraction_(((0,0),(w,h)), NSZeroRect, NSCompositeSourceOver, 1.0) + NSGraphicsContext.restoreGraphicsState() # NB: class-level restore also resets currentContext + + bitmap = NSBitmapImageRep.alloc().initWithCGImage_(CGBitmapContextCreateImage(bitmap_ctx)) + # core-image needs to be told to compensate for our flipped coords flip = NSAffineTransform.transform() - flip.translateXBy_yBy_(0, self.size.height) + flip.translateXBy_yBy_(0, bitmap.pixelsHigh()) flip.scaleXBy_yBy_(1,-1) - ciImage = CIImage.alloc().initWithBitmapImageRep_(self._nsBitmap) + ciImage = CIImage.alloc().initWithBitmapImageRep_(bitmap) transform = CIFilter.filterWithName_("CIAffineTransform") transform.setValue_forKey_(ciImage, "inputImage") transform.setValue_forKey_(flip, "inputTransform") @@ -249,6 +276,29 @@ def _screen_transform(self): xf.scale(factor) # scale to fit size constraints (if any) return xf + @property + def _screen_size(self): + """Returns the image's real pixel dimensions. + + Raster-backed images return their native size, but vector-based images incorporate + the canvas's current CTM and the image's scaling based on its _screen_transform.""" + + # if the image is raster-based, use its native size + for bitmap in self._nsImage.representations(): + if isinstance(bitmap, NSBitmapImageRep): + return bitmap.pixelsWide(), bitmap.pixelsHigh() + + # if vector-based, use the canvas's CTM and the image's _screen_transform to + # determine its 'actual' size (rather than just using its mediabox 1:1) + ctm = CGContextGetCTM(_cg_port()) + ctm_scale = max(math.hypot(ctm.a, ctm.b), math.hypot(ctm.c, ctm.d)) + xf_a, xf_b, xf_c, xf_d, _, _ = self._screen_transform.matrix + xf_scale = max(math.hypot(xf_a, xf_b), math.hypot(xf_c, xf_d)) + scale = max(ctm_scale * xf_scale, 1.0) + src_w, src_h = self._nsImage.size() + + return max(1, round(src_w * scale)), max(1, round(src_h * scale)) + def _draw(self): """Draw an image on the given coordinates.""" @@ -390,4 +440,3 @@ def finish(self): if self.session.writer.doneWriting(): break time.sleep(0.1) - diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 7807c51..b19d21a 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -4,7 +4,7 @@ CGColorSpaceCreateDeviceCMYK, CGColorSpaceCreateDeviceRGB, CGContextAddPath, CGContextAddRect, \ CGContextBeginPath, CGContextBeginTransparencyLayer, CGContextBeginTransparencyLayerWithRect, \ CGContextClearRect, CGContextClearRect, CGContextClip, CGContextClipToMask, CGContextDrawPath, \ - CGContextEndTransparencyLayer, CGContextEOClip, CGContextRestoreGState, CGContextSaveGState, \ + CGContextEndTransparencyLayer, CGContextEOClip, CGContextGetCTM, CGContextRestoreGState, CGContextSaveGState, \ CGContextSetAlpha, CGContextSetBlendMode, CGContextSetFillColorWithColor, CGContextSetLineCap, \ CGContextSetLineDash, CGContextSetLineJoin, CGContextSetLineWidth, \ CGContextSetStrokeColorWithColor, CGDataConsumerCreateWithCFData, CGImageDestinationAddImage, \ @@ -56,7 +56,8 @@ NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, NSMakeRange, NSMidX, NSMidY, \ NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject, NSOffsetRect, \ NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, NSSize, NSString, \ - NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth + NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth, \ + NSZeroRect from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF from WebKit import WebView from objc import IBOutlet, IBAction diff --git a/tests/_in/tiny-triangle.pdf b/tests/_in/tiny-triangle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a90db9297756078f04dace3bc44c5e80d5134efd GIT binary patch literal 3704 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 literal 0 HcmV?d00001 diff --git a/tests/_ref/compositing/clip-vector-image.png b/tests/_ref/compositing/clip-vector-image.png new file mode 100644 index 0000000000000000000000000000000000000000..944749311b7452bae2658fef14924aefabf2c9e8 GIT binary patch literal 6141 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 literal 0 HcmV?d00001 diff --git a/tests/_ref/compositing/mask-vector-image.png b/tests/_ref/compositing/mask-vector-image.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb785e497e37704c10429b4db77f70c89bc7c7c GIT binary patch literal 6366 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 B)ZqXC literal 0 HcmV?d00001 diff --git a/tests/compositing.py b/tests/compositing.py index 5db3274..46bdfd6 100644 --- a/tests/compositing.py +++ b/tests/compositing.py @@ -42,6 +42,13 @@ def test_clip_text(self): with clip(text('Hi', 5, 100)): image('tests/_in/plaid.png') + @reference('compositing/clip-vector-image.png') + def test_clip_image_vector(self): + size(125, 125) + # ensure tiny PDF is scaled up before rasterizing into a larger mask + with clip(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + @reference('compositing/mask.png') def test_mask(self): # ref/Compositing/commands/mask() @@ -64,6 +71,13 @@ def test_mask_text(self): with mask(text('Hi', 5, 100)): image('tests/_in/plaid.png') + @reference('compositing/mask-vector-image.png') + def test_mask_image_vector(self): + size(125, 125) + # ensure tiny PDF is scaled up before rasterizing into a larger mask + with mask(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + @reference('compositing/shadow-multi.png') def test_shadow_multi(self): # ref/Compositing/commands/shadow() From 318b8d952cd1df25f4a81df34e88827aaa65aa86 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Sun, 12 Jul 2026 20:29:50 -0400 Subject: [PATCH 25/54] add clip() test cases that use canvas transforms --- .../compositing/clip-vector-image-rotate.png | Bin 0 -> 11356 bytes .../compositing/clip-vector-image-scale.png | Bin 0 -> 3505 bytes .../clip-vector-image-transform.png | Bin 0 -> 9789 bytes tests/compositing.py | 22 ++++++++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 tests/_ref/compositing/clip-vector-image-rotate.png create mode 100644 tests/_ref/compositing/clip-vector-image-scale.png create mode 100644 tests/_ref/compositing/clip-vector-image-transform.png diff --git a/tests/_ref/compositing/clip-vector-image-rotate.png b/tests/_ref/compositing/clip-vector-image-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..a47dab8b89b1324e92e0aea51a59649ebd0ad470 GIT binary patch literal 11356 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 AlmGw# literal 0 HcmV?d00001 diff --git a/tests/_ref/compositing/clip-vector-image-scale.png b/tests/_ref/compositing/clip-vector-image-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..29846974f5d40e8412c6bb51aaf171c33b8e791d GIT binary patch literal 3505 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 LNwVULap3;~9As3J literal 0 HcmV?d00001 diff --git a/tests/compositing.py b/tests/compositing.py index 46bdfd6..26a609c 100644 --- a/tests/compositing.py +++ b/tests/compositing.py @@ -49,6 +49,28 @@ def test_clip_image_vector(self): with clip(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): image('tests/_in/plaid.png') + @reference('compositing/clip-vector-image-scale.png') + def test_clip_image_vector_scale(self): + size(125, 125) + scale(2) + with clip(image('tests/_in/tiny-triangle.pdf', width=62, height=62)): + image('tests/_in/plaid.png') + + @reference('compositing/clip-vector-image-rotate.png') + def test_clip_image_vector_rotate(self): + size(125, 125) + rotate(30) + with clip(image('tests/_in/tiny-triangle.pdf', width=125, height=125)): + image('tests/_in/plaid.png') + + @reference('compositing/clip-vector-image-transform.png') + def test_clip_image_vector_transform(self): + size(125, 125) + scale(1.5) + rotate(20) + with clip(image('tests/_in/tiny-triangle.pdf', width=83, height=83)): + image('tests/_in/plaid.png') + @reference('compositing/mask.png') def test_mask(self): # ref/Compositing/commands/mask() From e5b8d1bdebfc652dcb9764995f6da9a086ce37ac Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 14:37:10 -0400 Subject: [PATCH 26/54] replace deprecated WebView with WKWebView - initial migration uses some runloop trickery in the EditorView.source getter to stay compatible with the synchronous file-saving api - web inspector is now only enabled by default on dev builds (though it can be added to dist builds with a defaults write to `WebKitDeveloperExtras`) --- app/Resources/ui/js/editor.js | 1 - plotdevice/gui/document.py | 22 +++- plotdevice/gui/editor.py | 206 +++++++++++++++++++++------------- plotdevice/gui/preferences.py | 18 ++- plotdevice/lib/cocoa.py | 8 +- 5 files changed, 165 insertions(+), 90 deletions(-) diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index bc0670f..51d7f07 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -60,7 +60,6 @@ var Editor = function(elt){ // responsible for their hide/show behavior, sadly.... sess.on("changeScrollLeft", that._scroll_h) sess.on("changeScrollTop", that._scroll_v) - that.ready = true // flag that the objc side can start sending messages return that }, _commandStream:function(e){ diff --git a/plotdevice/gui/document.py b/plotdevice/gui/document.py index 4cc1bd8..c720ed6 100644 --- a/plotdevice/gui/document.py +++ b/plotdevice/gui/document.py @@ -428,8 +428,17 @@ def runScript(self): self.editorView.clearErrors() self.outputView.clear(timestamp=True) + if self.editorView: + # fetch the current source from the editor (asynchronously), then run it + self.editorView.with_source(self._runSource) + else: + # run in the (editor-less) CLI-spawned window + self._runSource(self.vm.source) + + @objc.python_method + def _runSource(self, source): # Compile the script and run its global scope - self.vm.source = self.source + self.vm.source = source success = self.invoke(None) # Display the dashboard if the var() command was called @@ -587,9 +596,14 @@ def exportInit(self, kind, fname, opts): if self.statusView: self.statusView.beginExport() - # let the Sandbox take over - self.vm.source = self.source - self.vm.export(kind, fname, opts) + # fetch the current source, then let the Sandbox take over + def begin(source): + self.vm.source = source + self.vm.export(kind, fname, opts) + if self.editorView: + self.editorView.with_source(begin) + else: + begin(self.vm.source) @objc.python_method def exportFrame(self, status, canvas=None): diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 7d8044b..3b2578f 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -3,11 +3,10 @@ import re import json import objc -from io import open from objc import super from time import time from ..lib.cocoa import * -from plotdevice.gui.preferences import get_default, editor_info +from plotdevice.gui.preferences import get_default, editor_info, dev_extras from plotdevice.gui import bundle_path, set_timeout __all__ = ['EditorView', 'OutputTextView'] @@ -15,10 +14,7 @@ def args(*jsargs): return ', '.join([json.dumps(v, ensure_ascii=False) for v in jsargs]) -class DraggyWebView(WebView): - def initWithFrame_(self, rect): - return self.initWithFrame_frameName_groupName_(rect, None, None) - +class DraggyWebView(WKWebView): def draggingEntered_(self, sender): pb = sender.draggingPasteboard() options = { NSPasteboardURLReadingFileURLsOnlyKey:True, @@ -28,7 +24,15 @@ def draggingEntered_(self, sender): rewrite = "\n".join(['"%s"'%u.path() for u in urls] + strs) + "\n" pb.declareTypes_owner_([NSStringPboardType], self) pb.setString_forType_(rewrite, NSStringPboardType) - return super(DraggyWebView, self).draggingEntered_(sender) + # don't consult super: WKWebView's drag negotiation round-trips to the web + # process and can veto the rewritten pasteboard + return NSDragOperationCopy + + def draggingUpdated_(self, sender): + return NSDragOperationCopy + + def prepareForDragOperation_(self, sender): + return True def performDragOperation_(self, sender): pb = sender.draggingPasteboard() @@ -40,8 +44,29 @@ def performDragOperation_(self, sender): return True return False - def shouldCloseWithWindow(self): - return True + def willOpenMenu_withEvent_(self, menu, event): + # omit everything from context menu except Cut/Copy/Paste (+ Inspect Element) + keep = ('WKMenuItemIdentifierCut', 'WKMenuItemIdentifierCopy', + 'WKMenuItemIdentifierPaste', 'WKMenuItemIdentifierInspectElement') + for item in list(menu.itemArray()): + if item.identifier() not in keep: + menu.removeItem_(item) + inspect = menu.indexOfItemWithIdentifier_('WKMenuItemIdentifierInspectElement') + if inspect > 0: + menu.insertItem_atIndex_(NSMenuItem.separatorItem(), inspect) + + # TODO: once a doc viewer exists, add a lookup-ref menu item pointing to it: + # word = self.js('editor.selected') + # _ns = ['curveto', 'TEXT', 'BezierPath', ...] + # def ref_url(proc): + # if proc in _ns: + # return proc + # if ref_url(word): + # doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(u"Documentation for ‘%s()’"%word, "copy:", "") + # sep = NSMenuItem.separatorItem() + # items.insert(0, sep) + # items.insert(0, doc) + class EditorView(NSView): document = IBOutlet() @@ -51,93 +76,91 @@ class EditorView(NSView): # WebKit mgmt def awakeFromNib(self): - self.webview = DraggyWebView.alloc().initWithFrame_(self.bounds()) - self.webview.setAllowsUndo_(False) - self.webview.setFrameLoadDelegate_(self) - self.webview.setUIDelegate_(self) + config = WKWebViewConfiguration.alloc().init() + dev = dev_extras() # whether to enable Inspect Element menu + config.preferences().setValue_forKey_(dev, 'developerExtrasEnabled') + ucc = config.userContentController() + ucc.addScriptMessageHandler_name_(self, 'app') + shim = WKUserScript.alloc().initWithSource_injectionTime_forMainFrameOnly_( + # forward any app.() call as a message to the 'app' script-message handler + """window.app = new Proxy({}, { + get: (_, fn) => (...args) => window.webkit.messageHandlers.app.postMessage({fn:String(fn), args:args}) + });""", WKUserScriptInjectionTimeAtDocumentStart, True) + ucc.addUserScript_(shim) + + self.webview = DraggyWebView.alloc().initWithFrame_configuration_(self.bounds(), config) + if dev and self.webview.respondsToSelector_('setInspectable:'): + self.webview.setInspectable_(True) + self.webview.setValue_forKey_(False, 'drawsBackground') + self.webview.setNavigationDelegate_(self) self.addSubview_(self.webview) - self.webview.setHidden_(True) - - html = bundle_path(rsrc='ui/editor.html') - ui = open(html, encoding='utf-8').read() - baseurl = NSURL.fileURLWithPath_(os.path.dirname(html)) - self.webview.mainFrame().loadHTMLString_baseURL_(ui, baseurl) - - # set a theme-derived background for the webview's clipview - docview = self.webview.mainFrame().frameView().documentView() - clipview = docview.superview() - scrollview = clipview.superview() - if clipview is not None: - bgcolor = editor_info('colors')['background'] - clipview.setDrawsBackground_(True) - clipview.setBackgroundColor_(bgcolor) - scrollview.setVerticalScrollElasticity_(1) - scrollview.setScrollerKnobStyle_(2) nc = NSNotificationCenter.defaultCenter() nc.addObserver_selector_name_object_(self, "themeChanged", "ThemeChanged", None) nc.addObserver_selector_name_object_(self, "fontChanged", "FontChanged", None) nc.addObserver_selector_name_object_(self, "bindingsChanged", "BindingsChanged", None) nc.addObserver_selector_name_object_(self, "insertDroppedFiles:", "DropOperation", self.webview) - self._wakeup = set_timeout(self, '_jostle', .05, repeat=True) - self._queue = [] self._edits = 0 - self.themeChanged() - self.fontChanged() - self.bindingsChanged() + self._last_source = '' + self._refresh() mm=NSApp().mainMenu() self._doers = mm.itemWithTitle_('Edit').submenu().itemArray()[1:3] self._undo_mgr = None def drawRect_(self, rect): - if self._wakeup: - # try to minimize the f.o.u.c. while the webview starts up - bgcolor = editor_info('colors')['background'] - bgcolor.setFill() - NSRectFillUsingOperation(rect, NSCompositeCopy) + # the webview is transparent, so draw the theme background here + bgcolor = editor_info('colors')['background'] + bgcolor.setFill() + NSRectFillUsingOperation(rect, NSCompositeCopy) super(EditorView, self).drawRect_(rect) - - def _jostle(self): - awoke = self.webview.stringByEvaluatingJavaScriptFromString_('window.editor && window.editor.ready') - if awoke: - for op in self._queue: - self.webview.stringByEvaluatingJavaScriptFromString_(op) - self._wakeup.invalidate() - self._wakeup = None - self._queue = None - self.webview.setHidden_(False) + @objc.python_method + def _refresh(self): + # (re)load the editor page, queueing up prefs & source to be applied once it + # signals readiness (see webView_didFinishNavigation_) + self._loading = True + self._queue = [] + self.webview.setHidden_(True) + self.themeChanged() + self.fontChanged() + self.bindingsChanged() + self._set_source(self._last_source) + html = bundle_path(rsrc='ui/editor.html') + ui_dir = NSURL.fileURLWithPath_isDirectory_(os.path.dirname(html), True) + self.webview.loadFileURL_allowingReadAccessToURL_(NSURL.fileURLWithPath_(html), ui_dir) + + def _ready(self): + # js editor has been loaded and is ready to receive queued prefs & source + self._loading = False + for op in self._queue: + self.webview.evaluateJavaScript_completionHandler_(op, None) + self._queue = [] + self.webview.setHidden_(False) + self.setNeedsDisplay_(True) def _cleanup(self): + # break the retain cycle through the WKUserContentController (it holds its + # message handlers strongly) + self.webview.configuration().userContentController().removeScriptMessageHandlerForName_('app') + self.webview.setNavigationDelegate_(None) nc = NSNotificationCenter.defaultCenter() nc.removeObserver_(self) self._doers = self._undo_mgr = self.jumpPanel = self.jumpLine = None - # def webView_didFinishLoadForFrame_(self, sender, frame): - def webView_didClearWindowObject_forFrame_(self, sender, win, frame): - self.webview.windowScriptObject().setValue_forKey_(self, 'app') + def webView_didFinishNavigation_(self, sender, nav): + # called after DOMContentLoaded + self._ready() - def webView_contextMenuItemsForElement_defaultMenuItems_(self, sender, elt, menu): - items = [ - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Cut", "cut:", ""), - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Copy", "copy:", ""), - NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("Paste", "paste:", ""), - NSMenuItem.separatorItem(), - ] + def webViewWebContentProcessDidTerminate_(self, sender): + # try to restore if the webkit subprocess crashes + self._refresh() - # once a doc viewer exists, add a lookup-ref menu item pointing to it: - # word = self.js('editor.selected') - # _ns = ['curveto', 'TEXT', 'BezierPath', ...] - # def ref_url(proc): - # if proc in _ns: - # return proc - # if ref_url(word): - # doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(u"Documentation for ‘%s()’"%word, "copy:", "") - # sep = NSMenuItem.separatorItem() - # items.insert(0, sep) - # items.insert(0, doc) - return items + [it for it in menu if it.title()=='Inspect Element'] + def userContentController_didReceiveScriptMessage_(self, ucc, msg): + body = msg.body() + fn, fnargs = body['fn'], list(body.get('args', [])) + if fn in ('edits_', 'flash_', 'setSearchPasteboard', 'cancelRun', 'loadPrefs'): + getattr(self, fn)(*fnargs) def resizeSubviewsWithOldSize_(self, oldSize): self.resizeWebview() @@ -148,9 +171,6 @@ def resizeWebview(self): def insertDroppedFiles_(self, note): self.js('editor.insert', args(note.userInfo())) - def isSelectorExcludedFromWebScript_(self, sel): - return False - def windowDidResignKey_(self, note): if note.object() is self.jumpPanel: self.jumpPanel.orderOut_(self) @@ -182,26 +202,52 @@ def mouseExited_(self, e): @objc.python_method def _get_source(self): - return self.webview.stringByEvaluatingJavaScriptFromString_('editor.source();') + # Spin the runloop while waiting for the editor to return its contents async. + if self._loading: + return self._last_source + result = {} + def done(value, error): + result['value'] = value + self.webview.evaluateJavaScript_completionHandler_('editor.source();', done) + deadline = NSDate.dateWithTimeIntervalSinceNow_(2.0) + while 'value' not in result and deadline.timeIntervalSinceNow() > 0: + NSRunLoop.currentRunLoop().runMode_beforeDate_( + NSDefaultRunLoopMode, NSDate.dateWithTimeIntervalSinceNow_(0.01)) + if result.get('value') is not None: + self._last_source = result['value'] + return self._last_source @objc.python_method def _set_source(self, src): + self._last_source = src self.js('editor.source', args(src)) source = property(_get_source, _set_source) + @objc.python_method + def with_source(self, callback): + """Read the editor buffer asynchronously, then invoke callback(src)""" + if self._loading: # webview not ready: use the shadow copy + return callback(self._last_source) + def done(value, error): + if value is not None: + self._last_source = value + callback(self._last_source) + self.webview.evaluateJavaScript_completionHandler_('editor.source();', done) + def fontChanged(self, note=None): info = editor_info() self.js('editor.font', args(info['family'], info['px'])) def themeChanged(self, note=None): info = editor_info() - clipview = self.webview.mainFrame().frameView().documentView().superview() - clipview.setBackgroundColor_(info['colors']['background']) self.js('editor.theme', args(info['module'])) + self.setNeedsDisplay_(True) def bindingsChanged(self, note=None): self.js('editor.bindings', args(get_default('bindings'))) def focus(self): + if self.window(): + self.window().makeFirstResponder_(self.webview) self.js('editor.focus') def blur(self): @@ -222,10 +268,10 @@ def report(self, crashed, script): @objc.python_method def js(self, cmd, args=''): op = '%s(%s);'%(cmd,args) - if self._wakeup: + if self._loading: self._queue.append(op) else: - return self.webview.stringByEvaluatingJavaScriptFromString_(op) + self.webview.evaluateJavaScript_completionHandler_(op, None) # Menubar actions diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index acc9eea..d830651 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -22,7 +22,6 @@ def set_default(label, value): def defaultDefaults(): return { - "WebKitDeveloperExtras":True, "plotdevice:theme":"Solarized Dark", "plotdevice:bindings":"mac", "plotdevice:font-name":"Menlo", @@ -32,6 +31,23 @@ def defaultDefaults(): NSUserDefaults.standardUserDefaults().registerDefaults_(defaultDefaults()) THEMES = None # to be filled in as needed +def dev_extras(): + """Should the editor's web inspector be enabled? + + Defaults to on for dev builds (running from the source checkout, or an app + built by `make.py app`/`py2app`) and off for official releases (which have a + real version stamped over info.plist's "in flux" placeholder by `make.py dist`). + Either behavior can be forced with e.g.: + defaults write io.plotdevice.PlotDevice WebKitDeveloperExtras -bool YES + """ + override = get_default('WebKitDeveloperExtras') + if override is not None: + return bool(override) + bundle = NSBundle.mainBundle() + if bundle.bundleIdentifier() != 'io.plotdevice.PlotDevice': + return True # running from the source checkout rather than PlotDevice.app + return bundle.objectForInfoDictionaryKey_('CFBundleVersion') == 'in flux' + def _hex_to_nscolor(hexclr): hexclr = hexclr.lstrip('#') r, g, b, a = [int(n, 16)/255.0 for n in (hexclr[0:2], hexclr[2:4], hexclr[4:6], hexclr[6:8])] diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index b19d21a..872fa30 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -31,7 +31,7 @@ NSChangeRedone, NSChangeUndone, NSClipView, NSClosePathBezierPathElement, NSColor, NSColorSpace, \ NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceRGBColorSpace, NSDocument, \ - NSDocumentController, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ + NSDocumentController, NSDragOperationCopy, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ NSFontDescriptor, NSFontManager, NSForegroundColorAttributeName, NSGIFFileType, NSGradient, \ NSGraphicsContext, NSGraphiteControlTint, NSImage, NSImageCacheNever, NSImageCompressionFactor, \ NSImageInterpolationHigh, NSItalicFontMask, NSJPEGFileType, NSJustifiedTextAlignment, \ @@ -51,13 +51,13 @@ NSWindowTabbingModePreferred, NSWorkspace from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, CIVector, Foundation, NO, \ NSAffineTransform, NSAffineTransformStruct, NSArray, NSAttributedString, NSAutoreleasePool, \ - NSBundle, NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ + NSBundle, NSData, NSDate, NSDateFormatter, NSDefaultRunLoopMode, NSFileCoordinator, NSFileHandle, \ NSFileHandleDataAvailableNotification, NSHeight, NSInsetRect, NSIntersectionRange, \ NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, NSMakeRange, NSMidX, NSMidY, \ NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject, NSOffsetRect, \ - NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, NSSize, NSString, \ + NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSRunLoop, NSSelectorFromString, NSSize, NSString, \ NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth, \ NSZeroRect from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF -from WebKit import WebView +from WebKit import WKWebView, WKWebViewConfiguration, WKUserScript, WKUserScriptInjectionTimeAtDocumentStart from objc import IBOutlet, IBAction From 79b7051f2610736e713bc86be72eb51f82448e1b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 15:57:12 -0400 Subject: [PATCH 27/54] update document contents after each edit - removed the need for the runloop trickery by keeping a cached copy of the document in _last_source (updated via the undo-manager callback) --- app/Resources/ui/js/editor.js | 6 ++++-- plotdevice/gui/editor.py | 21 +++++++-------------- plotdevice/lib/cocoa.py | 8 ++++---- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 51d7f07..076c6f5 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -2,14 +2,16 @@ ace.require("ace/ext/language_tools"); // Wrap the ace UndoManager's mutation methods with callbacks to the pyobjc EditorView -// keeping it up-to-date on whether the file has been modified & whether undo/redo are available +// keeping it up-to-date on whether the file has been modified & whether undo/redo are available. +// Also send a copy of the buffer contents with each change so the EditorView's shadow copy is +// fresh enough to be read synchronously at save-time. const {UndoManager:__UndoManager} = ace.require('ace/undomanager') function UndoManager(){ __UndoManager.call(this) } UndoManager.prototype = Object.create(__UndoManager.prototype); for (const method of ['add', 'undo', 'redo', 'reset']){ UndoManager.prototype[method] = function(){ __UndoManager.prototype[method].call(this, ...arguments); - app.edits_(this.$undoStack.length) + app.edits_(this.$undoStack.length, window?.editor?.source?.() ?? null) } } diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 3b2578f..dca275f 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -202,19 +202,7 @@ def mouseExited_(self, e): @objc.python_method def _get_source(self): - # Spin the runloop while waiting for the editor to return its contents async. - if self._loading: - return self._last_source - result = {} - def done(value, error): - result['value'] = value - self.webview.evaluateJavaScript_completionHandler_('editor.source();', done) - deadline = NSDate.dateWithTimeIntervalSinceNow_(2.0) - while 'value' not in result and deadline.timeIntervalSinceNow() > 0: - NSRunLoop.currentRunLoop().runMode_beforeDate_( - NSDefaultRunLoopMode, NSDate.dateWithTimeIntervalSinceNow_(0.01)) - if result.get('value') is not None: - self._last_source = result['value'] + # return the copy of the source relayed by the last edits_ call from js return self._last_source @objc.python_method def _set_source(self, src): @@ -347,7 +335,8 @@ def cancelRun(self): menu = mm.itemWithTitle_("Python") menu.submenu().performActionForItemAtIndex_(3) - def edits_(self, count): + @objc.python_method + def edits_(self, count, source=None): # inform the undo manager of the changes um = self._undo_mgr c = int(count) @@ -362,6 +351,10 @@ def edits_(self, count): for item, can in zip(self._doers, (um.canUndo(), um.canRedo())): item.setEnabled_(can) + # cache the editor's contents for use by the synchronous .source property + if isinstance(source, str): + self._last_source = source + def syncUndoState_(self, count): pass # this would be useful if only it got called for redo as well as undo... diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index 872fa30..dd09233 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -29,8 +29,8 @@ NSBackingStoreBuffered, NSBeep, NSBezierPath, NSBitmapImageRep, NSBorderlessWindowMask, NSButton, \ NSCenterTextAlignment, NSChangeAutosaved, NSChangeCleared, NSChangeDone, NSChangeReadOtherContents, \ NSChangeRedone, NSChangeUndone, NSClipView, NSClosePathBezierPathElement, NSColor, NSColorSpace, \ - NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ - NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceRGBColorSpace, NSDocument, \ + NSCommandKeyMask, NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ + NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceIndependentModifierFlagsMask, NSDeviceRGBColorSpace, NSDocument, \ NSDocumentController, NSDragOperationCopy, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ NSFontDescriptor, NSFontManager, NSForegroundColorAttributeName, NSGIFFileType, NSGradient, \ NSGraphicsContext, NSGraphiteControlTint, NSImage, NSImageCacheNever, NSImageCompressionFactor, \ @@ -51,11 +51,11 @@ NSWindowTabbingModePreferred, NSWorkspace from Foundation import CIAffineTransform, CIColorMatrix, CIContext, CIFilter, CIImage, CIVector, Foundation, NO, \ NSAffineTransform, NSAffineTransformStruct, NSArray, NSAttributedString, NSAutoreleasePool, \ - NSBundle, NSData, NSDate, NSDateFormatter, NSDefaultRunLoopMode, NSFileCoordinator, NSFileHandle, \ + NSBundle, NSData, NSDate, NSDateFormatter, NSFileCoordinator, NSFileHandle, \ NSFileHandleDataAvailableNotification, NSHeight, NSInsetRect, NSIntersectionRange, \ NSIntersectionRect, NSLocale, NSLog, NSMacOSRomanStringEncoding, NSMakeRange, NSMidX, NSMidY, \ NSMutableAttributedString, NSMutableData, NSNotificationCenter, NSObject, NSOffsetRect, \ - NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSRunLoop, NSSelectorFromString, NSSize, NSString, \ + NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, NSSize, NSString, \ NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth, \ NSZeroRect from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF From bbff6e90f5933db390ae8b5f2a2a95bf4542815d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 15:57:59 -0400 Subject: [PATCH 28/54] fix license format --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index aec1937..f55cdaf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ dynamic = ["version"] description = "Create two-dimensional graphics and animations with code" readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.9" -license = { text = "MIT" } +license = "MIT" authors = [{ name = "Christian Swinehart", email = "drafting@samizdat.co" }] urls = { Homepage = "https://plotdevice.io/" } classifiers = [ From 74fc923eee6e30ec61b32aa160951443fb5a41c4 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 17:11:59 -0400 Subject: [PATCH 29/54] rename `sync_edits` and `flash_menu` methods --- app/Resources/ui/js/editor.js | 4 ++-- plotdevice/gui/editor.py | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 076c6f5..cd9d840 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -11,7 +11,7 @@ UndoManager.prototype = Object.create(__UndoManager.prototype); for (const method of ['add', 'undo', 'redo', 'reset']){ UndoManager.prototype[method] = function(){ __UndoManager.prototype[method].call(this, ...arguments); - app.edits_(this.$undoStack.length, window?.editor?.source?.() ?? null) + app.sync_edits(this.$undoStack.length, window?.editor?.source?.() ?? null) } } @@ -69,7 +69,7 @@ var Editor = function(elt){ // objc side of things when one of them is entered var cmd = e.command.name for (const [cmds, menu] of Object.entries(_menu_cmds)){ - if (cmds.includes(cmd)) app.flash_(menu) + if (cmds.includes(cmd)) app.flash_menu(menu) } }, _scroll_h:function(x){ diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index dca275f..794b237 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -159,7 +159,7 @@ def webViewWebContentProcessDidTerminate_(self, sender): def userContentController_didReceiveScriptMessage_(self, ucc, msg): body = msg.body() fn, fnargs = body['fn'], list(body.get('args', [])) - if fn in ('edits_', 'flash_', 'setSearchPasteboard', 'cancelRun', 'loadPrefs'): + if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs'): getattr(self, fn)(*fnargs) def resizeSubviewsWithOldSize_(self, oldSize): @@ -202,7 +202,7 @@ def mouseExited_(self, e): @objc.python_method def _get_source(self): - # return the copy of the source relayed by the last edits_ call from js + # return the copy of the source relayed by the last sync_edits call from js return self._last_source @objc.python_method def _set_source(self, src): @@ -336,7 +336,7 @@ def cancelRun(self): menu.submenu().performActionForItemAtIndex_(3) @objc.python_method - def edits_(self, count, source=None): + def sync_edits(self, count, source=None): # inform the undo manager of the changes um = self._undo_mgr c = int(count) @@ -365,9 +365,10 @@ def setSearchPasteboard(self, query): pb = NSPasteboard.pasteboardWithName_(NSFindPboard) pb.declareTypes_owner_([NSStringPboardType],None) pb.setString_forType_(query, NSStringPboardType) - self.flash_("Edit") + self.flash_menu("Edit") - def flash_(self, menuname): + @objc.python_method + def flash_menu(self, menuname): # when a menu item's key command was entered in the editor, flash the menu # bar to give a hint of where the command lives mm=NSApp().mainMenu() From 293f85a3481e654983be381505b8d1ee21f69305 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 19:58:04 -0400 Subject: [PATCH 30/54] add new default editor theme --- app/Resources/ui/autocomplete.css | 11 +- app/Resources/ui/js/ace/theme-samizdat.js | 162 ++++++++++++++++++++++ app/Resources/ui/themes.json | 12 ++ plotdevice/gui/preferences.py | 2 +- 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 app/Resources/ui/js/ace/theme-samizdat.js diff --git a/app/Resources/ui/autocomplete.css b/app/Resources/ui/autocomplete.css index dfaba7a..f7303dc 100644 --- a/app/Resources/ui/autocomplete.css +++ b/app/Resources/ui/autocomplete.css @@ -402,4 +402,13 @@ #editor.ace-cloud9-day ~ div.ace_autocomplete {background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0);} #editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(251, 251, 251, 1.0); color:rgba(0, 0, 0, 1.0); border-color:rgba(0, 0, 0, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(76, 136, 107, 1.0); border-style: dotted; } #editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(0, 0, 0, 1.0); } -#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } \ No newline at end of file +#editor.ace-cloud9-day ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_marker-layer .ace_active-line {border:1px solid rgba(55, 55, 61, 1.0); background-color:rgba(55, 55, 61, 0.7);} +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_line{color:rgba(235, 219, 178, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete.ace-tm .ace_line-hover {border-color:rgba(78, 78, 78, 1.0); background-color:rgba(78, 78, 78, 0.7);} +#editor.ace-samizdat ~ div.ace_rightAlignedText {color:rgba(133, 133, 133, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete .ace_completion-highlight{color:rgba(251, 82, 69, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete {background-color:rgba(24, 25, 32, 1.0); color:rgba(235, 219, 178, 1.0); border-color:rgba(235, 219, 178, 1.0);} +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip{ background-color:rgba(24, 25, 32, 1.0); color:rgba(235, 219, 178, 1.0); border-color:rgba(235, 219, 178, 1.0); font-family: -apple-system; font-size: 80%; color: rgba(133, 133, 133, 1.0); border-style: dotted; } +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip b{ color:rgba(235, 219, 178, 1.0); } +#editor.ace-samizdat ~ div.ace_autocomplete + .ace_tooltip.ace_doc-tooltip hr{ opacity:.75; } \ No newline at end of file diff --git a/app/Resources/ui/js/ace/theme-samizdat.js b/app/Resources/ui/js/ace/theme-samizdat.js new file mode 100644 index 0000000..12530d0 --- /dev/null +++ b/app/Resources/ui/js/ace/theme-samizdat.js @@ -0,0 +1,162 @@ +define("ace/theme/samizdat-css",["require","exports","module"], function(require, exports, module){module.exports = ` +.ace-samizdat .ace_gutter { + background: #090B10; + color: #858585 +} + +.ace-samizdat .ace_print-margin { + width: 1px; + background: #181920 +} + +.ace-samizdat { + background-color: #090B10; + color: #EBDBB2 +} + +.ace-samizdat .ace_cursor { + color: #D4D4D4 +} + +.ace-samizdat .ace_marker-layer .ace_selection { + background: #569CD655 +} + +.ace-samizdat.ace_multiselect .ace_selection.ace_start { + box-shadow: 0 0 3px 0px #090B10; +} + +.ace-samizdat .ace_marker-layer .ace_step { + background: rgb(89, 66, 0) +} + +.ace-samizdat .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid #FFFFFF44 +} + +.ace-samizdat .ace_marker-layer .ace_active-line { + background: #2A2A2A +} + +.ace-samizdat .ace_gutter-active-line { + background-color: #2A2A2A +} + +.ace-samizdat .ace_marker-layer .ace_selected-word { + border: 1px solid #303030 +} + +.ace-samizdat .ace_invisible { + color: #6C6C6C +} + +.ace-samizdat .ace_entity.ace_name.ace_tag, +.ace-samizdat .ace_keyword, +.ace-samizdat .ace_meta.ace_tag, +.ace-samizdat .ace_storage { + color: #FB5245; + font-style: italic +} + +.ace-samizdat .ace_keyword.ace_operator { + color: #D4D4D4; + font-style: normal +} + +.ace-samizdat .ace_punctuation, +.ace-samizdat .ace_punctuation.ace_tag { + color: #EBDBB2 +} + +.ace-samizdat .ace_constant.ace_character, +.ace-samizdat .ace_constant.ace_language, +.ace-samizdat .ace_constant.ace_numeric, +.ace-samizdat .ace_constant.ace_other { + color: #569CD6 +} + +.ace-samizdat .ace_constant.ace_character.ace_escape, +.ace-samizdat .ace_constant.ace_language.ace_escape { + color: #D7BA7D +} + +.ace-samizdat .ace_invalid { + color: #EBDBB2; + background-color: #F44747 +} + +.ace-samizdat .ace_invalid.ace_deprecated { + color: #EBDBB2; + background-color: #FFB300 +} + +.ace-samizdat .ace_entity.ace_name.ace_function, +.ace-samizdat .ace_support.ace_function { + color: #FAC149 +} + +.ace-samizdat .ace_fold { + background-color: #B2CCD6; + border-color: #EBDBB2 +} + +.ace-samizdat .ace_storage.ace_type, +.ace-samizdat .ace_support.ace_class, +.ace-samizdat .ace_support.ace_type { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_entity.ace_other.ace_attribute-name { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_entity.ace_other, +.ace-samizdat .ace_variable { + color: #EBDBB2 +} + +.ace-samizdat .ace_variable.ace_parameter { + font-style: italic; + color: #B2CCD6 +} + +.ace-samizdat .ace_string { + color: #B8BB26 +} + +.ace-samizdat .ace_string.ace_regexp { + color: #F44747 +} + +.ace-samizdat .ace_comment { + color: #A89984; + font-style: italic +} + +.ace-samizdat .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEElEQVR42mP4//+/AgOIAAAhyQY7mIrdGgAAAABJRU5ErkJggg==) right repeat-y +} + +.ace-samizdat .ace_indent-guide-active { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEElEQVR42mPYdOZaJAOIAAAbzQVbMToY0QAAAABJRU5ErkJggg==) right repeat-y; +} +`; + +}); + +define("ace/theme/samizdat",["require","exports","module","ace/theme/samizdat-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-samizdat"; +exports.cssText = require("./samizdat-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { + window.require(["ace/theme/samizdat"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/app/Resources/ui/themes.json b/app/Resources/ui/themes.json index 352c99d..db3d9fe 100644 --- a/app/Resources/ui/themes.json +++ b/app/Resources/ui/themes.json @@ -538,5 +538,17 @@ "dark": false, "theme": "Cloud9 Day", "module": "ace/theme/cloud9_day" + }, + "Samizdat": { + "colors": { + "background": "#090b10ff", + "color": "#ebdbb2ff", + "selection": "#569cd655", + "comment": "#a89984ff", + "error": "#f44747ff" + }, + "dark": true, + "theme": "Samizdat", + "module": "ace/theme/samizdat" } } \ No newline at end of file diff --git a/plotdevice/gui/preferences.py b/plotdevice/gui/preferences.py index d830651..00bf3d3 100644 --- a/plotdevice/gui/preferences.py +++ b/plotdevice/gui/preferences.py @@ -22,7 +22,7 @@ def set_default(label, value): def defaultDefaults(): return { - "plotdevice:theme":"Solarized Dark", + "plotdevice:theme":"Samizdat", "plotdevice:bindings":"mac", "plotdevice:font-name":"Menlo", "plotdevice:font-size":11, From 5280134f0173a155b963546661959c35076e4057 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 22:26:22 -0400 Subject: [PATCH 31/54] add `Assets.car` for macOS 26+ icon - source file is app/art/PlotDevice-app.icon - Assets.car can be rebuilt with `make.py icon` --- PlotDevice.xcodeproj/project.pbxproj | 4 ++ app/Resources/Assets.car | Bin 0 -> 1491240 bytes app/art/PlotDevice-app.icon/Assets/Image.svg | 1 + app/art/PlotDevice-app.icon/icon.json | 40 +++++++++++++++++++ app/info.plist | 2 + make.py | 32 ++++++++++++++- 6 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 app/Resources/Assets.car create mode 100644 app/art/PlotDevice-app.icon/Assets/Image.svg create mode 100644 app/art/PlotDevice-app.icon/icon.json diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index 1464ae4..bc32252 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 2A15C45018A329BD006BDFF0 /* editor.html in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44418A329AE006BDFF0 /* editor.html */; }; 2A15C45218A329BD006BDFF0 /* themes.json in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44618A329AE006BDFF0 /* themes.json */; }; 2A15C45618A48770006BDFF0 /* autocomplete.css in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C45418A48765006BDFF0 /* autocomplete.css */; }; + 2A2EFF223005C16B000B4593 /* Assets.car in Resources */ = {isa = PBXBuildFile; fileRef = 2A2EFF213005C16B000B4593 /* Assets.car */; }; 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; }; 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE54286CA75B0088976E /* placeholder-light.pdf */; }; @@ -90,6 +91,7 @@ 2A294464185E575F00E9F650 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A294467185E575F00E9F650 /* document.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = document.py; sourceTree = ""; }; 2A294468185E575F00E9F650 /* preferences.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = preferences.py; sourceTree = ""; }; + 2A2EFF213005C16B000B4593 /* Assets.car */ = {isa = PBXFileReference; lastKnownFileType = file; name = Assets.car; path = Resources/Assets.car; sourceTree = ""; }; 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; @@ -270,6 +272,7 @@ 2AD0A9B5186E552700D1F6DE /* PlotDeviceScript.xib */, 611CC48110BA8B9E00B55455 /* Credits.rtf */, 611CC48910BA8B9E00B55455 /* InfoPlist.strings */, + 2A2EFF213005C16B000B4593 /* Assets.car */, 611CC49310BA8B9E00B55455 /* PlotDevice.icns */, 611CC49410BA8B9E00B55455 /* PlotDeviceFile.icns */, 2A36AE56286CA75B0088976E /* placeholder-dark.pdf */, @@ -428,6 +431,7 @@ 2A36AE59286CA75B0088976E /* placeholder-dark.pdf in Resources */, 611CC4A210BA8B9E00B55455 /* PlotDeviceFile.icns in Resources */, 611CC5A010BA908C00B55455 /* PlotDeviceDocument.xib in Resources */, + 2A2EFF223005C16B000B4593 /* Assets.car in Resources */, 611CC5A810BA919A00B55455 /* PlotDevicePreferences.xib in Resources */, 611CC68010BAA08300B55455 /* MainMenu.xib in Resources */, 611CC68710BAA0A600B55455 /* AskString.xib in Resources */, diff --git a/app/Resources/Assets.car b/app/Resources/Assets.car new file mode 100644 index 0000000000000000000000000000000000000000..dc3c8a27b05afaf3c8d6f841cd2134103082c989 GIT binary patch literal 1491240 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%0A__3q;eKd#|pU z2{)a;p`xwb92K$J|B*%%FszXC7MfsPzx+dx!4(@nf zx5o7uR}IEkS}i-L(&=Vaa9=*&^Hpc@!|Llxy|Nj#LtWTFJl}c^wDuE1ne$**UnC--4AA) ziw@m5GLRV%aK~|Hl=MZ7UywJ#Fh{QyIQCniw+Y{F-R1SmgIAQF=r`@Sa=E!^Ahm}R zcDciDqFsykUBvz1b^a&jk3C&cPnN!v8SmP)S~4-Lzjnjng3!x7v(B{_E-nB>L-{lF z#HP)=C>xVsHzg7{2-HUg$0XZ2gVn*{^~-I`Kj!B<5xc|%zaKjO3sv|$sLr4a$kuUDcCR(5`A5Cx>;rSGmq&^aXbTI6^o$gO$0Y;|?NYjuh9ArqsV z_r;ivTToZc#b;6L7ya%;a<(&Uyfs%}tNonR+88`IkxiN{s9h@gwn8&@bM*rO&!;c= zc&7a5d`s?%-8|7qZe441_ft4%^g6Rpuj9xw`8eGpkITgqtW5%gF8z4(?p;VPBk_ty zCnq#HF|lbQTde)0_ujjPl+Nf;JCc;Rc-zLJ{30-cc$`WGzm95!WQAUF8J zl~49BrsFw}wMvlBbKeSm+uQUzg&u)Dt9%Z$N>vTS-0M(NKcUuj#AG>8=46ibN%yBu z?>F~_3F#m+QeRLG$he((@=aGB|J5KjJ9zlawMJ*3Qne3HewSI~nJBM4kY4@$>nG{W z7mqS#&+P7G=^C!|x@>G7ELSkmq*~$$>|>DH9w$&st-sy!V%GGYoqkdu`#7L6HU||P zqvPKnxU#bN&4P31;z~l^g=?iIT*eAk#VxRY99Kyf(p3*pcauwx zGQXXD>Dv2Udh+=2Ab4}%d8N(w{r+L~MT%)>4&RRVOtBYKEw?)-&yB9C(#YVPaXYUp zh@Wenk&=3?%Fo*r&(F8o6y)c}D8|H_9GUKnxNLn*4wqE4^Qz3r5&zRTWT>-@y@dGS zWO3%kr*VE#b7i@TXxVP{Gfwg-C6wUa0KBgZ>YSOGi@eNvJ8wc)CqqjUb*>!kHPC+~ zy{(;_la7eut6yGLJYHt$n!L#Ot0vyw4A=0l>$LBx}9p=kMH+ z=<=FPDa7&LK1cY~AFT@?Kfg?wYbjT7bZ~BVEmL;mK6glI+9JK#w%+qoh`3V^J&+C2}cG-6#2W*~MK;qh)?5K_2&3|5Ue@@>+&)v5;19 z(Pe~K$gabsO{dJiyWXwKYL1vOo9PHYz4}Pkb!N}?E3<7kiXxu|-n|;#)_g22{uN`d zVZwmb$!mcecb>MzzKq)2Q!IM^nsJh2!84r~o9k|UnbFU0M*jY#OH5tNrurMKB6gV2 zGx_I}%nuEzc;a%zH%?mQeQS(c?0k3Z2Ymg@Pywk3hgGnqs_a3AowmtXJ$_s>sLifI zu<&t*fs=ygba+g{Y8dXMbpDK~>9JS$j*pnH+B6;3@NJm}317I4C`SkXdUOyE5tXDU(0tg<0~x zOLe>2!tVNpPcts+A9}J!de_@?zcvKAXG5zJ}Od;*%zP9l8KwZ9x)mL}RO?OGZ zS{V*flgev3eY)^dyppwfo^w;9qnk~{OnI}i?mqT?+upYCKzmzjM9$@G^AOB=5j+&RUulycPOo9AARp|SBBPe*&MkG4NNCx$>EMqWZq z^BkF2oK=a{fYiPKv<|&_1W8CVEMnX|wjfnqqpv-ILlT??*CRz(=5HM`;D zJU3Fg_+gsUe%jZbDfTbxfMAA}4EM<=1a*AIkMfKWd9nn@TpA=E;Ajb^loA~E!OUHt zhiO#vZ!noTdIcXS+47706ijLfh`>_!I>R*ZC{*cCE{vnm6kV%-A=xz%pg4A%M&SIf z^*j}aP{1^k_kv*3tjD9bJ-#cMri9RE{0t) zzZmJI8a5pGDfKI1IiNtmTlwbhwdHnss$il}JA4Aw%7TGMVXUbHQ*93~!vu zw=bBZMm^Tb#qj$`)(Dpu_>o5z9a>G*!sj}NjX+D!+-gM9LGt)tv(oTGJw$<;U~euf zHPFO~Av%;?%hE>9q4Q*^PeJ=u(!^xk1jJ&{IgYDRFP?gKh7#UOSJ1L0!<6+U^f|{R zNMWyfU(#(B=ptB-9-$#9Pw&sdQ8|_zIHjOr#9&yUh6sE&1*o{m{ywGxD8S-C!nL|F!Ps7ujnZsW4xoU@^YD$=~bllkbs7ajKYJG?yeH?chR$ zCLGKZza;Da#aMG*GA{P0C8?Wr|fhTYwv_{Us1yAR_0Cgr90hcY0~slPYWO~ zVQQ*ui2<{7rEsk!?ffPiL& z3ik=&%lb(y!J>NIc}@+yw+Z8}Aa9LiW>% zguXnbE|L#AN~B8fs21f+7Kzj(&lOPh9;2xz47z z@h!s~MC3KQ^y=;{2e;}t0LH%${|JD&+9Lb zrREDzd_6p1se`Y$n8q3ae#6>I=Y`BEGN1lDCQQ_y2iJ>+C}fx=J%-zmkuFDb`i{TX zhbWiGZ^*#{S;>Xs=w7j-LI=zqeotkY%GYS1390_&1uSAU6r^e@bcF|flxx_n>YLUl z^TQbkC_)THAStwSb{JV3(fjliC0Y)^I}OTG4QQsd)-~u}-&O8FzSJfCFM5bsFjyRe zqV55!qV&Kk+0@TSN+Dcd5Db?Fg{07cfDAhStU}Ry=I6rfBY;$0ji*2Od_${^7NUqS zA1NDu=(ah>?lpQMO?OA5AQ_*mIE!6bw-56*k{tbXF?n7T>H;R5g-f6Lbx9C!fj0%P zGz1*vZ$)T_lC7e!4l)2{co@S_f}7dpf?}ly`Jh~8(X1inH9{vH+5vpwDh>F-nNXuD zb4?Q-SNq9pniP~?Jon7pTmh7QT`;Tyn1xPq2Obbk#Zz#s4X*O@bJmxO4Okrh!p!o_ zxe=9zLj@?KPN9RH#%l*i#9DL6zLEfKa9^sFJ^$~yW-~cj&Jcf^pwa90eMu|7iMzi? za)sHv=9+uM1YRa1%f+EJf~l_*!3q49O$BEh>6J}VZbgd0CECV@e0s8uyRb5Nv#<@$ zFS5hpIwH$@S+Zw?ETqveMG3I1m~1!g_pCbju#^b(M0%Xe{No%>E9(0g@UR_lSe7ae zJ#`Db(6j6u4}BuA!a7{t#3;VMQV}&Btk<$4`)_6;m$@k>UN}RPp}d3<3GDneqLV z_`-4y>0MAFUysDmfZjoWAMGz;M_4%@N-ZhDUeFUYm0-MCCZ^}R8b@?Io{PMi0>{LG zCrhX&T*GW3pqKgiqK}c0;2h{R#~#uhUOerJ981TNRO`p&jSa*G*7d5+S--a@Ofj@^ zfwz%@Jo+F8zrj^p4*qIR3Mn1vnL3jI#XvU|#|U^TS7)^Y|2uP&88fSDS?l4DBIu0V z^j;krlvv7TJjFL4^EoTDKv=ym6Pe|2U9<#2tpupdB4z!lqB>QaLfsPcnngvLxF1|y zTxR*e!-hRRU`)DyDi@|oK?*dNTxzM3YOpVc?4d90s%>mVzXShi)+xzS-V%X%rJEHI_gaXBU2q`_zI9l}lagsOI z0+TxLzZf&Rex&|>Uqdn=y19NmZl9Ltwg6Nk6!Rg$1EsVLui@neiT6c=o`e$l9-;_k=fovHT*pPB7xlhZBUOG~nd z^;Elh=03jPCd%at$2o8zs67bCo9C7v8?VV~J;%=&-gwMW;|R2h(Ik{*{J$Q;(n5wU zE`LV*#S=xd3s{sEZb&^5?LOUqn!12qU@YtpdYtqT30F#<(^kdHBhiiK>9qZPW$T?Qjc_Xg90wbNMt|xu(siMevwX!bQYI-S- zcaPoqrjX=3i^r)ndw+3pFKH%N(Ns<{UWP#NvY?#r>wzMCQXh&il~U2+df;y8j>Cp^ z4_mp~%P*oFBRNf!92c=6bX!gFOr96R_43`tm?W;T9||@XaCp%#QSuc-n1P$ASgo`j zWygLxtS5mV4ZJsl!tZRVqr)7a&or=_*8;rA=IO|^Qe+bJ2hU z3tHM6H;XKrfUaqGZ9Hs%=u6>M&;(7@s$I zD_Dm-FsmLX`S9g)QQ+o!f&8WY&_rZlm<=Uf$XMB*R}7oLyI1L!(8Qud?K;VL5)_eP zNgsQqbHZ&-tIkU&K#Oe@vK{BO(O|7b#a+;Xo}! zYPpio2$_dDN*&OF8RvlfyWLPB`BZCu5Z*Q0h9Pk%wm}g8p-nbRFAdj_ts4wG=h1Sy z&6@Kx_(EoC$-!oCSiGA5EhDIQGuKK9hgF=pdGRnuYH=5-TC{V7{RV^Yd$91d3;^lL zhsv&hB{`;1d4xhl+L-73n9==xIVLwDO|tPwh zNc3Dgn#8e>z{5~J+H<{Dyvm5G(jxvfs455`f|jjws-Vx)Fwg5az>*7b(FFgcpI}y* zK-Gy1)_I1qq5MpvCo5jr0^*dSiW`NQ=|-W1Qw@=B|ZM5)h)D8t47KlrAFzQ^iZU z%B&&zperbx3;I^Zfa8rYl^7p5q-e4tDu9CefEGyycBcZ#sMd>+kuSvsc{|HkvaMM= zhQ(^TSlS;o$USF}=_?tv#C0yQD_>C7cJlX1_H+VWlLevFMDk>Uk_;;E>sJe)!QB1j z5L_Rq;m7lzhlh>O{6A~1^TJlAFan!>n8iE&y+IGtYS4PLK5}YRl>2LQFg0jouK<=L z3ebkpWB7Flk4>W?nNP*B)UiK1OvHT-+=!OkFo#~%5jp`+Bv8@_fFw9i8pI8E!ZAt5 zfB*{y*JE?3dRH^FL3#O$mpu0%BVj|33hm^41eYd{Z*M7?uLH7CKm0!65>0n~LIED= z6(I;HDyo7_dsk9nl$c$k)Gf3 zmhM5dJCPjSSCRmn;M{``lPY1%Zcd1B@f_L}WKOxF)@GP4~ksQ9zN4 zf>9L6W${I?$^v{SI7m$2Ps^;#PUV!f0H#)7nBF{jHV`tYcO@I6>zV4S+Mrqse*${P z=bv{eu}4a=2YOQQZCRqZN1E`Uj)G+!2Qh2X6umB$jpCy~{TO%yZiVxWnedN+p();J z_N-0lmDv0PRek-7!|2Cr2LwKMEc@SUcl+kThi>zxSM4321By za`V0=No{k0gT({W03IcqVglTt_lVS7xHnSkKF1>U7yq8Nr7WAI)Exp;XkM;+<`8CD zP#F^D95(D>oX;1KPrpWQf@S*iv@*uXkV_(tvd>VB2MPv5LBT+U&E#gZnKNs(wmn^3V=Mfyr%9JZw|OW5-*FI1Bb-AV_8} zeUPJF3Rx6vnSKTCkk*UjWeJ>8$>Dm=$`I=91BsEc_0*5k+h~uuXAD{`T>T+P@vh4t zRk!Kg9e^qFz*u2HAxpy!1EIV?V@8^n7DQc|=jnU9l1B z@4|b?odnKt>n!H%yrL__^U~6#$?n544pjpfuXaKfUoPRqzKBbF1YO|Er}762$7AX_ zffW*yqj^FNWj1p(M#gGa(|Z zo3`e}g||Ac%NT?|qV)E`zT~)czk;`DFS_Q>cX>t$_HkHe*Ym?A6cl)cPNH3m`(eQX z==VX2AxXdn6%TrtvDsQ}KEVqveF0K}J|+)W&1=(-)lfjW^o|HFWWMWeY29}iaJ>T0 z8PL~R--2QLAM)iED%PFYF0-eg3LzAr6>nua{LrW2F?f(LoP}Q37U3wfYH<$eEnjF_ zo^(Zw7n~IJGLw_hz>E?6MPp*Qd1cfG{BuD$J$xnLR{xta#@y0iQDcUpK*UOEUF$GT zH54##Q#argRu(xx^s0!yxEE zN7yL?u^vq78A0?QR5+2o1H`J$FgJSu8p)T;V*EB}Ek3k@FO5^qGyG+b0u4|BlUb@3 zRVp?i$v8Z$7bCD!k%dDje{=4J^|LPC@6v_#N`{L5n12R9)awxQ0WS=G)OGg;u6?JP zcIm<-G`)|r;w-$KZ}-)6A+mIj2gV3!2l9l-FgEMU$WNeemDS%YT#g9>6I_6~bZ8Em za0EWgK#)M!7wf!8|f)Ubw=7MU+aKF6aiVp}!#s^Q2S2 zK)fU!l&%-q{~TM|5cr6X5qt>Fphj8A)5U7sDT+^YIp$#E<9y*~Y~DiXQo-+~l9N*k1lH&Q6zzxulE9ul=WGciMCUy&edRcYwHfB8N zD`$qM0$q*OjFP;SEMXh_D*JE9YMd$2yj-7j#BA6t4Nf<7GZRejB&SgvF7CRTWnm>) zYs$S`Os0y%vj|+vTw&?mSXcXIxumryQoex<`EsuRshYwSNHK%zs-0{1jVZQH<;?$_ z&))6jpKve#bKBwp`y%O9wo)Nhpif;$p-tT3Uw3%vxL2FqB7i(ZXl`-$O>&;SeenE-FYxCiN z07h|d#w&Vx!lAMGoH;XAxSe(l4>ZSU;B}71;{1c9=+GZmi|3#S8yKYgcg)%_K*>c) z=MhiQ^Pq5Ri#Zvo7_VN^X5cQnewQTYZrPn_>O3`o(=e~Hsccdrpx=pbLV^WbMPo(k zibT1q8XSb-@JAVAaQf>Jmx(sG_<1H=T3pICq@Oy^Tsj-;YJ8v5wLgW0P&Va&4mK6; z7YK!pLcX(R>@b=~H`l`9Me34m@Q(U_X`aHu@Lxq*cKfh4P6i_Z=Jpk+IMnQt^ zta07=>ht5%*s-yATX+i!dgq{Fnog`$r<_nH_-@!lrhajFByW#qKFl015=_JY8b1gl z6A!ef$4D%T$%P2k$$KwF2@Xl@(tHMOHK#oZ#o~X}4)nuW2CYRO9u~-Cm7la2d>}9X zq$6j7i5ZiQktF$)WAq(Z&K|&|ESbFH2{2G#1=0W)#e4*b`3agdub=3B0wGn_is=Y7 z67QK&)}nJCel8GM2>&Xu&ddGzIqu`H3$`23-O|wa`Zf7+ zdUwAfRq14cdzPe0m{7jlF8-O?3)pmAU?mWU<}y)WnXjzjzXdB#<^(6#U0%Q0X*b>U zjP%C9P%T`bdKf zIgs!B6meZ=mEod(uJH{%VF#hZgMjM7A^ch~4^vFXxE3P$rcY;GiP<~4$XDEdHOzEl zREzQbi{a|6S0{PHfZDIY@!i#_K?z6!Q}sy>80fb(#d=&`vrdUolAYOrys&Y;D~msO zQ{t&s@OqIeuH5kB{;l=hJpVMA#NsTA=O294qn2H&sGtB-IQhJ5r6J?f#EC@3JmZ+o4rsEG*&!u*>-yYo-}vijK5RUDZCeP`x-biB}~3*AQTZtZ&)&}{Lj{X=hQpIXZY)(Q8kwy^~VX#UHsCv8{uC$;MX zq! z^)l5fi{oW@g*XS&_IcC{b3Rp+?=kQ+IX+NESwlX6s0+kVu|+089X*X<(JG)LUJkxB zAHK1J-%s2>*2B)b?1&L)4tnM_kVLm+GWdGI1+)Md=UxW(!#q+IHI55^UpC+CZU%@1 zDph%&)%CV_CnnV>82GoVXK}c(P`Ezju1eYnO%V$>k2G$`k}kg2rDQ-70k9Sh#mp0* zUE&rQ$!fn8h|C&1t*|>Td`;pBXUuRcCT(Aq6b`l$KVs@EjDsE+R_c4Fi#pp?RHK6a z*0X{^goKEk^~;pJ>}(<@4&u>#FW`$`7rQF^3}0IaO&z352kuoWTC7 zJ&o3u(~{T|bE7n~7pUj(maNCsbacTdF10UR{$fJX(I zQ^I%Q;#DwJbc~ePk4`k6kbtXk*WwWXUsXp6q3ZWi-{WE>&~k`viOnJ17|{Tb?}$R0 zXKm`mK1pcjl6#v~xov)(E%q^=26_x|w-DxbXbV@9UqkJr?~mjv>o*nh@RL#5OQ_1$!Y7iG(mhp|$Tw`#SKw{U`~*K(mY%JHH0q&8 zUUgUfOs!)TCyprpaPkL?0#>XjMf6q6S?xBpcMrCr8FTW_zrCrAfv_;D8&ul7k(sfV zZ1^eKCGy$l z(kkKc3I``Gm{vow80A*}OCdEy0cuS_N3QE*fHun=rO%Q;^2+rpkWp^z*n44l z94GcMfcAxH(V|x|QAV0*>D1UZ5QbGvP^}>7(6CtyFDwa1>1Zkr<_QICf)2(Y0$oj&fk3!{qKZntWKcm6 zrKtFji+J>DnRc@8ep@T>@nqPHoMLc~&@!(=D*ry5YG1E4gtOuEb32U`LhBvW@2?wu z6dW#%wh#IulVUNC)CYnBdc{iaT$dJDxIN^aAz^g{DgMP_Toq}^5}SM)FmMo zr95WYZGERfCUU$gBDIbX?2=CCUl$6~b|S~;A*^JXjKGJ$C05oU!6JEH|AlzzfJ*SV z;O8-^+{to}=#Z9MBd33htX<{!r7wXX?Bx;>HEmr|SSZBiyemW`8fHcr3Mg_knnjRL zqMUQ>v$U)f=(yI@!;{b&rB-yn=~%m7Y&N&B_{G2yty-aQ#8kHSAn8y==}{R@ftddE zCpq&1vwXA%0#jGwtkJQkh@@31qHRE0_c!&NLl$zZzVwm5 zMmMT57b-#nJxTt({BxWmrKks~K5*5+a|Eqjvehj%t_h|mTs-XG=L$GE?V1*)aZI81 zA64zSh|&6b@`;1l0T>X>ta{uOnJPx(cly3DD?yDIq$NJKy)Txcc6Uv#hsRX^foZQ< z(Y%>U?dK)`mXM3q0P<~RNvOMV6)t)u%uHMor3@E`m@!2k!BM;#PA^-Gh?=0#;q%hQ zK?*lkT>C{AFD}E3dNqwQ0<-$Xju1X{U z<27vYR=Y*#G-s8vk*_(h&D`nU^}0J%;4oTqwYC6SRUZ zIC$a36ZgT-R{MTv6Qw;b6$;dS;GbXLtl$_z@*&Vkr`Yc*IGFW;p#I?wJ^e+3*?T*A z`4n1Qn%9haV=4B2G>2Xn=c`+S0x=j?5P&I08_K zl6v&B9GOw-PwgtCO8Ca~{KgilzRKF~&H<=A82uRR*!Q8uAs{h3(2Fnkl5^~_+O!w* z*5+l#rFtK~LkCBp$`4CT_Rq?!UV;f&X~NUWfqmU#7iueIZt9CL9F%)7Z3C}R2v042 zjRnxldGGv}g$D;elD%cjzw{n{hZOF5HLKd-d=%U%+@q6hIgNXn{=SDU(A}_eEU?(@WF4m}gJnkf1yV5idKC%!4y&I4btb+EOL|poU$@eYt7dvr-k~J{GYD zh$=RVa&ndVSzV!`{=b#K+LD6bGxOA2PWQW?d^!b^@LQ2oa4rVZm9?Y0M)~9j{2{;O zBelV*V9s9fV*AkKf{T8d7+Jr@-s&N=sfXb}h1?n&ggE!OEfb{D8%=*dl~gZ>d(`u? zoNdnKKXOhyXTLwbHnysS{EK8}jGPZ=zj()ssic~uBIfnQ^dSM@Y$#kv^R2mTW=hQo z)vMm2t8!n-%_f3p#Be|BpPWiqRW1Qs#O zf`9~B7#I=6A%DgiE%QY0OWrd7D&!XDCTk~?_dSevnD!H75;@tY8rBzd-XiI~MmOtT z_~4z)krr8fWGKNTdj_9NThu8{Gl&FAho3``HG5_Qc+m?R6koyhQ#*Wv4aPuPzJk(2 z3aV<|Z+g!}zvyP&KRmBL6v`OA1Za!Qo8YMg#33m})d4u?9HtJ%R{+WAHRe?--6o^M}yW{l%rLYQTp*=g{i=z3a9LCZtPV&>j9U><$F}}G_ztZm{ zWtc7j{YG?Q!MUN|>%aZJ{MPvKd&jTeJU@Q(vvYQF|C!5M!~SoHf9LYDA5yOakI@8} zDuD(X*CPzE?+Jx9GH~oqE-z}hr)OY9{QRR5xhJjY{kaAY9_{}~IQe02Zq@%uRleqh zL(DFV2Ug;F%>bosPd!ny(MQ2DPRd*I7~~zRN2{{or0AZqP)pIBq1AnU>vFmIy2~q` z=Ym=;52AhcH|+1QA6f}}tT`A~BrmrA&gH?d6N%%Rk1j8J*1riWzVgayN~f~HzSyj| zVZTmzGy5k86fs)~;5F=X{L7APWo-MmPWE`B9ux1YOf?NfC92irK&sD?KfS*CS|qaY zrUJub-+b};D>)Irb1gIPrX9EOy_WLWV*g!c>uc(R{(|?YuMfs;KkY>y{dJ%7lD5IrOD`_SI+Q7En@5q@ChIPT5BMTGH8x z!{vv0Pi}-@Bec9EzO^Oi96TNx18&O9)CN7>v)kV8&hF(;H!pYI3uv85JN9Zi=aG+$ zS@_t|PrfLOQsb$pALa(ly-k=+WeH2K6OZ!_6;jzMq?#Fnv5z$*h7^?wNs?;p zdm;6qbu6JBZItTkch2uGc+R=cbD#Tty|4H6x;#pth%C(Wzs2(M0q;^y?y|dB*Usgv zZc$aKqd3Kh>-jG}sg1ZbQhH!1%;QQN?bpxB#Gp3woI$Opm=}1=@6__Lt$=y_Ue9A2 zf0Zp}P9Gz;?7NUBSMqVt<*jzj^=6wa{f6`v!TelCHw++?tEC1G3RBA*E3W3<{Gz?@ zl+IBR;Ppt$Gea|{Lq#$%taGEp;LY>|)_3Euq^_*X!~GqVMuA0fiAN8lZ$|=O|4mh9 zlGxT(n|E3UAFuh_t8QIB^x%6464NoA0sKAWLs66bcIx}aidL)faG*DIix)|bRDFUA zxnJkA(`F})^pvKN%T6;Jkycf@Ig}|D97wWz{-D3QwO01Eo#1)TjVK9&NGJ3z*?06w z0$s8C=KOojJXcT6`&QNEtC_0q8s_U}$0r-nj#maApo>&U<3=}5ysq1YdLMTA;GS() zw@$TAo5_U~2bELa{YrRv$6PvHIwo4nu+`S4PX6V-Sf4+=yqvOfOyvdR6OJL~64UDL zuG8w?AX~M~aFFDh5N`#!lK=OaUS5*Wb37LN?cJML3;a3(c zQnHeEf0&oQHu=t8$G|M9jBS7>Vd-2Y)v49pc-tSm*f=^h$1$9iRX3S%^ zyiZNYf6`{3Hpg7Lv4NH%C>XVuhCx0jbQEe94h$B4e82O0rQandqHJ)D#g!jF9~30n zvuNmxdq`0`1EspX1B|D8Ts@@!!o$Oj`%5q19rb;1KPx*bR$uF5gy9Y2Jof-zuKvg~ zQpdx|pL85OLwy< z4g0kV9{;nt=v?XUy%7r^2{WU+oc%iUi@sQxHk4>c?RTtJt&+2TJLt1#kF|H1@!O`9 z`>*}5JX79I`ETSY+*4c%wB?}dsZ8h{d`|OTim~hk-AVLgVRntF^7-{@HOtT+DYgxZ zx4q8~WK4uabQj(^dU4x>h~(^Dr($$&x0Stf*`qnS+HXqRLZA51td8!9>D1X-&1rdh zb!Rngh}mdj$E#>KJVP~hxh<=6tvTfEucd#Gij_}Ks6p+`_qUgMd+&^RGJ4~Yfu$Yq z@T0F6V(uW55|0cOJ1q3P%X~k1CGU^^bHS6lcg0N{-ZiATQ&1?ASHErs+QEvn`ePRc zcV2U%*o8aa|2feDBt{S14NLetS(lrZ*3yi8&U=3!hbDnpr)_2DMV-Mf6O7Ea{XPnZ zKdLwq;e0YJKSTkYaLGCFvaX--PU@+dEa4EvV+7kw=JY9EWk#WI@%@t{c3xjXK*CsWFOfi?sC*WvwQBpxW30dw+=}u zU#qlE?h*Zacz87C{iVQm2^IU;<>isGWzoBw+diwJ4-Fyx*?ae&2~dJpPU|h=#(3Ai z)o0E1>Y4k>N4CxJ7rIi-T;ih>0!HK6?H!H7ebZ6?RZMBc=DCgSr=QyJrZO|F`}-CB z>xb?;y#IMa$WZ+FqmA@l1;E;}DN z60&3X#&Nn+>-&A#Sr7ljLwuc!J>qYif8+v@<#5Q(Mt?Jrg-W0QN>&_n&*;c9eEzC^ zySn?{0c(Qh8O~rZ#U&hF8q<{#Hi?C6oxTz19Daem?U&)c@?XD}#ymZ&HN4Nh{5ZK)Hm=0?B4@K} zKH3y(vVJ03FuB{@YCR@$WQL)rG;!pn>m{lCBSHQ?wRRT#3a#U#r>$O-!;a>-{rI%4 zm5SgEul}cqsNd7)ca}s;yhi1%I$^LTWUndwfT^iOi3a|Ea%v zepu;54^J-sc56}Ms7G5tr?1CGy6yh8rSa-rKNoI)IkrG>MoNtS+}&)~9=qG~iiP*b zF_wm5<$Gj#7wgnUAU&siZ`S*)Pw%PEcYd2FE%9)7|4J7~r-^M&E&YHcuSLJeQs>mw#y^Cw-q#`01W`uDiRc zL_9r#W^Z($*$lel^`N8jdq1}iX`>}lzp}GMs-Ci+dLp#sZ-qn^lAk&axN@zlu6Jpi zw3tnU>_7VBocIzY#kMyY_369BtFegNhcc|mr+a7{y77{ZdOdpDd zJf}b@$MbZo^WJ}{4LjSn2e(O|XAS1x&9^k{Yw-xwG974-1CO`_mJK_~R_xh(t>yW< z#O0Nqn_C|6+iX~oPa+gM;Na=hk=o+<_;~e_sOF;gtuHjchMrSE69@{*=vBs*3%{gw z_N-r%eKR#<)zC7jAF;R9b-Hr9g1o-}Xqo1C@1J{h{iJSsRa1_m%kUBVZ?>-gbxnty zq2|h$G>4wEIeBhx`e*Xk5as8+IweU zF!?*J3L>@i5Ani>=B_`ji?1Zh-{^a*yZf_p#KgXndiRb$%~OvXqaHh|KKSgQXU+Z< zb^A5;%z4g>UDOR?)L+V*2RX5?;*ae-cI347d1~kI=TajBksaRG%gj zejP8q%c8ek`fu?XS0K@QiSuPzuk7Nzt!12;W8VQ?z4QBxI@5NuWEy@1cp@%nPCVJU zEGg#mYQ;)__^*4#`v=>L=SR1u$G$r5tg1}Be&K?zpI^j;-MkWP>7kQG6XCu1k=?@- z=VQyV1G`^jJk@^jhpV{bp{%L6^wxd5-XvM+y|6@Us6O$3hz!#uSDPQbb31!1-ZV2g z_uJ1#W%R(6qenw9TRn5Jl7NxL8)O^$fbJEIbD#ZIN6iC%efTh3hs^snauql3xnF7X zn=hEHrz`6=Js?56*Wo+J2>h>)zwKN2%Qu~jpR6aN3Y}#O9~(SMdo$<}9BI3Lt<2;? zO5CNs%XePybDL`1av(?4*&ZD%1&6~gyp8lY^J}t;r1=zIdtv^yo63b+o`;t}7pRC) znSCL3@M~Hu-ok>^lX1F>JMVYx+2j@9IT2I6FfuKUG4eGwr#m#OdnP@&(9L^Abj=yu z`|rZaFg3&Gz`p95+s`c(90N$+7q+Z;{MiT$xM1l&V*V!hG7}FM@1`2VVgFwcZ&t%BXvK3(BS{9*4WcE0;H3Vu1gNiielVMNHXaQYKSw4v zRGCo!7GPd>iA*55stV?&{wgcfB_WS~G6Ps|N?FScT?V}#Sb_ESbWW!}`skf;PsNHlylzTY1F`Mf3u@Y&IY7ZV(MkLq?ovP~;E<1R*;#N4S}D zQRlo%XGKv^5&~P8HzD|S` z4>V1ulEmMl6F5+Ahe6jX^*>*RFS#t`EOz4H)tDk3XI>+uJUaF>+ zdUIX%ZJktMmK6ZLgql%5BBV+>GTk6b#%aK(B{=ifDZVP<;45y^6iFB(ioiuXz2*MjrrJP(Ga#q3G+ z(E|e!k`-}er!2Acsh6guuzBh=AhC-^lN6`dVruZ=-UX>fr4N<)@*EI?Hif>2mAqg; z6KsVi#>UvwAB4CZfL1*BH`EG(lm2s@|9PGyd_)1e4yExu0hKDcDGP327(GfDuXq>Y z6knl;*p>$LvBXX{`&YTCJbLj}(kpmO4f`it?vZcjby2C%qeBmRK0?*_$r*<56cTyH zGsp&di7ap)0GIj``piJ+J|fkafS~1)SIpPXh3^K&i=ZL12yu24lK}{;-|!OKmRCMW z++**N%luHb$ zq@x$7_Mo;$^Xtx#_}Pga*+1&Lhylw(ieVUkV^o`f&e*ZPjU9HxEu*AEf?s z0u(S{vkyMo$DRHiT4~{K!@8#ZP!c>PtgHFcT3kISvv2}xEB{amig7-vLN#M;bqwfY zbUjC7i3mDjKqd5sm)9e(Ae42L#M~Njh)hO$2>x0_lpS8&BGJ{(tI&PI!R75x)43;Z zG>GQh@k4}xlw(7uvFbde?#;y_w!2tlkaiM5y!8{mBwtOZy6~mVI?XJ;A7jDplQbRm z#*XPUDM0kABXQac{#T@IIG+Gna7sm<+e4Q&Hcp6xv?#C?#=0)0{p-t1;Z}#Pm+EC> z0{gVkzs0)Z#$EwlxolAfuJLqpcLfldAkXbi+qfeP8heNE+?vZWQh;ca=pWs>JcZ6R zWcpm5=#C9^5W2L?y9H;DVa^M6B)ap$h<&W29+|^#+VL1do3d(T7YgK?G(3PuUv;$rgMmQRf zLkL3aEKy8ah1(*PvF+@X83mc=CeYvDHK*Av=Itvmv#na!zWahYjAm>R>)tVz=&1;$v*=00)gJHDr?dOJ5rh+cw_k`Y3kuEZ|~ zU%gFa%ZekS5eUG>g1e6b0fhzCgdbW!%*=TDNpbTH9JUkmGBrz%WJm_bB&bd2=y&ez zdD5iq1fgB;V(R$A{tId=Y(jVPjsumx3d^^hA_FxyUxtu_?>)Ta%ZxtZUSlb@sNYNx|%b<}AHeK0LB3yslRW=f6bfAwG2@R4y z%Cqj9OnZc}v9k#JS(*8g{tiE3|8H4n$3ZmO((VG5wJ@b_kz#KZZ%;L?>?9iQuCU;X zFY{vASDKy#x8!%#F1_LNwa!jX}S^(jsDsQwERg}9!&OtKZ4X1tjx3OtG492m7eO|Q>f+nJQbbNxLj_A*hXhPJj@=Qwbf&%~6rs!X4`pCtjk*Ypn9!J> zwUqwZqkFuNdmX#SaS+O-Vf>`3e9l?_9>4$%0+f5j1;6FfLm5{*JiSzxYH&=OJl3Bk z>EQHBE{Tm@zMpHul=h_jwC};YB55o24oQ~sJI=#G^)-b*!jV~fy5wR@(d2jx6n;#$ zf{-(&{gX_uWDtfgKVEEMNHb8i9QQ!%RS0G)0x-(qXNklWc&5!9$NA!5mPWoj6ezbBFX~J7P zx|y|iDLH7y*MRo2|b+}4piP05CH485Mt4p*`y@9NnB6C~(Zp%A9?3JV$M zf)1X1X9;bs#PxugKo!bMEJT=cVr<7om{j#=y!M?iV=rm;JX&l>bioO=1c44wS#mZe zR-P_LVOF*o%L9Lums|EGL7Um+h@=NG`BFuM=qSUwdl*e1dXc()?a74UB+)~dX`G5WQFZt2?Jo74ugWx%D#$(u6!F1@_Y>TrNT@Cz0UWk~ zT!Uc1cy?o`9nm|(a8MnU=3>V^tY6zk1)~a>pAo_O*^X1>weI|dr;^m*$jkv4``qko zvn_oG{Ka7BI-P7v)fTY7`#R@HCDf{iKIVyS|EZMxTb5­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%0A72FtoH6stq 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≧bPGE3On>~Z&)ZTKBE%k9Sw+}L1o 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≀OIE9uLUd_7q1y}XIwIU4!A4c7Gzwkw_$D{(uHIwOR8$LZ$AJ0h;52LNIUAz77Z#yB5 zTCvYcXNVBs9^zJYsac01bR=PFnGsted86_f;cq%k?OYJ<1**M(qR>lC! zr0S={WpafuQEqC8^?a~)a1{$y!Y&`>m}jk@{9Qh3`eZrkf~km*vFz2^EJtjoS~SZE zX;c0?X;BA0y!o4VZ_D8oOBI5(D(8plK7)=gXf?#ZZAar@MdaISZhWKRnS9`W9QFOd z|8aCC?ojpr|37COW5zm*eVvV=EMs31V+;mkZKGQ?q@ucONTpKFEOs%rP?jN;c1opg zF&LthrA>WWhEyumkP3S(Y%tvL ztlC9XRs}~ePH@e`#6t#jgGkL#y~y6Q9P(`6YMM4ByhwiZqyR%5Zfj zs3aJt!QzN>D|0U2=+nM~%5qEk1Rn5MA`9+XzL{rc&Uou)1R6A#1c7l$j3(G{Jp$G? z2b0ksQj@Tf!wEowCrCJ^1T09GpSyyGk&jYAD0M4ACZyo$az7ar%FbrO-*du=MxEBc zN+lQ(fJ!_3>=+w1J&xiQcrmVGWouS~Vgc~zB0%#*!T$iQdH`+d9Ug>0kVyp-$f@0_ zIqxUdv>diYT=N>Wh-`|iT;ULVAIh-Q7l=vY-CvvJM9{iV(?0hjdnPl4X?c><$w+oO zTLO%-w8m5L*_NE}xHdH-MktM#7$zR4-Nubt1N*F^M=8e$a7_Ws_bobTEcSz)Y3$sGA+rW zt;G%6*|*`mx*_EGAl@LLg0Zz$woa2dOV?+lr5gXQglf6S9oMFbkZ}W6z@?yU^BBI@ zJ^JUdbAuJ|5KC5u=y==uBiM9IOLn-R$?V(ap|ATUEyECWCt1MSU(LFelh7z%kXCOu zhlUAj=d|MTd&n%!ICsbT`)=yCRj$SeoM8SK=y(S^*}%gDi&k!N3(iewvY+AV^po6h zkMS*j%reXfQ|Xveim*#J;yU?>x!Lf9gE%??Gc${NAg)=g&Bh*Mv=%i%R&l#4I0!-kP#$vt>e{U0ReJvb;CgYqj`@-2GH{;WbNryweaZr`p z-I9u-^E^!oD>29|>=tQ7Uy-CGsEg{a=|gtjba}u?Esk&6>t^zRr-*` zJv)Q0o@44bqdWd>V=pdN;tVaZG2;sA)ThFmLy~3ZoIjtu@tsRYp%nDkqKqkp&VpCx zWsWMLQMaHc-IKo!Ls-S=oaj-F?*|379_QqJ>tjazHydX~6FdP=PAai+neW6V+JP>nDm*;$jQXI1CZmMu7`5{3U5v2L zLC@S{?R`m9X>ury7mmwiB%v_d@;gJNYR6VjemrG2uZDO&P%Z4=(gm&`NEq!Zd}3Yc z1n3_4W^NpA0um+skxPG*HW&Yn4)|oA^Dejmsr=z+)&~hVO$7aalH(T z?@VfculXtZRp_41qg}!zzFB~94<=-v2))|~R|EO0XE)S|;zL+Z=S&5~UK-d|<18M8 zU>Pciwqu{wp3KOx~0np3NDjZ3+e~Wt+CsPZv)eW&l=j_AN zsB)e^|7h6ad2`cP^jB$}2LOCR$p*Dj26TWGe*y6_8u(-cz#S!kN8)0KVh>^I(4lY$ zvv3OyB9gmWFnygyyqtzdrbCE;P8FOvlOE0l{%%4rzeLVDC{}ATfL#`noE*TesVZU9 z|0`?)v)5fAf+gDjmjXtsOH&ECeTLX523`!~!g29ws*cR4Fxx;v0!5aHzDmhz;+x>9 zbB8P5$+H5L7OB#7F9(Fy28PE0HWjY(Cg36Z@~H_Cv^P=Fyf`J86dLe0cQyG{0s`-{^gPhWVSI*$MApv|#X zX994FzFUq}_4LPH?{k>hpoY<9bD1M>oay;M$kmkQY_}0&4^&i+;L(pLL6!%TaC;@9 z@od+T;KTT#@RFQUwq2&CyX|Yj9X)0xm~THZ&e>yEHpbJG1MV+GgsK~mHgG~up=~d` zlcV}uT}!+6tVtL)J2wO=udPA*x3{ev2Hj(eNjX&*#cutHNzn`Umtz*Iw~lEP47*#N z@x}y=nT(^7FQ)FonVm&^O9d<5#vLuh$8yQYFwVf(-t*S`%fHF48}ttT9OJCeru@j` zZYU}F5X((0Y1QJ-^G*fEX>p(l zpwtM3pr)C8fH5I+um3Y)JbyEkz14%MJmE~%aPxOgF+Z4!%UY)TP!cxa^luu-qW!HW zeL}_=V`{3Dxe2UYeJKBh=i=fnE2Rmgn~JWg`z2|9k>v%9@^s&rdqJTwDvQI3QnNrD zzamnB(ct;)Y3t;L=5c!rl)X!qYu4L`K3?+3CiZAU;%<&?f28v^)m(!Up>--d3wX*} zAA3b6JC;?ye#Za@Ihr4Q0XuUU7s2ud#XlZHeOE1H`XH+s_=4PwCp`VW7A?|*-F;4j z_S{b>l>_G1GYS{tB-T^x6$bCY$|fw}HXc^2WWVpz6NS8{Xt}5mfEADRWJXcXUURw` zPU4P}{0}WNlv956sPz#}rDAx6x(Pq#nUip07tJE}`M&B0JUcM~1S$zYp*FpwG*EJB z0%Pxa?FOe&1ZiBnEJm5&2M27k>GVnraUS=@Bo(oefmm3dVwNh3PeonTTn^P~3f0{F zeycVH#|W-S?tc?gi^uVcSnYx_K0z1CznA1j*O3xX>T>7bLcRRz&$C>V$)#^HUeEuq zMMW*yMVnN1BY!0DqsC7A)0D4t`IjwPZKFugPIg$yz4RyBopz~*ccG$G+^gF`=)w5% zJR|)L7ST!t_p=zJB^Acd{@^Q9t=F2ZaCrgya&85`G&8XXE_NLu%{{+g%#7+D5kxpqH z#d#sIb2<2bca=a@Gj~ffskF_$Fr^b&Kw2^TbdC8q8RrezYvD~|P|5x@EzYD*8f_j5KVlj* z+jq_u3er6bdmSDDC`h=`R$qJX`2oUs>Vd%f66(6x2NIJL1VGb#Ysxm(KD4HBJZKPE zJ61RQ2MQ`41BVNlZFaxceHC)q@=0~p zFP72ERyNet9&9`+4BM^ZbRdy_?>Rgl78=rEyO@HsBXZCA?@uPe)nUNGV~vle0m4xb z{wV-33Ii_9d*1su8u+4ykf}WzLlaU9;H&2jt4fEeyUnIbTPv&MU&M=uA`CY!0N#uQ(HnA#r|$qwzdws zq4PC9pn=*5+c)WAE232^b1M8MB`Rb4N#-Z%g8)eED~!T`-c#Y$TVS2h zKjDt4=A}0n(YEcS8EW`Ar4=R&eJyKlI}MklptBjTpYv_HA6Kq>peuoP%!uJ%3KYn` z$M@ae9N&XQsQ;SQck>17m4QhcK<0bMY-t~2TQ#bx`T;0@XgXMwcNz1lGXBA@80#3+ z$3SjAG6l04xx&2K;I1k@B*iG{-_Eb3V%)h5%CtrJNlt0RBjk;&H1-r9tzUFQB-H4| zUh+{(!ddzl0+_Gn^*@f)S@y5`q=R9+MA%?sFqXoBi4BZ@ToVKHEZmS8~|Sv)3iu)QVH)lPBFay-I=8I(gAANyme=8p#&zDAeA2O211sE4RC2`Y`rR zuC<)#g>hSlk0bq`3SO0)_zv$cc&*nmuRjM7=eErJ4RNqU6uCEiAF2XG72kBU7i*<8D~;FuJLW8Cm#ov1&bD)g-i=a-l6jZ7)# zZOV8uM%@_WPFN8o37qVAAO&qv6Sb6l2kf_39x`vD zu5l~sp>bBHJ~7SSd&nOgn_$Nik!KP^gDio+3fF;TAtQ0kJt1q*Ju8zOH?B zDjR)@X}tdO&a#z86dR2dK^Em$34riV*~#73$Ahkd9-D2ea>opX-Q`|y41cg5xj&z9 zf?D-yWm6rdye(84)yNhrgv5r_uLMUd?s(^YR%SUrIrKJZtoE?KEH`B?fW?@X+K!@Kmmi^q@GVQ%uDj3_)} zKKvsmN2{LAC6JmYl$Ex=`-I8Mrt1x54^9X75AZxMPH-`5Om}l(J=qD5DUgIU85m^z zh^3#Kw|Vw1Q&V`zLwVN9cb}X7?c20A`)Wj7^gk4(_eDWdmHZ1ynF@7`vBjES*k>;( zwkJ1ZZm1^GAL>UHHoWi8m93kC$9`=;8MAX|2jcsQN@Bc3DV+C!{Z-HHh%b1zK-apD zb+$(H-dMndo3^Rb8!Vk)S9t$lul<4tQ$%{E^X4!bj+L} z+!yRKJ1bUZVG|SGP}yRP`KN1F(Xshdw#!W=jQ;WNtAz5nGm26q>ZH-^))?rY{6~82 zrPVnFWEmr#89eE=Gj2E*d(E1F3PMm|~#6i+$ z6Re~JEjf$C0cuN^bvDg){8a;fs-eX103cNbHKd{l{<@*L?|_HO=?^33 zLj2Yi{1x1{&$~=v_L)4V-Y|c{$Z%+D+h(eu&U)fB6da zR#u>eP}C3;^N|o$D<>Eb26m6DsPx`|Fk}T0X?2CKo2~NZvkWIOsXY0q)>>jpd2)$z z;HxsR9)ccNYOd1m3Tcl0;1}<{>-Epu4DSyq#h{mh4W+nOFLfLAw4vnF>3(hpxD;b! z*?{*5=2?SAGN^4}r!*(Fi4CduRP|jKJUvfFkNd(C!oK3fF`k?H6n19<>80w*XxF22 z8~JfvjGYpv1d`pP@t%lH_SU(qgupHu=Am!nwn%K6G57ezyjVXX@6)(P&ia$JQ~IoZ zcJllaAgB~c=W?vQ$lC~?s-mF9rUcJ8^=U29a^JBh#v-D8{IUx0b~e^cJ)*8QW>jNX z_>)isH9h2g?mL7A+GXkAWiEK78rVX`prvo_Z}zVmzq+g#E$QG&>>NsRPjim`DnU`S z2XLP1@swg;JQ94I&l+y>Elsxm@7=XogU9$4a!GirmNL6S^Q1y-p)FEk8EDeMa?dFfYtin<(aSVwoFO=7cwJy>NB3VnFFq5MNC1hTvbW-IhX&4Zg7r z!W6ph0j09qW6<(e6~=VxW4tT*BN46EeEQENk{vB<28Au!Q&0qu-%Ks)wDbs->Nz_P zqb8>I&0P+D^akR1LNqGm{@n*5;idlAr-+xe0Figm@|nWL!ebQr)h;yxtN{3kr{S_3 z-OE!(VDol$HfjF{*ud?6mMQz2gd!Ob^}>fl0x#?UO5Zd^qwY{^v9F$k%6Be_6yJxkSFV=65d}AiX?sUe# z`hDv${tRQ)z$?NQqq?FON@%6?KYIqy#X|!GIZ8)rtP&!UThA`>E-0c7nczdOPZvGzUyD{E}31uQ#NoW^tsz1N?sMBWYIS> z{kISOXeYo$&8O)hJbTmM9DjQNQ?hu!{zH6$K_BCggN<+1fVk@6(cB*C8Hv(SahX*f zVz{oCzF*+=$2*a`OX7_ShZ?XA$gXO3RASxs3z&z-`f_K%hR-oT zu4iEwYOG!gBaQ~F-+pDm_6njNr%=nHI>gMNPJ87gyOf-I*D?47MY70Tel?&kzkxVc zgpq4GUwf!n(DM0UFF%V){%yb;09fH(fdQTfP2a+ZoCCO@t8Y7{6ZfecMgiH6mS1jQ zZ8@A2ZfUP>T98&t=*FD)&a&n`(^praj7e%f1r-m$P5$|f_9sWO&jjwUmpWvU%>gLm zf2TF*2yyOOjM?tDQ$cV?VL}N&fG(&s4JDEZrw{)xuDA_nxNqq_ zD8n14o;ANmQa?r>eZ5O8d`*#= z1=_c16J+?ZXOaCQqfV_JJdw zn#+ceF|qF6m>so2YY$HBI(OHHzJZX61kO*tRZE0`{fnJ23arPqucB)TxAi(b60Gd> z1&&|N_(E70x6X%lF@$EjZZCqAZ}HBsPM5H6lB?28!him4?=LGtOM+BNgo)}$PH|^> z${!6(V!<`fR7v^4q|S2!8xQ78w@`Acu(yqlGv&AZ_=Xj+L1jZ#MQd+~F1o!u z`^%3lY#Q*sY|&VWqo=b%TVwXmY&G8xs(Z$gcV4=OBsTd4Po8QQ>{N3nT2}Q&>S9wC zMIV%Z&>vt_v$P^u^bwrm=gT~B;E+PzaZDd*QB42Rl<12Hpmzh}8;YKn$#?knPTz_K#S|gKz zBhzGLy^YyGuAu6#_TY6F3qkDX{B^FMe6c&$$XTekxcq z^l#U8g^3z(q3-X&az655aj;%idJBabZw^pPx;Hx^qO zhQmwf3Hs^(NcPKC=l?Hur&rGMPZ;sR1-A=vGix#+mF0yHu?rg)@{b>`k35*MF)b$kLdfL*>};}`4GEA+m)`Q zoJJ5f&&{Mh>aXUI1EHXNlVaku>&B1T(#38PVeYmli2;v2z&t&iLL>PDLTPEZ$eg=Z zs>D@}D?OJ<{a+yDITWq3rtX6@wJQDtw^yTH;VlJC1?B%$wDo-Vh2pRGIOrGag7278 zJA&$iZXqlVKnO8l)p6jWfyx^!T5JZTeleFsL-HkMcra@@N#O)Y$4G)B5mm-u4W}T6 z1nLHrwf3#?n&sg45#E3I8&J;yUKe3y&&jam0~_aCZ>S$$zeB)(1j~h6meM;2uo=+w z+nnx=mhDbHkNTb{YgS!2ZvI^#;yMHyf(KpY?B8*IY#-&Kw&pQb8ywZcr3j} z)O+aU7HVLYTWu`c1p|k_j)zEE?=jQ%M>2_*lzFZywa|fU3{_OvX9h2q752+~B82f$ z6wdhaPRH2Ehg9dpWlLJSrx#uo>` zLBNLb+MuZX#RHqh>^eP0w&)OGk1e6vN0N}1_u;p5S%zBs_3EIda5 z{>5`tqvabJ$DVxhjt36L$Eq2{;6g|U8>P>7cT2rUDjPVTpN(x1t`;*1@vJVM<7i*< zkX27e&JvvYzEQ7pCCru*b+1cP@P031Wv)pBpLu=*PkmK=f&BJ&YZ_-PkqWe5I&oKP z?{-JZ1Xl$qx!u>V5gb{eEe8zG@8ee35-!}vem3L5$Ky420;w-Zm1O%{rDK^Pl9jJA zhm~q7@S1l@+q9*u+0{L*@m)1%3a+N15l3+K6gh*gP3zW9yIz<4T4ijc z_8R<#bYG#|G2Nx@m2DdA<46X0vaK_QWh0lN`A8!L+WUuQb1%kZxjC_yVvAa}BHF<@KBqZt&f?kOft-AdDmZV8Q&v091$+ z8#J-11U*XXQ;U>&R1jrXV|WO>e$RP_IC85}8dBx7IVC6n>`5-GxSwW`3(v}iJSaCzjJYECBBl0QCSOwW!*TO81y_nr`Z>mLhZxsdkjG4JOVACCjBic)_R< zB=gk<*B1b7|LQ)OI$Q`G{IFcT3REZoCp8wA7juLI9f?4AJ66&Wax0bkl7P>^AbS|D z&BOVjHiX6GzL(RTzhOiqPSC`F0}Qh;VcczDZZ3W3i(YAJ{xl@FOK4r-X6*$#jyK zjb?vXO~l@$epUL9+l+g2itv?zRsmz+kleMGD`D921g>Nam$B@r8%4V&SnanMh^9$= zpeL5TVuZ?^0lWOi=4^pV^OcGZ2C?pjb15NQD`iItdb;g&gGM6527?Qof?a>J#< zlwer*0ehqRSsfeLu~D@Q^Xk5(fn{miwSv>5jeV+L$^)#YZosG)8k|m@SHns57QqzE zWVTC#4=GnRWb%55jC~*zU~)+&6^|X=)C%qaA)`;qwBYi zD^XU|8@mMa?sf0U9s1$op_eG2a{mp`a~%IBxn^XMz|Ld3z{w&4Z? z>FV3LRlUwPJ=0=+|Afx1)&?^_zj(DduSqa4sC3W*Oo>9&1a$e_aRT)10M6os;TG-X zKQRhlE&#vgDcTB96$im`12pK+vp18$rD*YLCb^_9W zV-6^T4eEIC5uiv|mW{4LGG#zw1j1?NfE^?=5dcyZs^SK|*}=@gl)Tmpb+mH)hc6me z-=yhb&WP z0^7AoX+^q()@-9~#7EZ5UIO7EHHNSzc!mEuOtV>+vGzaiZ^o4%*+6gfl1MxgW(&N+1vY5Br2yuLQ1mq=(_1gSHW^A)iTuL*dd* zp5sZl;Zm>cF|`v)F1~9khS9>&f+yRX{y{KDNW@2+-6%#v!-KaN5nT14D6P8DZDbTK zfXemm)j0}(GX2FOAgzG1PT#8$AXb~0jq;0&(MTn&U=ssOxnK2)(l!nR5m&+qr5 ztucFU24Sj}bG%9~b%X(uzi5daigOn;ZdFx&659y1Ct0=`HrtTPXzn(pyb0=*53y%M zZgE1;u(=l3hKMxN6QIUxFe{T!|CWV%A%n~IN;O%v1QyxTj39hxhz#d$05$QZoFD`! zgubyfV_(tYrGt&CfnCy^CUL$mft{wFY|xZdY`ke?ej+R(o8n>0TXVyL(Nf0t?<3*N z_u@Pde%E9|?UV4X$v|{M>IF`v-!|=@x){M0TOKEAGQgv&aH~hWi(F@Swc)Y~KoCsk zs9PF)+Y@|G*r4)1gsP)p==XCH?Cwcg&YFArZh2a%iE`FSvigDHrJbERHxEh^m69tI zaDyOhlO13>TJQ-PwXYDj8=?Z60JUeSFOP91yZyCZuZTbntg z5dEr^hy#g;JD!6xIqnG_@4IW)La1@__D}Sv(m0vIl3?_7oo4Yh^m!*y025*GI56~4 zJPWlISr9i%%)cz7DU=3?Z9`@!3zqd+7Ue6p`m5|eK2w(mT{e@1EX1G0!4JKkfwfpa zRY}o4{$L;G4E(Pm%&6!)al)`^apf1ySOYag``P#G)}cLTwTHHB)TYaHcAJ3-wE->P z>Xd+*SRecXzfhLbkIcl_S!%D%PUQ1s0~1JA8)_gZoB^#vEV7k5{AsS|i^ZhdruHj} z?TvG^gG3WN#P|-#XFss6Yhs_$B#M8J{U|T&HfkDk-=a^c$NyJqEm%*dw*qLcdmNT` zm#!&ZzsElxQ=n;b<^JBtd)@tBj&fmO2<&_#0ex^@;z#;LEM+nzt~<> znY)7eaCc+QkBtEXvZq1R&A? zAhB<`{ahfhMB((LehS!80~lB$G)J)_n^ncJ{j0J!YPkXH(fOuxGg*>*Nxoz|EFA20 z*%ttl5pxH2w%aOIJoZLB!2_OJKvg03_5uzHhn-&WvG+;*+|jE|1csGzh4AXYKF zd!1sHEU2Sww`uI0sF>fP>@^#>I6x1wwAaoR=h6SgG+VKS+?S{F(QX`z@4nqY^Ca(z zD6-gON7qG@hj_OjLW;axA2YVkRD?x7_^51`fIar2Hosrpk}UJgl5B!aDh=@2kvv(T~X?DTQ~2&}Jr`-c!-P6{K?+`$?_r$Oas zc3OUmDII?yZtiS_X$3!WX>7NG`d^j<_g7PFM=fwM<9;ahy{;~UYb!d@KTZgzHv;Q2 z-dL4t!#52#=_{wp^@fv6-OqN944pV25s1%nSxHvShg-FsQqzdBSxdqE6>))@$^uX0wh=loRXz&+vkK8zQlLjQ+B zzm4{$nIY%Wlr9?ir99Y~*|*eY!n;hI900Y7WOE2-@ii3{>+3)+$VkwC z=X?il85HRc?39jlT2!GT5(4P>v3n5>LTnVeqqp03R_j#pI$qfmZ1Jt3HyJ-}OvH*r zX++c{Bz_<4e?;FyZ1>M}aF!s~tG9VFV=Y?zCK2(fem>K67osr>2|xG!2#Dx50H&4* z93z11HNI{_C{7FRwc~p$a>OfC0N)2Ic=jvJihN;vgvE9Q(^@f!{PUkN2qmjNO#fJ9 zV5+ygwVh?~_n7;<8G`;01N5Z>v~;}8`>-)zLlOjK>lWM+-BK@kD8!}(LS5(hr!*9% z^A{Lpbclp3Y5{QCrf++;H;~a0(L){*Sni&kT}>CJNxMkf$lt__h6c<5r-0-`+Bjbu z1YQ5{&05hSwM8#hnun$m@-Ro^)w#~(#T{+_LwMl7Qoa;j_230vwTNUX84|+!SQ+l~ zR@N+0Vw!W)$Q&0>eU;siW_}NxzxGersz+wC~*7jS{XiaN0ZZlw#2)=h5fZBX3y9=#2RRvS^nxk3 zR!KU+i^dig2A*GKv(!2EYFnz1l-x6mr$_b%Ot!6_ z&A@#iMq1R@_MFn+JjG^Ic5k66PcOKMyI%r`Out7zgZIEMD~kS^V^0vK{l$VPL<_UT zH!;Q^Z~ABp^HXXj2fY=-oVNs5xt!fxWZ0K01c<_&qpF&MIMRV(eFjt?>^76#Co!?y z+IJ}m!H|&MbQi`_gR}ySngfeEi;@EN-B)e`V9>MJ~9<7fCygeJ}R%q7%ZDVd$&ADn>bLTONHMHr-HoIup% z4DEqX=v(<}wWtIlWD?hQ=UmXRUZPd7Be$~H{#R(($BXI-Zz0D;eR?!v zH5J~0o;<|8B~%wk?MQ2))j^aAw+>`sJ-W&2-THuB1TX6$SmsL^C_;sRHC0Uwy|E~l?cmZD z*?q?Evdu3&DQvaYRd_qIlqB5iD?aj2Z3?6DAI7ga(Qyu-ESZuy)3jpVX%#K^sL#Ui zu=dSCF6hiB8E3D_<){Q!4xhD#D`S1m6S9QW9;eSS&@wVJ zL~wR1(!=)wdn%hLjMFU+v=I0-504C$b*;R|Nrs+#-i#+jnfC#8PKoN(75%5}h0zo( zi>h09^g~CY-0^&U%nF30(zV~>{tLa%t1mrY6N*cIY_+cSSu$?L>pDA)lh>o4!|RL;5dj zjUGL$$AdqCXwl1%ouTDOg|B4Edua>M_!i(SK#F3bM`lMZT#yB@sQ>%fZ=Ldq@CREX zV-&|1qWIZ4?kK|u>wC>ma~PxW02>fy>0=teA?(XV=$pR-HvSR49ZGotIaM$^*GX+V zS9s~lOLt?{ECU$dlT3!Yb_6%s6$KSK3h{vh!@Cq1rw;{9^Fi5`?ys;NZkejSHjYHD7y8ZHw5uJb(sxtNx1xGIK8T=<0t3q zX17zzxy`#5s;sg_)8RkTF_ALKXL)*jSJE2x3Avpt*ZffIec2WU<0}m64`S8)U1{-f z#<%F5GOd4X#-Y&wXe_JLxdD%+*1 zxU-%8!`hu&aDb_iejk?An27#gV9oTb;Z%=Ah2H>k%W zM}}jH@OfUNhS_yZx@8vORUku`+Pm$NT;|wKlr-@E?5w$6#K2UE=A5|u&z0ETx!!8B zh-`j@bC_|oyaOMzT?IfG48Uzu0shp&wwPt#I{V@kZR_2 zMPbY{!oUZcUB>aA**Lg$Uop}@KA2G8Ls#znk3qbKqzZC-hH179hsYY@OmkD~Ia8~Z zCQmfkMaiRE;(L0yg|*k#U2iA;42O`nMsC z%i+3jaohFpg_EWW_4M*(4hKd7f02?U4DP;nV$R#Z`%H)>aXS1j?7VNqA+4vUf{#&k z;f%+G82Unx%E*%02eowt%X6VAj4Xogt+hy)D(re& zrkiS90=J{H0|5dt4MFdEu5#|~Si(NY|M15mKWNgTaT>=Nx59=A-HV9mtO$Z@rOn!W zxA#Jm4eDfqs#Ac035*esh)pd0gD{mE&O(A{TWTy>8XNV`E7Leh1WWi^8=Hg98%|;& zZPfMijW=M8PX{KH7_x#P+nYsh56_GCvudt07WcW0qsIdcv-Wsacj-9gSkA1iJC^Nv zxOA{MMOL!Ue^lqa$zoK%3IWQn!27czg_Ea?=q2%G- z8n{*awPu94xvg_hYk6hF5L2JHz~B zLW#YoCVtnt`>;IuVq5u&K)I7An}LY{%bVAXK8ngZhbF?culkPU+Ju;7 zW++*N@vXGVt62eRN%c7qFL9FB7aRi~Jv{;K!}%<&qKg)lK-^Ja4A~{oiZ|#(d*2%) zaU^&T&%BiyeD1&YFwOC~5_-)cmw7MO>oUqFqvws#rMwJN@008nq< zdjteNxdy_=(6S67sFIX+o@>pw%Q@)tjiCu&ttxG+cxUH5m+lXTDvB1tI}sEHUVaFT zQPu~~Wo5f3K3)u4eE$FIKnp>EdI;e6I>h84nqD>RSooW2=^r|pvDsMopxl9a1y!@R zo}}3Set}-i#+*cHYz0FKn0yKe&PE(jB_>+>;z>DdI&Ko(GyyeH+xw&;eE)0wT$BDL zT@^x~ zvg+3DIJ?552vlcFmc{p&6iyv^cE-$iDuTLJ>pykbKoA@_EGq|a;J50h*5wsPbh;=3 zx*nk^y64O2)cx7a)yDNA^Cu{0%U5Fc6Eewh`|NNw$0V5j?u?_YzEjs~~4Jn&Ke?`c<+&uS6Zdg)(s##GRxiFJVUg5n&cg87e7K=nbODg7>I&2j?b z6#_`zwM5-Kod=N6@-sy6Be&o56ic!*2H3}@XUrGt9ePhBls`V}04>roY2aK1TS7vx zsC0Pmp3NF>AIRo}dyJg?{EIEK7gM%O~trrw(BL z9os%xL2Rc$+Txw`BGn9?8Bq$pATYMd>&Uv)T?k>=wf;tS_PEjH_bQ%68b*%&$WwF4 zKL^ZNnxmhcK>17HCX7Luj_igqnVNNEewD6baFvz~z>1e_lf2NiaV2Dfy_OcYOrPnf zn%ofBZnsbfbl^1?WM=k%4puMCFaY#itqIQ+NkPx2LUJhQ(BWjcI75*Rr5%>fH6B%$ zQ^HjY+!iKebs0sc0me~*$`_%|wK_+2md4Suo$mmQ|BQ;9T!cF&B+3Mb&{G{ph@1`Q zrMzvw?In)(osWHWy2!w$ysB8p)zYJn888dC5hzCToEgur>(K3pI+*1~9Y;nJ2~V-u zUn-tu=n+UAj_+O)yG?w*K{QkIwFnh0!elX)JRGup-T0(6+G4HYe;s>&U zdy&EevdXF^+$7i0U^;Xg9cNV2vi;e|tF4%;x!;QHnSFE{2gkk&i|KP((&;g41`8K6 zuvQ0RAO3XlOKIq=GBVWFQ(lII!j3!Um^j?|M(gNGbpAyxttG(&uwn%X11whO0cjw7 z_b3`Ld(#GCkf8YONnqt+gy#csgi6>kNq*H#aUfP!1VckJ?6Ca_AA){WeSn|Ab>0f@xJ|M@ z{j=&CEFytlE6+Ux@YSplxoHu338!JCc~gB_wY!hgI4wK4l?JKokA$E)(6A1w(lIV^ zxhP1^eGlqn02Y$X&?-#5l5)G|X^dFsqw2$!*4}x%#antuYf652IoffPvKabkrFd9B_-DQ^LG* z)oj|jw9BWU!b!1~+bVzu)w6MW-g~vfRetQ3lX-XYmYY+D?2S%Vg=>Rm%Y~^<>%suk zN-sBsYA}Ti3>`#{9oIhThxtNC8CcVor^SW^j->5za+F_Up@`XrVgo4cB!H!2NHMI+ z_J5*z^x=oDuALN~?gU4Li!X!rB&f^h_U^*Fy4SXT&-T4W)&TtoCqBB}22}6vqZ9|p`&VH;sjVo+0aC=aBh~Jh~#2nK}&*VPLZ+#Z$#J}kC@Lf!8ex(H= zH>TY@W6s@)9`(oScy9oikY&jfcJtVSRrq7JKjQ&X_BGPv3C~{{5_Pq zhlNWdo%i+ENV`@G=$@Z9V&w5Kn{5j0J?2o^bri)-^N){m!7k5(csg-*_OBNml?Q?M z5ZrMX^yr_rI9qYqbd%efF{fk|80$szxa+9bSuCTPvqyA&>7Tp!*XSL8Fp z8QABXaOCHsCvN=09@d5|rd&>op->~+H)@0H$3G%GDZlhZKMWSx3w(>j5=P7#~+ z(V4TSb+y|*gdcc7iSo6SA#Vg1+64>i&#PaA%CcPRJUUeb9UtDH#nRjTIW`-D#D;kt zV=wEP@p)BrfGkO?IrBfL_`};_uvA@Mszk+;B1Dbmw=9;iuPJerbVLDWm8f_d<+@38 zTj+DzvMQF)%q_X#!l!86y@l=1j_{il)qhfq9dMpNu}$jz*Ac*zZYNGdir=s z{wDvD;{}f@m}Yv8LC7){0I14*Kcam8|9(jSx6n{7eAYd;sn+sWoFE;#Vp-JZ9a5j-GtLxbN`(4OuV~ezfd2Zud z?r%x8o7%_u)ctGG&z??AOrO_4W3!w8g0{D7cKMwsZ!7IpBrx@YrH6V_dIV? zmEOXG;+ongr=HE8pwltBTVyx)YZ{yUyEd|aK)9X%P{ZcW(TJySM|zo4|G4KmgXfm~ zE#3MW6*t9Q}*Fzny`DNTDP0@HgE!Ytpf zOStWlH~VgoEsc`Y=gqm|=Wm=k_q6l}Iaqy()@cyvUK zx*X$n==b|w7tfzEQw>p?B?r(i+zdm!2Bz{ujKQqw^uXyLkJo6{B+c z{n@=^pWOCGM%qakrzr5nW#@VYElEVsj%P)Pe2tC1F?X7>TXJ-9UiPi+ zgPOUq|El)i40SW56z$h8*I@6y^0&_90fa5%F$}9S8VR^>C-Nt+JoGWM{=@4*x*V2# z{Sjpo|Ii`nMYnwK;rEgLm-nXBJn%EoLOFMC?)@g)n_cpYD}H#O|cGzuooY$h6lMXCAw|I(fM7{-u=1 zme;R)6MRD>Ruvjwn4B7I#27rBLURku{%$rfdF9-^d6DefYx`gFi9cSoO+C8R?D?gyAJQ6^U*Ipk^z8Yov-Z95?-&S?@ zo{DTJL&8zjy}V0)xH@rueuv5wR&(>aT|>EosjuNj+Q(0Ai_9(fz#IJ;UiR1h%#&4L zjf0APl0D|#c+0s#5AT)u&QD+ev6E@de`~0}{%>a?Bm25K)ZV}Aflb}#(Swh+O{BlR zbN1G%-vhocXG;CXZMID>xv}fR?2jMsn66&z!wWK;6R|gwnj+SQ+ekHHC+xizs>K~< zu535Z6U6adzPX2s&Xw;agj#;iSxxe|5@Yz!`u@4yC!Fp&_}o?WmCmOb z^1C7-j*ovn^ywcRZh7n);oslZUE?Jyy8edr=O$+{-*NEj!Qs1F z8b`P6zW>DN%sYdJ=kQs+=R)VwULGeLK0TCFvB_4FWl-|%<*MIr_c|*EZsk;DLVmGM z-Zo*I?G|1&xjoVvnUUeH{pwbyc+I5tRkyA8JA^*Cx7QCDg}}=>IG=KxjQDeNoX5Xx zNZWpIE|hwr_VD}YYd>ym&c9UTfYbbwu-obOqDH6ftG>4OAN~CG^MZ*-8bvoZzFHbQ zvCm4vR_!_X^KHwWsk5h9M!RoSUEU>Y_@jS9-Piu=*eRXo1M;Gae^Qcdw}u3l|76^H zVbJn^%^LetHP_suc!>$UQCBs5GUTy^%)fmXip6hLHc#S(PduOP7rWLkKNQ>?YgaIE zbMB3gD(i|4bH*AB!fK)*%UnzQ^jUoxR?lMdvC0ME{pVd;e)zui9yxDyGyQfzghqcm zh>rTQny%XZ{O31|{oB=cEMoN5s=U5(Ea>rDgYo?rS)(UVHYY#z<@JG}`A7e|dhJiC zo_KQ|;dju>slRR~^zM_tzj&_o^hn$G-}(Q!c8`BLE)By9&ox_*r+$^O%elnl!hP$m z;qwlVBforb+wNb*u)}^%W{)U#y=cO)j89qYqUWX_ZnrD*j4JBfXG-PRh)m7Pe?A^P zxOREe>l%u~XSzT6c4WnkV!y1!;lY{Zdvr>n^P5oN7;XBZPE zc{h#qKfSQR^Uu)37=1mAm}a}no@#sbh$Lrvy<~B89vXZ3@AGXvPm^t>wZ@ zo4_JKwjj@O>$|%jmZ#F|Yum)oz{R#LN1Yi|&tXNE_&W9y8sibT6GkzlfgtK3iF}_2ARf zG4?eN?~%W(`gmek?S&t~yJ2X`bz9Hvg3^+z?L>>cAx~&n{^Eqz;)`pp^DfkrClr2>!m-x|?{ArhVm-+1n%U+|+J4r-=ef0VgsciN$A`xb}q**qEilNFd1dP=`(ZLQnF*jutS zmuTPgUz|61%Uv#+XLj#T9qMwo^k}-up_XFotJ1k;FK${kfa3@MNWwoENrhWd4|RN% zpE}!FU7B{jXv3@TUmlExExlnnuVtkgA5^_FRQ_Zp0q(1i1$IJf&1l$Yj*{{-B;BvoE&N}esV%x@6l2Ffb_SIX+*6$t)_z+yAOHu zEuUBAeqJni@#8JCYDMer&6g^ieLi)bJFZC1XrA5l6@SG1hPM9ovzu4MO$?7|`WuOe z_(RtkoAPwy;$n3tK}hbqjZGV}OgN|axV~f0gq_wBJlKBq^2XEN>4^>}3@g?oZL{S; zRSkQFPoMuj&mmkYjnG#a)%&DAyX)$+_Mh^c-p{|UE&d=m!4-zt^XJy7ha|_%*~x#? z?7`3^Q4jG=H#x8*mY)|26Bg3tv->L;t9az;!YG3^5Jyqm*ly z-Q*Y5;?9HsvYonr&c^Abt!uO{QZ@veN(8!f`V8$PPb^PyXyLG_?r+p>3hFFgIvfH| zC%m{FV9G~w15K!` zjUO&(Rz+lI$q6OU;mHf;GR>5wsw$tCdcQG4{q9T>cbNDM{< z*Ih{PB(6P1K|YgAhI2c_e-!bY_z0Ey^+~U_b2?@qMTXA>%%>92rhofHj_|+muAOr8 z!KYf@C0Vo!(4i80vj32gmBt8z#6RW3H}hyVSM?M+$H?(-*}c8x_Dkz`{#RGA#fq`D z&^P*}N^?npp3jJ8g)R}Z;SMvkjiOept$wAe+(0KmgT2ke$*TG;u8%Jv>J3nna)w$k zdm|f3U1r5T+(ANNA`C9-!EZLhlWnGkwPx@n1mayGoyoOvrVl)q!c8aNcd2_qJYRgT zyirB83ejE_ZWek(c4$y&zyyCNa-a!nDH2j8pzUt|)=mYQ2q-6mOLs1vnRSNhlVI`L zYA~csG)(#HbOi423J@MRQnsz@0I#JX|6Ni#QnICuD?4nnL_8<95=RKrBs0->!@uao zZ>V&_N1tIG4r#oxcxgr%TxuMp+C_yAnI7`O+h&E|7j=H}T4Nfi8nb?5hfUeFJ0%kX zbRje7RGf!Dv&f;uB3E(A)4)AItUhsrt$Ly>CL!RF$dXBPljlZ^8S0T-@q|b>RsU-= zIf#n!y0>l8BT=M>6L-vQyKcs0TsW3}l);28=codUxB>tC8Z`s$YscohG=lY_Jl;a((7d!HZ?O>U!%o0ezXQX6T>Lm!zN z_l8D!PM5-+Ps>ayO+F(yhSRDXWPZ3%rSI^1(CRQFQTNXGREO)>JN)HFjSj@4E_lz1 zhmaK~GII{H_0XcH79J!|PBD|SIPgv&g7NNsy@V7%*IZC_F*IzFlXcrC@D`$x%qH7gFppzvdY+v{MXj;W$SM`| zf-X?(pZ@W0<)5{){Wncz;*WajF)#@lUjS)nK$Fp}Dr(UgQ)*Vdv{ZqQaf)?GJf8PA z6#a+~7v%$oq=Vpo3Q!noJMLY9u7STT@AKn7)8+$(n@hgqSGQy6+}4I2CghP^GDXzJ z#XTjY>PhnAc5!Zw-!=51CLBn)g6zV*6qVTaA8#W-c`Idt7y~=Tec=L1rVQvT{3u|vUBjCiqJavs< zYVd?$CtrjgSp?#wY@-5z-EWoM=H4Fgwh~-4mOd_dzAnt&xYDPO)zI0ON!%FbFN?C+8~l^T{#k2-q_mDL|^y3fp@USaRdN$fUalgvZECRN9vQGT;FF zm&qUcFoijRu>{1bcqt;#spbiVo{oVhQ_}W^zm}F{_2w=lCBg%y9Ok2@#?m!|;6}~? z&5NsD%EnrEbGWL#n+R_+*pcS0sqVNPWQRc7%J5NA8z4%Gj5{nNJ#)XrKhIdW$K)wd zvZ9TpA=1EM9!%0MNt|O+7mxV4CpHx#jf^hG|e2&GI zm*KA3E^`EpMDUR%a8=b8Il+NJ2r1nbx(Mh;A#|FOKzQMB1d^m#+P5eZmUO)IjW$zG zdf+8ORRowV1R=#4_QATV-(Ky3R|0ALeF-Q7QZ2%x#fy+MPauh;fu>tPG851>x%b%M z?|jg!7AM|*TX?!J+S=<}Ztu~RIsI8@e8Q}ZE{PsGFMnlPDF_;XG!m%T+yk)rA(Y~; zDkk`!TZ&gzRJ0ZUkn1*cM;Mr*5xhvzo#4;WJr-{2qEIje>w~k8E4e{exelD3gBu>! z#b|9Wu~zJDJsirn*7FG@-tR7!YK?03lflj~BlvW|EHT@Y;f%G|az;7C%Zylj7_|PV zn~^%H%`j*6N^Y%-#kB+XEPzXjKS)e5#!lANYWL4tBB;MWsts#ZR6W-4BadNrT8War zlkiGxcKJAp{gPlW0h(_HB5UOn0*1nAV0%uH%;#1GM>a~g;yHf0_0O4of$jQM87>bcPfoN2t0qB}sY!2FSw3oKx-Lg>%AbzhUD{e~ zX_d(f0x+>m#lkSeqjN(=VUFQPEoQv%g3y`ZZd<}S5ONM9Ug5#qX;n-2S{O5|kY#a- zbL;VA^nGfLz6o8V&`GGns8aVWXG+%eRHWSQ?|90v+Y5;2Yx=Io&gs&!$$*_PX50fR z6YSH8O&iZv)Cs`$j=w?624rNBx}l3~=d}drHdufkUcH!O8JhtzY{~37po^vCC^30+ zz=r5alV5GKBTq&%sXQW#=7N{z$RzS9j+mO;2+B2IKgrNzO)M$_j2t{VDVz3!(v&+l zRN*4|m^TU}^9g;9Bw&VNzv;9@Xw`^=V*DH$`YRIN@g(WTg2h_9wEy^8o24(vGgTZ7 zq)y#a<4V(qGkW?n`mnMOq7m2v+i5+3yt#98T13{1d&r?OzfdWIslnXyJTf;WG3p>o zXTiA$i!ELg`cF8oyET}pMs^IjKc3)n9~+}G$2a3=T8F(%`*L2?(61suE@y@V8ul;x zvOOe_7Spv6erS@jyu-ZHw-Vwb3Rk~tInWZ)H2x+scF`J`-VUEm9@hy5k!CUy9L11C z;;ksNJ8$2L)wlo~{R;8eQW_`1f(UIJH_snqBiD>?Ces40XD4Y380*_3_I~z+JQU-j zm1Hn4rP&VFpowz}x0eb~u%`Zk#jKAmB+Yn0bH*``e>yPP=R~gtHs)Rh-@6I-d^yT; zxsLD;_kQ3u`>1|`y1(BlQ|J0tZhDw0V{w8^q%FQw$rb)Wa~c+=b1mEGmTf~y*M>i zWswz<5pTUKLuMJf$AwP;d<^){9-2`F(^&}Un*$UYm9rbek4m?)>9 zpZFV*70Buucyhu>800WPN@G+2Q>Tpq6d(X9Uy)1RmU$0G1g72ID( zM`vT>%C(`2ELO>I4I82%7N7h_=AMRbkU7UANOS*iuxZ?zK21f|$Ksm93daS#hbASI zA;?ieu*eO~3TOIylPdk^=`OXS``-RE&piC0aEP;iU=e~%Z@ofS4r`j>)W*`DT zZJ6K-LEaD*fe6iLB(zyg_#omw58gpTV_*Epz59V*6U9HPWzu^q&rng*L?6Cs=q2 zBD)r}hR-I7=mkNhx3g58u*v-fl)`7Z&PI)jO&_IS^M$(g9avKxc^PZ{!5p=Jd>a9I za>RHC^RC&)+v`5hrDOC>Us%yCm|mi1A(ncnA4am6)kYh!#aZUW54x8wY`n}i-w_U3 z3$6VIhx5sP@!M9yXui2@lLmOGf#;b(>|HA84+40TJ-hkP>`OIZ`~G(*s<#1lc|(|M zcmscO5jbeSX+=gSEtg?ABO}D#FX0*9MC569WoQ&}0K%j83`rvZgCAzU;lRi(L|OzK zeyc;17+AItq!mALJdOVcVfOs47ymb3IB=YK&C2C{&S0;UN?KGW48V9gk#u8SlTGot zoKo-SwVjUq1@&QMos*Q+*lB!B82vF}(;I_d?6lBkH|TuAHl_)8N zaujJNO=Gh!`KL#19Y@g%;977?W_I1yIJHR3nv^s4VW!YQ%^A;3-~#p&!o#Psg2>{E zBiGn+D)7b>nceJfoz#3vY_b3MaMZ-+O?5|U5>}^xZBOXOEI($fh+k7UoJT2OsTomI zF`qP6W~MCpEtJX&q;rCv`I37u%{gV>Djw|lbRz8M&?A`U|-3; zP?8coiMdv=3YjGzW~$*{*`RJic#?pnwHaEXwVJH$r2M}8oS|c4w3!BVNfBPGD)S2) z_Falh`UW68FVI8_1nI=-qMgc3WFyRGpj(2_4+wA9HR@5*O?c4gTR04P#^8J-a`d@= zc-34+e-iV}(Xqk(OsY#rXqF(q+p#d&nT`KRp@3kKi;AK8U|^%ASwhuBSJ+_=*x7Hl zZj-fs`XZ?gOeQY&^$e?&XlA42bDrAfLO(9P&El>`9e-SEFv2a^VDyso}7?@1P#lTzul-Hze_8pWFFnf|Al(4YoDlb31(hG6hqyIAXTgL zaF9gm#ca#hRt{U?O<@)XCA!SKcAxzep~U>!04vRE;3ROq7(r&MLQXu8o|Jdk0C}1* zA0y*vbj&x^fo#o`ER;v-0|Z$Qw2H!WS@*e1=``p-r0bAsGn5fKqXWPdOSUeFU5>DV zz(xN%c69J@5g6hSW9wB{2<=;`4P2JRGGCoS&?IJeWW$W5w6A_FVfJsbtrEsee2l>g zc{rwK{ZKqDOCzzMLu4+&1ot0baPg0f{hit^Cal)QMn8`oQx(i_2&z@MKPeJu$ufLx z9Y1_WM5NgQ5VE0^nK)U@g7W2CMeh@#LOd@c=9N;GZ<1_lRq zMf`Wii;nrDGhc@$>AjjVaV`U#&;wr)>6Pj8%8lkOc+LTnnP3-PmL`d7cjte2f`c`u zF|CH)N^Aleyerb$$Ufckgyr9Go<6GndDgK9E_7VjPXvUAyN`g|85lvUad@aFIenA_ zL_jJ4mO=b5X6Ka}hf{K85r$@S z4_HRjMSYoEV zWPmC(J7cj8CICNh#scDf4+Q6tp&!0DY7lA70rj2)S4q{<}!VXj@6l}JeMs6tgwYCrvO z?4Qq_Xs_)_=YZzi; zdX^YiKWt=jnaACibIGvkKH-|{ZKofRV~37Y7@6JDT)z$6%+#DEvLHiF-LqQ;YMRJpIEr?C5o*WH-M4Czg4>o&DxwYo-?56~wX|_+)@be=Ol* z3)^o}B@U?$D!U4UuHj}!Ra4w!y=+7WOXkBe?**}CEp)O!4&LVwuqph#XKn%%_VVE& z_9Bu7gv%e(94^ie<63xXe-sRxU(9XQwenq!FVzoN3q8(0ioHIWyQT7dmip_!p-om9 zndu6jNEKtrQ5-2-$Pn%KK{amm-jQOK1nNXA#RsqmEBP8mkq;UjVZD@w`IR6x_wx_Kb0d#OKkvn|z~N z)#lJg%-%fNdCvGF+0K&TP2nThy>MnsaAw@q1YdTT{P{dF;MVg6UV!WN`_~cV$W-pV z{tY>ro5BrVGj=;++odLTB=~rFxQ2G5zk`y-r>-2?1$GMO>AFqZ@g)bA(W&_N)SQ${+MfIqz|{F zCpY1Ac#8qT2H&Y)BKeW%x2>ymyc)S*t!ZInDesF_l!rtIN1kl&*6csGOmYtt#oRVq zNdvFwG9kz>Ko70N+u9kQM?dTvBD1l$G~?at0TmZJUbLAG3u>4t!2)=i*>mhzE?vX< z6gcF73v#rOkvwVGyGjmip$~F6rh3CN@^w-c6}w0pOvN~6l;KTx_!jJxB(o$nsy=gi zSF@N}vKXscPr5D4*IK}xvw@S^P=2DTzda{y0lP^@o$Nl2_^>25*eP|Pcxgv&%>m|%5@I?B1UC5_+{&$r!iKeDb)sy=|V1YH*3FF{cZ z`haY^3i^E+aL@!&BOp%4)3w(}g~47Bq&f$7Xh|Zlh}NQlhdM3Y`oXBtx7~m}@k|F>zX+@CHmfr^TOu=mbF|oP7hbC=NNhTc{w!$oufFTM^Nb1tRed~^ME0N( z>+DwGE!8S~P8z(c1ZyEX=3!sMWz^8P|4{SYPRU(XDmh3)q-=v;kreaSl3ar?pA_zj z)PHX5OQ&nu zkSwWucXJ#5QgOMQ>|YKr;i4YKSVo6WYewOG{FRoCbf2o?Joj$niwtN|&9b`ZuCkX$ z;N?xe-){bDJ4~|xXL5ij>Na9nH|eRyhO+dr3gM7mBFF4+NgOG>d2j_R0?G_I88w(p zfN2^4b(`J2R(Vh&gI-NYfrAs)Xx-NN)X)fzHr zy;2`-Ho=fP5UG=vzJpGQX=8MnA+xGa^u(}5Bag#ye#TUNq@Fmy6ROk<>dAddTSGD& z_Ru9MIcA%Z5|DnHo^!{%C^KJToa)605@w!|n2k?G;b2lpXQ}GziC%qpC2Q_oC(X9r zi9?R}qg!=C*yRWHL_}+!EpAA(|I%B^aco|X3>85 zl|s~?CM)Q+Sa(|~IJ+O}5eVdiCV4a~0*GZ>qwoY}N}xG#ZL5pd)Mvt!yL|>#P77eN zR0Bubv-^lZee~8lYx=wZFxok*FbC9(`wsN3e4~^8gXCVpdWz#G@;o2egV|29?AmCp zI&^wuW9<0(K(CL)vJsVMFg$!rmwBcUCt3#?n|B0Fn6%|KFvS!v!`EH@bv}9do}358 zhW*`Scy9ZI*;S$6?d$m9h`I_<7=Q7=lQTTBQ$;ku5^sKX?!_#qc#GXVml|8WQ_FJU z7L^q`vXI<>*27sjLu(~%>)^0V+l_?}YH#rpcFG7{&n}plvbi?fHnf`1H?>BXZQfs< zfz{dz*_aC4w}oaT0;_<8eftUY4vPF^ekPf&tRNhANggyO%+%f>Nig-@8XG^lGGTr$ z>WPG>opUG4-&OZqQ0?-R#T5?FRqgy^<>I2%2Xa3-LTLF!mUebJMD|TbGI4c zZj`I;X2inA^?{+ocsLM_=Z+#X+Rk>A^hUOe%UZ^n&t~-e)45j(E6F81VVm?rnUx3J zyd*w}h@sABtS7Z(cVKa@u)i&0!5jH+1R<5OKLicq9pvDnbpemGvT6O>xt6KS!GFhQ zi)FT)U<-P1=q@*5fr_99+iP+dPocX^hnOSN^pAbN`R(8laG*d>a+dhQ`DJ%X*mJS|102*Go)Z%9Q`3iJ_B}GkR2D?JOI3#Y97JPui$EG-kF=S+ z`0fc^C#{S6;dqb9o@*u)jKvU=SK!n&?{R+}p^dzFd4q*$Fg*S|?ZXSDLkY93?cN0~ zdgI6SWKF<6Mk)=Q!Vkndbm&Cn0;$ybM@8Ao4H>--_kF0R)i1NJZ8UtGSENWfQ6S5} zkenk=;!1}cVNozEunR#mK=^hhsM_Csq^er~ao`bUt$W{NTZ*tN?upqxE=M+PSc_qA3%EgC zdL&B=FQi8+P3sjj#L6AW1UEC9nuX9=7+1fSh0dtJLl8V9-Nt>YMT+RL#_-NMWWxXh z7d{W@d@MC9x@KEF(3W`>KJnIH^ZxaS>WaYHl4fywT-ZZ5u~C*{b02Qg16MPv}#;S zO&4fhWz=OYj?z9(K5+JSkJZWq$4gifroyHhcHh)-Iq1e$Y3e`(h!%j=w&e=jD#$u1c&~yW zD94O$4;uy|@+`8%;Rv8DK@`hCZ*(da)u5D3VZeP?_Hq*r8wV--H&pljOni+)+48_% zYvbdbtk)s3Wx&(2?Ykt-fv!u*dc)9qyB?n#u_F*qk+mjiG!R}2WE0-9J;*+PrrY*&-ya7CDi*SX zkk*zoyv!S`Oq*{}&UeEOmY6dHX(+ckNls&xW>@x) zYE2pxf%IlHgCaqH!rg1@B{f9;s!^{)?lZpmw+F>xvNhJ=I z-`U>A>yy21DcZ#wwU-H(a!!}njnk6b(kW1208BnI=*25d}-=!XokeTg} zWZryC&mSMF4sG!m$=2}Ey@BK@(gvUAM-;2V zP}8#*MwyZ3vq|DVij!$C!^dc97ad(okP#tS^5X}8I2u3>+(4w}bl4sj=*AnwK@9_< zDUu6iu__>-TPLb^xiQJin&Kl$(>D#1lOMW5tIC}c@d_ozkOg_ogB>i`xxs))kSlHV zo|zc-n3?RH3P{(5CN<%XDld&BMhC~Sc_H2uRl<~b7s)kPh~$t>*XGt>MzXz^=UgP| zTO*?0x_j)zjBP2V$QbpIY_8QXrELRkA&;US>$k(XvjNT9*Kt&8cq%oB*y|^sN}*y7 z(<@@EVQqXTlX5@`{ORNIrU7+^k)#rgex^TkuT?)gn(-=hS~aURY8wvrk)!m59wVs! z1=fsEIPJMcCKZUE`N%#mIr-ifOtGU+OwJ|}538|YVsxOc*1}${z8hAX zr22FLtC%5Ix05W$Qi?$FcoDL7jQyQVryrq7jD!eYJd3gFR%i<&0OdiUFgLR_A5$M6 zkWpxZowIdA;6++1H9S;C;)}b;c3S0X+$~Gg(%GnN)lACfShm1tp6nRBQ6u;sEr@At zpXpPvv2=svOov*3;qwGKSKcC{;Way#mFfFSUmm3(e+}{arTJ?QIPCm9pN7%VjT46l z-j3y`(lp#*5{U}twtU{pkj26@2;{4POPUaHAJ{*HSdE#nyosy6lwOnLxGRJcRfI?=>-4Du!^Q$ydJb`vfj)A4rI0$ znt$Tca}TglE+u;Mwi=5@FgEDG#7x2cDiw*@!0>2IRrpfCXM!0OB0pc{3C1?g7>pG6 zZ(xa!q)vQ7jTL=_&kM_3(t?l}*fN&0t- z3AlSKWKk-jrHw^_@e$9GJ@fPB92Py7h;MeCSs^}%-yjbyeDfz&TH&m-x+uoqrbbWC z(dW64k|ZPN_X9(H(?dgt-!bfqd@0i}tycSbtRR+V1(Oco2_~TqUbx77OYU>AosNo* z*#MCCseQasXJYZdh-0>#c*+8OnKI&!&GzG)xJ!FNoJctd5v*S zf^uLO8o(H8DshMOyOJkcy`(uq5xIr-rpvD!DD53yiXF74-;Kf9-R>3KbYuy`@iOhC z6i0I)M5Or;`rZswm}rBi+kyO@V)mCBn0?7WZDFS{`(HJh3^wZvW6>%*t=v1}oF=iE zNeeUPp}Ar;K^m8KU=3NuA+QY>f|ffFxS9-j?*RBq;=Rb9KFbCVEkKjG;%{)X*)%yl zOxXLhrjekjF()?fsWYV3B^ujs)%F)xvg(5=7pt;czLqBpZV+f$ciVMbiAXsp4|gYg zP9DA>Uotj7Q^g{QYend_FAp7lkP|5Ll&oOvWJgP)=^GZ@I=qP!6RXE-^QhK3$3zmy zZllyz{lz*>vU~o3v@wvL*~oPhT9QmF(WO$@xJ99k6Jkn$?pTrZYB4YnfRNi_cX%6a z3kDm=KpM5x*WfCi-0VPqQy?#ip#_wgzoY@j(vA3f^v>#hPppTwc2JvM5k=}bQ2SC( z0B+Z>XEuFKK7o2W$UTxbBN|rk@#s0C+!M<-qn82|UU|n9d#4Z@CMZf1Bfq#7I)6mX zrV}BnZkg+^tDr0IxYX=Tpm<8BYeTMhudfYev;QKdLX4~H-yCSx!l_)Q7W|h|OV{&cZRPF&k%JfAowz%)nr(u05>i;?84LRue zC%9f^LxpRr2{i($ERGZ_dQ>zgou2C}ePycQryE)|L<*<=J%!MMe&Z4gl*27W~baJ!k^t`?2V7+w4*M2XA&S z1Wr_0Sy~v1p+J>CR8Q21TRRTO#EidPi`wr^{UXC&Y9+{Em?q9i4u!g+!Kg}FHy~0-{?s+2xb?f0dsNAIx%#h=uqAeq)%fJ=l9mFUQ%;(Djz zcPp?-NHDw*o0C-(IlbEs+tj_Llg=xH^ZDq`EwhLJ0D~2)${6hamNC`QC&2)4F9vz%L zb9i7=00nZ1+;hP3Pl9I;gj#~%cT-Ec-b>`hYS9)E)u`OoNpuj+Fe9*q`WipMru!J< zCUr*+^IfJxg2g!f6=jEN?r<%E9RF5DbK_jG21kt?IVkA$7}0AZ+dJVb7T#r7G(RKR z7c<{?7%PglH(i!Ejv4>TFjy27NCLH_?pgVAIC@2qNRVL&7Aa{ zl&MK*liJJsa!WXxUDMr7Fz&c~>ADDKbmn^6WfbB&FvQRN-n62;*d@0+!p&c)+*ZDu z7Wa<6JK+8br_`ZCuqOZp2f=&`xh05<1`ewsus|Q?FRJJ~<3j~~nV`Lu@dLS16yf5( zuB(aaJ@7|aTARsLp^BNNa;)F$kD!^8h&+QC30;TT_;^-D$M202syxP32394wujs&Azu|rt+xk@N@(knYOL9ys1aY7YljK)~DKq(ul{zfv!2*Wp@1)@!_eS)PlSIbdsq#}ct!Z7F<-IEN?KSZ$!Hz@P_P z!6ze3@4;JNY4Uk+Q#KE)0(Jdyqd}37O8&z%#f#ZOY$Z`Sw0v&L%VIBL292_u&vST+glM25LRk4x+X=rdxiLso zVsU;(uTDT=UluX?TJAfVz<5<|RYxRS>sXBI!&Icm_R_UkAd+MUjF`NEc}5OA77y2C z%Qe$amFQ%@%Z}uj@LYMCRy@5U`Wsz0EnqwcbHx3ZKM=}7$bOs2&^xzF|0ULu0y0zr z5I`mHQkTGzIhH&Xr4d>k^l2l!02S~8Xe^+cfee6S0%8de^^fH1z~Kes;e~u(5%JHk zx%#PP-^&cvA;Ynwx+?>k(Ws3HcYzR6POJawy z5>TFMzLBpEGT4t}7_+1GUd=sVkw72IK~zr#H7TG!oiWr9ZXh|;k4u;X*_~<=C5+H? zASk;28d0O|;m0P~L>7tG8nXMcWXEe8FD0 zi~~kkcbuiz9q1DVx|Pzygn0<@jn>cjlb_l>X@am1&~~OMdMVnDXnO^OCy~J5&XlNi zL!BJdfZ?YHoD>hZ@??C%&5?MfOtbNKCBj=9*>sPDTA&*9ypd-Cv4{@q^Bon*{n}** z+@z(&9jgHrV7)qedhwy8^^GPD;B?M5D2`F7XB9JNy3~vNT+2bTQ?FivKVY-YpOz|I zoqZ;ErXhza|CoE3Q8thohne!#NK4l}=NK;}r25wb?R^^l@PU_@B$de=@r0Mmusf1I zC3o}9Fpn3qln9&`6DQTw_TYDy1haL|=}AGwh1zWF_`EyvyCE?2Y0_dyJQkafw)C2r zU$5g3S05s}`+!Y={ZbiQ7^)h{03?H#;0Y-VAvYQz!F`HC+VRS-9`Rrzu8Hn88b-8SGN5iz7nu_=FI&WHrN3WsSZ>f z6zaT}j{duwD+o!L<9o=IRBemgfxQ`zs1|DXoHD5NMEt~Jhg@5_g?Ze(Auj@_fM@KF zWs4&%GR^ts2in{8p@j$?65@V&1TJiyF6t`ir@^B-uDn>5nBQ zi2AixP9p{vgKxkb?C3n?dP5Tu6u@X zRiD~ZU>@%$_;=MAHL~8gjob8a|ArhEQJJHV+-2_P6M!$!&Q1&00N!N!cMFP{g!!b|Sk`9YVVvkzQUANQ_`9Lz&#Ovb4=@9fO2tUe)chK48ctz<2(~3uJfpmus@L{Ns-hp->r88@XE#x{f z^H!BD8HCNGS28&Q-^Y<{nFWzYEHm)5fHY@OhN~)kl7v}Qx0~K3u8>$#)I~?q-(>{C zYG$#Q@wW@Eb>C_2s7EsMmp79T4n-?LD@c8=HZyQ_2pna2$!u}fMVyS<@UtC1=C>r5uF8xKAjqt-L`QMg>mcVxR}wOvzNokC$|*+$d6dZe$b&hgqz;?Sgn40j!(RJ7%=Vl> zagO?9!UN&Ab8`_c5NT3IY-%h)HH&@c~d`O=AY2L^JQ`zxHJHMk8kVBG# zb-#X_1KIvR`+xiXKc3Drs);RJ!+RzJnLr?o5_%Fs2MIkOLI|OX6e}odC?a43L`6jz zLg>ASs31jDR8+unu!oL{2v$_oP((bUf})~w)s2lwHa`$6xKD8b(;7<|2SH!r8 zG*iKZr)?EJ*O44Xnegi}sa%|-5K=d_P^f`!5FbNK9GA8hZBe`E{EucIk0a9V41pP$ zUlp&_1T5#mIfVBswitppw1bnRoA{sbrOrIn5$;5Rh5c6q&W*hIqOEp87KfP-dhnh^u;ufoGBIs;Fv<<`C;hzolI2WZ+{pppI8#Wqaljo-Q(QE4g3N2 zF>-Oeac%DYZ6=GDFUcG?xx2*!_t5#! zwH>&(e6w~rdV#m8p;*@4nFvsZle>S)Dl>eCsi__BdGKEk`5Ll>{%iGdh^>}zRviR0 zgaD*qW=vpIGiRjssp7YE(kfZ3eY}!%C7gNa*S9nJSsHH{jOfeHi5LDFSQxJ~YLwZaTNa*m}otA8um z4KjVfOp^cGRI*xU8xs)W)x(U}YGEDF;`DnO+IVXbYg(yvU-)?p-$v3`Vc4oP3UCvr z%|>j;Y6G;QM=xdD;Rgj(!5xeJ1C%%UuxkPL+(r#h*8ZRPz}vbqD%b zw6I%**W1pGC<7cf|7LZFw_t=FSQUwT)w^(l1}2R_{rhF$s}Hd6K_W#u!L8<55Z&f0 zKf^iF3NE7qygsi@){*O_NXYs;c`)!3hkcQy!}Y*b2Y4%$frIDPF9q8f%7oXWOTrd& z2{P7fp24 z9Us8g;TYnN;N7`)D-9kIQlUP>wVwq}%v{V9nas4zTruI(9-@8yQja-Ad&8PDs?6@i zm&8i>=!lU~K7seGrT<=rws6@m!)OzHLu%2Xnud8Fk58ms+eEF6ajvNr{V=q7W)BH> z+g+-Fl#w^gPZu(2k}(CzqO@lro7diR=1Njee>QUV98mmO?FH^vcAI!mKtj#DrGtX; z!BH4%TZo{{jdr-YB3OCyHP1!ta4+CCS}arobG$5WQo5@=IcqUTS`$3lO<0LNLod2< zh3*=D`e6-e5j@;(tyco9+ll&#Nvi2}CJndT$>P|>FaH|hH(($LC$s)_{+*ea76Y4M z(}Y)rWY>>5O_Bx*73_t@u42v*{^Js>7riIbgiA_HpHVA};=VV$c;8lxiwRr?#Z`E6 zOcmCR%Xx<}Dh@QOi0;s$=Z~3(M%+8wn}B!$f=L6XiGElXKQaJ&9ihq)Fp!rcn?4Sc zzyJeC=BW&5Q>-?109WCxTm^=Xr_@AVs8Pm;R@7NayOfx&`?8IyTk|V+>QaT5&`A%1 zvONS*;1`uOo_af` zD?eCP_GWWNvgBF(D{_y#?H8pD7U)d+kh2Mqi_(l{Aa<5CdmS&` z+hHUzla#2Mzi2Mk(S?+ERD2aHs$1sHbrSa}^p4EmaX~9#UN=PsG>9{WlT}5#60UT! zu$vm%<_KBT_Plji=^&eUckFzUpazHBMifdW(_91JbDlf8WE&(Nkg^A?o!TZYFs-q( zX{)>MS+8|SEptCj=ydN7L?#a$?;om@3nnRmlJtMV(d#}n zztml=o@l+p@R(e7cJx;Ymsn)neWs0Go+=lreLP@U_!qJR!N6sd(#i5XNVyZ7>1}Y- zVAFI_?;b_ziCk#Qa0j5wsArsIwH zA_!i+`iWS8YACFRLq(VCi)C_{$2-JnqGWReZ;(Z(^b_7GyIz&~!#C8C2>K`-1(41# zKDm)0#8QA|TC}YvRC5?)oLQRt!O>!K@Jk+yYG9(*MCG9Z;)nfKP%BMb86>OjEnI1~XS-lhjuv)}m}k9IJ& z*KNM*=u%2Jc*J__6i@wiYPi2?t4Up4p|@gnlwv$BIkGP|9K#Sd(fKffgM?arRDosS z!Kf!lDKQn8|9~+#q)K@0HfwBHdt}WpIIcJKYE>NGN8lWn4J=4i7LvNNVK>3~Kh`z@H#WT>e6stS$4_48&PhVixjn#V4Vkq$-a6 zhYW3f9G63v6AqIPP8#&NR%=6r6l-W_1i~%r033TGsiCa)2FrHax0g!VaXp%8G;F?R zOA9O1n?n%wIF1`jQz_X#D!)9BqxgB5ammuV_m!Vq@Q*AyPC{!xo9A2*kQL84yjOx` zH7X=gAS=zIM6bvAD{KxfPn*fmd?UQ9&6n#jP(rE^enZ3$YaJi-9JxaUU1n*)Uj{cA_(aUsd0J(aFAnw?3`KuV{HcBIwdH%pfW~C$YTL1bew@g}L zO1nR}fBrF|Ldi4M$T|*rZkFsZ23wX(G&xfC&39>qZP5H%)AW7)xm5qbbi8rqSbP~j zNd}O1jvIhv8pgEu*zM!6EclC7xLGz8D*jD{;N;+{(X6*`ZA!P0%C=)F9mjP<`ZZ+T zuX1hfe<9}pV7FSb{~*dLWn0or+3=u^QOCoB4ZAoE4SdbR2BkVl6ZD%s)w z3a`9z$?&|@iU_U#+vrT8H;;m@Ye<}`4S2(N3oV|jS!w8 z40XS`N5QT{E^C)klN*kS-z47bMt%dFWJ%}PC~3GJpA$y9jo5|@&@tMK)S0-rVav< zO8^Y%ftQxhBjP!>L{bGFm{2|;Du&BtL$?=R8~7UHYbP;~HI_o)xPxuL{!cy{hX=E& ze^1}~mGU?L?g9x+AD~I_@U#USm`wODLBq{Htd;HQtLr9~+es$`Wu?&OJg+G|@7?Gk z(eZQ5Pvdnq&m@XLO2n~A9W%OOEu+8Zq1jY6+9Zd)f|Vq2?T3hgbe@vD!*Y?bT-$r) zjU}luCD&_>q6NwF&nT?eahZ;8u^f-SFYzLwu*`p%r`pe?q59}huO?v=Gs}E;SsL+I z9KkJ|QCXyk+7uDtjS{`oveu$$#*Ruw1}!JbN51x4H(JE05EV{vjs);P}@3rCUaw5=hfRLp4 zcsOs|9*Ry5KcxYK15Dt&18LGKwlacyy?_lt;^1z@Dii8&VkZ^3YA7(VOY%Jzcz)EE z?qqfR5B(=DrN@Gn)S*6uz!&FJL>n>1V3GrK`sezV;y>ogDi#jw07M>NUj?Jdo;R z%^xrSNj|ZTv87$)-I{x*WJ+koJ_Z~|=F?kPWjQQWnUqP1|1TSoOOZz|H&r${2i>=h zCZw(y4)TN)^G$NoR`Dk(taMv;XWAJ9b3Dmp$n$G1ejem4V-O);j!P{v*DYnA*Q46pgOOT}y z505#>G|$NP_ZiT;UQpI(RRGM83Pa#W?^iIan*`7lWjcsk)7dZ4XQ`^=xXNuLW0kFK zl5`Jp2r{0fjPS2Eabx9O>&k0X%5wMg0{PPsMcJdI5CS=3d&Sz&ib(OSxR^<${1IqW zUkb9jR(Ll+=so@6kj@lgzC@+DUehu-x3e^xo(*kp>YIk*nbuJ9^ln}#%eNwrE;6e( z`^JCss3*ERw^P?hqfUNwoY;oQi{ceOKMiTqY$7bVY?a;`c1S4-zMhDiMK#*P9Bhw9 zYltTmt#=7?Bpe-*uG|la(A}y>0m9*P-5d-E93{vcfCHA&PD=>1s^gFS>>?Bq<}aGJ zr+n83b9$Lz|D{^_WT84Z4Crg{W_(c&J(cPHW9IN&Yw9suJ?l3e2RsRk{QF2W3uCpv zdv*c|1wg}1vcXsL90NGO=sFZQ?R08#5}4g}E84)YHKx)kD89e47=M}LWSd^On&f^zcF8O7$7q9fW6 zy!0|92;LZ=!gzapS}PO^)nxLR3^_43Cp%w?q7t-K0iBELomvhuN3MFJ!<;}(oLm_A zVW?L2b9!#61E~mX1}`3lecF|?(RjM~ikM`bY8ZehNYg|1ie^*;?+(Gg$ImsCWvkih&&(4A{J${;We}W?Rlm`gw-riq|u+qNI`$@uGJ;KdzY9r>mwvkN7fZ}M^FGx4#tWpc68 z?_UE#0kC>rYh3!Oho<;Cd(Mlc+SJV>#G2GoIz{+VG!Hqi#3FLp-! zrwI@6;AG;;Cc|L4>+^;ul6;`)EbXz)8>pdZ?Q}fTzx_#88EnmU$wqIA)K{VodS@tu zM<6IQdjFybpkU{&w()P0l@n6Nt#tu8eAU^mIF_*7uf z-$x(%^EZi(eW&WR^%XH>a8hca6ScGCg#pF$;A%t@Xh9nyEuc|rcO1i$?`cY5!uAyX z6QG1GHi#Ik$mgKjV(cq7e!v$ zh~xIG@mCWRb_u6_i+g1J;mbQw(rcF`dXACuj??$M<_k$E*#UJn!nLa6D&2ui+%~n5 z*bm2DEuy+DzdfnJ&>^fdX`kc8wMlVA7O-|j88x&n|_|NC}{9}f>Wi{PSfhLW5z8dOkLj%c4w?J);MB8?bkX0lRkz&z5cLV|wI zp*1{bIdIGokNw6$d#G4ERmS{iag%t##{O`e;i&q&f{*^vA|dOt#jgV10eAxh%{|e2 z+5TT#dqcQDmir6KI3(O-Ag}6~txe3cA$cx-pPJ1f)uj+9jERn0z+jgdbc1$V8(Djz zepH}Gx~PRX0=HFY}>x0 zJW>lUnXC{TE!zLkBahs0DAe^5KE))hXf^Sq>;Odf?)aC`(FNn7T+o4owt^*@P^c>S zYYi;Tq3zL(Z44|FG7M?ycWRLv#3j`+BtMzk>JJ%7!br}~Cq~mSPCAHe8++~rjflW@ z*}6<%=(p#^Yc^DcyUh?l(fbw6h%B2YL8u38G~?ab_bi_E3dsA|+;sP1^AR?CpcvCu zANjg1F4wSvoR#ImTno`eW#lzzs!piCTX2G|CZ&SDD)O6-hMIt}b5gP2-EUYZ!daGb zpR<5C@UXW8{Axd9@T{RoyG@>theJ1Oxli2PVzbRDJkC?W*8RcB@kLS>!M#qwC*0Ao z{!^y4j4kw%h{QvE<$*ZMhQrUo^=%hNDm~;XpC@>dT5+^{7OG0o*XX9PBi&)?})?tygZ~c&PLAGo}JCPNj7_ zMM5bxAVW#Kv{{+MT45Q1t5u8j+puoI9*F zX!OZ3!i!u(0Yj;4dYKohxHjuHVNRg(nsAv1QcBHIGLGvg@je7`n%=Gbk*&Keb~`E- zl*Tz3krgGF`Vc!9YTK-F4cI3514k=~elqUzY^niD78hsdlIf}Dkz{46`fvY()HLBE z0u&m#q%$VXKPn;H!A(JY5S5uy;GpFPi>d%a}{i*noKz`&+W14_A2|HuY?jDQa{ zw9Brxp-Ayx$6f|bL-KS7f(*4j)GX2ba5;Kr(1oNBF)|BC?gt8vCLDxD=ehoUHHBE7 zyL7`GC+@4ZDkS{+{qeo`lR8CtLe`@do25f%ybf#Ybyofm+p&c&Tas2j<|bX7{+1uv@x33i#n%6}tyl*%re?2K?Ln5}Kp$$9Xy zvnwwjT^9%kncW#o2+zW3;<~09-g^1M^J2dX?zrD{&O<{+>i)cT)0;Y*+pY-n7Yg0( z4`F#wO%=^ZeF9DDY{i-aKlyd4D2wQch?}zG&upZq0Z2mRuul{q8`H&+>aHyrS@;1( zy?JgRX|WP?{6w&bXqEkZ25sr5SV&PDxkC|7Ba3puAB1}hromh^eMcxF6=VDHz|8tGyXF+zMGe3!|%pivypP(P4u7w;vfJ=i4h zXi*XUE(C$?NHEQ}c+@}$cLW;;aIyj_A~ur2^tT=lu`tWdnXK4D!g!%ew@Pnk#mRN+ z6;mSyI_@B=3H6@&E~pc`*DnrkFb>0qhxCgH%Qg3%?U+IfDGJ$3?Uu{)QBY5ck+QaG+v(r(5>>znbe(^Q^8+%Q^=1tBhe@7$2*TYZ8-e6DRQa{eV9?#px#!>_ zFMmzlFC^vbH#Ej_#*#uGbHf$A{w63rPjYQQqjOU8=+jD^m+D9>pSLJ*9UHE(AqHj8 zDY60tMw-nul8lX@W0l@OY*f|#JkQCzLBX>%XBq6hm8C&spaMhX zHmbdEg$-JgW+{#KO=pN{^G+xS8$UI#! z5XRP(XA*NTvKLR6YL^w=#x{NmhH4)nBtPveba$J5pz6$GuZIS!r3k5}zv&3;CFK?r zuy%CHU_0!(YsUP<$WG(65m7Xqg)PN8^h*M(R7du+PH!Wi3=#7|KNalcftf1^7l6pZ zh3cQaV9Cykmzt8p!#{guL!?S1Ze5&hw-f)mwQ4ZNl$hkU1UqTzB8!FM1H_ zEt4&B4`YQ?9_7Tuk&Vb417m_YEdYc@a8otP_=`00;ffWG5=H*=44d|fDqtQRT2C8I z_mq+oI}iPAn|^lk57#nlE@W0NE`jN7NAvU$SVcy*6yAx0FA~;zP)ug2 zQjcjFlQFc#-LYTOd7BGB?S7Qgkuswpp+WTd3ZX1Tk zM#+^)y$vV2duh`YOrKW(RP?|<-g)YV{2kPm}Myp2XYs z-`Htb>m}3DLhfSSZo3`Je^Ku+&`4r1nPFg>A=Iq!CVpsZj;&K0K72VPP)Ygfw9#q; zJt{|0k09l~K$nF&&Jj24G}LV0J93v`QIKvqxkTh%c{EfDNY*9wP z5XXkci-3D3(2Rp!B&f<)L`5aI)24iXFvWpoHjU27Jj5tQHUhNcAV(WJfpQ{>)oDU9 z9=q&?*+KLrGB{m9?-w~RrUp;$VPR(0G(XQus7ri5u2XIe&#e4-oG}0eJh4jZhI)~( zf}C)YDGO}K*c}`BY~MbX+34U4bAbypAL|^ zgoNaZqL!Jt?W{+tZOL(IF7o>rELP11k^Iyel9?9E-GV z39!`pB^sh5_gU>3x!2;*Qf9Fd1x6k5JM&0*FkuNWS9o}`r*ENVjm&fcivIhSGPyG7 z)U6_*Lg?kgD#LzT#o%)%p$XwJ8zd~M$`OsQ=Coubxd7*x%8XlE^jzWbb+X{b~pjC^bChofJ zw@>SU4P44&Jv}v096sqPAZyJAg*3Z%i zq5QTDdNh8*W8Cn@Qm5=d{YN=kh8a&tUnH%>u_V0$mLW5?mNO-9|qr~=QTD!vX&#ye!{@7vewyJX+e%UGc^}%J%K4sCjcW!oU&OBmIg}LGMVy87#zy5w) z-OG>NL(H)p9jZO{<=MoSohpyw3=@(i$I4eM8MSPfVUdQ?Fq3UsLvt_o{o3jT4d)yw9_8FSnAqJ$<~ehi=~Q&S~1HkQp;G+jT9M?ECl6?Y8q8e}2Q;Zp2l4 zzy28*S01YbGL{GYW9)fp&uXF0AnD-ZvHud>uAFX+y0WVDFzzaLxAY}nH}@0;R^f*A z;GO3-j-219ekHiP@7uwz7DqB#L}$*+pB_$--k;w+ocrEeG2xVIT>s6a>t>~fUEF7i zq{Gz-gX3<@#=uePs_Q$SdHb{+xUoCwOVL*6h@t0McBB)NyK}FuS$(Q%W7`0&>e|BO zuPs-6mRMb-=cW|8osMnvAY9A6nfzNR(5GtS-2ThMe^h*He%-$B9yB|ctGf5-$?TtZ zU67l%=eVXJFME5BPrWnPas26}vAs`i=O>yU+`n-;1Z9KvtesE)@v#YNz@jyFEPb21 zMrrB$+K`J@uMNg;ng8yz!u@SaX>6=r`{$}@R9>lZ*v04fq;@w3&xO2p^Z2(ZHLdjU zk9Soz8(-8_?X4ne-&8EC;s$Ptf9SevS;INV!q9N`i0L8nWjo*XNA$foH~4pt8WfxD zF~9DoM6vE(H5VMSGUxi8kDv8E{W)5~@vMViiG?3Rp(Bi&4*E0IxRgTsxx6hdeyw<+nX!Rnd&~(MN;WUXOTFu>j zSVfyZxIIndPZ+=U$lrhNA6z0IefspP>ppS68-7k;w%&(&-oAeI^G&t7!*G~q)YwVy zxZdp>p9dNbA6WU7zVB?*tLwUfkxr zywk-ocH#B;W+xdB&UJeA#?bnMIth&XUZ(p$yVWjVwyFK{OY*LZx9i+4&qikkp9@sb z!Gt~E-xm0rO+0T}o;7*6hJl-mzk$vmkxvdSY_c^TRKDDd+3M}qY8e?Q`K_2_* zro(FWM-n5Ou=aqsY!b6W%S$=)^4d;WjZGp}Clc; z!tPI*^Uci0!*<%UKjTK1Jv;NeV3n^u#59@2Es=_s4ffPPn6U(S{6S3I=gxg?aU7Qr^99$kvEcV zY`Ane1VvRHWK#1&Er(JoS@K3h4H`|kk?azk=f7V4%*;5sXf<}Ovc$=%_~f6}Ycz(xurH3H4y!~@ zdX86rxOT$(>hUe=2V*r({IDDQbL2|Z_il~?4n{fff!{A3?&aJ}BnxiJl3#8m~ZfmH)I0nA0wDE11DLG}mTNFx`49oqN9h)z|`K8p4qG8@H*DGHlL-bV0gK5A5?tN+uAoz6y(Q$<#Az_Hf zFeGf3?jwzk6enGFDNgEtH={9=|IOXm%3T+lD1u5ZF7*TCt_eHaBz-J8HC_#u_Zh){ zT@E5*qD-4@ z`J-#q!$-9EaAMwLs3ZgQ5`u~5#z$zW?g8Uk>LZdy+NPh>*G+gd)2>SzubPPHU zkT5tJlgZfP2ytBKkB=f+(#>e3t%Jyc#j%1>cVBNM}T;+Hd2Da$!-;T1G?1BM4{BU9Qd~ z%srUP*=9T3d`ZvirsaPkAfM_8YUq1kMoF#UiX=j-5~PxS$NZon7E0%txi77BH-0ZD z_TOfO*G51nm{KfS+gn(c*~62J`7KdIbz^X&FJAqTe$%WXeIai3Aria0+jNN2&Mm(z zG~V!pmYmP~2~r*XBdCPpR~==NZp7$cnufC5mt?(`0RMSH`vQ508O-qbv^BcwZm>tu=1804{!C>y0?j-d7W}p_*THMXO$V(a2kGAScPZ`)`CFByws<>Yolj{8?LS5ul?o*HQ}B-9wN9A0%;WjrB>B4rL~M3D2PJ9eGM?>@K^mH zg#CrEpExi(kus5LJH2z@GFq_-6_N|ED1^M6k@|9{LT^r=q_}Xg9JPo*69!f`bngv@ z(S*(0UF@pCT#(hJcj>Z>EiCzuAro?=b83)6j%=uw^o=3a{16#F-gaxiS5)VaAN=4r zQmx{qP^!;)nf8vyqSkL?WM&@DE8a=|(oNyJ_!T|cnU%G^uKc0N(T{`>;y>uDDny7j zI>MWlMzvisWIQNSTf^fNxj#61u9*LLQLSeeD^^()8=@PCej0Qwx-jZgCvt9Ah;0pa z71K-)+aO+XgZ6Dfw7`r9syX>8IHFJ?yV`HQ{U4kq2}vTt1=Ob81pxyLxMMf?l47u~ z2K!D0iuz@Y%p(i!{C^k0*h=8b-10+*zUhO8>{_*-B*7Jn1?1Dd74fW9AfF3!)E9JUykcpVXyWjQ&W%y%N2G0HcS)H-lM!3ZW|K0iGH#Gy zKd?=gsA7TXGS%kVtauna9Oh`W9Iu-eUKte{v~lXXl$D&%=2{mbr1ov0(Q*- z1pGdsPeWOO316stpdxdLF{@@j<25#uzqPeW)1hnnW;GOfZG zb$s+DVBbdghbNZ09*!PIK&JtuWpycgDGvJ&0U!Q>vEN#d3-#+KGpNGL`qbjk@HIT| z!rs&$j4NBuvQ}!;7E_*&dry{ANI?~W?i(H%)WwV7lOAW2#RKUAEqKu2bCKnY9O;^I zZQ3_6cI?oNq$LtTL7uT75a93jeb2_l<%6Z|apXsBaT=PrF*9oPC6ZOFRMixt@i-21 zLvv%_`lJGe#u?RwGM=^tFa}?;(&lvn7;&tD<+&~<9gH90+BSwm#KkcV_bgPvYl?IW z%2-SQb9^wc31GR{7#PX|m-8Jp?)RUI|zQg6Y%fImX z;X8P)x0X5E>2U2L$2Z6Q@+Kl1D|6m655H=NbdDiE=}j|Hdy-)~#WpcmUKt{Og|2Jy z`0-FP+6P4}T!Oro63)4;ne;nWERUx9@>G-$updbM?X9=Y$Od@-1{pg$ntwc{kA!eF zJQ%<01B3aEgy-LBX2S}5d!J0}UoKii{}`s;z=}T035~| z#sY2nJasp`CtzSfB_LGhx5&~?T$<>d;sH|H>gu%~?H}rDiP2wF{8XHO$iu!Km*~5a z2!9KXK@*9woVHQy&R`yO@(Qx`G+U9^~%$l9o$+TNdedBVP~jkuE>qtK!M z#%#BnP;oRp%SNkwU|ZPmxXuOvcdI-T-6(fzPMYSks{PYy!=mkM{gwDSSO+>+zg#3K zerVO!OLcOKUP%jFj1H$tvc&b!8SUHS3nOioc~f!|L&l;48$=pH;6=cUBxaK$6xujn zm7Nd>l$=j+0~of-rY+P?SAdau4R)MGBC%G+INDQM68E~1yPGDr`s~0vKz=%&0B=} z<0Vdn!>)JH1N41$6JqZ_`8tsWMFY$_j(v6>kCMg?S(Yq%Jt!LSYCXW4$Tf71zm$yg znNhq>*j1#oH!#yKN$%_7CvHP|HPo%}&Lo4pSaOA!*2hdnF9`P}T@So!1RQ+89@*Xh zAM(H|h}Y$XotvxPCMSb7f!R8t=gx@&9ztIVZXpbYA#VpFmPj}~8iz!5?)W=@w+R`P z+t69qkxBuw;rcxSkHO#_rr8M0peFpl*I5P%E>?n?LLf1N`VtYO$V8$9U&<0c#l>`$ zdFY=Iyu^0#b_dnof;*b)4hP@M+F6%Yq2^nk8m?!|pICG%>~H11eU20Q2$wP`cdSOK zi?UW)CH4T>8V2US>V9h7_s-WkKkWgGw)%*c-JJ39hnBS}W?2(PZtzH^gP&)&i#s|9 zZgw^DFammVpp0Tl^~1LW6;@ZjCM;V`DNK6M5KPsSM51+As%^|>$Q?OX(O zV^0G1I?nK83hb{avIp+M3f@!~8>`)<|)ZtuPs(J*C6b7-2eIZy(+AE**&D?NJibIvum1%~iB>LXphx3XKMDQS%5;yt*}2^F3- zW)+z)J*xd4)feOue0%nxUA`}x#HA)`&j~_tWsvrWX)JBn`~Wqt+U3cZq5d4Q@={ZV zK3$Zf(3|CXvIr5LuKNPx{)#`JCNq+xcjgC3d*rjk3)My-PN4R;vN%?obsHmn`eA<>u}N+o^$cb#XeQ zNag~m87D|z6Bwk7R}x0_uaC-eGWM=2cp8R!;O3H|Gb!7Nx5)bkyaVi4o>CP5sPl~^ zBN(Hr{8z;-?|HkHgV$@bP(kfgeHj$&p#J9|lQ^B?_+o5gpkjHcc+1Io_;+1dWvW5N zeoI<=20z5%Rj5ew zV-uax)6;(7in3}vO_aXO%`)S(!JxdrSP)}AWB3=ay={|JvF*H{QBAcc{RPJ2MTBrR zfFX=e1c9zFn81OS6cCq!1Uk;Y9gTx$voW2{X_^qr54;CsytAGUPI3*mpOt-I5OZxl|bNih8I|%LK3kNE~Yr5yI`b% zR>g2gE-#*X4|Aml0tQ+;evP~qUz^t6Cj{xUURA+d&!Y$WZJ9}m6wfJuN z-r+=~jlF2xqoFvfWD(Nzo6xR!Mr_IyBej3%`ib~ihl*%_cLtB9)Xr!`f=3nv5mQgP zU?)=saF$#6Nd~QjXxwoIc1?zh1~u#8F=35%aKA=qeW})DV^F3cU;^RbQpRPAfUq?D zG;(TE9RH$1+uw3TmcnqZY2!$=fO6{JgpouR{kEier%+oC3Lar`2{kjL%6MITz>V+^ zF5d}4ZAaXbR7MF(-cIiA&|5kkZ9#MzvimFZL`#LF7r6l{BRT!K3Ig*M%Gy@vNZHXx zxF+&n?;_|_FzQ{%%3dPWTm8Y?wwShh;KKMKt7p>esNS>!vGVQ3$jJ?n-uF5mz4Oa6 zxavtXol;#NKY*0q$_i%r3<#~K+>E%_jpbFvx4ZDcgn!~e7plZku-@v+eJ@K(j`H`) zkq<+>*F~$W+|y4fN~KVRQmcuauI|zPm8y%T6iaAR`8xwU2|!mF8q$)fn55w}iHsSf zHTq2^@gf7EB`o>HIy&)%43;88utsH6Ic|fD)moWv(4B?pom9Oy+HUzoj#NXB3Ss2b>ITM$c#s5K1%G?;< zdyXJCO9tEY8JmkC;Q-pG33JVR~M}8XudIj0~>Rg%z~j&Npxzr^GJ#<1FVI67a6`AqI7ryU?bTK^cL35%RGl< z!y?zg$EzmQqk*f^_fqR=t#1rmQ1JmHLin=@Z>tG6(Sp z=JtSN!~@YtlN`+ZwKrSF)kla%7@6UwxyoB1TGB@QLw;xl+oxyT*OzeAkDZZG5#seh z^hLBL1bd>Qg(H+?G3HV7B%yANUrzqaD8eDC=k>pa=y+ za@i)RvNIYpXlQKl%g}0RZ%CGI5mV`==6W=Vvb^@B=6dZ}xtcTuxWCAW(Xsmx8#)q* ze%Cw3GWR4X6WAPd@|(%DYXgEcYuvcyCK-dUq`8#c24IM?@Ff#GL9jaNk3)&{AbzQG zVxN@_HrVp1EG#ydSf2Ro> zqta0_B+Ug)57?<$?(X(4z4F+eG1 z%UAGqQ=~^G4{lDDd~=taLg=LvK1-3T0w6KqWlyy3U8{}9etdu=`*GOMTBNB5yZgFV zw%qID)_8zP`4^M?s;p^B2fpKkUSvr`fQS-@~;GIfQ&FEgEH$(b7EUTf2xQiOgy11eSM8OqZK!1wL!pZ-HA}S6G{#KiIoW`nBd>a=80)wdF+oW10G-ak--Q68U@c-C8@gSAqF`KaT%jy!$?+;O1Z~K3UbK^!~3{ zwEZt6O_SGqn>icEhZF5_1NX_QO-crkOTkBJ=E)%J16RX*0)+ubUD2I%&$1X3#e;?7 z(F5pA%{y+_rU%5ywkcGc)|tyR+)cmRK#H8dgNwP_g%U|CD8cL$Vrmh1n{A+^d@L`m#FMSJ(U>gCxseP-U(6WBtj zUeuLOsEF~Ba-)*B6FH6#e~!2Ax7usYc9;wj;BOu{S5lkVj@b!6Pkkd3f*^_05vr#v zD|Hop6a^wDvmivoGN`i%o4M9srUk6DJAoUMFj#^o{GPO|7 zNw!6z3lLp}ME{NDeWZcuKq$RyKL5(dt!V=I=fWC8RCN|n_3hBF`3o2aB`{QSlG$|U zQkFUNB^m_%4AKN(4NWTmH=3`zh=^s;AioL2LD+3Z;_g5S>liVvfyUE*rzu+R*sn*( z=1>XV`sHy-TAloGbsKcy>Z`QfN((Q_Trv{Xz|EdyOthwUC(%qU7DjTf%HCSXF)AF2 zU@{cVGj6j#9hrDIiaKIk9>*WuPIdKO>@PP}g4+6x__%kvs$T^*)Y<^{c+;(6{gt*v zPL^~PA}2ydMKiL!CpUiM3M$ocXlSWCHb#78W#_%&CEaN=>v1`35%_N95SfL*MN63@#76@0TlRngn5*XWgky z;2-`Bt33ouxbTn(&4lzg-%Y$oczr{9yDu2@CN2Zuo7OBwrnf&z(qaIOXbioo(G{Aa<>pqow@W&7r zFZB(BR*UftKi!p^RR_VnX2o>QPDW^2Yv3RM(I>ki$Iccoj_w~4+J4cwE!@&sH54st zMxELO+AloKVVh>~gN(}Wcp47QYI881# zU&IeFA1Lp-&!diPj0^LCdNJlHTj=9YfXrlWJHH8l-6Qi840%XkCOmFz0_m)S9eQSL zWVBe`YpQM*=E%WSsctuc7i7waIjps=RkPogcmAV%xY@>+dL?648Q;;v!(Z*?y#Hn7aQ+O(h zyGUxu`_oNNUVen*V&|K5awaGRVG{(K%OjkAhsfnUaXuTZ3|-nixY*;eWJ@2*M^!=X zRsn2w4mRJ*#X}tQ`zIK*zHues@)%?Dko)~Q9y3e9pX&nMGls_6M@`AT?tA_ew|Cwe z(&&`yh_@;M8~bOryeKzNBb+)&a5b~<)9V3#B9>v}NGA`YAWERcLg%bTxbW)~TX2=; z#d{qw>$Z)Z&@0`YK#un2KD`&bGYY((vSaB)LV$ zY&>QmTb3$q%`ha{?s}OV$hoLAS&1wgVNBAD)b~kn7`eo;QfL$H(6~l+}bo-YY*y| zfa;7oZ0*dg+dcFDtq01Z0Q&;K_=&vVJzA!$5XHfXFl=e!yg#7K&l-BVd6M#7dKZ5*e6a0~?6m^ZR`&x6%og>%xj9!{uCwu{XFB5~A>; zc7+c@IegkyDPUzQ)1yXG1vex($zR+=Bv!bsZL4x4Dd-Gl$zilmZk;H2qv4t2W0tC- zarx|ATCsy6OCy)bTG`v*nl^7`*^?qyR9-$ww4!$N%AOGKlpAe69Z$H+tCZ#4H9OG7 z@(t#mBK=X0{qlNgsC%sefB9S-CLgot%18g=C;l{8PVdS++;|9KcH2`cxXJ^a-6oJ) zia9}aJy?Bo{-G|0sZo4#s_O+TXw zoUZyno|}4VTnY6NE2qM|?$aoyN24&4Fcx?mag+6FA1M~-AcoQnI-N6DS>dU0n}3XVw&6m{JT2D3m)E5HKv%Vk)#zsIv~#1EYy%El}h+$H}U?fc)%6ih9SQ6dnF@A(K&mmF@Z1HqIa&*myfBv{3RFAJ;*G7n4JDt`{#kD$=*0J>}tJl5 z$)C_VnidVvb*s&%SkoKm0$YA7Vx8OJ0?mQ+Ml=o&E@?}hgIIpRfyKk2wFB$>Q|{-9 z43@+V3PB0zCSZS?(e=;K0_=*;BoMG%>FnnlW0`_!_nASu*Kw8)yB<3E~=$ z1}fLOM7CVIV1cd_sXnyQytw(IkQZUx6&wE(H+IzVF%U5K+e;3(d{Atfq>*K{FV zM1GmIf2|~nlc!BtoJkZ6a3K87+6M~0TWvG8+Pc>Hrpar9{Y_AhfzjTiDx)FU`{0dJ zRdL2J$7_p*-+x@$z}c2FGWPqSH^~X>1itLDl%?{r0q4?VW(!^>mKtjNn7(N0*_a|7 z!SsPn1`y@FH6LbEMC%NI=1S^Dq^)8L#u^PP&_ySj-w_N`6zb zq~*!Cb3-<;Ju*>u)n4R`ALjQ<0W#RhJS|f&9h`*TR%JZF zM;)Z}5&_=%wyBMi?X+DGFIJkSZ-(9;nHyjq9Dwd&sYt$c_@rmvd73H@QEWsRZ z-vC}zY9Sj8)qj7???N=`9G)=@Ow!{r%0V})!w7*O7My!l;50!rVj527_^Uk%6h#(X zXfj8{JM*pI50`xhTOSZSGiIx;X+_BC2zjR2rw9`5xi9+!w83D@wIBw}`VR9ZW2}cn z-Wh<`2t`j4hyToP(4R3)@%#>^7so$p+kCe|Zjs7pvO9*~Rl@tJDwD-$d??yc5tZ8K zkGKa@-|@4Sw$n#~&zP?ktl}pp`PQKVG<&eELL>gC_>;gsrPz)0Q5u`H7%0@FHycOt z+t=&4RvUGUi0?pIbY>o7m4uve&tsWlw)R|`;1*hNa6=l7Y7q`M@r)e0hzV=l%7&MQ z>py8uDi|}XD$exoqC-})ftmH97~r-Tlm=*B4qAgkBp}T`_?0Rm%o}FFS~$_=|7n5q zC@^r{33sN!+-nf4Iy!;Fe3`v$DS~&`%obZ8{rBI$^kxuMIKat4G#4gotuT|Iy=8Y1 z!a!l|aHe5l`}vAea7_S)PERsiQrD{~&|e+EA?Q6nC)h%&8tmU4#xXXf`4T7ECj*x0 zCc5(`iIc@j>ke|Zz@KM3S-%I`B(?a8Oa9AYeXvD!clZFyKs~Ynty+$`72}g15L{a} zAW?)m!NyurV7RCLhM;%HZMCaC#LCO&dJHm?mul?TXMk7 zvyMC{aoUQjY0EYq-bf>Obf2tvQ1wl4^0?tLXmvn;8MXL;=}FQ*8flAd)|t;llZ%&c zhd(lE!0DvM)iugDoTORPMdk~ahA-)&>mq;hEi=%xvY(5wgdGLH1iL0b5^hqsP5r5~ z?Z>}%=P#sX((Rsm{D%9}aofK3`wLm;ZGzkTF8+Zv=Hdpssds^nLr`Z(6I>1c2BK~r z_*bY30o+W_`8#W8|6NOoUZ+ievsH!F06d=|bB7?VH>3|hwakH&AF>~o^AYa`;2A^o zF55KJz^TwS6REXw%$w^Rm3KtI08tbRqe)~IVVf4UM9Uh&H&t1v8jFu97YJW%e;_{SLN4>F^_7DSmHixN~^eB1%Ce)iO?4IxLg616-t@JIv=K z)q>c5R%x-ptD-f3$jqKCyXn=8zFztq3B%XveMIyWpfrXT->F`TsFukL2lsuh1?;WZ zy|95-GEVQQC^Jdy@nqsM9P2qRwc;bb=Da+W0aD}xF z`6cXr3U#SLk6lA7Ma#(>r`)}`>|F7ZC#)h?*>om6aUKRCu~0@&=2J~*^;}?!A-G=x zP6@zp{xTWwe%K~qEEqTXw{q}7JkJzPIt;|33X-{EsZBrO-I2Da?bYR}?WE4*SBmZW zrGhy^w~4lAQsg^KzEJjP{07b==j)^A!%nMN3F53r=SmYf&U`UZ_hi4&V;S~oe5nb( zA->e8>yhPasMDQm`6Ah&&Cd3GWbOF2FEEAjaPgxJ)91VwSvyfyXlnEyA808qOWM1m zV-KYb32tW-sZ%;_bvmPU%W$iXPCn*T_iQx4@sFP3XUftJoY zNmH6Yaz5dkjp!s!`@ar+A;6<{B0VT97ZyJ#18<{2w)IEa3HAC}qHCLtDpI$4{P%4l z_q(+xX=lE%LLV=<(R~#St%YnS`G=Da%ruseo1c}wp_iv&&CLTrilVhN$eGP!)!_Jo z&{Pd+6;;POI*}6($M@E;V$1j5cgSA&O}>dyI~jD!F_A^-y?lyM54_q40?P4-*)3$D zK^X6+N%M5QoA(M%DsS8h6R-F5#R}i3I)Um67nI-n^^+V68hA2128>T`cLTFFymjBV z({QEv**P(A&PC$52Sw!Y8p93xX`q6;54l z%@^cG?YYz=&efiz=!lUq-9-QRJ#Hz18uQ)J0XJ4@h~$cK93}XGr~DFXyuzo;7-A0a z36`E=?gwt8Rc92(M^8YV`NP91RN&|F}k@>`&`j?*5xOnOA*s-hh>03K^a zYhR_$6oT20NC`)CCVVbcov{`2cEYL7RZrwra4mUVhD&ZJ@F9bpeEw#T_4|FNsf~0{aG9rI=Nczj63?m1~0O2$k|xJm+L(;yJNe5 zt%lcjyum+2!MmuP5k|A7QWhLc!&7lgY8onVThD2YuahxPZVlrk(GDl@|CeNmqXsK& zkcZ?)MXw#lmk!nFsEDj(8c+CZ{Nf!iW%or(F@M1zB}P+DyxVGS%S>i=)%wG%CbZYm z#||J!Ti02}KTQHGRw(Jw2iJ)rZGO=JR(9omUa)C#Pz)tA7+6dq4!3<4LcTCs9!=#i zxPs{%(WG1x&=pXc_57ELc!nv7aly0I9$WA=iv&1~?6yG9zF<#S+?5lRnq3(wBte>E zi6}$`jf1s4<*hs3{$`CC^5S##wKa-hArahOVK7)Zx?p>{TL`%+N)A!)r`RKFxMmJE z&>nE-OxVkQ2`kOHn?9+#nwLLQXX5)4O8Pl-s|(wCK@EB3LuUtG>MgOe2cg?>_sVU@ zgkhjbN~IGZR+v2@b;Iv|2jnB$M^CohcK;JTIvRX>5s_IT9@x)5%a0J96_ zJw{m&%1h9}@@;|W98mtptom>`0&64#6xJk}-V-{U?Zruo3$Bwc5tn0C^3E>bk)J-o zD-fidr){a!WD{r6kZzja^J)hPv*6{Bkb+X<9k;TWgeU+tkP{&rt*834O$y=GMNeY< z>$?fvDYvWsh+$C=7W)qLA1*!Ut#8(e?@sQNH%01NhS{BbeZDit**TLsb3k*Ny+oRz z#*65!)?K&Mn?(NElqt9`49}Tq;H?*WhJ^wKwmEFFN=yCk5K= zsb&aO#rz)}SqF#o?+4;}ciyL7pRdEla~@Fm7=RUcEnsjF=X0rEiQ(4!OP~pFLcf|> zG2Mz~xM`ShIv%p?q9b6p-mN59v&q&4@Mx&K_}RU&I3^ZrC47_Am7tKVsx639gesxrW=`YoKGdY|#zd4B_)&lBIzS!;rc- zjq#w8b<|^xmze-Z!!;Dvg_T*DFiNW~tHK!`k__t^$xLzCYNZe5n#$0e#9tO#%5a04 z|JP}}?}Q5Wu_pW26rDs+)t-F2EY#b-6}uXxV`jnc%Wt4E z*>i4W)wzAPAKMY}dF-Ms_arndeyI%MF-izMb#R4=b=>G z@Up6Hjz&tl-qY^XhT|xiZv9kr2YszZ_Zse05`7f6ADeKR8a3GGh5g&ePG1U~1b>B| znJFMPmTexz@_Msb=DfYt^r!B2k&Hyq3syieWhvCQA|-jNow$Uf>}6*4${l|e@Jc?o z9EG)^aiU1eQ(vilnP}m_TY+i~#M%q<_7W92k|Bgq+8Vc1y53d=ondX}DG+emLl^Yw zn`OK{>@i=u>)-96phIh^0>TKGyalwUyhdhfaH`At;Ny0VY8??U5#>kfff2) zMilcM+Huuk9v=CZN|muZDfh5lRQwKkoUAg82JSd7%I6Hk)S!c~e>;8oqXFG&qKzU> z7b(xNu=d9mDB~LZ!TbUNgq8|v30abEkcf-xloKbxM3@3;OpxXN5LGt5npXLZ8zPqOJun&_9z(bp`jCn z09!!axdHry%c9Rgrdzq62opKXFn+a-w=1QRP`AQIKN%NX zLk8ftW^3{07gXdLJ&L6_pFfivhi3>1Nmvt$4DLY$5Nrdql3ZO~v@+pN zxIczL-)|3FRpv322RMi4&?t=ZO!r+(a?Bvg62hsZ-gHB=6f(&>%3Rm*1XSU+M{VWk zsOh#fwHmX4RYmhVB;ao`$$4BQEr?xDaJS*`HdA?>9EsGvsxW%#o|AiNs#`NW?9~z< z?*{IEbf);F&-kQyD?pA#_#mvXxU>xXhY0nbg8{nK4c3L@N#V@eWW!O{qm(f4S+LaR zWa%vDX7j`Nc!9eb&?VW2g1qcv?u6TKQWYI5h*bBHyQYKO%>oR#0s&sp($Uf zyncINdU+@OH%Ir8hE*_K;z=>_> zHl{lIb~U6m#m!ySyHAFtl?IXNhx^1GRUTKbj!07whWB_AjiDFe_hCwQU9^U+T2w5d z(3ilawoolJm%$>h0bvt>8%R=F;<97DRjliK7_8PV>Z=U;3z#J!7>DI2L{1GFEi}Y( z$^#8`Gue>fhSeLk$N0BV26DNs>>2((1Iod5*@J!pSb!*v$i+7Blt0Yys%X7T0Hu_B z%Eu354ZgSFVK^?;%dCd=`uL|#HwwrrkOBKD1KB<#Xxv&fC~onmi@i@dyLLCz;=R9= zk;1xPXWczjSZuFQ-3}`-&8b~_9KMF>qXnxsJ1^6R^zqn>A>xkRy*<_ui}TTVhn_gq z3E{&0(*dH*)Cgn62a6k!4V#x})yGpVp{$J^7#vrv< zx#ynKv8Zf0W@udE_FJSZ#SkuC@HQ8R@=&nVTFWS%ozG>f^nfuAgxvxvCQ)I}%Y;3( zKf}_?_9}e?I#=JJyP%{~X?=@s*fhyv9W{sgG`v3@p#B3+u*NAqt1BAOw8Gd?$)VpW zBpc=#Aix#y^4JZu~{ z*Z-9c=gJP*9P~o-Oc(lwGZ$O8Umzg&0VNt-m!0Dw9qfN1Cd#?E7vclU0dJa>qps=H z`^qIT3B!1cR9)$nhn7~iSM}A)b$MZfcZ*`}V_Fg)dF?n**6e0{L}>VE@m(_6&Jkah9iE{DaUwCU; z1yxjp12E2B;XCB z#e0NHw>=R^0U5zS4<6(U$M9^tH!ZM+w5fj8@xvyRYIgF3Lr>aq&Pw@m_o_+T?yON8R1N-KYE6Ih0`Pf=Rc{3$CZyrm4s;u6`C6 z!7pt6ZDh|(D_a7-MVzeDXX+%|ciz`^5F+Hr@rd#oE$EmP5mLl1lQ9{GBXt;c0p`ez z(XDgH%fl3PEXbVeWvc>b>SO&57{e;e?!3G_f7;D; zhyT|Eg8wveXin)1%hUXk+>fvGO>q9>-Uze@i+_%eW2Ih*Dw3<_U@f#Ugh<9u?@lB& z0W$5o`t5wYZHLZ`8{cWSOLI=72QaemK3-=E7x!H&m03|eAlG4OXo(IZPpGWsaGizDqJ}}Q+7NK4*L}sSPOKgfQ)3%ZAck0c1#; z4osHQF0O=`$&j1Fy;fy`rPQ?*B`0eL0$>R^8b6q921S{hK>LLNh3FNaR~yP=lCgEc zAj1Y+L|{!hq9|vxAt0sqA?4ef(0*hZEaBkYmJ;bDnNcitkx`0{G_fxMP=k@O|Ky8$ zb+!@jnU9qJE@sZMmEa&Bzk+x=tnOf@f}e`Gh|+S6ErSPH z5YO%XXz;VjGyD*DtYArq-$QaTGF&EJ^f4{9Qovp39KxH~B1r43`TPErhRyMf9>$HJ zv=IjlAi*_C=A89(y~fUT+!o`Z>JqSu556D(1*;_uhvpCHnLnvimLF?S1c7l~#i5pW zJ92{m#w9F)v;_qRD{fg>yz!j7&Ks=wf=vFT!y}ZA0}&lnjyykh8o~zsA?)-hP4!Zn z2IWnJvRpnDQB;3Jlpn<}Q>_#K*uBvBpe>Y1A)D350rt4Ti{z)V46`nEvV&<&%#C6Z z=p&}2_T(A{1&w3oNb<0mLplqUJgzcYAslSiA37y6Ky59X1!qnsq#Gwkk7XA6RbLer zagEzJ9rYy%ewkK8_f*17^2==M@sXc=w}Z_B(sVGKxMZUI1%#Y5veibp?=0@C4khR{>XYJO}5!TM=8!XOOVxtxHhqPY9h%k!ZU~|dJV4oYL z(LVyEF)Wj5!5{b+ti_l0hj>iB=l&^WR1}AA+G<)Xu@(J-M0dKc~NlUm>&$!eBjMP3$a-J}Hb!ZG8karRt@gWW?OB_=DGS|+;f9BNFJ2`?)lrXbTwEq=! zs7~818=U{rOli3txysQ4zZwy>S50Gh1E%SIHRCcd8~3&Mi7t~b!hb@_`|0w1gH0l1 z^qSp8#-@rkt8X?#Zq>e^{BwJ@?2kdbPdMvhRFXp&e$do9-_hj}<5%hHvLd6wvZ)7T zYEu0ST7)*I?7BzrnYB0s8c>$@e!4*f69fY={J;yScz5TY;wIPSOh)}U0)9|Y@a3`t zTnLHK3RX-IN^-Dv6Q>2fC5|*MMbqUSY%=+91wa;Q z1lh4XHLs>!exD8@{XvjxQ3}L&bw(nalO|BwIJ@`Fa&A&ifjeqj33`G135RvIkL<*h z!qufNKPIVyUF}%WOpm)R`kP$a22A+86aPO!Q_+LLNwKlOG=BsA1jCNS&mu$U)Zr!I z1{J$J6SxZ{?*rIxENl((Ws*k7Ix0Hr-(wO{`2 z2&{E{ZJK}6UN1*P(9ZskTSp=(Mfr>z&cjUqUV}vL`lClpV39`T>04~`(WU-@xVs5^ z&^4SkSZXv^TcZ5D9()Gv63xvDOJTqCzpH8! zv(O6~=`xp=V4nAlFlJ8WU{q9~&_HDs$xrXN+DEv3%x<3zZkEO&+}WoxU0CJp;PsRf z5WrE!*Ih;x>W$sI3kjPNXAj?K9)HA`GpD8)I67PLsn(lpUNa50V4qSR-xZrUxZ9t; zy{wKAYM0(i3$$q1ZMIrsS`=}XqN^aXQYgU72IN54Ly^{G3c%OOjKSZ%wn0;YA4XDWnbLnHoiv*Z!}?koL|fqY1z{ad-l71L zYwz8AvkR$((u|qrkR}9M4^+=>Kp++JzY+t~Ro5vOfFx1w(@ zJy#UA^%uA2R~d;@2%bX+{}&!?oBuhoGQ&)%dT;XjQ^yo2^rb2gO<{;4@&pL}VY=RmT& zTKp>^+>*Q(xzWokfsfgsqmTew-A1@sxx9@*RtI{TeBqc=sx+ks zyV4gG7t=ht+=s?omAd-t?%UY~{d6OmtMGgMl#$;Nx7qz#d*zC!NBt@#!Tf6*e?7nK zTz1m~R^8P|VdrypbR>f#Eo=DLWM<{u(8BUoY9I;yq{ zOw>K^R5Sly=-j%aGw1#*o1Z(n>EoRsFvPQgOCu|B9AHqejdaBa9;7PRg#VLc{Q((c zmVcH2#R62ZUAxXrYzVdC>7e~$6yp^i*>&6!JTe5DInIXv7DK9GG6*IEu9g){6lH5& zJ95|a#67YX=Mt5Xyb}RNSelqS^Xz&|@q>i1_adJSH*!MF zFWeJajk^p~4CudBBB6h(JF-27oww-hF`n|j?Jyi?Q_3ui6)fVJUJ7wwAM2Hkr@?=- zx}8aj4+?&g5;j`QOzyCaeYc5Eka+Fo8Qvv+w7LCr7^_>NiM615;g^?}h_T#nO^MB6 zqsG6KUYz_j*^U-}NOMoG@tKi}!bVyi7c!d6*@idp#8zGATXRu8MZ90W4_T&cZ%8#y z&lPi@_$U-zPyx6|f!hhd?x?=_%i*bw*(`8_FxY3n(mHv-6#+O^vT4ZC9$OBl3vGbd zLfXIqN^22U!796qF&2-WFu;jbkfIz|_u6a9^TF{c#*x3?Lf8}l|30*as%k)KFnDnZ z1us-W5-0UIZR0MDOWg*)6pp)RrGBY=()o+TG(kn>S!&Vf!{%#kp78OP4=OeX3YVsl zL;R3rsIgcc9f_jt4<~iH8}Xu&zqsAuhTr%cst4k09AXokwA07fh3?*6yRgPg!1wmb zT<-l)nEv@V-*TPo94qWVa2S)-_O#ixV!?IyzGPl&rFvz`rqW1<60^jW%K&$WiiI%I z-&?9k$e?cKzEW_11K1>oG?viN31;?ig@MzNHYTd_raOpu1U%e{^5~%7g{I%q`q4j& zWRPW;TtqNDaQ##I+zmP0k#7!JnL^F69PRDQ9x~`KO)lqb z>`k+iZ{Yf=*kR-~aplQuE>|0AGc7)M(Hwn`#+@;l3{laWH=Gkp#|6<31||MF_#PG{ zuS3-Fy25GQpUQHv#CF-0nf)tvm7kYZBna1clTww_&0{Okcq1GW;!7VC0N%{&mS^Qve zcc|6{W8g~xT8kcf{q z-BaS|mu={x-kljTzSxj)m_JE!0pf8c@v` z-t@;GuVk?(1Bj{t#;>F2PT5)V#J*Mb05|ZOay6M5XrN}vBT*^mI$i#7lcq)P9m$rH zCKOAH3_3I+nr0lOWPh0DPM+Sl`v_-6$-Df#fgPy`Ty_m_p|~``ZL^=%$$p)qR)BP! z5R*1`HHuiLyT6{kzu~pQ%H~jU*(ZAX}vpp8MD|MUvUJ@KZ5iE1?wUWTC1+(wCm z9IkD+dmsk3V6%D!qn;3XUgX`PKTxd-zDZt5UgN4k zmMAtv;Fbbonzy@mP_tl#5nu3G?4bm!=}(3JeJUx1PL|gEZ(;WvCEi;=Z_+X^3z?au>aXv z?x`%=a%Q@B&mQ@ZWd6Dph`Ai%vCuq=h*_Fnsseowh=ze)h))<;f*2WM3A^FiDGC-w zeX}2gwIP4+1RCQE!5ZV3C^dURb8xS;H-CAhy*E369ZInuwa+1Jt&0H6zBX@VbavER z-pePX%FF5brdNj*C_BY##MB@KT0}9)Imi{)n=Mw>fR_BW(m11h;=K~tl%ey2{g!5* zS8C;+Fpg$9WM9=_x)rygNOSOI->$@E?zhi}UyQxD@R?Ik>W}oj?QnR%s(sZ3iqEfpDEBd0M9sFt{*x8pT$@pvwYsC##+UwYGe6 zCX>eVqJo(LpUwhpVO_GVOU#gTUTH|tzhPPXXKx1V*{tmXt77YZNU7@euOy>b&m`3@ zCCtnu^Im`1kbPzM62Y;)ZKH`|dq#*ulW4PDNRMaAcl1T?{&1P{;emsF?#*#KG+YP4 zS{w+NE@tU&r5vzAin}l9UL!4uJt#5Hyw`1My`+Qk&IxUhP3hUPJ0&^}q8P{s)s{!{ zT#17lh)}?R9AmWq6p4pm9CWe)yE71-MvU&r0I`Ih)y$tn5Z(KF<5l#ep&JWt9`WJ4n^Fy`{kh8_ z6Wf2X;`4`1Qkol)edKR=83*5pkayl#Fr>5iJ`RZg1(*e-T$2-W76a*FSlOQlP!VsF zAOmg{9IE4o=@|SM>JNqRbP82Gghgs0LRXG}5R~_WDs}{kOfCEZU_&hI2L!yC($rgJ z{nzCv>jqK7B!;)hB|VWG8OoRP%Qq={hv9 za0YFS`{eEM*$H{ZQK6F?Eb&^Es#*(xVX0mKF$b(RfJ~jmZXOzATth?8NQ1xz%p4rl z^_@WC7~sAG`6i~WXKBJD^RMe0EXl}v|T(wE;=S*aao(VCx zBioYiAF(d6z$KK86D9+byIs$$k=jqRhW&H@4!vXK)L!jXM(HX})jc!>`-MJ{b98Y( z8S_`OTg)8D>ZM^ZAu{c>k8j}5FH-l3-BIiApMyp;)^!(U^_4X|{+Fj%@U+Wa;tSoZ z$lQlcw#^Q|Ll;!rQ|cIkhwNweN2@Qzcc8gp7jb_r*i-BH{$SM_$JHvtL#4S^Vn01l zPrqo~!2r5!mtK%xQfvXGpQWlYV9;(sZm<0I>b4eTXgxJQp(3`s65Qa@@(h?M0C;Mv zjKV`H-W$InYc=vf)x!BwJs!-QBPyLBRCgr|48chT0CQ&Gnu*hPD;WHz113zER%#*_ z0|^!9(Li0ZIvhV*s8%V+>~#Vq@$vXue_>RSE^upo6!)xO_6})WJ>w+vG<%(&f^KKI zw%J#}A5*IMXj@29iWYKT(ha~Qj^zk+NpXHFziRTM%*0o;I*^{T81LG3%n=3v^)_^g zdHerC?wi)HnRxczZBNzkqmP;GhUcG#PZa#|=ijx$*87j^AO2|sePyl;C1kzme3`#} zcvt5`fpb$sqec17SHD?V^={{{sCl+(tYqcEq_*tdGY1ORFW=02T)Iewh=bj~@U_G= zfKj+Gz;LqvAL1Tp59I&-sI=B^AT#hyy4qS^ws7xzU!uL_)R3~?`j;hs!En3T0=qSB z{@&ZyB>Rg3Z)Qqzvp9O!3Ns@OR$E#w+U@&g4RTT)Z(a29Uzh8iym0=#$-+4w70$NI z?AKd0%LM0x8j%H;>?XdSFYv0~RMhX_ENu2;68#l3zaL)r?^QycdE@;q?3Lxu{0%#K zgw+SCf>UN7a^kZ3iNK7{RxvKk-VctxF7czR%x!+UYx}FW1y*a1jD1Mi?dsZZaYA3X z^eKzz_dGnTqIbzt+Eqq+XxopW4Z$a%Bika1cLh4^+oI!8AU)FM?&`cHX<}mhM^(|u zBRBVjSZ&r6XT5g%V7qR`(y4`iFKJvK4hp;P7G#N%)@US85p!0kuKT>wiDs?LK;JU`iX2?_V>L zD(&_4+p~D)c~5fG@AWsWGlE8j9B3bwFg|=;Sj%)G;LYEDxc29Ma3kQm3HPc zHP*@Z83J0$ce0Is|MP9F#NgFWo_sF8U-v+>0cY$r`Tc~4PE^Rvza*4_*E=15Ydbc* zUag-WTy~MSgMQQA(eKMm73r-}BO#FJzE6#i8hJ>*->7*^gU0*}`v4p;uhb8}#e|`Lc$*h7fuSRYcHG6tI1usHmu+ zh^VO8v4^5!r>UT*C;zj~nVWqxH?wB1UEcS3evjXY5&scQv&PoeA6LHJ6(2C?3~V5H zQh!>zDoR^WIR2*_>p#n^woiCF(m(Nrk^@WCNO9HjNcB=r7TqIrMmN3TSQlom9Gv0D;hs*+c^Xz{Dq&&1}ubyEef(~+*-bFGY3 znvx&N{IhHqzE4kA?v)^3=JollO-dm0KnVUY6g!lWH273FF~LN`UL-M{NL;N9-v~X`O#{#fehp+ z=)ESfQTTnL;9J0tvWM$!_DG-3zO)x50+N8j_fg60GymR;A>wH7?oe#mBGS|64SE#G zOaOY;e$E?mnZBXTyo6ySTK}?X00)jaEbkU`K%GhQpMR7qNRWAn6H7b7h&8v4r*R96 zx!~6M@Bz^8nZ$gZ&k3&I=c!PS)oRg8E!o9DpPW`z*+!r?j@t=HJ($+f>$eAk`!wc_ zmk(Xu9u;KDSYy|reQ>9FRj1SbO1{F2w9`#G_2S2Eq>M95j}xojo*}R?Tc(YuwSp*8 zr^~>>Ym+GXSouJoMFszT22;7kjf@Vl*NTwHF>PZHfxl?*Zk;Im2u!1q1!*uVNIwyc zkWmn#5E@EgAMv5QOEK9XUdT~gJLAN+KwQ9NOBwRA1Pr(#E~bz{3XWe&RF$CsaDvIie<*kJ~OR)kY(4Y=A z6bnSE2Hc17^q{1usdLZtW;}w|bL)q8eGptZAiW{b&U`1M zTS8YO_}9(*sc{!{o(N^=T9cP*8JfO+=hw<8KXY)I^vXiSj$f)O>3+bxE;c}o8^E65 zjH9xsn_uIZ)K)kCc+E8#w7W5y1(<5C$xigq22yE#2&9Ho~JfO$icvZbY zjb@?blHZ8IlKk6@Vw?IL(V5!XM8QLeC|3| zu|))U%I3MUOT0tdiu19$NDxWkqRaIiGfM7)u>%irO=Eavg>e*0CaJY>ubeN>w=x<%j5zNSST@20*aQk zcftvHzJA#*7LSz+-ZH&FqcqelnQ$RzN8|^o^1{nanZlepKQQH<0nV5T$osZU{I*iM zQe37HGnNlg1=k9|RjD+jpgOYwe|!38njaIRB1uo{P7$qtHIxM(AAOF~r~@I&T((M) zr4>FfA63T1bF_Bg7)?yYO5d+er;Cl-Z$0Y0iq-x;m@9k4R<|l(7bLq9-q1Pu(_@<)ijD*7*!3N)nKYR z%(jQpT_E;uk+vic7UZtp+eM%%gK!d&x}#-->}>+O31s)JMiD|~(oJ4Fe@ui-mPU=Q zn=;D<1XvE`g-m%M_OQQPEzt4{OnW8301@|dnIQmBcsv0Kvxh9~Gokh(b*BgLoh+^W zP$0Ruo)+xgPWnq0qff|8N>(vD%h=pQ#oE&n2L>8?+`(0x?PM0uv+V`WIq#HzxdYyS zv!^ul7Gu4R%%HrCf_QW)w+0t!KQA>3P0y@ziy53IK_S_KVgIJl(6t8$ghQ6|=Czin zO3N$guaU*`D`UE8&cS6fmX#(-R+OtP!is8iAIAh^@>TX>6zWhQgc|QWB!6im8q83U zl;qMMhW}Q`g1d!az-b?Y;R$t;PF1SEbGov;NI{2;9TgX15 z>*}B`Hom-=So|gC%iL4fwKT}$UaPBl=X7Ulpjv~+D;BHlj3B|`&hb+aQz`I6@kga1 z!y}TREM9=|DN(~D_EHV%4Sspl-eFz3_$#<~JG(4I@5r*(m9?2%?W9UE)t!>b-jHvS zdyQgiT(Uo^Lt>*G(7Rs+>qc&;lG}pfVneG+OWN`0!=^` z^GD$^cVv+YLXY|P=S|GYnM8ST_Df8TufU7}^4bMBnS63F?^zu%fsuV~U@Ho_VG3o5 zfn5i3XZ{IS5+bM~<7v|ME7(nVrAI~&O9moi>x*)*Zk*?OEzdQRG!}Fe1m;dIB!$FJ z+NY%+GwD({Q4>#`>~v_=?Tz?BNpa_tnB*=2PJtF#0V`NE!7)*MSdAFsB{)YvS!JFe z{fse;3eOMWk~H~y$E9_}Ekc{xIdAyCc^xBvl9p2h7W>x72mI1tJb@R&7-7s&sZ8n$ zGcyG?t45SpUk`o7U9!PI79Pv$+K`Qw0Umh54JYAl`#hmEV3wr~TYm`E5@yAUtK6-; zePZD1hHgf}i?c?nps zWIk$a!STD%;Q4Dq@$TI*XNAlr!Pi9YS>enGsG9jvM7w1&F3SHqlnlsmk~bDI*Yx#CsrLP3_z zCUKGDMcdGd7hbJcy?d$)Ba_6_#j&ZBw<}BSgGMoUOK2atN=Z=37OV+~yR=<6Nx%FPOR{vl{1fjy6-R=_6a=yVD=HgxR{Kz8yLQ+?;V zm4~l4r7<8IOu`43br1Ego^&`G-k!mtJ#gb(n1{zp?cwf6M<8F?A!wwf&HaEm>e#Bf zGPw|@DhBgeXh`u*kWIPo-JCD3ExQAmY0hl5;f!Isxujnzo2ZQJ7z$>&>35xqXA+d;Y$&8zz-+T7iM9QlQ8%KtzOF( ztsw5O2yNIrd`tSbJK*gR{|YGC77j3D4Ui%7MQ6}vSf}$FcJ?+&FqMI_5Jw_hz;7N3 zd2#L^RwP{vKJ>D%u^2}^gyRz8h%qrOMV3B~*vXvj)ybX@U^=12gf)ft5f|I&H1#3( zhE85UN{k*9%>Pi=vMxb8oe1IfQy%51^IwCBK?Ma5+#M5F$?DXD?q_&NkCQLnV-Ww4 zTGR$HoDGQx?zW%|?|MTYdG8;S==tVJ_DXeewTg2@I%=L zs|*r$JRCWyH-Y!WZgp=VITzo-RkjhP&{0D>X;gw)-oej@_TMP;ZHMXxez}DRl~Rav zxLd>*?(y(vHO(6d$``1ZZbxlHe*xhvhf=if^zc?uKl9O@&;opCq$Q7a=!W4ae5gl4 zYt2`ww?dS5Q81MxbMe;HLAPP9*iofR{&VRhL6NB9tBPkD17U_3Sf~S`06Ya?iFYi6 zkY?{~1__fOK^fvK;2b_99F)%`Y|SlPc9Q*C^-ZxuafisgMiBH&!)!T_y$crZ3XS_& zRR1SZ=i-MM+;}nQLv^#QQ*1b5y6R|B!WmW9k^|VL)DoRG($#twE)}C`K{r1o(3Ouw z%n4kLO6~WIqLwWQkqO0o=Po35;ovjoD13nXT?Qr7m82WnDjt#0Z5qhZenP9CB#}w_ zhyCV4bKHP&`}hool*h(Bay>ID|3rr={15jf+0cu)+AiOf&fc$~_aEbowd+)oOI{)T z?lx0RWW_B8*#${PAl(_H%;m(DfgggLv|MTEY%NLIUByI3qru$b^T_-)S8x?#Kdr0F z>N95A*uAF|5r#*i;mXOLjQtD4QfrvU(CX8&YTXa3^jFtnLlJcCIZ88MHS$rn?%5rmwfzf79xMYh06$-mpP~sbI4x zWQ6uXRDdExU9^>Nndln1NZu(e=+-#48ZuEub|zf4NKMs!pI0V=PZyT}WfGDCfp;kI z>ktqzG>|_qn0IcRbtEyZQA_Knf>aki70P#(+~}h}=v^nsS6iS+9kJNGS;m2-%wSsg zw4;raF>?}p(Zvr8Xo1yhIH3ljuLa_yp#->3rWp$ckB~H}na2_prRRX*qR9U&d<;() zAIl?5$@DjF#y*+Yq(v{F=9v&{wLfSEdk>dNNX@9Vcy#&|%M2Isq~v4^O2$s3q;C#h zT3+{yfpy*@IFd#Hogl5m#7U=X&alrDV8OTF(6!{-fppBa4m;$D$ zNSWXtJU*%Yk!Ahq(0#$p}>35@WCD|1ShwiDN_QxRMTA)ZBN-*B&PbO3l@pqq?Mz&-e^xF_M2@AUl zLACs}mwEc%9b;qKxf+y~>D?faYYK zJtr*>M=0yvO};_eKx~fb<3`Cz4m{%}3|1%t_vE`U;K1W*Q2Q?+NYMgc0bdfbSc#a1 zm{%PeZ))LzDs)8)%l;bX;UeHgt6_KK>Hs5%>KZ;bn=^&WKji|msUYeH)?}mtoKD4( zi@*pSgetBDT+uu#E(YQHP_H)l(9uqE#yJCWoQifG&1Fym_6Fl|-OAUya7Eg-AAOSZ zTZ~GaSi}tHe2AmoMqQnZnytZiFADA$Smk1!gh8`0Q@RA~4`G-rw8n>7P+3e6!T#f; ziZ5W*Iy;@niGsIibaoy8zKud`nA5MzdAqit?^}4bxpAH@x)l5;_ zI(W2biF%XYeQUUM(4|jKF}k{ps$yRhMr9WYIAE0Fr}DW72|^(kXaaeNTnJh0M0MBw zn~nm{+2bw%=|6LKm4Q6N2>ubbfqfa8^CW?KsmJIkQ#Sc;gxbGpG9<_c#UPm^ev;}h z0R>CN1?l|aPotw# z`o}avQPc;w>4c&>YBI_cCE=OvyzE=Tmp>(!tA%m4@{j(!<{f)R;?V-0U3IQ!pw%)^ zV>v(U!)^B%t5X_Z(Iw0VG$2>1D1^T0%x(^uv}PEnO z0Wn(az9w%(v|Z6Ji$&#=UFe&*YRnw*OFFKfm_R#s@C0`F;C6_*`2cuXwCi)7pnWBr z_9EE28Vn3ZQq55py6||JHAm~+K=QnIj44ORlXn`THdAA97}gClDd+}*EyXiKq+MOZ zR`F8H%5FZLYrP>d)@jqH9KHA;B=B zi{m!~_HGQA(SQUi2|(}{hkO!8Ug1zNI*kJ?WI)zV5{I7|wM9UwVPcO$HPx+!lG)<& z!-;&Ubt~B%ttD7%f-;!I`j6t+k*IXMAQ6>?<%?kJi#VZ&JJN#_Sds)8>tZI7`}o`@ zZs{5FdhU|lp*GuAQJu)7$m%=8qE^b@`C7ZFSwTe~UeVwv{S;4*ykkc{XaR$QPWx)B zaGe%UT))6czxsN#TJGBq&to_0CJ_~jsiPKX$heQ<*eyf7NlsCp23xh#|LAMNCNz{BzONWb zMRgPZJ*3Va8k!S>kuut00SbtDFhfw`=vgbIC)q)FceZ?`S~YtK@wf@*G8`ba4PT+j zY15ach7^$`GD`lRpCV*4_r`{_uAhg&QeA*-k=r_d%m>RKFVzTsNRC5UDghcZ&)5v} zDJ}}*YX$?^q->lW@uonLFcfiK!#5S$UQz5n9UoI8-PgBVWLz0**Xyk_aI?|zd7zC_S1}R) zNH{x^)%*>pJ}!DtG3wz>Cryu6 z4C{uQhDDdzzrQq*wz=Z|A*sUMcS|qcX!Ph&+$_o%KQ7U-77dxe=d_)!n{RZB7|S~b+CGYL-r$UgJtk*thfQ_CTrPcm=rIh3bF3Gl5lVe+uS83Vk%%J!9vrSK-q zwkI`p#W%6{aPoE`7}eytV~0*Zvxyn)b&2|mNmM4qUVyElkK3gknN4CWDxIo5&Y-nF zJ9#i9vcUmamY`N$P{@?hHVl_*&Z|DTA!{Ew>Xr4gXVR4-wNQU-Oz5?JaR#X4jLD^m zOf5}XZQpKd9I~xub_s9!YH6&} zaesf?Atk>KLj$FB?E?Fo4N09{PH=F?9n$BPhXiRPVkBBLw>xCcN&B^TAG8wq^*XPK>1)J(!VAP3kqO zW+u9u9jp#>D?IRH&p-LUgwbtWg29+sdKTgBKBRMhahJWz(wpBB`z(H`I>ow7&EFNi z*ctV~c(c-P+&=t^2JY}T2jrTS0tmmBK1~chR&g7j@FOeivUFY0?GHyAk9T;SzDDcp zeLj0CCCu&i68Q;u&po{>OGb4qE6nd&TeQoq@sxQ;xn;uUW2f5R_I1B~F3Rb`!^RFr z9-3^T_69&oi=VZ(o)Qmt`J8B{|7nkbX8uNf;n?wH!;R1ovAs6>tiikH*e6nnyQFwm zcKmGjKWL^3Rgh_=6%%J}HFl*uyu3j#sRHn9hMf4kOotKmy3a%wk<^}szC|6_a8)feyYJv_NV_6)<5vc^n* zw?EDQzLWSGHu2JIZMk`z!G@8FUC%na{$%ub`d9ISqs8)HMeiraj!0S)(l1chwyolw zlg%pgv89dvtxx}p*qBR2RsH_s-^GqX!2Ji)Fk*N6`-jbZ4W-?w$DcocpPkM^OO{on zM|BqpOj=bM#PmYz(-!a0OJ$|A&LoFkO#WsT*Z;?KAzP}Y`;&c(Wqp9_`1(7KRPqk) zCd(W=7rId?FuoM6{?dP%MK#!%Vfz+>Rq4A`lfQoVRsH__mAU(cV);LTK`I?%4Jlsx zE!Abs43)Fb2)}&j*lF~4<*dmhqW`l)_Qm6cWx0V$_1K+$8{ceKP_%mVK&<&D(Z@b^4-o5mm1wA41hxX(5t#qF^IJNy$@rvG<`S+%j#3vKY zjlU9_jW(Zb8f%P!<W#4@|G03O6cP8Pmg9g9{IURrhW9Oeoq>7iX6oal--rHjql&TySv=16v^)P${1ew)w|iUdPCpA!v|z854rC_pw6-VR{1;D zSbf923i`pxJy6exqY-zG4bPy7dc)%bn99rPubWvEcbD%$^M&N=mZ~>J3-_b+#1a82#m04Uj_!8c z|F>&NkX8d9lDgeDm7#dIN%_$A(#J|9t(WqrYvgWV(jxWV>9#1H*>*&1m=%l3PkI_S ze{c5u`cuAc$FhqXlJ~>m6!)`pGH>J>Pd=6TrL$3^Kt-$C_{{<{HFR&z{Z`z0Bcqj; zqd7jeg8d=f)>MxQy9WQ{69aFbo!f1{#`nOnl*8}C`Tl#qmlRv#7%|7GFNcldo6?7W zpy%Fv2sOF0mHY19$=+qm#rs6_r86JTQLyN_=j6D30WnJX#Y4|+*V}oAe#&TZmP}t< zr3Ny!z$BNlx^P=w@##s$MI+6vkKb8rzI>P*@v+uu)3NtC$p%kz+wb=)btr~Krs;b{ zr+6J;jh#1)zw0+TycIq9?$e%D&diN(1}V?H5>tnQD~cY~d{z3ZzhP7J$z7j5Exo_@ zZ!@Ev{HC2_8R}LYKzlfVbMU@z{q$wZKv`J1r29hRZ@7yel8}N@wA2V zfqX&VpMrn9#`G*DePdkR{)m~KnMXL%Q1KU|z7M3FOt*PerdGc%S~o*X|% zAL5$M(WIRnX8A!|46cPI5Ea8uT)ey~=E0-q78@^DlRYjm?mwvBvM=*v!h=F2+xM|S zeCx~OW}DZ)fAucv&E@OwL%L?9yc4gpUhnp}Q!D=6c=u7;rh`3qg={(RHLlBjBXl#$ z<{c&dmF|_LVy7-ce||1Tx*D#eJ@5T_x!~0U`K2zR0+xxwQ#lg+95%X^}-Zx$TU(4bUYyX@RAoAtG3 zDr)V0)QDNs>Cw0gLF%nDu&>Vb3f0T+^Vj2{-WKgaB`1IUCaqD^M(>buw>3s?N%!Rz zeoa}KeUCst$a&+fgPa@Da$p?_F=soOsKB#ASbli6J;JJPgF@2F@f}->pN-C}XcjkN>>LXz8-w-ie$B<Uu-3KYph#RMoVrrxUIXx0?DPx$>f6|B+G z5?6TK{F3!vid_7>67giC^b?$Z(>oDxN}az|e<&bK8;|s0KL#AWA5(tx<5%(FjyGKL zp6NX)H+R^CmtTj0xS@(ltu98%!*y$w7vpZt(7?dU*FEd~4+oZ-s1-{;mPNLN(Y+4d zGQITI>BPhS@L-lnf$;FWMeKIAr7Tk_fR$nuw_|sBhk8C<_MC?^z2|nY8weUm^}focv*P-*QLxGY-qk@h;%aMIBMKzan@OP(AE3*78!We-U4A@&vh1f6ZYr9C zyZ7^j&ZA+w0)JVQtI~3L028t@92)eKlAhvHptj{f zMox~V`^)lsRT=@l74hQfA5IyNV;+%Q{NlpJH~s!~C2{sS&NBAlC5xbr>V{S~c9Z#G zbF(53i(8v7+{qnt zFWfL9rM#nI(bOJa+rC6GxGV1~`;DINGIaf= z!P_UnBafaOE@)_IeEVMB#b;mq@O^@`{U6G|A@^e0ZL%25nVzjRugB}wW{G7=sqm7c z3Z^sTs>BV;EVhotE!_O6G*oay>Dt~7rAz7gjc3j@xSx1J$m7bj_8ffpx~VDsP?=N= z8jL4CKkCvL|MA7=C*pCBf;yap5$+z!cIQWxwpecbHN(U#zo6*ddcExMazelRc_Cqo z%RNkC%sq$e1(RnArd>5|L~7q_-c;mA39xxUEFmm*4jt|L!!&yT{#v z+Xuzv&7>=|C@Q|Ad_K1P+Va%S=t}!RnYEwuEkCVKyYjs3$HY&x=JN}mOmH3bG$0j! z76EFX*P;tr8{I0d!|hY&>YNYWcLYgsaT#}Bsk%jv;yv60&4!b*saNzMkP1`Ihf{&hiND*=Zy;|95O~1antWU{y>M zzplL~0TSZ@|6ku6wFX6nN5*lV3`&Y-BG2@lpl%XDeSBV8j#5ilnb;O=3ZoI%#bYeX z2w!rOQBfG%e(1Hp61o?vm78Z`J=llX>D3pNq58)Yopht}-Al#+^q2udC{;XmNnrt> ztiol`dvmkA^9r;Tx%X-d%s*n^8h*dYRt+354E9tYy(76iU?nHt`apbGZ(h&P!PTAN zilxYT`m?!2&yz<-zRD8VM$7Rb@8+6&Y9M3>nr(_=$)Fx-Fau5GR~R76hu2Jbc&o}} zD;7}S<`9t*XW!DeFFNj@Nd780?NcP?)x&C-*~`cctE|E3jq?#nMmvayW#D=R zxR8q3XYPomk;GYX&rxbmsB4&+YbH{QT-Y`~o`JqZ(112M$sK3CYx=P=~(`F0-u zQ*}dYV1wvF{LScX3;Oe>MO0Xqppq)?>eNzfSLEv)&wqN*|ML$pMbpc4Hfjx$B)YfB z;Gap{Wj+VL6JP7|poU5p@22%5oCwSlw+5Tf+XVyOOb6jw}r@y(GsKxh3q*g1fQUqDO){YS-T_1n$7?{;BxM*8pgXHbwpJR>^S^1zXY1zbb13ZL zVJ*d0ng%1ObzdP7vMZZft!)QdxfagB}{{Y<1uE zux5YVX+*B2Jl8w?0bVIGg~=^g2l1k){z|-y8p-1ybVhK{xYMcrPD|;no6Q9JOj2hb zO5h7mhcpNm%A(Plh!6ljcdc*e`0~dvR{M+O;*%bhxWld7@lJtf=!&~g<>>lPl=!d!v4jN z8j3e???N2SLJ7&^Lh|HCP@38O&hp7X9n~Xg>X=X=eP>0d)xm)4`v6^SMFBd(eDtpb$ z=F`1i;_E*pT5Kk&%n}rKEy|cx`DaasV0r!~CAVxNFYrJhQ52m7jXHx1d0>GA2EV~` zZFtaV4mISIMKx0qZ3h1v0|fpdB18U9KJaM5aY`p=GbkvhIDV~vUxT34AUTCimz|jz zsPUE9&3^rj3K(*c4s*G+EdeuLg6dit8FX6lpZePQ^e84lKj z(YnD)l$Oh~Xis;lo$h)h*wtELJ0v67Ppr_EEB`q;NOJKyJ3(j(>dm{B--XUUa-Pa^ znux;J7y5T;CFR{mc~DLgE!>E;Eq1>cWMP2d<`4|IV&C7P33A69*e`qP?%===n*X0F z=oAT|%o#_t7q)2D0W(^6UfL@LvIe|s`K-N{b>{al`38knY1bme1-q`XIr6%fur@s- zyUuZ^6i8a`z@Rx=)3~NBXOCESWA%;d@Or*l?%( z1nG+kitBExn}YTB9n zT09#!>}mtAp2Eu6-9~!|;lI>)1+3SS8iBjObg#uKd^~2@Ae0i1?1OG z)xLRml-*1-mNhu!1W%p7mrycpX?Z7VUsA+hGH0qRkT#w?f(7@ZcaAS!94FinIs?WrA_@ z{UCi7>#wpI#*V)yATRo0Ao?K_g{nXxE5fg+qmgAp(0N1<`ftl;?ixGnz7_7pimT-j zu!1jV6Wqh0r4)1&@0{Bzw zf*B8yrtudk9x9E+yks^mUVC7W@+HUNdK@ zw@zI?631t9|2lgv)IuR| z)-D&PwmR+fWfK!dd~_y@XtrCHm%*8o!%V6s_;BBY3FQS@EJ-My2tgJ78LZrVKJt%6 zL%>?N0{&VBsd&l?s+7a|2$P$x%zkPTi74w*t3(^i>^&SV@Km&vkVD}%%Gm@Dwqej0 zCmriK-6lLqAI8*VebRv9mJOqF;r+h0>>XpYfGGve9XaUv&37(mUHykL*V8p^pq(sl|6}==IM&%6c$JFWECUy% zKm+ORzm;_)!3|Ah1D=i4Hfb}%(LxuEMsmAA%6`$bXoZvaMfodHMV}HK#rg@o!70NBb`t=Of#g;Y`6SpZJCtE0($tP8R)k()Pv?VUS9AI6Jst{)CKTX)b>eB^X8wpz-fW5o<_zobg? zol-dJ-A=Tdmnn%dq@B8cH&&P1=#+U6dfo)H!f;FG)|ZOiK#@>2S*s!JSZ+1;Nouu} zy3v%l+@aQoZU*~QS0n;AbYZnsLBB*u9hM!96`Uf1Ogh+S2>cIIMLyGUJ0iI8P6I)7 zQ1=*24m=yP!zZvtTI9`2z9jb?OBK&Y5wO}Gsb!BETCCL_-4TEd^}qn^Idl%4Ig7Qq z34}8cc#Z+o97*t9Tjxy@e&*B(aDxTudczq5IqDc#^9L#9e=Yf|#2Q>9?FgY%0eC zb<1q9da|qB%c3}g;~aKr0amj;?~0nk<5qRC+qd&oIOjdNqya~aD|n1Tc4_$yiv1fR zfZ=?2wP-<(38(kr1^Reox0FCvEN5@gQERo{Ewc3*Sj=MFP+QXHi4$>HIQV3ROgohN z7|F?*{jWd|D{#A^-jZ_Y?VIhad>zVj2Y9Za3FBK1K+4g`2Bibx zdgxhftt9WG9y3@9^6_Wym;zV*QzTVvry7)Xt{1W?#_f37ls5Xss+z0AC9_aZWV=-{ zQRRYpnC25L2^OOkLC1L75DU-p-%shTbX&XDdoWsToF;up>+gOHU{SiYm3g3R_lcrz{Ls_I!(!A&}_@JxVxb7LZ8_>jPufKW|QE7SgRz_cM7d{l`eNl zA3bs^>Ic%bma3Yi+_DdH!8`W~`Oy6JJ>(Le#tu5&C?0ns324-ZNr9PWi@_XiW*~|$GWljBz?KZgun_y#6?ozxoRLlggGBzo78Voe zTmp$##Y~gO?g4!0zUx{q>C9l1PSMd84K-&8i8F6`Zp0>M4NS}g z$aZrMQ`PV`86V&Jf|4qx^|e?Gz96FC z4TaA$#Ze8~a?rZ0=|*_V$+ecW=Y+6ggtiYogtcE~Hm=y56Tc#m!e!Z7OK~1XK9|FH zhrpfa?~{t@hvsOwTjj^_w@X?KUQ8OMAC%%GJnEi5KsBv6rs)HJ7GOH12FPOpEP^V>c8c~>u! zxj`mCLd`TYoZtNeWqX*v{?)pZzXge3B)V4B=!v+;Zt%FPc)%>N25<2imEO{F3W1mn zj_|aM9^}>%k1O--Oej8!6?I(pk4psjaOG{EeM;5~U^|x!7WGTM^LV)$?GoZ-ZFn%k z*2fA;K*@Zh8|M!OxV#mm=8Q87&6s;%qApEt%2dXVYWp#o_qWNczg_X#?X;6og~#Zp zF$37YrJ9;ScV_UV<|2!(Vo^H{N_oy~6VpiO+H?t3{kjo<0UJuwWF1)=!pgIWt`@?$ zqHTKAZJltW@~@-g?NJ-NjJgPXD^#~8j9d{V#!G@3kd7eE zqXhM$lsa~Rc2hMt)tkeQ$j%^VelS3U%}zBMouX6Ks13)^DNwKYB!Fi zSV?Gy+vJLsW^2SbmtzGqA4(R}oqWa9K^c{hdxxob8`eoth#c^_CqfbmHnAF zz_pm#ick|!j)OAYZgU8$G@6@hq|MWmP|_GvRX@SpWt$h>D8bV=`^7#^)bZz9<;sVa zz&yG~Gx)91Eee}eg_h|S(J?ABnIC!#Hc&V7C?G0*oIZ|GaqDWJC1bf} z>uM*}We!eh4O7qeQ5sA>F!yO`@ivV1yKde{Fj+Rmy8p1b=se=YX=RC{_p}$qOUUQF z7dsDm9UU-P@4it5j=4;}GWA@_?d?p-ay#L?Of6SH|Y0F)gk7-K6@h7 z3e0V;13z4xz`|<>Eh_&*$ycbAI}y$Bb~pXGEW*KDm7p^HMApde%;*BdAFyLF;Jc&o zw|IFla$_BEz;E>}M|uyiIxu7+PAosbk>gS-Mwgh#C0FA#$22};8RG<=Cnr;5q7j*R z8|Pm$AY6x#*!?f5GN`|LY+f4b&fLrZ%+ZW-;_3LF@(iQXXuVDcVJob~D7JSF(?Acy z?;!YbDH7`VHR>?o^lnBnS3+!E=w;4gS?nKAo5REV6(^5$-l7{+Y^ptKa+H@3B)qoh z{k7t}>gwA@%-K1(k$~z$BW5D`n0`D_wBC9{%v3QDmg*}Bda-qnR*$}O%-aa* zRb{363EPAMJ^)`%P6@-3d$%*}qBK-h?LBuPV-NnxXHiFObW-0E>H8w^0FM*=I5D*6 zW#DsXW`YjTjk;b1KZi@d{%VtBF4u<635SklF(WO-XA5X3;(~l>VDBAu?JCdUyir80 zjb_h%jgqr7ifX8G&-H;bg{Ss&Yhxx4*H6o{F8T)}FF#@hByg9w5 zP)59K#FSqgOro{Li8DWdc8jk?1Cwz(H!Pbq$#wwgWvm(RqPP2G->qg(vA6d^b#Ge? z%bSHbB^+e{9G*3DUqAite&k zDn6boqhT^N=J6Uu{b>o?6k%;tHZhXVJq5%GB7U+>PW1j(r(sJV-^C#}5% z6(b`t&IssxEiycMH5646%y0NW;6<))(iiTWe1`gNY9Lu zd0)UI;rl9ISZX{dxZy7`q27PdUG4$HU%H$pyNV|M=h~;>GWLvc5qF0#r?Z>;)%|#+ z%FG_0N9eH!BQ-H@dRV53LuxgbTkijmF6&^ivumc#>-*#lPA654GWz!aP;{ORO{8BR zo|#Nw0s&I!%}F6tF%%IHFbM%d4|P#d1A>C00XYXi%!`@1&$-XZ^g~Ks4pgwp~2zawtiI z)zwZCdCD@EL5&)q(h8igQl!Bh;H3(Jaw*9E0DkisxVq}j;6DEP13r96l<&!S=kfEt z7MTAs?X7lYj5fm-k}n1OCt%U4GoTjJruAYl^o7-PE?0B{57?P-Jazc%k=aJ*7^H~v zvX0axwNF79{@c&2zFS?b9Xqi8C$xO&M?+fcvxhP*sZ`iuY-Xrmf5UeoGhwA>{&n=w zf`QNQy|02ituVc-NWW_7O2c2u8oE*0$Z8WZNva%SY@{4;H||Kjoi`L)RAI)8igfM? zz)u^_1e!U$BYmY)6E;`*jj@e4Ab+lY!Z1u18%H;5YzqC18r&3)uKunXdTJasWYoyd zuGa9c_fIF;38C|A&21B6B8zKHv`^l7X3TGTId)30^436|lq;J1Oq;W_?qYAJUfHYMc795=-HUMFHxdWarQD}TGb8J7 zVF*blAu8Uj!eOwY?=8uO-ox;_o#>(v+=^kwnmnSDVohhpmL0s>&?<)GZ%1m;jo{CT zTC0ngH6RBmo-_iJM9uH|0IlkstWwW4@=w871$I04YooUCDO~e&y(oFPdVwVZ=9>Z(x~qrME-GePPqY%9&i)@LAEqd3=2QQ z%ENJLdzy*0T-&ITN}B%o4kIY6shLmrJf8jZ{59+b7;k<=sdKljybQeQ+!Nv|HYUA0 zCk+_sDfUF&i^4%te)evHg}=Pw`o&sHu|u4W?GZI^_-o1bKmxic!o=p~_2P)torBBc zH@*v6UAs0+Hn)-#qVz*Yfd_RR;>g#bHV=kEB$UaP8)*#Iz6(+sGX`9>80aQEMbg!J z{6ZRJz}TtPN%9JD0TpgKJ$56GU`UDnOLrR`%y)J>s4(esUElaGirG&YLMrC@OnX?i z4Cq6Evwp(~k_pC3Sw~|yz^n#E)0+;r^4;d=ggh#Y&K0EciZb&Vcz=a z^z?TEul039)84pcTA9W|^}Zve{0nE5AA(fp?uMca!0(_ICdprkiJA%GiUv^&M?nRV zzqCi6_-r&>B3eGtc`zsO^%dZ3v9-zPv1CNG>Q5)c)+1)Nh@YFTn}wc`d1cWi%5Dh; zsl(J~#8Ce}e=F~$pwp$%t);1HILp>$h?w4WQo|=lk5tcKU5UKgr#@7j$ zX$qZJ6( zH7l0uhNo2bI3?U1Jj~9D#O*nR$f^L>SV+ZH?}Y+0+Q4T$pzj$7JiWu;xZyOM1kKI( z0%uv6*bqE?l)jMNE&fGeltJFSaCfc2B|XhU7Z3&c;wx?g&_lzVflJS=Gas8g)PK!F z;~<+9SowDdaG?QMm2Li!?f4(^8N;eVW)1;Yf%wUdC>=f<%EOJ%zM(WWIW9Rm)boI* zpRz4c*Xr+^8KuH9v0;U*kCRZ7q^9-RWg+Rm2Y(;ctHsvdi~H#MJ)(_8QisJa!&-rq zIg5GOS`52F(&GNjZqC;JJ?{*s)JoKJ+=^M8&dSruww$Hj6B1(5oDI?qIKtbl(WMD> zCfpQGy{-5rPw16x9q#ojtawc4?8i3k{&BqOw?BbdD*ziO8so7*xe5nH23RmaPCbGK z_E+87wIiAacg)}PzP;Jk%c3DW<^7lJ~wEF2usj(RqSSdVb7O`71 zd>ewt~Fz=C0i87bJi>P*GHKLIP=~YSZjrM5(>cF?dGuFWT$d#V84O#=aYsbDZxf`*nSO z@z_*WwMH!?`c3JZXJvNu_a1WWvmTKPt1dANrPph*$%WT$(KGhyvv@$11H@4`dC#on zz9=@c{?c6nNW|RMyTa-F2y?y=D)==z2a1;4pU!Af?1iqT1+BgY2FHE@$C9?G$rb?Nps*psv)QZki zecK(r47N$PYJt~s#@mM!#fTX;xc z=^%@J-MU`tN~p4p!3}R_9WB-t-*0VO8m(R3HV37RQDeLKU88^EHt?RzI=#1mc9&{_ z{?~Ll7o|4?BRyK%rVXa-4NsDiWkP%lYiPS*@+o@yFylu5i)k3xMmM`kREugD>c4qa z)W`s>^M6C(j!+Ti={C1wGlW12D+OT>yr68!Mzm}0oJ8m6;0a&H#sMH&GUw0jOzuRg!%ZC zd%t&^4%x@KZd7lRrBANV*+RH9EzH?qum#fs){WfFi2D+kdSa}XG%CF{W_ARo6DG<0 z;?L$xu2K9=kUuPTwv-*&A2#GL%&aa-wUk?37uqa2qOVf|@$4OZtGKfg^z>up~EAjbL;yG=g%_)7rSKyq!Aj z{q`Vptoj$dj-*Mh_WC%3botSi(Rl>O=vM%@sFq(baIi$jQ|y1vq_dgmY%IS33r`HM zjRGW7cY$B2{WpgE40MlWi6shTxh-xR8}<0{H+Yny<830NmS-AwtR0Ok4Vm?5O*tJ% z*dhV&b_zd*i+dBMQ;F~LPai~ta&-vru0+wQF;X@3M=YJl`hIqCHqJ{2`ma2tdM3*B zGuKr~BQY*H28jI;{|Kkh~^iamT6Mj^vw#P$WUauIoUze_67r&hAO1s)X`nTx%saCQqKq9EC&eXSgf2--wvxiko z<17y&o--<4)q3>#GDJf&?s6!+iS?GeU|!sKM&F3UCk7LZ+@CUKex1!d6$1NKD?S{_ zMfE_7{J0)aAaIu;)cRr#zkdP)(~zZ7)UQQWIl1m1ROFU`Ya`dQcaZy%*2fTntvlS? zy@jATEsK%BXne@dv=Vxd{<(Xq=!sCjGa)_B6L^cJmjKqPt2beIB)1yntm{Qyg30ZXbMynBoeE=`w>7U2ir%U})-nIHLoJZPl*^6V^Ph97-3l3QW-afF( z7M7V+JO=f)E9NcbPWu$%0O*07n#(7nS&+!GX!EOuFGLPq4&7+S2Jwg~SM3D8bd2*d z{Yjd!h+%kUV3sH$lIG$FV(+%MNed#g9dP+V|od? zjOrp;l(Jf4|GT&O-b>&G*m(y(b=5@|*=l!Vr5CW_-7Irq}qf{O%m z)OlX!Yhe-oELu?JoQ~L?#l~6GQFTViUZ0|8{cU8$@RRWjaU6lh8jdeWs=E%ZVMKiC zVAUk*LxIboNVhRHvGup=ZJv#V_MDX1rTt&6G7xRtuU_^Ep7Q88WeGFFEk5DkSer+_3vAlo$rUtZOFjw6nanvD~EVn(- zFc-#tuOP@x9Ib;Z!bd+g19Lr7Q*Qh(COb;I8JS|A(K3ti&Ma0Hoqmy;`GD~3&IHA| z2S;;@u%eDc2D-vrFpqh=!_XdnJ36(VzC!m{KITL{`0JC3D?^(FNE9D=TkjEMeU4BR z7_~E9@+KRe?csj9nAz_sS%&n!md2(VevyX;T?x0i_6 zj#lUj6o?&HD@~Fup0eQXJb;P~_kDJsWgON!w?ro#Ff6VFQeq`3@h9e1g}dKlm>(}M z>zc*D3O+_(yvzk+!h560#658VY356BYQ~AJ>b4g?$ijgYs(IIgSz>@DJ`dkzSt;h4(N229HuL+W4)ti?TJzp_{g(hg{+a zBPWO8b2L-2CdyK2rnY`SY4r8f47S1k4}2CsfsnciOFd^A6p`qYjQVql|kYyBLUaQj1sB zJ_p^6Ya{ly9E#2kXd{ITm)xPON6}&NFN4Wj2al(keBDTxVj`34z9;g6X30sR3D1|5 zk_`SOYfNS}2rZ!HkR2Thg*>o2vLPWh_5^@`zzU4;fF}lWhsSk(9wG~u<4H~rV-#W4 z081Ng%m?!3N`7k5rZfO1e!tlZ4h2-`8FHD4#g*W9eb8{W@hpt^0{u5vg}X}h%l-@- zaqV+=AfVn=>#Ib>Cfq-%faD+CiH{c_*u;QDLEdq=bNuKTK1E|)IzIv-5zb=lz{TU1 z?grkUv|&d?TS;Fw#%#ukkLucSy!Z0b9jzAVo`-BCQF?Bc&MsC#u}P;L1K&~p)!T!` z17(v-Z*2jeL^SF+*Nh&rZFf|8_9XiKch){fZ#7xJAUAGwIo<=-qtjvItiTjw*6DQp zoluzoy3Se?=4=(Fkw_|&)+Z{El9eyPMJp^W;4sv^U?$$+)x(J0*-3DHJg2**^8k+e zTk&b*jlmt!UNu6e>ZdtIlHcH4xDL847*`2gsRBmzz(>BoiYc8>YN{^{QtVg2qhXje z3@ZIO)$LjrNu;`ESGM#QzpP0h<9PM-y`YEZ{l9LLGOC@(~MzSseS=_)Qv) z)A z7d$W8lp=jQ5nI;iVA}2HX#8(=bL+M}2pAdEM9#Srxseo6`Wph8!J99J7XQ61`&2w|7IV$uou-SXiTZSo^TIPCD8K9!<~`iJRMz0p zz;h0IL>oiURls+zf8?8OFSw^k3N=^ueVl|{Ex}gBbY7ghce=vN{5p5qj{2isG>vkA z-7mwJ0f-^ky+h=|3_~qm`A=?S<$wW1#kl60t9yh;HNZkxU@lZkM55bMEjxt}>98^S zdv`H(e4^BuJlAmLlOW3P2})~6{hi#k>f9}k?N+0~n_+*x?ce$J2YwkTnx0zqP3%>+ zFd~NuY+;9vSLBlY$(NItZVtp<0kpo+MSJ^ZW8><})1iF*2ZNOr?$=TaEjbzm82zvf zgQ)FnbEaVK7^iPCN*1<)x!PF6{jdWtf~HqH z;I#wgGDJr+R{r{;H+xP8cgQA}Dk}Yrw*V~Fh_=HHOXdZIfSo_!2CIJKc>H~UfF2-- z7+~2_K(P{0+Xy);Od*voWK4pxqhWS*izS%gTi5uN-z?VeR3^+-&V~q{4kFnks;Z2E z>88T26+pE?#2OYjSlO__3-;#>=O+bSgt1T0+bkMNRAR&i)($E{OS{E8eEhU8wa>%P z+Wr*iIl1cI7!TAn%xS(hViPdR%L;U^oK)xD#?olXH z^g6hu=T8*(JDZZ~m*S*+6(@_@8;l(SXxuuk{RXW>bbE^vjQLt$0N9RV!XKjX6{tT@y(WZwzDt+g*i1p za(_gh)!jG0i`FtefpO;>#Dy$Y)q=nSE3GPD_GysOD=Eunb%g3u#9@ByO$y^J5XHa# z7W=f@x92~7_9UW_jNi@I#wbEb*jZ9m83nsQ!nRu}0{Fi`d{FWG5F)~Xo3Q`CSM)_3 zKuN)mu}{G9H7}If3#A>S8|NxHP8Ksa3f^5OW7N_^i|H%^DW4!;u);hDbF&EMMOCQq zcP2>4LeolFg>FK3ms)Dyii^<5jK}W4CwMImvMy4dhD{|&jLWEFi|$_G7uoTs88jL) zA^k<4a`kwEe^~tOR;DF=#_*$@cNXw!wTH+!amY;R<$06LQQ{+oKDByA>7Eeis+~c~ z(mPEscMQ?qU&|SmXI?+kcD>&1SmMLp+F*1{n%P&9oG>_gmd|4pzp5PCZMVzJYWo&= zJpbw`gxzV3QSWTkNFRDgM^xwLj~8lfJWT=QfiSNGU{O>DM_M|qDQ)3<>EBCA!-;pr zs{A`3Pi|&*dtxa)rvX;3OFE6Gay1S18dG8O3peo}dw8qGAkX8S z5AUcUkRoq-3vkG?OJad3_d#-WhLG1?^aeIA>G9bp|A{|aB=Tp&TJ0sr0}EJH!+w~4 zqzY)=>RS9D|7y8S&0$;mVk6$_<{l#3?XGdyZ~XNzF2bsa0kZHDe~u57|pb`Wusb-C7(%e zG@j&Fj288*8m+rsDTq=$+70y?g1QdiIs(wNfhJ!Xit#P#cB@&)G{p|TjWg?STy~{( zimvC^KTwa4o~X*DD(GQF=0_2C;jSWhaC+a`AmaSeOe^`zn&7r}M}j$HPHzv_zV%?p z3*aKG!-#df(UUNB%y}Sg^3VgCWVbopR12EPjU&7pYk|4hA5xs+-D}VDVk9l3bm&rR z_4#hoC{EVlMv(*8dX2RtQoiQKboSq9l+KR8u4d&8p_EODk)g=~hnR(AQ^g})3l_3# zZiUoc@FiZnmScg%-h5;MblU=bMOf_OzJMPI>0xZr_Ez&iq()oTvC!Z!yPO3uff;Mu@aFVBr;xvv zwMPz2rGA&Eh7*-c;GW>p@P-SWqph(`zF+YX3v}WFND$tl+xbGLkQK&7DV1);3EF3% zvo@>SQ6`W2zDh!O11$E`T}?VbSOFt~LwucHYPH{74eSAP=(&kQ!=#G7mOy>LETem4 z!r%~KNzZqBas3y+Rr1P5-JHg-nT?%6 zN92ZKg@FF^Ky72n6|rpCh?dsm1s0I>c?5AMZ-Ki-IRAEOtaA+x**(0H@b9E)nT^(y z-~?$A(gTwmIPzqq##Dcrl}TY`rv)9T{&9=i)9$EfPk*Y@ssHj~kkhA{ILibSFkSK{ z(*cz4m%U6ay`Xxi?%bm}HV2?R{+%O2d@*1Zig(XxcKNpR+A0sk;kgROQ`9N8*XEr&Kygy0(Y>{c1NS;GmoUCFt30%^iKBRLThux=vXH8a}$ z$g;ELC0Ys#voNtVpz7}Al4}}1j2)xecYtiU$z-&owR(AoP(2Sh8!ig%92ELDJGX~I z#_5dIc@3_Fk3T9iPb83+9_#RWWzs>54D-ATs<_Ki#kt+V0?i47_wFOQ?aIanfe!pP zyE%4|22X;sZDtS0<@>WPgJKUeUx#~xza+G1x%B#gup^9xo08B1isAwRwFV0eK?(&p z2*RR9SVlyYDQ9=n0e&zx$ZkodqZ&-F_8}87d84I9p<)ee!-vpgR8GVAVIHO&x4s{&_m_nYYsH)MMEBzK`C0bhJ`f+`4dhV@PoTo7b6ye z%5FoJ9fS?Sg_F0|4sRbUwzq{vyPm$)={;jS3j#7Gpt1tfR{`C-iOS31sQG86a5NC0 z=*V+_S>mmKEu$*$4QKt3o#0l{vlQ1kNYD4q47xNdJ16!P(rE_^vPtR)*0pC>lyTPv z%SZmSZr@AAvciCW{8%kt(QxFca}=r4z(xpVr5k?Tb5 zs9~nB;U;0pLYQ&0AJ4y-(8!MHoN#rlAR!6bZv8f z@MoN*)$7DL8#jHVjmzKo6um|AO7)EJ8oia1NV-xeL@XpE)xD^wU{d!1`XYTF-RPio zvA9A^e-)7}`zxE-b(i{mYu2H-bmVK|fBvQe$6S(!tfP0u9kVU; zI|CmR-)NOS5do$erD<2eGh!pmW32?5n)uU=`&x&6WFt)&HtS3xZG zUslB*yInf>7$~=H*8FRV5MfPwDcbtIXS3wj;B3~>c`x>6IJj*aozm&8lOsah{ zO!A<*v7EyfnziBut@I(IeD*H3Q75xg`sYq_;(8>G1+ zXIUfQFtAKps32{x7F>@dD;OIXFznlKuA{pI(I-P`T7%nwW(IIt^uO~mqyEPPfB<0^ zA%)IJ2LU*aU`EH|BQ>g>bZuW;F7kA~UDc{PqXGOF|E~R6RQLM8d4+Ys>|CAfIQsKy zuxf|3{?Ah|u++I&(sMk{To-zD#knDHH}s%A?dV)gc9@MFh6#PKksHUyt)Ur%koVO; zQ>RyTp?3b8AqQuG>0C+9FODfXq+*sKUITpy2@4bju4Nk&G@q9A%^P`6y`yo<{C1FU zirCs6eEr%Pt4n@a!h0h9h*t+@g0i*PNyOu;4|d3=iYZxQ&zda#V7uU*;>I$DP?Ta^ zWiBlH?Eh3+>7Fo(CK7ZQkT%CPtB^aF|3~AHx#LH|jEra%7&DY_U4 z+3YyE(7Sg;A2g$NuR7y<)N znVj3hu1~WFN(fP?0nXN(-cXF@wkiR5>S9L9aH5}Bt%3@^c|!f-X%PE2Fv=7JtGbYi5B_1IqetzX&QT= zopF-)QVQ4k<*;^@s4cdDpTx0iM51l#$0+JkDN4^V?i1lo=CI{oLl>%j?;M9mW0G`- z81P#;m23R~@CZTpP@Y5Vc;-IzWdDwWY)|XoU;SN!ptKhkUky7NrmvRVTWvLvcVkg{ z4bjXp+V9B&=P})jk!Naom-OMq>DgEw_N#m!N>R%1Lc=UrTUo z*4hskD7m_lD2xHj8PhW)jt(33&>&BAkXdRp$_TxA0I1PKm z=bQ?2{JUGPbwVv7ruYAcRI#2=FE@%PUrF#t?QO6Dg z{oG$oQ|!>QWM-2vOnb>F(dhm&6pFw<_bN7=^e6ijpvwj&kI0~yd^FHSqgUS++0MVf zHFjr#H3M}N-TRZ<*(FR0$BH2GCvY;IZ+pNH(hH*xl6n2(VZLCez6%L$$56k22;cM11>Pp0b^HWXF5GA{j7w6gddTR8r)NJTX93h}Z zXik0Y>a8Nf9g1w1KRd4Ce!rHQRN+#@m=q;&i5q*;FvBcehitSTzf$Hr=clG6{1J86l zpj}^45t<+_y!7!Ep>8@D_%~rPW0yvB2X>mi@nYge&&dy3W?Yic%sXXg5iK7Ls&I@D(Gtd4Z3Hn5tEwvT5(XK;-K@K7Ve+r}?EQD6{7JiPx7>UR zd^Sxg^wQzg6AQY#@`e$wQW-TJkddvB!Cfi?_+TaVASt1oM@b{^;3!?8UinBeMfnUd z(wFS_&7#pWDND2A0hi5bdJl!tGVO$OHF;o(Ir*|u*Ca5pl{k9y*MZ{P;lFj4FXxJ7 z&uwmU-2Kk70s06QzR9p_NHZ*>Y~Z<$&`iT*Y$yRY66k+2n}Hea^r{V&uV#|ZFNq!&2Qh|+&_3(1CA;%V;8DyyH+5dGhy$qI}Dyo0=D#@)4M>)}A zwXT`UrEEBCBg`wt^{So@_B@cPJa;u5F!j@LAjJCCS{ZcsSd*M$5^MNmEoZ-rTHw;s zW6Zb=%V6KBK;!*3BFd4{(TiQ_6BjQx_wX%D<3hMcu^?e-54xJ~N41{8u*gx0aUK6}z+; z25mzyn`ax0C(vAiQXQ19r~?cMs=Kwo&hwN?KNPK**w{f( zpza@eclwb>;FHnqWQm4Y%&GHmm2DXrUT+PMYF~8ZSC&M2S4V^4pSw8GetUw2`jyKm6MzG zyGt0Tbo1NmR;0-8diKG!#2Odcu3q!&{bj)Z2Ngk)oEtN?x>0TdvaUVh>PmMqNBpCA zRP2n|Z+|}g^A$}+CjrZ90K?BHI1dXwbEDk3Mxemv&D(=OwwcKH>gP+q+#a@K$}QYv zj8M4U^{o3d%{YOkJ;l(l zUn{>eP~@yM(jOU947r!f2Xm)fGE!m0kCJNZb?_c?H~SB|owX5AN65vRe+5d0Uh2k~I!d1m_k?A_R0W z+U638!yaB~_-w{n;T8)KMNkI;%nA>~G{UgWruviraR{4c8!L5qqF>c04n@)HpXC7N z2W(KUss{s`E}%mqh(rWgWJNG68iAD>P+tTRh4?8~*Q;6(%GLtnKHG={!Z}hKA(?3^ z7#s8-DkUG|xJo&_MT_|!JWFvWGbiGeh#7Zn)Bzgf<>naY@CDsy;Ih%O4x?hDrnm0yXnF2a5}-l2J9NC7 zXrAXg6W3FD{I2KgZt~3BFZWo61<{nEZYB7nT6aq2Za&a9v|`r1zwLH_pX^dn(A&-W z2@{-ITnaL73-~0%%{%X~>mIz~0Yb;=YiqjJ50}dVrKBh&M&pnC{`X7pkE}b;nOITo#eb1J~-xt|| zu|>A4)nbcIL$%}nJsTS4C^RAY3Rr1zala{;;S83^D2ntw_Yve6&Vc=UsZ8C+wc>VE ztO9gP&q{Dg5HbhI9L>|I5K|XiA}R(*58<=HK(QM2o(DKSUM7|j^FJzG%LKe;XuD!~ z&qAJ5OHG>n?OF#exK72Hb_Ot$|cP?Q`f;y z<^yJtkS6_dHjG>X0LmyRFA11qa-4~C*D+l{q;8lCI0A%S2mFwArUF{q7o7-t&FGx1 z<^yUoty<{DLNQ(DTi?wht1Kke={$D*t)kDH6}{pG#oWA)@aaJccErU@~*JH z>c>d(K~>4pS8Q#g0E3I5E(fWgjN0XFitLuYILIG(sQNYM3PK?6QRrMWQ8J=Q)G-0R z(-n$i7RXi@lcm7c%>gI*G3J6d%E+Whc{NrUhzj4*|2KXBPoGECP(eiCsCzF+gloI+ z+kUHFUznns0cd%xX{~h|aQboWLNzH(^73qL;uT_VLQ|*RDP!yXHou6|{4Se1%1{9d zE1{^Z?qJ`>3wSROLKaH>T6}@KB+QBcs#RBd5UTq0hn33vq?6+Myjql@cICY|#~zle zi8Ed}P`87uXtthBt*k_VG9ZYAeJcQ-{4dl2geZz{uxjvbFCRp3@qk{1wu8W>Z3DI)879@76>w@<2wS^ca_)YW^vB_V1#)`U2F( zZXI_cpK8i{7|=T_PJ;z46c_kFepBT~Zq@ysyX&S`N+X}3do#7OJCsYsXTA|-;R z9)|tokcbmn|MVhhJgb$2hj3a{uyxX?EtqF#W^J)6u`ju{UT66aX+q-E)kLIw${w)qC>pUt*9(09QQu=$*Ta0<2dJhNMI@fasf7SKj|!pv89Ll05hJ z+%fscM+k#=%Gp`j$Ocg}dYPF14_(yOLBdenaw|!eejXNK*fE^;2s@uuDk(}KNPCx5 z!<${+6T%F)d%@n-9ODb|zPPfE5UGIC$O}H4DW%wi)6GwMaPV7&fp7JVp;OoQ<_{N> z?C%w5RZ8786*A*E<_(6o@%p!TTz(5P3K6&A2Uav5GEQ&irp);cUK`UqEgW58p`$f8 z?jEN36@6^@_~6$zEBEBbOVjea#6`+ufX1c;k%Vqr6@%M~5+>}rY^{FL>V1IB$$%(r zi2cb5s|g0yUxZbOhkk+J^>4o>Lj1;8N4=nw4^(*qoQ?PvyCd*P(tvU$9jEs+2VTI# z?hoME(-pw63|KY)g$eQ;!5kKglLxDktvL5XfXW2c&S7=HyjX?5HR!@4z0OOwCr6w~ z?*NrTv-gYwOf@;l+|DsB_PsUc$70_%0}VQ89Zg&bg;yxIT%?C6Zj^N>z$b+m;Zkz= zdmA~-vwncoC3NW2UV04q_T>v6EXmEV_mTo~SLeLMMeibwlKKMKn{I;F0m4w|NxK^? z)MF2~QfPk+mDYFJna6Rdxtv}-;+=KyE|r@WC-$0Cm3IZVTt7Q>bn z3W@HIq;q{hIE4FK80~4bhpN=n$EG>&vs?VX` z)Pi?#D9hO)bvF?=5sl$4ikX{c`AuWp=J@W^xohv(U-qp)kKgPT+2(ga#t*wReyQ)E zTAeD1YjUV&!NPO?-5ylzK@(693oZt)ff8TFSYJ4(pjBZId|sZd!dMjUD+mZ9EI0x_BgDt`=iCfg68pr#5j&7TS%9-#0jV--Q zT(>%iF4T>r#Gj}ISLuTrWwwUkgEmF#!mY7f<;iPHLg|Wn2?>b!>b-Q7X!ggo-0Wz& z(M36JL>R4Uc#4-%6syrQAphv``Gk*Q#oWAHs%YWKKDzwGwOW+htBj zo^~$as-EDTL(6_nGMc!2Q?c`1U%$R0lQ)DpGA69KiGi;&rF&GqRpX$iQb6M4;MVlqrmy@@>-$Uy%gIsbmWeV8#R z917PBVRKyn(dM=w2`tGA#K<6xRFSU&TQqyuw_O((N^}&`K&|b!iu>{D;oeoh4xVo= zLwdjRse{h~#&*wvpUt4i;jGZ7Y7N`D25qyVL?EEsRH5gsjhydEzIV0?Hd@LAI3xdimBd@Hdfz2mj3 z;}i2i;+2b64`xSeo5i$e`jzXu1FH}oiitc`&o)B^5WWmx`2K3BBpwyGSP@HetV8kv>eigq(~p*NDwZ!Ih&ITMX|}-fTA_qOT?f9CU-zGAs-TwJD}LatUl`al0XT-~caS(m z(vMeJTVzreIa^I$5Li~X`#mq$ zV#$YYPiLzKYgdb#;U83^zfxg`*}B64nK8@Bz(L@39j3bhlF!3gcSfnG>cjFzcvLcI zKv#J;JAI3TOwwPp?*P01^~?oAEWk{|HahrvU3T4Dt4GmQY9`<9MVmSJP6z1NQe>7y z9sq;oqEaGb{@2mU8DywkFA-`ZeOb98-SqAHK0@|!k1i>qi5{g;X$HPJpx-fTiHA?N zKd)c`CIqu1h1J)Q-Zrl$EmPVIpf3}z;w~XII(662IOQN=Y~)1S5dHmGyPt@ zLG{`uuw>S9ru74|rY*}??)p|NLt|aC{ZdLY>taly>PNvxUnx$(GhvQ6Gb4s$Zo&lU z0yssEk`zaYR*D}7?sCF^QKNO7(>-^9 zw?X9b{r*MesQmbeZXHl>#cK!sdo)eOULk>X$;Q0O7kaK$l|ZgAJ52ZLqNRYW*yfZU z2@x*_y8Xz#8R#dnr-7bezVsR!N0cE7?4W-J4tPeGfBhbH&kFvqHwI(?xe zXeCqY?S!EsKWd}j<1E;yFRi6}VE<(~`kfd2pG=pQV>VNRIwG z)2f)3f;NO+QWWVr~W?HwyY1-0X_la{M|Y&0C{}_Al`EWfZS?fBv#? z>lfT0y?KnyEOw{FmoeQqo^DQ>$7+0-i5V3x1m)0MGs}anKG&L}mMZ)W;};`#C#wBU zL04QXzF+HdNh-d!rL4#3Nj&4ZF{hd1Eq~D;z{d|P5_ed6Er-@PtnRp^B#G@8F?eNF z?eHhkgGQq~hvy7?JsVrY`5|5RQ#LwA*CqzqWu9V6mBDvsXLo6K8N&Jr*_@sp{QVo+ z2H0!?#3a^WmdjzGR!iGXWV;~p7*l&-Tkib5bd5|y1^X>v>!aa~e~%*B0i>57WO1tC ztPkGt0*!B9l+J7X5jQ#HpdrtXeY?-hp-!Mo(@4P!`qVfNZmPs!Nn9!AVsU0n7 z=fCg&px4BZ`TziMLsZ&V6(>%fL?EC~uOjTBag3S8Ai3t;$fKR7OD~Q*PYL%lcluZK zyT^#Ss#&RL@9x>v^K#2yRc^10t@qt2-TzU)pP)Cy{pBy_F7w0j&E^vme|sD4 z7>eo{iEAGd96JB&S(8(*1eE(#tXrKYj-_@LAKcP5vgP2GkT%net|cc=mOvN^0CM%y z*vSF4(nejap>l~tT?GOXRQdMd`K#^|WhO*L!IzGEU0{O4O@qrbM!J>kBTvQNMaGo| zZ$AEe|2}!vBti}u?~*!|Q^WuGne_bP@Bh0^Fu3-W6nv^LsBwzBsKWiVu;cZcH#!Ga zT{gHD{q1Gbu5x&P*0^KJegA~bJpqcY+7+35%3U}7VR&}Q!nyi9lpUq(H$D^n-=~)Y z+`RSD@tn*XtOM0W{eOf!ax;6pp<&xU8Mia;%Zeh;RXsh7P1=q<*|FU$)WY(Xcg7=b zEfVQ^BGTpb^sRqC)AKytmwtM`!R-GyI`_Di-~az#du^?);|{5H-l?Mw>pCRdF{PiO(muJ+4OhcWJ{q^?BE_KNFFN7+ACUoaNw^~ zPIuXK7u72M#*1_&&D+~8aBi>veT|uaEgsL8N-MsiOwZvzM6pU<98k0l^^9*0{r2hV z$CYoHa-zkhUPGPC;?rt-Xj--r?`kk(|J!@t>Xai*{Il!cfQNp&c`|hW*1zvl3y_wN9i{U`<~_l6YAgbF z>5ARn&E`9&4feqIf4%x`#LxPv-0Jq+#_RcusENNd8y`j7oLaQFdF?xov!=sR<|5)OP_B|r6{2H*~h0ebawCjUh~FsP1LjT|BUvU z;wtAjQ(G=JR=90Gv^KWq^3FReuya`OVuR{kYctbEK;O6(zsO}>=`8$gGWx6O)Tz`M z-+hs)lb)~wic3QA<6J(Z8+fN+XU6+`pVAn;6RYyp!3-sndE}pB{`;4E54~2s+un9> zIQHhg=!~@MZ+(tSBLp6+)b1p;UM}$oS$#91(>a6xV>a6B+H`m5KO*9z(SG^kjp3UT z9?J0-v!3rj{LfvZ=E#xyZ@rS$FB;h(ok5{&-m1b)%um9d% zD>}SJ+jdW9;R*iuRPBqPoCpF+v}l+!&a;GRoiH*p|`_(e_h`6_76VxEh1!-RmDKTH`B*~Pli<( z+jjb?pEgducjsWw{O0nk7WnL$x1FY~t$QA?H5_qHHS_-#|11+#WuAzki{bXo3xiR= zYHxNKuidUhwAH*6bfK=hN#(q{8s=}}o)ZD4mk)fnb6e%8U&n>A{Tfx?ubwMz3U0_g(7lqw%&-=9u)DE z<|+t9lpOh!G7TdkYpjYQ%USL(Vkn#@koY{?V$1dOrm=^mM-GCImKUQR+QdQAo+Im; z&3zuo1;hz=ml*X**z(>V+OQ~UD4{3nl1;Aw|NZPb@4)TvKC9}UhKAif7#D5%W|n(G zcSTRP8S$xRcw*M=^u2QqJbvQAF)aML%W&e&_4;q@0MoljUwJ%4>MCeJ~@+o?0T}* z>EHd9g+DcYPt+ye5g8RyZEH=>P4QYIS_-V&_d8N}5=M#Sh2(|j)1$Ahd;F*JyHD{l z#YkzoQ=_+2Vw?=Ev#JMm-XR8b*_r>`O2@%_5VwbNT_)jBKP-=ho!_+V~{4f zH7kALv;3Wv1M4PVukzr3UeE07-94DP#dLwy`pm@LR_VsE_rKdBwwIvLm=#e?f{N?r zWRs*TYj*gpUEB4D9nB4I`o51=VQ+AXx|-5^r*5uqw30c=)lIa$dFn&0Pj)5Kd2>+h z$<*r~a@t>o)O_At^DlYsKi>NHC!%I^ehr59S0+dwJjj@^-8XsFxqrtTt8w$`QeZh- z@*V!1Y-{=bWH4pJhn9$o^nXJhJ}e1oMzGYMk31HR+55sg%xTf{?8&`Ig)>E+(*d(* zempr&*1A=kjDxI~uj!spK<2dMZ@8Gvq69_t_6pv4&sNz4B(2^Efj1qvuT}wk54S%~ zn%dIfyq|hOdY@WrQ!Dsa?^I6yUUDU+-{Qe_Gv~UjAEqweeR>$VQ5mMvA*bEsa`WQm z;>Dkz-<4Tz`}}e3=k0fo!_`o#(KYA4gt%^Z{3Ko^U$%G3*7ML}+CMzEuPme?yp*Mq zy7y&@PwX*=p;>X3&1(T#)Dx|TVbNgsTz)-WIqf9fbBvCXGrUQu)Eo`xgr_EK^@s;mmj3wTmsgauXcCjzl9D&EI|%Ne?Xr+k+<5C*FuG z^zwY={O0SH15*Y6(fcs3(std6|50rG>B6H)43d?xsY2hg=IgsX*AJVZ1t%QgFc?DH z@v-0F%ZzK^u5H>hQs%w8w(b+6-*bUz}cGqj~u)Dk=J-_pj>-9}X4t!aOy?fu;F_9V_e(j9T zhVwJK)CoCS8YNEUj-*`_i1_7eSIuTsMB9V!i_zpux&u3q#uo6mSf_8g(GJzC_YORI zAJ+2n%+&i1#;MJ6VGwnm=Bt^`o%pvfv-{Vjf6p$xIoB4oDCaqZx0XM~tc*B+}h8U1Vhzsf7CZ*B^*Z)`sK=9kN-(|SfN z(^Vzj*1q_vBU=hOb;tU=E;R-Z#9fU~uKD%j>`C1$-Zya$*{kv1slTs#(iU1pBqvwL zeb)=Ld#``b@%8%OI{8=ozE3v|NV@NLTdwGKM}{B0h^k1^m3u`}J`zhjw&`POfx^Zc zsrOU*vaW5w7-eP2(`JMX*?Nu(E4Q;dV#YVroD@1~tn( zeQUh0c*A~=AY7vh;FE-C)z?!Gl{*$h0S{g`IvsWszjtvnEsvl}}ipsk8 z(OxNS0w%l2{{K%XNZHsIchbwKFpxL~A3Iu?AOubLnsIlfKcPMa73J z?>Hd1q^{+PsJ?$fqb5*|&*xskHwG=b^bO`mal9v-OL49&~+?ioqyOs-ak{qmE zpiWL*ucy-=@1Z=I>v47&a?TO*jC9VHb37w42h)|)^WvwfD|0`2Hutmoe!jcU9`}Lu z?{9F*KCutn#st4G4nK(Ump}AY#nc2%no?7mm%~_a{s2eteok3^T+u#j$vArgK`2dX zB&%7tO)HG6=494m-HJ#9!gGxm{F)Jp-VV4(`KH{tm@tq1#g!k=+}*rb4<6Pv!rpSI z%7{1;eNcnK%ff**^BIpkfRqGmLFKh_fTVLzpd?#_M*$oqM49wpTHRB7LJ@TQxk}|W zE6QI?ZBoiq{1EShCUDBnXh&dXVZ4+u2rN`f_ZqFdkckG4;Kt%SJ6z)3BPQqCXBMS-=CWaoWU+ z*PbV5u2mX%!s4ZmKF4}A^q>2@W0l?%GAl4L5p}uYKY-gFD{Q7y$ER|Qv^l@`haTNUlW|9G_;9s*pwwa2BjMP>i!VVyqRLoLv0({(*Gr5=hre#WJ@pp4G(AgDQ$yIAvGHTmxLxrQ!xl!{!O|fGt1eZhFig^^Rt5X zAH6Y(De@`ml#NKOd=vbmETCo0yP6MXoFIWJnzwWmtki;JfWa&cY}1fW-~b%m%!R!< ztnhtGT@7l&(B|>2{&-h@u}*Zx)OMAfS_a|}FJ2IuJB;PQ39vSem!&|oXO;9+$=i%& z{$$42GUiF5&g#WLvuyJa`mJCQ2`JF#jL+wBLkS;wYNA~8xdES(MCTrRkiAQkskn`*Q&+Sv z!~(m%HBiZrRhUslJ_yegdOpg=r)17!@tg2RoGo@5Dj3)3_8kmyHKakGab6+r@1}Bx z3iH{?B!2;OVnWhBxY;JvWX}E>1?nb?MuN#6qfOoy8^7a$jtgYIq?+#79x;tV zBrJTr!KqddZ&>+N7M{Y{t$=J|ymM=0|5!b6pPE{I=RErn2U8ko5xtJ-Me`@#W0jpV-9Jyl&7c1C zGjmK3io^`(R<|1n#^~oiAd<@uzdnksVK~m}OhU+21;tM1vP+_5@dbVTLQnOw1jp> zw=g?;45RZ=gl<&h9WY+at3iOJ9I&)40Q~g;vrZbYB{Y!jWD|u%`ev~Ky7FzE%pbkR z=dveH6=XCr$rV0638*4Xgp`6Nswv1x`WBD??2kD}f@y#wr2v|4TC`Yxx=AAa(=T1j zSW$IbBh9*0A?24E4^9!>T_3!<=0~_E;siE>uFg=rZ$Oa z7INEk$Q&(@gMJ0(<$mim6Q^?`Ul|!ky7!aEv@85Ji;=OVW6m>UIDU3DnX&J>=Y{yy zV@wV|Z(F7Us&1WEw8|x{f>;qorMGFeO~n#&1lCXiraPHmB3N*hh2;i!n_U!L_qrZC zBOv?#yv)Nvz^VKKqKv0|zxOD$*+&nQ6SaU25t7AL`Fbf=5(mu@n5&aLZW!@1XsD_D zb%ZbzLTFkvl?T;7@8{{DRb-EF->ns#Pn z3*jm12l0GR#1#K>McdD`%0Z zAA%A#;&out@|hgg?x|eO&W@Aa2M86WLwWUhQp;syYr%hV#*7oue)TTz77+d3%IBLQKYTd5ZG~!e-tM=jng-xIUOWZ*c?@*t(?+O;BN?X*7r$3oXwScu)bS8OEBFlZYvQDYe!Ui`~T-t1?&>U{}Dp^<@l& zr2(lAW#y{A2KZSkJ)|+8vE+vSEgg{FRRu$emq?WQlUQhZ7*gneE-DfNlV=|zUVDx7 z=_3%mk-qjs11LkR9FyBjl)yEZVinw;H917o*(>RY<-o-$c={4tF^F|ml!Pu7cMn`G zze%r_xI`4=VV{OeFjLrxb=!~KD&^sWcX_8dF$9e)p)1bLs^S$wukHH0ZN84UMXXzolnr8L7jQMtbFd6mGw2!K ztdPN_>-HUEY8vYBG-h^pHHCX>Ylp<{Q#V0&BC~lu)y7BVY<1aQAM@zqHMYL-AL6(n z^wMfr>KqEZLD84d`{pj7i4$ni6*zCELRzIEJrjiB-cr_?qPf6?#H`FK!fb6=?+~9# zWQ_VGd4!H)mOYZ9ZNBXcvqiTGL2nfbQ>?NL-NoREY5-lWRGKb7AeF9`amXxI@ELj1 zAMz`?+u>s8^^n${6%BTNIL?tciGEA64Dx&wXVztqN^tNQm|F7@lgRIfsiI%j4Ot`h zjG&IAYNZYZ&Kk3QuG0&kLsZGOl$Y=C-VcRLi1v~M>>uoQHrJ05YmmL=5$V3aF#s5pF5Y#$c>#T&%;F+3E~ zcw9BnmJcwC2?w4t3ET&C3Fs_$p!2FZmM&^b`tav5oq&1H;G~Y|1B=wfYR^PlM(vuY zpH}?>7au^aFDdGU+~~f$@)H$qsHl0yh8MUaT8JJ>PI3Md_7?8?cMfh_vvA8yr#~vj zBg$3ez#QqcM5{cmLxzdT_G^z?w%ltb1gjmN=ub;HgMN{Da6}#IH#eG9ZrO?1qjw;1 z{?NW6yEvyEr3A^pw#8v*w%|aS6ujd-t8K0}aGXnT4w$7McMUh(I33=LVEFR8*3c~J zCL;d>VOvLY$)e2|{v+6J7NXK1YTT|CUZ0VmReU-6&Yg4iOL+sX?v&Gt?J0c4^#i<^ zUFEP@<1Z7k%zXfwc>W}i;lCGaK&upR(qvD0DI)C?j)#ZHIP`q-iy4H{&@)EXQ95_z z3Vv*e& zKVrX!wZqZF>SHXu)al;AU6PJD2)TTJZ3~{b8p$*Qgh-Fy97HQ+$tG#8Lz>}rnu*$Gm7Vt=bdd+D()9dlG&|_kr4O9kbMTD!KZV_&nEzr()-mU^?i8ND4AVvX~VaT+j5G)PC9Kq zyyUqDCdQ!Gzn!!;W-Pz-R1LP(#!Wd4;z@vDB?w{x;%ZPa@>`n9lZu}%>C2eTD_+a{ zou}OX8AyL+ti-xP^aF!4;%uWn$Un z#gXg9WK5U7;M0PfN~$yr%IIH@>QgED0Mn*#zH22GVS2Y2XN(Qb9D?r(qTgB*U^rsT2f6qOPl+YR|%2=87^;3hBy9}I{rav~n^Ig!y zLIlRdL8>Qy@Y-YdktE5XyiyRqxBxr)X*r;Gp#=c{hyC<-hH>$JkSGXv+93(8fUb{r zbYJFUXm(fLdh?Z{Myd|n2R-S+eTsswoIyH|LHi#-ozza+GiLCD32+}mY6vA}%{9}gmG`kI2Ci=9$RogtZzyFe3 z-M^non&gjs)&M+#c_cDxRdCQp*g-}svYyhf>f>$paOkPMaIESL)yItHweb+%F*k13^EAi!q}bvTTC3O4XmW2^4PD?r;x4uFXeWGnjSKH{$V!-%v64;lHKXn z*(k_pqP$=n7?&M_5namD_Nap*zeE9%m&|*6QD~OV&VJ(kG_7gyZ%M-3Pb^Kzfv)GM zty-h<_jV#d`YLH!nitCDc^HH2ipcOsE2vnmesp}5g zzMy`1|0#zmk|4nx`mOrA|g=#W|`Y1%55r?x_u->cz5!<)Osr z4%&>xS$yTH#hm!YZ1#ASrr*|ACzt3O%K5fB&m#;!o_9DPV_~W=r=5MpSv%uI5&R~jI~;YSP)Yw<%7G%fDI}3! zzMKDFss)%Ckk^y`nq2;Ris#?DjDQWxXyMWfBGGcTmN1V7J+0qsdBwa8Z@E|Az6QAo z33OL~s?MU#WKV(qkMx<_YOc7PKNE^NvZNv%@!tn~uYTQ8Bs$cU*=owXpc>I-^w)nN_xgjry%IqAA zLLF3uFWJ2Q1CZYDSZuj}AQaz-)>7d7^3sgHz2nhYKG6)+txk&G0jurHjvJdmMOszk zuD~P0QS`FZ1ZA9f|88i^D^UX`1mG19T-5?zu*SrRAkZ4@_Z-C(bBZKIV%)w6EfB>a z4`Z~GW&Ski3(-LQ4+mKs%3KM7qK_H?@jY!YQYg*X1ctsMSkQ|8n2YXr92il7X<9w% z--FwBzZQMx;$wS7R_>tBPGx_0EmSDYi0Vw>&3W*%pEeCY-h>J%kcjW0%FJ`xkw zL;L&pKgQf5cFmtvj*aq(pL6tWS>BN8a0y1kl|&2W2+Acd(P}W(PXzu}oxm98^AKIh zYG$E)vMOR~N|7|9tU#~O-=VXN&TZ05IVqVD5(%7n@Ru^sKr zqjF`)+Ec8~gxA8xylL<^oFR?k9nGGZht4Ebwq`2%aEiE|Tb`kS0l#wpR37cB{cOXN zG3lyS6O#M7KC$7$C;3;Hds%zG5O0vr$(YFp8{(`VGHG!Zc1oXLmR};NGL|Ofo)W=~ zQncJ+mv!^8y%>)Xkp2Deg~W0A>PCDg;Uy#0kK|XKO!RI_6LOUg`{TyP@3VCQPN*&K zA9I|&w|LDqY&ZL_k(?sSfN0H3Nc2bXw%+FZ9rWqT^;BqCue;=2?i8-T-p4z24HBZ5<14h5dCbFT)GYPQ zkj1fot`JH9r@wMt?pdC8TQC5NQUpkR252onyakBDVZhS*MJ`Jn4c87<^QHloI$_qY_;=iXpo!&)>DW)?=ZnIZ1MLOr%1yi3?4%=Fl< zdIsVT;&IIlvx^RbQ9qHP;aEOiM?pg;BKg}X&mas7VcU7=H#ZQ=gVcNZVY0s>Bs~g+ z=vW4|DpxOaQ{69Xvj22tZ&<~k9jj9r#><)NSwUY`Wp9AwL)a>V^)(ghb*Ek!Hz|frOBswhs5kquG&( z4HwhI_vJQd)>X(U1@rEe!B?sI9A>OL8CMv7Ch#S7J^B)3S6(WESoHdUQ6y~i`p~q& zjB@|H01zeTR>RPa%)DS35{|6RJ{{(#F#JZsBELOJjvi8Sc56*ivUeNuZq5F;JmzD3 zW~IRj><(SiuV$39n&D7CuY^6Z#0SBjqme6x7zaC(KH{p~&u6PVXYJ8=MY&_zbqyxn z#ZR0rNWN%nW(6XxT^^&j}jRfYF_R+Fp>hf5omQ7AJ$J zlJsC}`xCXaVYRrYK_u3QHGXKw<47?H#V?}J>0F4}OaWIN0b!4pw94Z5_Kb)X)s^4d z54@GWl}AJanVXauSOH4h7n;?xjhFC}B{CgRQQ8K##$0$*)6Xbk==QNfz5Iv{h&4>S zaQeJlwNskWUea|Eb6kBrda||R1o1v}Di8kC?J;sHfaPx42i)_jg?*?=PyWsgYpaF~ zTG#00_N`YEE@U_5{yE_z>5Ds$Z%7=mE^EuiT%^lrAShetgx4M+SAJIVt-|4WUQQ)$+epc&9s0;gMX{ zt7`<$*a#bgc1})S7(08@OLg>efD3FHS9(>Gr+!~B*Rw})V6F-?FSn8mhY?qksd`=K z;*#|hsu?=M0i8Vk;jU8Ye$2jsAU&vEP2vG~a_Vw$n~1mYOq~@aXoU0;u_ayi6}R7s zabd{z^#70+{%K>rET7*_eP-H;*6mqlza%`3p{F=AtwIF%2k2q-WF z48_0cJgWAY9`wAD=tv$5!61;nkyU%ouCvihFfiiX$NjW|LRko|i|jq{j67&D1(HCR z*ba!gLKoa-z{-9-z}beDI+bXF`!Wm;U9n`z=(HElHwua44;K3TT} zm+2Y*x!b772QLYPtB%7W!OPR4>n4}cWAsm9w-UyW9Sf!M79pMmB6L7%1h}lAGamGD z1c(E15jrvtiN-)MR?N6?$_wz|4Y;_-@*_gaG5%}sVc~6J)pE14UTxpuX$rkWwGVEQb%co)zhd7h?ah53(li6LqSkp>OF-9u_MH6Z)*Vu9Uq2CG1m!VyHn;z@g#PmU|6_%y5DLbEk5R zSN|~#ak)AP9`C&j}m8Jvji6#p%9MJoJpOWw&_E3ba~?u*+l+XYaBze& zD82m49HuLlLS(2N0{{$0Po(my5ul4GG~0y0C>qdM9k9WL^3LI*Q4*UcRG?0a1Kp7k z206kyr$r1G=G3~`RCFE-+iV=|YbLqT8swjM1&Yh(S6gIubQi0%lADLWQ~Hh(3^qmK ztO>*F<)hJxF&2IMF`<)-dWPH<`G_?v780Lwe`5l?6EkeY^DNU!qG+nb zoslQmrwPnnc<8HtOojdt@K(2$_YR9bkV3`LJRF*+g%i*|=e~hla${{#^n=|zzE26v zf^^?~4vcD56uH3-2u!d28geK_$ExW6$LGB#M6=P%tKHmkzQKBQ?_Pi zc!>SNx06~~MUa+tl-G(O#M@E=~ z*y|{rB0{srFy-z9j$K2RvBDB{s}Cddi-?*89cCiCaVVc>d1bVLxBy0yq=duE!Ci>h zIcJb}m8?pB@m{wuVzuGz3|naS+N5Qz+4ZF!5^5+9_Hg3bL4_L#TDZ6&Pr4`D;j3EG zP)RiMQ_E715ro>x^Y^NdH8Jm2syh7~4!3n7+J7JYigG|7JJmg zAG=lAA67Yu(xvBGui*N~6TS7+B-k!$D>;|}4;UT1!0|kKHm9mKmv?QJK-niY* zi}-dSW2l-Wic^Bx7mhKJUg5!esf`*lg3TO((O(3D!$_V)Sq4-C%NzOa`#2ACZ^I7C zhO@OskK(F%JWVXYrTtBXJokQnktskTWC5Bs#1hfxk{=z(0~s014=(C}SvaVG15B-0 zdW<4<+q-;87EkvY7JSsVsmzN5zv*tTNrvslo_`BdoHlzk~` zE#0PLcvbYOFiOlT6p>Knte*TA!D~I$uxstZhXy|BF)lOe4>u(6Jlq|X`F88FvF!D( zmv#Ejz}wZ=vo`vSZE@dE;}_NKc_}Zy0rWNno}AjkFtS2Skl_Z4V|^$+9GD(7fKTvS zgYRbY$P&|nI2N`r(E3<9UzF7h2L@H^A^R2#Dis09GrV4hN0S0a&FOAo3PK$w)F5s( zYf#ny5;-&Iq!Dag&K(Haxm_>u^+W^FDoan9K7c>`oJhal;UnK0fS5X)$wa$CLQn=kn?_kMP5*4d>@$IqMU?t-57& z1B;1JxN9y59+P9|e)qU4<8zejFt~*Wh4SQ-eDCpk=V4mkp}0Nap@m{Ky3YAZ$vN1b zW@UO!=iSTM7x58aT3rEa19;@%bq7%($W`nRgpc{^mCO`4!}ipMX_qQ=3NrKaUqVmz zcg~}`KRDvOik>`E8>@?%FhTnSnCy$zlq$I@hnr>X=(k?LqObWL@LFlqZ^d1-ru*h) z$#lfVk&_r7THHe9!;wsF%=oI79ZdN&C&ec;lKiD2`++fK)EtU<4=Z}_3yQTs=n7G+ z4-k6LOBIl;0gT-g-(ISu81jJ8TRaVwiwy9G)gaBR#hTx{N}L>%6Rbr zhMSL-yobcA{8lVC-7IKj%7y8mUNur&>?Vd200A z&w3peJRZtKp|L`_b+i=v{Inn{$KBD8<@R$TVJkKR0e&H7JxS*pOs zyYilC(P7o74u7lPgs}!dgk9G%w>>rMb|$>-U~6S%VVo<|9FDBPr6B{YK*eYSC{1q(J}ldAWz&#y1>{7G9$oqoGhzH(gvI&B3%=7#_{Bu!A) zswH4}38M1j;fRIIiaS5zXve6=!D8oGxO=E_Jf1=Yx8Ct>n6Me$ggNTTG2huZ>&lHR zbbdhUj`aTN3epkIhpZHSu<6C;|03?Ztn1TUs?dV&H} z5wa>Xl$`oN5?&bme)bgLmco+Ud7Uo9a;SrgUj|>WXJzc_WmI_Xv>mWl?T;sN?tma9 zkQnef5uoD{x@(AHd}O5dm4>bO*;@H-MTnvX5K44|zIs#f@mD17{`eg!A@m+1Os0cl zU{{NQ|LqfK*HZz4bOy><+!GEg;Iz1vZiOQz*FyW5_zF!n-Wj3c)pfJM(6Asv!9o%K z&}a)|tu5Jr_qv(EmOH0lb@C-9g_a+!Nn=zzj`MV0@7#{#N3xew(BY!hCXAhu!HNP) zh#W~YbyU)v`gLHz-#Nw?TvOp1u4ErsiVNWD-i**cS#Uo8K`xIOEk?2tQ|BBC@%&l>PE1-PQanmeLgJ>gE!a6Y#JUcW-5@5u*$ z*4;pfB`}%B>Hqnx(ky_n(aMQ#7SxReY3001%6#rd)i*~06zk^~0BjQrhA~<;?X|>C1L=s*=~qmW&&J9W;a&5S4=c1@@!fF<$^HAb}cP)_H`@i zUPWUBZ31mAM}+}SrgIpw6~&d60o~uq0BseZQ)4X2^6^oFTAg=r%6whASi6eyOKmnH zNuiWtbO@SFAEFTVEiirFZ-hc&yxk~hp?p$3Q<3m%1H{rWL%C=1jAGf6R|f*!Mh#Jh z`M}jU0TF5giS``C&YskDb^p|>gIdj5wKb%}-3Bv6SV_C)7i~Bsh-K>^EX>3am?^$o;W}A|#-MJf3?Iu=pOmBIuR$h!P2p_5n%^TppDHn5<@rB@O=wkHNA_gctfB$WV{S-JFXtqAmeB|3{q?epe=^j0Kj!OCudalZu~b z1%70_>$*Zkt$LmP$W7l8ng=$~S3Q2KaKWN%otC}je2SSSJ0I1puV&5<=wFcd{BquL z8G53Y5m5+AkiPoyuZXhUk_C)$Fm+kMf(1&?BZS@~J{tiq1qMrZUVacq)_zy`b`U{8 z81V!upr&Fw2-WMBCmN`OAu*FK#PZ8>m)AYzPAv{803^}|dN-Nv#k&my;{gCT*GjdG zwykx8cyD=9qn_mqDPZ?3NIx^LRUW36oJL{Vt0ztCdC7720~8h%<=7E@GL(I6Hb;Sq z4HvC)C7Pq){x(3zy#*MR5cQwBGd+0LuZ{MMri>fij6TFy@fn+eo2zqo4XdkTB4v}z zNINcy&zih1oD2|1u!AYhqmfuOC97X~AGwJhOYT||Y50{wY~vSCFeAV3;Y)#sc)vRl zN8JK_#F_HF6f%iUKEjKSr>)|1Hz;Wu9=M^!S#s)c?g|BwSm^G!P6%rp) z`=c0%|ME^^?Ayq9ZV>-gR7n&HsB4%nsh23nEmAZl(yzbq9u>(VLUekL6kZG3diD3A zxB^)HZKNiFO9spLnMcsPWLKPm=33yab>{s}*|@CB9u=Aa+zZ|i77Z{0j%0-llh;y1 zx88Mbbk9S)6hu2(--ws!a=GLx{K(rwFz>A@G?qnsAGwQUHc;nB-#qTK#IP&e!M%(P zL1;8;FaO5s=dZD6f}j0L3)&x|P}n|9!LSjpjMZ;@ zx5qi?>8fyps#!bl;Gk5zo|Z?1T4wVWzN!Zc(a-YJeq4WK{-ck&HR%giIOx&7W4@&< zB+Ei^4dm_-xT;K0a4JXh&d^1SWaQ@VSp;A~+#^t$22fImhEjk83P2$Uo?eXS6r8Q#pCcY3^$g(Pbd1n4Z)0o7J}=0E11+5}0Q1kaL3ydv(g;*;k}X&1 zc2~f8tpwY+0ImbxmbV+3dHv8{M&0xsgkd+Plj3UAM2%Q$_!(oWxB8sjw_(?pu8U&bxMhegC1X*U;{-k${ z2lfmprDIAes0BXF2i)(oN6^>dd-3wKt(lF{$LHnW(I)2eg&rL7CefMI-1MR~1v%hE z-mQC_0J$!EBCsVP)uqu{{M4d~2TBc5i;6|IB~u7}n>L$7&}AiYdKWHB+^Qm-GkIG3 z9FK#S33SVgXi$yB~N);tgTn6h-yCo#ywlRXMy@0r2N}Nm`P<>QTDX2_@J%P06l=;Q;#Xl?)0| z_3;kwJ%rph%E2|-0~tQGUyELbew-9*%&*GaId*t88F@dh7mpq@czpCTmU#ZeYf>0c z2Dw2L#s3)g=PA`zRM6Eg>Z~_B4xXV(u~#@8&SilDFBp~ipQj$jI;#vr&)%l?oV*Qv zU!23+4o{`!I6p+1iIzB?$_?24Q6^vmHyt`> zSnIo`p&bpZAz}ss*x-q!QyJd6(yLzq?=TCI)`phVR$*n*SQL>4%`lhDVSXPkQ{k1Q zHAzEu*1)j|fk;V_3jVujW+(P=D1GljKYM#urH2igF;(RqN`}QlN>quq;9RYF$hwi zi{Q9ZW8~*pklQM>#`dI>SJBU9S(}veUP#CSzuU%5Os%takbSg0V;lAk|QZNBt+?dda_64O|d$OZ0%7-6S?y{l}JcANZg7sd?Tm7jtdqcK{2D|2`#Uyn5t zhnXz`!VBbIxKaJsBdH_{gg7UMF_CtMu2n~Ls7qgI+9^ea{dfoL z6B*A7M~M*3yZ7Rl$ff$(h5)>(1EugGtTKoFKU9RWq1Aa`^nU$71@(HxqgF3_jk7E= z8+OB|k<6-M!*j|%u_p$7`>hPYJpGbu2L!RRX_ z-YDRt$Ujb#4gOUE4+9>P+D(!8Lo**&B>GXQOs;FMvS!NEU_fbhkp}#U5hw?}XdEDX zhSQTI(z{jC|KsS~N%;^1B7ZFW6==@Y0Q3KVNJ_%^VK1Wx5TzBPml`m-4k7yD#SCn z5OW&X-%K(~>x{oF7{TZ5A?Nf!o*tOzHa>Zs2G}y>H}|BY*Ay&GzNIXVNSm14+u7m3 zUC-Nf9i`6jv%v^V*bZ1vF%sj&$5K({1;D7`5x}uJe{wT2#01RCcs-B!T<3mtxGk&A zUE&_My1jFL;kmr<6xjI)fqYxBy{?@jIWa^&v9@|ki_if|u!ZUe@b4ORF5j28(~9gz zuxFAg4C$}c_CiB0oE}pVF6MaXm>Eaw%7(L8g8(HGCj;rGh&)3$HTS94MelVs_&_xz z({|xcQ+c-xKMx(TD*aYS39KPn)F}shc0Q&CbGE?d!H93HQ&+D%-G8gZ(%=&-&d$HY zYpxL8Wc^(A4#sUin>!Ks2o4B*y!-Ud*4;5)=|b$3$RN)Ft1YSIGT*mbe#&p;O_!g& zg0m$rzw~^ z09YDSsEGd>Nsdh4zXsYx=r2oE=0C4FBLCP77430U?Z`;L+0{hOu;0r)=Mym;du%g? z=lGhpsk3mQZ)eVMeyi#5E(T3aU5 zxFy|K#jiSl+R?j#gI|ks8#9-CjXNQHgUk#{L}KF7bc_AZ(?1p_UNeyuxWQZThxmi> z$Gcr+kPEb$+&Oqq;8=as853i2-7nNr1iReVahl@DM@~N?B+K2P5l{hy%l?L3{Y9w` z^A_*iy(N@Rk&#bms)uUOPXqG?;Fcb~QoAd~9C=ohZ?ArRoln+L>NTv@k>DKys^({X z?~?>xPxg?xy=FHkb_a276m_KV22$e6Fjtaf^Wtm_Di?gb%M|-khR&Mk+v!Z4b_f0Z zd92O%Bug1MlHgc2H}qi|CsFqe-Xdir&1=U^6p={7rU@Z%%-I@N45({k7YK%`6 z>dYfnIFhBIFt6LqgS4nGUN?pF#uDmf_Pq>N&-jyUT#hKAdK$!xKVHm}%(4$B zMbT|eS0kAn(a36-RnWEXnCdDjkVOGkED%4DHVp!hhrm)1p!stEl_9ZCh8b%*O^IUb znt#rUvLS_8U>nw!5m7Y;s@oQ_sR)V-uyf%Jm7#de2NAqqR32_o`|^HRN@xbv_W)>i zL5#gdArk;V>>7~`p(pbiWcajB=oJY*&;NYa3vb$dkP|2+m;al`3%ZtN&k_qa=F)!F z7gLFq`2)pBWrq9mYTB3Fi`kKx2?F2Y=L4(61w@e5}6B17Uq6OMRZ4)bns7>KKr9P1OZx*oZ+TMKB$DcZ+viDN!dzXjV*W56?OOd<0 zB3)^)4;}9B^SpfkBVxjZRGzjAm^D)pty^4uQA1_A~u;)L`hIrwDPBV3KW+k_m5=q$)rt!i>dk;tD!tbTsKy6X?Pw zc^e8K%M(L2s@xu*!sU$x7eBhX_j-xK8WT@Sn2}A1&o;L{@4mvfEP3l+{b+yp&Xx<^ zr0*Gd#ljU>0-9tyi5?HoGrn z2t#M)qOXm4V9PNq2#$H=`Wb<#R)E2521r5hYPG?)qx0GcFOZyC$xkHNK*!@GPnr9d zhL<+jM7eAo6CH_GLt475l*;!lN)UHX7GQBFmLH`qZ8#PCT^*1aKz!dDl!*roT4t3@ z5EpIFl2vLL7@1cFKWV%>PEl^ioEDo+m6)~^f+aU?tC}~7sy|tgFGfbTmN&lMUrx%- z?9~Ziak$pzx8V;hwrzNV{vOy2Yn{g~n-0RPX;t6a+&ve;D8c7zPg#NI{ zwy6VW7jlwMCJBxfI9$3m7Qg1kK3D%q8NtfXELH?LuYl)LM)>8dwP=*44ae!_D|^ zb2L}wvIvnJ8#RC6+pa)sx;fSL29h7_?tRx#q!DHs;6dov8KJqL&odksA_v`u9_@*b zG(Ii!F+MF<#+#nY&Sf2aOk6WwAjYn`sf;LUC`Qz_KUif@DTp$M@JS&tTADRFE8mmn z-JFRFM-{9~#3~T@)_0#}FrplD)qWyVJ1>lFJtQxaWEDVC$|afsLy1bUP$QqbhsCec z-%BjjlH?oGVI?9`WiV$aV|4VEL8zT<4*?xxp@6dMpo4rT@XQqQd4o*a19)p7poj&` zHK61Ry;@pO!zmBJHuqrGONaP>UM2q;csQG;KPcakC^%0>stcrmQxF1`;#&u*v=l)#|S3| z(Xxo%@33Su#bK0hJiOpOEN zD0b!ZZq2yg`a0w@ZOeu{tIsrv*4q}$;Ez4J&f8gjEpsRynjp6EvZQv{996V}?97+{ zXTuaFG~*LS0wg*%K0p&Ad{C@3TcN6ZMaxQI>@1 z^e$D)M9zsk0;alU`2vykQkYvN57qNo06`Ltx=2{_yy+`zFhlNhWD$XP?8)V;;nagT za4cl^^atEp8`Wo1g69mx`1syOO@`$jCLJTtU{WdL>xd84kvcVh^~s}2T?go2p?|?K z)K$&R87%*|1LzlGn;z?g?FkCQ+4%`GvdRnsxA>N-ss`LH9Aby!xi0$=E*PJWRSIQ6 zp6c||L;9Rm*`Mf1%|t&|jMF6_3VGU>3_XYKkr+6`%9uqxc=EaYIxLxCT&)px1gyZi z{|icbn-xA-L^6CY^A2d%WPBA*TW#||TvH1PKbU0Nbtqghq#;|V4$2KP{RwHi`t?Aw zNByCp{s?tACYm7mmA989gRho>SHeItv(!kY`JTQaI&+Z}t@&|PB4Z_Mkb1~?BFk8w<0^i$V@ zZq_{~jk5^Ragg$ev=KKdqx{Wk{B0k|))` zN4@7oZ#UU;B*FR`ju}W=t3uAnSiw83F)Txi)?Dq}e;&%L`-=+dF~ItGlugGU?MZVj zh~V23o|suEX40c+K@7rpzw;#4WKqE!CSj{NgpE$?67#OJaZl-)7ABr<`8&{hTj|r~Go@Q#DUQyp;+Yh;b3TV%fh{%*G5 zP6Mes4b?8A=G8DWR$FXoDgNrdJ@-Yaz$3u#V0&x9PD=;QukP<3!;FP-hG=YC+Ea}Ta#cu*Kiw<{l zkC`Xxg_;&h4BMJ_6|tz8RSYH>K9GraBGvdz=@Cw5Ra5c$0-bZPDrDe4IN+$*f;A%) z@edA-*D60d!E{|@7H=a`s0FHZfDA@i z6P7kd4Z+}PIPa*9tqL><*~a_P5s)>KH>Z0XKRud2I}+06e%kB^)!)+}e7f9~b#HV) z4Lhy8Sa(d`O%_?L35U{@qp3WiwU!f{k9Azj`!6v6CxUDNTA~?)#>1|C^dX%_j%c*$ zsm;Z5dzrgfk7RQKSg+7*tJ>dEar8_;61w!0VhLfnAy8qc-oP|ivH@1ZU@(x+jh-k^ z=&fhhdUG#UhyX1}&2|rv6M!}OMXup8S0Rwb%%=1cjv^mmZcshk4A;wWsjo$f)?H1~ zjYunz>a2eTPkKB^j38YQmrS~*bbTVW++?f=!kubx#?xCUqiB)pvh8zVOVu2hEi=ng zoo?IYg~IGqh+~_E9z`{3N|`kBx^X0ncJznohv(rba@<L>C18$|dZ}MZx>{e0J~Tu%kX@Uh+FB}l z>9xA;E9)Baww&TAe0$gZkheif1pkmX3mVz15ROM#ITfGe+pRScM)GRV+IV69hX==2 zFDRikhkc8ww>GMO6`yKA_^D5MYZJ>Xp7j*BqDS~XJWJ;&s&0}|I}3<4Z^f}hejtTT zRiD)MaHeAtEQOz=3>y;+@VZE#K&7hUfAcER$%8EmdrJT6XePt9Y99JV(x zoNc7}!RP9ZUPlgcX7f+EU$$F+@Wcv)G_h$H(*vv>n^&mo+C%e$i_b~^a0BW9sN3jIL`2Nm;zA4Fd^*G8N<>C!#vqG9rsVQM9N-o5wM;TAX*8}qbKUa@ zU%YH?z5WPB*7YY5yRE+j*T^q#-8-Os8yn)XP2*xDb){^sLYZ{hQh|`vZnL+oY0|Vx zhh`yqqt$lgOPO6-F9nm`P@yB%@Q=BiK3;tAm$-fu!$95ERSxlGlQK7}(?1aUb@V)8 z>(20DkLu`sJ7#7&JJk^9qe$ZXm6{aVTZno&z>OezoM8dE(Ro{>N^dzAo#h0Qc7g6* z(C>$XOp5@e7K<$n4M0|mA#-`Iy!-B=VyY$EO>5TW3eA>I4JY8+G4lpGyn=l2#vBgU zLhu}sphpJ8Y)65fJ#|f6SbzjJmguW_KhrY>E^KA$iWfW{)~ILoVq~Ump{m8I=M@Ou;V93p&9{ zuEw^*&epcU_dZ`cEJJKP$VRs9ZMBH#V^H|Un9!C|8<}hfx{9~Oyhg?ubz?TQeKvaH zZl%+-isJBXTj0K=no^ zp}D)3-stf9@CS?Wfs4GxEdin@+BmWq-$`)%-|(_+$S0mrodHu0VG=KqLoG|@^NY;( zEIeSN!&-X9y&tXjyw^q7I6wbEP!1pV$%%!GnwXY z(k{9Z#6;xX6dH-}n=!rDLThH*6#$Q3W7~X>=i-xy7T1*LF8Yw6IO(*e7q9|0z1cPaQtlH_yIjIYjfNUm~ssl)_0Q`3c;@kn$ zzc{t;UxTM|>vhR`o7A-mPG-I;ReO&J%_72@@hX8Q@A~)dAfZz*&3hgR*>?P=m|)Lm z&zyLkJ8uZa8RZ(e*GxSllAQ?F;V;aSF(Jm*?EXd-Aqw&Tsa7 zun*b)n!uaEsBDF(Jpp`;3k?35{~$=uKWz<$HBnl3r2E`GS(|CeT~vEv{XW%%mqaii zBk93CE%U!Y{qx%120!#nl!TPHINB{GBfF_f?w%lMVIO6Azj0*bN)@SDv)cnDnFL&i zOnt3t&IJCC2sT#}t6Ascm_(RW1QUiHx;~aHBf6e#8!mHLlsD{0b;uY+?dVj@Tuw_0 zNH&C-yzb4&X7jtiG?OOby80Pk*k@0;H(=3X*SU&=WMa8oe7ckKiK9ZjDk-rvJi*MK z(Cp)6*XOT&wHkljMo(`9>|iH5^(!lzsAv=`5w>9E$SntYvFLTO`6a=AX&SeBd=4lP ze;i4I9dKO|bI<$iZPhv(pNv0#xQ~db;6aVa2eD`MAHv^VX#kb(rZLO4toca zVE?;KQgScM^RrdjVqi`ejCE6iHxdtJXLAs>>rUxD!ag=+1xbXZf;Od-WmbfJwVAgF zYrU%~@rD8PZsdK!nE8L~t#x}sJVJa`3jBK!e+1zbpH9qWkya~h%DK^F1Ln{_Ie}hs zCt6S6m2{p^#7DNJfpv`7ot#xP;z|!q zqZt%w58-lMl?mMZE%vk-e#faqZ}5gI;#6ycLnGA?oL~KH1>V}}Y+dOCB_Qp9U4UyF z-PC6WYC8&Me^gVCYf*->YEJ2#(R9@MY3}L|&|2D*sEO3=?fz&@+jvY_jSj^<2y`m} z2W0RkaZg&3ltGgQILi3qJ*}7wiWi|9b~>!fy<+) zFK^<=#NPVeR`mzQd;FPr-a|c;s9kP|PR(Z{8!9}0dK!g4!f5>JO2ZMT6t4V5T~_z6 zfh;ybePwZdTjr_EmM?yIrT@G%3+;%10x(C+;&#C9N_w)BAc}KdoYp26z6~2vZ#j98 zBDWwFuw49hjW{#>l3S0h+1d6C6M3SLTB3Jq=2_d$2(DXEg>3HgB*LE=+zzvPvWpm7 zi>_ciI)QW+@-i&zoS>*8vy%MyP+mLg9763>oB5wjI5M)_*9Xd3q5<`&$~k?|?+mV< z1z^?y%c=rHH(TWohrrja2fl@24!~300KnsQ;Kf4T3i@;gPz3k0%mIhW7Pu;;IU>~( z!`0p=v`VcOFjc4n4j4lO8_2;NOs|rrQ0!pVuT_Bc9`H1c5Kty8d8z_BRe@ydZbB4s zi7q3+W{7@fTx}PyHCfw$-i_hYR3ygKz^$2;);Q0QQ8yqQCxe-fX=0&)OOc^>>GybT zGx+3oQe-TxP|44_Zl|*z{SQ_y>3|%l_#Vo3Kl7Smst1r>U z?9RSW74*=+to)d7(|5$FEKwN!-@!4Q-cmuLT%qfWwaqFaqG{bwIReT~lnKZ&oj6lgt3ai+xYhFAL=;8cdW0@uS%mKMtG9LyhTi;Ho(S3E30Q0tE469*%8gs1i*o*B7FUXh}HN){B*)fI8nTuL7Zrm&)N+XF+ z=c()P4k|%R1(>Q`07f*yT(s0lhm@QGydBe0QF|4PUq&_`&vA$YwWx;I0V%MI$BKrCXsh@VM;FJB8SJog(4cds2iYAp0)Z^3+}PNr}#94;kuF}$=Dud-vD6@=y({J}L+ zIX8Cm-i>=v_tIDktlYBvQpHPdPECwm`bdS<5ZB4KOq4X=!y&w|COCVfNmsnFO|-+C zN1jq(R`08AMPLZRR>Nn=Fn2b17mc;qCMOix&jXL*Nr>GgTlFMr{dW#i6X&PX2ijDR zr{v z-beX+FAbQE*thg$OG^Lg)WFDfS@FDRH_1vS-UcpgT0R^}fy*|d+lzu9D$52s%ZnpR zl&gv`pXovps#{vRvFJeoG`BT^N@Af}D8Od9p4XW#&CL|@pk^hhMVT!r>enouV@zD|_V6(`RQN(v4_#<4^GJEbwLrY!Cn!9gI9pKDJ3e**sD5g>1h! zC^0-%kXHgM+p(M-?%*Il{!BJch@I8|gI*{Q|D4gbnhy>F3?9k{OSTVO)y=P#z>yv} zN~`u_iHo8?k10cqM9!N-p*=oUu$zL3guvy4|8*kh&|n}|kerovB7kW0sG=Dwn0ZSI zYSp!7%Km>Rf>0{|NIMb6$?Gnd3}^OiikPx_)pF`f;?eh!HsK~FztkfxovfEpvpTc0 zHn6LsWs|0+@0w2XmR(!kQYfMSkl$OMaGzc;V%*UGJ3ciwIX?R;NjoLGFn^We%b4=Z zmY$ZH7tGvzZC^5diyPEmG`Q7ul3$P`80Wn*&!7Jf19&;o*Mc#CrB@&w#H#@h7)Wsm zfX6oJN9}-p*45h`Ls%w!_15dDzkam*@p#OmrR{|8vi#e9=A-l*$zw;MZAmT2=8xqq zwCw98T$Q+3e?chbN9KpL=;X(cP!wi{V%R`s2up zfg5^5hE#FPEPf?vbE;TQzWsDT@5W~YpsQ}X=&-kPelfcp3xl) ztc|;&LHx06f&`>qa=y8&0%iB2;#T7~!MDG_SzG)A3mkISG=%f+)$E?)ZhlsNapv2l zcQbffg%Q0k^B89RP|*Q>->$N8cA zM#~pVJcAwAb< z24N~^>PuHU#mFeId<#yj$U2_A&=pSCIOx8x+q1S=qO5_hQujM{5jSbo?9@A>_fDi4f@V8W`e*Q!!d_kZquQCes+ z;kfjTIN(P+-B8+&d~dUJyla8xW3Er zg@4q*;#SQvJ3t@83xlV>d>Q-gUXXGt^2PfUGm|PvnF4%u>KE@a} zF(H5(u7k5b*Z$z$jj8wd8ZG0#r6>8-{POad*UG)VZd(B%=4<0q$>?>W|3cliIEKe2 zJ*D=CPw2N*YZ-jP^?c--UD35Ee1F#((ZquNR<i%@4FhUxhZM*lIMxexQF5b zv3b@Sz2nsO6$1)?Z-2cU`g`-)us6H>hu7Cls<7>|#pk7jEWKNL9FPXCo;Y}fM9I9eAw7QRFA>Xz8{%M28Mhnq>#-6uXD zNauI&#Ol1}hPm~m)kIKeVK0O$o7NpS?)|Q#@H1ofYPAuWg`i4{8XV@Ix$k;UDJr); z-By3@VBHD3Sp&lF`-umH+U5Fdta$Im*M z7bh>?V@s|yCC#U&PjOz-4St?g(ZCLBt!4KNT3bE0{CDFiR~=@xldSCc-o0k~lB*8y zkxlG9@Lhjj50_IVBQQT-q`vXMd}^!~LM-<(!lRQs7<+#q!Z~QSf{zc*6-K#)$cb{nna)UL%(?T*QO$x{HPX5+8fHlmG358X{PkV}XF}e%g95kT z#^9>6mdq_F_Jk#4VO?`1F*fqQCycj2+PkBlC|o-JV^34KcwgS|dRL33*Y`FbyK+Ir zJ{-aJsJA-(kSD9-R&HOYXP0y>j2U;~!5M^n=rmRN-+s9I?O~lc zdz6Bg`}XGcUibKYTi&cHFTQQgT~4DS?Mj(IK)+cSiWmKTKeNL+f~r>vT&8Q zm0?)T&+Ou2hxzwwQXOZz{)PxMtT{OeG4yz}X_=c?Pm*7Jtg?&X=j&-sfqj(&6=@c)9yx^R?08Mj&ch zUHNnFa@6wQFHf7}kIiBaf42F9aze&Bv>q?L_V82qb|=Xl-c|Xt*aWR=Za~~SydG+-*^UmpCi(r3cPo70c zKu+z90yd_w$81yV9hNxK`#X+yc)NMzY3|Qw{3+Ad*?mwm>jsSfwZ zkxM)I9W8%_dmkTFw+gNKl%Vyt@2u~(P@hHmuH3aN+>9m)sY6^P*@eDJLphDQO}E_q zw%s}7>cg-UV|# zTA%IJ3+nmx{c|b>Bfn;{@bj-X8*UyU9KLz{Y~0lGApidjqW}Lu%J^Mt%*LWH3}OCG zUdhZ38^baiLThYj_cHcA_IX4I_PzLG^f%B^f~r|$X>67G5-3iuk#}O!e~}TE_@@Kr z`(XU);XuMr_p-Zvr1!yjm&n#W(#Scx{`lS4p?i;)!(?8zm`XDn&lYbUKr&SWYWGO7 zPK%_~^Wc4dLgl_tt7vUM>M&6fAbEn=Efa0O$dc$c3Gsl{>VdU4B|UVeVj(3Cs|<}e zewx3>338i1rI4?TdYg@3ql!ogn4aK&)5Jo-B=@D;{i@`D{bu+^vm5Ig)Ce4s zup8naIZ7vV!~UDhHn@u?nMDT-54rPEOdVV;GETo)#!*Qck~@0M-RcAfZ7?uRxW=@s z{$}V#?mw34#@F<$r+I~m4`?lM=jFwkE%I*)kbqU}2vU)DHv;Qjj3L-C0zaThM) z?vPPY3HX)M$oELU!&9M?WwnuR-7-DL5Te(ZNfj3mMSvy|P>2kA@Ck;gjY_(t0L>GS z)}viW`zA9Y(*l+wLD+KS${j>p**V1@cH0 zzZ?8dE={N|?oyn(k{q5oySjCGv32Q@w@d0Yap~uQ@wC4T74Mglo0v!KhGjes1)0_w zks9*FW)k1uk4fg^DwJxJxMwF~@f~B-=s^z_JEcs>$WA5SK9+>-=c31Mvm?U;;6v

a8bL_#vv+)n=%1VhApXsR+D0zC0=rVj1oI77MK2f^8Sp>Z1PY~ zF4xBmr82DF>Mye^kCWFjPmbB}iT303copBLl>{>LaxjBB;BwPInR1lbzs2sVo_hi? zz4mQQFJ4@_Z!QkZ=Sbgtj7NHEFk7{|4rg(LbYDD2 zU)QCjk-8~%9Yx)D8Kax?@M@9dW^VSP8m+aGi8)dAyfLc{gB9roJFlTq2Mfi01rjqC zfdh^83k2}=tgj6j`>`0Uv=>iQoAtb3b1Q1`XRzBq0mCIjbkJ+U0}%{4+!YIx)wI$^ zf#&gH#xH1Q)r^EfCIij9j$Y(y&l-xWLIc48^BS#TZJX1Q+NrO9ga5~g*1vPaSr3Zu zXR(C`sWd-p@n3`2+5I$Qi$6Ah-O8&sdeON zo7<@9jrXW#4IOt19NmiS6v57QVpV(|b;xJxae~WFS{v)4PfNvPinehJmnkEN;PRR6 zo|g7^BhqM{bgEf-Yjo_?VZ_n~#pO2ntL#YDbHJ))O=TpmN5c(&hEiKG9Mb;9-C)cY zJVb0gXpRsMJgJ*6ec!COGF@wT^Zfjpmw2lEisbNYP3*Qnmba^8kF(0}=XgAAxIX&| zLK1^as^^Wh^Y&dYIwC8vTrBI)cKzEod^Qw^lh~M=Yi;cg)cMe>xSDbKa2juS?fwJQ zR5&R*qP}ZVgC8If&}_1QjWGuaHgzt@3$jt{owvd%4bDleo4bA0+|Ms zcf=^lt(xv=pGLBOGacQx%CsOZ9RK2O>f|cnkJ8*;vDVvg%UOt^C?Yp^ZOxcQvck@x z-vq03=^BOdLREo+J~mgpEZw8E81h?dHg{WVJcI2#NU;r*ym^&0B(`4Loi&zXp(YcB zP{^a?Ub=Wq^mJ_uijbosvOmSmGW74>{MefMs}=lFL^V{Iv6jNYUOUXR9&*|a&w9|_ zfyK8XL)2lr!w5DQ(BXZW_C#kkxM%i1^gh%_nBEr|4A=;XITYXl8aldi2i5`LKwnCY z&i?n)p=U3|s#UqDj`boFZ)k0De|&a; zw_*!bxMkmVy5}3rGb-5Rz7uwvjWV|zEeT0Dh&8$t?13o=hVa*E9`FIWZ-j}%`uzW1 z#~+q0pY*n^X2U^!y?#8ejTqyG^^pqMkA11u%@S7Yt3cvYrCUyNkB_|4wS=7VxY)EG zfqFQt4FayaE8b@=I^tzoielJCBIGbs;lu|f*x6*j0!mFa-G26Q(NsS zb0qg~EP&f~>NrK&EhVP;qkenIBNCNZ3js>}$d?_@EB@NsBSuwEmR*79pi;~7Zg$DNcCy0I5fo#@#mHhd?um#^E#)Hw&~|FRe8DIWE4 zV%B3{V@+NS?Ej;!8WHxi6K9h{@Nr?w3u$v(YrQo(go8LIAqL^?{Svtb^;#7WC`Vb^K(to3*j+QKvRd+ulnbZc6wn zR9!%71v&v)f~_{jm)BSwtI(hN_>SsZBJ-b)cjTnfzJp4;oiIu5s<$z5vgS>dD+?r1 z@AbAa3E!yn@Z`dj+V3{Td{Icg(y7l+RyuEi+vY6}R!CkOLfRKvXN<1u+2iaqeRojG z>cd(nK%Xy*xya@s!wlZ!LFzoo_Sy95)v&Q_neW-t?Rj%~6Ev_U-9U4*(VzV1YXfoa zz^GzAH5|`#1-i9;6U@aQzC12ZF$k<$oP!o_{mV}yK=-2-ja#-W%1$>rr$qK-DY6Dh zX$OY&w__H)F^WS9tPU1Klz!g>DG>TX4{K5t781uCLZL0qm%x2kgU)44qTO)G@J^jc=gUaU zNa4n1gZQ-tFo&%aX{l}7$?ult!LYN7 z_?H5s-KVtz$|})cnS+j28Ne^);Z1*z*741E5ve5(9#pt>4KYAQx~MV@Uczl_s`?Uc}fe! zawL|9G1|ArW5-@P|9#SAojXotwF0(nd)f$V1K!`ce zMHG0rD>2|bdRk}FbG6;mI1A-yE88+Lhnk*G}Df)mEY9Tr~#@`?t##FF5}qdQbg( zIL~rY$Oox8Z8CCMVG-MCvrfkBZjt;IDdY@Kbz+6d7VQ(|0W6>Qs&Cj-89q)DQQmKt zU3Iyq5GIGLspW0a-*{u=W!%Xy%OW{yOyGPHI*~Xpv_@4&DSswHO}l~>Sc61s`aQ(> z+EP$iIFNRwACW!)F{`&3Y$B*{{Ksy4diLV}dM{vXXttH!kOb925&r0w5>DZ_PJ2wD za%d6oMBQUslXTz% zcU>9W5swD5SHjp@(F5PS3C<@-m8OF0PQVD2)p+L(OFpvbZ>MbN_#qUD}vGnwrX5eya9|xa^j?Y_T}89JM@4Tza+v485UW%*f3B}lxDcZAOtGLO3a zYTPg;NFH-}XHZ?JlNO2H_Glt67pC-peM0+cpCl*OCV%QFs};1EH4T07eMVTO&03;}pD-d1 zmQ$0t$4=H0zFqXlIp*?aeUL;1cTr&bN{FKgQkKJF9E69I_V%ynE?6eKLd2rxLo0`8 zXcLNm*b7C9S2nrx&hF;0)B!_rS#3^c6%xM@z2rpOi(hRD)lKqyqJ)FX8TSv!pvE`A zFNZ6Y3^5*?_-XIvb=beS&rTnQ{z}|T0JA1JlGTrHel3o&mKVORdkkDTuzBJvp@#2s>-{`}NnHQR|mej4VNYQ(V1yvN866G`qI@y?P z0e%&u;F^$(HkNEHK?ZP&O&cE!%H9oczG?V_zuo!9nEM7ERXffdJ@^pMN|Eih(Z;YG z%_S*E!4DQs137_mj2MmmJ0)n{|&ve#9=}tL}@lI>^v72*C?vHYG(cxGlB-bKI zP;FSKHJC?2S%aWD0a`XN{ZqV6{@-#zRO+(J{DvyRV%8omZjITzYAR-VwAilZ>@^@H z)>3Xg@W7W1uTHxIr+Mq(WAk40$^Ued--n-Xxb)E=Ee7lRO_X-J`ls;u!%~9jCtUP? zpOo6#<)WWtY$T)q%{4YUHIH6eEKs!#mG!x*ge0_f4>@cs?iig{;G>UvP8%DelSHde z@>Q(57|s#%Da0JN6Nf^!PM0#KFqxl4Z6J{Jk=AMoLq(|uH&T$1>_-sqU41(W-ZkS@ z)S_01!)tV!5`Ga%dx+I^B-J03zO&%no8NZe*A+DM4a)fnA9BP~`i~?xls^flI@Ia2 zo;q7lDJ9*$7@GN(;URuXb-^V8lJI0DG3LtHn-nVgi7I-|75+H#?Jbitv^g2bQd#@J zBJvAO?V22oZ&!Ue(*5{EwRV=%Wutgt6n+Q3+cTbaH{(K*E^S4#z$IK$Ij2`Ep&J@> z`A_UI=-~mX-P~i+Dwsp8IAnbOu!Xgtf8#gn>)Rv#L*UY%?ICNg!=`&DRPAe>z47VDKsruwGH|lPC$YJE=ElJ%A z1o^A{^VI{Rza_oeIM0wvf)WfvHoIBTP|o^f#7n_SyeDplu57#fbDepc&W1hj0c4S+ z+C3bG4z224gq*8RbsvaKBdPy&-zuuV-Tqw?{^@D`I6e=Kz7&4V4XEF4^!aG zPXpnJ!RyZ2@_@5Gc!s6%O5?-idKbKiOLa1}%U@fTmokdoUUbXsN(|N_P+!>we7J_#3%D0P!KxpSJa>^P}8n z%EIndeAp}TB{QO5m&IO*0TGvT_-09&8K^n`p%H(0U|U^w3FkJNxuP3@^tR@I=I6iZ=%1qx8LIdb|NFX#;d)&66R zLoqw?tRGmw{&}YVAA!~S@>!ThDtVZp=JdDFiM?_%HT|xUB^ixey+b)KWspD>lT8i~R%4 zFgG!}Y4Xmz8`1QDdD<@`(OFhX))g9IN2+!1AVkr(U6~5#J_&j)rUfF65Z4j7h=64_ zoaf*MBh!Tuk*Ehip+tfK&&h%ILtI$1sAIuk2Cp7afx;3`mT!|A7V@B|-W8eXG#W|#h08my2 zwhMN)%Unus){pLepatyp0l^k}YP%J|8u4BE@56f;o?ZL$%RxU9ZkfVdjHpujdv=>} z`QPwJi$d0USQmIAb>bBQ?1KH_q#6~PGm}=b(ZnOY+r_pa(@@FmDo5q6jqa&+Jsld0`gaKwm7xtg{Nds^J&hru3CA2!vMEmoR<7Uk{IP)0Z`W=h$|uD> zm}YQy6$PD1BPQ}@E2oM7N6~pkHL-S4cxE!BP*W(Or_m8N~nSru%U7>6fr7Ss)~x_48AXo}Fyy%1uuA+9G-uEf1##jUOBYn!3FxRU1Wjx}NK#0*DyDfj2j zDg6b0@7?hL15zv z-i69_s9)z!HkJ{B3Hk+7#qI_{75`q-CR29v*XLa!^{KXt$mlCgeUaQY-vruGU*xzH z)1Vk*bIobW!bZ>$d``Rvrr{s94%Vv#uWqo*SX)gRMU$vYnZamwIz2<#PJu&dl$D-~R!o-FjW)yVuNpyw{?yb!N5SINDKg2y13&p7`{GyMv%R$fv}zAX$3(oQQz0?=}&GH2jQ5}F{vP!p1D9b!7QpHT4$rgKBspc0pDY~b}m zg)&5@p)h#n2OFuz{iGbrKbGkZYC^r6`?|d|*{G)zP*mwBZ-Z^?2; z4TFAVp{&b2Xi!>W1M>B-o*sB_))Bd_YJS_TTox7Sqvht;=cQgw6AFl&uLGON^N*eHJloGZPZ8%88R3VgCltO>nM{tzp>y0aV<{1T(NB3$L z9hsS()5YTRwn6UukPMzdfclszH&znen4Vd%<9#(GJ&=?!fch2z3~+L=7I zU_hG8dy}=s{u_1ranrfgQ z-xLI^*O@64Gsr|q1v4)AEqIS$;QZkP3jx#iU_~c@eRhybN_rkc5=eEYflC^4?+8$$ zs=Rbh6GQ?huYS8Gmw%LG%8UQ(Gpvxy?E=v32t3c7t{ml6X7IFUU6cYTZ`&vRybVCW zOR^=`D*XDgbKb~)@HXb}-U^#Og&FkLsHEFYPl)Ba8b}m_H_)yO72oT6mxcHn*j>eI zyiBnt3vF>8!$P%RCv1-0;w&V_tQ5Mtgu{i~MAj;2_6|M@#Wp|rx?*z7ax!SZkWE;$ z!41W0dvQn?Hn!M%mDLi+_Oq|vm(=nO zlY7*(7dEQ3JeJ^zg9{8 zdLV<#6hLXuD5Z|63%OrEdCQmTroEk+di2K}^i#o5NZ|4dS^ac(@mQF;?NK@ZC}A^xsr_u^{(s`#KjYLu%)X9u;xtBd zhm;UIcXYb@z4c#ReOqn79wunHEJ*|s76gEgAMh+2=(7Wt=L^KD>KKDbthfea6CulE zfSZW|pk1eR0>{gMg;z2P>RdizOenTzmDW8sgq$NhJOD#oeV=PTm4LPWU716NI^;7v z75Qi@(D%$!e%WuK)fJ6o)XE1H{w0_#ujD<1#py|F@nq4KI@SIQy}Ot+s~{oIZDW;x zD6sHA^`q?$lEYpDdt)VBs^S)*N<7q+O^xh?gp(9WPCRVG|Loz(o;#`i zBJ4c<5r+kAM=`0>%eVmI&xzTqSa~>ac=7yZV+l8usohX2{vo5|2iJZ+=57$WL8$VV{POXfvqpmZqRz2CybHp)a)P6fqA?Um7uT*WTq#V<;WT7LS$Qe6&wOh`Iq{tkzgITR2*lf88R&Uol2^3(!7#J!yLE_S|TwBO=4=(<= ziS%OM`0)muP_KzW?90tsHA8ojJ(S~uagz2hy|^vSOUn(aev)TQ|USb_Cz&QF)F3v4!ZAb)Y$Qf>|3Ca*1>}qz}j1 z=C2fghQ6oPS@b>cWp&)F^}K?uy#>#tb_@F+yq5Wdjd*cavluWE+hkP2>^@TMQ zOt*+Nt~_4O5Pny0{E@#QJDZd4g=6#GJ`Jh|MYT5mCWww6Z9)91k3Gr<9J7FKpeYW| z%$)E1(Yc@nZn6TS6_^R=#Ry|vUr>9z{8RPCQ#tlyI%ehOEfDMByC;O;uCZm|z!=>d9G@r**rZ5(9|KGu8d z<4{-rBTmDr!q{sJ@!uepn@h>9Z43%?dFhkD+D|-Gmw6iz zoN_tg>fbXTg}zdDmEU#!EA~fU8|USMZCda(1XA}YtXC+Zsc(ESf}|+85t~e|eWz9AMG_GNwAm)j}5lj+k1()M!dB}aic(@^wK;@ON zSCKJ$eR4Ac><%KhYQ=hDm5jb>f(Q_O{>9EX(pT?L%fnJ|P?i5z1$18rF5~%@W#7lv zKEnaSjmi_2zpfFPDk@J`6Xe2&D(+>u2x z0Ipyp8LP8Arfpo+-CouF{x)Ee^NKaIYCGc8e-YJH@bu4qnR~opcZR8D4m!SRWgAbm zXZ6=lHP+M}YC&Qv+{XZK-b-wdDs*nzVjl`1l0$LP%~LxVl4Wez@Zd`_(9V!Pc1I_a1%E%DztE zkSWfUN%mWYaW;xXmrd;{ls1Ac;U#?s@mD=?xA!islSu*QIen;85(PzbD-b=;cf94` zh2b~XxkjJYUHIVbK?aM`IM?Z{^Pm-EtW zxVD<5Rc)Oe$^~SbPix~({pq~gwlC(4;}vdic4!LdQQ%hr@RSL>`bkA@t_OMBAj<=gOD|pYmscX?0a&Dma!Gu+&tdGb05Jp*?B-so znBU<~YsC{ti~2jJV3{KDZ$O>=a?)aM&Ag$DSpGBebDkW>knKzo%V#x2AGMZh;{4Oj zPJ3ayxdObwDsQVk6T8t=e-W{<-MP#wC$FVVpJo=Ff4MJ$VEi-UHp&av=%HcUC_O1) z2DE33JmY=BCebMB@zE_g-Q?L-5z4DyEa!goH=yplPvbUtR_|GnS8tZx7I%cKT zXn%CkZFlm#|FR)|L*ka~&WjI#0IXQADd3q3xTq#6(1B~xjj!~oJwj>%*&|6R5sT=8 zlF+(yVcH1d}OapibYI=u{2jQCIiS=YemU64Rzrq zwm3N>FWQV{l-B0=kYu2U$K-4R?NpU>0^5RJCUnQT;=HbqbeKK{0>84ZgA|ThlZDd} zVo8{K-j!g}5TjD+w)e8g$kEf7vnwiu3H^NzG#PbHNYNAaudylk&dBz)doB>PGvh{9 z6B(im_d6aVchSI>)j@IgCwdH8;^V0!x=R?DPu6DrKrQ%^57x0p1?uyLIO~v=F!Lvt zO9D+%(6l}VoMv!KiOdghnhw;!kkA=M*@*wr2-U)Pn7yh!>ufrVetg0eV*G6kmKAov z*xmpCiE9lre)zMMIhr|#UW`-qly^Rw-+6!guhlgpt&2SQ7%G#P{6$CU=^!M^|QAAfhJB1eCrLWqx*>! zGY926L1Q?Uu5M{U^X>BS-t}c6i*P}x`#L8D)qaW{`%ptkFZED>grp>x(tPr5pvf>KEelB&liEP4x=Mr(bHnN=RrGW$z{0Je8p{|trbN^{6^ z#&Lh-`0B_Sh4NNiJ8Y0Y(2uC03|ijzkK|G?6t{yb)@B~5&foQ)qS6a*Yn*JPSs8LA z%X*Az7kq&2JpQJ|GB;tm4Q=DGBZj!3Rb19E-0fAYJM$II%WC?)Vq%rk>jTVb&G-)! zy0(^42T#0u4_AgGiXJ8EgY18T`p1E{C-z1A2%@r97ULSzse|TfE#}ed7GYlES59)4 zIsY6S5A`+Fc+{Tp=knO|;U+iZeFghjFG4DCv{+(n4&Y7n6l7sn);1cd}rrex$TPR+ZB6{fg6#s#5m20>>iH3GSz%2_a? zHT^vH$(>4H=V8$ZM)oJYuU_N^n>e>k_mHk`?$xdB`WCVe>|phXK#O^d^Pbl;wvL`A z41=rjV;k(q_M5gw?eYudcq%>G`{d(sfLqrl(KzMCvI=xXJsu};4=5ukbjcAK@I4=x z^#q0$KxQ!m`H3tODmaj1Fl2hcU7}^7Jpi`c9Q27Ut<2j%UoN;_?#N^I`7OmmG!(ZV zZlG#+xqw~}@SOz#2hU_)qszy<7k=Eu|9Kr(E1%;50oiiX<%0CZN5;;^!+FnmS$Of- z_SA*)TY}4T-?Ae0wgma$hE8Khr0pa~2j528hE;BV02bm6u&)Vd6ydL@?-Wq5pXRUi z9xR|B&3g>1Bzpg9~jA5@SAVY`-8?^dXPhb$XGZY<@s3o&v9DHv{Csf zj}?=Sf&iRln-SY_Q4v>sdV4#zf%9(EMQv6V)zOdcNW-of)$5eq$`$>Grl>(CxyHS0 zwl7T>%E^5pF;(yk1f@>k2SU&~mon6v2|wf?@z_BU@T(ql!ieBMJ6Cm1)gbJ@s*BTa ze23<6mEW=4#`xl>$O9h0i|RkE^o2-ofXVu`nPzZKJcTOUyPVJzGozSAENKceD0Kbgd-=gr)4`|0@;6LRbp!17d|>X_+Cc#|lv?lVQISqQoaP#W%^4E` zBqP04rlQ+ly*;?T>Y%=vdlA`r1|1lNVy^}M=)WeLkZ;88rV3bPdwf#e$qi{jn~vy&K8(Hi);ipNZ!iA{T}UJ~ojkN#1m0DZueY zHUp-0@@4te(Rl%*x(8Jsi*|u3VCjzKX`catdw@^~ISNnjm*nwmMo_ss@aQA{+KO&> z(dozgA1ts|DU4&87v16o87{vHsF@c%6)@^YH0SNh4x;L<>KWN@3dYv~n9Bp>g^_wC90EB|NYg`8yqaOKE6vmW;s6khmV zYBlDGn3R<7j7rWm)K?!=cOCY=ogBrj8C>-$x=rA1zQ$5i?IqnkUKW+JpAxnKZp5O- z(U2q#W**Q02c1Bd&5#HM>6N(1X;#{}N_8-oDn^j0#&uq?5Y&s~$gm8nQh3CeQzYx# zkb#x;EaTu^!S&Cc)1fo~kbQ=$`$1&A;iuLqJ^6@yerl1IIj8n#Diahhw}Y)IO&Het zle8Uo&nTue0Sok*I;fr&@!k`6kq*!71C(q3wzpN~(p*inNEKU^>dfT4jw>FA+Ow6W zM-Rq0n|8eB`ds^By7Mb#xc?;bRTME?Pn9SHp2e2a@Q%*2`EN-))iPhGo;TrC_66{$ z7$@CVh&@`?POVF99~g0-ha(~P2;+ZAUj^2|_h*QO$?P;hhC6fp{;>76a5x zETS7xQ9YhrsuwMGH2vVH+j~jxV~FBJ0Q7LrFc63A^4A-8vQ7A__ zEJvQ>jBg)qdby7000nVRkfGFZ;5`0!s(=TY?g_i_a9rK15-oVuMC6mx14fAxTBqzV zmPoSJ`gPJ;{fG8-Le2$k*Sz;;TW|%PK3EHOD#^o~?bY;jtGmDE6`o8zqw@r)M7bKh zdWyDoNl8GI&>pTPrkkGJ{f!$BpG@|0xneVDt!Z<@Zjml%WVG!@BlvC86)k{^BLkh) zV|fDl>be6Zqr%~Bn<}5i-hbS-2b(nwU|E-y0{c%3qysLLlnY9hJqo_&DeaO&z`8=Q zZxv&1yu9r)?he3l9i`}3J(Hw>=5%=dAo@_w%RP}cfB^tXE8@?5p#pd4z`sV|&~6x+ zf+b$vVb|HfKSW6|KYePC@(k=x?w;udr7n=i;S2joku{#-XSiu~=jbhU<)P2t-CtkNR8ybrYq2V3;# z)M8m1E9Q9v`qVY*=@X8b_NWtn2ZDw|^4=`q`jbP|KPpg6$_Vi$_n(v7_1U%>eGzMV zZ@e%AQv@q}ach;SY3_=Hj}GHPX*S}0Z=CbHbB>_CTA!(7U)1cDjrVXv+bjHl_uABf zLd@#D6cO6$5zkH2N?;;jl9o*8ho1T!fTvabb{GL4SpX8yg=2<`o+>7$bT-tQ*PnU_ zG^vB;SwP~l{(xJq3<0E<)OH?;VxPN3ZTD6a%;+k+Uh`1vyBg$%pPoRm*DU#(FpU-s zM%<$CSk8yY=?nss$>iBWfYO%N8$u25Py9Qs1**N+XpE}XrE-f3A3fV$8u=F$c%0?z zR2_0FX;#yh52ewV$x%wY1*ykimSYUdp zCc8bR&L6;6A#Ve{$jfA2#-dNDofEdsThurq)_6%8;wmB-!eCVqpgyAidD1Aa`$4Y2 z;XjoF>gR0^fxjFWsg6RQT8f0o_!&1dt!mqG*abXvk z*(=Kq!CNCnx7a^3Rcq-k^sTBA)R(8N^T;l8AVJBn{Xyso|DPHgy!1_>Pod9XlgDls zy0xk)oyMePnml^6qDBub?9SxZ-KdDiys>@LgU`bsDF+w96ZkQ;RW^9cR8Z0x6}cN~S8vT)B>%m>QCS1cTcnNQvKKZ4x& zNTg&Vn|-WLS%K$oqounk8^NQFd!^p0bok5yk{0vZ20ILD@8W-uUi4lmCcfyY4#PfN z=jCB}6T>1Sl3;NhX>X}LwW0Izon%Ws>Et+2C6St*phlgTZwogLCkPbhOwsv|K3I1- zG5AtiUVV7Qjk-j9+A*eW*5r(P;Y20;EsT4PGszr4y)6wj6w}KpFh{aGXRGy?reW=W zdc^c7VW#qL${FT3aWCTvm=IlN47d5ELznPx?r%`=CBCA7!X4oUpZNgBKpnh+fV+ny zE}*wxqD>t4Sr>GXV6Z)iS?D8K$@ftSmVJo|_$z-=l3k*y-0f|_0+f{>t9#V*zS%YE z<>M`zz?wcjsAd`MEEk$Bn#xPUTI zPs>l16^)B4T6?Kn6rzz#`n@{~sI361IVga!91H>4JKRS8tIb@pTWoc!kbg{i-umfp z!H}9@Y&D*dVMT#Pqg?8+e5G2~H|=f_+0Si5%HC@va%|ye!6=H5Af1AABJH})V!rCkT7GVEDJ%xt#* zkiEC}5_qT-a0!fcg3O8IAGbj*vXK1vbU%sj87r__kR45L^v;iq?=iy`5*-pED{Xg> zrMQr+?q*6j<1n^iG%!Cn2UB^7z`Q;9el7Q!$fL~!1`~VahkG0MLTRewcC2&gxw15k z5x1Y9bqElO`_gk7D+xq4;=~6GhfBZHuPy&z`-0(D+R~eN?1FXhl!`~E;;^LhZ=5F@yb!w*RQ%zT!`i&Z>@ldREue&(ghyorsm7rn(ms1+`4?pgb*?|oU1Gm_bD}vB zEVJql+_0P6YNPt!^lkg9Ub5V5GwLRt@)JSS%79-&;J7|CIE+W!@W3s+G#FZ714xoT z9793=BJRA}-+Ro;0pty@5AGf6QE^s~yJL2czpEv)fwn;_9BA-Z^u`b9H*%PBcY@Im*d^$y-b&Lh3~2qe``w6sBIluaipm-eCY{s@nPXJ4+z@? z0zOx`@TvW34)5`kv)*J>j-uofJ_zQqU9*uP>w*;Q@$AM>;P6N3;T1}gWl-_7%9S+e zfPZ#8Mo}j>Pl-jht8Ssb_v+A+7VhvI+E|C3HPC#?HSXI-Ui&HH9p#_$Bt#_`w*l(x ztUZSrqJkeJ0H064T(QP4wOwC|&L*N^ZvkyYJq5ptjtS5`uX_G5X&nE{NEJ}Qb zb84X2o%Rj~y7~j-hn9Oh=Vh6*YahuMS-)D>X7Boz2}lfu@_Q)xYm+})Yi8sb-1 zfV-*v3t*Qt{?SrJa>DJcOX`O+i~H0+*84$}M;6nOn{31wRpN|`O`dJ*8{x*-yp zI-0y>qi$^H*F?DuVnz3h#fqfe&+?Ym^0@6*Rg$j>b|({2a6jrSGViTS225zc<#_Qb32ZA_WmeXn-)3(-fr&*JX16VOxiwz4ca{JWu7UR^% z>tPGKVG81brGOVj@->KCwc{62FlFg(0pQfyjXy|Zx^HITML&ZMumx9QYKkK5`Kn>Q zzy?w*-MC4#t)6wYgdHQF>y0T9U+^N@W#vb#$<&b%k3c@Nel~bSU!1yDetZ21$<;pa(PGmC)5!84U&Y%i@E6_bJ&q zM_X7JS@p@gxO~-DKV{Um1%`b@y2-;4*eD3K($Yco?b7e7HtxlESqS*2vN4W!zGqSCq~DeS%%$b6Z|G8CZ)Ri`?;p z3NMFiX+iu<(U<<}SVeG0os?W&el2@{0FC(BGT07l))utk#;6KU0C{pGtC*XT71!Nr z1ZsFca0k+03gqrQ>K4&`KB8j>dHj3!9VT^R^_2iL0sC;@U$aaRd~=u3HBZw4aTce8hDwyP;>(mq-u}Wda945fR+sQ4s}5EiMB=2Kw?j13+qMc6jrg zJXyB$I~G_1f#C{aX(o%~oqdFK5SX#7E6n5)PWEkrRBk;7cT|dU^0BlPDD!pa5`IBNzB!qp6rlf}V4ff|T9!KLZ z@q%#4-urtVPo-+g+QJ@>aK=`gRy$;A>6-f{ zm_JONV-Ci4GtFV{VBlHqL#Cr>r85%7pv8ju;ro)SS_sRgWP`7sj{ICpA&bZyWZ^Zl zk49N5_$%bpW*ZMh;5HZQ#*8fl?g(EMenS?)^;b1!c1wf_lC!3MiKK#V?uN|NJ=^eE zp6ohRnV6EfEQHnhOVusn@V#H}37Dc>%}VktqpKjRD8c!D4R;@NW}@ zOrHRjmK_wk2PTc&L;z$A1j3y9*}LXlEDG0nn$1(66faL17Oi39%CHor{emQ_OtW$Z z7kR+=c-1l*i6-hx=Kpv%xrg&9!{cjk?M- zg>fJrg*sTwQDde1pFqbP#13*J!!b_u@XG0$6Mp{1WpFUmZyddl z@r4KIj~9d?Rs$DlQtQl;;N3D`9nclQMe+zjt^PM{iJi_eranY;AdS6C%rRO^_$DiZ3;Hu}SMZ!)*xZv`*> zH%?}O^ubyb}m zwReY>oqu|^lC=g#n_}_AO1ruo(>cM_a|e-7-nfzn-+Yv?SEkv1rl+SFJBsrQ$U;%9 zPoJY4x#4)5{GwnLc%*JS851LuB-|-FC;|plGD19NBTV*E&8%?_crSe$K=~EZ{?5Ye z!0{prK**VZfIOeCE@8Jcw#9#CrYSgQ(KkgPb_g(i4~y58IN!iPgI61p3|K%S1)d%P z`kXMxPaGgJz(12Jz>Y9(`aeY~(+IjWjW&e_!szy4TTm{|SvmKr0mEFJ><`RIgcQZp zkg)$txaBQpGSeSmkfpK3XKNr}(F#aEx+Fi{yC7FobOJ0GRDn#TFZbD0SpbwQ+#8XV z%1*}{6!h`Vr=Tqe9>6M!bspK;s7=Rbk_gy@8&ITn+k|ce!hbQ^_ql6;c4`lg%Rgk$ zZh^lWft6)-uKEk5dqUGOT0`v$ep{Je{ZqW1<70`8jMZt*IBY^3Z8 zS}{b(dW{Dp`qKtMniCDFUkU0vp>$p zgxa#c@nn6OsVvgEw~?I1pzdCCi}6AA0bcD88yaK6Hq)RasBWz^Ng1@pS{#C>CG99z#gadTSc&9lwYh!lG-6t}o16FUhQ4%;T zmYtJ~k~duqr`ei)M@65u(5+N zlglykM?2f)(hB(lH|?}4^JQ(rXH7MAl48BjJ?-4J;2hGHkh1lKhSkD!Sr_f_oZ)$} z;0f^KOV=IU+sU+7u` z?U~FmngrNfr`|Vm6LJ^PgSx2=c~7wM+wphR?(Pj<)jU z6>MEuPvcF|c63Gsyt^CDroI7Uglj`l7#r}ACTRuiwwKgzZGFG}?{4%Zov6^%0iSQmUS`&NQyFNv_gT&lLkQ~YedN#vBHE^FQv;&JI0+OF> zV1X4r&q8q9a7^aZ7q|yTJUi|Y?DL;!_tb9Q0p&aaxog2ZFQiisIE@!~e$>zguWJHU z8gjYu(rbeSwI!+imx4epanl9nO#oB1pP4^{$Q>(f)nZ-4|M8p`nT#u*BD~dNV|mL9XYLmBFgS#DU> z69M}>4T=LO6@uBy6iSQZp%W=K$1dZN++)_=I3*J+?Zju`Su2DH+Rc$c8f8bk@{wS} zHaRUFmit-VSfW?9uxF_Db!p)YZgA zn1ZO*(LgI*cLni!2VDEqm+{tLaHR$UEgst)k%H$ch5*34fy5j1R8w|+4uCHB&1gW- ziA(|21aKFYQ>*Mo#Dll~D&4|F z9U69*L931pS@iER2vllT>OU~B@?zeXYE$K5=AQbePw<_L%mKGfNf)&*tPXn(YX+Cx zlsz8sdrV%4(si}#54*&-xodJ`Lr?hyckL(>GR@X?}$S?2V!+yo&& zlyNA`rxYL&f;zq3fh3|d8Hzu#Ja~ZIr9HPaSeKzAa)iw~J(W=5n7wYI44OOJvvW~9}UnRI)?2ku%Xph~7xl^=sSXzFM!5|E+4L2^J_a>|jK!3dM6 zToJAmsXMYwX0Y#~F`jtbjVR6#sV~x9YNR|vgR1lS=l!L(S4bmk{J)j zzXiB8*G#n?V<$kx@y;!Z`Mq!2BaG{|v|P-}nOgu(sL<#){L2f6Zee?XfVEhuF`b!t z_FcLPBpJd=QV5bnBOqBDNGE|e++dC$7O_3HJfq^JUlOzN6j^V9>VZUws{W7JrK8q> zG6y({6KSpm@8<$OfMk~7yZ9{q{lc^KK|oY9k~vP7Kfl_%7-#U)Fr7hB(>ex`azOz~ zs%^KT&W59g57t5}@GLL8@W;4@4;1aDa~aYsb?9bV_ixJPK8k5YA7Ajnug7ATBS*g!bx z20rOQpuX}p`{}k^+#Ps%5$4U|ZjJA87kEPdQ4O>&m06qcJgTYm^G`giiTalF?J_{g zE%@ac(Pvn`l3Cbk0w&%z1m7f_&;tWu25=^kAeoa?8_OR;vPN`6AlftMFFqhqN2Mta zMN#j$9cu?#KU;bwiHe`^sISnH*#NHSgN}DulJ)lA6~TBzdl@?NWud3BRR#qaCNVX4 z#2NQaHWdWK|X!d8dl z+l<3^#fO^M?JnhZAG)Ds!^<&7x?RJI7s|(j(jzE&QYWEhHe;4_oeGms=aQdH>a5CD zaquEko|vF2M~(xg)>mwhE()@L2UfF*l8A1bPB0pXQ|xah#BMPCMF!(Hk$-BTvdoMWqhtu2`r(^vkMKPTbeCQf*|fnE_* z&^8Q`>{0>7m;EI_J2Jn~m+lx^JN+@@e8nuTykiWU-u$FEdx%t?2R?FJk2dBr*&pwB z+c2SLQDVyaaB6!5NnF#15*q(UC(d*+DFHpgHxk0}$8EYd6rPlWTmCt3mz=xY+`ha_ zkILNpdcpL3*li`(VCs!LS#pl*?sz-U#Hwo*-YS5b5{p{NYM!WzfNmD76VR}5ToG{I zTkO4?VeLQoxAax7(^oQPprynPiYA9?D?G4NKSN$a9x+ZHa-1FLrjDip4W9-^V~v53 zaN>Q5Z_|zqz%&--Uad4@Wq&y5)-`))n=5EP@+k}WUJMkv0n_RVXKUgdh--{LlpQT- zB_h*G_%g^$XfUo`0@Y%KaU3nk!y4GobQ;%Ga^u~^D_e-tunc( z#XASOUsM&&^`||p+2=#vYgShS93z`!WbW!$VV-z>itfsdtX_f zu#cd-DwLYFNZ6NQYIq(?ZWrEq^+3&0=jIw!rOHU5_ABeIGt}To{dj7ks{PIBQuQ1I z^XN!p?Oi}?4RG5VdC0;u=k?)fH-I_k1N>12TJvxSs?p`F3Pij0NCf14@D6k=)sz+W z^_jJz=_>&^J*JTGjSjMKfS&>|1t%B*N9uR0fp|Un@5>tU5AQ)FgFAoqAP!j0{8!|< z{M-q)XO3&l)GSHl3n=+jH-Xk68vklBqwm9)_!}Xv&0VoEdl2LKj*iM?DM5dM8`ZT` zcY4aNsxg*PbX54l=ev<)1$tv-wIpkY6ZcTC-Zg+AoGz9w3lH>hy};D?*sK&*kMWdP zr8Sm1?pZGGY|gi)5Y(cTQy3nOKCehSg{|DvGc%`l9~4eGMiAhP_VO_m)&E2HFFXbT zhH6vYGIT#aMe%u)muoQP<}y_j6f}WXCFd`g=VOc8_$(NK#MLMfK-@X-kabID7^o@VD&gJg*);gH0)|NSK{<#0zTiIa6 zKj(6D4{pwN>v}iscf(?jo$aQwvu8JMjns)O)A`%R>t*9!#)S)B8#UJ1U+8Z%y`Z7+ z|JMM(ASSr%5hXAI1*SRxw9%KJDrZp&cOE}4sM__Zyb6d{`w!C{x)fI+3iLZt@@-GB zb|kfA=8=<4vZ-_BB^5zL)v5Ex*^0(PHCFm*Q=gvirQeI_<((9kG`G#N>=GW|d{eqE z#JAqq+_*PnvJAh)!R3}#G|8#o*jlhFt;C|V%B;YwTNcPX^W~N2XGKN+9$j7CY57@p zg|4JuaJOzP{oMAkhldBhUs5cfl%GY_G<-_ZbdS+44E8qHXL|)%uR7cxqC&S?yM23y zmbK#FU+lc~{*$)&*J(#4J4<#EEs|o{^#kW?-!naP?jf)^Eom(8HRp{D>h!8m`G)pC zkG$Tl9-T1CJR_ln>?}UA#olvd*P&K4Y?u?!I>x{M}`H zbP z2THj?7xpp3S(~2Rys$Q4Vh>XuTDmu6|2K;2#=0wNWyaK?IGq*Asn!2P_xBZkRgZ{n zvkqz+J^JNC#mWr%x8;xf^v$O{^A!m%0*37tORvthDIM{8Zg0Lu>deD1@;*EBu2u9q zw?G!9skSLWQ8O%1VNne!O<*LFf;W67-JZYRx>xB=fX5AKz>$A!>-Hg?>squ{-o+dK znk$R^J7Kt0)olj-EHYg5PFz!Ve&?UbFVQ5pA^hK)SWij)Wfr-%ZM7eLVx;WL*~JfM zC+@NPEq6!79C)11XKd@9y?iTyw`>p0^(;{q4jnpu%)?&UA~oZNi?`v+L$B|z{q_5S zVe92B$sZo3DDeM2c0dJAIp8StfAq#0_h6qRpj?&P)HV>8_obx;xwAhL{os?;%N#q& zR%64UYbUgK9x+<=wk6@+$Jc>{uTb8iX%u63@5{@pmzJjAg}%*)hYW))_pi+Krx4TH zLbkH*d6NeqkC^{)blzW0Z2#AvBoi_T0a7TT2q~0+AOYzjBq8*UsE938u>+z4qD(@7 zPz_B1Q9@C{3Rd)5LO_b5(p2!{)qv=Qdo45-l=AR><_|bO%vxuiciH>3?Jr^A-ov^` z0?bj)zSIm!@kbkdKIjz&H_yUU&8 zlT)WtZ+D*)xJk3}&_Ak+i=Uq#eRFO5Vf0K->UZ5w-#iR<8UN3$^DpZSxCiqx?QSKC zst`WKrP##r+ALIrHph3@5wRuTo0RMOkS}u!a@Befn_p0Vp;^kNSx@#I3XRzv7xOvu zZhqD_CJt*Ee&E6P_uDU{tq#0TSa;#b*M@%d*baubg?%6`#xhQ4e`-qhzn*y zmb(j_A8_9I>iaYHds1(2eN`9f5#BD(4B{%keskHBYYX&qm_{h!kwqZb82 z(;8zOzc+E*r}1qje0W93PWDdX4NwVlufgaherPKbX^!%Sc31z_G#yNiIFe~>cOzv} z!EwaWw-(lU# z^_Jrru1-{7Dunn|d~k@7USw*HDSPDYT>zOmwWv6%`4|1=anhEz8N`h$enZLK)owv%`B$%{Jb|z5 zZ*QoimPW8DHA1t#+{t`xU5U={HW^swA45fW6jph}U z$gXatzKzn4vAGD;yjq8`%ZG=+ORW=2Bbf{r1Hq$F`0tnEWtU?XJGwfrx6b@p9CHAB zMYw^(+vUbA@=D*C#t!R#v{5H3ZJhll7b_CZxM8RBKmU9i^?f+%!@}{=yq9NV*U$X9 zSoi+jA*IU{rwhN@vxAj(KiPJD-`!KX>t6ex`Q%5`Dlo2E22?G+)rQ%4b<$3S^-!Ol znp6(kpiQnwef#L;(xcb$n%Dj)Bh?A?_dHS*NuhnyZZ~1WWjBRXhwerylZ+fzL zX7xp422;S^aqu(!TZm+4lYMp$y;dWa)R}wb@ZJKC>(4P4&#wO8jz^&}xA&CY=+L#- zqms&0F?#WmU7bq{59dFpJpS1nlRV=9RIk%o3{21 z4_^Jdw&(OtTOdn$&_C*|ju$^X&_LBG*>{GWltB2NVGhka(cjfh0q%)7)LM#!)n3aoA_YeGC^HoUq+kEv&sPkY(&laRe8#) z704pv1ELLqt7adj{`mO46=V5l@%@9%o%=R_f8P)-^0JTHl>5WxDp|!V7 zx0^}b)~#!^jlaa}3BT?s+fHYGOKq^$uHo7hPdXR3QY!xc z4}|q*nL81Mrp{ITjEDRpVui+Q1pT@wJCxk>WZj+ULj~h{`QU?iFn5x+$!Q&Hf`hze zRRhlHtLNQ6$@MxoDxtJp&T2W$iqa$CYDWIexET>8)l5@8h~FvI!mB{JC@j7=6W$%v zj4>kMlZ^@p&tB~lu?c3xMv9%98qH77kxxYg58F7k>72{Z!r?=oo{!frdg{fJ=R6;; zDm&bJnwZ5l3Zhut8tZFdYt$(2&bsZ9KW@j!1HGcYP4*XqD7dZ&rS&1e9T}SD2oB%v?X7$ER&DHohVbBsITaL8W ztuJG@mC=+~661WAF+?61-1ao6ukX1SR@byBtJZ7XS~93N;oRl)mVp=VC2hRQ&1v&; zURWP-CdL$U|4Z%)>B2V#hCiCPuhxyX!cR`KgN_6s7FMApN0qt)!5u3Bbr}3hmNYd4 zIKjcQc7pM%!6v^fxOA4d;v5O>W2p#sJ*(T=#p2Xngk3#GGz}{sN3zHz>JPv<1Axp& z3IQ02h13Cc6(AxP&}96`aC+4D!9~9G?)id3Epure_4DY#&8@f@>@gT(Y^6 zdNFR=TytSrG{lG6lVP%G)`-_SN6HcHo(iEr!y!TzMdKP;%Mj(BC(^?m?j))HZ)K+t zj5>+EPHGB}p!8k4?Ow^%gmRS|oM_X1lKNF)3w_zi3AG%d{kvO)d8>>EttikCS|wl2 z2Y&2mKaxQ5Jk)Pxd7D>ImaLQS7a7n@+(li%Jb5&!bcElaj3qyub@p$H?)Vle=N4D6 zHKk%>aoXAPjw6Zdwsj;GhSfL%IXf3Nu&_j{U#id`)jBfSN5t2?IJ_-%Da`n&!1hz@ zfmkMTjc_sVu2aL^C_VTPwLT-3IplZ82v9XUG0U`UGm7SGVPf&YqMEUd2R>#Ly zZ|PhNG-+TYJQu1vL%+F{Dc&toB;ig?ieHIKr#knmvXk)&^ZAOVYWNKTt$V*vuZnO? zY;k}~(YfA%d_ROPZ69z9mdicsjJ)9cfB$0}EX;0LA2ix$fSRj_RWj^qt=d*34%tqB ze#&W-<1pct`R-IFSXgZ&O@Ng2`A3NHwggjj#mZ#z$D5~l>PhCXK~rt7?v2$xTWCjnV!b>i zQZ&5Vlze~fNsp@L%Ik%BFGSYOMeDvvh|xWJ!R030#Wk)dvl1Hz;pNWNLlz_mYB*D$ z2|e>Sma-GM-o8QY)KYr;qn=voMAo_rw4r&apt`k>o4N*AO6e1R&<(Xu<7(d^r0)p% z_$0jPvSj_9(*UwZ^`?HTac;2XI3~;=^6T+X52BJ%sV~%GMkV=F((WA+uqPYwmOyvA z$9_eXJ#*;I>5NlVC=YPxL$x;<#pU^CbiKE{5TYTKhiw z(b71jSIYmfO}p#7Go9yl1?8_AOT*WSz2i8q&md}?g<(0DS_rlG>4B|=(q;g=u!+NA zE^eU77`A$}vfSHIk7xd0ivR>#7K;Zr6NsDp(yKTBWk1$)^Ejm4M-UJ}q{|JRj4IwoV5R&-fd) zlS%8;4>3NvQ={V=oFl7@%-YCQl{pEs(E*N@Wm5qO%o#O&E!fuKJJC;t{-S9GtCVdC zANBGQT(y3@Mc`pb)Z~>k_r_Fw(F4;~fFG4hQBAPHt ziPbjo=~?Ga2oPgzutm%!ARAzqK&7IQvo!uS`^j4tY5z*U&RhC7V|h7Z%yM1R&h-4n5d$D?V40;dcG8)e zzLYnA@^RV!QI#YoiLxyJUTY6woR`rH>=EYrZiGg?`=ee{dB~m}uMuf$4%a1hJ9(Qk zl|LBST&r^x2l9AiuXR)I$UEY_CCCemLKtCH;J@-GB>?G~2#*d|sl-ZD?oCaM@XrRh zIMc#9vIt(Nd$TobTLe#Hv|a*js~$j7C7cI;Cp9Tb<-)kaN(8VS*{xV4m8!DvrJT4E zgu5|n3ny$)e=)DEo&4pDO#66j&6bbSlS8^FJMm?gNJgMFVF)+~r6ArQm&7&#s&b5B zgxmxusA;kvytiN1(F8 z9d>hTgP6~M^kU7^xqG&NpN|%{yjeU`)c77U_2ELSE(c zw#5?CiYeEcJzYORKhM;&4$#%x;t8=%5unwZZpAGm=5UJKk(4w?bhX9aADxebM zq#xD5g&iu#0dW0YAAo>|l@i*^!49r3Os8`@r#807# zH%~bF&hrM9)N9i?>}8ZOuG~lT%6I8o#Xj5AsW>IUj}wd)_5NhOZ^RC0mL;(mtSL0E zxv#Z7R&9@qo?{{k91(PwqTUt{&OuDr?a054{h z1}-aOxxk1m1yVMhh)rgHRsl1j5%X>TJWo)xV!eRRjWpTS2r~9{!vjG}9RUP&{u_eC zh;y=57DAFQj3l)ZN?mD8LArgKOnv-C4kF#8p*OPvEn7x^Oe9W%W<(DrE&j#NJCk|w z4n?$+MS89NhIUo)7!Fv48{x5)EpShwYHLgg`gr`DD&(a!u<17gQW_GfjEhsw9Qx;F zbYabHeq&`NsyZ?X*o3tXZb@G;y)PSA!8BU_HSy`_r_m z`kDGK1g?D%jgDZsZP;sw2@Vpet(iSVP*~_2^4y!JJ6ul6gb7s>#xLa&3<_m`hRiZgin-{hT!*?%G2D zmZU-l{cuVaTSpF>3a0ggj8*EpNw@cXO!hva^shusBKUYebWXddfK?u6H;P3Ku8{{7Mw!$XUg3<;<3lZI{hasDj{E5*jQbJKd-N&= zizFSQoY)BMb0zSu^KPY&B~G#2#5%>GwigH+?^RTQm|N5?Xdi?;hcsYNZ~IHFLojzB zm9of~WdA}iPUCn?fdqCyo% zaEXx3BLwpq$oFap>lM?27fyCS#ktQ-=MaX=76F7zz-As||DY01wFPeshmb3!|EZy} zmz(LMW)Lz$I>FXjDSG$-5LAbmJ9F*BShWiPI0B2_n4t72&fc*x(@8wkBNS6@S{HjTeDQvI}vB2T|kP%D>ywVJ72TE zH@%9JET+A7voIHqQ@0m-hzLXhqHt1q3sCAS5<@cch{m;drs6%f1Lil`6;wg*0`Xyo z1ugBv8Vs?@BW!E(S|L#y806LFH9)eEEDoVxzA_g*1?H5QFXVeP_I9y$2al@_Bov{uK3ZVe-BYT#&2XT z;bG~sid-=2P=5_0ij^Plcza-9x7G{+QK^~pAfx83gmou^wD!xl4a{5oX!^^;Rvw^( z%$zWly?*rrIYY}l_8V%wrj zIcj;~nC|< zQBf=jj;~~VEuw21=d|LY-f>M}{ALDCj`9h@)D4tHGe_vd3h1=Myr#?rMLt4^FnVC* zy^jk5fih>VYjgB@i5pXJTCwVQ_;wL`lJq)Q4s-9ZMslcG<)5^DS?aXloaUoGz~Da? zEtaD@Z3AZ*%5TozTKo2all$X~L2Cqo*yCgEme(coHJ3A)KIx~D4tNuAEhX!ZUdYCO zS!3h-ZZ+0Qo-EE|tJM)Lgo5Q2V-htrYggZ4r-EMhV1;7gWP2-KXi_Sf2vQUAfoIpF z4+=7i`}?T&?pj5ADERAEDYf|h3RQn!YF3VIR zD;^V2!YEoqhPF*+J_=poj&ww@zA+)Tbg{)&oZH9w^ID z1rN$($QS5$Ri2wfDjc1e?evatXTyu`+TXj;zX=U2di-F?z=#=at#%vyQXNMX78y*D z)mmMu_Jc;S;w>Rp!LOwPXgkp-uP)!wraxCD7UO+h#%8M?(i#X`L?nlVx7IYwFQl}a zA|5yD8H-b}p9P@3yS4c$?QRUx*-ihk<8?qSrpaNvYGduL;`#UqB0l7HQ!x8f7<*MT zZ*vx>f+@HGuwhBOWN_{60eS{g2MECq>^Z$R*` zmQq&r7R6${Isb$lUW|lOCBQd<{%<_CfeQv{AwyJM5z}QRNS;1|?g(3=@c+_It6pa-^DKO1K`5yiP#&O%Xf!1NNc=#=xr<+Rp40tv$l&L7%LapA-itr) zN>g+a(4+3$M^yocTCw{!6y_q#S@<+NTW0;LpKM5 zOwRh{tZXYh5P21$5tbF_+HHujkk>>%#t8_&6WzID&5dlzl&+J}XX{%r<33$acU?Fy ztidEHacJd2MKM;^>hsLCg)j?W5CA&*>XXO3?;JQydd>rv{~I+O3#qx@@k(^XY6I8t z=7Lu|qKk3QBc@e<-1_3~8x{!+aTWZVyUGweGl?YTJvu-=iYvlc1CT}9;(ziqX_}1SX1^NpECt~WmVPpc zaYT$J#E`sbH=a81S*`mLRF@;g<6%!CC?q_X%M~1%z@gPrc1BT2(r{bv%K^ z>pzVGOP&FmK4P6<>Q0XJoJXb$<5(-CJC!WvM|tu8ERrg+R*Os!Wt#k@XWgxIos|DSQ3z1#-a|DbX=!l zh<2pF;^*DOkivH(&7lRMArzl5A11Viu7^EC0M@X)%nuLPM*>>mZS4w11@5-sRrZK565`79)3a<~|{6tk_ zs1WdRsraCSNbtgHib55ySYtkE??7E5DIPUmgpr=whfpIhR$_$o`#_L+I5hRr_~$Y< z9yYBk)#Sp492*Zbe7u5AfOY**U*gZc zt|1tfU@?e4EpEhmIAV?4dd`-b*Y-8h$&9cnLhKaRhB@9|WfWXGvaHvqF_UN^Se(yA zBa-9mA-0Gg12qh|651Z8p`@ff^{K$flMo=m6}TRVC$HVh%|d9m|If%qGL(O7#m(ns zNO^^-7F4o)yzrOeRghZNmjoYj@p$X?g6jNT;a}u6|3s6ZcVjBHDeNlOulFbQ7?4?y2g#?vgcs-VfVs1~yR~~)}ujub}Q9?I#%QIk(4{u$nK@=hH zQIURl4_vJY>D;}cGdvSW&Sf`EXJZ6#b+`E>!>RCh(nak?KSfINrY)3c%AToK?Tb)e zxyaz7NvlMa9F(QM$eWACr><(I9t8j7+az+)srqH+Kz5}M$nE9l_jIlqWz!AT(!U6G z=(+9q@%GCrvjVz%=0wE@A_>Y2OZTE|tYu%f&+-eRC0fyGyhxN+T*#o7i zY&8MZ!z8Oawi{#CWQ?imXyb1BmbFbgK9=VovL0x}r2yyMr8T#5FH8&{{&{%8S4nd~ zJKak)e0y>1zDEZPvu8F$g9uL964}k271EkH$<<3{)wWiInYFj^lO%F8K||VPe*~bd zEnCD-?r1|s>oNgXsccq=m>~-86Hp;q*lh+Ki17~|KmePKI{=Ef02)bhLNe|0iIQ@& z)1Z=X6Dmu7Vr{+WeH$bagt3K<-Y8iol23O;a`TjyHYab$T}-$9cGRFdeQ5=so3~iC zYw+<>Yx=V1vcmBP#(?19DmxAx?H+pNAJn>5Jalt1Ij&OHjaFDo+DOv%!pH7vF5F^w zDQlcV=UwqkkitM*-XlX-wbRhalZl#P8?%5izP70xEiYh=y!DAxUDwzjj=YM;8j?fe zP)_`;2gx+d>aLbxAM2fl3OyFYiI)wAD2mP9rLE-(J{?uNmEX|w<;z(;nO(ejtFc3D zYIQLbUsU|u620S?U4N$~5bAX)hH6-XAI~d?97cAUm66W~F|(Usp!7$*2tdkN-$J_R z=DL3TZOkq|b;dP70$xVw&Nf>-znil)D5w?EyHmgU{wKEP4Nnp4*MIJ{j2-)YmAXm0 z!4vU-i4xjpRGd_sXUZjkiMUqpOAzh>vy54E%B}7A+DpWRHF}C9u(#b&L^sBGn#@*? zRIS@F55A)yrqCX=-NJEgW;kq>_}Rz{b;Q<-~VtFaqDvHbyw(S`CTsus%;S|TTzM{)f5L&CdAS?j6rP8yKr z1spb%~LTEiJF zDyc}X!`e+J8&`?CHC4KmTMQ5NMSubA=Ln77m?`=mtQJvf8gUjI&1D``Oz4$g@#&%1 z3)isH5(Gs)LB#FM$|HT`UAA2ne#%S()m+=TpXSk_yo z9pDu}fG^tgkG~C3QEb#HQLElvIL=c!4)Tu<<>eM(O^osOberbq0z|B-c4b6j234wh z;LL-YvK33U>ezgm7ll^MqJx4fRAtBQJsAYe>$r@!e#e{NjX*kR`m@2eY3sS#>O73S z$2Zf-T*SbW=k`o{s}kv57T;>_4Q-5J(BO*eriKU-4FxH2LvGNTX6?~xz4?QyltRFw z;~1sl4%h9FZ0w@`5meP&CU9tWkxC?*D$9q7ONd(20;=`OhR0u_Y)Sg6qa(nz4j1!%PVM+TeFqt&sZXG!1g78B0_$kA-u8)J4(ez#Ry+u#^B^kxDm8`ad6Q z>2PigDj`{Ycz1E%Y-S=7TPHg%u4d3`lMbAOsVvHOnz7U>NBV}k3k>rvYsgZni#);0 z)yt3X&1@oBcSyV<^PAjVgJU8I`lDs0XW2^TcAgL-%kPG`>4IX@0M+Y)IG>gnG``6q zF>JKf;}(MLtUhRW;y{4gs*s9g9}tYM=Ml%;ofXbRp7USrzHMs2wdOfX7)LLQMx541 zPL`o!)s$K+kq7YNf7KN`+}OVnh|kK1X~DgAIfyqzhUy@9gDk@bKxHGbn zu;O-810_>ur1OdMD5^L6c(vjJ5{9RX!;uRB|1D|S5CF#}KP*U>f0X?e7~K1i?!Nf> zu{|RtZ(@4w)J&u-F`mp>E7>cgK0G#0ZHp)+OulFUxm2lNFVlQxQ zcuLYKvbwUF-~qydZ@h`1(aL|IVk?$+TxbU`VCE&Po6~Icd0swh+Qd=kd3&6&2?^Ew z%{lbi!&mQFEp!{5c5p`ybrt8;+Fim|O(@Dje(fcnFrn=ILsd~x5goY+QX0@@N;DF2x#%R z@1T-z8PzT5Y25Z|PLI-f>wX@UXOmQ`*3(pHlRC#RbK_kw&a8WogW4=YL2?Lg{PYOMD31>E8^nHqSCyf#1Cz7L;zxvuyB3_8(p4!5wWP0> z`!Frb^{5IlJF|-tLp&Z+;u=g57Jd9ztqXsEfWs5D1qu(f2bsYG^pJpd9Fb(v#_lAu zIx0cmC&Sw`&dIdSrf3?gKFJRvNp~UJe1KJ+^p1x7-{IXmKC@r;vCW7ZGcM_DA7AFIcMa!tL=LV0$0D|%i$EV=FCV!?{u-! zcndY-^A|(ueFj9Tc^@8{%YwTw z?;8)TD}lRR3rq&A`8?10*8CEnodZ!;0UGXXDS|B^5t7VGP(VjlC~#%{tmUd;*BQ$n zzg#C=EB`QpY=2x&Z`iqfa%maWgMX$eRIgVHYd1cJ-B{eUdqKIDI$Z57Jl>6oC@{<+ z*3tz<`Bg}JMjl&Cc1(R9003%9n}|lWtaM%yG8QG=VdN*uHW{S%PYY5>>%IMs5RA6nbRiKUo@$i7>o2EY^KR&PDYvzcgW!^7bn7}!Gl}!YIgQLBC5-yH1(!q{D<#B-m;B%%ll;Qk{R2Ceyvf*){jlMd~PcjDbEqx#~LWsk?Cx@f|y^ z^E!QtXfi6ImX0b7oYS`Vu<whg*_`OWS5^Y_z&}~`n1lj}^>Z*NGe@NRt~RqZ zudBhq_dd1a0V2SM-wQz*%b(TN;tO>vzzto3zf=15Y$5kix#ffj6!nV(@qahG;zAJL zSes@xYx=PyG()1hw?*XT|GJi8wH3Av6}N3;*1P)eR4otYxS13&LWm8#w6cLbR)SpE zW{Q3aIE=J*oRuoO1+L#G1YVGl!aC#t2IaTZnCbOh!oGJ1&_5gRM^LvODz-=A^%-mM zY6OrDA*QMgQ=?g&F~bjwT#I)wepcVz>FWiFhC$yQzfA<^jV4 zmrC_a$cI`x`W1HktzACz45xd~+`R3WV2j}pl34A&y5KU! zD5QC~KghS<^b9N{u)~Sv7(}B6^0O2eblNZqgD`URu{&@!7l?>153hqL9&9w70H;C{ z%!c!ELYIw5OTXONL4&QQU_r-?5Cq`?1zCR_1Y>8b!^uD#Zoay3HgM;(>v8(rfJNoP z$H1jG7|MtBxZg9bUDavP>%|rvD$Tvn-ZZ=ru-s=PP2+gyMfzN zyTl(&K^j&`;Ebjf2M~vJ&9JJoKan@G#)!Tu!lTj6iq5^HciVUWqj)KCeXz zC2ZvkGFB-S7Z@VL3&lW@E!H-bUP~ad`Y<_(1m)Sbd`)#e9!5AtoXgS8i9*GgpI1^c zg0+t)$z3>i$r^=+u4lUO<5R;;fWXi_r*b%**b#QYZHtF4oozhG2x;cQX79E>)Y>2D zM3t@1){h_{jqAm+l``A;836ILAKvE2N6?@)hX!;6#jG?Tgm8ZAnQ6zL9XsRV3!T@N zY+l%90&niZV>WFv0F#S?2v=nu(8?JfCls>%#bFL}47xRLpP@P)Wa6W-;uF^69|CT< z?OcDt-J8wFed(z54bz+f3#y3ZPf|GQP=#u;RX(gy3>96#y9kq%hb57xsVP>hc5T(; zQ{;7f@%j-;-kHFx$k@WA+hhD19O2I2in#ob*b^)Mu3DVv?s6ozh8 zycBt}#zxP(2>&egNRd5+!MWk%p_SZA8ZY}azv4%a(MORxFG93WwU#?zG#9fYAo`~e zOGzeMjOeTG&WfpJT}p89yc6`%wP}ewMzb@-ls{9VP8n^>_|4q8ev|j?*l+4?h54Ds zKuFhXUT5xM)E1~6dt2wuUwFZ<(jf9eEy80!<+as=qQOn?lJqA3yD9sohH#OvCt$=Z z5&7UCi@#nd`wxL!vP6!5pu)D}NuIE$F~nX6iUe?J8U(G%_1TSpz7{FE{`wM?)N(_e zjg^QZ%RtZ>@N?Fi0;uD|wr$JEl}LtX%c<<;cW5A`d3mC#rF!W(M-6`v(i*QPjF6wq zo7E`Uhxh7SCZ5X{=MbvCuD&5c6q^fJ=5D9@){-!HN5YiX3bG1WS~iP~0x9D9#Hv~) z*tP5EEr7eK&?SB{C)dl0lL*>BJ1lxg69icRyu0Si2

tm<{<-xAcI+5b^OW%-j5c#HEtjbn`7ZlU6cmCK@ZmVcNAz*3(is7p(dsZ=6pt^t z=y{H!!1yEnM}>;_8T1veSLmh@EwPErrlZ zmNZpBow#|D7rl$K3TcM-i%29jQ2B=Meid71C|@xSQ11G(9;wdWF8$w>*RKPm8V3{k zp^p}qG6QK^N=Wsfd!%FC=pWhb9eAieVb!KT!ZfWR?_h1t~jwT z6yflp?VtJ+V?MZuzhvZ7N*XMVU-`e0Oq0B(%z9BG{x1GE4_nzQdg4625mtLG-C!*+ zCQuE{dY;mmYKhS5eO2j{0++MeP?;vS^lwwPO9Fc~2QjIPlox^Kfsia+HTj&LVtuRX zJOSHP0EBXoVQY}g&*EFN;z=Sa$h`!3VW>H?#x!!XONt17T@!8uAa)0=ibswCn>2T@ zL6JG&$6?bUzy~vL>96~z^JSCk@-1*7V<}|q;xkvp!PI`&C3txp)9vaAD+6Ba)Xag8 z85vQjXl=ZSG%|@!!$rM8BgaJ|w`PjfaY)2r;m@N94~r_uHD0UfZLg@}C`Aq(@i}bd zAk=sY6K&na3Lbc<+R|jzJgQOUAfhLBqq|5(cX+*96~J)da;ok&Eskm(@cXlTP;OcdS0$Y>s}4L_}6QlLa~eYr^$5?bAsoY4!4V z;Zh?e{Wk;?mIlyEA6757*|(}BXS~tb<3Ct!?74$$cMyv7x(3a@BmT%?cGfUsnSl1U z7&WhDQ=?Su1WQ3&?W68zV`JF*Pgo_?7D-nrfe;3U+?v1lLv?X&2<-&1=JU@VYQ|5F zTE%fupZR&}4w1QDQZ|BC()vbaZ}d(pD}A98tAp!0f>$-&rlYhWSfQ*}JP)Lfg3lKU z0Uy>T=TG!aJc-TU!QeTbh8F{W;Voem-szXiP|BmAn-8XUj0Od9u0PKi*xx!JxeV%?yG_R9ubiCRUtt-hL=@6TRcc7% zvKJ=ezA5q4H=ZfCt)@t^?qh-8Qh9!P&mEzI5Lu#Pt-isy7~>gbEx>)fc++bfuDii5 z?p&PI_d%JF2IXB@MSL15(jXyn2>aWPd-^%GjFYNhMP}zRd;lO~W3P7X3jqfRWQZ!T zDzuA)jZ**W|Iiyi&-fHM?d{-6E(c|!t+J0saHhPbFdt5?Mzc^*@;BMu9Jb`K>TX&k&n?w+4TvUp!$a8uUTlhb~kOR?L#@x2OZ(= z&I=Ujf;LgH@7#a44>Z@2o~q6wPaDd8pL>rQ)teBSHu1Kj#lwb^(4;9Z6r0(BH*4au;c(Cw9>8mU5cfpG{AcMe3oo)9>PxZOSlT})G zByF61!rXvk?V_t|3`KNBdc|yEZWO02sMMU}Nk=&P`$8Z#ZQ-%%++S$mdY|jVVS^vk zU!~t8Y%&)AAGVVmB-ZxuvckrB5FIEa7J6dNLX!T2+myOd68PL<@0}obY!UWyrav05d#GIaw0!uFlJ;f^@SXeV ztnfw}99>a%A!;~o->IA(7X^u}?mACdO3MpdhVmnjORWmnSaPs3!Sm7D-t+<_oAXs) z2(V9e7~gdGnN2&qVa=iD$GHFT2z6RV`z0VSWcsd+>YWOit$K0lPhYwOZ5I*KWtuFoOyZ&`cSQV6=Kx?t)uO^ z4Xm_>HEN1nMr#9-FDe}Cc5*~880pk=*O(fyF~i&J=wv6W`pjB=oty3l1knp>iv9wC%Kf)x=RzCX?Ax1yx;Hay4?=6a zk*5FLFZRvef{^5`YNwnglo^e;34&Xe(0Hl`AsecD5Z#!oM~%S!wkYPuTbp7;K2Y zoD3iU8Vc4nTU1t?+TgEbuw}4=y&xN1Rtai-bMt-W`q2xr?x^Zl% zk3+;QPto@mcd-g8p#$2f!+&+U+z0jJmA8o204P5#Vyc``#itO1jRJ*Y2f zIBkHWHl2$FfsVBMtX{;SwH+@k`$PN=9jbs0$6{2Z-%qb9cgV~ELbSczz*}2g*~F`D zX?~Hv+d7C#nQPIhIr%b}8&?Y!KRp2En2pnaH}+Gq2wgnyNRIiqS3BOL;1SPNEEsuT};y}`}j0YM;OI=lw&t*-2{DmVA~gEMrijmk36i@kc-Qt29bC6 z_m=J#WLBN)AwSmpt4QVorOj=sFLC0j%Q7A+ZA?#!DiBykQfNM39rKWXUp+7LRRzUj3BZdL* z{NX0Q10w;570MyvahOz-d?V*V5hVrC8WW6i(SN8%34R`g-`p|Q7_*A27Zw<|v;EAt zQ(MDjN}9g|+pHar8jSQrK0~hobs_>P+#ouu((e%4#jg+hb-=@$%YH&@F-i_pJb@gV zf*)V70I%XNZRM6w&62B-hNYEP3>)BdL&)=KoN&{~tfI zn1wNB5o4bjW6d(QERmTp_FWPs4Iz~Zxl2)I!;Ez-WsR{UmAfRBN*P-r73waP7)#NP zRFviG^Y~uBoPXe)>v5g;^?E&@9NdhT19%j#l-hw~;a4W~frXv3XbD_FXAL20Tnflw zBlNk@L;=RW8+5sIKO96UP`Zbe;8Ib*oa~u03j2xW5HO~{*8Q4`Sl4JFfeg7MG=}X# zG#K<*$k>gry-W|*Aa)*yI#$MGcak3eK;miHbg)U26&B2Y;x|e}8?ld@Z>z)k6E*mj z5RC@*>f1Zg%gc*hr0B7g+ys2#;>UN|xx5|R7E{hX2LDb}v()O!tzs{fV; zoM2?$yCP<&M0HjnN?)?!N~ocDfggd4$po+B4EA~fW|mHM-$)`V2sgqM`Qy}U*AXAF zDysjA41QgAiBO*h75mvX*eFxQ=of)W2Pd&_dSa+OgT%e|OT=A2 zSi?WtIIm?+0zOVTusgApw>vyKOrPA{m{l%yz`)A{NfDKJhapLhVE?!P{8oazFukS# zYa-@=dvC}5(wdbg6Jems7!WEQ2;3OY0D*eMV9Z&Avb-@hkha~M_ZW=az(1e#h(v8$ zBmf4nhDVU5fIX4E={Nvob~=76UYpP|1`fu4+kYx%;rqBW^-TEavoo;e9}3y48=llh za;=!Yxh2$Rwh0Vmm;)t+iy~{h{5$EFMe4*a&Vej+DT6XQqIkXW4O1tb8OM>z@As(T z|59R*le$l03F!Y)_#;iBVx+3R?tQAry9KLX_(ssdSEub0QrEc~`&NoVjS$-zhnZC7 zo_OcCB^)8Mk6}~$ePs#nSHQ=e?3I}R*d>mbRUl+ZH?y0H3j8lQF9g1?#DM*zI^gWo zh=JF~dzY1Ns^rdg+hNmVu%stxCK-7um*>MjF7v%U9h#+G-r)ekL8=Dt zW^;^Wl;$o%K>>Ubw+uz+AZUapsv6Qq8PZH8Zd#lJWVezVKJT3aBw)dn2P&K>)s%-a zP>Vk|nVYlIG*n6u_Bu5Rpf?g7vvo|5R8I7{iPouZ$m$l9;-We~Q7+?)d`|FZh#h6+ z-V`1|3_hwO5|PZU`Ia^fwQ*#j?U(2Az|>>6T><#rIS~{NEp|zM#EfU}cYH+HN40wNUlCNb zFk~h_N?td_pNsX~GZX~5*85tUG0Aws`-}kAHH(poMs5=lmK$He@SUPL$lqYNKlbhf zv$7821Z;zD&LQC~!nb*bW(*Yqq|( zh4REk9^H4DXA7uaz!L`{?0^jwm)B*e5k#yC=3BOoPY{2vudg>xI&!Agm*eA)8c>eB z;&Wy5N)$|Ol2T%v&`Y#)c7zD% z`yjjgtsry4B|$Ksi@$h&o&M=j2r`p}F2a{pU@jWcTVR&PxkPP5P*)}r^%1GM^>9{4 zto(M!bE5*gTQ`NVErobp8N`QV;P7$x7}6~+J9)f_&XgzC#6=g3CW%+dkO6)i%So>kIbYrboYps0cxudXibtg0o`075Q!{~OU zD5*wN**1+}m$>#4Y>Il%5VGR&gV_Y2RS5*`D^!&G+_er-#*CDN4Eb{(N(rZKc-Fh% zr?{9_e<5$WypT4@Ys9Qfq#xV9|5vV9xpUh-%}9+N;rV44P0hfGaK_M2Ib89@Lqf2& zPugHHF7j@dz1lUTOPy|Z+B^u93r(tc^)`Yap|Vqzmi#(~A{lHNJePbRI2tT&+{%Fm zt!=Q*8kbYmfHt!Y<1P?)6c{)U)Nf^N3+Yy_cm|uF5G@@z?>RZsrm0mc{yFHESF%Ah z_d|Jg#jec|BBxmrJw#(28pDj&Fj-);LhGK7vm>k^mLXW42X=gS@WBd1g>SHY{ z2Hay74V-{kdM7SGHX(GH;-(t7CWkl5n#b5H3ZNgIz%(8#wT9EKQE3hg$=_OFcIU7P zh)?Rtj`l?enj^6zoOgd3w&w#mt}l=tBXBchN}IuwL!z@87YfR8Wq+~<(f7N_00;tJ zln98)VD@Ijn*2soq)RVi{V#s~J!JhEd^J^XWoKSV`VV)^Wk>@9C9qkN!FNdwvCVEM znr~xC?iN9=q=_f~@DJ1MUk`O~m%#l)B7=oOoyk6hxS|lrKRWS6ZdSXS(0BaTqwNQ= z=E~Lv4{UK5Dwb5u+10-t%v9}^gtXJxjf&qUXkIp5qb<|OH!e!Hd;CPEJVz!HK*x|6 z44Xz+WVHU}K;LV}xlJ2>+EQgYXWi*TNxQ1C4pQTbOlGMxbwrny2PC{XgT-{WN31RF z%mv-jWhbxs%4z?}!V){!b20%(dKKsjj%4sQ_@^1@kgEqh<;$Kkb4alrHNB9R5YquU z8yq}Zom8uiB7=JToW-2+1S59a>|Y;QNuMJ{1{1-iW=PCrW3W`MxgrF_l?X&ehJYUl%1uyUa(HaZ)2v95N++mj`x>w?qJ@o78ZeA2arjUa$`&+h5AcIQE=a68xEcLvmdWcGjNd`BI4J zsK&~Ie({UEI`wT3f$wT#dcvMQXp9M(NUGfr`yE+JJ?wfNM9%)$;CX?yI@>*6oMkSB zm6lwBqY-4d(sL$clkJfg7hC`W*ef4&R|YK7g4|VrvQ05_Xho4di5&*FRY%T|P0EmS z>MQzqF=g^jVQ2`AxYr3ddWV-5 z0-mJnx4gpF>X5PVbTauv6|CTLh0WkyD_Z-0wW7IyTx_tR>FN>k<1DPFvN*G7?my)8 zlmiNteSZwldsq%Ew6y31&xt zlg&DP&?rmuDjbA8mk|Nf*kE3!bjbl2@J68~Yn#RPGVfX8Zlb5U+<(5+UP>-ETGM{> zW2L>hkcz7+7j?{SXmbi?%rrUIF+j$R8#)Qk6RY}=3N;uulsIiP`yg`4DSNLGGuXzj zBTANRj%e5|>%$io%q9Eq6cvMTzlK~^^khZXTOgJ-duj$=V@eBUBYeP|xS4M90xjFw zSZ!AEUo?Yyvo18}4{_XE({?jy_tl^txrXR!W6AruuJE*TY&rL>yY~z?aiBJUN&@9S zR-b~4^Go&5L|J_~vzv;}_TNkfWjs_`!1bkcCrPr}6~%)GrpYjUE9i!ey(tgWstju7 zvnNWxZbzYW&Re_iFq^!**c%bg-PswrNl-+%CODGecUgWAct?6%NC;nWy7+(( zL5Bknh)0#;7ch1~5gVHHMd2U>SO+baJ9Jd7(%06s7E;@>fCI2nmAheX)>^f&PG7q( zw>IVYVg}Skv7;It^FCAEV+Krhnxz}A;T%mnl~kJcs818Uk_l z9Q+AA4{K26#0-T+=tTyMsA}s?5CSyV*7djbpPfnrz@KO=#P8sWG|vi3EKRd-M?t-x z0YTK~%eiYbJi}i1Rs+Ss*^3MNo!0Xqz@G&L-;EPqK+~(Si)KqUh6a1dKk(ZZ5zaK< zI$2QoFtuJS1za5~l3)2*@Iwo<@|MF5f_Zh>?*RZb11Q1|ZbtmFs00JFhH?|YGO9cX zDm5k!Hb%luJ)Vc#+Y4wLiNDrNGd6S@J(Jqp*As;TAB2O;I4#idMpu+86XOt})HbOf zehRxgrpN<@#Jh@%@%#B~Q=FIZbO<84Mf0wR*p#$EqSg`rla84$rrXHr^pyEaoSs6o z5r?p?M!*jmIAWu4q!}bQxNtu}aP=5;-xrzU!X)Thcgm4$_!m~>93*shatp79A2H%z zyzPms;$2cy^AS5G;of(t z*n@02=MFc|3O(-j}Dfg<8z+*y4Ep6z2riL;A@2{d$4gQjuR-i^Vx9`Pe* zy#WHu=B-9qf2le%S9PXmeGv@&m`MFaHflSm<46=UhOG<)eHpWwWhZlM8~NARDY%Fn zh0f`0?VU(L%oiuI%~H+py5TOa^a?cD`EU-yuSxc!?oxezYlld0QfAX6-A%5zu}=Ya zXobH>4~VI5;#*0#9%eV?n=o-_aJSOtyaV0m>gR-PiR1!U<^Wx2hW1GucoU> zXFwJyasR2$@JwZY;E7^|8$DX`;2l5-j79(#(SR>e3_5t0)Y>bdtZdZ8Fx_}L0sh<1 z+?%(C;b41nBJ_9KknG;5g6r+_Xx!v_;E4RXZr>)-ZSCHTcDgxOoosnP1@y1nqCa44 ztRn}`?(s3o-c-RA_${$RAMz(K-VwyQ}i*WDQqwk0mImJ!?IkP!hE|~h7o!8HigF82r9a}J7tHiW3 zl!L+cir#8CzI|SuJO7(&5bI$*%2%daU&ZnKm*U1IT}&_S{y z0vkc0qxH^`jSNXF;VfQKJI!-a6R`&|4SWNME3%ymRnWCbR6L_I=;3cc?Ph3p3yRo6 zpkWax!2tnazzPs;Q^T*{`#to(|A6n>y!GWn(|IRZi_i92{Y~D$n}!i=A&+%~!H$LU zq4K!mZZoGwUH*U=E<;fX#JQI>BAj{J&wgps6n8pzo!6klK`uFU-_d>RyRR{lh^$i%`Hrm(LM(~;esia^uVyBTg<_K{3-p=_Zco>2WrI7>m_aRsShy=2 z0Lg~j-GFj$f8ex7}4-ckqDrblGs z*^{#j4_XO~ec)TbWGYvz_%a4DBY8o1gPEQfc%LcJ&H-Tk|YI?yPK9@2~RY)QE#7u z6}rrtRjWP^jSnBudrf|reGV$XeBcXP6}IrO6Ewsib5NOBbhaP7X8^VPi_eGmpG087 zCLII@domz+a)>!s1HA0_Tu32{h^2w2q2JHue&obooL&#;iIVgmP+gBD0DV9czed){ z!W}Uh^JouLa#h?8%75{5=@EA2e%ktD2JpCX-(3XF6!`mYb%v)kH0$*1bj0J|t-%va z;9Ubj7v+H(%#bjL6_gc-SMCynxb_QNe>ZoTdbq-%_R@FP&2ui6R|3Ahr(es6rwyF2 zZT7wgEt2uj0gS#!Y1!WCKRukzpjatxaApOGCnFKEAzPr_Ba=*7zYX*|4$(=gb3))1 zJ4|_TMs9#ZCuXYaEj6ZM&DE*f)-w#NAJ24W&3UBULi?MCf9wyL%=|7pe~N2PnEJc_gr#O2x#bfrxWcM(}?{WT4c573j}ShR6iwK_vD7Q6@Z_?cE4UBsFfn6Isj(d_}R77Cw$l1PCQv(cb@G<$YOMBNpNaffMp`RzEtntt<%Rr;mRlDc6j$M1< za66i?W5j<$I^mxc?G?FaUG%s4X4&#rv%26?tt9(OL2-?{>u~m# z!#58!s<`}D_wrzDV9w>sJFHx;7+$`td-;E>0YCr%yT%as-}8SUXIDmk@V>dAs0!)*y$qE4TDpR^|>CFXr(+@m-Gi*@i) z8QCOtg?;Rq!(z&>*VfOzx83}7R&Hm#QSjWWTZeaziq);&FebV~kTv&9zWUrX7_P{~ zXn&fbU!UgQtS^9acgJ+~oFDqN@cD%7gX?DK%H61o1XQ-FdYlBb`u6DF)#aIXyjJqJ zizl8gUpvOk{Lk{|Hs;UbUB-hGMCa4L-(D$)V zKK}m46KmJ=>t8SP(EezfLzUm}do9232)r7$|6z!UuB3q;i=>I zduzSgsrSCOZ?|4eoP1CbdpUYD^1BtBe7>J`C)X{}m+a74Z>1@_m`KYoD0chor<}t>#gTyH8ToM_)qRS_Q54a`Gy`>P)?wIBWCJq~Ce+e1a){!*1qv^CnN;0vdaA;oi%`9Fo^~ zv0hoq-=T+IGOzv_ya7+Xw>0j*o7VZ~jx>wZIluMJ&R_fm`29O6;qld6`4X)shqq|m zzd7%BcIM&YhHrb2N+=SqT;EGziK|afq`k6vm0kLm@+5DoHltOeqM*la_}^3C;3}SG zsw^23u=Ci~dpDX4w;u5s#Cb<%o40PU793i*F?(11R2AzVn{2=BjjMqoaq5ujY5bH# z!VY&Sw0!+++uP5x7vNgkevKYG@$bpS+0IhaPlZ`qjQ7~c4|0b5`?E_7*Cpky*+*vl zZvDFvzgrMTZ-aiQI9cIPyX(oDEr*o|BmWv*M!67NA;%$8^1;gU0@D%7lG-2Fq`RXz;w)MqP?*1zL(ohhGM<&WBa@S012wT1ih- zJwirWrg-dMRsD&_Kkw}K=rdM){fVj$V*w1`p9QW*mX>EEJ2h=XOfXrlK^B72a?$*% z_4Fk2$(Oh*+)LYg4p{A~Q*AlmP>{3~a--|u2@~yiH`l)ASTx-D_xIQXD85kL_Uhe> za`U4}Cgyc4^?MKXs%)mEyuGJ2|Nfl%vG>99*zWdiUtbY&8oe89G_U?Qt@rbNcIN2Y z5A3POC=)V_ZcAc+X3IX$EBHS0IESewj2Sk<8OmOsx9638x)#QbxN}_pB1-H&3kCS9 zi7_>?cRyCnC}`UMd~}8DlHR?K6m2};G4Stmm>hnA1xye|_V05)P?&Pfr_S8#i26vR@DR2hpA!*$Qf;rPu;E|6!-Ri1G`!)Q!|y|}&U8lZ9t@&3xu$Gm9Fx zX77E!p3rV~tGjYiB{YCk8^1d;-~O<7wU*}|$NcW1N1moW_Al*UM>#qb~pOkw_e@7vY&@ArRCT|C*?DC2kL^`}DMfa-*{ zH}7fV@`Jy7zw#cWUO>GJ(<}##q20BE|D@FjH_dv-tDvhi$Vj=fLeW}gl2P(om(lLg z9}h}|U2GmQ_?o*kT?Hmtz4znPe-F#&CoiQ}BpY!r31lmcWNH7*&@E$b{JgMyV`p8^$-6S9dmdk<&8IyJWE(OCcO>`TLSe$Gd; z9Ow43$a_@>6;FDdTkEa&cev>Pw|Q4d<0+4=9(qz!RfTM{%z1<8KW9MCv-bWPmZoJr zS^sUCTAg=%MZ2*78hasK78aYodtYgk6Ja_a=-z*kwG~kD);42*!2EYFTGrXoI<@uU zHivhzlpG2u7imFM($2>UUZ%U~^^uB^ zq?75zcK?+b?*I?{;vP39xdv8Iuq{O;Ee`l;A7`L=Kn6VntU0^n7HVo!N2i=I_{FT4ougn}> zb+~tI?eY#@&1=rr;XXQpwB#7~&(`1{mx zW$uM@){!=q+V!Q+cCSr#aB0u5Y4tI$VNnMM!*riu{{N^20E$4I?&(a$!GpN0_8H~O z!L(=7)NtyzZnb%afY*CLN3P9X(?%=dXVaL0u$V)Sbb{F*lbFkVb1mK zuG0!1rc^+gV(ut&^2CF9@Fi>_qZ?fFSyV;7!>7LH2qzZ|z}}%9`)oFQs;Z7=NvKpk zmj6zcdy-j`Y=b#*p7FG`u{fR*#n{{XF)6c7nZA#3A45}%Bj_B0eQffep*I!IO=IGZ z1!WY)hG4-ET{ilk{6?@USNV0mR>4rWld7C-2cq+=jRInU9c+KvEo)>tcMz0b`kL)0 z7hI#BN57!~#@M(6qry)H6i(3z1~v|xNrf8ZV4?re-66V#@LskXTyZoC6>!M^%b)>CZ_;s<8Ci^QQ#ll`O2AiIU*02v`%qE;vH|0MOf}prmHn zku=~h4#`)b1Xm3Y{)wOxpMf!h5AxWTrEriO^p_WuXvDhLLj4!sUEQ~T z2*$wF*Yta{AnKgM&t+4Q&bOoY8;-6`tp4qad+<}?TbGtH@WA5N%r@_}F9xrNAIqe} z5m!LOmV-(M`^ia`d>y6-ph`!|K~&9U0t-I;5*WV0V_qqc7{`nl2&4}xD{EoNY6=`D zrP*-UM9i#-(+J96er}`Y_SS9XcmORF#&o zVaP+#Nxd4R2IKf*;LT8S15)F<+IEIPOo#lN5}2SjYLbDlBn(|Y7k8+@cm96!aJb0s zl3eu@sAd=0-bp?5k{iwe-zF)J@e9n_4#_o8o~kyO$SZJ{Li$}trH|dnx}|a)Vz`wh z*er%#=5Gyi8zhQ?nKH3Vu=akG$Fn5EV208j7UpZ2TgQDwS1zxOrl}J^@dyyG*&GC7 z^K^zckvdsDr%lOOo)muzlreE<;>)xnzqA@sBGUXGwlujaieh!LyYNiRVHt!o)h1k* zZPJ~yq)yP`iM>E^-n4TQv3gwIqrjPDk%9(MSN&(q)-7>+a)@DnaNFc@NO7e-)iPyuZ_=I9St5|~>D>>r>BITweq&{HS; zj2=|VS$9*Oh`f?=od_mZb*>1!#N;qC3<^6puW6wpLtA1OyJ6jQI0&5XQ3Rvek8iOo z7}EaQfOL!Yh9K0RoRS+GSM&gP#(pBM%7%GaOZ0P}wzOz$M{(loJ{GO3fQ#>JS~!G) zHm@VrgJfHu1QJ_yK`Wc&1FNVa$4GXvF{}+DOMq__LnZ7b=|0Ko1A|>Iz)lpVmQLH; zdgT#da*lmm-N%WR0=64&T_`r4OB+3FWY>SODH<`bfb>8lDF7N5oC3B23LwCG`Pvu| zEYG$Bq)p4$&_1;G&zVy-LsgPTE6+_o{7sdtt(SL~k8@WCc+2-pWft@D4ivA2eyM8j z^{n$TM~q?PYH-6{;VoIfmV@Ucwy0{I&EJBdh|d7d4MaI3r(dqm@uSVg5eYY~qMiLW zRgHRi$6O9}GA9sf+E^VrpA48$N;ngGF11s}$|?qoI}#b?e3(&;2-c<9xcBUNQkM5@ z*_Xt%?5EvAYRZ|?B;ps@qycT1%Vb<*5oM!)X-oJ1RZs`LDYnnCbXO;4vGV1|aoH-{ zj+WRa{iA-ttk*jNb4`3a#>cH!VF&JH{@LsAvKY+RJLQM!S=#mV-*^6+i*VKF$0Keo1&ZNmmWq zGIT+%rx*Q)_^Iyj7Wq@9N6Cg)vmaCttiz#McgcDbOtrAlVkb^Ca z7-{9x!*Q`$yP@DcjGe+OQ;I(`i|wKu3ka$W&v(OtL_5ED4d9s^kZZF3U-h*=00y`I z>@$7smE*?8u+TmRTD=C3X+J|-TUJ>6XfSzZUbuXHyftr~^ns@(xw8u4>`fsT-{7c~ zOz$OI(?a_8n7ntvV0FVk=`Q&c&|7FGl5Dl@YWL{nPMzHf&5T^CKu>5iCzZ3!W~V>I zbl^m`DsC5Cw(~J|!)Ogq7;buEaErQOfLlGpIX3aK4is3z!bmO$$8e+RNuOV`;P{VS zliK7fP|!VK=6+m+IAU%KfakuLxXnXH%%5jx|H#j)a&GBf1cEK)56S%S6t|AC^E4Hj zBxFe%ECYI}@!=vH!Zex0+TxAFhPJq2To=P_P#En94DT zH&=Qj5Ho{Ow@lQXwR$*j#HH_c$u6PdvfawyQ3#ceIwp$BQG=@MU)zYrdLb=*SeREx zk6b<cwlKN(;XaVm|tyupT(bFu~x6CM>NU1%N6WXn$K*XC@Ww5!J2A`=*!xCUoo>Ox`l=?FJ`EyUf3^^x6XXHbx<4rO?4x_2bhFnehOs1<$+cp zps#2+UrQI*R!BP|!}*CEa3Oi26AqK_OHfsralWBehbTt zZ{R|qBW_@)m>72F7{<~)tzTqyx6l=Q;0u*hbdVnm2*chgbrsdzl`ED&E#Zc5imAFbB5;K8bj< z$SmPEJyg$dMwY0Hpf+)P?jp^wlikL8gLTR=W&xdc0j~Ej=A5JWu~-gdZ}Jr^4-Q8FRgoN9=@CWR907^^Q(wB0W&Ak?Q*85}8!bBd?P$Jxp(4 znLqdRzz*eWsD^0VcNM%6p?}u+B0#&tlW21u=YnW1gM_Oy&CgqFFTy#KBEoZ45;|@ewmO|%dp3`7DUu|l(*J+lHI9D15UT-$t+lAh= zT|2#Se-dtYZTkhqJ4kTx_JBdH3LGC2M03T;Bi|NUQyiNy4`pxK&(sNUG0@Kxk#HQA zyO~tDHQrP`zBCszg?u4+5Xi-&-Hf_vy~jE$ima~(iV_$74%i*kPN^}r0)sd$=EE z7bh?wotAOKT)B^WU%tqJYIbQ$sC+R7*f6jU^Oc;Gz0&44H_g^WGP{1nyy=$Ph0-@H zPxNaS(A!dYWIaIt+Ogh@oh5^Xh&V>$S=RMp4(R-VH}oSS$LqBLsP<#x)LmoJi9cr3A@=VTp(euMBC> z3RE?scJF+^PEC&`1RJ68y(DC1#q{Fin6vv&Luj)y(g8qnT4(jjmGsqh3n52hx;ZSrKhhZ&WVh%Av@vnq1tIPj%Y90&DJ)FO>poqUXVbc`cnj@T?g^Nmh=?zM+M#RXh7k(s?r#L4 z;FuMEDZ|c<$W{7~sS5;e4@S!o!uPj5f*>Nuj zM6+LlQ$3bMfZA!=vSBIV_EnM_l-KyWt4W2rn>{x}DG@x#pi>QMhNk)^^X(wcLGqMA z=`>G4UzxvxJ%}NmB!(DF;~8#^P-;gyD;VQR&VKaJGuCAhe0!6gIpTg0UiQL--Gpxu z4s_;}(QW6J&a!d8%i($5yxnA=-+YLxfkVaEvW=>@-9Zeq*opistcbxctH~wgY{A}k zVO#w$lmC)UkBK(YeGxfmud1GFhAXi-=WFnb`9^3mdF}~UAVc4hq%Y~8-k30V0-pp} zs8rGOa?7#T6&XHlqBEEw3LYA~%S9FE-S&={i>o&C8WW_}7a)}mfgHo8s%E}ygE2nD z?TLqETn@|C8dkPq2eOpStbm^7_+8bfk*UlkVp@pYd(tP&=B{KA?_w5YQ5#X=N-Pk$CVe0ZRQY!O!kk795ra54M?2_eA^BMc&;awud@5LpP6XJ zoM%5vJq%%!wAs%=lG7ks77Ey*-SO3C0Ljj%`n#hFx^i##3k64u_VtUa@8O-Ri+Zc$ zrc1okvEtKj939=NRuYM?#%Z_bfo#*bewO|@UjR%`NBksNssDr1IoFW`gUIK|>qX#3 z2lgY!WOOn4q`0&E8}QeI?kqajI6?1IHq`@B^oZ=1xQQc};J^XBZHNQ?%x!~%4;P@X z2yC&<0aiDoZ4it00}X>v+;Nx)QP??)`Yugr>k=1J$#a#P+*|LU>Ym%nk(MT=%V?X2 zBs#NOcgW~LXmOi399<8m&;Yj>r}K=Q_c3**VM4g}he*=y5>AH^U!j6BMtwv!{MN6| zU-)5F>iYQh&u*Jpy-2lqmZs=&1)9d_EZ6S8KF`rM@{(yUq8yjb>m!li_sGj3nt0#${;5Z+@WdALm3n&Cnn6 z63D+?gC5`>aRLrfOs3S2xj~^N?)@6KC?@l1gB_18R7|s;^IM?Nv9MnB(VRlW6GR10 z%0Frlc2>`giXZQYHUpYBiBzZJ)EIrj3$sXECI`uXi1^p&NWmUjSnm|dTC_`#4Cs63 z6AY@fLAe_Kg9m!`Mttg?A9h#&b_(mpZPmK?^{arj+|udX!oGz%vA3<{p1yU*VQ+wjAEWlfGH}5;97D=^_DEUu;qVPj%cA+sX&} z?R{Ny@rx^dvwHPTQ@EsaY`H0I4EO2|K{ZH}e_q%F;?!iZQuF0CDVyuH)*^;?edNx%TDt2d&%qwJc_FjC+LoMH2V>`SYxNnntA!dGfjKv5avh z*f@^Y2A@9bSKR`*6D_I7n{6tOV>eG%Aj2piojSX8t;e}LN2+CWqawO^&HoxnB_JbV*MRF5NEb!e(xFb`(PGAs5=x zJurs-t=8$PDE=F(qwJCtZR#%G?ht~Bd-&Qv>IMQ6jd>=2QO}U>vLoI3p_Jy@ zCn*(zwgo``+>sYZ0IMpd*|C~k)3MtUpL={5dAV8VBD3km+&L&^B7@7CYD9`%ll74( zwGiuy+YM}H4#kW@A)QO7$K@D%!Nznq8C-P@xEj6(nqSTvKrtR|!CFKPB&3IRRy@(( zk00Ky!u3sL%vn4fIUp{Hk}P;X_JqM)WclIp09)elts?FF79?~lTYeXWr}g* z+%Aqb`2JAdlFN>zJCY5X+@*I5#%Ye>;7MMW!AQKDwp6#Y0rwcxsaYPJ@y)G_PVT3~ z*mhyu<_2ZuM|wY@yapKkIQK-ZIi8{q8*#3{Xe1;WkNBbgePK=;8AWoeo$-y)(d-hf1g$tPCMNS&}y%whj{1R6Uy zzYl=Kun{q@bAg+_AL`v6ZLlkOaYC)Xb0_eFyY_tCI9S-Mp*5y@$L)c1{NTTj_>X}N z@)Gdr;rg%s)Zcl1<9F3ouESkc?kIdJZx3i+kLqw-vs~D>SM~QbQ}5Ne!lgWg?1XCy zbB>OU%5pjz-|R11(N!1@N) zrF~IumoLeZ6?=LeFz9!fK5!85!O|UMe}j;;Nx0Pi^#n)13GqB&*Hfm#I!A=M zQ6|6(p#5AUARLo}`7BQebNACKxZ0W-7jIsE!9C1!lTvRNs&EsU&1Px)g$?u#bmp*m zOj{Ag-TcT~#EAMPCWfXPIpo$TW$};`+Xk4hhtn?F+zfs`5fjW%d`;803a_6fyq5hh zMr)pSyJ*J6@|IqCcf|@CwjX?lV!V&S0 z-%=BG3G__A6jH0%%&PMrOvolCX_az*&EmfE9?>N@7u0eB-;&%_e9;S|Br`9m?RF9e z35}C-NM%x=_arHIKMrcwm|;`PtflEx=5{00gJg15%jC}{AuLQRVNNVG#vYFLSrl)x zf$B-a<&SmV^2Ow0&71-Zm%}l*Q`|>Rud-zqju(mbdyCgyz3el9x(2dZ_a+Ox91(Y9 zy9cq>eo_%}iJD*zeH|$iU%@Jg;IXEUW7;CwD7i72Sk{O`d{V!j5^jR{XuZmlw^Jtb zTrv*dbZrC1ED!pPgi4CRpFp4lefFt~oS6*p1W$eXv|oZGIkHL#rONUE0gfP_H8a}pO8Om9ic1BdzYUnl-%>FNln5@&nA-%X{f=M2xcdoyVb>4 zyd~OWGQWiEvJc%~sz>x*84gFB5otknN@)**xCuh99Ic%+6-XaT_H#L>*#dX}ACJ~DKXjz`&R^hY8 zGx58hNB}243a%38Ia|g!Zq81Y)kWH&cPpbYhn-tyrCIvEk5wjp4U5qg!&*7)tP=WE7b* zMF>tW&x+g3&Q_d+OI7r1cY6m;hF$|n!>^XV|H?@TduO4)T;aNX$VbL%k|%VFn=$oZ zAhbvNpff{JJjr1fA5h+~4OBi z7pI*<<_nUtk;FTxWN4(3^3|41DjlKLS@?w%3YxiOTxO|X$GL|?O0yP+96M}VhCbJ5 z#Rzn$=Nq8JsX$=DsZLDC4<$j{3vDX0>U@CUBAK~3LnJ%GKg1?`1`Usxhye!O7XBeEwLw4In^3P7mb zhr0=ncQ!dI+)SzPt4(QJ(VG5ZGVx&`ir9 zo8Mad;HO;EwNzGv za?O2^uMIvNY3}D7#@urwwuv5rY@rY(Sh7w)(XM=ySnPC1`37^-Z{lVQ>guRBU4 zCGxW6sR2aclKplLMzIICe$FCjiz_5eEoVVGWbILh~nK|Y#5-Kr=qEa~( zI@xBJ^BfW-r&KDvLn@Ur%&~GxrBXRnNHtO@hp*4~`UkFGuG{VPyk3vz<9?U%VI?}r zVM$Pa`mJAi^;(8|FhGbV9efY51jIq$>QjUt`aV%gZgT6XuTt(=h^k=gEd~0j2dfW( zRZu+;QZE=bXVD`h6g6k;G0ZScHX=ZYmh^aS0!JG~RMC*i4aJGaY7dj`-gadUyDHR~ zGd$W0)An$xF;WhPzzRu?_+aT+m9hn0`l$ zEdJN7XiN-4Ba}5UKUhX$BGgJ%cT8?G4G-BD)<2-}7yUH?ZTmc|B;~l-u;F}5Bp@C4+V(WM*+A#-5q-B^Oh^Ah)+` zf?dnq<4ZaE?MNN6VwhayE8wW95@S3j~b4TJ<}2D%)Ko%sx}Cm3fN@NYQtwFEDg z2pK3uV-NghjYhciSY<9*wOzCN06JA$ixVV6w^#JGEkH?n{~2sIX8UsGB5aJ@n{e%} zLI)|^tEmJtgfJArb_GShi#&tkw7|j(NjoTD4YdixUtv3#ppk~|+>?lEWy7u#qvxOf zba#ks?T|}n#~e`}w;gA#dWiKTK-ap#(P|(&Te*NIMgp7r)*|bE#9$$4#GW9!Sr(_} zj|i{@Y4Tn++kh~4YIy?|N8=HdGukWG^wr9YN1lAfoCMnwH#yZ$jx;TK~P6zq4Vo;?SzF`O|sh6J+Df^}0{nt3N2*6t5!s3HC&t1Xsn6 z%m9Rgh}(902a;UqOmp&0R%NM{>Pr`yo#}58-XN!9#sY^PX;vf9KwJmsaxBk^_oPs_ zS8HqS8a_wPm$OJ`BU<$|(j!^tp`&kEBtiZZ_aACaUVcb9o{o==wUr*<_d&CEpKadW zxYgPme~7=5nIy95n#x{5w^$4fz2s38(M-IidAf~&X&2TZ#i9wCZ|&3k1bOW{AX2rk zBSu;iR;OJ;#oNv|Z?h!%KhmE*8j+L8GTYM8qs@P^@OoOIrBpz#@}27y0>PnBVQ}Z5 zQ3~y#-b3K0LSP9w3UDmnOEpW>AbQ%e!HbeVP?C76YyknaC>{yV4bhRpnw?5fDba9B zFJvnn@N1s7ZZLWGYn{7e2UL}|AN2^6H+DaA`-0X$I;tvKa5sJW62q3eaUIw`45fuL z5){E{SggILlGt33vSw-jp3+N$V23V@6UE{SqPHol#U(FYrH5Q&J*n zzg?fxOoj&@*hLzLYOCWod6J)YuVgv~u(9@y_P<^5O&yQaf-w5pE?LCS2`Hf(i-k}J z`8&Q#yDL4|feg`Jvpyk}mzAy4D-9)@=Unm+4Hvfe>{p2MEUkRd0jyyW0%sM&N+6oG z`kA#P4xUj!K`WAg)qKP_NE>w6j;n;G;>5v+Qj8N2(cdg`6WI}#OR{<=KI4Gp;S*;8 zLo7(8_T{7wNP5CvPi6>z|Mt ztC)AsLo%entdpEyyd9pU+`+9WgrHJ;PSZnX>JXdiD)bhDk*FNP61y z?#RnYK(thw+;)up*wTe9SdE-IB3M%-)<-3SUbQCx-|HdIPh}`E7@bySd&0f^p*0p4 z$nK$Xmg3S5lNU7e(>*nTOcUZq9)hiLix@m0a*95-OVGg3^lLh3(v+X8)#t`dc%ByB z!`oG-=B6aZ2K@*vhaRH+%SbduKF%IIduNsbLiDEdQ7D>0DlxoxN( zy}!8>$}yO9b&2`jw1RMdSh!vPSk1U=u9Hk6)nN!Dn)-UmS%bH0%^PE>zQ>Ie%{9C1 zLPxTrQRXNf?ns#O!OMeM;}#SUsJVcP)@=F#&A;+r!J+mY!n$iNCeZ1(Rb}>$udvS0 zQ%Z^^;LPA`DasPmqVH|43F_lw>2Tl$=8IM39^=R?`(lKj$HY#w9$nqvD%=@ z&lUO6kWD1K=T(!kCiW|NX=QhvOYv_6&!oJC-lr(nI~s?Ev3A%tnxm+)`zzPlL20il z*o1;A_4W_jUh!*u^4knQ7p;h^=|3sGg&ldwh0IC7Dh)8JI^-Li%-CQ7XIYS6 zUIeCUEMw!&m=%%r$Jc>cX;1Z6ACv=?L0-Ioj;n%w)j<7m4~vc*R^{lP`7Cw^YQcw4 z;s2nuDuD7WB;(&g#SXaRM(6gGZm-1F<%6O-YJ9agU_+F*`p~ZP-(d3Ohk>kkE@2Sh zSW0Ggx=Ll(vD6{EXJ_dlHAkOQ^qozujJeqM4e}sTV%@t^& zSlJMyFK5SNNM=E1y{8GezJC-uQ=L=4rqaUE(*uzgcP&Za+4p_3 zzdWzz;p0$$*!B{Nr9M>$`cjmV<_e`5>SnwoYf-7H3i8N1r5$M;udN zn+3UJ?#p7cNu#I@)m)XRAbPeC91(N*!CO=kxpOj!2)%IXLU>u1n|jxo;OkLieT#ZU z1%fk!J8N~9Dv<`F=$wdIOHtsv^aP0&LL;1>VG4G>rc71HMJqg{a~r{j6eMR+?{2^yDHalQD+eMCWtWfmBMEl)_$&A8!vnaC(G5{+drswI_f)6Vq+@ z<7qef9*rzRw#Q4>tu0%M#5rD-u^;<{ucJA3KG0>F)KF4Raw6>HQ_$1WwZIK>e$_J| zxRUG3pieARp;DZO}P}A!@RhxXk^&WQ8`k z2T9yY&oXrcrBM*Pm&mFHP((i^`GtioAFE%bPf7iokf5q|1^HM>fukkF zZUzUi{(WI@!o^0^^aM|K0c!)GuU;hfH)%}GrUiAA@ru92n;v_MCb%6(1Q5Vq(X8!< zF-)l2ceDROGFuA{Tx)>}R@+;3!TM(oDu4a#iZry-1XBseH!AKpj8#1DT5Ho?{c1P= z=_9&zvvlQ|m-yz2X;|{Fs5!N*QF~?QXfn+N;X0&)Trlv)`GDtnR0&?O+-@+19aV@U z!nnLCY&fD{nXb28aVTaAilRtei~{lturhg2wo31IA?GJzS1hA$0pTaMNG6P?5PGY> z;!ub?46XK_o>pM%MiLL$&y&l%aY9FSbewa#Grr5`tYZlrQfP92LK1UgCvdT;4Oc{G z5=DyGNJM368V$70M?DQ6(-dC*+bdo%U#T`-h>@&d)b0b; zp!!1DcaTc9>XfeLKdk}!On#B=ov{ClB4c==s{QQK?dMQBOa|-Ak$X^iLr?EKrZUqrKuX35A+4rR zf%>2>k>Bosz6j6Lt8q9(u$i{D=Q?P?PZCEgRYGkl3n-qojuX7W8lmy-U8ljO$2y_~ z@9MU4I}%140$;_S$HV|qWs-Nkj1U~X{|n$nY-b4uSNleKygB}7j#%8I2LA%Yu@|YO z*%8r9{?&kzFRVWmv1r$Mk1N~)e2$b>#>KJ`#nB}H>#wyJY%tMrIsrSpS;252d{C@itWcQ6|vVuNvGlTkk2pFkOlj zpP`%dJZxLV)5Gk(B3fReMD#lG1@s9uAd5aHy+aOmglc zE;by>3NR!eO=|!(={2Y$JS0g|T54tZmvZ%~*x-3rG|I|f_&FVzNFOF&)mO~W`&NaO z0lP?ji>%Jcz}_5xL96VeA2R`KwYgZd)zRV~rjQseVKZa5VOyeI0CV|ON_+u)hF@w8cNcvq4o%Yx zNH_KCE11|nw!n*ScCq>7lVo1}0XP6JjHPaMc1Kim--exWhi*ha7dNN^H#lTZX*?C) zrsM@IAc{xZDx=w{!&mV3xx(}3pC__7b;t&d{T8XxG3>(>6V7g9gsBU%z*vKA-H{3S zTv#-V?DAN-w#Tv^eKeZSW|=D6r&FQ<_a>$=3l+Jt5 zHMD)@fA(|S|pomDrhz#H&+C>&L<_Gl+0yk#^-I;x_0#&X|``;W9 z$Zfb2C(hUcqB?6}lgoHNi1nWl;EVHNtf(4RccwTpyhp>u$@lVsDBTt}JMH*4q zJK@vL=8OxOm$ux4a96Yk@-hlk?Gw)@l(&7)@ZkcvGCb*1oJmK~d*A**=z|bz!fejN z{Zy$o2928D49y0m97D!ldM4#(OHPzTi zljajT#M7p_5Bp%l`lelIWvqHxC3w8Nt#~%!&%MxWZY_?1)+E`NQst|xx*8)W;)5q- zrQk{E1GOX#&otgM)wR@fq(8&H0S4D=>FM5r@Fdz)&TQ7NhzuztoVIS>cM@`iuY_5fm?z>2gO$60FTxB@H4Nbt|teij5?yNoy( zOlEG{Lsvjfti59fr=V#{p#8a%8vz=G_~;A!gH3YMsC`+BhHfvWqLf`{eklWbdrCP??wDkOiWc~Fi>H1HJz*3%c>e`V$ z)o89(%56jfTA+2~W%^eZoJLujDBJpt2v=M{97b-7ju5ypqmC7W5cjjwu(B;#Js}r+ zLZ0z_n!UGz4&U)#^b0dPtp~}7=UM1_#4(03_b2We%Xvubv(1o(xX4vaeL4y=_gc2S z53LOCer5jdY|jJtgz-ydU&b?7aLePIf9$DTbhD9@F0vWUk^<3zn>a@fwhnPkeV~Ba z@GCTJx|Zia*nXhH=J{5@?lSr-+I)@SH#Vtmz}BTy)g;^gRZ>iFQh_lYt2R zE#kIXK~NcR;b?AoJ(w#szHQ;_O}r%(or9=4ADtJHQm1;@V+FefznG+24RT{cwMyDw zA=41*okcTQ8Krs;3woM}cLcCk<38`G)P=hNXjd^ie7i=b)nvn8<)RN?-;c6=8%;7e zQ%9;9zqw=km}yd=6wn1JC2>AhPRVF7Y2|Uh*a1jE}MAqT=wC#yF>!hvZhyI}oH^I2YONn1Lpc z497x*PBJZ54u+H6EhvT{=FV{NNA_Ndo>VhwuXrX{eVSph=ac0vLHvy6X)JT&~R{}5xnS3lSEpk@F- z>nv{8P1xDhCogv-|7EXtKnCq>_{$XO>Fce%cFB-0pEfGZeHaMyyyA{POlSu*6CF8| zVvMh;{(KE#1Rfg2aItCbV_v(A@yG043XH4`rMOjep8Z_~DG4@*l;nao4+~ym1zb5! z_h1^@o#Hh?%}D7hg%YVIgQ)bH^AfK~PvWPhHd71P^`y9cjsLWUhhB(N|{~Je|pSWJGSsRcN2B} zBw8%9GlDBEHS`;CT}#JWT#w?_@qzdKmu#}wu~pp8tAtnikVe9U!~ejw^ZauI=sXMaJ+$8=zr1ge6B%V z_{#GCoz+*>u%sK7YC8|UWQ^p8ynS~?$Mj1?P**cwi#$`#S&3rh5hg;Sbgac*g%uH; zrnl2#ADiR#hKYYLG$LxWpdT-GcS2IFCaaQ1)d*2DYIb*JcE(nAHlIWecX_ZSeC&3fTh1KudL+_7{a(_e#;`qd;$Aqu}iQpa{0IqCYa7`_S zex$w&^?}vxWJ)zZOEsnO>&=)3mC-MO&$xRTQe(Tfid0t}qN2TgNi1?c2XjAk4U*NA zF|MCv9AH@sO58Rn&7^gdj{E3onej(#vUC$cL(d{t73X!{A5U}~v^%P;!YhWX`D!oz z?y-z`lJ$h)KDPKMAM`2(G=c$tOu(bd`M|0Z`$s-V1Ob1#qap(WUt2G#i38NYa)iN< zkcUu^(VUqyDF5w;FOSAPRNH%mwOrHnIsCaw+zudk0nVWDIplcpfv!V9qR8jsrh>+9 z@c8%U`<6zHX-`z{ zdEGT^*N+-=D(SG`rHT=(%LF)`y?z?@hn4M7NzPq0gMu;n$BtRb-3m0sbd~OFdJb#F zq&hF3GD5R}BECjjw=dP$LkZSSBbx4X5{;|PeF#-8hJ>kj+!G0FAvoI017_15rUe8v zn*CS$sWkk|#G31jblXwhQ=-oI*hBpI7!m0|Kbq1JA2EXWNU7QO%zN!YvWYoDN^~kw zce~$2njwqHp~p(ph3oH#H6a?*bRY-i&VI8Kl?h^eiypQz9U0?6W?zRd(L2i1BRkA#D0XKf{q#}_2r5vqOp zhEGUa9bg{zW^3~_%ag%fPvvVBRZ`e_osNLQL5!o#OL-({DO4AF$8bmbik6xWdYkp} zQ{blS3as(kX&Bls1@iAgcB}H*oeSuTnzbz5bA-0Vl z=T7BI7mscC(L=2ed`Y0BeDC;7Rt~ZzT-+knNoy6dh+2ec^zhPYBhW~Cp~$tTeP7pc zZx8V3)>@eTnl0!+d+=!1q)d<5kPX5a!8}M2ds0K+%{!#}IW2Sdbd#MSr4Sq6c8~$t z57N;pr>aR-=_biql6Hi;a<={k!!bYAc;1OT5c5?Sth)`8L$ovlpD6%UXB0K1kohAp z>xW_e8P?)oUL(GMgwH>f(a$wN5p|Q#TmngtZCV1G1coL^*}Go)SeX;B4q&KHo}3_2nA!eMkO9G;${K6^ z%SW`66JwwN$2YTi8}Q|8B;84n_&pXth!*W0!vyag_DgL-#eZgP2-Y{RfX_{+i#~0A z$!8z7uA+ZPtFaT;6P!Nu4IQGo1^q?)h`r$gs9NN`Y}XZ^XH04=bq${jx0KF6oG1)O z1luF7rJU09cO;~TobP)Sk;yY?6Kg(1zN7fsv$VnTen<-gL8s`(DSm&wgb^lS}5rN^i5zd;n z9zyv68zVkn!)cOsTpgrKF#aQ}?B4)^teeGn3yz>9!{rZ1PPt-7yJ^GFnrl1AI5nQs z^+23tG~R-jBxIV!sM4LkLV+c8))bnG67Dkal0G1aqjtgf;s%#(VC#K_X;(o z9B))Ft02hz0Ddt8vQ?W>M<&8rzB{tp2o0`m%@BX~H%!{YqVxv2v>}hzm3EwM+ihWj zl28#EP1`5(tyY*rnGpLNBh$AZQ8e8WylA-qZIwwh&5OOE-1sghE3W~BAuBH&>ky4| zm)V=6iX&EkK+~P15Qf^_HOK(|U_M{W0cPVV)|Tj+Dj2}=OFW;VUbw{3zN+Y_b+U+L z#<6RL>AiZMh!+KvHaW2UVwl01%#tcy`SB^2l;aQgr(AQl?gcl?1mvfN6bAtZG>W0p zj{-dMhg(LCF}xM7f*D4O0+#ktue0621){Wk<5Ah(K}xd<64vM%J;8#9jXlj(0sxhV zPk{1DynCo%b8#Rz`e?_7n#G}MKkmb7>H`*_jIY#yG&ySt9=khOYhxH^8LUlKSupX$Nl3{&?18<k8dSDTeHdLiu77l-i&mx1~6(r@1>%!TDa-nkGz?3 ze?**?+f1r(M-HP+)g*2pUbLj-t@E|QC+vvaGY3N!Y2(Fob#;P@`ppddwVjHNo_u5* z%dauBwm?Ez-RWyYductpfa|Cw<*32K2A?5v#Rp7#(bC2p<}R7eks`-vX&_@k4KvS> zDcg@*qOV*D(e;W*oQS4J7s||t8y;HfX-0BkXDn;3Re1YYVj^?nuONF@eh~^qyQ;%M zQ}*p*#}oZRf}M|PeJT~%e1{|>CE_4|Vlq@>Fno|qZy+$)W7rkWb6QN{S8~QRDU!-4zjEdJ@5ZtWImWrAX9% z@t#a1u)NVDZlJL$_A-Yp>MBiIn2?i%3|NWXW($(6n|aQ^4&J4y4tlR78fydqLcPF9 zc=UFbPmhKfQ37?*Xr53(03!r*k=W1O0wJCe0d?|zOdU+*h=HWIN@mw1&Lccst$*Qq zur$F1DMDm}RR{)^rCCCCew$I^vXV9?!^w_)uMkNky_F)AQuZURZ_~!-OB` z*6eQQI(X2ZuBnft`%S%!ub?J9!&7S4txGvlPwf zq|Ta%1-;{%tPJH{7gE&~SpyTO-8lKVkMdIOqnF&Ik{aWyw`Jru;%kUxVmeMi>Z!cf z`BS|-NLaZ?tll}QwRYZUX+Y&DOT8gH)E*)A&qwEJcXYXrqV1FO2`Il7hp|e$YW=_X zU2`Hq(iPSNB>1Nz^ue+^`=8e@)(>guk~%EgT$x~l7|&r*=cIF3JMNPaXnutvXmYEV z^9W0D+4=JUR%!`tFy~hEXtAx`TuU0rcVL)5myU@A8Mb77837Wt{@i+s1Wu)F+`w&q z-2seMCja&l9RCLaDiG@orOj2FaS3x4!H&9vz}OO~=@`phX7w|MwDqJn(Ok=(N9mHn zl(_SvLkgWlkTR=Yn6}53%SKhiLG_Mp zKOUZ)c??ibcfF@qV&XB3iC5PmYrQ&$|A-qkF4294Ox;EENrH%8h24=iZJa$s)V1?T zH^UEnEZ6FeRiyQ@6k8V40Jek}Iz&N{biXG(k)A2&K%D+9L*5$Kv>0?nX^hmRe0(Xv|8lB!2=`-<6%`2 z02Y`ExJA73#I}F z0eR4zIZQz~w*;8DYO#$*Da&~NhYL#40m%mS7W6#737(Jao?U8Jnv+5|*fEE-E(S>qcHi_ zz$3Y`zkmn<)EYgo0=RJ2uNlb3gKxdbXBf#pJk~zj{h1o5O+JfQe<>lVP=hZ(&Y7%l zK*kL$1;=Rk$;2Kp)_n4RGHpMA zd7vyQVV^-cjMO(P&`5GQ5EeUi^78H8)G63$9%|H<%ijO-00Ne-71lBpI;p^g@0fhd zukJ$YgU?PBsj*kQ(d8YPO3aHnOWM_5f|)&*7eO$agg`p$6?#TI=&1U*x9{OJfx4EG zgaT`FQT)q(>Dg_dfW2po)2y^KPRV!ugf7LdQ>~N!;$?}ZV0O~?(Bfvh{f54t;a(MUZaFQms*1G?2op+GdUJW5uyAYQIyR@3PDk|Fr965zXBPC&TR z%?2E;Ab=uPfLHZK*6^7|frZhr_qLOBlOPyVCuVp)AK^h)W7?650$jjK2)053g82vB z)3AM9HH4^_*p^NQPwa&r%LGTKgC`TPksl+OYn|-be6T1T?j(&Fl%`bL5dPaz&0+Xm zT$UfEvYI5&9#aB=E$`fVs94?Ne{FE6c)f(SwfqtUSfnPLJOTxZwgG!1p|#?`F}19| zfHn6$gKCK*qSoYDHJifCUlQw2)Yqou1$KWOH#epKMC7gPYXvr^E}%DDk3Qutk(xr8 zWW~yDZc#{(S9>f!^hS~4vT?q>wIV>`xX)40tSxE>@g!Ib4wQ5kO~9UTAqm&f9kmCJcsE0)d4;c#fVw# znim6oGzTaIkkA#w)9O?PEsu?}iU zTB%-aL|gW`7Y|(VFXhXyZ?IlR zLkC4BKfE&9g@XQQXsQj;GVH6xbNhn_dMugV(s#T4HP0@<5;!~ZuZoe4U_SN4;s2%5 zcLF!qCo+r>j0JCua^pa(va>L%dGhw?A)?M|Ew5em$X*6H>?~5PYSI@gNjJilK`@gJ zR26f4U6+r!g9+p(s15#bHHxrTO+9jBOho&BsHvQ_sHYhD@mGwkV2^gO^J3(R4d)4@ zQi?oLR$e{cz9h_8hW+j_Z)G3d#HT8NqK25nY!GBlGuGDuXU&q<;NCHl74d+c#a4O$!ydUK2kt zsHH_Yb&a$rHqzPa9Jhx_qg+MTyW>;~M7H)^v1=0;i?Bt4<~KauS)(gI)a460!vlR< zANIjjUBj4t_#gL=I}w~;cXy>>8c17kM;@^xf{~lWBiwR|neoz&UEz4={k%Q;3=a%W z?fFuE%;cjs);yx1eWauf5c(U-CBn0cvdK&vAV2soTfRcQ`< zsV)tI#ASQs0PsE|D5B*NN3S-BU9D>uXaHoN13x+w8)$0>s)kUPw^WP|66S9tgFSyF zY?`e<+ngD&F8CV*Ul}+aZTI71Pf4BJNnJtg3&_b#2XvD=%2G{24%fh@{tfl|ZOi%GN) zM)ddtt*$i|95D8#zgJeUSk8^(OYD*5v}VZXTwi@={{i=!&-+iqjGu^`yZT1@)8*P9 z&3*pml?Uf9?V>`KvM}=+-p!z7MX-RIc#P8;;MKHhdAPkZZ4-~aWY&zEBtp)JX;jNh zyDbO}i1C$ZTitqFi5~TErqKxM7S453? zHR2^6Hz-2q=$>l>?&z{Hr%{I zWydn>bkUoR+B0b~(dHWOGqT@oCn~5$iwOTboApgv1R>gg_H+6j5|OdvtRsz*>us!V z&JuJ|5IPd&4pt8vY?0uDT!1Y$&Is~WRz36qis>*9lHXC%xl>%${?hEYn@T|Y3)lNj zB$j72q$=i!AnzrVz%i>?X^{(YdnzM|guN*Z#bWPac`C%}4rHCs&})qai5l4)Oi zVtSDaVMu{bd+QWkVw7@|cYGXOT1gSfDxOoXlzZE2IUHue;2xqcLcm|z$%i->8jds> ze<0j1M(-A=yVn%)e$~I6a?HIJFiB!ccoJ=yFSv)r0BR)2^hvXmVI;*nVWVwZX0*)l zC|hQ8(OFI`Ye+JYD6XsOi{dMR2NBTS$5DgHc=S1I>R&ME?0D+t@S!HqwJ{ zNOz6jDDgxJ&^m3ZZQFa#rXixP%jEL+thib;cks0<8}+KgFx1Z$9?eSl^Cv5n++@Hy zO?oWOLo_+x@SL7EvJJY($qv!8aCKH*lCeHP;EoaoR*=-nv+Y@QR=Q!MbsFgbw};?T zR)WQ_a#()U02;!hR+=a{$4^NV(7+0g$MMae$=7>se59R=*&iGH3msP&Ng0&0%gOH8 zyYkZKyA^-0dM7#tos;kCn-#k2H0>r9*WOfi#6<)E8Yfr{=0RySeGm}~sX8-2um`R66-l*6w^{*Uj= z{{RBCq^KoZd|yJU=;e@|uu0064-BKRG_sWZsH};9T!_(xtZY^FLf9(Mu!zGPP?pT>Vz{lX_JXS`9&Tcy z`&riAv5l}$DBS(UNM7D|+BmA-^;m}8h?Wqw!~U)RYo0V*DnAM|r2zv#HT zM`82*K88Laq+IoPsx_V*Dj08Zx7{JJYvcR->!rbcuT}m&oo~F7d#c(pu6?;r^V8|g znC`TO`Lp|OId0WZ-Un&X0n5PLp>pu6&e(F{(%$!c5-B9^1(XCK2dnKaBy%;$$ z%>2A8X)BI>adoczi{ieW`cKZs{dY&fY}x!#mZN)PeSp9s8v(s-kbLIw?ditr+~^dHIu&q<-wG@yFZ=8YvzhB0q58amwYA31_4=Rb)pP+9Wb`-w+eqwaQ%FKk2W`hQyk!L&r`a>hznY%I_TCd<7Dt_* zm$$hHPWwasE3Q+NIAP{LP;)iiVW`=9uR4NEAN|WaIj8;7bU`@qRPEoqU|8kOlM1~4 z*r0l)CFqyHFe08(-FH?i<;tJLw|#m0KUchy_!1vb%T=aFiZ)-!Jlpk)ryV(XwLkW= z)PB2@uj6L?K;Fc66M_EJu&pEGHh zWhNEFX-+%#eo2HX{inq<&3*`TKQz4l+xI_qm}Rzoc|JRBVsfVyFNq>`Yt-MfIzQ0gSMuq}>AC6N)~@WN(2o6# zf%40@rz&mGfPziZkQe}I=gw5sDDL{1bT26aBf{eHP&CQh(3$(0~a1KpKUqv zrgWQ=)5hz3J!)BKZNG6>`_1aL@9(b}RGgWA_*K;^eo*dd_MIokEnPumVt_1 zfcJg%R3l$_v!e{&SHNWAYz`6VAIC1vHLU#ZjxzsH^LbyxBc{mk#pO3*xnukC!$a6t z)4rkfB`3%QRL zP+fmhabbUpXYWqe9Q5E|-5|TcRl36vDn~M+y9^v_KU_NjYnZ8yIQQwlC%^tZE6w|m z^p!K6`uK-f!o_&efN#tBA2h_T4;pV&yk?Gh$&mWZ2JgYzq2DVtU-(^4NYoBT#DtN1 z^0zJDdjO|AJ+uqu@RHVLwWs`2YAzQ@QQQ6P0)pfM>^o;Uwfx|CvT7pJcTgejV83!7 z^qwe_prR;zfA#n+gMGtgxK3E_hO4cU%^7dsyTPFs!eCXLiVVw@opj-a$V+9j7iKK8c4V`tysHQ;5K z!543<-#JHKoM3x}X6YCtVfL8xB&T26U|YZ(%#pA2a}ShN|2#bR)bc;e!GsV)2{1{| zhDDV7es+0yIbHSC@egs`&mS0tHFd{0<{#ej%QnI)&YCz@oddTZ&<3yQC+wWj*x2jwG1!X2RD zi|_aQ?mqJw2M&(B@*;k-|HqBPQQlEOh;RA@?S`l}Fzi-Zk8YTLz|G3d^~b*_v#uN) zOZ&t7N4C?e-YZc@LccAF#P9BwZ!3ZR*n7BL^^>~~)W+Jn z>-CsAI*i8_v#YtTX1y||@#c>Cr``Tf7S9e}X$89}D()*Zk8W%zvyk&-4YkOf`=d0u z3~hgM{Jwa*PPct+OZ-=TxashRkA0`ZQUF}_mgrMUL(qOU5CepGzAbINq4 zSoiDxvgNMuApcYgS)+VN)TqkAXX`@2=bH^H4^Jw)Jab3R>@^Ef-XGvo?%jf+AT)%E z=WZ#`xNQQ0n0(MxNj&rPlM0)YU-=S0y=}5i-ds6nxntt=8LfRh(fZA6DecwI*4yq$ zf3UQ$Q@?36gL(CBqGbCZGo>S=^6G7{z_>Hk3(5a2tXqh$9_ zG;!}p*y2%q#Le2EU8NdNH8M6|-phOy6cw(1rAu?Hj(vTyz~HWt+&s#xPW+@^@2%tu zmXA-|y1PD)>Z#^NK1Up>i%qd-O(@>H`?>T27b(+z`j2(&VrT39{Yvp86$zfxf1h`o z4(dhv1_l}j_bz6B>!z&$J3Q~b1RM;$S^VjZ3#d^Y64?-;$FbP)b;X_I0-pA*IQ5;c z=l&ht)EkYNx;Hdu%?|dH{Jws(K~AIYhoiJCqL?8@)ni3^ka>mK*7J)KQ%7$g5{2rD$UG0r+On+e;yH_PZp*rFkcHTrA~U|N7c;wH$kuH5{||zR zqDdBkoG9ILIYg<#q7=VGa~T*Y*EpZ@LBcYn-N){fOS4nrM9~RFdz~-(!=C_RXF3K7 zqkMv%#OhV=(onZlgyH_Wl#oEs6REx+hn$R_)HcEn0-se%RHC}z-M#mLD^}PT;qD@_ zsC;d`09cGJp2hDGzyC}Qx~qwLFas?YU9gYiY#fzAj8ha}usrO*>A6}Wkc`AYcaW)* z2SQU~-jQhaeIzs9Jg_e{5*c?m%mU;ZI&^ zB&|dvNH<-T=ZOb^p0K5RuYQkqdpalIMH3OJh_7Fb3VH6tcO->!`yJCdM#eKT^bTc? zE|-uJT~I9Rc(W$-@QT;f?CXR=qEv>_@MY&(EQ32)rf{Drwt#f!MOIWlh%pDQNXGq7Ti+9T5_{uN_#~IVj=~;2!Zz#smyZM%5o-1golsYN!FaM7PLUxU#qJMT9J^s z^g^lYlAxjdBwetW82Ay?%T69lSAWcQQYH%1T#nQbyt4`?CWfTmnBHPHK!IaeEcb)^$ca<4!k{hKU3`-^0{;?E%}tw=Bh+;!qk~j+^=Ww z#b@SU91NI0My6a;KOzpHtBGM`_XgLeur`@P1R1O%fM!EF?^)#D>RG^8^P-%bksz2p zqvF338C)U+MwfBB-ZgA!)t(_Wi>2(`YD!qNJgY`Zg25gsx{MO&RF_oN+1%r97l&}| z6%-Rq2}I;1zL~>KKSiu|gd$rElw8ricw6cDl*c~wC+#-*YUBw#^@PKCG| zu59Nn5f#i5Xbh(;G6(J=BP9j8PVbSz(n1}YVYXK8tkya$xO13uHw{I2r}GF{#uFMcZ6$rUapZ!kjsu~+OFvMN!1>*qi1k_w7 zM+t8DAH@I?Y^d}vf-Y53ZrO`EW6~4 zhbz9FtvkVW7ef%C&kD1D*_Ub{xZ4odHK=z#xa<@l-8}LzqD~LyA%{bwKMc!?@E5JgGHuE%SqyYBtjHtjxHX;pcrCg zpUReKC#s(;ajM;hQLTCI?zXj)QIBG2lVYn3C>*z1*mf;x45BOxie1?{Q)`sv7~r5l zIkG8N^UHHIvawdWj7tD-=|K&}aHg}mshxMvSOuz0Do%tLG6~FQ${tU($8oP0qH@J? z&s|rzhHG8+M?xn6#*5!3D=CBLFW$f+K>LWG4G?H04Du-lyhwq(a}c*k5MPnD?Xe=T ze!i_dO@REa5S#uAuvY=Fq47(bpq?BcqcJ+(AIf)y_KWRYCNb(WK00jEPkYuBm~ND; z@Vrvt-?QsgkxlDIN5N=M=|3MGsc(V!omvSPK%tWQU2bEGmK;Z38Tcqk-8c8i^j$=` zk=+`i$E%g~_f1%fT~PG@F?8;KE%tvLzjp1~cCA)j+d8cCwL|CAI)~J@RxLUUA#9bz z9f}abwpOk4I!Gm12{|WjLfBSP2|0c5oL55Jq#WZ;eftkSKU|N;=X!tM&)4f2I1T-I zt^V`Y;KvQ@`(18BT|dJXfMHDiw)Ef01;ed;!-8C_flw2;fnxI_nzMvO6gfC9rnDHgoAa%w3NRFg2hs{6U+Rm>+!j~ zjc_GU-#j&r#PK>97><~MvKq;;J(!sHbm7 zcCyz}F&f8~=<=e`Q;&OBh{al`_zCA(i-5#75km&(SL)=cyk$h`0O6TZRAa<+c}5jt zb3zA5ud&?k>L)U%H3X_C(nftE)V_iOuaCErDm|JB+66*S^Tg9E>w7CBcjTPZPr;2k z)SjQ*Xnd?YJ!Q>tu|GVYkzRH82dj>-Xy#Nj@QW^)6a!PF%n*Dg79N?WlNAVe9g>V` zRU3uCpNE{E0OmK52JFoh&pV?l;XKdG@)eFWU~ZDY{|VoMmK-rwr6Ai z{^50|G#i(Z^CcI5(lMM<-`gPB*X{{xvHHd@tg=+{6!-1k(aE(2!M{&N-4C=5|MSYH z`yY!h_uQ~Ty!enSdVMT-XwOs$arN$=n!vr9>0ceqn>uVJl~_w&pU|jr!ubuUQE>q9 z*SoJX1{cf4;poktk4z{EyA#o&U(gS;iRbb1_Y}rdXi-Dg?GvR?uGf8o)PhxMmu=*E z@39y?zf#*wOFsV;8b%CLX^HvW#MoFks)r*@9PoDJ>xk` zw1UYe+Afm`-n0UUB_(vNuL|E@{9NLCLFpZ7!Gu)3;n3m^^-0IrqD`fHxj!~ z_iy*GN~Xv7h>(}w4!r^B`xD6C3?@CsZyg{z%h#oww=p#io7INM$4W%JVKNl&Sa}fi z=tcaILEw{^zMjlUln%I3*HT;u_LLu#A%nKILrPx}_U4)Uy7Zv5uqtcfOX>H+$xA!3 zm^P!l3;fcAqR@lyabM`X%5<5|8EvGe)HFdI{dy!w543XSY6^6@3c1Bi#;F~vp4ex} z;>E@>8)dokV%2woq9x-6*BbPfoI7FG&;JrxpOd6`O1AcTXkAQCm+MsMhTCx;A)JcJ zt)^b2)Sk*EK9Ga`w>p=N_0`40^-ZN`&1%m#N5kXJ)Nha2vmB7{sz{Z6H0PNf{zDEK z*((oDSb#WQiEjT9W+k^)itEb?x%ST3)eQlH+qv z0{n?q58ij5Yy~+x2t}6)(g@;`eC{POd&{$U0-8DbGoULaZze6e3`Ekue2zGBV~*?8 zdFIjVme9#}c4KEZzWlk06EFt+H?e)VY-VKYUvA9qFZX^-xqW`Y=rr z>qnjqYlQZ$R8@~EmqK@YX!9Gwz>Dj2CWHi03HnG6o8LpJ3&WDBlf`L7B+^DnrgPEE zA(GnTj;&7I*E7ix(l@Rl1*r=_J3 z!u(wdoKy=2+Vsi==S?Z~I7v*teSahQf(UR|FAA$BPV+kR@}`whDx`ptT>X;iS5Zph zRAL{L0M)XsS@{F8YX{xbczUNcmB8xt8XCg;T6^nP;M6gK2-fnrjYfKA8IZyD?9B`P zB1AavWsK+xd8?0`1RUOxjVjzR#3=s@d30>bMr!>&F-XmTovgu;%u`m^{*;h*RWz<9x2m?|okKPsYEjCp1|V-*{B7+HuP#<~sRWwU&3^46TvVdw(Vq$8s{A z=te50*B;!(R+#@UIGXoPYFSJ;ap--3egu?vB>k$K6>@h3D^;CPMO za^o*WGPGhv)lnH=c_7Jg)t#eWuVcWD7_)=2@O`rbjLKc!?(wd+>en3DCPSR*p(;sN z{i=lqY#GXh`t6%&x^LSSiwh+HIZc(rHvZv9QIFSscC7_mFo;(%v(K{Nk;n$_kDxDqa$1@dzWdK)T)zkWZF2YQ-O400hfKjxt4T<0gZR)7>rXh}|7*s~no=U~<|& z-|m6%O1|AwBpogb6Lov8F&L>OxEU%wq}70vCiqiK>r^X}*1&c$Azrw*l{-lwKHfA} zuvZN1%>%MSr2nwV?cNt&By-67#*0m(Ep{hr7S|`bfZ&Mz%ScrJ09vll)wu2X*56t9 zVBN|hUEu!s=W8i|FwA<}C9)zTKi3lA`m5gr3V&UHt2g<Y#j#J;TYOUuS!Apr&a?4X>q{gUKCsiq$|AkOh}dE-6>N^VVMNq%2)TJ{ zmc@TbUqV55ZqfS1s+)W;GEa|3r?c4hOU;P5(g-#IEznO>3K?;UCHJdVl1NKb*0lkv z!g)3%wquP2!gz1$&grJpFL7%sXvVVBU`9cKO*RvKO)d!Xpuc0?8(oz+;6WVpMuXJN$z{}{ckH9j0Z|on2Qql zk?BR^d$HIu;7vy_ksTBi7gH4KP;|mu8_y$?!inb;AGZX2o$;q_JV<1Rg0Fcx=q+OwoE_ z#`?#%^l%kBsc-`am*X?gtJ(sU>-g+`H>BD(T8sPQe*&d3k-!6$05xg) zN>#z1UxJ?ptbhNv>+R2tkAWFX$xrW}KAI^kX*{Z|==%oiyVllNMUbzv*?ziyT%p;y zs%aQ*qwBltwDax-VG{NHjtzpG()9Rfna)4^0qt&m$-IR(gC5}13JgN>h@CRaX!Z?7 z@eyPBsNzs(q|qo=_Ij?IE%-(>MA3tTI7ual5Y6IWEh=cu*$Re2fn|0aG*epCqbDkB#_I_DeBUE$ZCSS@wB32(-(XW6Dy))b z#+e?$nMjqvvRA6m3&G=nBHundwIB>D?2<6diq7cAV%K>~%WktBPWXJg5Y84vV$KO` zwo=wGLw1Bdklm{%KM^xc~e(MRG%6DM|Uvj;JCKoog&xd|D0`izN?y05~wR~b)tR(8AXNU6C+3u!g0 zz3~G(eYwC2pdQ?NiKnue+VpwgRXxsX*PGQV**#q~TC@A=?Rj%R8OxRCbQeg2k7FA>SULXi(}Dz#CgUq1 zUW%bp239hDssav*H~*}6S-_XCxvLw`IwN+!XctQ7U8c&~Ws_P7+aMbHFV*O@XS8AG z7Jmm%JHp%vG9o4+a@qr#nXT>(ir?~SnNuk98^0>Yr_aA8XMp7%V)zy-Y=gM|H*pzy z@q5OA9Lni$?#1g*s5XN%Au}0*3jq*{Nox9?cj7u;dVcD)J=!5S7&Z(LxwhDIZLV{8cimTL7BhBJ39a>&v9^`)QD3Vj zoaLA9T42h7{#C`znmQW=VdC zs8yF8^&VpK_36SZ`qpLb@+4LRJ*sANRa&}J`_f^@x2TcU!`?UeuO}|4NqK~FK$JKt zpR7OVlXo(Rfd)Uo-jjV9w9u?1?2w6_jK33U z%8%)s>z?W{G-nJ0_vGugzk++1L_cdU_H-&RpEm1I@WVRp)|X>;{+`oT#^LO_zLbA{ z^T3=2aIO<+IzRD%z}xE@;Cz=5XFT8FX}I|E)tdm+)cN8nU_TqMhd7t43SMn|**~+& zw(+<^R1i_*%9W;JoJiy^CX5;kT-_!9q(N z@y8+ju#K7&3*0J;MC0|9UPo^}Add8`r#GLKgHy~+{U7HmnudFcJxbX~9iAog#$K<&ij{&O9qyr!F$^T86$PQBk=zDDK%;~=*S^daePiMc$1XOJp>Fvv#=Jpf7=DfSlNucQPyx420i zmbTf&@(essQUTMhQi|N&-;5vHP-T7h&=Y+^f&CHjl(!)#Tu@Q3`xqLbV&ElzI;_sh z-P*VpiEBx7gl(j#!XLu<%*Df9w~wpxYTHgB@}1581Gl>hh4HcvJqu-a z$(@#0%G>lW$(JrwafpiJ1>NbEYhpE!&klvb^P5gx(KJO~9vE6Y(ESV;%e^0SfQFGRKPl z8h;fL547q5FC^mg4~a7-_LEC*0c`UH(^o#@(Ir#cld`P8M@$WwOn*K&_PBI@{n^0x zXFo6NaJ%X-vrGT_i8As2WN_n;3XD9G9~o-;sC8*7cd=xi#9cIh!g+HkpNa8?>y9jj z7&@-hA2O$SWKxId(D1@S#I}H_Zo)MJF{7$SH(n7p%D~5$Kbp*z zFiJzQar{FFPm?Z}9abN+75UjC79=NV>B9(!He?ut-Yegm>#`oLEBdPp5rY@I7wx*) zhPDo_G4%(ql2xH56{Q^M3JVS{EIl&3-7QTcXR+n%)_)c4^DE{zD!=K)#@kX`^bC%E z=#sF13NZyMFJeuV8!^Y39aT@&Vd1sHCp`ifniNPL%1e|tqufTW&1|Y_3 zrsmEnoD6DsQWLI@wht!iz&A91^?S6Zp7YAB$>Rg=e&M#7lNyoDUDgEKNUDkfM{r~d zA4|(Xfl=f8Orbf2BTxF9y^?P+Z9Bn(E9fq*onHL8j=?}dN@~?Wl%sO#dXvN7M`N3< z`tagMs)_{W-+a5+e{7zrM!xClFYwelT33ZSf4Dirh-aCgSpATsrsa_)$-yG`dx`n*w3(L%2xe_i{2!zz{mvfr?t^(D?6Pc>}qvl zw}I(NoS#(g+Bed%c{)8FJ-uangXSed0vgK%?#qzLe zf&OHe+1Y~cqlV>>C}?lqe{!NI$xXQ()eqr4u(juY0OPm({Z^)};XA4azPA<9&D?BM+T%pQ>S& zynYQBW%H8LT|^n6;5c_!=QA6V8QJb$&O+UFV@F=}Y$)_Xx(=o;$&Se42b!+sFnTd& zT#i`679~j~(djxAPwa?0HCg8phlw&s%Di#R1vsL~nMenMfYwWu&j)ZYysvdCE?>}l zs6Bs$i=U4(k${h_^&TU1dZCwP^}G5na_9zI-k%vk#-Ye3vZf55g~3c<+g5UJL@NyEY4^eQ3l2TP znZc4=W!l+-HjfMTYiAzVmSXnmm>q7kb-s1Kc!r0HUuV{hn*)tgKU1)r*?oNV%-Fe7 zan#qB6QA7x4({!qm6~6*tAVVr$$#@wZ%hN9{xf)K{mOdgkIn1#R!S+vJRCeZj-&US zp&E8sGxRwS$PN>` z3K!JSs|1$huU#f;!X!1@qXn?CUPMmz74g5e^fdc$kFn#$T0NjyTK^8;y;`96p~v-tCX)$)k6l4!^6RP&?f z9c|%+f^B;!LK0Er-?*^epq^^mpXb-~s3i#M36^Z$x68)An0s8O2DJ=poLk`tWA=Y! zMywLgtM!ZB-af5z<`qJb71rVDnM66|EV{PuxaX$NAnQeP0p)M8ep_xr3|A(doCq6d$mKt`P92*0M%dW>B+X zaQKr4YDJDG{&Ni{m; z3uBq&LV@=;UNU4VBJ$qWRh4oM8lSf@zRLE;^CUsUYG_e7O0m;qXt`qIh*6K~6pSH) z(!-D3Wy-~uyJQ}7Byv^HQg}B9O95Bwm!mJXIM<^`%l@VI%hBGx@tSCiUZT-?lsI7* zDtej0DoQLCaI@{Y)q1yNy`4lXlF8jtMHr~Heds=JbD5r4$CN+`mm{aM^jwe=u}Kta zx$X)o7bGO)y4AQX$rGXvixjfb?6Qv)IG!o~uDPErJ^pw|8-Atz3!qES6=@f(Xo@^N z5)C@+AXGi<@^p`Z#qTZuG-CaV4~27mMK2-G!O(SGhRMiN^!uUzb^C-rY?1@@g7Uz zYTY+|SeYAy?BB9L?}``Ee(9~Fvfnpb?`@HIwa3{XE@!+riobyc^?Zbci;6-= zuRGG7Ar+sw>WF|P{xt3B^ISBo!wxcOuL;B-7ET84n&a6i4$M8cuHP);HxMuG>|Oz+ z9isv(zipWdNOXWzH)rNhg^VFr(x9Dr(%#)c(C%yGAFo&U1@1O_T@>j4_Uu`~rKu=j zCpvwV`)kpGA8)KDZy9`Afb@iinSv#cp^lE#ALv!$v<3axAe1;r2FCLLl`SthEpX%y zoU^N0NbTsf{TA^OWA84rVg?lhVK|S@fAr{%!dL#H;2cvQo5!pR1NY4?ONzxh z5>F42mGa;sU<1cO-B%Da!e}X9(Kj$pqsgvi+uxzDWXLbE^l6ygt>!uG3lcAi6@E%? zZq8b~%4EQ%9{z(pn65I>_&_zcRRcW?0mhkZ<=kU}F+OSPI*4Jair94OI8i^IO885j zM5MOpCNRt7!o1AlZEOC8w6z1LB;hib)2MH7Q8MG%J-<29o8**lvfrWEaVeFuVenF?Ms~?&w2aV2g zdY&SB8qqc{47R8K<2n6~FjK#S;rWMoX&hU*8w>DjK$!UB2f9L;apy>xRcU&@nz=Ib z{o0`2P0ZLep3i%W!~B$B3UJMjCJ#ZI%$6`f;UfDag$KBQduZD6HpX{t@fvCh@pcT6bO0M_JjT*JDaRiI7CHNJ?~*SicV_aiq;J5DWgBtV3a!+U zzw;W%&K#j{==$A3T!hyZA#Gz}|1oCge+Qqw5j*mZkp$;t_Zm5C@X}!i+tG$-cED>+ z_F?gFjO?zt{-`x;d?km|(WIJ0qUTz#33!Vc;SSPK)vS!z3yQ=IZXlrx5I?<+1F&93 z;@%=~b9&9S$@fM2K%yPc!6B%gkTVH0m(+&9-|wkn@1fltcccMdFO;voP9EQF&|kI} z(@t017`r8#nbetlA3AvNkkRNNxA$kQ?-H)w|1-HyOSm4x?(>T;^B;FTC$!F?o~Rxu zR2_#s>59>6+VYT_%`$%|C6xr7+aH(9aVCarF+7NfoIe(RfmfOklSd#rjG`6bAx1`9 zSc}$zOz7tz}oj}GbQT{*J02PKlfjJt@+=<=ZFnuHdC>{iRD}!~?Z249xxox-e=o{$}e69d?@oCgWu%;VLgXHcnMySN&E^08M_k>Br{7-JfKis%#h9%jC)R4&P+G7r?ggT3S+*E1f85?aSyDZg|J?vATB9$2s_02hqi-|7b1B zNXNtuJA<`?Rf6CG`o>xM^d@G5+{))D;Z*+W+1~4vs=@36KmF5yQ`X#XbUeG@5qUi@ z@SwTN;@lCF5%HMXoUh|y`n#RQ8j@_bn+vjtzFhw~lt$(J)<{SB)W$GE0m5pqi6`bQ zZS`;uRxz^ds(R6dwa%{KRJ>O#!whetyoj!mOYh42g;lDiru3u*IwA6aV>^wJzvQbM zPb=_#g~;Ka9v^#~!yh-MNqbWr2Z#l7m_%gI!sPo@s{awma@;pu{cu+5(b0HI@W`Np z`(wkZj9Lwto``pg&Jr=(s@52iFiV9bn~84l143^Y2WYd z`L=93<<3cWanp&|ELHd1>D61pna@O~NFrCruP zh|;{b9FBGu@H28VWY2B+ea6YsX7uE_{9xBLJVUf`L+C5fepc8x(>JlmD8JfHndT}O z-**B4Om%!4EciVQcH%qwT)4}|pv8HFfj7z^H1bH9%aBxoY#X1Miv4wdYqI*MF5$b0 zb=TU~Q@}@PWI+e?Mw8E4Y>$f1SrmHee_VT(_~$f&lF4tBTQm8l9ZY}3pvV(XGl-;^ zOD+1znb8c8lyS?xFvOE+-S*c}TQ4RgBTJncOSyurshmu^e6Kt{XUi!Q=p@l!oj(pU zr9q-l&Vo_EI2bwan)R0;Yzn&*^N+rbjg0;qR~@NfEp6I&PrR?YO_ogDL-gar6NYhI z_$mJs;wT6xfVeQXOrBxdLBGiPNu#*x?MX<0wB7E*xvc6 zsqPEk(IByMLfvvd+@94aLhjy*9`Koy!WzfH&E~D z5^2hiA<>!UH+$5PtFW=ZElX#u&OvhE&YqQ!Ud9pKX8adf8>?nO<-qM5)Yi_LK_U;Q zcVN|t^DfjVR>Bq%#Fz1UhiyQxs*l!b!LpVrl(`^JN2N!yN*q(irO}5sU^7~QUy36DgJ-^(JQV-DTZ;#D3=hO|+Z`X0^F<_2 z*iR1v=WhD)>Sh0?=f*#7M2&}9&zboO0RGV47Y8Q~g_6W|ic{v@H|9EP5cA#%=(ZM_ zIH3Tgz$sm0j9duZmKO*VpvM7n< z{YT+543S$VWj9Z^@0|lzFTc<_XHn8oB)Lvqz!83Gww2*FwB_A~`-K~1NNR~P%$f{b zZY`Kk3{RhT1`=U&W@-I&x&|M%2wBd(D{E8Xuk;QE+m{!J49hl!-QowyDRUv&cZ^nxUl=F$#C^tQVMAOB?P?)Sjyr@fEpWt zM0j>5?mGlrl3(p%ENgUAVTdbglKH%ou=zNq(UwQ)d*8K$mr4TBfr~g08*S)alxeT& zG!jvJ=MOTL+oGs7h%u1fJcnfbH7H6XgXkTMHvyS0kaK~1$gz)acUuspGHyjHuM zgM5gV5=2!4E{)doUSk2^IdnU7U~x@|jH9$yIq;w8&OxNnHfkzHCQh{;q51x!Ojy`= zS&}MakK+#&W13K7-2>&}?+U@W zZ&g>D611T@?RzPsuCwz^1}7Vm4tbI~42%T^nd!gPVgGTJz;8~7D%W&C4~fqgmj-dR zV`o^<6_>g3hY^GmAJs|J8(xmBUw^f={M<|(Fw3=TaSW{?u=3u_#x_uV<=5WpRx=-9 z0^Zl$L$r6NTT7Ym>*?&!nP0Q|mc7AG@^Js9MA?R}3Z5+T zThj#vp7X+2nA5YxLKWBEo$GkQ7Kv}_sVWTC5#;h+``OG9Xi(wFGePa>vBa zHxuct)CAMeC@*t7Z7Y%c7+c=toHV>PN}gnRzTAxEIH4m7O4C`FPAw(|FOagTiuCm( zu9%7A3${lCGo6pD7vcg3Wy4rDP85E@H=Ck_kH4FfpGEVm5und z;%})zM=3O60c+n{z>mS0OFMp%>M-oSnX^l~`XcxvA4tZopDm&{T9;th1ij2y#vQ2K z>xKT%P|TyuJcd6d8`{REydZN^>0-J;<_*Xyb#GV3N025e?pjfxLubn9yzNpYiqPwO zZRnMx&9mdnu{H5SCf#}Eq)$jEbh}_hM>VXl&W`}C;LQ%h_Zxi~#r5P4Exx=+DE8M< z0!xM=`5d~ZE4N$x2nB*bn17|wIUJ>?fswvJ*~0rS65w(02?@!&P~KIai;-Y+rjFDmEMB3E~U%Cmek z4AYJ>9OjkyJ@^{hoqwS9L(ut2Yc}IKaVDnBlKT&^_^&wpYQ-iloO>!N+M?e-4VH*K zib1W3p}>Gt6Xhv=fgwyWDew%yoh0I3GqGPfcd8&yFUL3chSwX=qAmDBOU1@e4mncw z{<&)?K<1JC=3O=~$ordZEseGJd)Vz?EK1JQBZ=|vfKead?(9G7^wl}Eeu8Yr2CSKw zy|eoFgwLI+SGnKzmgP=e*sisnar>ZajnUTr-umjzpMOn;bpv;l|CV%Y@&UxmxtmME ztkUjRAqUX47ih~B5$KHUr_t2w)uj#VAqVM#WCq5PSr?Ue4XB(JxLM?Be>_ zk}gX&&&lVjBCXIoVYoCWV!W{H$$T`hLfvVw_LjQr6k45NXF3U3L2(801@bv_a_9>4 znDdyYM?G8G+)upq7_=G)rVE18MFoCRZ6q!EE}|CRnHADoz5sAhdt!Z)>717Lm`xgZ zNj}RT!e3;{Q}8X&d|W=WvqkZTj)YS&GzsHW*cLCkCw0F+AeXJep3KB##5c5H>*g z8WN0*3gNCC-41VhC$vgbfzBN=zl+L>{)HFlWh?+)glI@PLoLv32t%ZDeoPyUMo%(g zn{1AljnAvkaUzsq-xP#mGyp2DhwbxIf_Z@h;0TdRTm~w&biVGYoFXy?vny4my+@rl zQNpK=b~b$r+LnI6LPb}9#1Mb8664#$W2sZozDbAP*+KiGf7AsHDUVDx=blxKwz&0_(1$9EQ z`w2@Qv_cgv*SCv~A>9+Tz&qs0&k7A)pPi(qZ7k=`)phe4SnBG0w_qt*huu`^Vftl9 zqp)e7#Kf~%V*eSuMZ&%K4;txL{7>fhTIROLex5TRHkaX>L z06Rv;(2B%ked%LBaEX{52c_` zcLJ!l1YXQJ2FNP+e#VPy|K(3wkGnRm-fH#hs@;hBjj5wEfWhz7y|ZS&g1~7DncGyC z>T{rEQcY+I7#GlHrh;asQwETVHaXW&=Sq;H-yvY(#l_X-w8_>uF7{BwLvH-H|P z@reB!8kL3&WXcark$;5d-6KG*Qu_E=msMtk?qpY=LqA8@bgXM0OkZB+=dN?PoRmn{ z>L&h$T|Xl6!>XIP5q_yn%k3NLLhtgC3%VDn{N0?pHmEI9nX|&6VPV$8uz0%RK5<{V zS~o5@dXg-!$y+gZxj2?c-jw51qgPCRQLqtdE(&3Z5-nKKHTEle=!RFAxITdTL++*5eqeIhbNgS@+B4a7>wEt3~E`&SHC1KQE@4y6VLw~&~)Cm5h6yCpN z)TU$fN?u30!86?V(Ma%jK!Vov8_}(avxj5LDM~>qQSb6w$^=rlJ^jk&guDCCFE{Ml ziMdDd>eB-EasSzjJ=?U_$PT$|RqBN76qGmO~i2=WsiDss|`mGPjCokW+?JcN+XJ!eG zPWeydvz{vGn^8iK=!$iBy%OHye_4BF80iGTAuoc$n*AzGLS@H}Gv@qaeL#tG!Ur`u zU6SpZczv98c$Qw7K@{6yka&@rL@H=lZ}#o(lc z+sSZOOK-f9hk5J9p);_#^dOv&oD;#b^>&f~iHt)TmE$E2(0`Dzt*Bs+a0SJ0NwZ$Y zprs6CjI$b-QzJ)1GPysbcZQ9l*X0z5bN}`tuPW}Sk;HT3@9n>@Z`F9{OOu>RrOxM1 zvDziuJhOC1sY0BsYR6p}!CkU{3Wh?p5N5FmL!@y3cN8-t+7bU{3vMW+SbQ5!-PkDz zW8r07#G4wQEvpAN{g`#eSIVeivYzr_m+H<>hsl2R@t@WTkmg#8(2p!5nRp}174NpQ zbaO02$UOz$MFUaFO}T!bSSDinTz4Tg*uwUOSrH#v!snCvT6Iu{cH~GYh4*vi_(*2G zMtwe)GJK(Ro0;M3(eR4G9<(M|ZSX}H-fXrY{dtX0wQjq|vYj=!`{t<4M1Ehk9L0k6K=pX1gtWXL3tg zPRo<5^w6#)7wqc|`b-74kJ@*4(OTdQmXVXpbwg)(M^Q8Mc<;@5JLVP9{THa} zzFS0TF>`8?Ez5ZEl6XysU6p1w?#hoXhvn&2ts#d zWPHe5I1L3Vn$oe`3M_O9v)Ow5+NMu;ebzzNTC-jT_I+xOkF5)ba<9Fkg;Ac(*Ql<;ETiU*1YmbMdVP!P z8hw^n@bisT|0{Qa+zVh^#SsILNgp~Q5TjT*fFp@D~1I~q@ zxvAj<8`-sQD?7T_+9+<4*HcQ~89MsV2lR0`GKLl2Zs+*Boxq4CzsjcnXEeFgtuHEI zX!o?yugAx_062YVd&<(v4mS~CY^rfYE*Ou3>gu%D}AI_i)C!S7>?%SWXEh;P3NP@(s)e6gqH|59cLYQ zVF5M_ian9*bfY}WWeN+lRdL`}Ni3KT8(?lp>||0O`a?R>F@EikHgPSnqhL1eef$+V zzi-5SL}j9+>;iOZ3^^SA(RrIK~BSZf+vlO+H8^!f0i57Yc&0Qf7c+T{&DiNV<_tc zwAz-}NX^r}j|q}_>`K|9(Rb{Pf=C$MtYx?Rdy+O3}x zVJn(Mf{wu5@5J{0J)LkgXs^6V9f%ZgOh`4paQr3s0*uW(gxL;(cTtDYuTiJ4LYj)b z1c~k-YpXf;2pGP{{CTj<(m#sHNmWGhboEvv^ZHk+M*GVOl}YnTfKyg8FSh|Tdlhqv zUI48m7#zSWoxZ)=%^7-SsW<&HrpIl*!SsaF$9ts;gDlqc40Y7N0Qt71tS4&5M z!~>#D@i{K^+qArxB0Sm})I8mldaJ9Vw^bGm|DQaY~6`h*B8 z{g#~Hejv)h-{tdwr*W|g<*qSg8N9_x5%!ik65b$J#PGG`C#eyr7`)p=8lJrKVx*u2 zJ{5dizOsX<-vT@Q9luThrB1c!rKNFR5h zCzLCYNWZGih?=ZOGj!M6ai9Oa5grbU^~~Tl%zn5$nyv8O5)_H;1(LIRXsoXK9tK6D+PivB%^P{V;z{L}vTAP>c+-sgA44!;~0qG)} zT|KL-Kz+1a1QU3!|0n58yrKI4KYnL5W1SiMKE}Q_mO{1}24i1RQPS8ciBgut%orL= zjHRsEiy}*_7R=bP70Rb1X-KG)HCy8AcYgoDJ@?%AJ@4~+J)e)qGvc|ut_yiGmx7$9 z_}qEL1hR?kSjlGy&)CMU0*|SKFG1%tNASfBA)@rb3M`6@WuH=_e7RK} z#~GU@>Wg$QkLv|_KBU+3_9J-zR1 zDEw98U9rxkOTItcQ3;ibYho*RsUTTIYo!W-v5x>+*qA@~qsVrx*@2hH5i2C05m>Qr zQomucSNQ{+#@m*eghI*%fo+tf7^ceq4oplES0K(fHRPk^e{KXU5>dU3sFSkskk-M zSIs}huVQ1QOVdOOF9q-)bdHh>g{C8Jk?y2Yz$w;P)v#1}r!$`6eW(9JVRxquMutdL z@WTgc_}O}rg12uRgATab*W*Uva)|v%{>2-~ayLydoF|z8%CVM8tqF6X;J^?puWklZ z_}c3bbUJB$oObH@mQ^nux^n0KS%M&=N%@S@ZvhO(3xE)>e^wH|Yz9#gt_mnZUHEy& zG|fvhh4slVWfN`vjnWuG`$^20P>xV#FzjkU8#9b_7Edj%`L1@G3@)W0UKiY13gPg5+oNHtBL($Um31vVPJLL)Ot4P2a5W!$&h|p`g z@^mH{Jq;_v^33WI%0u`BRlr0&cJbl!gEF-MStcc3r60_t(C{QlwDA2<#b5DZFKZyN)jv3g< z4QfMBjPND%kDWnU{O^lJL?_kXy_)3`vpozZ1HoFV_j$z#u&ZYR_&)>_v|v`TY~CE; zTNP-|0rKZH=(jo|Ll}b}LJiwWgj|(~kS78=0^$)qUEnpERx}oz26PmP6jPTFF-C}a z9MqW~{5&l_6M?w?UY$%KF?_al0%r!VNvU$H)_@So=ROdj2@ZIGhJP*XO#l?H-RJ{X z|M*!*e|)-=I$S1=_*>@RnXt*++YsFQAwK)}vunam;ntSWTGsizm5=7gA!@Y@QAins zD0B^8I-Acrsy1~US%M>?5PaELC~e0GSTvZZG6JtmUbB>OXDndeL(G>=BXUO-1lsNK z)L&j07n!Ru+L^;DH6%MJw!r_fi21faKn9A?z0V?cePR|WefYNv=ZgiEd)o*QMiw#_wg$M$0Wc{@`=AUbjc;?DacU z=U#b!FOZc@4Xr%n!MX> z_@KCk+~loDgOAVa%Wb?*tbFgh6In50L!A0H-1Is^ASH|1=2I$bTvU8Nb8=V1^L;mUc0ea7M9AAc)WS1z`{?^~W{Zcs4!)35zW?Cd*U`xnC(;fc5v~wN zquFJz);|Y-Q+Lmf171xeIhY{8Jn?@6p9t%wDnKA#-~OF*x!KrW8XNhw;ry2%ZK);4 zXKCm<7`)3((TdZN#{Cs>eJPB~-$7`58MSoilNP`7rS%Yo!?vtv`zi*?Vy= zx0S+=KZw=8`py0HGtZKoe$P)W7ajY0jmA}_#x8vqGCAgss$c~5v>a7oe`tC`!>F@8 zUj5ko(O@(?nEh+9P5S<`)z4c(@-hd*CvvM)oQe$f8pa7)&kmk(dwwSV-d8TwHl0bp z^Ur^H_wK*l>rZdo;kE4iqLVWJ^kGObY|3u5^1q)qTdhq&Z{%49~wQTtWp*>cK`ew z+}r)T_Wr)O!vQUspObG-8cNlx2w#41w4KCJ#2s3@K!1Va`*mapI3c{;7fc`%Tz>lyy;D zdi62zMB~v{0Q*q2e!s@%7b%U0m5(2XN1a(&yo}LzJg8`;dwvWrj*JK~6%5xm?5lBy z$~65d7`i{8cl4h9^bzMR?)P`8jjyE+P7mb&GJkNX_=37%rbE8}=%=FQM~_E4-~ZT8 z6}~#wGqf&MW$9fVXKbDh)IsYqAN{@)+8;c(^Pk4WS-Jdos(Pfo?3?qe$B*!#h4AbK z?R)RCr2EJDQOsZ?gXFG4aaHf&9fI#xhUCMgBy;J*B5M7$biv{zI0dc^VId{Bv!x%S|1l9IAm zy8WNL`1eQls!zAZt<3ZVUlEgy2{L^UyUd*MK77GxxTbyM>n{}p?_65l+TB{PORd?q z!ym9I->gPWk=8f=YMFD=vaP3F-4Uz)zM&rGN3UM|uOfH#guaQnU=o*r47%s{0H ziQ^*?oTG=XemJ!_v9c9){EWJ$k*6M6N z&YImXfg$E0mqqV8y*bS_HOP#@)@I8HI*DkWzP%%LNQg&9S)DL*Q`)Wh_}GV2;$b_F z+uLH7r|+lJ`20s$M6VHQxFWd61x_g_?)>%l-`bAx96D>TOZ6b>Qv0_=p$v@7E1g~x)B5YLCj<4Z7rs5W zJAO<|tOs}Ep4~f9yQzPR^SzYdr+j`%1{!C#iR(gu?fAuF{Gq}-tN6O-_Zfjkd~a0_ zs(tb{TkNw7yMj}qS?lPO9DH4P^Q6gX!3XaZpimjMqTi441j(G)to2`SlFQmonOqz_ z;?hc%B}a~}o^r+I15IDr6aKYMzOZy4Q4>UUGyDCIE_I`Me>C@WeTy?J6p8a*2$eh2 zbS9ryVEV!#=|<%8&|4eOL!6C$5Mf>o#P~VpWGUo6k8xPYI{at4)$UcL%~d0dyYqe7 zXTsE*PqGHNG;%w7c=hS^l=Xn7I@J7=Z;o%wualp8dLwRRL4IW5SD!G&XNw1) z%w5$GRWSFcMOPlUQm+fKV)=nT@LF<#_oSy+huVs7U+6tQSz;6uG5Ykwn~dj|bk$C4 z9eP{?iV3Pt`RXMtSPm(ujFY|5S+iiB$CmpM;gp}I{?&E)dAJh$_nR@TBUK?6Wd}3# zs(; zVkfoH49NR7X}NB9MUQkT!VTcL3p2mSnVp~cqHcyHrC1ePePh)RP&z)StQsL?@yU7XxdRn%j5v#zC`hkby}Jb+c`xt8FU3Bz8`)Gwlc)T@|wPj1d= zJooLueqDQkIyj4t4uYhdrkqPKhw}3i?u^kEjb_?r-&`8niym$`_4DeE#BjrB!DHeW z^@n@U=(RV3+vM2_^!J`!?;RX!|{?elI&DS%stg{}U)AbLzR~ifpCqJE(su#K1fBPGAFvlt`=|8Vq+k?tFFxfg9 zC?H94_M?K?`39l1a82REiZT*)O~o>w6%=B(JUxZ;&(8Udt#DBBb94|y<@vAi+O0&M z##2}Nj_cSbd~m*gd0LdM@-5|&(($=|D^sNajBK69CdBsF^+wWM=+2_REi09y1s?x} zh&~J2M?BcPu}|i|phC+Okz>8NzhW)1L?(u)s_A+|$W3y&ikf6-iJ?|Ga_t4+R zz=CfGdm#a-pzE*yN;zZB9|P?RXJ1?T)=te<2s?Qkq@5`z9eDQNn^4Bpf4}o3UTyBr zfEFK!lvB<<(86~Y3;I>dX^I-uM1HM1E(!sqUQjl8UPe!s2Ej0iocuPpkFjBm9CC5} z#d_zWyb*6Bzt=EHLlzU~Wp)~0b^q*Y?A?13qoE;VW*k!8sTXfRw(7~9qPljs&0AZ3 zee!zvzFu5Ir(w1LH<@647d7|z;^c`Km(yx?Xv>q=@c%TQTP?;&H+-DW&!Qyq0@qZk z2q(WHKruUt${mS&j~Fa%et3BNvrt|cu03fmi{&?daC^Sv;-cVoQ_y6(_?97yZ-FHE%0yRmdVJ^=u1u>DMO~- z{W8ZlPuso{BJi-fa9a48*}|HB&dCEC5f~Wx>Cj&fJxC6!+x~L#-!mfNNmhl3%H28@JGE1e7K*+U zTK|1F54Rb-0QVG!>#_6QKV8Zy>G>wk<0H(|btk1-?b68F1J$>qUYA9~bh@{jZ)d+w z`surzeQ$ZQff=*BH1+jUMCan{hlX3Ri>=jm8#kZ(xed3}PI`V|sVOjbG`O_}*M6@g z3PfKrA3emI`!d55^y<*=!nR8c6#J1VtpG<&fWRPyC3V0u#8_J|fH>F@;u3nT=_x zmF~yMPd&n<2r5^8N6~04ep>b+onQs)xT^BC@BEJ=m=rsxG;&(31>#C|N4IxjdKubM zZvOb`vSGYYIeweO4D;iank3y8vJ%$e9$}>^qw#>03LK2dv?}sz$B5X@6riEv9RDdr zvQl|wOyS1z5%>{?fG-e<9IJh83hREJEo~=w4`DY3@x;rPqa$HFgQ{Tk>svgJv;GOE zYSme0%VT*_CU=n9ZeVv`MD7o81S2AX8rh|uwQ@7;qRCpluQ7f^&1Oi4Dryic(*biw zAkSJ+paN?c9jCDiFw4Ws-%x6TM^OCs=bS8wp}-x>&HNGP9rjuHa);ubBsEyRuXa<1 z7D=i0j}|jZEIrs)dQ%Cf_By=F30ssk1M6UO!eKonPVlc=Fwv>ll_rn){_xRT78j|@!>7rr;QDoaPLFPnee|49xNhP633Cth= zOiziIg?)mg?!Tr6%OtY#iGFw5P^zt)FGz8BxpO-^2vI_XVVCM zyuK%NrL*fcH(W5{&0{QOL_;SJ;J?QYK|pH>(ps+KiWCUmQC0b+Dr#6?yIv6f!4>r6 ziMjyvCj1T0!kIUSt3pcg?IWBGV>JKHwb|(`)Dj5)K5tP1NFkI0G|i8%_*!C;sFXeu zdm9m;6U}pKm|J1`(5NuLvJ>_}@S#wKE|egAU{6a5$oia0JqOGvrvJD!bP!-xeVh@{ zPOPxA5IHqAcg}e!pXYO~O(Lc6bbRdTQ{40V9aql_{5vO@um=3|cjek<*~Gn4{Ig1H zi;eigSM@Iv_3tpEYfkq1_6lfgp}I|yEuTOB-E3(KG8y}Zy(@=W`KIwnzH{2(Vw?oI zYEfvyLb2uvB6j-iu5tS6SJ3$$R_Pp@*8Z&2L2yj95_|lJZSYGASTmB%XR&pT_G}yc z}eS6@9EI|FCtSd)_@TZyvb`o@Ood_R;W}E@6P|O;fx( zpP}JS7cZtH>G;|@LL(mzDCl-nW3p;j83tZ=omlU4t3@p3n(eMP9d?jWN1b<_J?N(= zV3<72og9PGX@DrN(!G*_c+3N9umnLPRI>#V%~_wl&a`QPK@xDra`5o zfe{6Zu?u(n80?A*ZGr>y$ZTD`O0K%i(6{Htzh>M6q&6!n3~b8z=#9wVH}qC`dGcK` zFOlSGfpfS6O&=AUS~}4~5mhureTQ%teh?w)jQwkK*)5XBeYyYF&Rc*QYNtj8*pz&uE7OAug! z@GP9V)CUnJL-pc?j^(vAFWul}g2DYp>|-c%Hn*sRs|iwQC39`Q5IBBV&bFE>F9gdH zIiYszJEhGHd%#y=#gAhOhlGy-+ac+&q-7cS<}&Rgp3tDWq&{MPNgfvh?I1^EC0ePouYrUqAI*R zL%3Auof36wvmGpRdPh8Fry}jC`N9@oX91zh$QMK~`sda6Wq|Wnf$*u0WeQ6R2m+fDu<2UaX<(UeDaLZ*yhUg z68)}UDvs{B2JS`v_-3V$mS+Q%h{#PM`vxkZv+Xeh(ZZc@B9ebfBA7d76G)tc0w=x; zQ+T%cIo%IYI9K9tZFRb+^FTyFGnnP8DWRg$os9lN(2`J7Iom-?ZbCmtOF9iL*u4c# zBq>1tqZ8)9MXpSWmSj{88}lXu8&2v@WrD4oW$?Z&2;L9r2!vK2UD)ps?*RfhjDc8p zC2$R@vdmnY4nld!)KhufPg}shi-b24o5K9w>b7JyzNnJwOCaPRn>6LavMxQ4K-}b` ztD{-ct)I|B2uW(cH`LD;oAl0SBS9bF0~boP@Vhj2t_C6&9^WKjUD^Ak#6nIBHpcbp zGf1az%V?2*8;1GS*yVKq0wBg*SUznE!UNm~tL+Vd>7$>&xbpL>i{QOib1plj6MGX| za#4rY=XmN9WoE9%VatcisAapopMPmgZ}5Q14ljMVv1ay^eL(f~_RIdAa8Jhr<7|7m znH_)ZaI{d@dBMSWgNpNlcj8?J>le+h=Z;oAixy%GrBA)!DGs(aEi0C6H$M}wM`$}V zHYrQ*lpVfkC~0m6AC=uH&@NRfwFG>V5DiQZlnPU88CQmyj2O1=nIPLJbHRS8bqdlG zavHu%Yi$is+BBr&H~67f+yT^!+_0Hye-bcyWA0yGPO_BYTXL6;D;V`5kF7Mj;7 z0coy1JdBFm$m-^D7{yAwH%Ya=xSfTi!G3gT7^TO+KrBA6p$%MXUn$YeiZg@ zwt~diN7Td) zc`%b}DcGe#;k~D;Zg-OrA@c~&{3fhNc#;huH-w=-p5R2%s_{Jy_c$}Yis2|tLV8*n zB~-Lf)$f?Wuz_=ZmH@It-z|>dp!h8`eKil7=h=CR4zEg?Qb38hie(zjfl`W67S(li zwc*#M(5ftNOORna=_OA4mV)M-!z-f;vIm;WSrUX?1s~qdvo}|#eXw~9t{+?;bp<6t z0v%JE+CX#uu}<{5AP!TJ&@n#%CD|n?-zJ0`K8qNBgJ_aO%sYyb)!cl`b>e~71_V{1 zS_h2#H8|h4uxOMJG!`M!rJ*`6X2jwNp|(zS{!ION)mh#ajtd+*w2_G#i-Rwmx(cOF zNc8?17cl}831mL~Pc71qn4K&&d`3oO^TFW6aRI@^oZhb>&&#_XVJluhljKe#FVJYW zr-|Ov9f^(C8SKCVOxl3Oi_6~=R~9x@suJsWT64F{IGeSSzAqM$D|T>EUTy$CekQFvRsQ`#arM75eTHYZeb)8N zTn5AT%nSN})l`8pvq|PQ->^|)Ova03M6_iP*DOfC3a}W5R{0daJ^M&ub6dje& zOvEdM1b?12yD$&&6^e$1`tb*X|m0D=KuFjz^1nuD_Om^z8LK_Q8i|F% zPkkNk%9k0bh{7hQv{!$WsHkv&`!L=rf=QH3j4(+q%#V)l((}H^V-+reF2yOJ6!^&- z4@~xN3t&Z@uqA;W1nREDW{kXbrTz{9Nrn(q!up(e<}eqd6z zx~)TZ%bx=LB%9J-w?O{ZQ3!HmVCvmd))dX(DIpc;C$#n>&z_xPehfm4QIn(Ze-i2u zct)%X6p>HaIhIB|0Dk?ZGJF%NL;-ZBrd~?f1p!SeG2aIbcOaghxjfi7H7^iVboT?5 z^KL2l0(Y-EeWU8^XxXdee`^(|uRj{ngsu(T_)*cA{O_;s=17baED_7v4L=svUYfIK zJ~pZA^L)-nYVAw%b~yb@MxLI9v9QH0*3~G^%m+ioFD6B}*VU8=5#a|=aX$Y~^V z;aTo@se?mndprci-Xnv5TP{dckw_kCU zxt;@^j2FupGs)CO8g@dpp&W--HK1vE+G1jqyf23gO5>VQUDV=gbUc62zJ9@9L<^a3 zGNsKC!3rhS7oSy~73{52up72{KV{u90>15ge|SGVnQRt`D&ijWQ3=5yk^3@^m6vHR z6#?~D^nGPLbY$uV!&BBzJCq+yv-0HY5ccYZ1p4$3-_6AutTpL%K*a-89fVP;)e>_# zI?8Nb1>9gZ8twIRgRVDrqo>gF$*{p>)otHGzT@r$31gCwzpK%|L3_W0P_1O$RONcf zn`nuo&RiQp9-nK@W_Bxc5O#feK}ixm3{Y4yaNV8LaudS)#S_q>{e+l|t1ylvugrvI zD0AYH2!e1tHX>POlUFcac?$GrQ0V@K(eO17s!mcP!?oiOf(PoZd%+oq{laXdCj%eoYT+R`u?-v;o<2k zGuSH$Jk-6+^0NEcn}C)3;(px+&-7_*N4z11zCHL|R#5F-tBa1ffzSa;OK5Ehl&E=LHc`e+YTd)mQxi z=(jAgWb*5iL{H|xtaWe3=TcWi6W>ZCyhH6x>%Q<&m7&umv|gi>QY~>wtAvVKf3Jwp zV=9mptu5sraQgBH;u;@30>O}AZ%cM|NR*FjcydhP>*q2&sRX`~YJ3nFvhwv8F5{yZ zVqC2k0jKCiflCX^t|R*?0e&EPJs!Ck%ePA0L&q!MDW5aYYsS*x)EMVVOphIW(<}On zwb=aPU68d3x%{v%7y-qcD43ug@Y(GBz`gOffuuXO~`nO8|yAk0KSFq_BHo_%#EcB{NEA1uYRbz zr%7U5gMAFjvT^V#aajr3IrU6i6~P{58$+98>Zad7=e$V?8AV$4|$=OF-N2g$SimVErY0$`;5rc^WaJf5Q38&ysvc~-9X(Gs|fHhbuX zGGu|y+lPe2WsJKvRu3h`kDF##ELfNFTSD;Eq|=|46LZ7{YK-+}%kFYk zFYh|S*>w+|3j*&sdvTjrbU`tu7;#rh$=^a8v;D-oyhiD+E5Fe@f9P8y!mFYB|2EJ& zt-2F?&

?H!m_U`hiz<5ywjK~7x!H7csK>B!DbVzQ{U(%XNe}7A_Em0 zoyy@Vl!Tr}_1raF9a14k;>_Vh8%%hISg8;Wn{qn>)W%))pEycy?HOQ5EfxyogaeT( zgu_Ioj|YFo-l z(o=edY4UK)ryTnWE5)e;f5`R8FJ~-+#`jwzT6D|fbts6J6+GX}k<{789`a6^&DrHBz=MIM|$P#!^xI!hgz+UPFu2x%9VU_SJa=p6u3tg`S3zde?V|^P5Fne8S{ z1%8t$@}Lyub(#-elAM5)e+Nr=;ckInlB|_pL=ssBPZ^q|dS)m*>uOpaQx<=LmLmHR zD^rdlfSID8#QF|s5j~~44IrVxkC5smqRUUHBUJ(+6Xqf+XW6QUX$!S)#~UZhoasEH zJup>7c?XPvza>;~dErEhsIzVSP*iJZ__nKt{^>%a)1U`XvW%R8wGp8|?XCqZvLYC> zkZEiSuFB0hZcH_)z%47+yi_X4k2*Gg0K`XVAjYL9nsx|drRSWG0erp&_#doC)IA^R zlJvs|E49pFS`D26KdCHkQ=^G49i?nzRv> ziI9@a63w~p1qp>y12^I{1!w2D7oIB&Jp<&?e#pwCPEaOq#es(?i$qnJCwc_`ks#*$ zL{A!8bni&p8r{YdgAA-t+D-KC>)V*aiNZw%fsMoo8G%T__}lhpDHBodg#?jxszEyA z@M*$HdV|kIt3-_S?KVBJgP(IBq<1}!P!RHg%PrE|?K??j7;8-Hd9Biw?sg{M_P6Je zti>pW!x6#Q-iyQwGO3Gv`;FsoR45<_(A*tF7wcW(o7JZXjd5wJa$z_6txa31ff zChcS6Ys5;uma`20%zLaoCh>XbJ%8FVvx8Ze!P)mK5PfS*=b(-vLWZptS|a?&LK6!%e`oI{C49La+dfV z={e~0JR~Ns9?RkA7UtA}lKDB(8Tm$G<>Hg7{r=crdAJ;L;xqk+zK7bxRW4jrhuU!f za`Px=^Sv7o30QWS1I!F}l2Nw&DE%yJGYv-pfBklcb1%YBE*6TeWd*6Pc;n4P%_X*hp!i zQw4??AE^<0tXQd$8J?v&iV;U9v0n`bvQUy%@<;9~$6=DZXd{QLD2DOWgYJ(bF zgqFylOsmAB1(${j-#I&fP-Q$hzu8%K(*b6?XZngDZ>n`cYjc-P35xzJY$U<|JI38w8KxGyxm)xjH` z>-rktFCaUpkk>y@`i~LPIPA`t^a2km22^|1iFdkn2J!dl<&#q^mL?5Oa+6+4B;Ler z6X5-3ue!3Vx>VbQX+|Q(p?y9hvvKTa+o_k0|C3~M+n}7ZyzK=N)Mw-bM{ietAzY*g zC0xMSj8)tSIRDx4Kq(TiL4XuGL%IpzZNQ)=0Qxapo6Dr9*U3>~Yh51BL= zC>g90+6KW}v1(#WO_WDgD7O=8v&8U2Bw5Yh(C4ws8J3TYwVfGs%ixy-9hQ z{1$le>xgY5U-bg{_;q z{<)pI0U9;CKyF6j(S5qQl1^Qzv#YANyA9rno#pCwTaB~9?q`zGGL!)!O(%mqN;bY; zJ(>U?yh>>i-)qRsPt^=%yJ3~HV=+1SNz9dTg5tY;-?V9*yJ`JZE-d4<=owx`t0NkD zSlZ375fAevM+-PFkB{;Rk%-?qKB#5Oxwjz)(D~r>_(9Ab01ja4U^*tuc;`u_hQ#+G zM=rsZbM)HF=JK#!bCR__-tLX{7ytpQN(K6(7O$Jez`5dLK#1n6W_$dCDiB&K3oykM zC!^JPEFh7HYdi-ZCG%j3EP6AOtUuMA%}>-k2+qZl0J(%3c@l84-UB)drx@<=zrI}& zsL%weyplE(U-oS-YQkoV0AQ8WZ9g-0V;jtNsMKv9b2fd2updZkVjrmkFTGf6o7cu> z&8{knDLnE%=B~4)cp;dwrlhaW-2I`4fp@e&4h&utq<7)a#*4q zFAJxlAd9MuS%c0Zm*-h%+MVYtlwlFApn z3(sav62zLNXYYUj?2enW(YIDrU`P#rP8)u;On9HK`jTFi!E4UbZ5$qcCJBsCr@ykE z+s1;VyPGz|SJ3gd?Dv~G(qRd@#(q^vP%a-Q^(}EXcx7-~ZpOiCv2?Y-^)q!6KDh@5 z#GaxS6|j01sb+;Uf#upn7Puy$4mAjWMJQt{CAk$2kdK3Y@Z84WiHpEEqI zdA&&i`kv5j5V#3I@8Q4~P1rj$VElsuJp&Eh)hQ}s&xmkB1dgXwEsh8uTgbn*u8$(l zJ7L|n)ZG9o1{~m_06t)~j3cGolMAdS|W z86T_F>{3TM+!`gtPG(oi(@r;t&^Q_GZNwo>dOJ;-WIAd+D3<6c_yI$ipyRLdEE7m8 zBpi|+R3mN;oDWE*E1MFJ(5$CQGnf-lhP%F$uFXI@ip}Hn<=^WuxC{^RKZ$2_wu~X( zCTV7*rwevk?h5F5;j7Glp7^Q2e%T?2q5=dWfHy|KNY||gN}DSPV3OzM>@EiUeZ_y> z{5q7n>574_bU$y0l4cbVxd?lCk;H1Oif%*H=yaecJFgI@Za0MK&!Qbq>anO6MFfum zL69|@Cs>1_7nVU4#TD4&!@4*@YESsE(ssj`877;6Cw2oSr|yNO!ZWKN22A(t2G|^E zd+|0Qz!~a&whGpn4JL{s>4t%V{^*WhK-(^otMZv+_KOXrRRV7+JlCy}KQtl?SFn`R zFVqYTJQAG!aR~>{jtZ&GmC2yK@lw-eDmN~O2VCJ?oqWo;Js!do?}R%Jp~5FIiy%;ZxMfHFW_%uaBVpcA@Wg@WsFZt&m3Pb#yX5vN0L)JcY zY5blM7?$jO*62IC2H83hlAqF@ZRi%T`%!s0g6XJ3`_{Ktz1Ttk@E%&i zX4U>FD0XjdB4A5Gz?c)rRD~~$p=(JPB{&mjltRVjP-?^r+H$T7D>$66x2FDKs(WL> zFRn7jiGbe@&}ktCWkqD9ib)xr*tMj4gW?cSmpTzMv4rbT)Tzkxq-Zwde+fmH(NYWn z_rv_M3UN#3k@#et+`GYXv;7{ z(YWn`{UOD|N$SibXBJBg;B76YE5=(}>#g4(*m6AAih5~yhM;*GO^-lAFGHYU2n!ma%;wL3kH2MPIEB%@VFDlE&Z>au=g2OQSmDQYYJH2rhA zK>1pB*9ixrBaf19h*!SBQe*AK*om%Irlq#4+$)aXtCMB!7{nZd5u7!`f#hUdphYg7ceU&+3(HXPYZ1d{X&5*Q42jdKB5DxY+Idkhs8)l5!ogHiN43zvb5>0!^wYG$))w=2hxo$92Ex0W5)EcEmbB(geE8u^xx_6fOLwSM`>7M0 zKv9~i`{05IOwHgW=G>);QM)JjvLm>e#J_G(T?+8|cyC4_3>F2#09_zZ0bQ52Y4!$O zpr&Vy!7(|La5Ud84fUC)(`F@&d(rL|<&f*6xkz|s=&vG79Tj<`HiGAy{J5dDN3H|> zkGx+4%Rp<-AVWLd{iQ5L%gw}y1#ZoQlFc@$ea?x^pksmqOfneectSp($#C<`EyK;i z4DBGtvBY_@(33oaA%$ZhV1A_wW;|b*{aijGr>F+;F6sV|B!cHHUqE!7i`(&it5k47WZYK`p0$mK zIy6Hc>DiG&-p!gaUI{apF6roLHTIr#BybVuElsULIXqa6g-42{p0eV-=_7-Tov$Wx zz5)=MB?I@zu8(5j5_@ta%~~8_Qd=P=Ikq7hdpYa<`so@PKgyk`?^=N=oA@8ab_}sv z$12Gc5|k z`(4dKw^`vG$ia8*qjLJAMEhM$V_i8u?Oj5A2O!u9m^}s#lmUjP4gk>R7$|rPK#fC7 zCU^k{Xm>>ezwS?gSQIZeK55EOB8U~Bh7|k$GGM$V4#QG3baIDJ{K0btVt5Y7eMN+B zf?G$%JbxI#Cjk_3pt}sRfy@+&*bDkj%L<$`?P|I5nq{oI z=)IH^26U~|ok6yXP@)P=OpUu(7U8XB>th>JfRi+qE;X6Li5}~iqs|?VgawJlAF!92q`G_Cjh* zf}>A3xsskC2I^YEcBk5o*OAc~)!y6#=dcJ@fQKmJZw0(*79oJN^_%n^8zsQpV*WDA zG4YU-Kn#Xx+Z0Fv-6)u$1d`tmwGCAgtR(p59U$)ZabnDf1N;DBeFqIl z=Ws#RU&{m!kqs=3iFv_ z6!AgwkpSNv7h?j2`2)H4F%EC;(}bWWK2{EpPCgeJh?P>093Wl)DFnFhd9qE^oE4KD zi>1b0+$Kj9Q{Ltb!U-Cxz$P7-Hv5?I2}eN!xOg~k;}&MX83pl9B6y2!m;sSyrhg$o zv4p2+%2pUZVB*H4G+-AA;6c=kXXw7Jt#TeO0AX7LuT%qa$^ZbS5Rl0MGB0nw7Xyf8 zCL31{U@jk&2FA*mrGM$b1_H!oLmp(En;;9VXL^KYi&2m*Tf7>S{7ChI=fc@r*=}kw zNHfx3iNFvuwE-SLdI47SP!Gb}NbrbLU z0V2}%8ti%x@Km~Wp!)*i$!5?3YJGPGfWyPDP=Pup$`BBUUgz-D;QpeJh&l+U!rZq8 z-8Mt1EQRefdVA-xvSqf$DaR;K-!aC8*22bkah!>%9rRxg*eusejG<> z>zDZ*Vu3u_1&nepXs&9*dl}cvl`m<862(2rgp0qTUSxj6$PcFf>v7rLNs9^`v5A)g z6$~xtNGlzZPPtB$+E)#+0lTI&$@}4FyX&-b`9P?d;2%vRxbhuH6c0rnSO5KHFhXkI zeOy;&k;yJq|G7QEl)74Is*9t94G!{1*mvE1`knEui}Y-~+}` z-&Gk7V}6|rX~yE}MgdVOlWZKi+9Q7cV1Sd$mH}|TBec~=IX^u?PX}!Je-W5iv?gE& z6LSHyHeV1h+-CsyTQM*t@`YUEVrZ3yl-Tn8b9UyGx9-r?%2*O;`g*X{tmJ`l7iT1s1nlyJLbO?s`k6b{kiE zoOoKP?Nvbw@BeUhUO`Q~Z@hn#Y(hd!Lhm8;9(tsP5PB~vDrhJQA|gcv6k!tr1f(}X zkR~d2L{wDN&{0tV5m8Y?5wZRNQBf%;|BEwc=Imu=cP2A?vCsQ_%cms&+#+gUdEnHO zL7%UYjnSiSO`b-VM5fsPLR#8NO}n0Y@Z9LX{3tGaUhV9G9C@Qqf`Kk?`oHIVB~&X4 z#2|bCR}C#5xNDj8!m~!ENKyne6 zlnU=HckB{{%@#{V4tC3kwcc|ipoLeiQBWkLY{B1O9ip_$fWWFE52pt#v{o0MXwzg`oViOjpooiQE9nEhf5 z`#%IoSZb}M)jRwUh|nO{;vK0q@)VEE)mCSeXcs+=ue`nQYt92w+bI%Y^urG>D&y=NpKhe0~-hdWRAM-^svk z{o`Tbb=UiG$c1E3^%e_f7U10QW2PsoQ)s_&Th+&c`}KZz=RJ0B`S4jsOEZ|ogrcEA zqLAAnt=p}YZ@q{+Fk-b?eb1PfQr3y)iv$fVW>QqY-^xCAyGGiugOTJ{2%Hm?kLjk*8Qd1}_8n!ax8q z7`<3K7!l})`=)KFw1haO0gw4{F(vpAV~8ezK@bd?NgB5A5RDKD?Wft{YaVa}e9*(vHJlAntDp zRExkD?dy_of?Lbs>u6_EHwN{@h2z&`!&XR3eKTmMvxGastP*PWjTRx~QxjVh12nkG zCI>@2XyBgAaBYO7xJU6PA^L~RRre=OlsIiHYS$SH3MLeBz)y#x;`s9QI4mWh{FWec z-UfMiUh5AdG>glsg%Q^>eON9dYKKOwbk;fd&YALS_Wn7o=Ae~#ir^q)X?lqOTjqg8 zckof0HYx(%$03&mO0*fFxB_C5kUn@G1GyYf(w7fgUc%;UHo!otY76$4s3Ge(70M9e zOHLl0cBYY#q#!N8hbHQvC#+oX<1in9(3OmT{EWBK$jCInvouBU%Yc_qJYnx8EGM&D z?$1@XhQ_(h2o+PT#2vzVn=B^RJI!xe4WkuofF`!i;iRG`9^r?*DHSEvrHFb2okFBz*NY251Ma~a7kH#U z!xll(!;=hABxMMQGzQ@7^QxTSW2^T_;6Vu@9?|g46+Vg}xgzc5l+$74{s<=#ib_gY zpp5CWQu8tFvy%j6e*|52pwGdCHzHTu?JI{k5=%?FIpK;`5=qo>AU7^eykigdlx7QG zjh{tEwYzo17jtHJTGj~w(hEX4>ks56a?l?*eVQ=C^*C%E$ICE7CSKEtJ-f5K4vF4{ zz*{gFtlx^t5;!%!S2G65%qi~f;uCyG#5>uVPW0C#_*tpt++&@c88mZTPHYQ@TvQMweOsWRwBVYwV38u- z{f*WnTO@yQ3YJXchDmmh*w=OcWcsP0c(@=dSt0kX#QK&^tgxn2UOkix#c>+l zoIV{VB`k9&7fh%lVF{>JL%?DxJ`90*RlrXd1j~FJL24XQDTvtmso&TQpjtBFp>6qU z#CERJ!Xc))ZerG}?hV_1Y+hYJFI^@JM=@1IltgLgo+ld0&>oIYXpxF}1vOumtsIB!bRx*gFW- zX$E8^*N;kCOCfbUG0jRXJ(4nfT&wa61LPKxWqJI5gF@25aCX;%YCB+dJb_>W2F$vH zXb~OFXZ*|R<_O(`!Vs`gr&%r>klj#xi(@Jx&LXI$i8cwbUoMyD^L zsowjg3icSiP+N0K$99dLe?lx$^(NxDQluA+raY?4&0NhnwWx7K zLXSMq`cbXcF)hVW46XYF)wFL`jCU=IV@K|jjUlBBwT3*E$9|p;>SCUbV5&oMw>9Ca zOwhmSdciLk#vnkyKqf)b@@W7(dyj39(BP@b-+qFN1~T#Ul!sX2Fqfshf}aq`YGxFO z$HnvGqt7bis!CLm6GIyZv@!5^0k;ed4*d6)z@s_dWN2Kf7~Wbs*Kp3C-=zjU=Ht2T zUWN#siAVrSg(xJKK~n12HH)SQcN6;;gm!rXI$d5=&8hd1;`t&A4f7t6(Jf8;mMTag zhq8k`FQw{*NeFjQV-IFwY^Y);7{?|d#jHBv211w1#bW-&Z8~`;@}&8VMRNfi1Ds36 zgzp>`d@vJx{EXfi18+Q?r!HWbM5U!g0dS6^xxTt8G;VvS7HWOFs4C=UGb8CnQjWq# zXz>2XgIGeV7r3eDdI^TuR`V=uc8>;m*zDGz(4+Gzd)Zr~0-Pqz!dor0=0>ObvSSBY zRh<8-cK#=RB|#K80d1(}I5SNK)G6Zc=gjycX0ChiaVg&sU4ww{4u9i2wck7C`Eg80 z*^Qq+i~B>G`Y?DP`-XJi_WAIr2W)E+cB6?GB1M`|VQOUpzn^0wkinuhytZq8lRBUX zbq8#(>Pp9uO0yHvk!}!gdNywr7zMFWYL)GcBrNWG zF3-iU){R^Gv01Fh(Y+!*o#=4?sESl2j|L?WJ&_+3U0U_J8>Jq4}S;6i)ix*cxHq&0>raT zd}&U-v$XO)d;`mMgRqr{o8aL|RUoU+Tn$7K`2wNZG>`-Its6{3gQ3CM4LK1o=gU=D zxF#?Loc@|!uFC@pb>>}xh1z;`H z&TuhKlDOl8FY@NIW<(hcW$ZgliRX68+Wj1}RY!uG$9e6`ICl^)6T{IbOnNVhtC1V* z!t@vL#TE~6Ne121-G^{hro$G?ts3b{GaB>6fd#_*2M7`RKeapLusw|*)pUx7<%30F z-PXiCR4f*2B*Ifee$dg{Fo8k;(+uftYx1m00}J$3v13MtS|Fb(Oa+)9LYcq;5B4FV zx#AJ0gye!2N}IouR!q`7oJ$0n!+G7v)~8}zlp(t7lbr6djc~$6+~V0q6I!C*q4`N6 znx1%9jx4+^G%9%jf8_h_LX47mYD4ZOo$;(c3$CEtMdN1t6x*0{&p={^zY#rD@1${u zj8jVHtUu8lsndW$$_gBtP{1bLnJ$6;HnBmRKaJebq|nqz7<#wp0@f}!9@Q8Ev11H4 zN?J%z>5AlqH)YWol%bttIPHUExGPUmsmC)snrG5f5-COZwc*naL!S$m9Ur(Wi)p9y zxi+7J-Q#;Fq8>Mh3j| zLBbQNztxeVvM(T71rXM85z%g-7{w1=5$@zkX23S<@>VcJQ^M2a1q)+!fG0oJ1AJ5v%S(j0`~axhsff*?g*s;lM4n;PI# z@oPC+{_sX8M3n{sR6M)nta{`3d#wqG>=jH+z`8H%KePLdstvX}(da1$hdsVI>lec| z$#32zs3TK{3oeg{UMMt&QT0L&)WKKPc_p$5)BSPc9p)vhK}qryPJ9OcMH~^Y)_`8U zaeU_hnDo~UdcL>|hebA5<568Jiul!x;0I=zAzmWzWp0RWFb4|Ac2^{}2%F>ojn(ZX zlG$f3!bxq!?M*75`%F1%)Np!V%vn!Hfgvy^v;d+ULa7NN>x3WhI54uisZCU?vvR`e z7<)^PXQadg?^1*CrfX-LlV+_GylaU+orFu{1Mg~$Dpt7=O1L@?-17<^;LTgkw6Uza z6BhObv-Ve<8rC%H@r1%PpD1cY2I)o-v>wRUZs|zEJay?bM;tG?^CUu%3>OOv8sBsbh< z>S&YXYNUU|4W`AUtX|oekQ8WCjSCnEK+FYSArE7o-Q_VJA#j_8ZTGZ8VZ~~WR`%|P z5ov^5lK5VC&LrZrggli4B*Ajn_I$uJ13I2IxlIA+JsKE4h(C{G{?lmUi9Es4jqEAg&mKQ?G;cRa zitES|U*bRIiLYfwuQ`27@@YMQC7m;)5SM{my9E9ZXpD-|bCGCuFD*-c0*86!M_x5f z-L>#rcggj{E~~$aD-0oB=-^7O`e7ME46fS&(IWbY_ltKY`EmHp6!O zx7&G)oh3hyM5{E4B{_1bBFB8jSa{8R#HHSVBTk{+kiA7?Zo>uB>C9M91NVwx7BNi* zqu*ooTpsbcn!M`WQL!LmtHYLG`QsLWc|Air{v$vK@{0%}lnl zJ-UUR%Dx9%dsNn2jq7+=u;>9?&&tdr@Dp}uVid&!-c+dFusPC`Eg+j|oJr70jv-S4?mYgusG6=(q}>?Sz4)7Jzg>EJTDu-FT^m0CNHyyTWH9 zO!uy#<%T6wSx)vT@^4Hb>OT+g0q2*U51t6_uYTdedvs4#nh_5Lg_FAtZ)>AH^Xc6Q@hyGnS0ej`L*MJl#(YxpVb-@&_tfmA5IZ#~zn`)>X) zg<4ICbgnG9Oie?2C+MlfmF;EwBiBa=xVKr>E1Hv~X!2^jgx=I{QImzj)COfpK`1lc z(ZG>p+&Pnzh3~!v&n+Ih!8U5+&SC2Yx5ZuMs%q;fmDwFlXbMOcR!DioYEo#cf`!$}~jpDH}0Vv0Tm;FX2vGDN#d5PL_yd=|4)fp&HI8q61A z{st*5+$}&(AC7hdxm|PkSNN}NhvjII`m1blWpM=oE|wtnxJTSL+@y`?K#j+tzn4^+ z$aWVj%QG00zRiBAEhQP!DXO)??`Ye{xvg5*Hp>YKWY){M@Me7p2rEZ$4AVVZ&WkbZ zGNCKAqLO)K#-}v==zmItq&uga%X-sCzc&&7>-Q}QJW;kg9g)<%S>B>sMTDPAxU!%b zK78iGNmS&p@-<5$az<-u4+pujYr=+UR`7fIqRSPYqg1bbSobqdaE*eQTn$!kO%K_i z^eJSAI{4Oy197ds*#M&juqh~b^#r0}^)2x0B+*pKh?=`>h}1SQK;!{F2qSiJi7d6u z5X?uT1IS-9ZYS~?Xza2{Rc3qoc++9-sDUQj*tLk4{A!ONG=OG=AM^nc` zC98-SnJaQdECwR_9G2|;+jb$Q96bNno+`(?){I)5Yc#~OWCuRTFBVr_7nWRlhuLCS zt}2*U8mxLU;V#kK<&sS$?$$Y6&^`&ZY9U;4Ow0(wQxc3uttY2na3C@xk(_GqW;YVB z7p)41I9refzHPFQ*~0ue2tgMB1r{@LJCO$^;aFt5E>dcuWsJP?Ag+0KaVw4~EBH?0 zU~z0K1_4kmI(6~2<)p@{V6h34kK7C@LmYx} z4OFvOasIF$<8-%BgCg7a)ZqToSByk<>pj_)a=Ba_!Er;qB5lX{4KuWI>Ml-@b~rMF z>Lyeh-K`}18=rQw!*<_vgb-)O*&e16MO2t`%CN~(5f4$A^uU8|{7}m%xrC~Lah~bj;_@{Kodw#2) zdx-xLSY;f{RMMDgM00_sL5<5fBlI|CJX-pN^sWjQ^LAK)y@MEG(298tzIW%!dzG3J z5l5?v3Lz;3LfGJnyCMmQK>}MTf13vFrYG+#v4J-lpR)tWr}O=`;PJRm^$5yA{Hk&l zAe-)WCE`m!-xngle%nW$pw~?ZVB%`*+g6 zjIm$mZw;uM_ng29%iun#dd3Um~)&0jnllA)NUzsaz6A{H_ zM~tghc+g0&ZAlGz{S;7n4Z-gW5wOjh0tU!8LBRYZ6m2yZymAI_NbqiTJTo6cNPXwX zRE9Ewv{;W%?6yL3w24kWtFR=eO7~nRKcJvxZ%*j|(*yfYKHq~6}))-oh3$gh%M zujT*tf?AFe}Nx(+2FGMurzgA=BUz|`^l89SmhsOYr3i=vw`LNf_fx?*!! z$Cr2>0STYjIHS9^UpYfVbRh|J_=v!IVU@0iNTc38GzoVC{Fe^j#xm_7H&1xKC{|wh z0{)g{_RXvw-}Pz~7fhTZaoIYm>GlmpdZ-6uk|N_H(Ar@6y2XV8R|M%JoN#cGv_!+D z@q!m%(WCc^Shv({g{ied{Lo0uoIP3jZ`B}y_RDJezcTEKI(FCX60KwQ@RMUcVfBxr zowqod#ufA|x;yq10HJuu|A%OyNTVa8t1DdoN>|V$#Fmd{jax(N3|Swr9%=2$C0aL0 z9e;MsD=YYzHH(CCfuq-B-bNWR6dS}Jts2p3QKM}0;y=>S`aN?}YLD(Bsif}FXny|L zdd9I57WW0OH5S$~zDs}7s0eb#ob8dM7IrL{rO(MzYdB4BzM>B#Ecc(qWs%!mFChpc z>&$kdsCX&4`%C{GeayC-O`XUXmUflUfS$i{uYQVaZSukVNfW1t8=8_$knIcZb4mho zfducxfW6va@G5}UQ#F{6hqM`N)I`>f&l?B3~;6rfH`FWXCUttY4FE_X}*pxmRjO_w<-P zCaamx5oqVH1BpsP6D37mGkkPNRi;5RZ{Dqh<_A=hD)WHnR=J5Z2?V48%nz|v8ZsQP zazfkQxVgeBT^?l_-@>KQ^8y-}M|$yomSf@;DEJn>#0Ejj6~HFr6>+r0&uNaN=a%#Z z%3s88v{;+e1p7hGT(sP5lSk>8!`LzC#xv%9MbmD-co?q?bEEvJe#NQ6gHB;82%+bI zLbh4-o8_e#QDU<43s&>5AmV-Z^c4B6xPz2K`iJ*t-W6j>$8j1C>9-nDlH&O9CF(Yw ztEo#tZvV-kr5221(;s~sq)O1gO1?la22TYSVkJ9z*4P&T+#97XsD#X3&XOyMd~DGz z6oSuqh=l@5A2`~YtaFYpFgA_d9Z0-EQtzs5n6BR5p%`ej+(Nkw8?_^8NQ)1PcypuU z6xz*%Mt39)!?7KSUpR4DT_!d35?W5ak})>$p*+jUB>?gETJ;B--#o#o%NDURSSMd9W6=e!w2ruoV<1;o()gSyD;7h@?uhFIF7euNNR6RO+(_!5PM} zuKL^NOSjD#zp(6Tn4PTb+uUr)QJSlPGI^0*zFx*^`#fVxpnwRWbf>%&q+#jpViNXb z_CznEo%#LLJSn&3iksN7k(!YBbqx|BA{Ytza3IkiW@h5IBQ| z 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

22HqY=&9bGKMPA!M`k^zFFET${6 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®R(Np)F<63hr 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

+ +![PlotDevice](app/art/hero@2x.png) + +
+ PlotDevice is a Macintosh application used for computational graphic design. It provides an interactive Python environment where you can create two-dimensional graphics and output them in a variety of vector, bitmap, and animation formats. diff --git a/app/art/hero.ai b/app/art/hero.ai new file mode 100644 index 0000000..cec056e --- /dev/null +++ b/app/art/hero.ai @@ -0,0 +1,1972 @@ +%PDF-1.6 % +1 0 obj <>/OCGs[26 0 R 27 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + hero + + + Adobe Illustrator 30.2 (Macintosh) + 2026-07-14T11:43:46-04:00 + 2026-07-14T11:43:46-04:00 + 2026-07-14T11:43:46-04:00 + + + + 248 + 256 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD4AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5FpK6hpGoPLYXwh1aIKb MwGRZPUWRHHpsVVTVV+Gh+LoK1GYPJlT2PTv+cn/AMwW13StKms9MliuWso55zDOJW+sJGZG+GcI Gq5pRKe2XDKUU9T8v/8AORX5a3+i2l5qmojSL6dKzWMySuUYEq3F40ZWXkp4nw6gZYMoIWnoWi65 pOuabDqWk3Ud5YzjlFPGag1FaEHcH2O+TBtCOwq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq+GfMvkPz55WuTpFzpT3MsEsgjuUtBdRyQ0Qo0UjRv8BJY07G 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 8PtuwqKdaVwYz6lI2f/Z + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:ffb3df92-75ea-419d-875d-2b67da963ab8 + uuid:c9b21bba-7a03-3d44-ba65-e298b0d31278 + + uuid:f71d7eac-55c1-6547-b1f7-49bb1ac7776f + xmp.did:2aced3f7-5c85-46f9-b931-27505630ddd7 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:2aced3f7-5c85-46f9-b931-27505630ddd7 + 2022-08-13T10:18:57-04:00 + Adobe Illustrator 26.2 (Macintosh) + / + + + saved + xmp.iid:ffb3df92-75ea-419d-875d-2b67da963ab8 + 2026-07-14T11:36:52-04:00 + Adobe Illustrator 30.2 (Macintosh) + / + + + + Web + Document + AIRobin + False + 1 + False + False + + 1000.000000 + 320.000000 + Pixels + + + + + Avenir-Light + Avenir + Light + TrueType + 13.0d3e1 + False + Avenir.ttc + + + Avenir-Heavy + Avenir + Heavy + TrueType + 13.0d3e1 + False + Avenir.ttc + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 18.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 5 0 obj <>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 32 0 R/TrimBox[0.0 0.0 1000.0 320.0]/Type/Page/PieceInfo<>>> endobj 29 0 obj <>stream +HKWnG +hxHpf($Eu zpmqةq:[/wvK򑏏'N^>u_;wS$of'?,BN8 e5oz/ YFq矛3&_qcΌ']b̸ Nٳ oN8&O*eZ+ƒ м$<5;N/T|IkA$>[pڸ!a/F-~r r^Uzf;Ib9 5nI"rf-7f͕+ zvSK}iK$ Dp%Dj%\wk +'5"{PR) 2 2R}!<#>2+sjJ@Ezj'j- |d1긐yOySJ&>μIS8W!t-ZFLۺa|p\C )ʎX̔)F(CͽZ]a t}ʮVٯ$,M$FkV| QD̀/HZ HZ#X%s1)f$Zq6*^j2i]@hpFr! a٬07Ҹ6THhIoV=D4u:4iXOI^ +6a^~UJ}2OyybegpS wS'{p kz՛˸ex|iEi3PxIzM&R-^ [&Qʨ*&4^--Zg!xVd\sKn6wp*_"Cx@K{f,XN8DL9*t.Zc rMifӐّx*X'Xj`a;Ki%AvQN0uQ073#]K,%C2EI vƊc*:~MI>Z_S^Ʋ+4hH[B@_VE.bߵ:`Z4a5l$ < +8& z ]lWped [-? "Hah6P-+XZvC= 9?`)5.+-/^ I}hm21[Z_*@(WlVWrOM%H {.N7U|vx+'Ѧ7dB +ՈT,jhtX*&/mvxT:jL R;W>`Ɛ|+M}'qٮb0iP"߇U;P!m٧eYCH0۽ }vAQRƺ@ۥěnj1;ywNޞ{dQl,LŋA!Cp/>ώ_~}vu<^a=.=l#$އ}~vpwg_>]߻볛˿.o +P[\͋w?p0n\ph!Y%` endstream endobj 32 0 obj <>stream +85$Trc'a5-%/"-WT&S.]c"o$IZH#*g`\]CQ_+[r($D#?>HI1ACKRB4e;A7T7LJab7KF)r#fu&Q[_VlKeQ3g4 +Ra_oQN=KQl&KsAl,"1j=XeoP7RtN&S8$k6TP=8rcd+_@#+CV$7o41f3R2;j?IO`/n +J8nD%*?7gnhQ)dko-GT+)Q(_+-Y&pc8jm-cpJ*Uu8#[/jiS-Shq^*cX+a*,k^Z;PQ +#eL98F!`?$U/FIdce4f7I +f\6?M2,ginFe\!jIZOKMar>N]%A7aIjYr.a0@IIV\(]K(bVsQ1hI@K&!<<-"rr<$! +s8N0$SjBIp~> endstream endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 30.2.1 %%For: (Christian Swinehart) () %%Title: (hero.ai) %%CreationDate: 7/14/26 11:43 AM %%Canvassize: 16383 %%BoundingBox: 11 -6526 2816 -3610 %%HiResBoundingBox: 11.2456570437262 -6525.87898786497 2815.27061070215 -3610.38878837786 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 1 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 486 -4580 1486 -4260 %AI3_TemplateBox: 480.5 -280.5 480.5 -280.5 %AI3_TileBox: 608 -4708 1342 -4132 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: 416.442989008114 -4208.98972118373 1.99308052565574 0 8623.65976864606 12425.0451327306 2486 1330 18 0 0 6 45 0 0 0 1 0 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: 416.442989008114 -4208.98972118373 1.99308052565574 2486 1330 18 0 0 6 45 0 0 0 1 0 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 73 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:80 -580 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 11 0 obj <>stream +%AI24_ZStandard_Data(/X C=`it0 ð(p~#$RHlYExfql)7RJ)D6"e{gg㐒N.9 FpAi4 9pC#1±4E84$D4 4 "`4,84FJ$T44 a`0K"$!Y8E IñxHh(,hVp8$`8$ Kn5a2/aWLز1oՔEKXٹYIdO,5W.N~ Awni,LxR8(.D*``4Hñ04MbK Ex$4DBS01,qp$BP4)N EC*5 ɂ͢A:Hܘ$kQ0&@40$%vM x( &8 p,M0d! c䡱D̓C?@ +'Yh0p.Yx4@D8XD$蒈`Ƃaȡqh" @A\P9ǢTH`"Р`8 QD̓"ICq,@c@Hhp(ޝZ۱5*{I+j +`qc sL$w顱phD8IOdQTP, + +'@]˜KtDX4X(ǣ Yh + +A䡐4@HExHX$ pNA2Yh8G)I<#`0$Q4EA$r(9F gӻtSmm\x̼+=ZҤHu)sh$(J.kYG%~0K%봞cI]n>-ꎞ)2ɝ'eʤL<=MMUWԺͣhU̞3J09u9mʗO~L6%=%)tF.uIKFNV^fnv~FxaŋFziի6?GOW_go?ȓ/|9/~=!JhF!ЂZA%L4m'RZJ+1ɖ[pEE-kaKjV+ZRK1-\t/9aQ̲S^N/r`r!?(crtewv(-j1cYb&1A bqfYFdaZGe뗯^vuQK-*WZZJOb,KZK/K[laJ*- O:mҔ%-ЂJG-R!/ߟ_?3\yrľ~nδS{wskc_[3xĈ;7/+#f.,ͽetE"um]UM=5]2eONNdNBȜs[\ӒYjA DxΒ}34<;K!tM븶%BK&403;ԝhǫnixkytRO%dkwثgXjwmo{د;*עzE\lYI>uZ)6~]yo_O7_w_RʏĹnY0yB;-R<̯~ϭuR3i%<עתϢ= Bh(@--}ms}^-+&sz?Oٟ+{;礞>HQvxt,hYGjGjӦ0kITB,IaB;*=zFq*-<;>#dv9.](:^gw0j9NBߜx%MڇWɅ~ҫ]_{=6͏O[=3ŒdeיѷKY7SVavU,VS~U,I}SovTK>-3YUK._6U;05ͱͲ?_3A:Rv'u(T}b:vPZԺs:r%R5_.鱱wu +׷llRڤwͳ _WD~֪U~xWudJϋ+1h{8 +zˆ?٘դH\reiRzB(-ČVWG}2%f* 'gvmjŽ 4_*阼-+7~# +!SvuGT1Wz_d|mfg7IT|FRMvӔT4 YooN߼Yqmus1ϖA  YH4@YH`@/j:_bk2=|ngwL>53QS3ABgN[&)mE1i?5FUq2ӵМ=m{ON6VGSc}\vJoA +o^c[i&<9>Փ̺޼७-bBkQ˜yը0oXOsXYƍ;{iߧc/Kp#+‹رsaV?*a<TSG8rw6WM6t6\DtL[{[wufU>U4od{gfl}SU,ݿ^^Tqݵ7q?;- ϵlj/(8ӹ^zy/_~!D=.ed |O+wfwywɯj~2< Kw4U$ԡ[YTc+zΆwk˭əͨjf,r}h&wwqɲr&y 'ƧXw眗݊%ƽ|}|̖˜~ؙaN:QG>JRZӢPbRɬ:9ik0߇ j1kӷqm[lB>zA|%0e +0C#2 Q0E`j~uvFZ@ $A( +1 C b&!*ȴ`,K hu͋cՀ3bi?=c.yd)TN]nQm-G#%m| %qŗZ2~/+HoF汮 KYer5#!f?gg]^}qtJ-YpBQ$<_5G\+4AoJg=uvK= 8!y\ r 8@nb%oc}@B]aČT4$0TuHyZUX_4ۙTrRGk/ \B9y8Shq.dMQzA0O>b)؊9UU>QAҚQSZH #ì)}>;:N^Ǐi$u2w$oO:M^vVtyns<3e/=#5 sqԿ1oD.|(DZ!nj@(-({Ϧ @+z.(#´kZDu ҝ&6kʻIK9UtTl AKD D,-[FKEk/ }@ƣD-*Y>ledsYtcX*:š-ZM@tƷmT4&fbbK*֒\TG]K/]AžMPw#y)NVم:AN*= )pjtTmw%G,Q;Hw3VDGSk5# <m$" Z6[`A<!RihRm5j/uDC[e9˄E>!<)G^|(v|j*JfN&m,!i=rMTP~h:Xpq8.״(9O}^I֧!4r8T5ýnYu`[ +9w\SSG4C*@?W `a@@%.""fƎݵUGZCfg+,',YuÉM501] [)髿sؤEjdZ%P3fcuvS(x\deFP2xIբ#$9_s?r$]jvJonjv[Uw#WPJ ~x(0⊀\D)ሂF}:7l_P;F hlzp͛Q[VG)HAߐBI%L7v88, 0WMT>%h4QsJ7HU)AǎeFYz nO]UU +n!t lvz PW۠B +R5`DP9/Gu|5SخqwS*3| '=-Jx{\L j8g:4S=5{#nPP*,b ?d[F3'=G':pى($>r0. ;8Tjn&3( `Ӕ +8fkaYWȐ +۲@;1,g@FȲr(@L \. (_J Yw +p `LInVq )Ԕr@cw\x[7>R!񔱈B@N;pNO{$-ZŹla3ai%L{k:lyVꧮY^՛p-j:l:$ 1&VAH"'p_p&ҫT_%)6(Sq ;XPD#M׫#1_^׿h6"LJ!kBJ".p*Ʃő|{GEA(Pn') }I$0U+)O|tm[KJ z{g^Oaclgӌh0N TRvau% 4F9t 0SQ(h4A(_IQ0W*CJ^gª4ZZӰحssL9)lpĪI8k<_ɒX@ ~\HΊ&1lGGssqO3|P*L&qӓKYrr vBa^=E"<-@ $.6_5RhO.PJߩP &":'鉈P K kʥGHK?&fz rҰ`EDF!*}v6 ;@YԐPyIuu'WIJaJ\S!5 +$[F\V/]Tw+Bŋ^6tR!7(mr fуP:wbhvszGmOL:ML"Vo}U +f)V\u]RA{2O1v1 b5uؽc-'˵ }\-)NIx>d~&C~ȰΏ +~}bJjR?U e=aY`Z#:A PkZ6l-SAWPqA4ͨ]o=5~LIqBaKHAGXVzc^Ja{JQ6zJ,:Vݷ)0vj9>e&~,E>쑧D/EDY pFI9jsБ Z B\nj9#"̋o,GʕL >pn{~О ktĿE +M^CF'+[;8;,Eu! d qdm"aN^/ȣM"-P-u#zjʇYS԰F/^*KX/W(rtψt9@blyvJ9uIhݾ,EPާ(e IHDq~ +Lg`KtաI&"ᅥ-AͰEyn(=E Z73x Q (T2ࠌrt^@GY/94 +fN.)b^K̿5)j$KW8C,g*t-8(Z6&zQ=JΤDr)q 8m.C76E9-ǨKW_ ц4P[Β:fW2oW'=FM pQL"y*X<^6:Ya^9 bW +%Of 86b"0%flj/lW>oKA .   ߫`P^%ttE#Bђ8#TpR̘n?~&fϢ2G#reocgվv v &$,kZ;p_k]fgk +Bj?xjSaexEWJM#,{"<4_Uitʙps4VfVO>"By)&bi\W@'A0[yd5Q^%kn%C&kAhb3VB,BHP@R2 $uN!Өh(&TQHehAv!:ڏ .Ү:?{o(yrM/QSXͣT W T^gWmqO)?_"{WSAW9z#FZO~#l< @kW5ۭT_ƯĔ9/]2ks (.L/唗V|~ Ja P6xe_"܁_xHv ߮V1,Kofg!a>л!}7nXz| {(GO7!r8U ' @ +O<ص6KN ?fF ?MxH`x0l"Nk!\EYX?b/wjOΒV4Iž^L9.=ڹwC90@ cb]#`fุqNE'ntת +Q\Ek!μ +&ZMƅB6^I8p<\p8xu>94hT Т&A {]PF l|%/pN)/hLq+3tGcpz\p.>FVO<.sqKyx:OÀue0"6AcSiFg , 9;V?v~4^3PѤH4\I:4d@K;{DAV&2ou!W@=ab|#3EDcF׀ +qs.)~ftprl5vq;["pAϗ +{XíLg…y.}.iLŇ7@ތ7Fj>f=+GSi3${U8iѡ\T[ŵRno#>Z?s(1\T4WzзM!u^T.콀Nzm!)&2BAv ̀zqY7h) d"նxC +vQ +aЙŒ.4''AƠ?`x#M:>$W|^kx k>N\|݃_͍XdU\.y%c ~ 82[pU%K WFs@" 3`n:]J-?:`+e3)2 VbzM? V&+Ƞ̰@ݔQYj_ӳ]uV9v& Ċzi[#ԄsرȔy0 37WŔ_@{x%FN+?Q S!UI!wIi䅤U'vSw:*|Q6f wcL<)G.5ZMvO(D3&`~c?Ptv=ä>x0d5Gf̐ [q*詡eA=H,ޡCX&G%qB+Ϩ;ejV rD/ʸv$'_<+j+οQ7~[Րrf )dy#QڿU6T^_ۯZۗjF5O;[fttL[ݪɍ}Ȥ4v]ّ=p?|JxHS0D8}RGj+v3|Z x#iA @[c'Q hQ,3e5y!)\: LeÂRŴalTvX*-AɳFb8FwPd4'o*Rorn'%(M'u8wVEL_v)EѤFK8(9s"f.b xGEu P@ckmp +(j8"F0VJ 3剋HR w"To2_lF@5O,j.!H 6'j +K~0O_s: Ly\4\ʱqgzog AnatSWT' +a2Ey( 5N84O=,t@X*.(.<]#n@qF:Kjt״rh[sjv$}J UisyKd( f-l|#$&8Jɝ]Ẁ5](T-EQ~"tx#)= o PQ^0jY1O$i`0^\*#^ovF"R:g N|vKQjtW(2)?%(jf$AS +t +БLbLB#ꠒsQ35OGyE^,?%eљtD .>PCWU,w;Yy'-ؖ1X:<6)jJ4uȏjZF̖B3U&(;6ZϮ3Ziտ_OW+dbJ:kenF&_{5]%ц!/cH꘾59Ջwi6/L)T҃2[FP1j֣ӣWK˻OMZ,rm׊c1bR$IJDo.ܖۋmI#BpM"yaU.G7;%ט4b#bi_Rjۍ z+"I pe@]#MH[MM_..>2WYX~Ȩw k(Nȓ"_ၫmJI\;ftbYR8tY_!mޙ@Y7ךDc1 +!2Ѕfc;%gADL1 + 8>0BU vgx@]w|e)\EKk 4?<E^.fYx$tfH8-d~G`Dnam~/> )+8X_S"HFtV?[&\)=wiʣ. odB{ x3F|^NY "w7圎mެq!I)yU +  /:4]&$\33'KG3L62hJ07¾WGAdnNA nQ>u\IXi(tx1+? + dCxH(@Ǖb,RŚ0)TU҃8pR,Yy,l>a8V,>gLgb0WfihEϗ +LtBw)B^VQra r0TUO>42d\"S4S㉉=x'JΉcunL_ِDwNUX啮ER\Z#)[H5tk6 C)Fq6ռBKuTLC|MѺr)n.Aj3QFa]Zɔ*'!͵\!뭾2#Z'(gW54b Cz3c=hm+uP|_H; Lg` \|jH"{\1W\(vd;{0yP>YR!S1SZ.|&ƫvGk "A#i(#Iy;Xh$s-Tw0wQh',]$3T-)gBep>w}񉤪$&LG/3AS#r]U 31$3D|%2/WՉͅ4I oPmW '~!G>C8ޔ%lBYYLR:CQ +}# A椪j_ +#2m/S"uxS@1%pqDVC&YOH<󑁁/,@̹F1*bHb ɯ[2CBwbtǽK/Qt,}'Ԑ`0|DV !!I,v =stڧ.x*As+Q]_1o+dӈph ?5 dcy_nV'mal̴e .m/ {*<8rC`0bq& 4l\?c`08j5^"~ $\Eqf9 +%BGaʫ2ByI\hpRDs +EP͋A$<:iH{ +L} B(j*{RDn!B.qIdy̦t^{r*H;iExl¡~ Iҳ 5Vi%6K#rAeFz)!ڦj]"{%~n|[(_KFOFvV#.0pPf%f"aL0QW|Ev2gx-k_亐h>< F#WVN1<Ȑ-_aeE'f"UQ>0?9}x8烳@ԎlW(Ҕ#pNUDK[PMT4%l HŁ?L0Ya$y +kb7k_d"jap|m P̰v>B0=`c*'9;,7jErU8a Uŏwbd68;X)qAZbzɤw^hne^֗Ӂd!%&N;,@b , iE>0cPăE\8Vkd&*sJ"|Trsb +||&&RbbFx07b{2P9x./ 1<8./!vЍ9G,R,sHx 6\G5B \ppW2 *gAԼR^كa7My(R9.5lB`J$lJƎC99% 4 VD<Fq'y 0s wm9UprkNPyFϐ~PgC"ZL 2$8 KqP59.E6Mk$DW(L} }+~]u$V䚙kX$ $hS-amфIЪ p0LhcR"&BHSc'M" yJ{Y't¡%u7we%C454|"%!DCpȡ8sn$p%7d .rRr}$eBg-P|EEDgA"% + CqNZ=r$ +P/ĊY)*ңXftG9_Lb(7"-쑉^lM  +o&B`d79hx@;XgdVi8l5UB̓y02a#=!J񊈧0Cl02'p!+82Tx:#TBDPBMs $' O!E@r Ee|q!E9 )BA%2TFۜHqT%iRE%UD(@Ce +[s@EӰ9?(/o#|7nP<Ҫ +4GJTdVz_z签BѠqUaDà4ApyWcCk92%|R43 +LOlB=5H33qJbaf|## +,3,ZÆyzc0 cTjЁTKvP &Ğ8d>QPZЧe !ψäy'"L-PQNJeL"~9*KQ雂`.QTy+@^=JF\y2P^dYi,j;1FBeámXDOVڙ! EZ KSL'ttL1"qTK-ippt&(Y:Qta g>,$Z7C"8 2֍t CM9<}H$: EQeRZ$dIBE,bO^! +=dJүS3#ilz +9Li;1i#$,j1C\V@o榺h xk10 ]jb{ OX)H^G)DrFVOXR jЬqIq^-E"i=f0vQRO/6tz&0晞60R }#hf&a]cT4?j;_>YW@ K$ӣ@2Az8#@c:(G5@p:Kb0\42$C`SCJ2+8 +DE3T#뤁@TMïz2 + 4pB "@! pA4`"0BK(Y 2`"@6؀ hP"  H. @(A4< D > lAP4Hs/ !j Eq0eTgh/ $@}!aF,W>r CIntZ`P@2tQ m \-VM4fT#BR4aL{$Tqb(: *`$ QVXboJ8 C#Ӑ'f7t&f(thN?'ŒVuરjqS!U)/)Ф'.GKPө2b˫4K bd\vkB&䞊(-i`tC1(#*"1QvZq .4RG NԬ(%Cd.Gn 2 aP !O #4-Lzςb@J?xoS‚B)rhMC 9UhS-H}u0 NC)YO2x*䋔A|~FoBu!*(Hl 2} +l=qLWYѫrNHb=a Q\[њc沈c&nݧ,"#T7n^lI5LX +$K](_%0}=U37H{ +KLca j6v*6ɉ$ t' KfX&ȰZ-;cA:N'%y pP + K[HYqI%encW&QHBD!b!.)b'%3D8-h$ڣ9V"=c\{#WE$CqR"mB8y=*JΊh͉&,g`W5Nf0-DRt)҅r!721ĒP()ābXR*,A"Qf !sr(ÅB08lbD1!Zb",C8Bo `6P "%X9T*Ņ}S"p6P63BC6a:Nu vmVXB۲u0D74f5-[-Mi#r +-%}h#R nV0-@061w<ސt0)V>+Ҭ h=U@@S`*/ *Xp".bU*!34̠j3%HyiJF g"˞SOTCCh‰^ND8u$4 B&9tA muHh҉  Cx[D&Dka8i @X;`V0iLL.mgvfGϗNzԼ "j(Nt W u1-VI]b2rpa6Fc)1fwQ1dH#HR +\E%iNhPC["KXwn"UjWIP8kuYSB%3Qo2qNd"qz+z$=eFTz+:ǻ;quN*NYY4R,}:W*EWjKUaL Jg:-)"  *?> +R?Uoտ^>.<U;"Ghnu ^}$/es&Ee%U'”TQ+YF2* +t_$](2=H.BHؤ")X=Vs2ыsƘi)-pmoKJDM(9uV&'X "+(I˔貨{ۛ8+ʄ}!2Wg!RrP#%D3 !VEC5TOGEسIUl>0uR oEH\6]ʣ--0n `NK5HfbDTw,HUPUoAj248j8U((RgByPiSCF$ U CglWQO*C;!p**}Nj7]14A㙧qxDĝL%,:6'FL22v= r UXT䠖ɥUeTUh[)T0Ev`Ru3zTj> T`Sc\&^z#42+i+e}D=v=f)7̛lt拢3T1"Yfgѥ$!ȗїQ~CE"ts?HaׁkHx!K=WxfA*aGt@GX?m)Qy8eL%S"t;QMx,2u@E4=9TgPj8vBJ*83$mmvL+>1%”ĥDN bԡ%P0N2/`렌-,YX(+WiKdCӈs +bybeVpߜ¨ZTH+bFR |e486bDSB`*RRXG'ьRMԠ}jEAV͂q4 d8 +B3%BS\uYXx0HўN_E=:Z' +{Fg?t8PE^jF &uHdl1 }d؊&b`ClCS MyC$Y]*P"%"` l ``$؀8!++E ax4E3(WgvO9UYIZ<Wy48W)ц-Bت_ӢdN$SmNg4Qv(J)wȧjh]!Un6)!Lj{>VmGeKOa15jXIJmTV<(TLU!QKAbjCE1rP}eJr9Cj\ iȃPSҩIQ(tbCDf>$.Qj#>[]rKֻUq0'V! +r tou Bѷ<. =`4jrViӃs!BaH + =X=́ϭ k0S0;pJ G&&T9/sx3EHܕy7*wBYd ќ'4`$(3B`L(>>-bM Ĕ,bziE`MHlBMR-LMe| +Ͷ0n;n%T\]&[w=.)zI!|@aGEıϯP!ph*(/Ҿ^o`L*ܡ팵#FTHr)HHG2%"yewȣ<*gGIA+[-U'֑EOMfb*^ ^f"K`<~,!&4 O-f$@{$}oĢV3>:33:2eǙs4 +2Œ3 +;_}k5^سQ^Ǩ *zUt> +ikũd;.1i-Q#q-G2i Y&N|Uht铪2b*UFzXHYqx<:5[f4d$(bA}qcjz''Ş ΅gĩ!3.:HKXf1bJ8ъ%qKDiF3Sce~d/ɕMEiƊTRb[0\eԐ"]Ng4qesnD +n$[4X)b5p!a7OilI: >)>{F-u@]N{޵qzߑw0m O +1Ra<>ǎhDmae}iO48i͌ [$Q )¡?F#+|<Ąr8C'Z*9Cboƒt͐C5p4 +)A*RwR 2}>ւ,l}$6ƾ_' _#1?u VּAꤒRHzCgZb[#PCĩўyXlhOPIH!Pr2%Pr46rUaY + ˥C^5#\'jU e,pJ]NC~7fVg$B?ܒy9VՊ^0S 9&!K +dH g'a4B@Oŕ0"L DMݤ*$CVfjd"ҖU}gnFYMV#eh!投zbdFrϹBb*,3~Uf!:#w~Ya*Z20N2'_W>#L&.&#Qy2fzgv䯸PS)Dnc1 O9GM M,tR +҄˨c^]ICܨpD.bć\&mD(X|>bGXDHL 7\9U8(D0<(8X4L1m2[>Ӱ`qBrCDmz.Rq%♷d5%k:d+rBQj榒P|bhyue^Yt4.) +HYVV?3GK$w  {b*;5tl;hBмJ9:Rչ"[C$5uդՒzBĒE"Ek?e ׊PmeW! ,{J   !DF #, ĪQK-PIfP*B .4 ]hЅ2L~" f̓2aD.p $hjDBe:lԬ / Ri YOb>̟JyxBӡ0m!ЁD'4.+%1!pXF(|{̔p " ""|DD$)Xjp  =0MUI.YejU A UP_N11u(&}Jz^QI/h Vň&FbA AY gaK3/e|Ux:U1<*wNWEijpkPgbčL\]P6Օ҈RGU$ay!]C鬕pk4͘$c[|Aq_> MD5Aj*WFXE}'C~B6hmn2#3F<^ۻ-?=crFU>k"nZCC3ωk +!))S[6e#~qgXP3tC0UJCð)T +R % 1Z4o慑B43#ppCQؘ6`(DSQ"4}Iq [v>7H*kۂ}X/a%` #HKd9$C{5zbU32cDZZ#YʒcK޳TafA>5RY?7Ҋ o6eͬjEd)?שHxS}wON)Vs.FOmRU%)cebbvAK?ZrLKDxiҕ~˗o(jW4Dgr#w'YV|bĶ%/Vv6YL:YTzYSoR7^15;P߹.xgЃJU1T70Sw  "CU> @eQLj0w"/aUa?!_fsY?*p]Z3dӯ&TgX8ljuv@bCGSVr:6$,(?]RU V̕O a[E-h1}QA#>hBTƽP'3!h‘r~OSm ޾z==>yaԭQqQzx2+g+[gl,?miWtpzsO~FR {Jk@ pO0F, INl$[s ՕQ֜kFHǫݨԞ>2`r\}4A)15-+;ǔ 쓪4%{]0[ ZyL@/u褐 +o/ ث +\n.8 ^"Q/gmBZϩ @e֛SK- `X/P}1]=|o[EWg{UM*VODFG%~+|g)HK=8.s_QߏciD{12.O3[yEszhjh}yazo >usQ9`} {;ʾq3OpTJ_&jkgib礡&}.xN)ɠ`~٤`'$ך~RzJMVd٧BRK5$ \Lk+>y"W^qšFHۍy3  7^O,!=оvB!}"fjz%@9b Tf#PP_&&DjzDѼ),CqA zR6ٺx}ҵdE%Z=E@5O'\'*+G? +6hx9<^yͳ4.~擤m9gv71EkA IB>5(*-_hye34|C\9i#[I-,,ɭ|']tr~jޅ{H˱Q@yF}@pH&Us`s0P6ㄵ.ǟ#8e{D~h?Bq "v ݺ\&`+y.Wh]227-UdL3f㲃2^]`7>x4{JqRCSgS:}"o,N<2v~=RuJAE:bH p M@%S[+Gh8P:Ȯ2Cë0p?T۪gc +?ȸ7w^tZ, #|LTł\#%J0mHaMڅ+x|.$P{mX+[1;daQTwǍ0dqeP5$F)\> +`>edSș6oS({KJ&J٫lԞ8֙AyO)PSqS/f8oP :݁C9!wFQN(c|zHcݯ Ωcq|W@鮂rs{C;bk^MLG$rOEXr{Dr8WQuF̸;q?r$/Bn{h*H);i۩vR.nǬ6:f(En'b~n9ݭ20;M'GdT64~pGIg.AᬂQ2K$B`6 GY/vG37*XH +%}MqWI?կZ1U뙑k'5+\:±ɋqw}R<%.E_5ŸʃHs=Ge1|'kح%CR#%@CY-k ,ӵmbۦ3, |RM0,eH"z4!)OK\NsOZ.> V3xr?ᱰ: hVeͨ8uOܶ3Th^8>x9-0Lc7uXiefQr"P/ bo*nF}zΠxH8w`xf<6Sptb-oׁxk*8cf32/f%x4AדBƦKl!ʩX:]8V>~Ui;r YүTSm9_B w6$Bzd+:!^VؽqAAڣXZ6]¤љ^?pEH(olDWCḱ˭\%tANFR%@ >O56W/zĿ҄ED +ʥ!(Mr* .$"5yl%申x c74@vέËaxL%(oĹ!N~Wg@odZ&{H`LtIRsj͖s8w3K/Q8GXM3Vc@޼I?/[:CxH4H8'` >9C[PU@2TXlSyjA㙆1rIwū|\LW|`]N%@ c\I_tjch5lSiyb4u8,kt͠ +s,yW9'j/Sp>0qq'UȅHZ*'Ut sDA"?8|yM>m+mf? ߕT8?(W'9*|}@ɟ['RiՌ:%M -p; yG +y']bHuW*4</q _qrKJYuo4(P5}~+ .ms+*MGF MYg>8bF+$qch' +tQ1n# ~b6(ygyLaaSs#@5t +Q,&sR=o!vùwYAUIxziRiXDu2pU0/\|:r.0`2f~ₛnX8>W%|Un}vmr!q.1R)$ů{/ +`q[ 29Ŝr_+i{\\xODqq$sN.=%$?#S#lthqۦ`ISZ;˜{\c5/ ~Ǵ[lo)~䥦POҹN|Z{NTjLMX2x޴T,>?&|~.&;E\("hȋ[ Rh.Fɍw&VTJKypakp#?bx'V$OTPBIa">' B*`;q BD +f,iph?32CYrFxb` mZLi=8j\ #Җ1~'E:<5%]V|@@FN9eNaa>[xKfmVoIe!O;xnj )xC%uZ牙O$0~:]/.%`Fwkz?kgr~S-@-~/dBd":9%}#.L>;k6gctP S)gW,x+:WoaZ|''FlsRK=^SC΅Wܯ1m8^jqufӯbՍ愭ި;5O]Xac4åߚw!sڛNڵtL{3a>+6~CL{6PhY-(a}y-V޺1h_7P XP){_6M̓ȽEݨ_w-*(1uQެxz;7g$pwgjĆ"ٳ]q{3n +T {K} lo{߭b_gH +9!}z欄::{˷wz C/{ۿ!jT{.lZލKZck.4Kߩ56>2voSöv0w\v[uÃҡtE{D| Z\-bzotr{P џrýxK{?.35\v FL{ބ XBSq_5Jt0 [zk&>\ü7Ooۤ_eOd'ЧpoԖgs@8{^q ,X{D`#޻pD]^Iwo4d໿].|C;ޛh߭?lqp{s2n@H} ["._ '޴ْy1SwaKN]IJ]"&}F|oQޱ4:TzJx\.z)Q@u~&]1yGmyw;z‰VXSh8䧻?j7Kp7kɔLݭNb֙=4Bl(vi͢jh8Ýu +h&GHushw//['mla.ѽDq| i\ + C%y7LqޓܣIR^iV܉s'} -5g [++~3Dnҳ\<6֋Pu7[zw`4HS;J!n5N%tíobrYEzmΌ0vPBA=~rdېTxU"kCN+mbmEILnN?܄ےj̄N42Vmr=mWi_Ւ +lu)-K-r]*_wwǶg? g-Q,><=w;B:.@s툓赿֠Ӫ.QT#ǰ'cQS}G{jnЧ(i6*vbV=;9TT;p+md0΀Jp%EKUϕ.Bm=[n6gCf#c{{ Dd飬d:TokkEq=:Y1wS>C,[\5嵭7[Xy'FH)j:-j/] K$p6]guY*bz} QaA3Q8WBp#WZykiV!詄3ʣwQƔ~DBpb _i9>՟֣#ObM;knog%K3k0(d{UYc:z dm@;k +CB(D|υOZYTTjKwcO2zotF?z͆#-LCYJ)Vg"ڳsWMזU>f{W4#zrMmԂy: ώ 򩱱,sq37jc&oRVGKNsR?4W+NLPD#9yaIQܭӭ2Vَ=@T;@U J`KD ]}:. @nA6ş6Wm}H0> bek5x[TYDAyL NwqoUG4fQ78|iYYO-Y<lw#k:ńobh+`s4(k6אzYiiĢ0_:8DsBf^gZZ!}DM{7FT6{ d "eʷͧBIyV66,?8elnۣijymn䜩ǣM)dϛl3o`D WÉw1C|c [ONf9d9W'cj4h1`:6TSCTuv? w OӀw lG3-޶1gUP`u1=䙯gυ'x?3&?.˒wg>S^)b,2uSI8@@@ gEv 1Р\)<λ_#3vG ]]a^kww2bఇ*,,4aE,Q{}Z4PqXdQV,B&.\aJhčrX +ȼ[DDѧ]|QG -heL KDC4RjIIn\W?f^5cIWk,3!/^JqXtpWJmI[*Δ.nKO6ܠL8\TB7X4 6by[hz{msZ1Ӈ)Rj l\t=kk՛^h4߱ P U "ć.KQïÎԲ(FVj@&E]l5(tjM-qS3NryB̠ +.ЩQ̔*.RܧOjoY7bնuա"zXgfV"^VXV 5]`!w5ݯoWi8D^m_-xLr`/ذrblA'kV?|C(tM9,2'`ϴrU [>UnqpmHH\烥¸}A+r5s͢vj\ ]rE4xcoM~tuZ'OV|U*J2k_cYj|5 )??`|WH_#l-S3>KwZauV3ӫX u,<گA̹Uld+Vne0!lhYD&wy0f;zf1$3,-0lL(A>Kvf_L ~GϲȚ(~"o9.O%[8J1K{QŹ|}s?\ \-{﨎!VHQ,Eٙ6'R\LC%pF& L5Z7+,&δ?%qnS>"jpsj%#nG`s @Ii +Ma WHEe2q˛T^ Ɖْi:V +}BזZ`28k Y<r(A +8rE jHns0'C/IP|/[2( pPZ,ai%dՓ)5L0@~2C19 +ra$v^3[3y䮠U.$`t `\ðWS.gh`[s`#ZB%1^Ҫ[ 4MѴԊlJO=51 GGAHk58gdmK2<;NJy7sN_ +P 5ٳ 9,37o>Xu?>pNc *4/A}[}޶uP8t 7I̐NP +π vqxa`VD!q ^q%)&njg`{;(39A0@lY+x?V,%Ҟ T%PI8%/&x[3!SBd YLG(Qo6'D N~nde`8' bds FKAe~'Xto@^֓'y/n'x {[fΙ +.4l!p,7e`$釻Ă[-,r9|+[ZpMT ~@:+ ..U0*\Xe fGXp}G* 貆L= .æqƾVOO.TF I_ct<K?qUza mGaj/H3 XHm%?ń,C)&_08Rwc(bRy1x18OcC P1. B\ g~ +X~ir-A]TIҷqvU plmi`X,%A+*: injBۿ=>X嫸L7sq0`x*E,wR^̚"ort*3W;SĒ6Y*RrNn(;&ךV즔(_)bJY+Sy^b(JTVz},,WV5Ȕe-qAXM-+~e+B˺|W +*A2W̫LE OW3Ix24ވ9Xm6su '96l;#!6MSxtp岙o=,3 +?d4IxffkcM#e9kL*bǤ}g:kHĪ\YΞ͏fR3gc5^1[5~d'[m{VAFailV +$YHجn)cϛy\Dtff8hh/PFzpeS!͓ڔ]4m}y#{3PwoX \QNu:s>gP¸<|]3tfPlcl0LjltgFY,HdfU!T靹4f, J溧yZOsQ /RWo \3ӷeOfō%^4ZSI1iG7/O3e}5%9$O|#F+ +gtq&6ë֡<չ IA4pN \ZdPl(Dq:sw;qh MeuA NJCU:4az"Y]M8Mz 뻲%G>iXt0gI#dCi"Ͼ#s.\$[*Ɇi#;% 8.jz ֧4iq!| +R0PGW/(w eľNb.eR\hͻAP]임TGUwvJ:j [=h&@]v aDjGiẫwʐY#Z;JJ +[0=neAmGqr B˙TvϜ.O 턭%S+No]ag/lڎoeH6]jLL=&tI Hk(`۴R Xflyy](oCАmhp7dmsmǥEmۨ'zL]idP2UrҶOqۓ.Xf哈T 0ZE1r.s8r߷KN,U.qǏIr˧0֭}n TMt ħ)(h +oI;}y<WjfWx²{[WQ>P=E!ST7S:ݔzDq{1 +ն38\eg N~ a`4mp6m&ǘy쎹' 35z* gPr +?]_x{ $ֈCLBG@hNaxLuM\ +"@f,pJxA9̴4SqI,x| od79+ 2ݱEc{1SFCɍ(\ZI撆U'#t#ty7;Ϳ57'T#7f{͉!/l"V')>ceЃ7dDžD^aή-;(GW0 ?wRFUb0 TUqA'OW꤂~C J4돞++V5pRzWwYV{/`dTցNIZFh[r}I֮|AӷeKi5.b?>R4vk'^ t%rE]&BԨkJ.9휽lb]}FZ{{2/ݩ]5DksOq ;w52ϻ`!<+$;4H,>q _/,ʓgm <*oiJ=H\S +v)-OZ&^a*./>pĭ,V5Y(O\j=1`֓ !dX^%ڍ w5ze5/<_ w-^v}E_x{Dc=pơ~.{ESOتD<Y%PZR-BUNM#Oil635ANY:N&@`nŷ˹EYKo+4u z/uzCayn]s#8zdxCЈԂcxN8a X)ihYy,5@?"Ԯz%$f}m]5a>-ZCQG r541=4| 5g\D|!wGC⬘ dO%pXT|k2[gpHrNLr↾<_v~DsQYOZm^?֤%$}Cw>3@"M_)K| .fNUG4Їc q~iqf$)ѩ?/oP&_X!zQ rrr"kO8KWqL'R#F#O{ aX4[MJj.DٯQo~Ŀ:TZ)sTvf`/&&]{Yvͨ:$c_]mXŠ5I3!f=;JI04n|JzBx!fn `+F/  Ί.#f`]ĸ/~vX;c]]F9tس36t&vվ\oB1Y`nW$OT|]"ns\DQOL^gJѢOa}}G"bw}9ƦK%af3)J-B"tCm!4>2`m $*0%iObT·D(3^Ah#d +?g{C)b̩Vӡ?,\:᫁3Jun$03q>F+ZUy(bx4h Rِ˅Cyٞe,[5,A lPİ$3~noH"_ZQڶx]]Ó%oH3Nv-[{q ˻3tWEYf"P3lCF'o\2h#wF,A7+ }BpAgk2jg$otȄ LEMwQݝʓ7L Bc_BמY7,1yF/hi%m @Q68.lJ`MRTM;rT^6 +q׼$:7oGeU'#tkq> +Lɓ~j.w)f: +ضn@G0g&հ>}P?ÄAW$r#cEG(@ɳY 'KLtSUXz(2 +pgvZjKꙠBF,5vjn!e*Psd:$;'RA2$sWEjh5rtZIXy;Є^ʖ {-z$ )l~:b]]L]٠ \R^ݜzgn_a *+)/MTK٨.4T!+Pju JJ<ֆv&߫$;Omՙ*t|8;7GʋEkԴC1Jİ1P,|T u'4ݐSa"gN #q+݀_iN0'O q 8:@jbq/(%9N!Ro*S]{2A +S-M1,/ :a8]Eo~4c'$K(MpUKPYLJ@e.ocfRygV2-j +i(p#zfB%ہ N;]L{5i#/g~܃j#m;GfwlaKt[:UL#%2[WJؠFiH %3vK};84N.׿X`S<͑yh٭>Gl4aK{~L +qW4m0c*6*MT [4 l5_@0maoIjH +@D~[zI?T;GqiWL^ 0Q${`ޥ zYiV!mS |149||\}zOhk>&ka4 n5,⸱ck~9c5ǩʍlW +vba6|yR\#Y㵤 nԼٱ% /}BYQx=ij f֧K#/_-Sx`K {atQNs!J}-%ܯN?7[$KMp3ɹJwD5&qb`&ͼ0zԮk؈M5o*h!b] @MHc$ -cY BThn -w$ LP-jΤ`Cd?h"t%ɩU`Sj*1iE?RIaːL_qtU֖&ckZc:=W +_y^l$8} =뜥Wܮc4(~շS!{`c 7M¥ +i +"v\*y'5kWe2Ǯn[`kbh;UCA`0 /kN7t0e/nq1!&jh2k +|3 Ϥ1A`A[V$H2 Tdk-#@`@Pe.tX5*EsRL49 s5;ݘOg +_@=^_pZ(\I)DR |*ZKkA-Iltf7LSA Έ9Z13jj26ÑÖ7Ƈcn\˅ae N,4 nr?0spT'P{f@ 0ĞZ.OmanKC;ѓʹp:ex@_r!ۨ8 $@` aOdC}=pӲY@*+O;0D H$Ô#րּϚgGmnw/*&Ĝbo7ǢRY1lT75j"CAy_@;#-y\M|#{y&sVDX"a4֖L(}RG?@,hkoԜxVa.?>7#|Y8wg̴ ~[z_lwybI/2 dՓϹc&IdY[G(!U3 c3;Vиo!]@2eCtSZH_ܐ?5hiHp@䡖JIZt(mI`T6F%LB^[X xߐ9KǏPqwt|ƙ[Іh/yx[[[FP1N^_'[H 3MN@"i+^{j+#ܰ] éފJ7뚱]%-([n4s/.iGpbrAoH."R?,ŗ\s`/pd^_AY:;j_lYEHxu +l0R)!/qAK8SY$vv:reNY=({a* +P[Am !$F4lɷԵӽu!!V횦 hh cnBH6jŶ$JĈ=:ptVh8~óјSg.GmH0طѧ:&}0WLseïJ!3@gA8SC60M1cpcŗP2zmx-j. +iBb4AB +1&~.O\n.].Q|G?ْ@q|@!RIg csRs@)q A˷.$m%G^TdY K3-#*c⏈WDΝg}_Ps@uHTG_z1( D祸–ʼnBy,| =ۺxtQLE@N +}sa_ӌ[~}*eҹKWt-A$PdraH鷕9on1Z/?f襵n'x4t L*EpYޠ‹V~!5Pfqd4uVQÎSdޞjIiYJ!G:ȥJK x]*|39b7 \jd^'}&B l]5p(uETQvFԄA?yuE u3q^2~)gxl| +Fma rwr)&)7PÎB-\ެ؊> ۝ClrVaf`š+;S*EGU⟏D3?_C;["e|bJBNJ;[ ЮqvoFz0Β[%kDg!4Ņ1pmᤔ`ϐeӀWJfݼ 2dĂXs9TI`H"yb%ʝ^i!.TPȼ%1xBH[o]z%~_ŗ#|>{UD) +dߡW/Q<MDw\J`Llm'\ƞ٭ &~%4-vFՄd,4c )ybdaDu)2`a- ۵\s+L#OaFX+w>یV~npl9Ve|adLT%n$k#EF_pL&@%iIQFtLdF΁10^hV-o+ߞ>{Kx&K4~mF/ +s{b/4*X\bAedEx.Kkђi^jaQ.ybXAVb]3&$fh^D!vt zAL J55 +5.US/sx p&hZZNl["vA0x`84f:cnOܩ~X;y"Q%Ļ}w9}l$:&?.VԴ7Sšț_ 85r=fN=Ԫ^p ~27F 4Kaރ!t}.]ۑ-Mz9YE7ɟAڵGj(FGqR$h(]2X魞'”C w-=yz֞ڎ7T#G`BUݝ0FVKSŖ'.aaj,_0r(cF:bώk[uڇ_ɭ`19\z΂' ̎ 35.H#nGeFAt:-;>"EL8y1(/eg9r}P@G1=-$ -ꚔK2zExjJ$9Eܓ5[5̋ylBi͗ S'6VCK'(nc-f\tHEV)FΆu7>Cf/8L55#G!8X0T +ښ8aQ4\ҼFp_W6 GSR q)CvS*eD:R`ҠA;T@425mt\Yԯ^DI7AՅli]- +.Z u1q?*Dj+tQv6Ed,)G|}'^s>JeD_{Tȑ/ςb},Dogs $82t ~fofiq1!@f#)_S {Y)0#pR-@|v txg^w2,QpqfK8znhE${&"5 T!r!=ʠF) Mϐ7ew*TCNȝ!}"!R#p蓼o7]vd,yk-OU^y7^pV ޅ&K(8 {lH "ঘ=;ݮD^*!Sk _?s#>|-R5" &`fxwr yq@9; 6ft9Y~ xZ51g|q\eEfCB;5K@#dN=Iw,n!WH0,u.uF }~e(|3{uĺ Mm3d!D:!ERAW1UpYOB}nJpQI$A3 WVBQ[є;: +Vb[qr`<M +RQKzG>W]C".5 +}ׇ̅=ݚR |$.u(@n-[b/x_Οs_]eְ}+L<9qO!eJpߡ2J+tNMZ +|!>GZ=suay+?r+:&5%c_ uCdY8!DN,8fC^Sή!od,E6 zeF1ekp{,-KˆJa}S{ϾZ?8(bqn3XuUdyy"2|J[WXk*vl].riltk2Û&d}8~$~Ze+"Օ]&kIO3s8 5{Nʠʹ9жpW7pvzi1*+bZ~.9̚0?Xާc@fZ 3 {y#_rFu,A$,?@w=amһ#:9 bìd5{7QsN:rLۀ6 δ)ǽ͊x:{]c$cWZ^f +/`Kxb2T芧ra=:vtSS01sq_㰎ET63Ɋ}V~02vdhV٢㌙e%"Jsd%=EXڎ UPyBu|<2b<^Z\ odY$y *u\b2I qb%?mOu)f=TD;g5#Sb#}4 V3 iq+Q'?mi*"!v1K?>(Snn4ABCMemNMbҐ(∍wetZ򼾃9/6 ʯ$hxappZF :^J +Sgic۳b7AԖs|`%&u&8 ,i;3a8ae +t/>}9۪Sn$8y[<}ymج@)WߴJ:Y/$D3j-.]v^\4pSx$:Epq2|/zLX&i:8]j k4lLi̫^[aR|6y_\O +8kJ_NF;}E-f-r_آRs2 6y$YAZ+Z W-#SE,I|XH_ ] ͼb |p3ޠ.zJ_X89zx3ǖJIn [M\ Q0~I􎡡((Ӕ@ + +;m;f ?ŗ LRIl ҕC $Lƶg_' &ZR'$%,A,EPL@xgH'XUI.@sZIT? -yw_\uNj?XՊ۲>-~J.^EK4Xq,ܒ\7?e.qgiQklN'0Z]Er]ưRdy؆k/w)Glm`Ri@nnJar0A+0@p ʕ90.s0ud(pyr6 1?Vm.Ifhr~+mcyeū>y0Hf f5` ||&KKZ]0g hVQg:%/$7_GBs]b9 %`wŹDtfGX4Hj80I J5[0.ǚۚlϴkDM:blo4ޟ>Ԑa 2#pEJ@̝T?d(u _,m}h'4m9PF`6MPᲂJʹhyJICڡ=&dͅ[mR/dT zDY:G{/% @4:͑3Ȩa[dP[7b M 60p&KmC)1}w+l#9w"ycUfI3olqܭɃ|.2y5m{H4ˋsEfpptP)Nk#>(7 +y,Uݼ$rog܆|E105W1Mgp +BvE:x!VGʓPO9_|SedƗ*1ԋm^g)d;euh#v[+ɾIeb&(!'X,]~:b;`Ÿde"·+{pͩ꯱ +O@~3&zR2>DZ|mXNf7PIX`AV4}PH_6}%K@+{O*.U4LH1#_)% euC (ZTlRi QTPsZ4jP?I[GYo&zgA>݂ 0׆Ɵa8pOP4>ecce\3 K4Oi:KD[#OoFU\C)lcO4 -v~&_lB'ᚳD ?OegPerɨQ}qD;%q88'AuoUS=~"rAoI!g;&{ZrALC5_D +T7p<4}`HQ*~9 +=_Yc\utܹ(Tk +$ ̘;NjjCOUǤPLÿM"}Jz#q/BqKC(*zB0.}Q Vժt@Kct$u!w@d(/]޻tqcN2vmc / +BWR jCc>C€yO t( &MWNSFlckOKi< BB@`?Lyqpt9e(H#D$8ğL[]B9Wd{fvFX_Q5OW"BkC4_AED{V"cH(_' lJ (U{$ +z(Fĕ'# ѿ@$(!qSȗC`by\ y V[ȞBV(5-I\e4'T-iC:N-(BB5t_X#X] U#(.?"@M SHMK T:Q +лݘ/sjö0~3אSy06FKdn|g4TZEǃtѣb3s(TC!Gxv9H'MYaN4;"ᕿ|D8s}TO|[jbr*CNe^+Z+?)Nzޓk( Q={;)9]SzO=.=:4S{\#^R՟5=FAIL!=cZ3}ƕ|]¸/BC@amp͙94 |< #y%gDВq^ƕKUT/񕤣(T8H޲pl9 e3(̬Cr8>dN?.WϕzLd +mׁ +<sP8.*_  +lYGRC|`UMU`|G?l܆sn첢Q +,#G mBܕoDA&)][z'ֱ"S3+_bȄJAJ<&e*+I F ZEx\RNS(l&&A/\ YW@ }nZb}M^elɩBτ:U nS nQ ^KLΕ^P2v^Õ",.ghc^/8[#$a|7Tpj5 D1`I74q,@L@}Kn)ht5U(ŏOG^nC+$u^\T3)|Y`3/6;TrumLQr|kv8 $Riabe)0R,z1qKvqt'JCKpOZ>܎Wh㐢Bc,Πf w{J3b)F3ԃvu|J`T.iBG,c4P~1'O87{E$q44lq c [̮ aQXS—Z?swg +Mߋyc+`֓_s9WWlH>6,eW.li{Dx[N>R4MzaĦMR?Ң3YoKKvBheuB+̏<G,cg 7!𕼸RaiTJ#LRV( ڥ @r#%VASY[2dz QM04Or?.:@YWWCBee>miJuCZs![*QdJEKL3{ gUeޕjA@!@.L(MQX]QBg/<c'POG=M +E@@P(8LU0jwʁ! lhULôsד5 xyh \{68|x]oݒ `|Ca9ԌrK8CaMZvD6O1@IYxk<DV\X:fC2TPXq!+&{S?p?!h:m؆Sb$ =oXcsw /n.2z]n=jE̿NHW&ݹ[Q݊n[ +z5qd[Ul]I .v1@ݛu mwKϚLkl ܢזk78'Fc6z5 ~Bã1˞H48`Z81g|OPOz4j!؛6^X&G!כ>}ѯ {כTi^%YW2O"V+^rc!(`9]=- ~qNKtvIJtACr%v%AaVqg e9:JV+WĚDKJR]S{ViQEP0Q_ф[kQ d]v`)uu6fɥ^4j1tTn=j`-.,Ҧ/?([ F̪.!;ӯq"r*9 h81I*[SD4^NJTE_K! $ֿe7,蠿wT$߷x 0Kp+2&WH_a>VGz-UXeL;hԾ#OF?|imw#nо2,[ PMB3 ÇSUeJ)Ifn<WO!J}guzuqkw2ܘZ,d< gLFD8#%IfOQ6uC司bCTNjViA8eDHHܣ:C%E%$d"y Ux]첍eW!%a`ɉ)~X"$#xLT#Rcʵ4J&3=-6$4 UOGήIJ/CɭDysCTek֡ +IGH?NVbylj~]qbݺPWR} _Y4RU+ \FŌgAmDu*!%iМ iP yUЈY9Xqukv2I-p}->]lLTe2xU&Hfjjsҙ!(ىj6R+"%,UDEޙKΒPL>u0#Q .hb}@;1-pf*pEF_[[9O$&k7xR!+$Vh$1\DJ"2\1Sks!$ @Dأ6Ŭ`q2©)E#8x>_f3Tڿ4q>K{&^0= &k:uBѼN ,PX7@L}`!~ЉHCWN\~+sQr G(8Y%yIchb-tH(耈oC)ؒ2Xe+`(2G(Z7gbP4HEP;T=7(PxWB`1CΘU$>t G qDIRXʵzfXcX g@}c.NP:Tz#dJ00;n#yAFA0$ (` ` `D@ DNo&Ѝ#"!2ȘB٨04(^ %HUP"| +Eܔ㵬*s&bDG=x +O)Mjp$6A;)" +hF?̫Kʈ T*p zSNPz *ə@gP(ʔJG^# 5ѝg`!!8zffS([GKSWL5 v#-D)[ !8AIfϬ%¤6=$*4HdT$KhOImڥZxQ)KDxCvgPAjL2#0 &.\5Ooj7U=y~ T#LX[X&C .\cLտ5!!3 ,QĂb‚CΰE¸&E8# }rh1aɡ1k;4K 'G#Z"ʡb^qwHADQ",&_E8'LD>0g $/ +$i>4'^ σ7g"ThNCο" +='yQ)P{4JskCLL^Snz`W9Cq w6 ڷ,˽_zxcN">g1\&дH'rtjMOGj"< +quy܏L%$NBJB1E;\(\X"\oQp5ZņZkUuR'$Eկ(UQ-G?cX/Z({ +{^B_'ylt3 ݔ3@BrRkG=Y#j;Ķa( -rZN_m"E)T-(tǹ\tLF=$v(ls\X,vɔ W&5*ZAm#2 Bޞj.@іmK@ۨ +lk2SO&LgAzb!*!6 EJHRІٳ7c"M M`+CF JZ1(Zh38!@Zth'Op4%m_WIlL)tLgD sWc&9nV6}߸n}5.BDz>yK04s!]ŇW@s.Q_>&||,nȼ1_Mgjfw0Tc>c? G,ăc9s;8_>n\^%[FANnpSIhqM8OB .J wQ9X}c^ 6Od>F/VtVf3wGbCfe7Cd^JNysH Pa!o@BG/ޕР3lmL ;"( eTGxŚ0_ v#!iyB>1I Y'wYT~UnWˉn GI@P 0hIlϽ2IWt&blCh +~7PwDrbOf=~ɴv8GL&2bJ2R =hvH5qm79hr6re3F@u>`iLg bXS`FJV셬{ Y= "IiՖx%#%)_='NRI`"뼵lhК^r,31D8rW :<\H6D6TxEHƞa/@3;vV&"o򀁨BK پ)(,%My2f(QJtc-@`XY\stI԰ᡎ=`^"lsa76o1C2 Ǵ( 3!ץ!NaxI?o>I{PRn-n1!#U9C:ĽXYGVy5l0q ߣW0MΎtW4]o^5KrXas6|%q…)G |g79[t !"8}^Mڵ35EXм^KǼ9&pH>Ƙ( +z@1g \"h aSчde+}**X*j Y4tKuUD>Z T3ב-T9 adF[Xs< S1]~}߀72ݤn#y]BtļT Sdy gg[\CwG~@Cy!~>a1j@m6v69| +9Xtg)QkeWY\f Ut@` +$2Ӎ>ƌK,O%o>VɤD7Rs5;4XZr;ppN|{E_Iu1 b:T;rQV C*'S\bU5TZf0zUz!=| +)^<5Xבt1v3E[".*ݪAx +=C~K|o~ޅ[h ѝi%J(mY'_i xKL4 A \= +KraR&]gz4"0v v2SNl pĈX F -q+CFL 3Ϟ)tIgQ|iodRԀ&4:42HՑTsA=%s!I@pC6^ĕ?|9]kʘ,q̩m 8ԻԶ B;4f7"ְ6 鮻)5KSP)8[ XӫU>#<9v{pw=@fC<,J +[/:#;6`j5|c2x dB +\>ar=l2کY(os\h;Ԙ #d*ۀ3!^M3ÑN\QMcA6S6࣍7ou{H0d77iБydx`QQKm$@_ +Qa\Գ +;Nj7aS}>=tytQPðВx3Ɔq:˳gg>V6U@+,´iQ?G5]M1ۮ]X+V\Wx[CjNrQ5Yx/9_C 쯳~>15fqY& Tg~y6#m.8<*,0cצ<Ae⻦ ad`acB3!H?Ӄg3\*[k]|2CSt*c]8I7 $dc#UKdNU=yU +{X_ޚe v&0p,a^REF (uN`Y74HT7!b&:c^7sRQyíCod%W,M!X1'zF*9 (q/)BK|\-W6v?I&3Pb>& $]zHw>tIl$|@eFP ҈.E6JLK6 .#>?pإ撴TE! wK++Ji,n(1^jJ`G.&.O&E1KN;Cp['&C (Sǟ)< JPRECK +%'tl7u&"RkN=#ઐ/ sS(aеuȺ6A "k{),NmS"t?…1{}V$|>05a{=>+{=P}И|emBP㡆0%3+ ήZ+}oU:*405PwߌGtm۷V'.xzEx;L)wu,S(5@mRQ~XN_OdaBE0EZ +P]9"rNIf&>@(/TdYfD 6 +W7kϷԟˍHx9'JY@šzV?yNetRT^oIanՏ=m_و.#lKl;@oզE\)X X}Cc_+;"҉BcpQX8ƖAcK,@-T#г5 b/l/S=u$,pJOPРQq~ -XM +4JSRXnRlQS1)*Գt$ y޵-Ȍ_SzG,Ne g"C4-Dr6r2K#Ƕ^/FrNxƕ2_ +2GAʖ!׷֔bgA&Ǖj \Bg%vf[ -|X^Hu,3FgZKF[V +xRrt}3~7KP\d9>"ԝd.$=fR\w)fvUԼ#2];0 Ihlw?hѸj`fؠI{E?359IxkuwC˿uG1q(9r L{D`J%J e\AhcW/BEL7ep/ī>ߝiXXR.`&H'<,6aw`=L(jx'OX PK9._Ӥ# 6Exwr׫ #i\|J#ОZFr pq2B'5/g~c,SrەTztDA3~ k.mEk E2\6 -A|I%xl8RȜ!#MXt>M9jVb#UXdC6#@`dvj'uٕCkmc$|} !R#9 S +DMŽEvtP"/9dcjH^n1HS=I K;I_r +;IwR*vGdol0ӞEF &<1&CK8tpO>2?#a6:HA=\l3O0 !g&P|` rS^+N%y2EId( endstream endobj 12 0 obj <>stream +h +5_>qiyYȃi06CaPLwZP[kTS~#a[1#qZYc$jfo/m =:e*Jݰ,y0$dPL0*ҩtu;ywB-W tO+OGHhg7{[;:a}5#K㣫 +u#<82VS,LQ +i}}"Q^1ˆ=wm#'R1Ccr +&mg-Sh!{9qB?T=3%? YWA)O鮩̰vB1^Om@# &<%=ʅd6Cue҄K(ו%3b΀y-T2؅4>EkWw)"Y5TÛ1BF!+c".u=~- i{U~U~u S{,NUM.1 ftiqeN,RlePtpGO'bUK$nK@,ȿxF hcԽs(,͔Dr/웺!+؁OꂑbPSXb7 Z8$.g?ky\V1S2bP8vTz +B7CNNYGsIWGEٕ!gnggn=61oɢQ˗Er}Ֆ + +ͲFdVahEu`5{BMއaQL:iKa +U' '/;jHb ؈/?$P@HqJz" }x8ǐL {qs&KO޾I^і)U%q dA0e6[OPp8G\;C,~rh#>yaR:"g 9r+Qq$16l'gCaP@G mZQ ֍VpX,tQ7na{v$*Fb3p^uP#agv;DaXF'ޱeȃ,46cα= {#Qѭ "L.´2~ز-BZdaOv(`H ") D_"NXq"YGb!aXܫ!HP$"]ь!!]đ ҩ!@bHCPT6 &RC,C|"˔xcUbYcxYBb8W L B8 +1|@<&rBTrLL,3!F?6DM"!j Zg0'0BHubwp8! A\N~& (7H +4HV(nez(Jf=b"y(|tR4 EnLF Ar)R;y 'SHƦU"rZ +$@#*̨HTTX{Tf@خRU! }rXq :8sb?+X+"ێ +QկXd8W!sq6h?F@B~,>Y`4? <-8ZM.ݧ#m0'>ȋaG/*ȍ/Pɾ=${|/^ 2{ցqQ{D/cmBS4׃ #O<,N=`"lb\͊'/FH1 =qp&,_"Xyɨ0 @2<.p ŧx423d^ՌLoFi慨3N>3ÀFLЀ9xAwr4?)iv\ȶ:l혁qh*2;,R0m5X#LᎮqz(6rZccVfȣ #emlS6QǫoqLG ЍhD:xM xaE 7@{Ŀ|vS ns24Gq9LYq$AQ`v cWmxrM91#o̢mJ̴8(9pA{XtD8Ħt\i;Qhh^Ծ8>lu<h d8C1Mtx'áQB;N(!8T7i dK;Ñ$,!"ٱ5E9@)w~;2̭c,ǰTX::mjƋձα|c7Fe17xc\uo7u#dAD7:JXQ ܘu\܆Xi)v^mLƈȷ0*ǽܯQ?bl$`m>'.Wc#5یk,()5hc󫁡AjL=;vG5 ?ЎH CԘOÃi 6!r4SJ#A҈?hxc8qv \<Úmg0Xb5Zh39p8f|n' ގi #d+3_0ÖX2YyenA 1ܡ2R'CUaHw8J5y#Üw !cã o1"o#b0Qvxpqpj@HvAPwsDغIN +ÃxD*1 =n5Ɓ* IY&0bMӈ[cz\4bIIk#z9 `5 *Y +!hah{|F~=> ƍ+2E0^'<X`<?{3꣌_`}@?m{agGH.."=H #wq@ Q\.1uagYPtao 9N˅M.nR:X9.1շ0 PI-d}[Bk $q@gB" +>f!QtU1i!³4CE7Ķi97 +cáh.\{>-DzGaY`H0<_ȚXlEx88E + ťmx, KWگ"9E)L[dKPw^_\%#3fHxF ۈVrhEbYcB#WR*b#;*~:!G*1Ň\sOUR*\TX.7E,T,# +\>"Sh=Rjaj +}A)NKsR§Rv `GK +jb)V##(8|Q(#Dq# D˵CI2B!]G.#Y`ŊqA(_EᆖbO~̑#{{d'2GPy|s'\Ý8׉%N +XEA,9RrB uNބ q`A#kHAuL t&^I3DIdbHńQ$Y:IPD{%y /!c,pH%d%鮬2%XRRq?%wm/J_TYRl׿%#*]B$%MªR X&1Z}DX=%]t$LHb&E[gR<$ H4`ߜztwDX5!GlGoR0x爏'8GԮ,E-gIh60 D4bzw @Fta+O_dE8'0> dӊpZ? : @PFD&BKp|#\ ⛡uCTYoϻvbltË!hQj;C(ys1De  + aX2O!<) )<%X:.E&!t {;Mi)KaVD-%6=hR.LK!⁝yXA.2<rŠ)cxPmҖr;;uRbC:(v֟Btu+@@F) {>È9lc0"+ rrPRȊ()m f`R`ӑi7)VRJ]{[ +>t SHKMܔS)z+7P[Td30AZXh*]z*!?ڨb Opx2`8k)%bUP\U2Q8U+'XD+nZEV26 $Оp@ܡUY3Ж\pX*Z09QCL*r CO\+i4eh@ 1d8Bӓb#XFi_MS.4z ($䯌n4*Ti\"hjRGQ3ۿx!B> هB'^}# !j0 +_!lv5!l_5oI5j 5Y!2R}A 6qpMX/+>6!vM?xr6 }6SèF>~mn܆o=`6H fy`8n^w`nM7<$8VA8G8bqI.@C=rzL[|V9_н^4x7lF89Z sWNL){HV:~I FH?VG:ôN:ba`"aY;`Xv0 P;;vn`6r (aWOwQ{yWe;]^w`<=raӿxqd҂n<gv~<'Y4\ҊĂ#-+cbWm6<YA \zވ䑣Ѓe?VP!]G_M"(؝-6 +ӃU +R\ +kW 39H*O* D}RY )@ؠ+im]3%iKO9ӤN/~2@EaT+xfI IϤ`5{KIkAk6_k& +bIA$`Vh6ْlDI:Ҧ [RP@FʕDPrLx1DQ6T[ 2>$%F2ЉQV)؉ӻPOa[& +2mex+D7֢PqhjdZf|$Da@jtg.#vǤ +ԒIPLIn{ x;͓Ǻ=CEh;~7J]q0JTJ<*NRa&ޒ Xw*`׮e R HAb ƅʥ\KS ~9iӑT.IXM@t5j'NS }1~tF,ف1OSY۔C@%-xÁ]Vh`I@\ J݀Jjm$FgɰfTllwL_Y6%+g} S .kBM>4"X[Go@DCi 0$%Q Ӓ|fh2TYyO.Z+݀s<&:q@bw9P<1"x,x,5([ 涔:ɤ `P'0[( G=XAI0W +לb/ ~R.8YZ!& Pߐei+`Y* T*CTy?ɛ|F<MqyM[=I*K +Лalt + `r:D\ P5!P0\X`KM+涢2K8dI= xaޛI4tM6A{-p?xziܬzE+FvcHh*~n#%㌫g=ᡊ(ry)MQ&osk`7盿P7LqY2U@DOdVm^)?2W +ue#^d8@q~A A@JB/&00>Z 7<H@ ly1f@Ц|mkEȂx!ݙJm4*WUbcX0),bW,zZXs0ksn^gܬ'KvzhꟉ-}l^-e!_'O/ (R=sS;GX'rKd7Q$Ch+Zj3m¿cX[5/̨P-F% iߔe?IhOr6Y)?PrV#ѦN>9:K852H]o\IIJ丏VPwkGޚ)ꭩ[^6obx[K'7$p?g5SPtBQs.HIq|6Az,Hek_bW_l")~Wgl_ke]Ne/'ZWK1s.'"nG/î+Bț@?tG?ڨ5;Q$A[=Ul2 [tT5_뇊IL_+J$\5-﷪ P_OٮHlwbd?g?PGd- +r1dAK"`\Cp$xo%O/,{E~Hjg +'#xF>{chXYX;GpbEdRId9#Ŭ @g;W*q銢>}7>#@j=}+˟kg_+NghJ^ҏ;> +|O07H`'80FPa; +6*`_r8סl}LĝHu~J)I-FH?*$f9"\"!4xQSt-+&I"@Z6So.1nMި(Qk(LMŒ(Ao&(A<3 [5=h3jJd=`i(fXcܵu:R30c0h4~d cHIP|?GmwqEvY5ʻ]r N|+ oe)ah?=c4X;Bd=_K?~d}'.Q*zUգaԽGC/ӧEaxx`~Jkg"R4 R4ȿKKŧ!ORߌ+r̊WZb$^MNTi>|lYR4- +`m)sa~?ApgAQg|)m*nQ%O8> )2T\Q)ɴ|(W2kXf~*rAVA7hhm_CIɫvһnZV5[ vڷx<5[Vvír(s1bj*DigDCٝx<^˚«t;SM +Rafx_ŗۭwrLPPz ev;܉n3z<ӝv glMrݎNx:rz=ov<τrDt(ۡ\0x;ق 7.;Np +Juw3n9ζr<nPݼ-x\ӡx.wxATf$I:I49DX )2Rf"gq7 +RIR\WU䝁3IL| Ke7T.ToHjKc4o>~>QĽ>-4im+1X0do3Kae д쿙f:Ȟ=d,wzY:`|,bˊ[>l,s/Дt_?}j:cgH#/.򏢮8rZQMw 31k7Lhc@Rc1esQPaZMMTdiOMZy p$4*a./9_fةvif$; <B["EH|{Ȉwvig;P v*l8=q/i'!I^NwU I[/x!$$ ¦Kpak&l~ tbR%t9|~]S2 1P,cbk#$m}ao!_B;?fS.3 +3p+䭭&?9,OE<4ڴ;Ѐ[@2$0z}s#H(vψ]EE*ؑ뇉=clӷKrRp@@iVy3TU`g]ޥ]z蟁zOMz6遮d_]遥J)bj [d_mMXǻeFr , QogW"򖒱n)YN!uF]e*}Amb%G[d!HN(QH>B!w*n<ȑoXOt79L 4,{(__'ȉr9Tybaō~gLLiBWCO{7Ka8OdG? z/ӊ6F[!lY=Azܿc(mHS[~c%*r<E~j&/ 쮯D7oDӎ}#Dډ 6Ė%gC^ŸpMifLpUsc;Uh=;8de6+URU,vu/\]|-6>I]SF"h`j_ihTWz&tiO>.]&<9a4ykL{LGYZݪiڬ,~!0-r;yjWؤ1R"'/@{AŸOp=:oEL9%H###RtDu; |/zz7Hg@خC!;o؍YL NE(vϵc8}ӈ~&t1hzGNw>c+F9v 9?b+LM^.%+r׋ +ƞ䄇Iz +=!oy[cgEA\C-nπco/X;K1BPBA PizЁL2F$IRRc]hXtaz^\wCWQ7lme~ؿ@Rc;޾ -Lv  ݏm~#MڷFLӷx[CC3~JDi!_$E2hzB&1 +@(u5Iԉ$Ze,Ǭ FsF>M]S,6i!)i̜ ڥǧ=jAQ0dzu(Wkv+f|_=G^t0 I^eB/W89AIv5,Qycʅ3 EW߹.T ]CV>1c8m]eH1A[ՠE!|<g f n]wIIszrj7d7-u+ߥN1c@oĆL DӘ:d3hC!h@KbWq#V1}5V9ߪE6r6y^oK;sXcGɹ-qX٠AηjpלEl3S +t$ U4WVd4=[Hw׶Ϟm'N]cGsÕ «%v-v$:E 7;LT8EʷSImQME*7谣D D.NC5-LO~ +T$4UF5KQE~ΫTAbrܵw\%roK;.[5y%8\[+z'4%S`,{AkS0[vUW>=4-=OqHv~#fݨA YN α!6hN!lc u`Yw [GuPUwNP"" u&^{Nξ2WyBv +pEpi$ =-cˊ@>YdF}b}#7> ah!!{LշɌA?k.{lL$4WמEg9~#4)_#OAJrߨn3")2&,# +9 9$מ@V='gAȔmF+EGx +)=(M9Oa ag&H`Q(yK 7[ؚ~QNSk!? _eI(! ?z|rvS})ۣi^-LOu]wD)]d59qaeI]Ci& [ti}OI]Y{JWu|t)DC +OC] )ɺ~|EY5J7*ϒAhTE}%ɸ?’wqzL~7j\ cnAVGɗXIy{LPߓ$W@F!"T 8ZI&qFDDE!ݞŽ%zJRf7;nҟ(,c h]f(#OS*IMSkOuGKyfO&Wͮn*e!:aH=.r6oN";K[jw K#a~Õ,KϮJXkz` ^Cozl;TY=XQ9I 31 V> %Cj\M{mv 0 EHyb&!sȷk-%8`GD LLU !la}Κ*\YPkn#J Z :]COC|ivqVc灗+~Do^=.HI{cfD(x`A,(ҢW.kI!4QiV'PX.OS~2c~2cO˘Jð02ydmUw3VFf*U͎R%!=FƉ" *Y2h7ی7oFEYA|1 14Am2v^QEz]#] |l?dUU+a8x[fji1g +~u[F򚳈ܺ#%mm۔G/CeIw }s BG7YϊA,sFƟ=1KՠlЌze2PԺE<;$l}#~/TSv̸sԤ).{䵦Оd^I+ Exj <%&]9]ۿ"]be5(Qb]~v !4=NnT{O7W?"[ 9K-ZO͟UnUcRAt];uAχ}&5h0`&>lNBق~\p%K+FQ'NP/h1 mcٯ5S$H6VZ- =JWyaf'8񖥨G}Ί켤}eiy`fJ.i?2oEqȸpۨA,a(~itHOkq°%3GD} +HЃ,kV8Z\@%.(n +^̠'8ԆIGTS'3d*?|lO /jȒw|}o$; 3k[plB~<%9v WAǸpYkZ3Ǟ-斧? +qңYiZ|^ΐ8hFXPr3d*yz3c;~2:3VՏ3"ssz05oCN YsMc.㩟&h '4*TQ0 rcI~ ޾iĐ$qچesYOA2zg_,灗j˒Lcɴ-;Dhu [HC߀."y`g/$T-z/-2  43EUɕ-YQvc|OLthH_fu8A='HE?Kզ;!xJfaIӒDsN(pӒ9[ZÕ/nY~/ooQB +~aq{޽'¤k|tm7&|1%: _B2\SȎb%nܵc0S~,\gcС܂- _j `CzÆ3< A c8'TÒlAJ7[њQ[(i.-@ߠ: V^ +NKf`eTu1fg@Et!9T۟ ѷG`^Q*9SD\]m,R  *# \\M?U?mFX!)p_B!ȳcECuI:E))L+J@ALw8la|%R',L~ҴEJJXቆ,"*C[(9u8ZI,o#(iCЂ\"\Oes´Y>=~ H qa '@lxglROu9ڨC .*t7n 'd}{2<=qytN̫RoTQϼkn9)ՈPD|myb,N^>s_y٣6fcgp\'W߰8dkY>/0[٧ oꎉC9F'w'6NҾ,#C7|q ڟQOvEdzHM}7iJ} |ZAWy|4rʹM w1?ju)Qsl;> fһ/7haKq%A2O/W'ףq*J؍rFd:c.;[;oZ {Hb F&IR&0-k\[8}{ #Ԫrg"ަ~ ;kIVff" +XG"~QaaJ> +-܄]᫄WB +;r@CBבu?ĘpMA##5LxlAԛHP0 `)`"`cC XhQ=EL&\I/iRnJuGZg## hjѱ.1R贻 Ɣ3!#X13nSFZ'h'_6a5){ +? +w1{Zw1`w)Ξ A$Zc쎩us{Τ> n. wص[L+pWxR*[/(Vˌl][KE:-,Q. TDzJA>B!'˔4>Aw+y ]aiwIڔn듐pՄ&xRA SjAlp%34} +#CmP|]NJE#P@CM~_*m*Pѧe'ptS/ʷ(.hLyF?>T5 TmH!y  5)ȝdVJ䗠be[:N$d5aѧ]i|ZE *__ҦXDA}Nρ._<|iU"VCM]} ZD$#TA84|E׆"ܪeNlwIoaz7)| *Ȧ5_ܨ^5FP4攟(찾X5x [$sO"+D.MJKm{=vYE|~K3M3e +l=IYM;kW=8I=fWa? 9;X XtKjGU}* #0,Jw]Ęv +Y&yNzLr| [$8,DVBl"0**7{N =!D))`I!|! 6ij kHkS *][v#ڮ<y +\EBI'4F*2[cQIv$\'%|tf$;trUy9h5?*WaC +WG:&$U [MƚHSH _Jc!5⽭p0S^ 7I_j(MCM,rlNP~Ґ@χ`EWj2@ìY/b !juS̘vVy :/bӑ ZE_C֚c%0 * XBC +MH:7¹Dwi9fAff&\8&n~_W%"p [+(n{Y 5F=J !ؤ,h ( `Wbo䱼7GQ)&`hGo Rd`WlkSIU`ۄ]7UH ne1c 0_ׯ~fP:э#u< +)@& Ac8~z h7d2(RW#I!N__PN1nOI}S'`rSl(r6%y^]HOVU7eἭXSav+d$"M"cAMYlbtzIm\I}\3eB,#7~~Y|SEQN|(V ZA3fK6eڞ[ͺOEBRETVԤ +` tjël94 c;(nq= >./(>4D +NqݝO; q6 -g\MvTs|2duDZ f@=Fyh~T˴Sg(̳cؽUTH52je H12_e˕Uwv %'̹k<P7\stW6mx L3)a{'m[=|'R/ϱdW5n>e1iv04lT!JIV˩)GwȳjLA Mm)n>GYu4z6fS9*Ԉ]ܻsϼgsWz\ԝJ.s#8[)tO]?['x#CiOzgK-ؓHC",ăTAހt_+!Hy,I6qOU0'A.|CRNϒm" +L䗗!(X#r[,f7u +UvG*a>nk`z):t?c95qS%ԇv u"{;iwXI1*C1*.)/rN}{ʷ)鼏yO:J.s*zВVˠ$/}To\5,_Up 2`va -Xe}Lf߸4c w +=- +Wm}9oU:? $-80y[ؖ))h1 DoM<&q6ed3a^'%Du`3l`WL/=I.3mpjE\1 ǎT */"v i${G@0)*^g<\EGIe)7pO#vvwMBbAT nwPt_K+|Xvk:,͊9ػ~uYx +-K>'6܁G:GR]Μ\Ět +\E_$?alߨ?EG~BˏNZT@70lgP$T /[Ș A9 /Jw )wAcAA'\} C 3gQ1Ű#uӚ1=ȤhUr+_{Ljr&1wR^l&qY|×_Шps0 +,N_z͢{ ,EO1sZV +Di$0lWbP8Q/eX%M< aض)vzPpSZT͂K1qs3|ȬF,R ?ag\F\N4j1!#b Iq[&E61K%ĽrnGed0]7rWIĪʸDOr .׼Nļ#v65O`WHpLEF=^WKJ+"^) 6'Z Ф8y"Hy1]6/|2lF$[^S}Ji@ޚ^,U:=ȕ68!C,pFQxp;XYrПEiEZ{2{b%aG#غuR'~*(H +hBX81A] caC,sع{*p2y=.1PjX]:2ym$NSg+0tr<]2sPաU{UUq"[@c=ۅp%TV~U"*S.!˫ +%I"ee!0J.NdI.@}G34xuc#MGˠwN00%PXG;CX29BHzecyϻF\c%'BӃydg<\8rTF)u,,MD}Ԟ)5K@A/i葠Og*pK)Ļ{'# N[z9)Иo˫:f2q63fK{,Df38juJ*fllq +ϲIUO +tܧ5mGƍ_oD,z[?*s3ߚI5Jo9"Gcç R`Uy""D脨(QDD>Rhp! +K. DljH͸·+k3.,`f4M-k=3N^V2VɤV򣗋Դy7rz9]SY!x4mF }m1:Q]]N`Z%B=#ĿR`VI$%їRD0DB%*!@TBTCBCBQ % l][g,Eq\E=Qd_iZMV9TB)vq׺Ne(*DWXr+W9$I_4r(Յ>u]+,[wL˅d#Fh:CZ&$FEF̉h-TDm<#&JCF Q&Ts0Vi)?&~tm`1jɯZ򰨲h\=aOg7L% +ޫ'l`2h! 1+oP{hrRs<]Oe%AmӠ۶I0XM22΅,<9qO@J;єğ<;ܣ5+iNn[a֩{8Ÿ%?FЇ5X b|B$=D' isl#Yɴ̡*2$~DJ 'I"|KeRhFG1ȫ103. U~dE%A$m\3'oMe$DX}KvuJb\GOUcՉP߱@摦"̕@OOGϧHڲfǩӅ;d5fɝЛh͚wiplx.}Ach$\IJ)noEiޯ}o:ZmKL2 7LI4(ZTX_mV^gu)TK$h5DҚB[lڧKil[4c!K1UcF)x]6nő)-f)MJ ҧ%wZĂȤ`YW׫*1V9'MIWaļWXާB/UvY)Zu R+y䨨 "CK5:Nʖk4Yp'r'{ߥB-RbV 16Q.Mjt2AWO_ײKL)ovahBa+t;[Xtm!gosG;Y{4"Fr"w\Q PVAJ"s/ԉȁ;O%.-88jiR$d\[hsW$@]'ʞiP !F :b1FuúMe&1aqk5Ed*آ1 6qNue2xy7̝341*I0G`gus2,O<^}C$IeܬrvN,|'Mc!;KL8a}5>yZ3pzֱza=oj<ރUQ]ן +z ꭁNG\ʕ=a>Cio˃sVvVׁlQ$;)e >gAEQUe=r[|·y'裲@@狰qyrZ_=L.ng)$|-sٓRnix7)g7w*H䒴[b51-kGS"z&3d_e`qz92o4e!m0W%__:4}gyVl^=+8/21}S҂Iiwg܍׉nsֽۜu9=g̓/5$7 $)x=p6HxP̄jR$yoq>6Ki[j|D!ngS>6? ט,&G ٕ*֕E9!^;x חz .WgO7<0r}<||L˻XVG%C7)sHu߁  1\rK)ߟ!}|x_ y gal=?KƈTv zf wg7_O0g}2t-uXW ċgKA‟bxanIYnmi.= Wo1@) +=ݷtnm.ْ=k㎷ xIE*'~/Rh!uD6)zBW.Np}e_>fWVh>m^a-//;3C͂ +Y |# Q(jwB7Rޥܽ4m7}GyC^&mN=JA:L!o<<k[/2|)ߑT丮2#H1x&y|ͻ<ΊӰ|y]n>^GXSz4@dܑG8i|P| cY.5C!(lu^jh۾R%H++ YYH/> "V# UCQ3vJ2ZKo(Gie6`PsΣ^S,lW>Eq- aI}QAz/N+H:P>#}R1#uN,>>8PA`xjkbaczQVz aM_=s>ÒbFUa~;Ut"25uAyGnGnGO](Gjۈ(i xCrAt.Y/=>XlpNSTeQW>`{l9u.d AҨ㶌jt~ZlkYIJBX MrO{]LMbs3 ~_2i31zAnP^1QCB[qE,8"^*4\GUWO՛ttU3OW ^nf( ~CWGk@f&&}OCeA7=BPaHFrܥs`A@d8#r}l6[YKgr-t3<!Lź3 a#W؋t9B8tm񷟆=EȖ@/xOV N8fw[T$=V~'||~z|ު:!:0 +f>ǚy!o'sku"=(]CO%uCו;GBd`_% o$]Os˧˸1Bjӣ8S<[s}#.O{:ޣ/;/!\u|yU*gtD6YiR8$Đ$mL8;2~kFH^#4 =Ս|Z2#7ޚޏޣ_g}D`ۚtx~FftH&F2=O}g?8EXo!a>; u\$8As9_ElМ E;6lF8;2d{A0qvd +M'&_ |V|;sb+ < G/᠌\x>*N2_y%Yufi>u'jѾ1r.$!u8O 4Ku5eb^ +f]skgXn +ϋu^DaJٞ~{]A>?O;gy#XmZ9BYsykulRV,!Ӥd!"nHb(DOB;7&z2N\1Ȼ/OFNSK9|d +ނSѫM)H+XYcՎpx^3Ҍ#O |ӼoYy뙔QZB֫lahTU>لS.3Rh'yiB/H!D $rIްdKjo;E=_.z%*PiMHN8>=֝ayy&~EwUlBw5w&c :\ld eLt< gE5ys(+'ʔ XLH_mT۫d9f.c KSNxB}GXXmI8RCלv, 8J0(gƾ0Yʈ^LU_X<x$KBYK56A2.yk;eWZ," Z_L~1Ʈ%p?S%=TO]oؕko0Úyo樐;)a`Q9WTJq~`,FyVP#aM%#1c| + ?O^orufB|e K25 \" R kKQ41TgXjøpdCwnު2(e +VZoСu'e\ƱkNLÒZID21eD!$:qQ2AJ1RqpVꈶ0FS#]Ud002`9G 0T'z&]#Fxfom@e}soqPrUF93?v:ݘD b=.Dۋ=_`k +T˖^jr^惮61]bsIѶ(iřs znS#'&r3MmɈv<市HvI(F0AQ5 OUYҰ\w"f3I5KhS$+d ^tVJح:f7w#eoBLʖaYע>-uJ6:o3} Ѓ\Piảlà(2a6b\q/ +Cs8hU$Wa]>-쫠pk^~Y$QDETQk>M~@UM%duJ񄬢xzs17`KP}몏z2 J7B_[PĪ#^ 9Q}@%N/nJT5w +dVtJ=QQˡjg,\󛁽+p c(AT4JMLgqό5ʢ7By- m,H[?5;}r)e%ۧp xFAi`L@8\w*ܥ>c9h؃+[-=OL^t%8/֩"ï_^+R C@ z*㴎S5!qrH4(q[ {5͢:2SdL CwҲ9*PrRIXBAnJr[G5;EȾnb*CXPGs~˔O!wcpӃ& +TF϶C)^rXsSsJoRI5"=Pw۠@M9l{(OÒ4JRe ++'K*=R uzSaWOFaj}hNWp=(7TR[B]Vu9= 2ӏ 3x ^IVshJN2Zk8KIzex :I uKey A4Ck +d%mh}+~v콰ƵbH?XVG1qWاU֣moiOwk = +47z(Y[7BHiF2?J!^cp#T1eF%Z +J$lU3qVi 4";D]Dk}FӼ@^gA14Ï%i(-`̴#y(1MK6Vř?4: j.0mQYL{Kga2oY}͸V&ua?}NR]L \qa112lq|q1UTuQV>+ v0a:(7aT뛃qzE >ұWI1'.AbVXј cT|g}TC.FHY"wr< gm_]ZE>uҢ 4@xdDM2 +Ú%zù%.B_zKV6Fv۲`6[~yVօx˺eCj+@M®$7N F׊ʢs;#xjW`X0U]$wUiI0".!:hCRhͥ8_Sf>"ipEr #-GmtaoNfB֎[W75wyyjI U}LGY ߷?0FKa3LX"zf2Rh2A\7ƪ1r7Ч= : #SnJU6ѵ2fo%g}j~DHӾ3X,4{*lw;"WqtndGZ%(qN2Y,)'|vTRb/{،bӿ>\fW i♽ f kb!D1͞1Ä3vN!D);2>@dxKhv:MwFL _2R  q"i5?HNN͵H SQbqw&*4F.qB}A4C ,GI$bsB1 +5{m}6To\NavXM  L zf#0&z4jW\bZ֊ݬBz0#%jɐo\-EGt~f~-E=eWt(&KIzm} ltT#H}6hXQԲ:+~7_b]. h ~ӫr`(DEoH Io6󵱞TJv?VCm]")AA$)L)%)m""AXK]5uY<P^KHn( F3J"q:w +pp' x Y~B_|0f }(T/EєYHIJ"$%3|Sx +'1 Km 0TvTdRVd6zk1\,aZƲh {X)0#.; ڂd#R?6!X|D$f +ta`'&($&`q-hɼ⼐vUTp*= `+P 5{ ~q)}G!#bw:p} q7);t [@('X8oqoFPۺlh-ׇc6_ a]]C4k3,OP'!Xز̒uu]İv6A3࡝ 0X5$zj[J^W@1%:n 69n_I˲h}=zPlzbcnҀ39pB%^p^)?ND-(!3̶RP=4EH,!RN栀ujs!h~ ;[.Skn61Z2ڦ/͎{VɒT W`'`&lGs^.W+h +[`qd.kWWl*ꖕ| 1~"TAg|%6 '^őJY(RI!heYжh{qcK-^ ZaKl\sO;j=^E~Bi _ԫHOcfQ| UļZھ>֩c66{ց 6 +=УniaZGxWE3R?.1yE%S>W0ugPRԲ;︊f_؉Bzީ9IILة}\_)X$'qT!q~L=D<( <"D.> '>N"̰m&6d 6隼6CW]% %0<$~^ 4r`Cyxׯ +-3zi\)d8mfH'Y9$Ghr(ezI8)$tR)$7Cp@RF210*HԹWUvāE|6Nh>Aq>QđG0+g\X6]YSuݾE9d?v˾oa +Rz騩^9DDJ b80n^1Rx34O瑐8PS<r @&,n u3!/d)|V!X*Bfpc/MɌ~ND53~i +&(]D&')N'' 4g +2)qюB1xgZ cW*]UƋ932]ɺA /26j9G@Aގ3#MX9n~GQqŹ?u +c?i)9 t r +ytڷ)J+4qպ˶g7}m4+h},lDZV +JPZZYt/'@r9~!/ ,eS(g|sAV%@T+!l™ iy%qOքG}G/6]cԳ^bR=0F1>d+NvK* _X-\nF. vS~  ̖p~ _ldY,C-j^2ˎa_*)EL-S%LbC2R*,_ZO>f̄aH43Vfc';uR:\(е젟63}>DQDZ[G^2Jw!flHHG7 +5SXqK(8?Bova]f\2aOHDRK*)}JOJ)k/<9~o5KٖLעGEX$6ҏFaF A6 gv 4?&뾆!) s8g}!͔/0rct eZg9-:ZYE-:ۚ4`QQ0ܳrK0Z1i:ϋ\GגKj'e<#ɔy}DGctڂ5\gG:2PlHK eh}C`R9_=ѬKHz>{R)$h ~:=jiC;" +^O>Bd)tszO8[ra5}jKa!pA@z r̳m 4~㦓ȸG yhϿ_u[ +5.fWp|YhV +gSE|WVŭ [xM!U(T]Y¢qk91,yE+ ZJu:=RE((8v{TL-"m/6ؒMc!z$76"ɥjBWR!92]grTȁ@"%tU*m}0sfUcdYlLO0%4}i%mô +VT/r_%u,f]'0yŹU:TcMy-\0pftYּ"%ܩq'3~Ղ>gh? +*evf0L'I_|M_V|1F1?ǹIJ挔q&t/Waʪe &0?u4<-6lN[k1m,g[MV6z!{[6xל6aa7 +@/$Opi9ѱ 056{a%B/mc\U;pu`%sш5cWH\+JŲejʗ\%YX)DH2m9}76taa6|Z,­C# Î+,cbsZ]V11,Y̴|_+av}NV*[26F>reΞ $eďF#Vtj.̝vI cWȰ8,uHů*Hv6 +ea4 ( 8m<(3}e U%?NGo(>3_3R'_%t$k }/}dP2}2l'i}{y}.a& IoA0IBz 2c_侸ө$¦#nk K; ;›l:ƭ@ߤAlwr\ݲ$1XV&tozBY.F;g:MhƯK`H٨'3QtQ|nYV6Lctd[%̢x A6{oVC.>\-=Y̴vƅi7+e_nYYڸbްIyJMϙXS:es( Ht\fNgi: ZV}? +zpnӓJo"XWܝ@N!~~ v< +ySذRw\_9n%s~Ho@@O 9O='NĐ\td?!SG,"XR55%MSW+ꖏgh96G,(SH&^"Yذf5z԰0|btk xLY͒[\''&4ʼۅ ̷uq ^725t[@w@"H"_drr2ŬD2oJ^uO-IiȊI&8 ۍ㷅q3uװ6l~w ,^ȵJ#XPv \ p7_ZMF]G1t"nqN=W̲2K }q +w]JlV(=0/U4w-Xȶvl@ =# +SH?qCo>^(8w?1**y"OBytN"waU~5ƫ2}hMZq|r,&4l/" qFU@p٭pTQ, 4jqg`c0#zȺ#IJѴP6[Y[Zp";I@٥ UBv|Mb?"%)X+?]0F *8zSJC%4r zOpxM['HMJ,}"p¦#*% (9wSnKܗS-t< +] @wt Wik&q ޚ;)'0)#w3tWȲ^pK[M5Id́ M~?GނՃ$7!?I5>zƫ[Ҽ8̻ .h?Z%˰U +[ֶ8-MA.[!.S;m~hpdK+gYXB޴A ,RW/z~pښ)dy fK3:W [>4۟3Sf޲,HbѶڔ Ohi =A1{p u9[DFid}ďZ?3">鏐(>; Vk'Zt<բ-i:1rI{Ƭ.EO:@U@A\}w +庂VI kμƖR C3mi\m۶6˓.*8n2?lpB3 +Hj8HRNJ%p=2 >+qry_ą2Y_-ćoPo3EQʢG" +8ОAcr) +!3Ș3m'q ' +!~tvR%͗uC8H3{vja uYD+jJoV(6`__&mY4&&GsޤI=tri$N|M44T$+'@9xlX=̙Ѥ=*%=dRr`H;`btEKV## 'yFo2A"՗]6K&YOszMZyǯź,.Dh 4Xv5lКf \d8F~՗\4+p\Z(aP}Yau͚Tִ[>Q?Yl>ʒ`)7+GPR\jRY)g.&K'93p]QXBe6т_̖tswun_V"ZQ8!-JŁ`dy6 :b4o4pJTca~8U´6 y~ +s?)aSe)UUʓN U,:TL#J%hߡ#710aa& @f<ȓ=!:`uΛ/.,(>LL#)&3jfbyn3~v4aHyiDDrV9FmQVI(Lȉ} _a 8p1)=5 ϬeTkۀB6c'6}A@Ueݯ3*Bq('9igО6OqV *ttNL203ey0=K'J09lE?ZY,a*N]z#Z΁p ^;;W563Rխ?3!@[rqw֏qVs?4E%؍q>,GaP ww(8yIZzx oQ6ZWĴh']^lWשLmzdbiEnS"wxq(ׁX7`û׺0֯^vjnx`E^S4Tt5}:_v!@NuY 7 8=~ьmrfhVscL7Be/a8YÏ0M×3_0aEK?7ߕ#.׭\fn񔰪mtIV#*NhrKd[p0"bݠ&0D/ Zuڳ>.Y#*P %faJ$M*OiGA\0 {>pxyYGQԫ7mF'@qњ5ETSU%5Ymؙ7؍zdR 66nZ}ٞz7ϗP@^QNㄣʕ +j`JE>hXFظ Z#G^  #u@IGY}5g7~9nֿswu@ll{V|W"j(_UiFM0YD*KfJOu<9Eư "~[k/ԇkbj<(I%J\yGdlyMXI~9%׼A=vI[-IT( +"&EPLCO9e]KsɕR.J!qu6KXУmyFYVX>{Y6( m'=RIVH,XQ:q9&7_2& Vb' #'%2x ֗IVlʉFҪ%hѭ#{z'[ Y9zh0)7Rt +7$p3_rZ۴A6}WPӊ+N'+ތm]Mxi.Cڞ:> + +ũDRzg0X+0̟PUUeڂS RGU_g m$#Aُ9qS'zh) G=Ҏn v]Q _$F0|MjY%Zmn&D2jGzrEOh'fjkFM}n3Z=#=weB H-7xUmq' L'rգMC%SӰS2IRUA1i`G1gKor&R6Ѱyehpi85F1 o#wҚK |xΓW8j5gƏ߸Q;@;Y[T'2v 5 j=_Y\}%aмzw_<{^9t@..Z@xQeE3y V䰦Q wŐ@A"gLuI4zd KX{~"|)R9[D܋fWz p'(6E{5QZ?kj +6UwAiAxaBDžΎ1%2/3 $Ç:3v 40Ls <ˁ]Pp|Ҏ%ED0*:(Pm.7?Ic> U;G<2 L;ԙq7{8'i#;~.fZŚ!}>hD3MXhf$3hO!m9̼2i0'M cFI!dǷ6 I֋b 9අ_(ǗƠKrl0W0݂p@ضX3z&,=z@aȺZ[7(_40z"hGp8qc1hKuYZig 3̶I&ocΌ' +TI7hPWYGQ[%,PfL$XI +z(72X:ٚobHP[EUǙvjтyl.m##5uYHL'z<-שE/RJԪQv|O^Wib@ˑ$|Bk3oS3'F71 7bwD +yĊ/ŠlBjowƑcl7v]#=^];mW'6䒮:y҄}/ǜlw֚6֍X𼁂B;#w:2q5d>TCl`7;+4a܌@ 9I6Nˏ⪏.fl{ t sF6߱zm'gԘǹhmۋfloޢ1j_~0Tʍfl{RgbZe'aʼM(aS;[gǏ  :>ȏ%]ȸ\- {MM_Y4xtGK +2*{HQOP3uIB{HzG?7|6 /vr{gW ?q~_o?됍o_H@XI?E|ih8t뵐=lsY?wŅҭxMsNVk۞ޞ.+-Kp}G2iK}yNzΒ_#zPY FϪw +:3W=f+0_>*H.ot`~7s_=oTcFd7WOTq'?k +ΪhOt\ʢ+ܛZ~ {pB~83O3-R9?+QOh9 hOv7I> $r6mݒU[Ã7=eNj`gŊ4ST֣vž{ >|oЛlh_~V.$gUdNJ~^9'o?fv!^F39xX L1lZ;2j]Xե/\1b7(g i =H ;hqlۨ*LF陧1% p@`` ;G濘 ש"k?!ï9oF*^ 1aiumfzE:ld W}ĭ w+ositin(SourceGraphicinoperatoinobject0%xid)AI__1idh10yww/Def ;4alNois4GaussianBlu1bstdDevifeOffsedddoSpecularLightfePointLz(-2000z-5xy1ysConstant(Expone1urfacetyll-color:whspecOuk3k3kk1litPaik4arithmet2kkMergNod2BevelShadow4y4Morphologyradiu1.(dilabnby-bnd5bn0DisplacementMapxChannelSelecRy(Ays3b3atri1mb34animaddit(refromcalcM(linearestaralwaybeg0sNd5totofillfreezaccumunonb58cccc8cccc1ccccccn-5CoolB4-1D_663erErod6477(spli1 1;20 15;200 200; 15 20;1 1 RpeatD(indefin1removc50 5PixelPlay;20 20;Diffuseyellow;green;blue;indigo;violet;red;oran5Diazimu8elev6d1nl5re010122xred688-1213y40.0.nSta45d4ofeFloofloodblack; opacity:dnsCd350110Grayx-OCompBlurTO1nentTransfFunctabV2FuncG.7 0B1XferFire]cL!"IRH 8VNF:A8$1( @A`0P ³ku +Ĥpj-l4qPaIݮP9%m58 vr\EzQ|,rǰ+!Cj^x +K~8%U%y%qoj2"B^ʾGY +0OZ"K7nR*lU߯)Kpa і.:큵GhQ [IrDŵ!E9 +B0<kUٵ@UaJK+8x28N}Ur/-D;BM-b iJ*CZ 0Y7RQ,d!I239)b*1F`Pa˯ +*.ʟ,eZ0 + =7TRoIL'rWP/~ ` NmYUI|ckNQ}V )9~ʲ V  9B(d\UzP4I%U8B9H01BٺňVGLYBZL5C)Q]AdTĠوN-zQ8e08ҠshR!-6+V̲f.@q@b ]J~.G/qA@1hM$nm 6s Y *=3C@>2Xhb2Nampa:QrebDV5Mr&(#L fg2Hsw ,I'l\5e" ߘ8fu` +UhkZDA|ӁöC#aEf8/E羔H%,l[!t yTpT>wH[1cVmq1og'xp$JJ#kڀM(48P0OL&Ĕߝ$f1kH ;e$F>eH0T6p5ˇZˑw*VB_dos- ()"Up<!Lԋg2d2uqnQz&FeDya2s?HK)PI_{[)Fug&\񅡟_x:_3}T +V/:4\@8%c"̞',J:'bLYK%%tܔ-':5Plō3ڞ<qP \j,{j80_z;'2nouL)bf֢#SCNBfmt/:g)BJƏՉī +z +4"NGpUg, - kLpZ)Q* mׯ5Vrҙ ۘLÎE^ɜYm~& jĭa(.lɛy1$ 14Qu>p5 ?f +ފD((CCB(n^0v,ٵ +C;@\q {n8꾁fzݨ1~\COٯ1 ͳ e&*- 9 FBU]_3WAà3-T$NK'_xщ "MKf@X?'\@4-b|i@Cv\`Y?"8RNdlgSDL*D?<@$N<"u5>(>F'A +鷨RE] +fZ K3VUb=dkVy +Fx 2@/#à2DmRq epgr٭Aڟih%?'9pi䪪:n8B[H#ɂ>T @(IʔRJlu?? aqUHF ,噌Rn}̤,=W#P)UR5Jj)ݽ{5@\"PBQr e'2'rBu7(Z4@0 F@d8uJ!uJ*MF[aI^hiuYZ/=*@TPaoR+-ʬG=d,VzPKGf&!5BJ0Â!qacA !1Ą$FY>K$I2McT?8"aɖ~@KrÒ,8p(悰p`I24",ɒ,Kb.pXG "Llw>GS2zsVVَ4<wTg>V'5Ü震us=>x2~AݎroEF(QEe^ut,"mZ4LSdBbB?H[hHrf^ԇuPs]1wyu]4OB*0~x7GT`T& yoCf 1a * =`EayH"L  +ǣ"QLdN3O3z> T@\HX[d=hOZmZ9h(*Mác7g?<̼&ն ""bj {w3w3fn7:p_k92+,BVVl&UZq;6s{2Rb<*;ҪMrj@)/OuIVvС/wk>}q']8ϵqy#9)v>veg>W3ɒgf&Htt41/2 +-H +J Q_sHFgQX3]Hfj,EH!OHnjT#JQ"CǪR<_3 +2Лd:ϡ509Ck&AS/@p>S0mtФWd"Gr5)!dɈ*d2+//T'BFBbQ(VoǬ@ꭐSx`PEsg2-2E; 0 ћT쬊V_SyeǃGs0>Blo{|fDn=^r7J2QL2JRy2A(z&affdfotGIG!dQ췊nMnḞ~0(nR(~//4Q_Q76C-"{cQ߁hyiFzg"JGΊKG Âh(,, PPx\Tx0`P,`0 &$jQ4,( ,,.TcV* Y\@PGEC"(CB9rsA ;aCa>z0\8*"#`#5Eh ?0b_Ej&[+C" Csw,RFeu_E: YJ|tP_bEi {k.@<]2#K4T2k;^Igiv2-}-w\yX3PB״Jzf#7UQ6+޽OZ\{y'=3޶U"s~.sTSw%O&}w+<(vH9ADSܪ-Ē,ĢIvDDzGP:{NO(gZ>#sv&?4 H˿T/}U۪{M C=7i ݛ?Gyଢ଼=t._e3G|iQ('_45 +! P#P("Ǣ)ubG6Ftj9ƀƑe]hCJqa}1IlCNRhАq@*) VD ,ƖkH˝9d'xQ3ܞhW"Mx]xgW^BYTs1G;T)49 , aeW{d#wd~̰xǽ7/t!["~co}"Ƅ]ٷm\IowH~los0C 8 +-hfqQpMQgPDh&O3gը;8PF@2ZT߼y۽XZl]vҨ%V1q@lЦۗs׬ +nt Ju]if+SsŐ3]'{,\J^jK8|RSӄeðgWGjo԰FFv =hpĴX2B$oUG(hPOS:% bS\^6:Fk(M% ։q0$.8ieoD]'R񚢳[ sw 9@W!}Y)CGFY`!SJ]GWwTrESHd{%8aCB!4"|̥Vhd%ڹh fQwoW`E BG ?]v1P̟gRKnzO6~9ֵZNjh$dY_yYz_pa8E',dv,'+ t[5Dk-_NV{|ӱπmKy۬r# @ɑƯ%Md \ + eܗINu+pTN\}GwBTh8' +KvORfġHA CMj՗ +Z4iKy;ۺYWj^řLZdȡa*JG1g 9[@tw4m` +ݛu`TaZS}Iн:v}Vhq^a @?3w33,` zhg=QcDx\C6 Pb@ZWg ϱ{u,e@d&#yƅ+|$` y~ρ9tԇ3l f921NP9ǡ7(e @tk%eZu%C沮37›UdTX.&|4/[o5A$[b0#Cs&c|Kzx)BEӮAHxA؂ztŨst5 #pӓ \}A`䛾Գ),Bf [h{F WnGS[f*f".3SAXXGh;2|R;+Q-*~> +<面_-i@Yoc8ET}d,ŦMV.6tO,FN&yJ9/@M7d ͬG,KGHtN2EU \ " *e=݇nUŒqU+fQmwzUюN@S|H "ZosI>im667sﭭThF^5Z +@i$::QM{T› 0]e!=ߘ0*!Kp-+.Dm~ n伷\m.z]A.IZ6Q +Ȋ*6\h>K?&Xa3.xށ GN0I l{RFLg&C[ayѾzs=1H ~edyoQlz0 9x!0rBa$0\=Pʍu1sQ}lTmƄ0' $Ї^.҈6PY-iQ}&|l /B}bV1dTf[y'K1#lz׏U+1׳&.BKoUmH/>ÍZ"VISk0PK-)./Y'X<~ƛIUݘ/*lnD-% `#F( "G׃G255 of@0F˕B v"TY:EA?i{~;׫VH P Cg p9X5%8$~ +Bк: ?]fHCpkqQ=U]4=)r@JHVcPBe(ä)Nj070`Q!@ \?ek9~=CNRgJ2,bLw#L$/T,jYn7 y S"A*9k{Vl~J?5*uyz2̛ $[tL L P쓳+w@Lh'"BDr髠L)Rԧ@OJ'RVenVFEY`QɱM_忪ܘx{0ՈhVB, bolEmG|Y_d9A~V>P + 7GqHCR>k-%TLRU|\xEŋ[ *4#%e Uૡt4j,_qF|û_ u[ls2׼/rmNV$c{37 8$T_>_깤Q.ϒV9#z&(qK +۾##)CB)T'Ғn"9~q=`m| +UI'!EaUOU> >}8qҵcɦIWԦlÁ fO) 8%IPW,, 453~@K*@4"$6PUW`# P,uv?`NwѠ]%`tvֵ)Pp؄KxRʖЊ8v7N}QGp.f wy/̏*BL3ŏSβ RuLbEn)yz85Ұfj]|!θȑ|I6ᙰ?~4dC<^pB\~[a_b(D> d:&OM^8\)>}-?-[ +g[!Y2֒r(C4UksQTnxа8G C&I)QqĠklDwo:&0]DD_-j%q|]++0M QV"+}T.lcV//gԅ*Fȸ%#'"nz?-'fg(p/B!L`~~Wˁ%e `V폡ث#֢8!(NqQؓj'wPbQfCP s\TQ8\(i {dzêbY0^$YC1R3 "_W$SߦgL)5^քhDQ RR?~\;C^=%@!'!#IO0S}zqλVz{pG+a͓*[ 2%P|"qe8;rP1S„% D%ޝ\|Es11W NNNXP^g!HgvZp`.\wk:@HfD5Y1]ҳvV[/BuoH7g +K ܧ]aot/jb~uJ:/W>h7`.?iʊBuK;;\a'ܚlqlGY8q34JX."w'Y'OsC+M $KހEl̾)x۵:+;UF2be]HaĠ 2m~(FMY ʟ?mXjLߠO2:iǘ2Uy%vY!QgR:j̼/pa8N5d=֭$ާAB1-n1)کl} [fum}DQ-Ali +Btduk/@;̨+V69\V7!ȶ:~`tuyqv4zQH KΩp_JZ4C69 Eh̓Pj|BGT옐[(A98EDcLV\=-@6Os}S]4cwݚ|% /J+ +-4\ tc7Vf3jYެMRH{j|q,ln\a4 ~c7 C4?i_|153#]e6(OH>tꙛbbg+%-/z}{ FsӒS\Inqd.]nSpHQ9P4, +0Vx)4&s2QP }Z<`BqZM\qWM_z9+sKBh}_o^;6:Ks`ddxG<ءAw&RhkVZ:lCnEiPc}8â/ b1Kg3s2h!1~1AJ:`H)`-ⓤbU X xjUh=ho<Sh)8W|"m4]Co2)ܰOjJ!9@ր>As؅#+8BSHDdH1%:r:prcxcYk+ҽM{l8\@o "VȎ#Ԥݖ19b]1YAkrsMYiKxj& ye ++b5֧1bM@aNBP6A 1?, 's d 2&S%/kpfF~`7 +/`]_¸y-$PC v owW &6VzQB[hVZZ rl_8>9=19\ LPo+lqzR=6LPԵn7ީUǐEfx[jd|ur~=PƱe&sdМA;K?3-aR/d# ^ˊ (Y1Ԍe`TBtFza TN *6P]Kɰ\lRQ+"守씾3ax!%UqpD *p#HA ,E"ITބi8E Bhle3ۗ>D($B" +XC5=60 28E2Uz&ˆ6 +pP"eU pP1di( Y3H#QLLtD4H#ѨHBAl@/(hhP8 C^ĕ0#$HӃrz" Ndi$fyNϣz^Eڼlom9ٳf2Wdu9fm%7k,71Wm%;/{k]cgUscf-ٲsVykM{y}WlԓW6V,ߕDoN6m(L4 ӡh`)A:zQ$>Rjzty@Pe,"(ZsdlkεKՕNQ[ +T`\<*Sax@&PB,RQy0_|LYop Z3![s dm@`*)BEq\|Q=Vzv6wZ?y2tJX 'z@Q"lXL8/RW=,ٮᄍwNl0߆ tVսemݧ6N&o0A&9mDrzJ7sw绿\ݷ>:ifeܹ͒ߟ?>K͟,7M:v[2g\G%QyIy0T.B ֍WU/z.,Rp(p<[aQ%U gͭ`t253#i6@4U@pa91B!B!c_[6YN +rf8aH$+\H|}C 2WN6gwiB]EP$6ioswf!,F8BWCϺwtl>k? 'm**12`L}y憃4H&ɨ8 endstream endobj 13 0 obj <>stream +m] I 9%X]cHGzvc߸ 4?FJ-]Jػ~CͰuPKN#Pk} +i435;W`\3Eʫv'T(\\e[jO:-]Mk8]Wy7"ۣ@9IƼhAB 3|4 tmr {-g՝@;Hţք_<Ʋxbpa{-@iΉ>$Ҿ܇l)F,laSr#".I.]z%Y&QeAQҸ ٹh 0,K:O@@ +Aex/ +F@0_"2A&[e/ %GCj&W_tXht_hIg[I I%/ LmEgL !wo(QP"cU41ʳaxƍ|"=v*!3D? f=8]1QdKQ)p.3h^/qYC IwL3NZO7 Qi.vĞ T 'Vk $rh/Le.yܽJTMv,!rj6Abe]'FK5J946P~yT93FQ$38xeP$y%Sp^?cDˡ>Խex9Ѕ>J +quD݋8=NY a,F@.){pbYӚDw2u4ѺGklm6p5Dnm5 SPIVB`\MV\.g#Wqpk ߝFIIȜc6HpÈaC)s,&F+`t0'?+ΉxpI p?4$򤙛t{ $55dP J"=zÌ]Ee@FRB^FR%]\6)A$p>#x{5nno_\Nqm7g@%]i{0>)d6éF0;9GaFɺy]Z!t L#NoDjxxU7i1ahGOR.ؿhVdxT&(mRkOs]tKxefY a˼諭y:5|#qђ&(;+JRi-GEw㘭ks$PW[]\TE;0MHiCqo '(sQ~  ؞~.:}F7ۥU@Q:uk.t7(u "EՕÓ=+rp4J[wsY^zgEL_ZSRUYVFX ˣbB + Eer!#D66 `. :a`4*(0 +H&@B` lxd$ʅx$d$K@`!q$JAF##l#ypS<#Ddhd$ X8 Ƀ +Jp0d2B2AbQipP4ΟaAvL2 h@y2d\$#dH2P(ҊJp6\b\H.a8JŹH*L&Bp$fRLX,> e"D(  +bLF P.D +d*& + Pd0<"O"];SB;lQR5t_i[]ߒ^OZ-/7ToTxҨTL!$(a 1@j "b I +Je* ? 8l`/8PD($A^-sEƮxA"bCH%x; a!:EV n0&)((3 Xdӄo֥P#"f\`,+ &(t d" EJn8xn '8H\E* Ώal Dp崙-@,Q8n&쀆44Q`MLڗl1- j"[=_& +IѨD, D Pf !ha)%<t2mYF'3ApptKiT؃r"5ĩݞ@?iٝeZ "m"PTTe)Ex1Ê@)vYl`弸ai"`@ͼgX,tp $i\Be~ՔހXJ=l5{4w5 +\c"Wٖ1 6[$"!! Ӛ +00kRzX |7Hv  ?ʵ+\<-ujSU*g?NH00u>\ `x +UqA\"h .Lb- vGl]D :b31sI샒Tb#U;R$ +Fqu,^_d`% .uDxbH0Yy)Chj̙h(U,E+~}=KԶS 1 )zڨ߬z5vшxP03Z6$ipPcZ4g ަGg!~c-]`1?$fGhu 9%$MԶD,nLK5Kџ|Cl0:*$@! a$d#thd4otuf]t6"=l4ˎaw8 |n`#.CݶQm _%D`d! +@@U- BhY)h"=^, 'W6bI > !M:$w2\uuGK:)/uu  @U5,M.;+ '%ݪv<6󶙧J_Jzc6i/ҽ-GogF?=Fr[7OR\pv. +cc7eUM-S:mb*ZRAަE]ϊt{^{` :@2E{Bz?4Nz:{7+{.]ARvbP]BeT10B^cU`Ս}`՘R~bz +rm YUFHe4 +8j AP<00pw0%@"7 1e_'O<0^{y42q=]MQ޽ y~`h4V92YX-=f5*gpZpl•eNU\SoWoWFj,gd%a[‰@aaP}¢4Knqy2nF6#Ltⷵ8T\vݺ6QӔ&-\-\.Bp{'.Loxa߸Ƹfϯ]Ϟv9W8\`Ǹo{usQM0ns%\C~+}Z˦Dms傡H|;&{"ץDAwXnQj;CQ3fͮд eX-74]hY$DYhenR4+sf$ٕ;\=+ taaůr0QS@_yےVykw^{ 2;} 1`@Q S;. oPf'_,!PpWUmxG!lrC4 MR4+W3h\ze]y4 ^ע,h\RIt KuPKւ&٬+*\OduVzUJ*F mV8Tu Yv H)I'v`rS SB%֊Z ^ 1G XTS SOޖ`)L4HKa_MTQQJ{(|̚a1 JjR чY&L 30ca 4#T`"G9Ƚf4qe'5;JÁA7ZX^ZEYh5j¸&J1yoSJɛCD l(qKSPEUάVWyOW`'sNF h4KVĥ:7HT2WPz“r瓲5~ L> +JF^) bX1ZCYV@ 9m lNZI x4g5BwQ8zwq8D(@@w5$4Bo6 HАM82HSaܙ qyB`x1i!iav XAC.vDBّrA3J(8 h +2 +h,)J"?̠x|"$$+6tXGvN ֹ,Bg饨/C=kv5Af.X `ZI[ TegB+[ TzVS6ROYz[9ԤiHA(ߐV!!gA$!j@mT)3wVV1Q8BM73%N+ x*8-x"T#q=+\-F] + +]l brAŒêCۨCkÜHO<;(4mR*8~NŐ_i$YB`e4B0tJ^@I +]UckR!]AOAqr,Rp ЀI oLtf"DfABPAYA`!!<dkxZO/!bD/H_= x> |VPɧ*C-=Oτ/ \2eG'w(o".XxXc<FR@aoq3:҄d@MDBt}O:rY34^9>v g=u< wΰ +Nla>o9Kn}^쭽-޷[ÿ2-[@o/n[@qq_- [[Y..>vٰ+γmjko8km_ѵe-򌋮-VtmY J{o9ke5;\k|Z5TLx4mpV,1?*o_0xۺɸ_k \pnfhijesjos6\=W\7Wx/qe[o9O0nX-hq1<8s>9[>&$/\kb-\9kbj6 [Z֔]۞Le¤eK&iY-&ǐo=Cj;^C~=ͿO2EҮmOB䵇5pmWh6Wgn h?uYCeQѼۚ. tkr0{e R0πc7jN4EbмmA~- I> !Ƿ^KMhbf323nf,ePW _chblX 2o#t>rDðJtlQθs},(93vN`3&p^Z愍SRWWSnܒ+a 4 /A2_q܎5%5ySZmdBkƌo$W@^U oUe\^2Vf[_)@]'eM9$۫lb$k!OFx[920K'DxDQL]u +JgGh2W#TEz[g)vR%dMz~l!KޯCd4@3oeY$cu(fEX,QeI=+Gr"AyqRHl& +3bPE眄;|A4XֺB)U^|0i}&Fp!!D$HOPILmCO={ u! dFE}ƅDIJr53RCE4guQ8o$rpYTǬ]3VVdqCm/R21 $צ ӱ؅l{[p(C%AuM3!ʐm!V?8.*C ۾W!#ϠAbKP$QAc$0 |Isd}oQ.?fe xWMZ})( +FRr~Si?j\F + WBh9(`Ξn9>uJ#DOxw$^FN18/@&ڲR5XQ`r+hpZdXu(uQ$`j9 ʜ='PD6 ~렓d1#``U͐$SNJwH +\>hKԆ3^LDW.DY4M`G V9(u3wXCy4l-iyD=')E}9GND_/K!1ɰA)CV/t ^c Vo#a;F+Ez!þ:j`a/CC#H43q,0.hK,I(X-=B6)Ab܎ 3{GS ;^VDư{[9J+G1aScr(4h-3j[b;i2-Y=Y|m%VD/Sн )؅gLI@s4eMiM|F̀1̓f8iQYq&yQ`+;.( Jyhy֍)g ^A,GjR&yC,$;Ȕ @Dg-[:hbAjC &&OJ\θa&Ch4)V@EFrQ}$QzgnڇЈ>^1 ) \jipgH &DŋiB$ s:YBn>O\dmrl[f-1>!+}K6"ȓ+^S9'=ΞaW %MQv1*Z|Y:qQIM]>Dv2w$J>h^&E v.6kCI\ Z UW/E`b1n_AWڎrZ2k_!*~Aa!Z^?dD^ iye}ڔ7mflGW[Vx5 # +/TА 'DVBprZcŀdaɥ39έ"f>f8஢Ma(<" >Lɐբ{"Z[6rCyԯ#[$n|>ĢjLP +)RP +4ݕu:! R-ȏ▚Oڨl/2)8 PH99*KFȎ;ҹAd件7&jQ*kJ^TYڀz5&1z/`KϾhZ2o*(NwlDnbP mbN$`*JNۇپMkY'n@kUP}Nћ;a9S$fS۵k9 FWF3!wIG L )m# w9L482 + jKf\ 5\?aiizԨF*im`_BtD?0/˯Z|t9W^`P ѫTamlH- yz=-R܆B%HmL 1,q}s7 k Y$`_xV_>,|6 BLsYeS-˱`aXO5;H<7? Al\.;[^oE|\+PwʈHIQ2Qx?]h\7o\\(kM1am8敛VT`3q~xF%"4E<2&^F|bIhVl)UPOS(T@mϓŕu.y +J>zB9̏Մ:T2`(j(f" rOmYɑX)? +و[H;J6V +*ы*u,j!)Yi +(< ;a炐̨s0T0DHM/h< Z@ڈ"bý*>AR `bf\[~qJ#.OM݃N',:6| eHLFS` 5(xńmTeٮI>}_ Mv Igp2ʨƊLᢖ{qJXU>oA@h?Etl"Ipc`!'-l`:-FW,{x mݞAc#gAK +,aSLޝXv’o=p'] qCO x(΄kvR Qfl-&mک*9[[Lnӄy||0{8%,]l\sAƘzpYw1)gy 'r8?y9v^kxۊ$-F<?7$?heYG(d2,2*\>4븗$p{Dҩ9#"z"ӽWExϘ@|+ >s#oj#Is PqL|+gf2^sIS 9޲1EN/5sF4#-i\!c$tsϹھqΌhaa:݊θ)֜lYVebXzTaթNL16c &h4 |K- xjSzf[Y46,R%G_=M 'qg7ao6im+}݌?v~aijP]}\Q^ +0:?K;E1Zn{"7h{?bhp 㒂5 I,ء}P#\do@yg9 Kb0s[ylGIx  +Ўq2Jf;on57u巙+,ݽd(I>TjD, SN:v?W2Z 5@^Ya95 IO;R0hr +Lve 't +"G٠4/Q$re}z^|o=,rwР Lu2/,YK0eI`TzΟtL;y<R +}sAz&$DZnұeA-UtZ0 + ZQN3 ,u%m¶y>M OђWr7Cw Bjw# E.ϾR xGԘ3 ˅E)]9uA +(}_)"W*W jddQp#LW'ϳw拹H +jJg5NFZ,9 эXq [`/ :7T)Olآ@6`nĩjy?xqc%f v1IRch{2&}\@(ɉ^(fO2--}]{C uZ~~'bަ zdY/7` +=2Э#kkj|&,Mݢ9kr35cȽCM&rʸ2|g^.!ϻ"Twy[KJJH݅IzYzPJ}SJM)uk͝p1:6_AW4ë4FtP2Jg+t0?|y>{}A@f1S_&*}ɤZ}ʌC8ǡˁ=&fRK9p뿭ݗ+}nĸɆR짘fva͛@SP _ׄe]!HtoD(7 BqY-L]SynTߢb05!oez8.g +_ɕSR_+ʴ.g%KTݭ.;-jYrZjT$@EP~ejWA* +AIà3Pw瓨jEvwOn:?:?*\~Io}Ǘ{W= 3#ly7=8nx3"}5(t̵E2֑ XDQ`,Sˇt@sݳCMfPSw ;Կ#7őb&1u:ʸ2d8{>_f^SENYBi](*uRJ}S3\¢%1ޢ &A +_AYUn _ҫ`x\J0ܩƺ;1sSاn?lRW?R]Y9eA_&*I26 +U +~$Rq].f!@Ļmwu"E][_m 7R_g:Y%[ q@ %bӍh Pb@cʠDa" E.o̍(t [nD9t_6|ՒBWxer1ERy& UdLCmP3ì7{%3`vt@F>1[v7 cU +jcT9"-j?6K-z֣~~ksxDz#B㓣kw5ݢë`\쓹E]-E;O]J}.@)wRu O-z8/΋8ћՁq^̕8ػg/yȗ\@Z֥u[օgZwc n]ZH(KJԕ*"lUD0hL]*ua4<8đ| +³rPɤn׻Ֆbn1<Tq2I~(@J}'O !3i녒E׆)3oG>"7WFNAX|9ƐSWy UAn Lhc{С>,] ϕnc0)5ٟ3>]ߥW9_H"\` %Tl%^P!?s7!o E|; UH+{; ̵E\/;@sXCz59߻z'y; 0%墫wk:$43 +{+pwl8kHכ Dl.mDD6nD̊ AyNl܈em\ޒ +8| +' $rq5("ֈשi~"$)=iZIQͮ, r0)7sP7 +FIx + &*`Ͼ*#Z%+#mHyXJXxM=uE~PMH-G~<3ElIϳƄ(3=8gNȵv xBa;@ֵBg  +]9&CchK>$2-^Jg<nqjq@m]B?hse:e-<'uS3C/:zpWȖV?w +i3 +!Mk[zP Dc9[ReudDbyV_'c ٖ'rH +Λ_NJB*FKW(Y4F>vOHހKSd}pV4F>^Bk?mU~ݭxFrM$etT x ȕr5h9gȵAi10N OKb +)T)=FV4x?mJIW$OxgoFNyƳ +*Џ) -"K@ <*>@#a jayv-@JAo?O[j8 0Dϯ)?Z)^<X9+ 若+Q*;Xҙg,+o0jy.հR$feUmg{n1DA%r%y:h̤p`o8weMH(<"0U1T(vK+dT_Ɉ]+d>J<EL* E _y;;#wF4m}xyB? +K:1VkQXY]DL +"_UB +%r`1!HN{:WVXB_;` -E $]jS%]' T}bd?m:b)ȳQ6lb=>j$Z}*2X}1q|?<#?1N$ 6RaQB +R#̊L f/赝9}@I:=%g󭰍 + U`x`\0zJ:(.FO66LO1fqI!NO!|ŴNJ-^% }Mfv%ft©4،, +Lgw1WI:|\kFk!ƮllfA)x_$Ag +VXnS[3gLAAYrs04̴<@e?? + ,p"p%B+jآScTR)Aw,!?ZT4$";XgH+KM?%ˁ}(}Ⱦ7R a\`=ߦƿM .FuQ-$CXP#$ +@soxUQ:Btwݝ'؈=&."dgχ'yЍ`ܿE&|$ِ`,8z`WHr뺨e#Ux6%q71z ; 'ayf6DCLAřLJaà*.zLmX? \w??xK("-x}5 ixګJA‘f>ڇH&dCaX%hșҠJ%f5#b6qєS27T[,6&Nr J` !8(ıWP%YI +q4]{44Թ{ke`ŹXb̖\ܪۡ-CG#G +NʎAlsJ3: $"qGt%`@) 16k"%.>o-#3.1{naoy'#*H"_qޟ4FߴFBϝNW;bXV` @S/oȷ/Ov2 +nNr`^F_=RWS K4V"cKBz%Jkȗ? }or|!>NzPSG |a@hq,JdI<3F)xim >NdTN %4V蠄 m)' +//+\yv25idRP2>OHVWԧ{y3l=yz( BPg#{ּ\ D")1l6'x)RDR!.ޟ.`t/Pl*Z JrtM}U)ɕTu*hBFNA Ör2Boب~tw)(8һD^)|o<ST!O[nRJ{Z1â!TY\}~X|ar^͟_@͛H(+ ȓC絅"Q +$Wp +qU7MHfK sTqΤKBMtlH)XB?OY2)(PS?R/ .ˮ E"H +z:)}oC@$ y7B3VGlHI"(I }Yl.9b")H'1d[CWӄ"}JNA;NAr +.jթ3uDv)u[J])ῲ]EY蠄<$X +Ώ[j=l)g4ts:0?~_8G +zh 팥`y2-仑:KA~_x +^u_(U +z%{ 7R/LhALtS5veߑY3)8 ->_?RW_0CCL]zta"&{+ y5n#ZBB?t5BM3BE9S>REaP- `-eԄ" fUAT0L,`B{o,üBr QU,oȤȄ WBx[`^!/a#6T7ڊ7in޺R;ي +3 {-(6P)c ʶ>< VFD+ Td0Y3H>ˊ@/GNs7#Z ~Aj,/<eK3N=!]9e3ayf3 qbC: FaQe\x`ε}JE"d>H?KNR56A8YlC KwIi+@$T_y;h2ցJ+q踟Ɔ]R9ۙ *tPQ +88 ̷股tG]UPQ Je`t?Rա)ּFj%v v0)jF kP&mPq^7R7<]œy"I)$@d(~'G 9p ?!D ud- 3%Ǚ D&6ɖVϤ}Pޗ[/W|!i\QQio!@q(z-cgfx-+6 ͲW>J; #ss,?wg'G7~JkqvK w_Z禭dźvZI a[͵Dx6 ć]Фp&b"  {ul ܞ:hafǔ rb˳L9^cפ4n"L-/ ,<ɴW=|kD$ O{ D:.t2۟L>D}1TbzyrJ @Ux՝iJ͛T:|[3c:&~[l? gϚ"x&dcyT&պ͛ARɎ[$Y bPvL٫ZyBxHJJow]ДgcnIg *NR3OC0F-O"P $ё'&z$yTAC]'1r +:,"T&(Ɲ aW,;״$;/ۆiaN\ Hנj'o|9Sp\5sy&-'d~м#LQ1"@Ġm2S`%%W$+g:xCsJG ޯ*cьLGK\h@._mofL}(АX DH;v):^!Eq3Iv{*ίpva;ig0 (bkP6V?́Lx_Ap!Dn\\<# W!*`A)QI_4B_N"".$a$c+ae }ycm]n}W}D>ta˄"M)1Yw%!Sd$&##Wp#L<5t!R9 ֖,z%|Cޟ]IwOB_@z*h7R?47|4xtP]u{.x)8SgXބ"I=#Y)R޸;SUWS#\S@z]Xd%Hr } +V!ifBCE,xt*)u278.PCtP ƿ͉AXc1<džk +qCIb6.+5/JOz[:!3XlġӥJLBe@=##E1 +T_"h ƻq%l,%0 ,lgOKȑuVJx+Wud<;`>6%4vX}xvKzr|ݼm9.j> +$`DJx3g<x3YCZdEsE-u*u Ba)&˷"hgQM"`:Cioi illLҏ3P&>з eY;XxrVG,f$RJs6MdsSX'ƃ|W3!-/;{DBgFh8YӀZJ'cqHQI huTM @s9ȳOh57qBhƗ8dEm<XG>T'dwȶ\=SA1anN1.qf<7R7FzB_`QK +\5$*!2 "HeH0&FFB00$2*E0 bDSNAk5|YȡȢQOBEdkE&D{_Z"\wj[6AvҤs΍69iYI00NZP N$Rȷּv&6= =XC8/EZ>dѹxc9R?f`)O]EQqV9m1%l͖kNse2fڸ2K;%1@OFnri~CjAm<p 蔣 ^ddPʉ<7E_ث.ߢ , q1oNYe /oAsͮ|p9a +;3lxJ]ep,'!&uL]8N>:+Kl'JbYo\fy;ъMKS1 Ȁ%5=DLdBT`l[\b1w&ԋ,f89A;R"4W >X ͖E8[M)=źHo%9l1'IDzۿ yzfVF?S/@|,O_͞Xiƛi @{W#pS+2/V +$yF԰u*K22{,"0Vέ> T ꓽ+ 3 +txL\je7I=[3c +k̊o7$Ϭ/g؀SZu:ǗX/EdPآËdM9 + PQ xHgA?e xErZt.GS2 lt|E qit3F.D=$F*glGxSzze j)ySG?S A$ l"UAm;H.Z ""޻p޼ IdWJ 7# ѐJ,%i?s]7\$& PW'b Puvo@LCv.KGF +_f(W.m"XMzB[Na%?(fVcT+- 2Z@ +ǩ[P?%Nyf%7_.?%rhТUXSUסR"x׃|Fo}^VbJ8 jЈ(؎d_bs!SlzT'Nה7䴛fV 6ȆCgg*w0IqEBNAR*U⨢Xdxm7ũI;r >MͶtq JQ?LznwZ>+͘kL*g`KC:ދէɄ`Lon7+@kAf#E\  cBc6FN8NCh08[ ˨r)R-Dccπ+v)A{sV< +ҶysK%׃xn)΀Sqr7xuy,M/n`;MS%%E&H&fsS6 0mZ<kJ?Q^xŠh3u;8\ )Ye[SIX%mߺ+o> A$vP`6^Nfp&9c}}7/_fjbJL4owp23B+ywzO3Uol/s'5ȡxѭ$p*%`ʉl24qUjلs\IJYpS ix0XnfY1;!h&>x"V^788Nǘ ~;/ Ϸwҍ$VĠ,L(Tya&G488ȓcXUP7ЃR#5Mলd„oO#<7?mkGnE}{R>QhlF }Pjݐ*! z?*.}٪?xD݃_vz9 %N_Gqp fxyѷcw\P3,1`E!(ڋkוO@~ M꽍aGGQzdz= \Nr*EY@AB3VNVw%jO)-C]F]H4aK*A +oċ*SLZ)=c}g t$֑e.F5鞳R+5nF%<Aq捠XsAKMhrwfKm!cgl1qc%lu6Rtۑ?dW!NVmR5Zg^GEٔд76r1Иgh#Sk 34?ipЬ{ i(&hB{N54'iׇC3=o'h MH4hh*Р @M 'hL~&hNw `04 MMF4td# \CRu JC Cs. pBghqihVC)L =4[@MCԆ߉C#h8;Aczhk*'hVu>4M3 4ƲK4ECokB(ah^7q4F6yjdiZmˆ'mKD1NQlO*%SD.w{iU?5SG}{%U"`Y>2|Lv\з=j TSHHRlunA_W+́lOyCt "'+hePI#ql5-kybЊ@x]:Du gEyDc֋?_Muc[u*ձ#' f6>&BTz2: ٹ\ZN0ɋ| = V/xz66R%`OV`:Q}ֹR/< l"p8Œ3J"%؊5#bW”č7by=6,IV $-&sʛ%'OIz[p0@ؒ٣n #׮]%w _T.FTgr%o6lZ4o.טRߨSU4MLe1F˯f*JѮB$fe6@+a/O܃ ʘ6"E)"hvȖ=2iq_d8N* !l +`2]Ŵ|gsD-NF`{yLNDR|IQcȃ岃>[@}EE-ޤBr*SbCyWQ8ho#(gkX3`7I@FafrV97행 L  np#ZH m!DE|*SZB_q)Le+aӿBT%K i4dTԏT&1 *Ll-!}H {?XȥoBB +3f| G9k\nNrvϣ`jo3ߌϗ}O6( U`FEm$F,n ƱrRi,#QTKS)DmR,(ISȎdY}ot?D(eFRz* +a3-NqA \'7ÿ͗*ZntO&D*$_K(MhU5}|C% Nbg4ˬу (cGcfTK8ǴC,+ QA9R8cg-KUXS FALվU~@|UL"A?.7`g_AhbBh"&XWs40]:IL #~ǜ~Yi(Lr!2u{mCU\YX٧0bݹc?+79º/t‚,}P-Lʁ)݊H'aC^߆a6^!.xeU +u1,ζIxqU2`Dye/Fjju(mXܷ &#vI}l:&\k4ZJe5йP@mWxc&TJQ_tύ%o!L%'js#)[|Rr˖讁C&j`6;.yA{R_|,'rZZ_p2u KENaX *{VU|'Dp)hKI]9hxH?!v2{"8 .e׊ ~{DnC .ǧ=D"/vl9(RQ.$dH=6v&Y9]/]Md3R a#kiqUO㲻›BԲMCQUo|sK='\- 5no?^ڤM+A@Cƾuj( INnP$VlvG _:f94eL>bE1 +5y1"p1S{J#\C_ w`:tP/ Ⅽ ȶ.r _BѩZh2^GxZ7?`X.-}C0ϞIAKh~Є wShd)Uq#L + (Ŷ5{ 3Wt]I_u7V5|q\nvKRo.?*P[ ~i״mh_y.W~k0͊Kwv3cRmvYAJ<4mE(v2+Jl]!Q:q0#\L--qi1m6H8E΁rk{R /ږàM'ljyC=̲EyBѧ- >쥮IEA)YI~5wZ7*F# LJsbbE83 +dE`ꥊ&&|&?pϳ~,ILɳ.Eg7a+G-x19<Ж,Vf:)[X{:'o[L4G:O{ȱl@k?&I˩]eG?B%+?+l9vNCcj M"HF&BpVRK:sZJ$6O= c7OF x4,smg1?~;Ю'*=PtaZΰ0X.hJQIoݻVJZnd:ˆG"֏oh&Bqv9~#cߠXt&acl@llqjsWmncN)dCkVd<@c{:rm|:m{v[cLO\Q>mF +̷)V~%BXY%VS7[ifcti^(HLT +(ܫfcc؞FVdF.Ft歅XRk3Z6>#E m9զ::`q2g[X]db+1\0K-)9Tls-QB)˺w*˛rP\FAl&uRmN"SA +8M)-n`f i'" +L q@vAN{qm394t9Oہ֮kܶio5B e.'b)nIm$KɯyeZ:.Fî|\W Hnvypԭ   ZJzhu1Q.˳V),\~2p}KHpӖfo JbHr#(˾3zO@qi!/C~Rf>^mSp<)_j7jٓ'hdd`܁wz0TSd]MHl]/?=^V%?>RmWUz)^6술8ߒF<U?@P ᄀq N 95R4*\ + +T8Ǥ0&7tXQz$H`88"f\$#YP2 ;9[]bi7ݱPBF f}H|y#k{!vZ᚝\Aީ3 &M^[`I9E>Ǟ>ha=H wY|C +-3rGG +;H5}1K(D>K ύˌ888ʗ.ܸNz3t IUKY"8_`W3^ЭeCˑ=hم8? +ZǓ&[^,"܇Pt5Sؽ "s ,g-CC,w}AXv5b`k;06_ oI"BR,J?~6~̍8ȗĝKh.("Sz:Uq@TMb1{VYY|'5U |G_VO%ٜ,fK:Ɋ]FK^P)9V X`1OV1H>}@&}_ϥ3y-iNI%ntnV;wc .,.Jӏ=z0um'9Uf#߼lۻ/KWQ$S>E'u) +,l^4'174v\@a)g? ֪lW)KF/3f#_pCǝ\#]I0:COOJ +$L)][u]'NpMs,ne+ԹgRˆ6RQK 'ff0mY5\NN l0C#-<[DY!73AU-BLr[ty! + ,`f*[;x<, 8n|AEuc бBT$n :`Η07U,$b cI4n9`e sfbЉIaމ'Ёx|]9p)u/̨_,._ȉ;'0. B,Cuӗ{nxJ7̰}qD/qj% ]{p$E܆k᩼#;%Sc xPP;>Yy1YXIQIMyzHS =fb*¬4F>bRtY>ѵ¯RW5&GbR^ FcQ^M:,BDnJXewB9@%,btW(av9ϋY18anSĻ>9.HTŬ`b2V2}>ޭ)juQߗ0rmɹSAS0 E/<\ALRi ƈu0 Qa`Z/b/|}|#EZ@‰^aI`"mC|]!eXOrOؗϱw߼^vד0-AсR6m&s%ݒ8gUcBMv]Xw>/vF%x&8z[TFEWf 퇔E +>y+7#_8hN|x1'priV@~vY 1<4,آ6^n牥A#Yl7Ι 1i\2uNswzCׁaRȏd'7v=:%GϽ49l`_C.,۹ W66?i /7sT8).'.5i7-#a|4~jT8`+hzG#C8&MB] мuUhCk^yvAxQCrxU (YFW f$Jf@xP;#'z#j^y LbzO>L+1AgsQ,T6F+Rm=h<>΃k@gH7m uYY r-Wu'%ݵ ܂ v`Z*֐*KաZz'-J@/0;.-ڮr ug= +iDO'敉/1T9&|XxwF>kwز>`:LԻx/^-L4ߚzޟDJ*&^%-}!.< Q#>)#F&jxbK+;Vz%MzKuΎ`cfJd1lJ =+b'RM~_C >RA4꒷t[4f\mv~!ɅrW)UQ eʌbijœ_/u[`3x\喢aFؚ]rj/]RSoI!;P  2GRI$gI;&>4bygdg.bnsWyD&~i~{\E6~ܺdW'3 ^D=rbkA, d̘ cH}9} mޞGBsllon2G~2!h{d_3Qˤ(o7+; >޳Ց Hbl fA)U*c/ +fR&ofǝ~Y Ԥu-K]+4B,esV?P6 TBv5&$m0\X+;e1\:YC*&%6S3ثhGPݠ1XJ) _vjL]VH'хڵR)J`1l(ByŎvf/[' [szڧΉk4Dȕ;:(F n)\ ڒǀOq2-,=55`P(>A3>ɪ?T$U]n'!AzYV$;=g.0-'B(`XqۗdeגėY9rGǫW` c@2. CjӲ(>nB%D#-F^Λu!XgCI晛a/Iw&B('6Nɭ|lT MHǀE  /{Iʺ4`7!dE ҤmKB |#_cg}=U2jzCa7d|dJN[xXeؿh&:dj@XNN;<9/S9H]8/_F@Gr'EJ~u5SlyszB5CC_*.aK; B<@崌M:6 ]Y̍(BQBCPPQvbUq>2o@s0Rd˦ QJ{ o(}K^SF.f)?ZEE`@}0Ek'4d)S^0l7/"v۽'sƛ6c>CU'HO`j'vi0SEnk58hm\GF %7œ)xǂb]DwJHÚFHL2ctDhA~g!krV|Y"[lL>I$}Dܽ"R%kj"yh%{&V?7(g$T~Qt井ʼn^ɵ <Ddy%{6q4 vV' +5xl沆f tGyʏm]BI8m +foA3 1Vhn,s +9f4]?3cgxۥ>"n>Ms̵|+ 6)`*W#Y!od~f81Ph{e|fzRhh&Sgq$Iz3C04̦DhvkDŽfN~-4EobEaw>,gxM%{)&ٹWkh h>sXBjs!`̤ 4¼,r ygFSfO1h$ lcO 1*Ws!.f, V]HxYjx>IdWDk)Q*i?͘;wh?w a~f(07R㊩+XǗ +cڶ癸Rv@2UoN|$hHq6yh+؂UpmM$BOFD`Uƪ@{u(6^FCA\':/E4˜FI3azsK*(2đ;,<݋#$_|jv dvT6_0QiHzuLZ9(#xVjmeV/ fC)6Q-2ލ3bq[1l:2y!3x\N`iy.ؘt: o1)>pwAKDlZFD遬J2Lz([ a5QF"f~b֐f:4[~bzz@ǎ,|p= 0Yiyn.gJKHK$40ߎ\MgĐ/! Na/(u^Rs,6 RiVeWg^Κz'79Q}#en OW/DsP3XȮ|*/#;!00MȀ,KA$e;p~ ˧ҫ_J,!;XtlݦoByPԓRD5) enEK#@܀E*B +Ce&vl9S(7& }CQgYkQWve!Bs6n7,qu|^rluqa| XlwE`_~J(tvH6Є_@,@&kG*tzV"#Iy[maT2/'gAhrMr`PE jGh-<ޥ_13~c2r-`,@ d(ÖStxا +II*·Ӓ9N5;@9\&p+ܾڵ%AAX,ʴ.bmX}Nʤ}ě eڎ(Cbx08 +)[N9?b*EW¥r!ݏaѡY@4-!#F0<-h=kar}lϙ)Lݞ 9XapN3!Fbz\|J`sA}s[M*Xd?E eG{tK-"#nx>g<>|cGBᘇhq/PSYa5wBr82d3LIw$;'_l|3{q+V0f|et0˖ +s*MIGcS#dlm4y.39`\4쯄H{zyQ+Ag>խt:!wbG9a8E eVҒU}O +YFn&dHU yޞKq8M >%5u&n1 +&yћYjhUhpN6P/q +)N!e#^kW[2At}/P +{?CYv9,VQQ1~as 3Y!lMi)O@;oNHNugCl~=e92ʝ,%?,"Y +兯 @+6eZE:rvP›~S>fj]°oA/1b.W:2̜Y'4F#i3P?fAzf;9 ){ ^#]dN'?"8u8 +`ö2q8E-ë%@-!<̪2wX}O؅g^KS"/Z:Diz P0( ߚgm<7"%Buf jbj$HnhrCu~З Lcy(+; + +v)`yQ;j ]92k "ʃJHn(qzyOqcS25H3靫s 37},2@J GF 0.xOfG/{@7%5fwGȞH.3ɊlIujO3 l䬽S{3햧5 )_[N-A1wݠz';k]9 [FMD؈3TMlAW/?8GB(!(? wsb#r I*5͏TΉ4-0H;j'`m +O,;6ޘYB|%md`#NXx@v9UQN^|5!X 49h~bD +xV\$/$<Ɩ ﹴ9k@2c꺮Ztˁ/3WumP}$12R𿾨šH_{ 5jj<Ƨ}D5 +IMn- +[\kOiBص[۟w;Y8{rKB_IPdrT})@p1n yy?,ϑ8ЌK+O<"[g\Ҟ)hv1 S2c]_'f囀 +*1F}=pkIEy\5Z +u?F*.hAN( rPEr)q[$ .u]dyS>urZj 'AUW% r^]~3;%1aJd o˖ 9ޠXfCS<+]γ*AD!zZ4FC: S7bdހJAGȲyYe(CT]$ZHfDL5/έT\SD !$30J҉@VumD~UdϷp{NaэV3[ -_Be%]aC--M7*,>!5 sE~[)љ>oq1;}#{kQ[`9H}$AIV4_Eu-Uv&7=ܪt԰Uƶ_?$dkRnafda&GF# r,*7GmaVǷQF&\q"wUI1{yLKzTO9ꁾz+z_xxgk(V[5%쿌=\N)wtH#)ayt7*ȏs=GAG5o_gqc92L۰Ktpg⠴J68j auei;%٩6ۖl`MO#R.S{h)K;}T?NB:(m$*m1&^ = 1TW\.ou +K}!e棹>ۦ!jG -^@*'DkSzqqQ7i$+مhIUnJq7lEa)[[jI߰b6y˯cbnTK`w9(#MIc; V$5z ssh0.([' Zumݞ\o VS%EAS3mkO2&Tc!8٩yG~q"_9{&@t\Y7e+G۳W ^K2++_j :3[y\%rк0 ܠCea*_1΍;"Za'<,B4~Z+kč'Kq 㡧zdW|fM4+R.eށ{;bU^?Їtt6bAfoУ$E~͘ j'O`,aI+ n,tcZ%yJ3X'ȷΩHЉR^Go4Wb޾CY]j6'Ms78©r3 +g!c͞Azr}īLYTq3z1[ f8vUpE\IAQ!OcY^Q(?XcN<*|D4ٚ4t+&s +"reHw iشqfݢu{M0y\?a o֪|q~(?~7~gwv'f/iGs 9w)sw\&RCso5+?`%RhRMЛ,_YD|V$}$ɑf=-p&152"Ж-ls_C\K4EgYdweg7eH{Jב`- 0-H +GӊwÑ67^#)O|BwBoYh 8HʜDu#h3i%VAC?+DӢ]+.xsk)׷[$%D|$W0%'Nv@];>22i$]NX"7W|$e  `hkk"y`I#)` PuI e0S6I9gؑ#=822b}H#)"E0/2 +V-Rk؛sV0l(J⍴I(V$8q:<@\$GR)6G_d| ;+vLp"2c|瞄ԃ +̏x{S= ;uk&_H +岒#)flfn-ϕGRY~R$xvER_ r[{$PֆX̑!HTVdGR簕bnRכ|¥S:|1MlAx+Q,e7 \GR}5dʏUzt$ErvRً/w+'W$eDvkI勤ĵzfPّv}i.ĭP BO0^H +].˴<R6.B/v '#) -yeH$z=3 ^g:r "|||cz|xYJ/t @}ӟ{(]{ͻ4c)n[&~Qgx)*@ ^hZҖ2i2s*Bu[B̿m/4PY;Mn.ږؿKj^;CfF^h4/]yS\&bp VINgp-~=0q<^Y+Ӛ.Q7% , BG9/p^vRDWѹg +KLΝ:HZJsz^ +cAFt;RC8/+~xn,̜"!g OI!ة#^D1 j?VOe\8K5.fHz#,r[V +,+%d)0VbV)Z}Mt/\YTA#B]/N[<#->bXj2U@^bޭbVVw/{o[\wRnGsRn8@U#BWfr.ܪST )B=-h[4ܺ8ax-oj,Vcs2U +*l࠲6L(2{W8$JexgEy]8bW#SƯݦfnX+C)>:~E5ܓn:Dί-A>uSm6p 2}a؁C4ifK!4yES<'+Q݁n ӑK.-43ہZ]W&r&~G7@[P3|-3b +*5`nYD{B6+ 06eƒw_1] /W[kOU%_Y~5>6:0$H֒^fBbSyc#b}D cj`ctD6jiLlw ǭ@Ik~>Vhs z +E}_(e+1*-U+{1(9335QVQ8k%S+eGUu4ñol*Jа̐_`GuJy Z.T%ulDʞVWY# +j"Dۅx[FgI s@.[KeL֡1|}-VSu&#Z'jr]ֹf:(^O9ڄ7d KfRYd0HeN Uؕghxu<5fe|_$>řeh}r敾g6\AS]ŰY"![{+N@ӟwyQgL|v|;O0SuV^4zEL +=]/Ոrv>@Υ;&F1f:Pjz|mEiPF`M'*ߋ)70oN0#} 1 bSbYFVQ4.(u9H4~gNBqcph8YI0USL;D{<]H6=mpG`hn +Y_VbQ3ߺ_w 뻳$" `B,~Jh H-:0gO:EE-}jtz(bbߐ4٫ū mWF R95L\FV%4^)|ɏtb100IlYt4T mK )K ?Lh#g;%lWB2Lhg5Њ4Gl+P|01"\2i⿣n0s^:P DCGZPA ~-#iLh^΃mi^xQB*ZvS!JGp}#A7*j6^Zp"_d [h:!PWNT!(ڸ0ΣgC0 FvqdJQp(-X)+6LɛoH!Mиx&4XgH%4"UFTBHLhmJbu"荫[A SmxnĄj '8: +A +k=7u4v8m D >LhH%?[F'}UPBkmONJ 1zvxڹBEy%4`,EFtѰXe:Z *QoDrmyTKi q~J>ŕhQslZh@Mٮ&D^+?B)IMy$8 )U咋 - q @wqX0"H^~NS 걳Y6`猰?KV( ~4X=pe7ݼ7.cC&3PN_8,!AD_^B>4 pW#1k ^*R%Cc$a4Mfӓ<^/p拐͙&goevo$OjռWws0a^s;׵T<^9.1cczB:r8Qկn.v[ +f[.xVzq4k [%mEc+L&7//ޢl+VRXǸ(w0DZpd*+ޒz^{- ʍCa^ٚam|pwaY]pruiѹa eG"0ۜBJMٟ宫Kx$Wor.90ٲ+bb\$tl9# /{?X~kkjqv4dyQOZJL(e=PڄQkOڛOJU/@iq"+Xl45muM9;n!(Q 𝢓. -/5P=9ԤHލfR{#E&ۊBF}h-d,j$v+޹zZ.@mS5;(Չulp5QL_.H}N:f5*F}!rR8ILO>b32ᶓcr?>[L|7S;{,|z8_27$WXYNBTBwJdƞe +hɣ(rع(/gtT=pSMb,YpVEQt`l CLitu/|Ivtyh;:ڡ~-#2!t2QjG4^*V+VlrdQwweA1?!%$Wj|T$qj( *FT!`Hu4\V2aT'< >PQ,\]p:CA54 B4Rb)!+A$6ZelX4 (E`B s&uJ᫓b"6D/ŀ TS2R6@a4:Vf28&#$M(j %"ɰL3UUNH-PZG5}8 +r Uav(Zar(DcTlW\Ԃ2 FPʏ~h0 :а!NdG"QPa :Bʀm"\8#p WTxʉ6 M7So.夙zsDbg2IВ<2{6>bqa6Nc%J i8m p<lZ:rٰ, › #O+- cb(fa'8hG)&0n,VA 0Izx ap> a`T%3d> ⃵ +RRRA2 3pa4O+YNBbDa,Q%IH %"U@P!"e5q$EuPA5Bv[$f>ݥju;Kگ1uӟ;߳{٣\A1uϷGnoۥoϪ߳.#+ç]4o +_2g >?wЍ|qGfq7m~~Q*|ُkzv;R::NF()W9.{/~>_"WF}׷H?~K=~);_^u#yzwRePS]u;n.#-l^~EvwuٿGpӭo?!|wU +7Ul焫-ލݩ=7Ǟ2UIpB B(HS`A@ + C1B!<ߺP0`<c筇x`1tD]f`P\ 2t!V_aޑZ"zd%ɳ˗0$0XSBRq.A<%H$ÍKݧT7\)!dYdLD3myOx&5/)AA#Bjol$Z$ T$ss ZӣDMܿ# x+袉 Q(&-Yk.T+& -'*ȩ{ ^ڮ^&)dCbnBu* OEڹcÙ#̠J6R! 'J?eB>J#+#J?.-f¥`ص h}`P9>A\ҺG +zKZ,aSA[rQi[*ƾY =VPg;uK]^^A&[kJĎo1U {QsDل]J1``pn- G(f `'xE]+Kd-S  ˬe`nCE ^(kj H6e)ԥJvR +^ IѲ}VF㘙YidZ,7пޭ 1fߣE +mdS3և-C(&h,e*S<2X?!V$wEԕt%r手>IU#ƬV/J{D(5䨈״9Fq zZU2K,! +T }**323-DŽLõL_ qԸ5TmK.DQ$WMvv\ $FuiX8ƽsSDN|ͼovQmn2ăom&e@`EQɜGdZ˲85 ]C .qrxQ&*+Ȁ 4gNXm݀U.(,X_'l7&ZgqwoZ@mdL2  ݝJ?Voяehܝt}#BT~*V;C~ioN~?JvOI/$ùeEJW}FCvY\c{=ۯtq78 o^fG +RnjdO)O#5w36*5nF?;W6֊㮼q[wՓXv/ٷND(Y?p\k܆ɳNۍrt0.!12 v)PĸWjQn@T˖"iKxgu4L+dǏ,f\%I3#D榤>+k{$}_D#aaxB]GD~-u1S(:k\+mXDGgڇPOЊYXS;j0&&Dew@qFuZ@\h%ze'þBw;˂`V}T qTs CZ%LGf݁7LJRuPQ +4@EbԦHجޑ4*UX.fEE۔B3JO[!e2t ^HaI8\Q<>CA1A;q)<mE@d*H3E-'% 堂D#&Ȍ;1A +Gߪ,bPG8p*Ԋijƕ)#4f1e==Ԏȅ/c +h|^8!.!2QjvwwqUf=@@7݃ +)O >9 no ,QB8+D!vLFGr0%,͛$xRIj /&p!w.Xe);Ob S@E7NE\4DwLhbazd2̆s8DlCxh"" IL kB<ۄ8cCv.5XaPnͰj'!*XvBST'LsҴ-%YXޣ%$M(.:E,q8gQcAjXC\ƩKx N +*՜`p;B'D /:S_ARn#@J( Oa`s:ZEk24I@r-#7&,m Xt~C J_%?t! HABjĊn #kMP¡bƉK^#5Ty&GʡgNiBQ<:31H 1B4T]1@@I p]y1c$|8(CV@w)2a3H,TSaYhl"L04b#MD6Q89L9g;S* %5@BtrՖoE%c%LT`DTN~G\"TGET +H1:^ PEQL䥕#<**LLW'8J.(U%Kn'SD8>1Jj a!((bCvDP6ŇES - iդ*@y7\7ā +SAUSNU +THYCgT#zF"1"HƬR+4_ e* + +΄!ElTR0$ańTr TG5H6 ,*2 rl"r #T*5BSAXpG,I8If3B\} SAƌ%(,%Cxxt`= CW9r) 1LITDe H01x ,8SY0 (7.!/\0 WGϻb)+Df$L'Yms+ܞ(r61 mD46q`nG$k$2*K/Y}tI;B"?P qHx8D ?Zta>,1E rAMKKv 4D +Dг$wڄ;bʚ)9)a&#Tc0+!/D5'"5i$oBT)UF8LXFQ5onf$G 0)KΆaFR$t$FaJqMlpAFj]4j% &P:+jíR c|i08 t)Ԙ +RL:"tD"ф&P"MIC6:)^d&Ck ǐ)@#4:=F 'kwU)( Glaj' @jCxLў'0:CMI2<UD'Կ^FDWijC=W:%h(.#Oa娠-XH+}BUErdm, +`- 3 2sSap +Ft"F({PB 2EV2JL`'Ta9`s_,ݰʗdyc $6%s _BQ` 3_ejV[ $5 lt/mjRJ<ư/2܊κpнZ1k1M<SR1N8\ +ѢE +U&B71XIʥva j(04]Ge]r$t +C&"!7!)ИC1/hۈKKFJvXbDU1ɚ$Y<"9c/l]:bc`(i*4rǸ_VBBEjṕUSCŌvv2k1J Nb09VrvX(Dut1 VkPIEvd"3.wօ1ex;`+2S*LyI'%6s;7(L7.Ehװ= Sq1%P8/Gc:SR9WTQ!!*(ec蔘r*xDWSI}eᦆ{?*RDCvU$CoH=G?d$P(RwHy|ʌ%|YxD,⫉jE]f U1D=Ley Q[BD7C +h\AC8Q #.HYȪ :*|NȔeh."}bt,qnԑA D\Ќ Qdyh@>$.2O67+(777("5sH<8un f?5,$BԈiy=r8L@VsQ$"{I(*"("İc0HrxYH f9ߖ{ 2 L|ZT^&S ' ,殈YSP30V8U/TT D*b5H]egBiF9M(5!2VQV")"i\6R{ L(ٸ4ԐDCtd4lD0C$L5452T:*lnӹSgvBDV%4 sdxrX A_ *#T$wSCbb8D*X4@R }CByP?Uiy>DP#UoNjD3Zt3ȩ%BVVaq#$(2!H +W\D̜:#QDG8IhU:|BLZ[BLLjŏ4ʱhdA-db$"I=ω"BY +XZ_0!w'.U#BPDoXP%R&}PJ@Ck 7!Iy*0"!ʠcH;Z P%6H rW T%لT)Y#>A!a?(ܲIjefej)bDBՋCIdAX24 + +U$LJr mB8'P5$xƧ +vy13-x%@4=Eˁ6EM~D׼w&B{y8LoV!fL )B:rKN5V 66 ? +a)AKib"K*JPj2 &iHO3bfE SU, e.EĘjPf-Phn)(( u**3#QA%A# GT> S\#*LRmd)zb$DnGԄ Q0MHXJ) ؊b1!S= d^"sJHaj4H0 +mb MYհ&Ń:¥!,FGÐ @PbIԐX%bXav1 }ɄP4Ef !a_ j@n!J,J":,> 2Sl,+Dٵ +4tJb! dϹG' CiHuy +'6iaʞ/,dgBrTLULD_BUUgF2qP@xAG.$%uۤK)V +U&uH^/)1#sZABG&CĆDBj*՟ +au<ÌUa+8r$|b+n"9n0VM*Kuxp$jf!8N|V +ybWCdfhWՋ&rc=YބP*!mO(,UC5` K7Ȫ#YqNᐯBّeJj̽ GB!ςyRh!e#h#YbI 51gD8Cjp8jQK[`PĔ<$G""zӶS>QakbLrD0L֎bEvaRThcrZ2AL9}pb~&FBa!܆I 3p.N$1!7N(Tr,pe1!䤆4” +X)?ńQ(T3TB8>8qy&3W65"%US ("xp7K0tJ DU)643ԃxJNjH`8!6ła+0IJ%HFx\GeҐwE-A@/ jpS یDHPLū.S/ʁ(jL2O8YF(gL9AaWaU*F,&SNHmn0Ɛ(~瑢&d,CE|qFa)CV< S7y c))mLLMkж_ .oM7CSgF@n5ʌIF8T"ZIT iK޻bf$u Ux"\%Su:S'$'pH 16nn;@OTogIkՁ +鐬A)T ¼Q 1 U3Q3T"CGÈ5"Q4=SbEʛ|0>QH +"zF9jDk;#{Hqa<*" +/afF^ރ8paHe@XɂO RG^"DD r4I6"0$VP+ -IF(~3*]E䦙Q **"xB(`*(>ʧ? #yC$UHXi mKHUW 2*<r%9Fa^ɛ&c +)3xT؈*"d +ocJH\) -S?[YgHfZ94}Ph[~*(zUi5jF` TpxU2ۊ 2-> +Gi/X=?*|ppI#JJC$-~y)μ{0Eh\BK""n\h{`ֿŋ*c`)?ғ8TB㖅QI(}*1x_ q`FjCph54Jh{g2yN?a1[*nע%tjȉr"JPQWmP (p*؄c.JޡPOАTUhkk1f+&:T8<$ }SvhCJE0Db$Q4T,IESZ[l_fV \qܠq;%4cè NBl*PJ$@g$qjnO=rI1Q?z"{L y 03y8].JH) +ʺh٧ٔ4GB:1#' ̲9.&S8[Ak5L] UؠGbÄ"A8Mbh [QQ34aFOGucMQH>, ## 9DAE @˰s'+7f&!6҉U)# +I "E+$S$bNL;)j"J:%%_43rVp;P/ 'fR74шvq-m[B2d-*qKɨ&DA' `Ҁ Á|p$0 +gjb8@ (ŨXH@7U/JbBo4\t0w6ir!cR]Wht.~6"P(k3U4.@Y~}=^Y^#(Fm+ Op$[ +H|L+bb{`SUx0\TΛ~FL<>*N_ꙃī4ȏzCFvXDiZolC!' hEDAj}W`wP/iG.L>AA䨾Ǽј1HƇwDOb޸OqKk?;GMn.ظ }TX 1vg>vB#Pa:5fI@v& ppaV5xЩT[<1nX<TR8)++48Ȃ _b8 n[q4.\Uh/oR!0Hfn!2ؗڵrc^^eBa'Md}| ;?6@ۘ*Tʜk ^-í/ȕ,*LYXI',V ոln='pYTv Õ]EhS%k1=]HxHFei,CqVh0/#PSaEuV0᫻buke|%xh~8`CPhfht @s|ED>9F5Jڸd|FhڵTP]יvJf5m.6 +ꮖ`-5]́nzco3@FD"f`ZsF%x }Bl?XGM~V*-;1"Ъan#Af[wrsd0! H,0(u~.搸'8l}F6$DKaوת}[CXZlt;E~CK!)JZ T|ʛ_9D͟㲕_y>`b9ˑ]x<YW1 +E [ /e,Q@BңSmTy'Ĥ|3+E*܃EaL)Tkzbsn~ұZ_nl7<Dt:]һ,S}SXd[>%n/(~Rm> +ƎnnǴ+uJc +d=0,Y׻rh^wdQz84' ;\x7n$1:slA!ފr^T(HEܖ&yFP(|86CU,6םZ"2j?f m zK5<ĝQ& +z|N? +{}Lj3ew/MPaiV$@.OeC@Bc;w +.,M]Q:;|$6YFIpb~P.Ksͯ?'Ѐ+P|tG r*kdhMLgRޠ ~]** +{&#c Oc5^bBwjԶv3]#C fk`mwϕŠ\j{-]*@ +TX0ñ>QE\zsj8EWԏ5<e!+ 𕒞[{|Mϖm]s ;?/pꢋ2 +XЎWK r9|Π6<@;/vcØ4SC`?Gj<6:y1s|* H1$F̢6RWۋ4j`=xSOe;ޡK.Nr+[FA,-kdy!5V;EO$z%,%eۃayS4at,I JdQfuVxQ'.v#N˕%Y>cB-] ωfqP^<$f1pw'N8܏5"ˊ )qݮ] ;G ʈV&jj圙!|ZjKiS|]^YFزTQ//SՉ %eB{8 :oo2ъ fyM rcP&ȀdIK7eTR #@W1H+3Rzx#ÔF}┾"lŝꢎnpLo;bA:qc4gFha%*]DE(TPfew*9o- Y[Xi]vA99H/eA_G%9NC5W:[bzIn̂EAs!RەpxcL,-׃U.TFG΃f +ZX;-c)/4O +K}a 6InI2|g_0 .~FyVu" m`Hm8c+~˶vQSӸ&JwQnw]y\{_@LAᒂ1Nא2Z@IW)m苺R(Ʉ2Dj"3)ZkQ1b+Tj&3ބZXh/w9Xs7Pіt0"ev"nAzĎg7ۓ\ Iȃ/5}OR&kǻ~Ax^X6fH;L\\>NICRˈ󂜗 pͭ Om{Y[Oڠ&'z]e٭/ylGDu<]s紲W=i +%xhrO!)/VsO _y<1{dFh56Ft +qWMbI,ú+ /;ф?$t/wX(,{@j QD#㛖:+w$lDԗB!dˊgc7N4|JJL^֪sc_O_XR YÔ^x:Q497P#ݓt00J'/Qq H:\X'I*4Sˢ2ioTRf=<3Ρ®:S͵ +A,)[4*7(,{1.4d(W{@w!}d$yCt?2 n-A-gF<{т.I,wsU̯ &^m>$ 95a5 u]?ٸ^qT:V)tQ) KBea*6/Ld39.eCci-sb63}dT!EP4y endstream endobj 14 0 obj <>stream +>+m}ߖ80fPUmW!bV::NkC.1!VhW1ن0BЃ#"q,D9h ._Q,OMbQd8u-VsW\NQiB ,a!Yh53G8-*" x\T=W0E~_Sa%A@=B͸B,ޱ\w_h9p\7b rҗϺF t@F#pe 5Vd9[ҝ+fY'ucR3Q}g&{YV̀N1HF?^~9KG=ǤdOd0N/{DF?dv*Sͫ|S9#@m;Bᮩz6xXC C@d$x}#%4 ޥrciLUkOIPDçt_{ʒ[ Fpe}"UN(OcSGQ)(m+LƦ0`[(O`;(\G \@nbX2+E +YDNВ[uLP,.j,C[QLo#cG۴VqY?R'r>@ƖSN̐o;x+4&N ;&yQ*!@^/Z"N%Qr ?m<d<L1aoEI:AbD/XuRRNMQUrAS2D_vb4wZ]Dz*hN1,Whq2- +28*;t(.md +[9Sȋ>D)=rs ^#+\g!t= |DZbT͓8Y\3ceL#ZKV5Y` ir?yhR|NH4TCZw /0(d(Nz95bE1Mf+J^\T;Y%g.o wmiBk[ede8{7Q9q-{uwq "2[ v +w^FDT1v{3- d"QRrsH|3Ҵ v,C}R|&`WsXXLWhjakqٳxh$]"PԊE v'Y"Z"Zc#xӌ*!d| 2Aݤ'o +}u|,@aB%t6GoIPGr +'B AVY5e]t 1'aUy Cڄ~Jx("=2CQ ߽=R0zR#e3/"Bƍbpa>TGN徣x /PⲔ %Bc1K[dB[t#]<`Zi*7NEd =j|$7S3rXpKi"zɴ(4r]H sgޝJk Cu66^#P%+Q(B7cSҺ%-GZ >蝹9(0!qUqN9r<Ă>*!)eX!H~_Оi`[ou|.[C +zf27+H< [׊w֯Iy.e!Z-`W9P"@SK]zYPƕ|ìVuZ;G(ugD@CuaC%40XBٱX{$YEf2CwPz" +v!ົŕ32IW϶GrYiHe!T )HLP5JA(faOg=m>VD 3"ar˴8^9  ;WJQ$l:IJjK`X BC@.7¿`E6Ȧ]~TL>-zaxbjXLC}u!! + 24T;Y3yFjTuy .'<=qp IJ+z!ڍ1݉7ɗY=td/8 iM~%w,ZVè ;CAx7 /BH?|GݸQo;z)9 +pɤcp>o(oȑҢڥ]!RVf+sMav!+$ˡY_;SM5*FUc.ꚶ2\ˮbaĐȄ"-gf"kEPXJkȼ(X8NayOs*N=]:F`3ꑒ9zCq<,Hd<4` +#T}} nd('fS~4,SZ Wmox++D驎]XDȀ +r+"Dv D%I˕BD 5EVT qD$3dGk3'-iB,< [p㋥7M;' +`+`DF`jz&E{[>Xbdǡ{u` +[ʅt#Dtߚ7by݌2Z%G GG֭,!k=? Z!<+EOqXXJY>47 #)ѥah]p:E,sP>GPo` Gػ!Qxu/@[ /[ͨR<)Vvmoaˏml;;q̚8/~Dэ*)~A+ cx/xHrc 1c *)8G(ybZP ݆\}uy.,q2u$\ՒDbei]NM+S2X#"&UKMNF?h 6(T`*":>mv[UqYBIP8Ș;|=K3 B9@'~ }!MD?1EՌmp@@HgE.nH8[=q6ǏDpdR-2qm `}-V>\J "EǢfYr6}'e\-܂NQB:K *&Kr xpe!tɨ,o5LؙXd Oo˦ +0q4r':Yhmv>gL~`gO;c8">{s?bq3WT8J_\g8%G*SWp(k!?ev:5)?'SifJA`b\lIwW>E!qq98v Hڶq 葌\0=^~lP|TD*DL9^ULCxry6Aزa3TGפu}G#*GZEdTn +=<49Ӓ>̌Vm_((GDs2J.lU +ʜw- +J1:ƍ=[HP"s;ݞc`NzcpPu3A1\N<% Sh鏋_h?6{m(d*vZ}BC12~hWW0^;hMI"3kAÉ+~f#].nb<$<6֣d%?'Q%JM?g.҈W) @=.VxwhTw-mӿ(,38ZGw" *|ʌ# '}h MK! `􁥭+Ec<[QѪ>x, +z~G58g,0³UEIJeE;.s(y"Q5 8S$}_qS% l5akt%̓{bc02ug(4/jSj#,2|bM7-GJGDCeks#? 2$vv#we0~h{h[ǯ(u |D<@FDB'?򢘱.w)O#lI:|]3C<>)%x$%1ݦ#P[rʎDMf.VK(נ1^k~՛JYR=2B"ڲ#l =:$05;]NXpZjpQ}GǛPO18* +2)3 +>uS Ϸ܋$Tz̄SQDl 8DM;@~&)pHYT]/0I, $8Ar5k3CZJdi yS<ehl]gьN&xD}LbMQZB4dX@ɢ>F# @=&ۓ8]o^rXɰbEx4 af'6!eՆLy\N(ڧHk:>tZ@;Y_#FsMUR3TzgSqOyRrr ;Y;JC)lPMk`/.*M",xZVAVLoj P0 jhhk[x+ ٿvy#E++Pw4p ߝ E3y]LS悢U% B{@.9RvA ͍.͠#+KpF#g(*9 MW,X*nRQ'[ʹ#ﳇJ`C\x|Ft_YA@ȡ`gc(Q}F7sȧ^{g6{Sl/ΔIh,zZ&|6ĝJex+.,VQo ]@`'SJ*^἖b?ݱL6pNH%H_QLQăoNLwJ.sf#ٝ1#me/ΈݧWh9nXef&\\Sv *j0e+,=漅Ϣ"dvRqa-юj +-0Ƚ Nt* Ho% `7iXĤFsi8X/]GHEVTmM.8tt6lSd6FIg}˲xP$8 9Jd$F)%pu^RZ8}So̒f 2R_ %m@ey9igתI.܄6@uv Pe1T^]4N>Ag +/K<>GCl]ްpCgD 1!4 ՚w>2:^6Z-]U߱_/P9 C\$Zry_\yx pWAIe,>G*8À w3^Fd $- y5%U d@v.w]I;3=APdc^;/eFd^ >a-xk@d!FhˤdsB?n ^9X|9jc8^f!+Mr,2pXlC\%GjA]%\3yy&a6]m\d #1J:JDs|VWWN7k2dFUXXr:AEA;ˇJOQ^fS嘍.)~܎Gj GkB46(B#PN~ Mc^',?X달,Dz )Ccx7ࡥ 7XE qfrݐ /"sܪȰȵY8}D}@ LoZcxqu7O1 +:It)tzA/aA=v xIX9FuiEn@5 IxW{`-S@pTz9Rk1h!<`A^YHt]@S +lf8s} 1=z yx\z|_E W"@HR)X\:A7KR 󒮴h D L>f%.YOwaLhXt[$@w, 9'$v o@G +h䭃P[,J0\L#Z¬0@RλF妡Ѩ`,^B1$[(@HS9 +H¹y/yf IrrI|5Ɇڒ$e.¬_trhn\R۩ʮVҍ"?w;L0qVyGʇDvlRN-0* ,BHFIraX7$DIyO~,Ham I:jc !_ or0 +y11GvUz6.܂*btbOXH܇gbta#jb}p噌fOxBY5f{?=O5Z{K$LFc&K9"}A<)mh$X 5c~@yn>) i 01 R][|"X9*">>~ϵNiL䣓#úy1fL~xhA?]%{#w[*^aBD>-L~H޺2|7,4R;DhTts1g`>wpkx- z@rF@FȯLf r]Z#(P%dh2o*C>gXCĈn HGjeI:(ٴGlJ-josQ#4[@Rw^pybn* +YB{*]DWr_tY9"bbE}&ڰdfh OyT #֎D\/MKg+myB=ǶëBv9)-㋭ede'`22`w}d*֭x[D@=2<X+X"u8z )dG4]b4r<}%',T;:Gdv +6M b|um) bU!h-\bM㢋9St|Hˑ\N ,@2"N \1L)8y-j} c?R,SI FۍF߮>tԁ;y]gd'HX +ioށ{Fᣂ_@WF.ibD3Юa(ey ΔQ@P8 0DQGEY*,""QZ )0]-ԌGN<|"9W[Glj\ &u? -~c0a:[Z"a;x [iW$ǀ,Z^GL.GXuP. r l0hl3'!2K]WߋHӄ,ċ3y- 0KQT \˨^1ִݛ {ɤ :wcF(7[-eRQP^X}d-n/p.8h,;eIO~s W*ǎޥC!Pk? -Sqwz!A; +)'Ҳ*1t2q=hد W.b"/>?>Y/Uk`U<(S&"*Z< )]M)_}tԤ\~p&bBn ^ c)Zy7(fRn9d(Tߡd1&OOFANPp/"s\;}e+"BE} n &J/y8˺{'*$ah?4.V"*hb~+۝Ge >!D Dx8kƝQHe yzϫlK xwJD5MzzafޕɎwU2rE&}wGBE Z_ +| MyWY,? e/gvuȏF VuI_̟NWO\^t-T:F6zM`PQ +O (|S#1(` Yc9>`HwVmE=&1Hc +A!_$DZ'lPF~]4HdZnڨahRݡH?6J`s~AX["V7dkX,l-beFl7Xx] +ѐzxD#޴  PH'; LQ QrO%T;ʠt 355:}lJs} v|Fa$)bQo/p#A !;+sٶ +FCUC/,P>DUor3nC*eDr DrJe8&I`+؍+76͗hs~b'Np{E O#Hdi7+w=^|^Y*9d!0-P^vYQdW,qPAjY'ˌd<+P =panGVT2qSIq;p f/t0B:w^ӂK?q4 TuC$Y:36eBEȜ#Z>p~Gk2 +%V $g1M1623m +†R]!&5IjH0iΓGL;"EPx w+Ϭaw#oW7Ӹ "ݖCuuٶqR'cp'^,Z`FLPgRYu`jdGF o6`9D_|J1Wxqz2leK'VE},RLwVccQ h̭9xJe 1ȣYcܼ#  +pوqrxmU(!)f2h[r$}|X#`e濬q0p< ,Xw) ֊=BϾA#Vz+h  +q#^*c̜)ÓKue^Jh ^Oᆤè|.@;i($o=q +e򔓩FDFQȑDzlt7f,e3XU&~ &#׶retj4IxS_#qOϪ&} :lT?`n?1έ{ !S[ mԱKKBR 6/a?Yvj:y4QFF!\ UP*) +rTuF9O3I}k#8|5,y(D""jgba/CizTXI?@5ѓToJFTUD"T20nհ&JɐZC ^a~R5 +!^]M3(DZMXHD+b$4<씷h5c"Z j=X"(X=Jg^O#S"Ibb*Uzݐ?aDzm eD-+rQ&,x.eAU}Q1{% Ѕ% F4)?Tc~6)΢`wUcLUzbb_VAT;» 2DЬ×)0ƫlb@q0!DFfX6~(M肓-!nf,TL(%,S-s=&bviP%L2[)Ȉ*RǦS$k|6Ĉ⮘.hG;]O5<~DP hT:>\ϋ X##B&BJBE"K@K_&QTx7PD a>Jnġ(a) ؤ 18UVV.miIdbjakT*lUFPPI +.1+2sݏM(ޥ5 +[2I}H2*K5JNi#4Q 24!C4k_5<>'E?qsQsi +ކPCja Q2UE.PUFQBUHՈmGkj&d"BNWOׄɂ4&jHI95%N}UQ +EpSP&*%l̈́tyQro%1%ĵXp¦Ǘ"U9XXqH(L >7DV(͘"I?NL:wre"FGB,0!sVpmv*%m| +qL5f$|Np&,21&CI h2W"LE<(xdԐaCIXRBb\*OKy8B$n'R!.b$4 c3r;ZbrSjCC ;b_!1Z%4i+jUsr@ԬWSao<9MGSG' +IE0zdK13 q ŊJ(CӔq-(E*$X2PqzZA]Fp Ü"Lq0XP+T]4d|c!IyPRׇp:d~<.薆:?,Aq8Z>CُKJjy})׹L&DFHrݎ_a_EG`ЙH= +D(%$zfʤUUԅ%E" +?G3ᵍ7deRgP\:"&<%2Y'a?DR0rcS0}>W+bġ֠k RL'Źac®OAKjRoAZDD"8v11!R#ѩ,a#Єl+)[V+XbA'yLc@QI(iOYS3C[ "9Dh54q3ɤFsQ`h&m8t֑h;Zg*2;8S-"OqguQ(",qZ8a +iQU pHNav(\ Kkg pPq@hOcf&V8L+ &T&‡bVjnGFĈ! @,r8W& !쐘KN0Ƈ`4lPH( Cò9rljF(UM>d8ҋT áVB)6B(I\ac!DKۊڄQCփԌZ1ĉBEĚ9E Sbas +-4QHCu^V-E1 @D4^0tUʂ8 2j83T*TeW¢ Te|#HPB(!2&XZRh5' T/Z8,RVU?Pp x#P 9XZre,[9!٘i +k%TpܚS«4Lbh}@ +2 k6J{aꑗ$a2W~Ga8z.*[zi+q 9 +!G3MTMZ&8Mn">(LgۅsIC_Be~~ +3.UV$4`I0&(AB,_KQV3 +]Nt~L-2 9= 3uC,XJ* ķJK4u3uEcVCӜ|u^N2/E +"HMHz++fjRiH}P%ctodT"3Uf yjBUXs 4[A\DAOU2 iH?3Q [hR]ZkBIR u<"&yfj8DD8 IgȵV!jvN!_@r1jzPxbZa.s L5d!]N.-4i1=փyҝ`Z@@@98z'3`9C6aUCcO|B8Ay.Z.A_6AЦR17 ƼJ7" *[53B6L4QBzdBQ$B_g$PUrL`GH]}{C*N(J?RRf'""p8L>[#2R2CF?PЧrqA$8VW>5B,KݖEVUP"P0f$A +۰L/堊h+UQ1Z +LmJ "- dd2T\' T?O!DQVn uXJ&!N䧶FzǍ @`"&'?Ȳ੶*RA:4pu&@{%wƸ(耰eD0gIC)5TpMyD2L mhSb| +׃0.C2dV UD&P,"PE`I%028AiBlas(j85GM*MM?o|1#Qc]p b]}~wsL.]x;nRbmXMpE|xk63UO:@މCydպZ^О7L۩D:"K5?47ql<|ir84? ,*CaA۪obvVoa +<suO K24MP/oa 94HV.Yw\϶_^> Fpn qPNB7Ogt8R8S+DQ 6gh(gr{+.͘Gy2G 4#Qv 3=2xxR!ի`rUh 0I M +5[Z>*^++j/ϟ[i1J1OJjL*&^@@ Ue F = BAr]f] % Rbo^5ID/%i8X|YQFhJ$V;dIhB9;-^w7[Hd9QVQfL~{QD>^`@^h_\!V$!*qQ\Xv]PT\:`8 6}G"y 0أF +QRJTZ:Y[<)$K{fKn'Uw$=B&M$tĵbN~, ЕUyFjqmwc9+"uXA`(7xGmPJ~L3^BlgWHN%vR ,$߯'"cZw|oAyd@_z-E 鸸ǽxw) |b"!"YkA7vpi:"!bVz[NEkO2饲$qTb@5"^c3MP3 +u,mtq퀺\s eTkH.CS2dǟܭڝᕆf ɾobU0{D ʛzXuoL?I|wT"VY/a{8?+u r tV4("3rL1po !r(y5+8$mJE{Ʒ˷{i`{!h+qԅDt١ڔɠhlaǦKm!W :xӧ7ٰv|Ar2@v |4y$ 12Ȩ~1½Bv='9_OFj>D(6ETmQ/ChnDĈJH#}9s| ]19aS~7 @|}3ZK +ҟ׼#g¶8ѝ&f+ǟyz!_"tN!`J1!Be] >d$Mc{x&v*2 ,6rI=#S$ / -Bv7~{nBa'_ 0voeDx548)A.q812.l[i? +8.A'Vy>k-89tX=~I%p$4GޱBni9gfo'W{*pFj%|HF Ιedzh*sSydy!EBHD`.HsA9XCblDN)k(nE5V࿇vg>2c鱂۳RZNs܄$KWP[ keZBo`ck#-0&_1l\ɷ +f/} pX#KdjK-`hZ"EBc@(Vvdb3kG lN^ ctA>ŻKwNVB&>hTw1}Sn'"JR{ VLJq*!owWegE{VџC( $!,52ρ<)[ZB +u .5DR"F轙@@n'JwA< $,w@z 5J*[2 >JIZ,PM?b;cDw.8 Me>8!-V[0|*3t4)@!޺M,MEA:?h"0J/#27 ,Db\?b1ҭ4[k.X4PfPT +3Vd= +y4i9pRfH3b@iȠX U=e=tjxNF?ô&Cތ!2Y:^Vx=Dש-.[o=P]QF`{f-9+s\[V$ +2*==6ݼ= `QIHOeII8IuݸR 3'<gn@[K#@ )iV nU.q p-[$GTaL5s ХՒ>^`y>s-2Hv#(8j~IxYR ꦊ@$ EAt)Q[OtS" Od>@ɇue\<TJUy +B#ZA:Z~tl!!=H$fR +ȽQE[C=u}dxcLxrŬs5FJj^.gQ)iEi:vI_ ђEX_;jZ%݆^y]a@-m4EBY'Jl.Gw}DNSʃD@J_؏<<>Z%.b4Aֵ: z]ٽDrG֨wZP@^-5 + ]J",mE| `H;E +M^iagӉ o[C;}X.?4)1<bR6̣SD +]@v Br.ӴAPƪE$R%nn +B`)o}ѭXD1]Xh /~ E*b< T=Ю,i9"0uBs`cHʃ@I62v_|qWN'bG- _{-+q~b`-rfPI!͎=gmCU#-*gn\B<+I#1vsI*WwꨄGA9}/X#]X8S`8xf K'TH'X +=.VE;g/⃒\ȯ'={QYG<o]JUs +kۑلYZt $s$yP5/!"sp!u#\P"Pj"0ZNWe9Юtngy),FaRrݘ3)k+OƳ*X%)n񉅫cو`Qdz6A1RDAǧWE@AXŖ3d[ N}>;JKJ@^ VD2j \%k\D+fvJC.MWߧ"ܩ-nĈJ}PV^㴃KrhY=c'u9AKPh^HWتP(yXz~/~#AJO#2Ѵ{DDIoftLi8¡Ssą(e)5NVX-hyx$lk q`Yb95AX-]]X&Ш<<es@d|% cVѼ~o?589zЫ,{3~ daX +k470wg>l١`m&l[9 "k Pv Gp)hDۃ` +%?sf2{-ч@rZfI@ + 9J +p$ 1iXndډMZLL$.zIH>O>toE*`+{x | tu-f@D +.ѺEZ[7h`<[0:NNpz_4^Fai!504B/"ԵcPI: +2OD֖ x%qJw{ + EG!{/G~E BRK`@AVvt q1[É (v9w%WbF؛#!<+~McuI ۋ,x&5PD졊* f.]{5UeDoJP@-`"f3)"C!dA;aJ%tNW]h!Rk%@Pv+E`YtP-a=i54̊KH9y2IrErWFf8+6=Mx*CG@.RwYY +{ 1=# /heRHXW#ST?R;㒦h,7Dc!wC^7|$ 8>y.h6zL u]t(eiugH&MU uhI&ѵh7HU}4e!VC(/Q^ה-m/P݃xJ7ف^Eݷ9t"S2;x-o>.^%tVzQC4b[ŠBX(jArжͅnl K\J5 b4 +"0M +YT85A<؋ݖ.k*#";ymsfmfdZG<Ĉ'C$/y|!YrtwCHӆ{VY@<@n?Y;GZƠ-桽Ug g˨y)6ƶDoUSq7D.9VB7::]ܫ\ &p.8ţLPnZMUl?-Uy,j0' +|w+䢣L3L~w3h4el5?dYmEB&lē I?6 Fn?GKI7[6ѭW(",ꚣ 8$4"wf;UHD&T36 +ZjFh!eVRQŽbLcnѡh)>7;MGv3Cr/dJoRi2~D6kmPaVVhE_x:oRd(,h-Z䟊HَEs'yn.a ETgV +3Ȃ7ƱZe +݉UkΩX_^"Z)%:Gk(j %"1eOcBJ{?s{Ä-+]i>pM,t}rc5եZ!(p_ ?jl!g-U@KԬ4A2ްHTOEF`$7Wrcwa)ș$@/6 H(G#W[xn?Td.F9d`)ORfqɦݼ(V|!4ԋB DMWNT H"Kf\Ɯn CKn׎.E>K )BY8zW$GՕ3^ي+bF.-fNs2 8[*LKۍ`{>4 +}ځ%XQX,@,[7`X0k`,2*bʓx[h>ˢsĎRn>+2@ސvp_kʢMYcGQGCxk&{mkjdJX^˗p$1c=Cʭ ?m eE{荶+bS^\3GYs94BK*.2 +%펻0P16*3صD"`1`f9ߏN!(t^Wc>$`(`À"C&޾*Y (2:^YxEitI+R[G+,=[T{G?RK!-L7ϴ٨&'DR9 DxF)s ,F)]z>}/'՘5U|Y^p1y@^d7=Z]*&"V+$QӋ.& r< g, 83!jaQv$&Pm yd +_Ay^NC,W(^CCl!8> hOc"ކH Pha2!VS9'ɣ֮\2r\b"D1vV+#FP0r ,Ni\Y >hHr)H#w5-ҬM#.:g1{@?ň'-|<)8.kpcp}a~xUV GVa3uQKȠJqEЪ~:Mj#6CGiYYJ{fD\rbABrĢ=To5G%x>Eͥ_ +c܋ HGN!0+#%ur`Ii)bW5@B:cx.fC[䌡[8_JÀͭ"P^m)(\Y箂0mgS7*3f( l؍KeN dB1݅nG#\>g I?pX!f}Gy`#HI~ǿh+zekTV5z.m@^%ҴX(FN[B)@(v$LhpB&zH3WnLmʐK b-%)t,&9~Ubq Wquw\D 'Yc06Gr+  E =[f"& _s|&1O3 +1>I +Rgr$@G1Ԃ@7T9᜔`-#B)#pLv(_<}z ?9>! _* +N B6U"'& yi|k8Z~QYY8p. |`!VHnUXtSkFRl!R_gZwň[ cf98ge)h^l';}okA6}i#Ogͳp%uww=2S8X'n 08= آţ"a>6xWZGwN}8=n|h~( +가ˢl'+j{{ 4~ xGX+1VZݠ-ȌY ~"="T `G6ece9ОոFE.l;MaiQ۬8J r#N0iU9f~qvĻc$[/&}[|E :GhPs*;s VV.D9U|@uV 8 %*H$g֛3ެ:~1lKeӉa˟nb9Ӥ\A`:"sl!o?E>% +0P#fkG<1(4(;w:_?'4 +/a`W9v<uOM2QTpE~ @L^? MS~UtYQo(Ǖ(@5Ny `S^X,U/B(ᶛ*AIR=C<'a w e [v.tz"v) +6h#?PSlo5REmǃ/q2\So{@7CC ڮz%&;a2笶F:8!LU6x.]E:7(P+FBe5 WR U]a?Nkm3 mؕ=d(EhS`0)* $/m,\(E8*Wu#f @0Wv^\Q~ǮrATs ;z.hlT +C- ح݂9v|N")5wܴuz*&H(,#[]+(:Ee@3ܿ,%@JVE.`Xe9ٶƛ}%P%FոEx5mks8D6RI,(_pFƏ +ۑ<@=0BF/[(J:bjК_bԥ8B<-절tJ)pb~TS +z +٪_ƄXʅ& Lmg!V hwҩX+ A>ic($%>"5$y.ff@ڛ@]`qj؟@$wqVc`;i KhR^2^TIXCz\]m5c}U>Кr'ԑ/& +ΪQ0k l!cJ;eE +EkKLa=$IAL(DY@ߜ.G X. zyj(Ro^* +&RbUdjd bb5` tADxxߢJ Z,çiz,?wV`,dkU;La 危^S+R: ޜ 9<=yc҂JV6a{8 +ůHJee*-Ԥ㺣s$pFjчۺs~&Or8s#R haC}H-N4&!i'=q +S|EBZt ʅ_YFwncts^c>'K-be&mcxݲ*+|3/: CFQ ŢwAb8byֱClPQz,V>9xD_q:B9,/f- D_?3#^@dX rmQ`9v" E֍=wwT^vwGE(zFtO4 iC?;LX!$1zsGKâ/1{LA ULgT)܅xdH.=HxN=MRPPIiPIQMIdfX05Z4c!q*3JoRM k䟳'Nu^"`(e E8)ixn$b& +߂yǽ<~x}@XqH#c҂8P9νJJ=C1\{ui]`F"<23-Q{^ +zƨ CcZy- RrL:Ao ‘w̶/38FE1D`3a>q]a 2X^is!e_,%I0Y9 5V>Cy\$g(6(n"v\D-o.NAwX#w[3B{g/o"WxU6 ?RmT=3l=He1T&kdlhd1sQ8MY˫$^"l]p?nih Y5ǻ;Ut, +dLM 7<#fp؅TοQGRyyP~`BnȳX D262 "CjhyD]%Ť*%q-w]{]0]^E;:CCR};7{#iW V`V=X^\(t-&NfJr *0)T>m[ctVYpULCT ѼEC!'DR(_s]k li@ AK o'HNS|x+:тqǗ 4k{jQ.N C-V&$Dȟ끄J=Wbôˡ SёF)yabtAB|W` +}i CZ硈r&Đ y> =fgЋ~VǸKaeT +Zq5"OUw:`/]>5^;je:&@yvŪ*1q>g^\qP-25ۺ?mw& C^]5 968:}D U|_+,}h}8#RND +f~Bڿ>+6矈%i`%VQgxj_o}v'Hi\Wj*Q;E_HkqƶN_H|5R.nMHoi ^b,w r E7 (o/FΠH6?rFcKw2)ėu2 mgCxdcւ**́@bcqfn՘-N{ ظ""cz&4A +>bi(n&q`\,0\ҠF*@ )YxXhkFq& 4u:楝 |?{4=.o.*Ta8?n@]b}ƌq;+VƣFds;gCzYp4+)ɏgOh |Z9Wd_јZUfʶ]#.ԁ(#i %#"[Gybf0d٦ +Eu\boRCH2n/lb:v`[uUW$?@[q4Ph } ųI_;..ufS4]H˛d*^Ywdx {d?/O/,'asZ02p ߩ9sl_[Z_WvEGȦ]EJǚ=8b&\"鬄(>r)3K;v#͛p%4c?1%fmNKl(f|)ZU֪^)HD/HHB&Zn '+sy,Kݛ_{gJWb֓57銐a`^:I ^dK(f؝сm[$ tQ×-ROz4zE̡T"VKcZEYcGixxW|rr"8CJEګGF1{#."x< +J]?"?8Xxq<ZI"*5Gh2ߏ*f%CR*)0?O1?{]%]hyy0$ ԡ8>G2'E_*O%P +å\X +J`~ㄭ;Kdh#Y#2%9cMe!ٳ8^|8Odwx_!;4#7ka:{, yI ~5(dy%j':s?<*/D=`4CY$-܂gCѸz J +5.!`|q&_[PVu  &QV6T ITGD,w}JJqBR@cv2jm YQ%*^L DN(${> ~2 sMUzHq\s=CyKHIGjKI*o#Hj?(9@APetxD35<k5оRDz3a?łvm}AՉDh]aЍѩݼ+\6y7/4=@e"ҿڍBs@RC-4&1Qzv@^%0L?t)لso=G\fZxF;Xl{OCy֎$:E? ?3W9|~}ETt3ѯ@Q\|1 j^оw- +spD/?_}R6vG^}0ntoZ(fVؖ<x.nTg_YPߪ\ P? 'r9c_: ۄCB@‡rԇi<-j/qIx| !,I2!"[k a sƞڐ^=ggT^أ(hxg &@H&NHMNd+U/ +-Ѓ3&DT9 +o*2Wr8Y#S5V\t +p-]MajCp1::A?#vl0Pz@`$@]P*%o>d\`WĀ]-yL0VM? &Yó +_CK.^lE_хzVte셺 D8Pv$u }ڸ Q53w!ȳ10Q2ڌ2@0AY(7*UsJCyC5]!2[&tQe1A{q.D@UPN0/ϑ}GvV4< FJD6};yE:$.)z=>H/; 8*iݒ>VMt}7 +Rv3UX%$-bi[af`b m~?;FymG![+IO|${^xҬ38TU -kg +d1ElG^YI^UU@ZB_,,ߘc8mm [vLBHV7!rĵbHΐ/+Fbg_>Lp8yF "eW#Ag?AL!Z X`$Ҋi]&m;4!j>!P*vIp&{!TS@T{eԩU24̬Ў`5# +5g ic#U{6]ltFR-CׄqMպwH;bTxxDKq /ݺ1~ZRQܚW{ZգuMK5.̋*C#=J=anY)|яizR*/?MNzA tM/RX΃'PtEa.}Ax;#Kې\B` ]%VY1R԰YYA;ҢY) +ԩ *v\c6xps𝜺aBK_,2 %6rvzd'|ӠD"dm_>~h$ .JϘR9Z# +bsx:C#g#a+콵1<;QYt& &(.f o񪩀V(8ckVH1cA% a6J5VE:\ oBK[ծ/jy`(#lp+?pyc-%H;b'/>xga']WVE/2镀#PdC;m-kUd@tm)=8;GgY}5bV Y@Y=>4SyVkvw<) $~VFfxDa2vdgsIH5;! +&3ش5Nu!^73Zzs~QкEQ{mև<9ܡu\ ]߃Kޥxޠ| +tE7t K'`B `9EO-]Oo V5`n{;zeJ^+[q([ux @ +픜|w[~D9l4'k +S" + _TlF6oת%%֭i@wHzi^FC5v_Xo7 Ć}:c54A3 ~]֓D֌c.uHО9B=Ygd@͏/\9H^Gky!䴌L ]W-E^!jRC딃\ҹZI `1*1sJ|Іm$tB}8/e3q'-a6zEXP42_.]3lZMzհ؅vKDE|绉i񀍭JaNKsbEj\/%vH&g >FG9);cxY{F8Lڽ5-[<+wOT|́Goyow5& ua(3B)3B>ݝY; +OPzpa^S(N|,wny^n!}ΚF˵v*KEb?Hxl4vu-luPzLw88пr #U8DHN94s 0U .$7eaZU^sZeI":eb*(;*DEX&藅PsR)U!!m9#*sa H@B b KVE LjтHO\x,S- +P:vMK"Ct|.tYDbEZ ɁƢQ̷pұ r!&Y8$}CbVfT$&_a"N+*J)G/4NԘJeH +欈2B.diLBĨ$pb35"#"T|> +Ȩv:iT@_?C x XaRcFMa)) W~B1/jT]a9j慯ț _vKuBIJ!7J `VdZaװTbXkacf2Eq((*D:N+BZPC'$W5+QM>Ra[Di yU``'(*]1A*,# `kT@oű FhJ#:NI k1qe,\y6>@/ (%C+^eFv-żqBhmVx!!df"4IH"4ZFߌi],yLڦh^EIit ҄4QQ|CGNT/2U#q""YeRުmE#،jl>Qu-05(rXDLHn9uLeupRH0uzFSRx^ }x 9Ҕ^G|"7siy|R>NCMT +YPHь(6#%SD":wF@Hh!j tU3Oe` `lPnMT5Mıck聪*!x{bJ9dgHuj0z&T "cZ=m&fe៻TtypyjK jږCK#C%S>Dμ [fԦrED@B8*%%R ^p˯ +b +P5jZbt+a?-uDS,bOL>WQØ@=k"B!J(2Ub>JI\!''|˪ mc+"!&!Rѩw@ +*`B)5Fy)|I  Kf+ޮ?SX1% LUmL EU4tC33L8da)C;>*X;z1E{&((d^i5BOqDD PP/9iAUixviq*::4fWfa((Z)O4~RC!%B(<S0CG&FiqzE$˻WKТ0WfXqH 9Z'᫷v Mu0 TĘXGMRHZہ(!_UA'hZ-\ >է5)W$M̰8J.7CN@S,]-]-Pt wIQbb㔘pF*zt99%:)CY #"1R=+gSqٔ@ . 98he:UJW̴w+Sta NT 1+EDP +kD@I,t (kD(w壙MtFWm(/O&CÒD=@)Dil4 /#لn:PE#P:Z }NM=!VLqrh }TI]E &4zD i%5T P'Zc! CT]Q*bUB&rJ"5r*4gfˆ5Њ +z È~1TE[ .3\PquVA^ Y$PrُTd3EBa:dBkRLb1 l@R \iA"`)jwHSP3ATxb*36傂`($=*4frt8QgP&ŔBWGFU7!6qipU&5q3#JN{,22)c?$\82:7 +aza` mľ\6 Lxٟ1km "\@ +r0cL"ڦgfA`1:\9`jx)88<UpF0D4l ҪL 4R$|o'b U8`ba}%1NA+1(҆*f* +,qor@Z^I]EHQA4!$%z$FlVAU3]*U +jCS.2(LR@lraKѢuT!Eh8XVU% V22"+4b,s"4>۱:Sn4d3='UKcU"-/=|#pd T?@1\:Z9"3*;%@ȌȔ2 +h!uYC X)q‹OrFGQq1U" " օod5%PlYܡq56PtR P0e."{ I0xl3GIMM`dڐ(P1}%"A\ZDpL*$>!6SbGuX \6!`,~y" Uę${V4ƛd男i4em2@2Ra^f)#sć@qR(P;^BYMT=Q +*Rzt#LX$$L 5aquG YDXebEN؇L5vd46@ +9)TkԢJ@H:MA̲f9.ӊ?"!l$3"PjtrYJ:-M8g&k1$PQ@hW  EŚ"L|ȞEH.ȅS7ƭK/K 3򅊓jU6u[m !0^0 +0p=F10:48-0i_BĒ eՑ6Jqk01-?U_'q"d2 e FΈ*J`$v Q45d(+J4Pʳ@rdn\yh p0G $3=84 +Ke+qUg!tp /=%. 퇦 .lZ^WT7Bi㵇\ s _2Go`LLhW%mU`ZU4NrQx,RSXOcm$`2yy O ?ltЎKTܮ6,W tH`;~ڻ/tbXžӅe .h4sIfQ2&J +gez\oUB*uUw[Y: bbה/`NC&ehlP %zɅSARZ8Ϗ;ksyyqOK<1Q-ݚkdp(:^~6٧&;b-nH!V}{;0AZ~) +M&0)x43k_S+̑E#Gr~f TTQ´#"ZK&Ѵx-4(lШ AHcC>TbW#xAYG*!$yĹ@AqYV2}{SFꞮ8 =H̃uS!E|};| r)+y۞np% VU`Ϡ\Ph"3s'0g4uN%O,#j v|haij<+ތ1̠dPhMs 5@(1Yd7*W V'zL /'F, ,ܰ4 +xتstʃTdD1?&n ڒlL2Ԓ!ݩHTxJOL͢%CԜ%@TXT: 1$(0網f`a^Dז;?o5wߦh-W.kO}'y,-aAL;LQ2X]o53(ggp(ܫe1C&3I0-'Ѕr$ :U# +q%9+䠰#4]UynhF;xeP[hE +\mF`h&@0׭<ӌ!c +OnZ{+:r(v> J5yZC#qa4Ggm#/?ȓXj`.S֙( Ca~'4+;yOSjmt6Pw,XIˆ 1x1%(/ 11<:= r)0VWmc]~kyithkoh^6^p< ,Gvi}2]"E1\4Kdx\ ?dN(ʑF)$ JI¡#.u@&S,PZN-r@bW7!pػ 0X{Vc$KPB:bBP8t30ƀ[+ Xȵ+' +=$sSlU0!TMSVh.r +'xн^ c6/Ҵ4:w& +5k+ UXvo-A2_LH7n7Y2Jr$ +oˢ(e6R_sZFKrVY 7,*Ak.BBB@*8F۫yrYAGn`"=:\W(aY{mN)xz5y uBw8~LdP eOG=vџ? @͛vQf;B!Jݮ2[h3.ôV +"$;~e^^]Y͕"%2oUr4e27L*hyb1-~FDjL#${C@(Y͓LB=%Wtͺ @YwB<>*J#2Ƕ#*]yujW9)jp^ݰ|XPߝDu+2V)X: xXr0Gؚy҄_Y‘3NTAa$_`$%u040tWIHy87` +ICA=ىT5Wb49]t>am9M;9O]ԍQkV]l?+H!wɸ_XG #m$ (@WsȜ[BqJ*aX`^T Fx +qDU0e@Ngh&Q}>F[z> +Fs3Xg + 64f< pPҋ^w~oZ嫲@rNnw`g@0):jGz`.ؒiy{Ù"j131JEJF* %ƽIaAx!.V`xSpXxǛ +6)+v(#`%;!彎ҥ7og !/TN87hJQ BPlH^s7?P 9^_B&z_[>L3vB*3$D9v TuD0?nw?C 8 +UfBA1F1k7OU2Y+9>9&7'UFtrʓ" Ypq ,3Nm+2a( J R_8 ~MHR0/T-X Zufv )*H}5+xI"$I^kl6 +d(B;4z d]1hGo*.uq+Bqte1'7+$xzʡ(]3;Ӯe,E/: = w + +X hT c3u۷CF\&T~xvEUwP$\굑UGD\jLLWgOLg?ZO4YM騺< +r1 D%28>] uKzJLqf oQ08] GM@\Y@I(VTKuPLSaƄ +QsI\FvŇMV;n=^\c$+ ')pi@yn+ ؈;o^3KxȺ&m7u/Εcޫˠfl*F\ڄ tS E;;DI,1wuRAN+1,sҷ_^ɡ@In.}Kq.qF*C܈nt"h(Rb.ʡVi=㽟'V j2y4֞Fx@՞w\֨^ǍHnTH3VJ3 _0 +&IХػ* "=%v2zAu|h +##Dѻy~A+o7'5@γe#jOQC9NO_Aߙ`^sBH_ֲ| +Ggb-~bd qIdviB|Gߟ?5A+lGΣ_ET#wP mj[=G/Kd٣BSPPzVeXo9".k}(3n1X ?0RFtVdcBo9ȣPe +դy|Ǭ8ms f3e⿥Sƨ)Q UN%xD,U% ʫD.&:eFhӧu:7#':;Vx6s( rF)Wi +8CnLZbHS 1wh߷)r Ihez:!J]O#&>^\WK*SFDJ$fR6J!]Q+rY qӰ˘ +@On%'nBa@ob _Q)*M"LqnZC@"ѕ~=hh4z$0҂BPgƑR=y$8>Xbąb"VĠOw;|`A7fy2 !pI~9߻;-Ekq])G;!3  #S!|&F֖e]`@8eus\$:fHBt +1tDq<ZU ̅"qkQ֥ bX㐮˗[d#Aev.c䈈8/(kc:sHݽ4? ,B}A"- +B*-P!TЬ2 Qnxl6kq9H99F tLia,CpУB7'ԑ;QD~:F7y#1ĊT9'~Q7Չbgz@ ^"jÎJʅbRpFؠxaeo} +蠮`|#ڙDl`'S)PjD=^Dk^7|4YyqĞ}%.trskt*f'{" \DȈ~e-d$ +\}j>͐sl]G'{8_S m\,!)%Bt+XqqM+MSIOV;4τŠ5*T洢I>햚g;A9Zu QD"Xwg 23޶҇$ Do34ħE(`N}\7ĄLFEaLc#Es z:VJ-W IBnKNPxTw]aE/"4z(:ٯ`-7b97 ͈< + ~= h@iGo,drIS)f.Y4BJ3o "Oša,cwkH01YZ/aD(@h!k̃[ei v +꡼<L lk#J9폨+Nah +/v0t^.9of*`=^ըRnD˴!(^$>ga1TJmHu\ !I8X: 3&26 %/yi/bʄ$37\ D3+`f]juZCdd6$Hpu`FUDh/me Hr(cb +^hfy.)f̆DȞ<(Vkn +{$KYٯ@7BR#iܶ:]_= +tk%hh_#dST`0* 1n/ e='w%[2 k >Q#t>ThrmH :4XU O4\7adb`iS[͔#]fQ뽗xhr[/P* EX'nFuCsR?YYRvDx{?f# ԋiӹ]W(w@$D6a4B1Ef +E)~|LuO2ƍzG+܋K;ŚP S&y /7A=`¯|H6kdgH8vh[H&$B3HGY-Y*_G;0rxp08Ǜ@Ԕ[bdqq}65u@W^Gp- +NUR褦؆ @[}+4 +jw݅zg GijMhx:k`p"5ѕ7 ˺ ]ڀ}U ?2FPQe5|7F2!|7܏W`BѰ#cWjRcrB  +@13rMPnj$dPEAn+sQ+ )emZ+"Pۿp"73$UPQHQS;wdNɅ٨#,p1(re!jj5(DHy}"sd[L邼hҎ |rUuVq}ށDFXJhrrI҅ +YZjrX +֨+d fSFw^ʗ1㕁%ozjؗs BH5Fe 9CGD~JMSH,:5p@w"<؍g +vloS%ABaZ,WHHeZ۟[ԂV͞'1CQ0a@U.6 {[GX-P +Bݑdӿ$@0pj> b4뀩D%Ca0*))x)#*u!RҸ9_Z;w"",H]c gvZ`]s_6Y a/pO)*d,L9`笰]+P8Os1͚J EV\Gq̗iTøRj>!j r72Į tjo{g+QqZroPdl 'KuO+Sh-=,`*ˇ.-s+'[/1)d2T^.fh@J7`A-ܒJNq1]d@ +#c"l1ɂvytJw!Ϲ>{6d҉7~L8( l6a$gDDSfF5y5L/g̳@~~K!ATS&\QS#eķ8t"/3&@adFfEY+@p ]ג(E? fD߰ +Qt$Kr?X:o#y[CH}p掇9AD9ja?&W3gTA7G7Θި [$ sx~M"Q KBLgAFnϡ>ڼ'a2grUI2o/Y {AGslr0kfEm{P_Aٕ)ezn.jWzq, nH,XqyG^ĞkZjұ![7@][4_yU2+$-2Q{*8qB-DžW zcxkYc u5+U;ٚ^F\$dz:̥FL&]lj1/aÚyEʼnֶ=>Xů#n)jq4ՙ#S8'*[' +grLC0! ?,/· ؋W]2 H#\ŋ,wP>yэ~KGA  qŁ/%=uF\ kĢyԌ`@ʀ +L2Ũlc[Bf_)kL ++C+=FpL[V)r"@>/l6ؙiXב/ʂ_"4\A [ո8K֮r*NP|Z농/':s<?uXuHDe50آ?y#1bv{z^Rc6@^4<9`b6vwu Ra92~ 2vYCWzn.Gö@pCvK].-p[;xUbvU% +;D8XĒ9$s,{4X +,FUǢutűiNe4~,*4afO38פ-/cu5n +i*P} ;YƢCm [S +x'0,Ƈ +Rvb&aN ΂ϳШ V"(VO!rZ3ҳ3e7mai\'E6F݌aٓA +ͱ +lʇE Zpoşdw Mp%*gs"pOL( #:Ip=2BAY"F"[<m wICpAE]RQn7ew>v+A=oS%>cґ@pEPp$ {x*d0""uZ@EIku+5 +s0U=V?* 4-r9 +݅j Bēb1MԺO(V;$BÃayB:ە[L@+'vK SQߪ1ؐ w9M6Eϔl 6f3P^3CW7gq*";L +׀3 |Z 7g_sEEF9"I5\MM`J0 +,efȵU;!(, erBXesz4enw'/VUhve?q7vHwX]Yޅs[!Pai frc( +#/sOsP a^ +a +b#ka9)~!1@Y\#آоFmȑ.Oa1 <0rv83<3eL,S9;FB]Ĕ!$Ppfi)MH8ZhPdQHMEg,| rjMɬ~J>)nRd$0p_R8 o !C[#g;od6S <ʹ1Px\DxѠYҖBx}T`uQEgd.IvZ,)/3Y@@i5gҢl";yn CZR@֓{PDL`Ra(@[B+`@28u ]ܒEdF83J܂ N%?K5hD]+ӓ 1|Dp#I$[pR5 6 U& HM# +>,@2CX7yv V[w(jq!U ,! +4{A4BP_]bW"mypsv0B)ȟ]@0) P l `șa!p$Un!x& Nz݊a)wrg_ Cn{\\>1s$EdfC +ͨ#Jw1D7w9kΏu]c&(*qU0drwE4"J ˪>*?6`K2+ƴ]]vK -s"bYҮ$)H]'kwK>dٸRv1icDP^@*7(2[HDg3S +oe jPL*|gẁ*xKkF%Eyt}HP;F'm8g1 +Cvz Hί p(n$'I^pam=o {c$ Q 56эE PI6p|S-wKdB@~FX8 VVm[Ӣ=!{Ilį9PW˺5r7Ie|pѦ@Bՙ.@VLDm Խ, wGF +=IEls*hk++/;$ +.y@2qۘ4Rj6$]8/uT4"K4*շD$adzUů?}E LcWr + EFйÏDUp{Q8O-W7R +C.fn?jL\A9yX̙4;TDAh7NJ[[ ^ʢqxS,ʀ)5 )gCgBD" endstream endobj 15 0 obj <>stream + 33,' >GcPAJ;ɠ\ՅEJb\R ʵ&= PiPwX nf>/ NRsS2|LV'-16ɾͼm7v.:f앨VcN[z7s+uauU[wm˵]aK&ި(7eims%]LQ[묛sDEn'mȫ@0YӪtgΦ=CL_4HTpEC +O +Hb@ Iy5M |5~zS`<x$8Źl%II +Ri D@" @S0QŒRHB g c$ΆؒOh3j/cE=vֱdTNi2ⱑ"ϓ)Qn&\AHݡ5p`KS΃2ddLY+dx1;hw>%u78|k?htlj)" QPuOq8Pûo>stream +85$EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 26 0 obj <> endobj 27 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 35 0 obj [/View/Design] endobj 36 0 obj <>>> endobj 24 0 obj <> endobj 25 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <>stream +HKVkTTߝa@ey{ +E +!@|(Dg*( QP4ՈIiҕ,ӬMTʤ$؆hZMk"4]Y5iwEW~q}9۾vÂz"!uCw[OgU~- Uʆ]}j9*=[孍[pSG:-_?LNe]1cy-~˶ m{M&vC-Fy/{gێp4h1ֿ1E(U+^V/e-$&YE(x ±c%K1O˕cRϩhs)SXP I䏖bMɲk/цh`&bb}&#$ ޝH iHG2A nd#Lt@.򐏙(B";(A)P +T +s5<ԡ  ш%X&,r4wbV Va55Xuhe!%N+ ~NU?<\[ .^؎`e1قGGzߖv(N zorM܅ U: <Sx/` ؊mle|MZц[a=ڱ s~(~G@x /EEv⛲RZVɝd\F;<)Lk-A%])W^U*w-[ZNZ$5MR]G-TuϴDͥyⲹ&\NW+˕juuwGOpTgR e,i#p2tsD5EPUsٷRoΑ$~/<~7|9NH ^W3~dt0rfȳ#OFD=|loZKCCB+C+B-e%ڐ'49{H֎l?WV]; +L MlTbi%*;e^ک̍$uW}U}SgjAl8r< nj9a| ( MD J 2s[֭j"WeW^O~AjkXs7:>] ٻKiv|sj~>z]1w7Xrd6t­5P5{f63T/-^95Rugtᛉ8?Adm&1N5mCu:bsƒ%SIN*yCIN*I%9$'䤒TJrRIN*I%9ax8KM\%>&Ɣ䤒`33) gEY3)NjssW6>Y[{(,7-="rʑafh@g]SGeCwxʱ 8~9=tYb4n;!?Ў]FAۡ`d;f'%Qk͙$3+k^w +E3X=gf=;\~w:$ _I:K aZT#Y>30]]moߺO.Sgʺx-z鮳Lvrbym}BTjS>+=\&uOjrgny=4FLs03lTUH6 EK|@!>">&/''DUYYrկ1?ո\݃q5O襫tK-I$ݒtK-I$ݒtK-I$ݒtK-I$Ҧ[tK-M BUVX\ +p*UW\ *UW2^YX5ӉtbHM +S]V:QuenVuVTv7Zj.D~UX;icPߣl75_oqfuE//uov=3Q48Q"pE(G8Q"p(:0xtǮ鉚rI\h<"x!"xh:_  :R5 7gV 4dАAC 4dАAC 4dАAC !4dwG5Geݻ FMݟF|a}Mi)P"DB %J$H(P"D| %J$H(i(鵵)QPDA% +J((QPDA% +J(K۵$1ao ҵ>>jnwtD~SSNE2"t-{qFf4[r!4w. +UVW] +t*U@W] +t*U +kiZڸ$BKH! $@H! $@H! $V! $@Hb Iq+؛vgnO^l&7ō,lK O0re~buVo]ɲo/k zӚ\X]9.aN*A-wwQ [R;1=1'vy]:rcu+O!E|Fʹˉa,ۧVNCar.^Z/uzs\KKqЗ[ +ި iR-R-R-R-R-R-RXo)8Kao-1lAZ)c(z[^p=lniZGsG&zD3=Q'-u(CyP^:סu(CyP^:סn)[a{j9 W)Gs!?s!?sys!?ܒFe-]墛Eki]_;KZAϋfsc݊镍i{7t>sWdsyY _Vyvesee|ћz{fsi:XGy&u5 -٤=iE^ӁVtJ(tJ(tJ<$@P:J͡kñttMwu6GXpFtu7}sTDcuy U~8q|n)|jЧ}jЧ}jЧ}jЧ}jЧ}jЧ}jз5AE9A +h_tNG}9rۦՎ>Gi2DAp?;8GUcƎ]9:aw[ɞzkjyZ'mN[rq'>q'>q'>q'>q'> 888\ Ti6Pn7X ʦ}--mntWKuc}wg4jWr^.йzm[.꽕+)c^:1UIlm4h#txjm5cb%5cy֕@mUq#f 8 ~~~ ΁7#**`ܚ̤=&9v1]SٽqYxJ7nવ<Ѱ"XOӹֳ]ِ,.s3:IݧΦ];[=6:pI|;xeL9->&CjExFf5 Yxk^,f5 Yxk^lk65 z՛+v9aeY|J)T+3?W|Hؕz^ˤEkWxeqg˷ƪf}u3i-T~ʯMk>rx[]R:g܈d]Hv!مd]Hv!مd]Hv!مd]Hv!ٍHv#KoF/I^e⴩9Y.togՊʲ +Ϋ}ݶئXye_u~+Ië@Y~'j/B35 N d:aGTUN4ٯJec` HY|tubh~-!(ԧ-} i?jפIa.$u݈ۣ?.(q/A e,|~GŲ +lǜf|QV.=!nv[H-sn +oSΰ$=dk8iu/ZڪXOm4MOٝrIb{uAK(~:mR0e eMVlc-=62` :L\.:ḍGoK^y=`0h7( y5~<޷'Ls[7}ҫ}SY A _c||8/g+}+VxOA\KƌUCgm||nBh\uRh<I)/+,1kqK-7sUM'ZbFV?Be&&&lK%_NJ|JթS=i>zVNWH,<9ՠq^O]Zpؓ0# eiŒ}K6i?i]rKGa:&Mmat.vnj5q[˒~yL2%qi97NYdz.'3MeyTI3O-.=vJbyǎcg05wqdVҚ?I)i3{DD#ZOVq~]}uj#=&ޔAm9Iis{ؔO5jӆqSG{LS?x.L1G)`I +^;q[SZ\{ʽůk=+fp.Sǒ/UM5 G!)ma^)lkK(9riɉwq\\[WgHDM%zeo ˯N1xO\]\XfGMͻSalI5\L%R endstream endobj 39 0 obj <> endobj 42 0 obj <>stream +HKWktT97@fL ΐɋȃ4HBxa&<@@ V/S*ZҖ6QV\j"Df +XSjkY {dE +;sswٳwVښajM˺{vX 4^oK]C[O{w@oG^rtގ)Ͻ 0yM||wt@U˚ϛ={^lE$v%aq!4XpN_8T yV=̬ 5..qUxmOM'$q :|Jb!!և!Q=1E3 Q +a&(B1@)Gb Ta&fa6TyC=|,4`!a1 ؇x?/q ^o1:pom${>>O86< ؈-X8'alV +eօX{v&Nn\|n߲IN-UN'r|P%JQJd*ܪ[hkbMVY'/j׸ƨjZiwY>2YzĖ>´bMv}8n)80Ä Bdb(aJ/HL#I&)QʓJCZ"m'L,쳜\\CDYa*/L SSS$aB@a"L M׆OG;NNg5ͻ] ++ߴ$[-&_]] +=]m'1;Vˢ97A}zFZp1bg?=Eݯxzx=%u|tRw{{=]NqgXքlm + + KWoi|;ڟ<|;{vc9VjЍ-;.[3b(b.ӻU!* Q%v3bhM8+OorR_VhNe.h}4r=@O>gkQtZ}go]0~L6򤣔E㒌:Z\YbMt$JHg9d+컓Ȓ]wR_oW\epGq:>M +J-DJ}_nv;̊"Wkrp,Ht3.s0ŬHBK ӯנiv>p@Y`{_3w +QN>^A)~=áS> ᰻a8=ÑsaefF3 G}rS= +?Gy=,Q*4@w RqƒAwQz2NKI4) ?7:2جRm':6RdsCpLl7.CdkTo*D)T` F6FnjZԳz6vf?jyļΊʅm=Vӱ!댦.uvjSWT^Tmۻa)یM[WEFlر ˕-{Ԥ9Mp iH<bR(kk֠A[>!Id.j@,$D8Ddt3_*dUW{_ 4,lYNgg ly+&8<а~q_7\>?2u!^ê1 7@hm^)eQʨ4^=jD?Zȭ_'ԈRkS*BcFRS\A;}v\eg*> +vx_yەA&Y+̩{VU㇝yg=aUlSRҏy'Um$vht܍r'ek_'z;MeJ=.cj!t :'C"혨XE Ƽ}5<5ɺG:0@\zKآـ߷uwܹ;Kn[́ˬWf{e:Pycm|g[)U~qahBY)vχowo94YO:[k|ҞnCeBvŤ+/ҏJ?;K-O+37彏|…ǻؙX~6VA&"+e,W(Y~pY(%%996.shS5M)ƯQbOb)I~l~ ]U)k٦ۈ/s_ü#1NN@C}a^ۋ`O&FW(5~3/Y}G$$1w&r3ԑǑ+1<+,W8ALHruaSyn؃rr\G֫qkqۉSW=)/9PD\qU Q|purV oy8G .?^W }NL]"y?Ӭ/yo,yv^|9|)r;?N6wx{=+¼X(IxϹ:j*5UxA#fC|k߁csA*IeqUbDOei+9͝k8U7cn-gC?[U^|P%t wpw/j}cרS'U~ ۯC_ܣ8pHjURh m\VvLET^ηf]jw옲g1{|UU]OY9u%ZQטJ*x-j{Hb1r9-c弽]8/b?9nv! cOZ;}IwRojW)uw5t;#7.3L{o tźռA[9=5fN3|lP v@6;f=az@tK, |2?M EoOH'x3y\<<33<3y'*6eW*%7*_v)'r fZwoc|v(~h+Gi1]4 /0ß cMob֤]4>K;cX0=߹sME/3pA_c%W7'j476׼F+xq=[QZձNVP{D_/@MMD̚u=wMT51j0{éƀsʦ6IlXt ôTXeyY/!YGc̈|lhj'v1U\0 4g/bLHby:.YM{Nb5-!uf{}k^e3fVVS5l|w k{Qt.^VW^GΛJfW함QL^ܢK5om) VLu(&fzSLE]L3gfdXYH]c0f4ͱzd-ut6% +zeʩ8v endstream endobj 31 0 obj <> endobj 30 0 obj [/ICCBased 43 0 R] endobj 43 0 obj <>stream +HKyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 28 0 obj [27 0 R 26 0 R] endobj 44 0 obj <> endobj xref +0 45 +0000000004 65535 f +0000000016 00000 n +0000000161 00000 n +0000062988 00000 n +0000000000 00000 f +0000063039 00000 n +0000000000 00000 f +0000000000 00000 f +0000066259 00000 n +0000066331 00000 n +0000066570 00000 n +0000068105 00000 n +0000133693 00000 n +0000199281 00000 n +0000264869 00000 n +0000330457 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000332114 00000 n +0000332392 00000 n +0000331740 00000 n +0000331811 00000 n +0000348788 00000 n +0000063484 00000 n +0000346096 00000 n +0000345983 00000 n +0000065511 00000 n +0000331166 00000 n +0000331214 00000 n +0000331998 00000 n +0000332029 00000 n +0000331882 00000 n +0000331913 00000 n +0000340278 00000 n +0000332780 00000 n +0000333037 00000 n +0000340538 00000 n +0000346131 00000 n +0000348820 00000 n +trailer <<6F09A1C756064C16BEE961615B2563D4>]>> startxref 349027 %%EOF \ No newline at end of file diff --git a/app/art/hero@2x.png b/app/art/hero@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac37a2941c71588cefbc46e0418f1aa78aac85d GIT binary patch literal 69232 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
-![PlotDevice](app/art/hero@2x.png) +![PlotDevice: A Python-based graphics language for designers, developers, and tinkerers](app/art/hero@2x.png)
+
+ Website   ·   + Download   ·   + Docs   ·   + Discussion Forum +
+ +--- + PlotDevice is a Macintosh application used for computational graphic design. It provides an interactive Python environment where you can create two-dimensional graphics and output them in a variety of vector, bitmap, and animation formats. @@ -17,121 +26,58 @@ of 2D imagery and powerful compositing operations. #### Requirements -The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon) -and comes bundled with a Python 3.14 distribution. The module can be installed via `pip3` -on Python versions ≥3.9 (including the interpreter from the Xcode -[command line tools](https://developer.apple.com/download/all/?q=command%20line%20tools%20for%20xcode) -and those [installed through Homebrew](https://docs.brew.sh/Homebrew-and-Python)). +The PlotDevice application requires macOS 11 or greater (either on Intel or Apple Silicon). +Installing the `plotdevice` python module and command line tool via `pip3` require you to +have Python version ≥3.9 on your system. + +See the [build instructions](BUILDING.md) for details on setting up Python locally using +one of the recommended interpreters: +- [Homebrew](BUILDING.md#homebrew) (recommended) +- [Xcode command line tools](BUILDING.md#xcode) (stuck at version 3.9) +- [`pyenv`](BUILDING.md#pyenv) +- [`uv`](BUILDING.md#uv) -#### Latest changes (July 2026) +#### Latest changes -Version 1.0.1 adds compatibility for more recent python3 versions and no longer requires -the C & Swift extensions to be built when installing (they're now included in binary wheels). -The build system has been updated to use a declarative `pyproject.toml` scheme, with custom -builds now handled by the `make.py` utility script (see [BUILDING.md](BUILDING.md) for details). +Version 1.1 adds compatibility for more recent Python 3 versions and no longer requires +the C & Swift extensions to be compiled when installing via `pip3` (since they're now +included in binary wheels). The app’s text editor has been updated to version 1.44 of +[Ace](https://ace.c9.io) and has an updated default theme. The module now installs cleanly +using [`uv`](https://docs.astral.sh/uv/) and the command line tool can be [run via `uvx`](BUILDING.md#uv). -See the [changelog](CHANGES.md) for details of previous releases. +See the [changelog](CHANGES.md) for additional details. Installation ------------ -PlotDevice supports being built as either a full-fledged Cocoa application, or as -a standard Python module to be installed into a virtualenv alongside your source files. -In both cases it now includes a command line tool called [`plotdevice`](#running-scripts) +PlotDevice can be used as either a full-fledged Cocoa application or +a standard Python module installed into a virtualenv alongside your source files. +In both cases, it includes a command line tool called [`plotdevice`](#running-scripts) allowing you to run scripts and perform batch exports from the console. -*This section provides a high-level overview of how to get a working copy of PlotDevice installed. -If you're interested in doing development work on the library itself, take a look at the full -[build instructions](BUILDING.md).* - - -#### Application builds - -The application can be built in Xcode with the `PlotDevice.xcodeproj` project. It can also -be built from the command line by using `python3 make.py app` (which uses Xcode) or -`python3 make.py py2app` (which uses setuptools). - -The resulting binary will appear in the `dist` subdirectory and can be moved to your -Applications folder or any other fixed directory. To install a symlink to the command -line tool, launch the app from its installed location and click the Install button in -the Preferences window. - -Prebuilt application binaries can be downloaded from the [PlotDevice site](https://plotdevice.io). +#### Application -#### Module builds +You can download a copy of the GUI app from the [PlotDevice website](https://plotdevice.io) or the most recent +[release](https://github.com/plotdevice/plotdevice/releases) on GitHub. The app has a built-in code editor and +is bundled with a copy of Python 3.14, so it's everything you need to write and run scripts. Open the app's +Preferences window to [set up the command line tool](https://plotdevice.io/tut/Console) if you'd like to +[run scripts](#running-scripts) from the terminal as well. -PlotDevice can also be built as a Python module, allowing you to rely on an external editor -and launch scripts from the command line (or from a ‘shebang’ line at the top of your -script invoking the `plotdevice` tool). To install the module and command line tool run -`pip3 install .` from the root of the source repo. +#### Python module & terminal command -Easier still, you can install the module directly from PyPI with a simple `pip3 install plotdevice`. - -#### Alternative Python Interpreters - -By default, macOS only includes a `python3` interpreter if you install Xcode (or its command line tools). -There are a few other ways to get a usable Python setup worth considering if you're interested in using -PlotDevice from the command line. A key feature distinguishing the different options is whether they -install Python as a ‘framework’ or ‘stand-alone’: - -> A **framework** Python installation allows PlotDevice to give you access to a GUI interface for -> running scripts via the `python3 -m plotdevice` command. **Stand-alone** Python is slightly more limited: -> it supports ‘headless’ use (via the command line tool’s [`--export`](#imageanimation-export) option) and can open a window displaying -> your canvas, but it will not show an icon in the Dock or give you access to commands in the menu bar. - -##### Homebrew - -The [Homebrew](https://docs.brew.sh/Homebrew-and-Python) package manager provides a **framework** build via its `python3` package. You can install it and run `plotdevice` with: +To install the module for use in your own Python scripts, you can use the command: ```console -brew install python3 pip3 install plotdevice -python3 -m plotdevice ``` -##### `pyenv` +This will also install the `plotdevice` command line tool, which you can use to [run `.pv` scripts](#running-scripts). +See the note below about [using a virtual environment](#installing-python-modules) if you don't want to install `plotdevice` +globally for your whole system. -The [pyenv](https://github.com/pyenv/pyenv) version manager lets you easily switch between multiple python versions on the same system. -You can install a new **stand-alone** interpreter by specifying the version number: -```console -pyenv install 3.14.6 -``` +#### Build from source -If you want a **framework** install, you need to pass a custom option via environment variables: -```console -env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.14.6 -``` - -Once you've installed Python, you can activate a particular version and get `plotdevice` running with: -```console -pyenv shell 3.14.6 -pip3 install plotdevice -python3 -m plotdevice -``` - -##### `uv` - -A newer alternative is [`uv`](https://docs.astral.sh/uv/), which uses its own prebuilt interpreters (but currently does not provide **framework** builds). -If you're okay with the limitations of a **stand-alone** interpreter (see above), `uv` gives you a number of ways to -run PlotDevice. - -Run a script without permanently installing `plotdevice`: -```console -uvx --from plotdevice plotdevice -``` - -Install `plotdevice` as a standalone CLI tool: -```console -uv tool install plotdevice -plotdevice -``` - -Add `plotdevice` as a dependency in a `uv`-managed project: -```console -uv python install 3.14 -uv init myproject && cd myproject -uv add plotdevice -uv run plotdevice -``` +If you're interested in doing development work on the library itself, take a look at the full +[build instructions](BUILDING.md). Documentation ------------- From ac940c609ae64b53975842cd834e7dfbd533ea23 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 21:34:44 -0400 Subject: [PATCH 40/54] fix crash when canvas is zoomed before script has rendered --- plotdevice/gui/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plotdevice/gui/views.py b/plotdevice/gui/views.py index 92e3e00..eb93287 100644 --- a/plotdevice/gui/views.py +++ b/plotdevice/gui/views.py @@ -147,7 +147,8 @@ def _get_zoom(self): @objc.python_method def _set_zoom(self, zoom): self._zoom = zoom - self.setCanvas(self.canvas) + if self.canvas is not None: + self.setCanvas(self.canvas) zoom = property(_get_zoom, _set_zoom) @objc.python_method From 73471c5449ce2713f21e7218d03e898a3ee70b15 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 18:01:57 -0400 Subject: [PATCH 41/54] upgrade vendored ace.js to 1.44.0 --- app/Resources/ui/js/ace/ace.js | 31774 ++++++++-------- app/Resources/ui/js/ace/ext-beautify.js | 170 +- app/Resources/ui/js/ace/ext-code_lens.js | 117 +- .../ui/js/ace/ext-elastic_tabstops_lite.js | 153 +- app/Resources/ui/js/ace/ext-emmet.js | 1086 +- app/Resources/ui/js/ace/ext-hardwrap.js | 46 +- .../ui/js/ace/ext-keybinding_menu.js | 208 +- app/Resources/ui/js/ace/ext-language_tools.js | 2875 +- app/Resources/ui/js/ace/ext-linking.js | 32 +- app/Resources/ui/js/ace/ext-modelist.js | 414 +- app/Resources/ui/js/ace/ext-options.js | 958 +- app/Resources/ui/js/ace/ext-prompt.js | 3517 +- app/Resources/ui/js/ace/ext-rtl.js | 78 +- app/Resources/ui/js/ace/ext-searchbox.js | 541 +- app/Resources/ui/js/ace/ext-settings_menu.js | 945 +- app/Resources/ui/js/ace/ext-spellcheck.js | 24 +- app/Resources/ui/js/ace/ext-split.js | 120 +- .../ui/js/ace/ext-static_highlight.js | 179 +- app/Resources/ui/js/ace/ext-statusbar.js | 59 +- app/Resources/ui/js/ace/ext-textarea.js | 280 +- app/Resources/ui/js/ace/ext-themelist.js | 95 +- app/Resources/ui/js/ace/ext-whitespace.js | 152 +- app/Resources/ui/js/ace/keybinding-emacs.js | 1000 +- app/Resources/ui/js/ace/keybinding-sublime.js | 689 +- app/Resources/ui/js/ace/keybinding-vim.js | 10488 ++--- app/Resources/ui/js/ace/keybinding-vscode.js | 463 +- app/Resources/ui/js/ace/theme-ambiance.js | 177 +- app/Resources/ui/js/ace/theme-chaos.js | 155 +- app/Resources/ui/js/ace/theme-chrome.js | 128 +- app/Resources/ui/js/ace/theme-cloud9_day.js | 134 +- app/Resources/ui/js/ace/theme-cloud9_night.js | 129 +- .../ui/js/ace/theme-cloud9_night_low_color.js | 118 +- app/Resources/ui/js/ace/theme-clouds.js | 96 +- .../ui/js/ace/theme-clouds_midnight.js | 97 +- app/Resources/ui/js/ace/theme-cobalt.js | 114 +- .../ui/js/ace/theme-crimson_editor.js | 119 +- app/Resources/ui/js/ace/theme-dawn.js | 109 +- app/Resources/ui/js/ace/theme-dracula.js | 128 +- app/Resources/ui/js/ace/theme-dreamweaver.js | 144 +- app/Resources/ui/js/ace/theme-eclipse.js | 98 +- app/Resources/ui/js/ace/theme-github.js | 106 +- app/Resources/ui/js/ace/theme-gob.js | 113 +- app/Resources/ui/js/ace/theme-gruvbox.js | 81 +- .../ui/js/ace/theme-gruvbox_dark_hard.js | 133 +- .../ui/js/ace/theme-gruvbox_light_hard.js | 133 +- app/Resources/ui/js/ace/theme-idle_fingers.js | 97 +- app/Resources/ui/js/ace/theme-iplastic.js | 122 +- app/Resources/ui/js/ace/theme-katzenmilch.js | 122 +- app/Resources/ui/js/ace/theme-kr_theme.js | 105 +- app/Resources/ui/js/ace/theme-kuroir.js | 62 +- app/Resources/ui/js/ace/theme-merbivore.js | 96 +- .../ui/js/ace/theme-merbivore_soft.js | 97 +- .../ui/js/ace/theme-mono_industrial.js | 108 +- app/Resources/ui/js/ace/theme-monokai.js | 106 +- app/Resources/ui/js/ace/theme-nord_dark.js | 95 +- app/Resources/ui/js/ace/theme-one_dark.js | 141 +- .../ui/js/ace/theme-pastel_on_dark.js | 109 +- .../ui/js/ace/theme-solarized_dark.js | 89 +- .../ui/js/ace/theme-solarized_light.js | 92 +- app/Resources/ui/js/ace/theme-sqlserver.js | 139 +- app/Resources/ui/js/ace/theme-terminal.js | 115 +- app/Resources/ui/js/ace/theme-textmate.js | 127 +- app/Resources/ui/js/ace/theme-tomorrow.js | 109 +- .../ui/js/ace/theme-tomorrow_night.js | 109 +- .../ui/js/ace/theme-tomorrow_night_blue.js | 107 +- .../ui/js/ace/theme-tomorrow_night_bright.js | 122 +- .../js/ace/theme-tomorrow_night_eighties.js | 109 +- app/Resources/ui/js/ace/theme-twilight.js | 110 +- app/Resources/ui/js/ace/theme-vibrant_ink.js | 95 +- app/Resources/ui/js/ace/theme-xcode.js | 89 +- app/Resources/ui/js/ace/worker-base.js | 880 +- 71 files changed, 29827 insertions(+), 32500 deletions(-) diff --git a/app/Resources/ui/js/ace/ace.js b/app/Resources/ui/js/ace/ace.js index b71c282..bdf4607 100644 --- a/app/Resources/ui/js/ace/ace.js +++ b/app/Resources/ui/js/ace/ace.js @@ -173,202 +173,361 @@ exportAce(ACE_NAMESPACE); })(); -define("ace/lib/es6-shim",["require","exports","module"], function (require, exports, module) { - function defineProp(obj, name, val) { +define("ace/lib/es6-shim",["require","exports","module"], function(require, exports, module){function defineProp(obj, name, val) { Object.defineProperty(obj, name, { - value: val, - enumerable: false, - writable: true, - configurable: true + value: val, + enumerable: false, + writable: true, + configurable: true }); - } - if (!String.prototype.startsWith) { - defineProp( - String.prototype, - "startsWith", - function (searchString, position) { +} +if (!String.prototype.startsWith) { + defineProp(String.prototype, "startsWith", function (searchString, position) { position = position || 0; return this.lastIndexOf(searchString, position) === position; - } - ); - } - if (!String.prototype.endsWith) { + }); +} +if (!String.prototype.endsWith) { defineProp(String.prototype, "endsWith", function (searchString, position) { - var subjectString = this; - if (position === undefined || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; + var subjectString = this; + if (position === undefined || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; }); - } - if (!String.prototype.repeat) { +} +if (!String.prototype.repeat) { defineProp(String.prototype, "repeat", function (count) { - var result = ""; - var string = this; - while (count > 0) { - if (count & 1) result += string; - - if ((count >>= 1)) string += string; - } - return result; + var result = ""; + var string = this; + while (count > 0) { + if (count & 1) + result += string; + if ((count >>= 1)) + string += string; + } + return result; }); - } - if (!String.prototype.includes) { +} +if (!String.prototype.includes) { defineProp(String.prototype, "includes", function (str, position) { - return this.indexOf(str, position) != -1; + return this.indexOf(str, position) != -1; }); - } - if (!Object.assign) { +} +if (!Object.assign) { Object.assign = function (target) { - if (target === undefined || target === null) { - throw new TypeError("Cannot convert undefined or null to object"); - } - - var output = Object(target); - for (var index = 1; index < arguments.length; index++) { - var source = arguments[index]; - if (source !== undefined && source !== null) { - Object.keys(source).forEach(function (key) { - output[key] = source[key]; - }); - } - } - return output; - }; - } - if (!Object.values) { + if (target === undefined || target === null) { + throw new TypeError("Cannot convert undefined or null to object"); + } + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + Object.keys(source).forEach(function (key) { + output[key] = source[key]; + }); + } + } + return output; + }; +} +if (!Object.values) { Object.values = function (o) { - return Object.keys(o).map(function (k) { - return o[k]; - }); + return Object.keys(o).map(function (k) { + return o[k]; + }); }; - } - if (!Array.prototype.find) { +} +if (!Array.prototype.find) { defineProp(Array.prototype, "find", function (predicate) { - var len = this.length; - var thisArg = arguments[1]; - for (var k = 0; k < len; k++) { - var kValue = this[k]; - if (predicate.call(thisArg, kValue, k, this)) { - return kValue; - } - } + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return kValue; + } + } }); - } - if (!Array.prototype.findIndex) { +} +if (!Array.prototype.findIndex) { defineProp(Array.prototype, "findIndex", function (predicate) { - var len = this.length; - var thisArg = arguments[1]; - for (var k = 0; k < len; k++) { - var kValue = this[k]; - if (predicate.call(thisArg, kValue, k, this)) { - return k; - } - } + var len = this.length; + var thisArg = arguments[1]; + for (var k = 0; k < len; k++) { + var kValue = this[k]; + if (predicate.call(thisArg, kValue, k, this)) { + return k; + } + } }); - } - if (!Array.prototype.includes) { +} +if (!Array.prototype.includes) { defineProp(Array.prototype, "includes", function (item, position) { - return this.indexOf(item, position) != -1; + return this.indexOf(item, position) != -1; }); - } - if (!Array.prototype.fill) { +} +if (!Array.prototype.fill) { defineProp(Array.prototype, "fill", function (value) { - var O = this; - var len = O.length >>> 0; - var start = arguments[1]; - var relativeStart = start >> 0; - var k = - relativeStart < 0 - ? Math.max(len + relativeStart, 0) - : Math.min(relativeStart, len); - var end = arguments[2]; - var relativeEnd = end === undefined ? len : end >> 0; - var final = - relativeEnd < 0 - ? Math.max(len + relativeEnd, 0) - : Math.min(relativeEnd, len); - while (k < final) { - O[k] = value; - k++; - } - return O; + var O = this; + var len = O.length >>> 0; + var start = arguments[1]; + var relativeStart = start >> 0; + var k = relativeStart < 0 + ? Math.max(len + relativeStart, 0) + : Math.min(relativeStart, len); + var end = arguments[2]; + var relativeEnd = end === undefined ? len : end >> 0; + var final = relativeEnd < 0 + ? Math.max(len + relativeEnd, 0) + : Math.min(relativeEnd, len); + while (k < final) { + O[k] = value; + k++; + } + return O; }); - } - if (!Array.of) { +} +if (!Array.of) { defineProp(Array, "of", function () { - return Array.prototype.slice.call(arguments); + return Array.prototype.slice.call(arguments); }); - } +} + }); -define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module) { +define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/es6-shim"], function(require, exports, module){// vim:set ts=4 sts=4 sw=4 st: "use strict"; - require("./es6-shim"); }); -define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { -"use strict"; +define("ace/lib/deep_copy",["require","exports","module"], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; + +}); + +define("ace/lib/lang",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +exports.last = function (a) { + return a[a.length - 1]; +}; +exports.stringReverse = function (string) { + return string.split("").reverse().join(""); +}; +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + if (count >>= 1) + string += string; + } + return result; +}; +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; +exports.copyObject = function (obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; +exports.copyArray = function (array) { + var copy = []; + for (var i = 0, l = array.length; i < l; i++) { + if (array[i] && typeof array[i] == "object") + copy[i] = this.copyObject(array[i]); + else + copy[i] = array[i]; + } + return copy; +}; +exports.deepCopy = require("./deep_copy").deepCopy; +exports.arrayToMap = function (arr) { + var map = {}; + for (var i = 0; i < arr.length; i++) { + map[arr[i]] = 1; + } + return map; +}; +exports.createMap = function (props) { + var map = Object.create(null); + for (var i in props) { + map[i] = props[i]; + } + return map; +}; +exports.arrayRemove = function (array, value) { + for (var i = 0; i <= array.length; i++) { + if (value === array[i]) { + array.splice(i, 1); + } + } +}; +exports.escapeRegExp = function (str) { + return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); +}; +exports.escapeHTML = function (str) { + return ("" + str).replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/ 0xffff ? 2 : 1; +}; + +}); + +define("ace/lib/useragent",["require","exports","module"], function(require, exports, module){"use strict"; exports.OS = { LINUX: "LINUX", MAC: "MAC", WINDOWS: "WINDOWS" }; -exports.getOS = function() { +exports.getOS = function () { if (exports.isMac) { return exports.OS.MAC; - } else if (exports.isLinux) { + } + else if (exports.isLinux) { return exports.OS.LINUX; - } else { + } + else { return exports.OS.WINDOWS; } }; var _navigator = typeof navigator == "object" ? navigator : {}; - var os = (/mac|win|linux/i.exec(_navigator.platform) || ["other"])[0].toLowerCase(); var ua = _navigator.userAgent || ""; var appName = _navigator.appName || ""; exports.isWin = (os == "win"); exports.isMac = (os == "mac"); exports.isLinux = (os == "linux"); -exports.isIE = +exports.isIE = (appName == "Microsoft Internet Explorer" || appName.indexOf("MSAppHost") >= 0) - ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]) - : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie - + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/) || [])[1]); // for ie exports.isOldIE = exports.isIE && exports.isIE < 9; exports.isGecko = exports.isMozilla = ua.match(/ Gecko\/\d+/); -exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isOpera = typeof opera == "object" && Object.prototype.toString.call(window["opera"]) == "[object Opera]"; exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; - exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; - +exports.isSafari = parseFloat(ua.split(" Safari/")[1]) && !exports.isChrome || undefined; exports.isEdge = parseFloat(ua.split(" Edge/")[1]) || undefined; - exports.isAIR = ua.indexOf("AdobeAIR") >= 0; - exports.isAndroid = ua.indexOf("Android") >= 0; - exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; - -exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream; - -if (exports.isIOS) exports.isMac = true; - +exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window["MSStream"]; +if (exports.isIOS) + exports.isMac = true; exports.isMobile = exports.isIOS || exports.isAndroid; }); -define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var useragent = require("./useragent"); +define("ace/lib/dom",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; +var useragent = require("./useragent"); var XHTML_NS = "http://www.w3.org/1999/xhtml"; - exports.buildDom = function buildDom(arr, parent, refs) { if (typeof arr == "string" && arr) { var txt = document.createTextNode(arr); @@ -376,7 +535,6 @@ exports.buildDom = function buildDom(arr, parent, refs) { parent.appendChild(txt); return txt; } - if (!Array.isArray(arr)) { if (arr && arr.appendChild && parent) parent.appendChild(arr); @@ -390,7 +548,6 @@ exports.buildDom = function buildDom(arr, parent, refs) { } return els; } - var el = document.createElement(arr[0]); var options = arr[1]; var childIndex = 1; @@ -399,17 +556,23 @@ exports.buildDom = function buildDom(arr, parent, refs) { for (var i = childIndex; i < arr.length; i++) buildDom(arr[i], el, refs); if (childIndex == 2) { - Object.keys(options).forEach(function(n) { + Object.keys(options).forEach(function (n) { var val = options[n]; if (n === "class") { el.className = Array.isArray(val) ? val.join(" ") : val; - } else if (typeof val == "function" || n == "value" || n[0] == "$") { + } + else if (typeof val == "function" || n == "value" || n[0] == "$") { el[n] = val; - } else if (n === "ref") { - if (refs) refs[val] = el; - } else if (n === "style") { - if (typeof val == "string") el.style.cssText = val; - } else if (val != null) { + } + else if (n === "ref") { + if (refs) + refs[val] = el; + } + else if (n === "style") { + if (typeof val == "string") + el.style.cssText = val; + } + else if (val != null) { el.setAttribute(n, val); } }); @@ -418,43 +581,35 @@ exports.buildDom = function buildDom(arr, parent, refs) { parent.appendChild(el); return el; }; - -exports.getDocumentHead = function(doc) { +exports.getDocumentHead = function (doc) { if (!doc) doc = document; return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; }; - -exports.createElement = function(tag, ns) { - return document.createElementNS ? - document.createElementNS(ns || XHTML_NS, tag) : - document.createElement(tag); +exports.createElement = function (tag, ns) { + return document.createElementNS ? document.createElementNS(ns || XHTML_NS, tag) : document.createElement(tag); }; - -exports.removeChildren = function(element) { +exports.removeChildren = function (element) { element.innerHTML = ""; }; - -exports.createTextNode = function(textContent, element) { +exports.createTextNode = function (textContent, element) { var doc = element ? element.ownerDocument : document; return doc.createTextNode(textContent); }; - -exports.createFragment = function(element) { +exports.createFragment = function (element) { var doc = element ? element.ownerDocument : document; return doc.createDocumentFragment(); }; - -exports.hasCssClass = function(el, name) { +exports.hasCssClass = function (el, name) { var classes = (el.className + "").split(/\s+/g); return classes.indexOf(name) !== -1; }; -exports.addCssClass = function(el, name) { +exports.addCssClass = function (el, name) { if (!exports.hasCssClass(el, name)) { el.className += " " + name; } }; -exports.removeCssClass = function(el, name) { +exports.removeCssClass = function (el, name) { var classes = el.className.split(/\s+/g); while (true) { var index = classes.indexOf(name); @@ -465,8 +620,7 @@ exports.removeCssClass = function(el, name) { } el.className = classes.join(" "); }; - -exports.toggleCssClass = function(el, name) { +exports.toggleCssClass = function (el, name) { var classes = el.className.split(/\s+/g), add = true; while (true) { var index = classes.indexOf(name); @@ -478,19 +632,18 @@ exports.toggleCssClass = function(el, name) { } if (add) classes.push(name); - el.className = classes.join(" "); return add; }; -exports.setCssClass = function(node, className, include) { +exports.setCssClass = function (node, className, include) { if (include) { exports.addCssClass(node, className); - } else { + } + else { exports.removeCssClass(node, className); } }; - -exports.hasCssString = function(id, doc) { +exports.hasCssString = function (id, doc) { var index = 0, sheets; doc = doc || document; if ((sheets = doc.querySelectorAll("style"))) { @@ -501,82 +654,106 @@ exports.hasCssString = function(id, doc) { } } }; - -exports.removeElementById = function(id, doc) { +exports.removeElementById = function (id, doc) { doc = doc || document; - if(doc.getElementById(id)) { + if (doc.getElementById(id)) { doc.getElementById(id).remove(); } }; - var strictCSP; var cssCache = []; -exports.useStrictCSP = function(value) { +exports.useStrictCSP = function (value) { strictCSP = value; - if (value == false) insertPendingStyles(); - else if (!cssCache) cssCache = []; + if (value == false) + insertPendingStyles(); + else if (!cssCache) + cssCache = []; }; - function insertPendingStyles() { var cache = cssCache; cssCache = null; - cache && cache.forEach(function(item) { + cache && cache.forEach(function (item) { importCssString(item[0], item[1]); }); } - function importCssString(cssText, id, target) { if (typeof document == "undefined") return; if (cssCache) { if (target) { insertPendingStyles(); - } else if (target === false) { + } + else if (target === false) { return cssCache.push([cssText, id]); } } - if (strictCSP) return; - + if (strictCSP) + return; var container = target; if (!target || !target.getRootNode) { container = document; - } else { + } + else { container = target.getRootNode(); if (!container || container == target) container = document; } - var doc = container.ownerDocument || container; if (id && exports.hasCssString(id, container)) return null; - if (id) cssText += "\n/*# sourceURL=ace/css/" + id + " */"; - var style = exports.createElement("style"); style.appendChild(doc.createTextNode(cssText)); if (id) style.id = id; - if (container == doc) container = exports.getDocumentHead(doc); container.insertBefore(style, container.firstChild); } exports.importCssString = importCssString; - -exports.importCssStylsheet = function(uri, doc) { - exports.buildDom(["link", {rel: "stylesheet", href: uri}], exports.getDocumentHead(doc)); +exports.importCssStylsheet = function (uri, doc) { + exports.buildDom(["link", { rel: "stylesheet", href: uri }], exports.getDocumentHead(doc)); +}; +exports.$fixPositionBug = function (el) { + var rect = el.getBoundingClientRect(); + if (el.style.left) { + var target = parseFloat(el.style.left); + var result = +rect.left; + if (Math.abs(target - result) > 1) { + el.style.left = 2 * target - result + "px"; + } + } + if (el.style.right) { + var target = parseFloat(el.style.right); + var result = window.innerWidth - rect.right; + if (Math.abs(target - result) > 1) { + el.style.right = 2 * target - result + "px"; + } + } + if (el.style.top) { + var target = parseFloat(el.style.top); + var result = +rect.top; + if (Math.abs(target - result) > 1) { + el.style.top = 2 * target - result + "px"; + } + } + if (el.style.bottom) { + var target = parseFloat(el.style.bottom); + var result = window.innerHeight - rect.bottom; + if (Math.abs(target - result) > 1) { + el.style.bottom = 2 * target - result + "px"; + } + } }; -exports.scrollbarWidth = function(document) { +exports.scrollbarWidth = function (doc) { var inner = exports.createElement("ace_inner"); inner.style.width = "100%"; inner.style.minWidth = "0px"; inner.style.height = "200px"; inner.style.display = "block"; - var outer = exports.createElement("ace_outer"); var style = outer.style; - style.position = "absolute"; style.left = "-10000px"; style.overflow = "hidden"; @@ -584,59 +761,50 @@ exports.scrollbarWidth = function(document) { style.minWidth = "0px"; style.height = "150px"; style.display = "block"; - outer.appendChild(inner); - - var body = document.documentElement; + var body = (doc && doc.documentElement) || (document && document.documentElement); + if (!body) + return 0; body.appendChild(outer); - var noScrollbar = inner.offsetWidth; - style.overflow = "scroll"; var withScrollbar = inner.offsetWidth; - - if (noScrollbar == withScrollbar) { + if (noScrollbar === withScrollbar) { withScrollbar = outer.clientWidth; } - body.removeChild(outer); - - return noScrollbar-withScrollbar; + return noScrollbar - withScrollbar; }; - -exports.computedStyle = function(element, style) { +exports.computedStyle = function (element, style) { return window.getComputedStyle(element, "") || {}; }; - -exports.setStyle = function(styles, property, value) { +exports.setStyle = function (styles, property, value) { if (styles[property] !== value) { styles[property] = value; } }; - exports.HAS_CSS_ANIMATION = false; exports.HAS_CSS_TRANSFORMS = false; exports.HI_DPI = useragent.isWin ? typeof window !== "undefined" && window.devicePixelRatio >= 1.5 : true; - -if (useragent.isChromeOS) exports.HI_DPI = false; - +if (useragent.isChromeOS) + exports.HI_DPI = false; if (typeof document !== "undefined") { var div = document.createElement("div"); - if (exports.HI_DPI && div.style.transform !== undefined) + if (exports.HI_DPI && div.style.transform !== undefined) exports.HAS_CSS_TRANSFORMS = true; if (!useragent.isEdge && typeof div.style.animationName !== "undefined") exports.HAS_CSS_ANIMATION = true; div = null; } - if (exports.HAS_CSS_TRANSFORMS) { - exports.translate = function(element, tx, ty) { - element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) +"px)"; + exports.translate = function (element, tx, ty) { + element.style.transform = "translate(" + Math.round(tx) + "px, " + Math.round(ty) + "px)"; }; -} else { - exports.translate = function(element, tx, ty) { +} +else { + exports.translate = function (element, tx, ty) { element.style.top = Math.round(ty) + "px"; element.style.left = Math.round(tx) + "px"; }; @@ -644,1645 +812,2047 @@ if (exports.HAS_CSS_TRANSFORMS) { }); -define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module){/* + * based on code from: + * + * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/requirejs for details + */ "use strict"; - -exports.inherits = function(ctor, superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true +var dom = require("./dom"); +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); } - }); + }; + xhr.send(null); }; - -exports.mixin = function(obj, mixin) { +exports.loadScript = function (path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + s.src = path; + head.appendChild(s); + s.onload = s.onreadystatechange = function (_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function (url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +}; + +}); + +define("ace/lib/oop",["require","exports","module"], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; +exports.mixin = function (obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; - -exports.implement = function(proto, mixin) { +exports.implement = function (proto, mixin) { exports.mixin(proto, mixin); }; }); -define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var oop = require("./oop"); -var Keys = (function() { - var ret = { - MODIFIER_KEYS: { - 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', - 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' - }, - - KEY_MODS: { - "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, - "super": 8, "meta": 8, "command": 8, "cmd": 8, - "control": 1 - }, - - FUNCTION_KEYS : { - 8 : "Backspace", - 9 : "Tab", - 13 : "Return", - 19 : "Pause", - 27 : "Esc", - 32 : "Space", - 33 : "PageUp", - 34 : "PageDown", - 35 : "End", - 36 : "Home", - 37 : "Left", - 38 : "Up", - 39 : "Right", - 40 : "Down", - 44 : "Print", - 45 : "Insert", - 46 : "Delete", - 96 : "Numpad0", - 97 : "Numpad1", - 98 : "Numpad2", - 99 : "Numpad3", - 100: "Numpad4", - 101: "Numpad5", - 102: "Numpad6", - 103: "Numpad7", - 104: "Numpad8", - 105: "Numpad9", - '-13': "NumpadEnter", - 112: "F1", - 113: "F2", - 114: "F3", - 115: "F4", - 116: "F5", - 117: "F6", - 118: "F7", - 119: "F8", - 120: "F9", - 121: "F10", - 122: "F11", - 123: "F12", - 144: "Numlock", - 145: "Scrolllock" - }, - - PRINTABLE_KEYS: { - 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', - 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', - 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', - 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', - 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', - 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', - 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', - 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' - } - }; - var name, i; - for (i in ret.FUNCTION_KEYS) { - name = ret.FUNCTION_KEYS[i].toLowerCase(); - ret[name] = parseInt(i, 10); +define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module){"use strict"; +var EventEmitter = {}; +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; +EventEmitter._emit = + EventEmitter._dispatchEvent = function (eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + if (typeof e != "object" || !e) + e = {}; + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) { + listeners[i](e, this); + if (e.propagationStopped) + break; + } + if (defaultHandler && !e.defaultPrevented) + return defaultHandler(e, this); + }; +EventEmitter._signal = function (eventName, e) { + var listeners = (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](e, this); +}; +EventEmitter.once = function (eventName, callback) { + var _self = this; + this.on(eventName, function newCallback() { + _self.off(eventName, newCallback); + callback.apply(null, arguments); + }); + if (!callback) { + return new Promise(function (resolve) { + callback = resolve; + }); + } +}; +EventEmitter.setDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + handlers = this._defaultHandlers = { _disabled_: {} }; + if (handlers[eventName]) { + var old = handlers[eventName]; + var disabled = handlers._disabled_[eventName]; + if (!disabled) + handlers._disabled_[eventName] = disabled = []; + disabled.push(old); + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); + } + handlers[eventName] = callback; +}; +EventEmitter.removeDefaultHandler = function (eventName, callback) { + var handlers = this._defaultHandlers; + if (!handlers) + return; + var disabled = handlers._disabled_[eventName]; + if (handlers[eventName] == callback) { + if (disabled) + this.setDefaultHandler(eventName, disabled.pop()); } - for (i in ret.PRINTABLE_KEYS) { - name = ret.PRINTABLE_KEYS[i].toLowerCase(); - ret[name] = parseInt(i, 10); + else if (disabled) { + var i = disabled.indexOf(callback); + if (i != -1) + disabled.splice(i, 1); } - oop.mixin(ret, ret.MODIFIER_KEYS); - oop.mixin(ret, ret.PRINTABLE_KEYS); - oop.mixin(ret, ret.FUNCTION_KEYS); - ret.enter = ret["return"]; - ret.escape = ret.esc; - ret.del = ret["delete"]; - ret[173] = '-'; - - (function() { - var mods = ["cmd", "ctrl", "alt", "shift"]; - for (var i = Math.pow(2, mods.length); i--;) { - ret.KEY_MODS[i] = mods.filter(function(x) { - return i & ret.KEY_MODS[x]; - }).join("-") + "-"; - } - })(); - - ret.KEY_MODS[0] = ""; - ret.KEY_MODS[-1] = "input-"; - - return ret; -})(); -oop.mixin(exports, Keys); - -exports.keyCodeToString = function(keyCode) { - var keyString = Keys[keyCode]; - if (typeof keyString != "string") - keyString = String.fromCharCode(keyCode); - return keyString.toLowerCase(); }; +EventEmitter.on = + EventEmitter.addEventListener = function (eventName, callback, capturing) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + listeners = this._eventRegistry[eventName] = []; + if (listeners.indexOf(callback) == -1) + listeners[capturing ? "unshift" : "push"](callback); + return callback; + }; +EventEmitter.off = + EventEmitter.removeListener = + EventEmitter.removeEventListener = function (eventName, callback) { + this._eventRegistry = this._eventRegistry || {}; + var listeners = this._eventRegistry[eventName]; + if (!listeners) + return; + var index = listeners.indexOf(callback); + if (index !== -1) + listeners.splice(index, 1); + }; +EventEmitter.removeAllListeners = function (eventName) { + if (!eventName) + this._eventRegistry = this._defaultHandlers = undefined; + if (this._eventRegistry) + this._eventRegistry[eventName] = undefined; + if (this._defaultHandlers) + this._defaultHandlers[eventName] = undefined; +}; +exports.EventEmitter = EventEmitter; }); -define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var keys = require("./keys"); -var useragent = require("./useragent"); +define("ace/lib/report_error",["require","exports","module"], function(require, exports, module){exports.reportError = function reportError(msg, data) { + var e = new Error(msg); + e["data"] = data; + if (typeof console == "object" && console.error) + console.error(e); + setTimeout(function () { throw e; }); +}; -var pressedKeys = null; -var ts = 0; +}); -var activeListenerOptions; -function detectListenerOptionsSupport() { - activeListenerOptions = false; - try { - document.createComment("").addEventListener("test", function() {}, { - get passive() { - activeListenerOptions = {passive: false}; - } - }); - } catch(e) {} -} +define("ace/lib/default_english_messages",["require","exports","module"], function(require, exports, module){var defaultEnglishMessages = { + "autocomplete.popup.aria-roledescription": "Autocomplete suggestions", + "autocomplete.popup.aria-label": "Autocomplete suggestions", + "autocomplete.popup.item.aria-roledescription": "item", + "autocomplete.loading": "Loading...", + "editor.scroller.aria-roledescription": "editor", + "editor.scroller.aria-label": "Editor content, press Enter to start editing, press Escape to exit", + "editor.gutter.aria-roledescription": "editor gutter", + "editor.gutter.aria-label": "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit", + "error-marker.good-state": "Looks good!", + "prompt.recently-used": "Recently used", + "prompt.other-commands": "Other commands", + "prompt.no-matching-commands": "No matching commands", + "search-box.find.placeholder": "Search for", + "search-box.find-all.text": "All", + "search-box.replace.placeholder": "Replace with", + "search-box.replace-next.text": "Replace", + "search-box.replace-all.text": "All", + "search-box.toggle-replace.title": "Toggle Replace mode", + "search-box.toggle-regexp.title": "RegExp Search", + "search-box.toggle-case.title": "CaseSensitive Search", + "search-box.toggle-whole-word.title": "Whole Word Search", + "search-box.toggle-in-selection.title": "Search In Selection", + "search-box.search-counter": "$0 of $1", + "text-input.aria-roledescription": "editor", + "text-input.aria-label": "Cursor at row $0", + "gutter.code-folding.range.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.closed.aria-label": "Toggle code folding, rows $0 through $1", + "gutter.code-folding.open.aria-label": "Toggle code folding, row $0", + "gutter.code-folding.closed.title": "Unfold code", + "gutter.code-folding.open.title": "Fold code", + "gutter.annotation.aria-label.error": "Error, read annotations row $0", + "gutter.annotation.aria-label.warning": "Warning, read annotations row $0", + "gutter.annotation.aria-label.info": "Info, read annotations row $0", + "inline-fold.closed.title": "Unfold code", + "gutter-tooltip.aria-label.error.singular": "error", + "gutter-tooltip.aria-label.error.plural": "errors", + "gutter-tooltip.aria-label.warning.singular": "warning", + "gutter-tooltip.aria-label.warning.plural": "warnings", + "gutter-tooltip.aria-label.info.singular": "information message", + "gutter-tooltip.aria-label.info.plural": "information messages", + "gutter.annotation.aria-label.security": "Security finding, read annotations row $0", + "gutter.annotation.aria-label.hint": "Suggestion, read annotations row $0", + "gutter-tooltip.aria-label.security.singular": "security finding", + "gutter-tooltip.aria-label.security.plural": "security findings", + "gutter-tooltip.aria-label.hint.singular": "suggestion", + "gutter-tooltip.aria-label.hint.plural": "suggestions", + "editor.tooltip.disable-editing": "Editing is disabled" +}; +exports.defaultEnglishMessages = defaultEnglishMessages; -function getListenerOptions() { - if (activeListenerOptions == undefined) - detectListenerOptionsSupport(); - return activeListenerOptions; -} +}); -function EventListener(elem, type, callback) { - this.elem = elem; - this.type = type; - this.callback = callback; -} -EventListener.prototype.destroy = function() { - removeListener(this.elem, this.type, this.callback); - this.elem = this.type = this.callback = undefined; +define("ace/lib/app_config",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/report_error","ace/lib/default_english_messages"], function(require, exports, module){"no use strict"; +var oop = require("./oop"); +var EventEmitter = require("./event_emitter").EventEmitter; +var reportError = require("./report_error").reportError; +var defaultEnglishMessages = require("./default_english_messages").defaultEnglishMessages; +var optionsProvider = { + setOptions: function (optList) { + Object.keys(optList).forEach(function (key) { + this.setOption(key, optList[key]); + }, this); + }, + getOptions: function (optionNames) { + var result = {}; + if (!optionNames) { + var options = this.$options; + optionNames = Object.keys(options).filter(function (key) { + return !options[key].hidden; + }); + } + else if (!Array.isArray(optionNames)) { + optionNames = Object.keys(optionNames); + } + optionNames.forEach(function (key) { + result[key] = this.getOption(key); + }, this); + return result; + }, + setOption: function (name, value) { + if (this["$" + name] === value) + return; + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value); + if (!opt.handlesSet) + this["$" + name] = value; + if (opt && opt.set) + opt.set.call(this, value); + }, + getOption: function (name) { + var opt = this.$options[name]; + if (!opt) { + return warn('misspelled option "' + name + '"'); + } + if (opt.forwardTo) + return this[opt.forwardTo] && this[opt.forwardTo].getOption(name); + return opt && opt.get ? opt.get.call(this) : this["$" + name]; + } }; +function warn(message) { + if (typeof console != "undefined" && console.warn) + console.warn.apply(console, arguments); +} +var messages; +var nlsPlaceholders; +var AppConfig = /** @class */ (function () { + function AppConfig() { + this.$defaultOptions = {}; + messages = defaultEnglishMessages; + nlsPlaceholders = "dollarSigns"; + } + AppConfig.prototype.defineOptions = function (obj, path, options) { + if (!obj.$options) + this.$defaultOptions[path] = obj.$options = {}; + Object.keys(options).forEach(function (key) { + var opt = options[key]; + if (typeof opt == "string") + opt = { forwardTo: opt }; + opt.name || (opt.name = key); + obj.$options[opt.name] = opt; + if ("initialValue" in opt) + obj["$" + opt.name] = opt.initialValue; + }); + oop.implement(obj, optionsProvider); + return this; + }; + AppConfig.prototype.resetOptions = function (obj) { + Object.keys(obj.$options).forEach(function (key) { + var opt = obj.$options[key]; + if ("value" in opt) + obj.setOption(key, opt.value); + }); + }; + AppConfig.prototype.setDefaultValue = function (path, name, value) { + if (!path) { + for (path in this.$defaultOptions) + if (this.$defaultOptions[path][name]) + break; + if (!this.$defaultOptions[path][name]) + return false; + } + var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {}); + if (opts[name]) { + if (opts.forwardTo) + this.setDefaultValue(opts.forwardTo, name, value); + else + opts[name].value = value; + } + }; + AppConfig.prototype.setDefaultValues = function (path, optionHash) { + Object.keys(optionHash).forEach(function (key) { + this.setDefaultValue(path, key, optionHash[key]); + }, this); + }; + AppConfig.prototype.setMessages = function (value, options) { + messages = value; + if (options && options.placeholders) { + nlsPlaceholders = options.placeholders; + } + }; + AppConfig.prototype.nls = function (key, defaultString, params) { + if (!messages[key]) { + warn("No message found for the key '" + key + "' in messages with id " + messages.$id + ", trying to find a translation for the default string '" + defaultString + "'."); + if (!messages[defaultString]) { + warn("No message found for the default string '" + defaultString + "' in the provided messages. Falling back to the default English message."); + } + } + var translated = messages[key] || messages[defaultString] || defaultString; + if (params) { + if (nlsPlaceholders === "dollarSigns") { + translated = translated.replace(/\$(\$|[\d]+)/g, function (_, dollarMatch) { + if (dollarMatch == "$") + return "$"; + return params[dollarMatch]; + }); + } + if (nlsPlaceholders === "curlyBrackets") { + translated = translated.replace(/\{([^\}]+)\}/g, function (_, curlyBracketMatch) { + return params[curlyBracketMatch]; + }); + } + } + return translated; + }; + return AppConfig; +}()); +AppConfig.prototype.warn = warn; +AppConfig.prototype.reportError = reportError; +oop.implement(AppConfig.prototype, EventEmitter); +exports.AppConfig = AppConfig; -var addListener = exports.addListener = function(elem, type, callback, destroyer) { - elem.addEventListener(type, callback, getListenerOptions()); - if (destroyer) - destroyer.$toDestroy.push(new EventListener(elem, type, callback)); -}; +}); -var removeListener = exports.removeListener = function(elem, type, callback) { - elem.removeEventListener(type, callback, getListenerOptions()); -}; -exports.stopEvent = function(e) { - exports.stopPropagation(e); - exports.preventDefault(e); - return false; -}; +define("ace/theme/textmate-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tm .ace_gutter {\n background: #f0f0f0;\n color: #333;\n}\n\n.ace-tm .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-tm .ace_fold {\n background-color: #6B72E6;\n}\n\n.ace-tm {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-tm .ace_cursor {\n color: black;\n}\n \n.ace-tm .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-tm .ace_storage,\n.ace-tm .ace_keyword {\n color: blue;\n}\n\n.ace-tm .ace_constant {\n color: rgb(197, 6, 11);\n}\n\n.ace-tm .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-tm .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-tm .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_invalid {\n background-color: rgba(255, 0, 0, 0.1);\n color: red;\n}\n\n.ace-tm .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-tm .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-tm .ace_support.ace_type,\n.ace-tm .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-tm .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-tm .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-tm .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-tm .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-tm .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-tm .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-tm .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-tm .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-tm .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-tm .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-tm .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-tm .ace_meta.ace_tag {\n color:rgb(0, 22, 142);\n}\n\n.ace-tm .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-tm .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n.ace-tm.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n.ace-tm .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-tm .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-tm .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-tm .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-tm .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-tm .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-tm .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-tm .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.stopPropagation = function(e) { - if (e.stopPropagation) - e.stopPropagation(); -}; +}); -exports.preventDefault = function(e) { - if (e.preventDefault) - e.preventDefault(); -}; -exports.getButton = function(e) { - if (e.type == "dblclick") - return 0; - if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) - return 2; - return e.button; -}; +define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = require("./textmate-css"); +exports.$id = "ace/theme/textmate"; +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); -exports.capture = function(el, eventHandler, releaseCaptureHandler) { - var ownerDocument = el && el.ownerDocument || document; - function onMouseUp(e) { - eventHandler && eventHandler(e); - releaseCaptureHandler && releaseCaptureHandler(e); +}); - removeListener(ownerDocument, "mousemove", eventHandler); - removeListener(ownerDocument, "mouseup", onMouseUp); - removeListener(ownerDocument, "dragstart", onMouseUp); +define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/net","ace/lib/dom","ace/lib/app_config","ace/theme/textmate"], function(require, exports, module){"no use strict"; +var lang = require("./lib/lang"); +var net = require("./lib/net"); +var dom = require("./lib/dom"); +var AppConfig = require("./lib/app_config").AppConfig; +module.exports = exports = new AppConfig(); +var options = { + packaged: false, + workerPath: null, + modePath: null, + themePath: null, + basePath: "", + suffix: ".js", + $moduleUrls: {}, + loadWorkerFromBlob: true, + sharedPopups: false, + useStrictCSP: null +}; +exports.get = function (key) { + if (!options.hasOwnProperty(key)) + throw new Error("Unknown config key: " + key); + return options[key]; +}; +exports.set = function (key, value) { + if (options.hasOwnProperty(key)) + options[key] = value; + else if (this.setDefaultValue("", key, value) == false) + throw new Error("Unknown config key: " + key); + if (key == "useStrictCSP") + dom.useStrictCSP(value); +}; +exports.all = function () { + return lang.copyObject(options); +}; +exports.$modes = {}; +exports.moduleUrl = function (name, component) { + if (options.$moduleUrls[name]) + return options.$moduleUrls[name]; + var parts = name.split("/"); + component = component || parts[parts.length - 2] || ""; + var sep = component == "snippets" ? "/" : "-"; + var base = parts[parts.length - 1]; + if (component == "worker" && sep == "-") { + var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); + base = base.replace(re, ""); } - - addListener(ownerDocument, "mousemove", eventHandler); - addListener(ownerDocument, "mouseup", onMouseUp); - addListener(ownerDocument, "dragstart", onMouseUp); - - return onMouseUp; + if ((!base || base == component) && parts.length > 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } + else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); }; - -exports.addMouseWheelListener = function(el, callback, destroyer) { - addListener(el, "wheel", function(e) { - var factor = 0.15; - var deltaX = e.deltaX || 0; - var deltaY = e.deltaY || 0; - switch (e.deltaMode) { - case e.DOM_DELTA_PIXEL: - e.wheelX = deltaX * factor; - e.wheelY = deltaY * factor; - break; - case e.DOM_DELTA_LINE: - var linePixels = 15; - e.wheelX = deltaX * linePixels; - e.wheelY = deltaY * linePixels; - break; - case e.DOM_DELTA_PAGE: - var pagePixels = 150; - e.wheelX = deltaX * pagePixels; - e.wheelY = deltaY * pagePixels; - break; - } - callback(e); - }, destroyer); +exports.setModuleUrl = function (name, subst) { + return options.$moduleUrls[name] = subst; }; - -exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName, destroyer) { - var clicks = 0; - var startX, startY, timer; - var eventNames = { - 2: "dblclick", - 3: "tripleclick", - 4: "quadclick" +var loader = function (moduleName, cb) { + if (moduleName === "ace/theme/textmate" || moduleName === "./theme/textmate") + return cb(null, require("./theme/textmate")); + if (customLoader) + return customLoader(moduleName, cb); + console.error("loader is not configured"); +}; +var customLoader; +exports.setLoader = function (cb) { + customLoader = cb; +}; +exports.dynamicModules = Object.create(null); +exports.$loading = {}; +exports.$loaded = {}; +exports.loadModule = function (moduleId, onLoad) { + var loadedModule; + if (Array.isArray(moduleId)) { + var moduleType = moduleId[0]; + var moduleName = moduleId[1]; + } + else if (typeof moduleId == "string") { + var moduleName = moduleId; + } + var load = function (module) { + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + exports.$loading[moduleName].push(onLoad); + if (exports.$loading[moduleName].length > 1) + return; + var afterLoad = function () { + loader(moduleName, function (err, module) { + if (module) + exports.$loaded[moduleName] = module; + exports._emit("load.module", { name: moduleName, module: module }); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function (onLoad) { + onLoad && onLoad(module); + }); + }); + }; + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); + reportErrorIfPathIsNotConfigured(); }; - - function onMousedown(e) { - if (exports.getButton(e) !== 0) { - clicks = 0; - } else if (e.detail > 1) { - clicks++; - if (clicks > 4) - clicks = 1; - } else { - clicks = 1; - } - if (useragent.isIE) { - var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; - if (!timer || isNewClick) - clicks = 1; - if (timer) - clearTimeout(timer); - timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600); - - if (clicks == 1) { - startX = e.clientX; - startY = e.clientY; + if (exports.dynamicModules[moduleName]) { + exports.dynamicModules[moduleName]().then(function (module) { + if (module.default) { + load(module.default); + } + else { + load(module); } + }); + } + else { + try { + loadedModule = this.$require(moduleName); } - - e._clicks = clicks; + catch (e) { } + load(loadedModule || exports.$loaded[moduleName]); + } +}; +exports.$require = function (moduleName) { + if (typeof module["require"] == "function") { + var req = "require"; + return module[req](moduleName); + } +}; +exports.setModuleLoader = function (moduleName, onLoad) { + exports.dynamicModules[moduleName] = onLoad; +}; +var reportErrorIfPathIsNotConfigured = function () { + if (!options.basePath && !options.workerPath + && !options.modePath && !options.themePath + && !Object.keys(options.$moduleUrls).length) { + console.error("Unable to infer path to ace from script src,", "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", "or with webpack use ace/webpack-resolver"); + reportErrorIfPathIsNotConfigured = function () { }; + } +}; +exports.version = "1.44.0"; - eventHandler[callbackName]("mousedown", e); +}); - if (clicks > 4) - clicks = 0; - else if (clicks > 1) - return eventHandler[callbackName](eventNames[clicks], e); - } - if (!Array.isArray(elements)) - elements = [elements]; - elements.forEach(function(el) { - addListener(el, "mousedown", onMousedown, destroyer); +define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); +var config = require("./config"); +config.setLoader(function(moduleName, cb) { + require([moduleName], function(module) { + cb(null, module); }); -}; +}); -var getModifierHash = function(e) { - return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); -}; +var global = (function() { + return this || typeof window != "undefined" && window; +})(); -exports.getModifierString = function(e) { - return keys.KEY_MODS[getModifierHash(e)]; -}; +module.exports = function(ace) { + config.init = init; + config.$require = require; + ace.require = require; -function normalizeCommandKeys(callback, e, keyCode) { - var hashId = getModifierHash(e); + if (typeof define === "function") + ace.define = define; +}; +init(true);function init(packaged) { - if (!useragent.isMac && pressedKeys) { - if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) - hashId |= 8; - if (pressedKeys.altGr) { - if ((3 & hashId) != 3) - pressedKeys.altGr = 0; - else - return; - } - if (keyCode === 18 || keyCode === 17) { - var location = "location" in e ? e.location : e.keyLocation; - if (keyCode === 17 && location === 1) { - if (pressedKeys[keyCode] == 1) - ts = e.timeStamp; - } else if (keyCode === 18 && hashId === 3 && location === 2) { - var dt = e.timeStamp - ts; - if (dt < 50) - pressedKeys.altGr = true; - } - } - } - - if (keyCode in keys.MODIFIER_KEYS) { - keyCode = -1; - } + if (!global || !global.document) + return; - if (!hashId && keyCode === 13) { - var location = "location" in e ? e.location : e.keyLocation; - if (location === 3) { - callback(e, hashId, -keyCode); - if (e.defaultPrevented) - return; - } - } + config.set("packaged", packaged || require.packaged || module.packaged || (global.define && define.packaged)); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; - if (useragent.isChromeOS && hashId & 8) { - callback(e, hashId, keyCode); - if (e.defaultPrevented) - return; - else - hashId &= ~8; - } - if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { - return false; + if (currentScript && currentScript.src) { + scriptUrl = currentScript.src.split(/[?#]/)[0].split("/").slice(0, -1).join("/") || ""; } - return callback(e, hashId, keyCode); -} - - -exports.addCommandKeyListener = function(el, callback, destroyer) { - if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { - var lastKeyDownKeyCode = null; - addListener(el, "keydown", function(e) { - lastKeyDownKeyCode = e.keyCode; - }, destroyer); - addListener(el, "keypress", function(e) { - return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); - }, destroyer); - } else { - var lastDefaultPrevented = null; + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; - - this.contains = function(row, column) { + Range.prototype.contains = function (row, column) { return this.compare(row, column) == 0; }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; - } else if (cmp == 0) { + } + else if (cmp == 0) { return 1; - } else { + } + else { return 0; } - } else if (cmp == -1) { + } + else if (cmp == -1) { return -2; - } else { + } + else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; - } else if (cmp == 1) { + } + else if (cmp == 1) { return 42; - } else { + } + else { return 0; } } }; - this.comparePoint = function(p) { + Range.prototype.comparePoint = function (p) { return this.compare(p.row, p.column); }; - this.containsRange = function(range) { + Range.prototype.containsRange = function (range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; - this.intersects = function(range) { + Range.prototype.intersects = function (range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; - this.isEnd = function(row, column) { + Range.prototype.isEnd = function (row, column) { return this.end.row == row && this.end.column == column; }; - this.isStart = function(row, column) { + Range.prototype.isStart = function (row, column) { return this.start.row == row && this.start.column == column; }; - this.setStart = function(row, column) { + Range.prototype.setStart = function (row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; - } else { + } + else { this.start.row = row; this.start.column = column; } }; - this.setEnd = function(row, column) { + Range.prototype.setEnd = function (row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; - } else { + } + else { this.end.row = row; this.end.column = column; } }; - this.inside = function(row, column) { + Range.prototype.inside = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideStart = function(row, column) { + Range.prototype.insideStart = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideEnd = function(row, column) { + Range.prototype.insideEnd = function (row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.compare = function(row, column) { + Range.prototype.compare = function (row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); } } - if (row < this.start.row) return -1; - if (row > this.end.row) return 1; - if (this.start.row === row) return column >= this.start.column ? 0 : -1; - if (this.end.row === row) return column <= this.end.column ? 0 : 1; - return 0; }; - this.compareStart = function(row, column) { + Range.prototype.compareStart = function (row, column) { if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.compareEnd = function(row, column) { + Range.prototype.compareEnd = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else { + } + else { return this.compare(row, column); } }; - this.compareInside = function(row, column) { + Range.prototype.compareInside = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else if (this.start.row == row && this.start.column == column) { + } + else if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.clipRows = function(firstRow, lastRow) { + Range.prototype.clipRows = function (firstRow, lastRow) { if (this.end.row > lastRow) - var end = {row: lastRow + 1, column: 0}; + var end = { row: lastRow + 1, column: 0 }; else if (this.end.row < firstRow) - var end = {row: firstRow, column: 0}; - + var end = { row: firstRow, column: 0 }; if (this.start.row > lastRow) - var start = {row: lastRow + 1, column: 0}; + var start = { row: lastRow + 1, column: 0 }; else if (this.start.row < firstRow) - var start = {row: firstRow, column: 0}; - + var start = { row: firstRow, column: 0 }; return Range.fromPoints(start || this.start, end || this.end); }; - this.extend = function(row, column) { + Range.prototype.extend = function (row, column) { var cmp = this.compare(row, column); - if (cmp == 0) return this; else if (cmp == -1) - var start = {row: row, column: column}; + var start = { row: row, column: column }; else - var end = {row: row, column: column}; - + var end = { row: row, column: column }; return Range.fromPoints(start || this.start, end || this.end); }; - - this.isEmpty = function() { + Range.prototype.isEmpty = function () { return (this.start.row === this.end.row && this.start.column === this.end.column); }; - this.isMultiLine = function() { + Range.prototype.isMultiLine = function () { return (this.start.row !== this.end.row); }; - this.clone = function() { + Range.prototype.clone = function () { return Range.fromPoints(this.start, this.end); }; - this.collapseRows = function() { + Range.prototype.collapseRows = function () { if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); else return new Range(this.start.row, 0, this.end.row, 0); }; - this.toScreenRange = function(session) { + Range.prototype.toScreenRange = function (session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); }; - this.moveBy = function(row, column) { + Range.prototype.moveBy = function (row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { + return Range; +}()); +Range.fromPoints = function (start, end) { return new Range(start.row, start.column, end.row, end.column); }; -Range.comparePoints = comparePoints; - -Range.comparePoints = function(p1, p2) { +Range.comparePoints = function (p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; - - exports.Range = Range; -}); - -define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.last = function(a) { - return a[a.length - 1]; -}; - -exports.stringReverse = function(string) { - return string.split("").reverse().join(""); -}; -exports.stringRepeat = function (string, count) { - var result = ''; - while (count > 0) { - if (count & 1) - result += string; +}); - if (count >>= 1) - string += string; +define("ace/lib/keys",["require","exports","module","ace/lib/oop"], function(require, exports, module){"use strict"; +var oop = require("./oop"); +var Keys = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta', + 91: 'MetaLeft', 92: 'MetaRight', 93: 'ContextMenu' + }, + KEY_MODS: { + "ctrl": 1, "alt": 2, "option": 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8, + "control": 1 + }, + FUNCTION_KEYS: { + 8: "Backspace", + 9: "Tab", + 13: "Return", + 19: "Pause", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "Print", + 45: "Insert", + 46: "Delete", + '-13': "NumpadEnter", + 144: "Numlock", + 145: "Scrolllock" + }, + PRINTABLE_KEYS: { + 32: ' ', 59: ';', 61: '=', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\', 221: ']', 222: "'", 111: '/', 106: '*' } - return result; -}; - -var trimBeginRegexp = /^\s\s*/; -var trimEndRegexp = /\s\s*$/; - -exports.stringTrimLeft = function (string) { - return string.replace(trimBeginRegexp, ''); }; - -exports.stringTrimRight = function (string) { - return string.replace(trimEndRegexp, ''); +var codeToKeyCode = { + Command: 224, + Backspace: 8, + Tab: 9, + Return: 13, + Enter: 13, + Pause: 19, + Escape: 27, + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + Insert: 45, + Delete: 46, + ArrowLeft: 37, + ArrowUp: 38, + ArrowRight: 39, + ArrowDown: 40, + Backquote: 192, + Minus: 189, + Equal: 187, + BracketLeft: 219, + Backslash: 220, + BracketRight: 221, + Semicolon: 186, + Quote: 222, + Comma: 188, + Period: 190, + Slash: 191, + Space: 32, + NumpadAdd: 107, + NumpadDecimal: 110, + NumpadSubtract: 109, + NumpadDivide: 111, + NumpadMultiply: 106 }; - -exports.copyObject = function(obj) { - var copy = {}; - for (var key in obj) { - copy[key] = obj[key]; - } - return copy; +for (var i = 0; i < 10; i++) { + codeToKeyCode["Digit" + i] = 48 + i; + codeToKeyCode["Numpad" + i] = 96 + i; + Keys.PRINTABLE_KEYS[48 + i] = "" + i; + Keys.FUNCTION_KEYS[96 + i] = "Numpad" + i; +} +for (var i = 65; i < 91; i++) { + var chr = String.fromCharCode(i + 32); + codeToKeyCode["Key" + chr.toUpperCase()] = i; + Keys.PRINTABLE_KEYS[i] = chr; +} +for (var i = 1; i < 13; i++) { + codeToKeyCode["F" + i] = 111 + i; + Keys.FUNCTION_KEYS[111 + i] = "F" + i; +} +var modifiers = { + Shift: 16, + Control: 17, + Alt: 18, + Meta: 224 }; - -exports.copyArray = function(array){ - var copy = []; - for (var i=0, l=array.length; i 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } + else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function () { timer = null; }, timeouts[clicks - 1] || 600); + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + e._clicks = clicks; + eventHandler[callbackName]("mousedown", e); + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function (el) { + addListener(el, "mousedown", onMousedown, destroyer); + }); +}; +function getModifierHash(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); +} +exports.getModifierString = function (e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + if (!keyCode && e.code) { + keyCode = keys.$codeToKeyCode[e.code] || keyCode; + } + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = e.location; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } + else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (!hashId && keyCode === 13) { + if (e.location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + return callback(e, hashId, keyCode); +} +exports.addCommandKeyListener = function (el, callback, destroyer) { + var lastDefaultPrevented = null; + addListener(el, "keydown", function (e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }, destroyer); + addListener(el, "keypress", function (e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }, destroyer); + addListener(el, "keyup", function (e) { + pressedKeys[e.keyCode] = null; + }, destroyer); + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function (callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + (postMessageId++); + var listener = function (e) { + if (e.data == messageName) { + exports.stopPropagation(e); + removeListener(win, "message", listener); + callback(); + } + }; + addListener(win, "message", listener); + win.postMessage(messageName, "*"); }; - - _self.isPending = function() { - return timer; +} +exports.$idleBlocked = false; +exports.onIdle = function (cb, timeout) { + return setTimeout(function handler() { + if (!exports.$idleBlocked) { + cb(); + } + else { + setTimeout(handler, 100); + } + }, timeout); +}; +exports.$idleBlockId = null; +exports.blockIdle = function (delay) { + if (exports.$idleBlockId) + clearTimeout(exports.$idleBlockId); + exports.$idleBlocked = true; + exports.$idleBlockId = setTimeout(function () { + exports.$idleBlocked = false; + }, delay || 100); +}; +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window["mozRequestAnimationFrame"] + || window["webkitRequestAnimationFrame"] + || window["msRequestAnimationFrame"] + || window["oRequestAnimationFrame"]); +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function (callback) { + setTimeout(callback, 17); }; - return _self; -}; }); -define("ace/clipboard",["require","exports","module"], function(require, exports, module) { -"use strict"; - +define("ace/clipboard",["require","exports","module"], function(require, exports, module){"use strict"; var $cancelT; -module.exports = { +module.exports = { lineMode: false, - pasteCancelled: function() { + pasteCancelled: function () { if ($cancelT && $cancelT > Date.now() - 50) return true; return $cancelT = false; }, - cancel: function() { + cancel: function () { $cancelT = Date.now(); } }; }); -define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/config","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"], function(require, exports, module){"use strict"; var event = require("../lib/event"); +var nls = require("../config").nls; var useragent = require("../lib/useragent"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var clipboard = require("../clipboard"); var BROKEN_SETDATA = useragent.isChrome < 18; -var USE_IE_MIME_TYPE = useragent.isIE; +var USE_IE_MIME_TYPE = useragent.isIE; var HAS_FOCUS_ARGS = useragent.isChrome > 63; var MAX_LINE_LENGTH = 400; - var KEYS = require("../lib/keys"); var MODS = KEYS.KEY_MODS; var isIOS = useragent.isIOS; var valueResetRegex = isIOS ? /\s/ : /\n/; var isMobile = useragent.isMobile; - -var TextInput = function(parentNode, host) { - var text = dom.createElement("textarea"); - text.className = "ace_text-input"; - - text.setAttribute("wrap", "off"); - text.setAttribute("autocorrect", "off"); - text.setAttribute("autocapitalize", "off"); - text.setAttribute("spellcheck", false); - - text.style.opacity = "0"; - parentNode.insertBefore(text, parentNode.firstChild); - - var copied = false; - var pasted = false; - var inComposition = false; - var sendingText = false; - var tempStyle = ''; - - if (!isMobile) - text.style.fontSize = "1px"; - - var commandMode = false; - var ignoreFocusEvents = false; - - var lastValue = ""; - var lastSelectionStart = 0; - var lastSelectionEnd = 0; - var lastRestoreEnd = 0; - try { var isFocused = document.activeElement === text; } catch(e) {} - - event.addListener(text, "blur", function(e) { - if (ignoreFocusEvents) return; - host.onBlur(e); - isFocused = false; - }, host); - event.addListener(text, "focus", function(e) { - if (ignoreFocusEvents) return; - isFocused = true; - if (useragent.isEdge) { - try { - if (!document.hasFocus()) - return; - } catch(e) {} - } - host.onFocus(e); - if (useragent.isEdge) - setTimeout(resetSelection); - else - resetSelection(); - }, host); - this.$focusScroll = false; - this.focus = function() { - if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") - return text.focus({ preventScroll: true }); - - var top = text.style.top; - text.style.position = "fixed"; - text.style.top = "0px"; +var TextInput = /** @class */ (function () { + function TextInput(parentNode, host) { + var _this = this; + this.host = host; + this.text = dom.createElement("textarea"); + this.text.className = "ace_text-input"; + this.text.setAttribute("wrap", "off"); + this.text.setAttribute("autocomplete", "off"); + this.text.setAttribute("autocorrect", "off"); + this.text.setAttribute("autocapitalize", "off"); + this.text.setAttribute("spellcheck", "false"); + this.text.style.opacity = "0"; + parentNode.insertBefore(this.text, parentNode.firstChild); this.copied = false; + this.pasted = false; + this.inComposition = false; + this.sendingText = false; + this.tempStyle = ''; + if (!isMobile) + this.text.style.fontSize = "1px"; + this.commandMode = false; + this.ignoreFocusEvents = false; + this.lastValue = ""; + this.lastSelectionStart = 0; + this.lastSelectionEnd = 0; + this.lastRestoreEnd = 0; + this.rowStart = Number.MAX_SAFE_INTEGER; + this.rowEnd = Number.MIN_SAFE_INTEGER; + this.numberOfExtraLines = 0; try { - var isTransformed = text.getBoundingClientRect().top != 0; - } catch(e) { - return; - } - var ancestors = []; - if (isTransformed) { - var t = text.parentElement; - while (t && t.nodeType == 1) { - ancestors.push(t); - t.setAttribute("ace_nocontext", true); - if (!t.parentElement && t.getRootNode) - t = t.getRootNode().host; - else - t = t.parentElement; - } - } - text.focus({ preventScroll: true }); - if (isTransformed) { - ancestors.forEach(function(p) { - p.removeAttribute("ace_nocontext"); - }); - } - setTimeout(function() { - text.style.position = ""; - if (text.style.top == "0px") - text.style.top = top; - }, 0); - }; - this.blur = function() { - text.blur(); - }; - this.isFocused = function() { - return isFocused; - }; - - host.on("beforeEndOperation", function() { - var curOp = host.curOp; - var commandName = curOp && curOp.command && curOp.command.name; - if (commandName == "insertstring") - return; - var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); - if (inComposition && isUserAction) { - lastValue = text.value = ""; - onCompositionEnd(); + this.$isFocused = document.activeElement === this.text; } - resetSelection(); - }); - - var resetSelection = isIOS - ? function(value) { - if (!isFocused || (copied && !value) || sendingText) return; - if (!value) - value = ""; - var newValue = "\n ab" + value + "cde fg\n"; - if (newValue != text.value) - text.value = lastValue = newValue; - - var selectionStart = 4; - var selectionEnd = 4 + (value.length || (host.selection.isEmpty() ? 0 : 1)); - - if (lastSelectionStart != selectionStart || lastSelectionEnd != selectionEnd) { - text.setSelectionRange(selectionStart, selectionEnd); + catch (e) { } - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - } - : function() { - if (inComposition || sendingText) - return; - if (!isFocused && !afterContextMenu) - return; - inComposition = true; - - var selectionStart = 0; - var selectionEnd = 0; - var line = ""; - - if (host.session) { - var selection = host.selection; - var range = selection.getRange(); - var row = selection.cursor.row; - selectionStart = range.start.column; - selectionEnd = range.end.column; - line = host.session.getLine(row); - - if (range.start.row != row) { - var prevLine = host.session.getLine(row - 1); - selectionStart = range.start.row < row - 1 ? 0 : selectionStart; - selectionEnd += prevLine.length + 1; - line = prevLine + "\n" + line; + this.cancelComposition = this.cancelComposition.bind(this); + this.setAriaOptions({ role: "textbox" }); + event.addListener(this.text, "blur", function (e) { + if (_this.ignoreFocusEvents) + return; + host.onBlur(e); + _this.$isFocused = false; + }, host); + event.addListener(this.text, "focus", function (e) { + if (_this.ignoreFocusEvents) + return; + _this.$isFocused = true; + if (useragent.isEdge) { + try { + if (!document.hasFocus()) + return; + } + catch (e) { + } } - else if (range.end.row != row) { - var nextLine = host.session.getLine(row + 1); - selectionEnd = range.end.row > row + 1 ? nextLine.length : selectionEnd; - selectionEnd += line.length + 1; - line = line + "\n" + nextLine; + host.onFocus(e); + if (useragent.isEdge) + setTimeout(_this.resetSelection.bind(_this)); + else + _this.resetSelection(); + }, host); this.$focusScroll = false; + host.on("beforeEndOperation", function () { + var curOp = host.curOp; + var commandName = curOp && curOp.command && curOp.command.name; + if (commandName == "insertstring") + return; + var isUserAction = commandName && (curOp.docChanged || curOp.selectionChanged); + if (_this.inComposition && isUserAction) { + _this.lastValue = _this.text.value = ""; + _this.onCompositionEnd(); } - else if (isMobile && row > 0) { - line = "\n" + line; - selectionEnd += 1; - selectionStart += 1; + _this.resetSelection(); + }); + host.on("changeSelection", this.setAriaLabel.bind(this)); + this.resetSelection = isIOS ? this.$resetSelectionIOS : this.$resetSelection; + if (this.$isFocused) + host.onFocus(); + this.inputHandler = null; + this.afterContextMenu = false; + event.addCommandKeyListener(this.text, function (e, hashId, keyCode) { + if (_this.inComposition) + return; + return host.onCommandKey(e, hashId, keyCode); + }, host); + event.addListener(this.text, "select", this.onSelect.bind(this), host); + event.addListener(this.text, "input", this.onInput.bind(this), host); + event.addListener(this.text, "cut", this.onCut.bind(this), host); + event.addListener(this.text, "copy", this.onCopy.bind(this), host); + event.addListener(this.text, "paste", this.onPaste.bind(this), host); + if (!('oncut' in this.text) || !('oncopy' in this.text) || !('onpaste' in this.text)) { + event.addListener(parentNode, "keydown", function (e) { + if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) + return; + switch (e.keyCode) { + case 67: + _this.onCopy(e); + break; + case 86: + _this.onPaste(e); + break; + case 88: + _this.onCut(e); + break; + } + }, host); + } + this.syncComposition = lang.delayedCall(this.onCompositionUpdate.bind(this), 50).schedule.bind(null, null); //TODO: check this + event.addListener(this.text, "compositionstart", this.onCompositionStart.bind(this), host); + event.addListener(this.text, "compositionupdate", this.onCompositionUpdate.bind(this), host); + event.addListener(this.text, "keyup", this.onKeyup.bind(this), host); + event.addListener(this.text, "keydown", this.syncComposition.bind(this), host); + event.addListener(this.text, "compositionend", this.onCompositionEnd.bind(this), host); + this.closeTimeout; + event.addListener(this.text, "mouseup", this.$onContextMenu.bind(this), host); + event.addListener(this.text, "mousedown", function (e) { + e.preventDefault(); + _this.onContextMenuClose(); + }, host); + event.addListener(host.renderer.scroller, "contextmenu", this.$onContextMenu.bind(this), host); + event.addListener(this.text, "contextmenu", this.$onContextMenu.bind(this), host); + if (isIOS) + this.addIosSelectionHandler(parentNode, host, this.text); + } + TextInput.prototype.addIosSelectionHandler = function (parentNode, host, text) { + var _this = this; + var typingResetTimeout = null; + var typing = false; + text.addEventListener("keydown", function (e) { + if (typingResetTimeout) + clearTimeout(typingResetTimeout); + typing = true; + }, true); + text.addEventListener("keyup", function (e) { + typingResetTimeout = setTimeout(function () { + typing = false; + }, 100); + }, true); + var detectArrowKeys = function (e) { + if (document.activeElement !== text) + return; + if (typing || _this.inComposition || host.$mouseHandler.isMousePressed) + return; + if (_this.copied) { + return; } - - if (line.length > MAX_LINE_LENGTH) { - if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { - line = line.slice(0, MAX_LINE_LENGTH); - } else { - line = "\n"; - if (selectionStart == selectionEnd) { - selectionStart = selectionEnd = 0; - } - else { - selectionStart = 0; - selectionEnd = 1; - } + var selectionStart = text.selectionStart; + var selectionEnd = text.selectionEnd; + var key = null; + var modifier = 0; + if (selectionStart == 0) { + key = KEYS.up; + } + else if (selectionStart == 1) { + key = KEYS.home; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue[selectionEnd] == "\n") { + key = KEYS.end; + } + else if (selectionStart < _this.lastSelectionStart && _this.lastValue[selectionStart - 1] == " ") { + key = KEYS.left; + modifier = MODS.option; + } + else if (selectionStart < _this.lastSelectionStart || (selectionStart == _this.lastSelectionStart + && _this.lastSelectionEnd != _this.lastSelectionStart && selectionStart == selectionEnd)) { + key = KEYS.left; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue.slice(0, selectionEnd).split("\n").length > 2) { + key = KEYS.down; + } + else if (selectionEnd > _this.lastSelectionEnd && _this.lastValue[selectionEnd - 1] == " ") { + key = KEYS.right; + modifier = MODS.option; + } + else if (selectionEnd > _this.lastSelectionEnd || (selectionEnd == _this.lastSelectionEnd + && _this.lastSelectionEnd != _this.lastSelectionStart && selectionStart == selectionEnd)) { + key = KEYS.right; + } + if (selectionStart !== selectionEnd) + modifier |= MODS.shift; + if (key) { + var result = host.onCommandKey({}, modifier, key); + if (!result && host.commands) { + key = KEYS.keyCodeToString(key); + var command = host.commands.findKeyCommand(modifier, key); + if (command) + host.execCommand(command); } + _this.lastSelectionStart = selectionStart; + _this.lastSelectionEnd = selectionEnd; + _this.resetSelection(""); } + }; + document.addEventListener("selectionchange", detectArrowKeys); + host.on("destroy", function () { + document.removeEventListener("selectionchange", detectArrowKeys); + }); + }; + TextInput.prototype.onContextMenuClose = function () { + var _this = this; + clearTimeout(this.closeTimeout); + this.closeTimeout = setTimeout(function () { + if (_this.tempStyle) { + _this.text.style.cssText = _this.tempStyle; + _this.tempStyle = ''; + } + _this.host.renderer.$isMousePressed = false; + if (_this.host.renderer.$keepTextAreaAtCursor) + _this.host.renderer.$moveTextAreaToCursor(); + }, 0); + }; + TextInput.prototype.$onContextMenu = function (e) { + this.host.textInput.onContextMenu(e); + this.onContextMenuClose(); + }; + TextInput.prototype.onKeyup = function (e) { + if (e.keyCode == 27 && this.text.value.length < this.text.selectionStart) { + if (!this.inComposition) + this.lastValue = this.text.value; + this.lastSelectionStart = this.lastSelectionEnd = -1; + this.resetSelection(); } - - var newValue = line + "\n\n"; - if (newValue != lastValue) { - text.value = lastValue = newValue; - lastSelectionStart = lastSelectionEnd = newValue.length; - } - if (afterContextMenu) { - lastSelectionStart = text.selectionStart; - lastSelectionEnd = text.selectionEnd; - } - if ( - lastSelectionEnd != selectionEnd - || lastSelectionStart != selectionStart - || text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization - ) { - try { - text.setSelectionRange(selectionStart, selectionEnd); - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - } catch(e){} + this.syncComposition(); + }; + TextInput.prototype.cancelComposition = function () { + this.ignoreFocusEvents = true; + this.text.blur(); + this.text.focus(); + this.ignoreFocusEvents = false; + }; + TextInput.prototype.onCompositionStart = function (e) { + if (this.inComposition || !this.host.onCompositionStart || this.host.$readOnly) + return; + this.inComposition = {}; + if (this.commandMode) + return; + if (e.data) + this.inComposition.useTextareaForIME = false; + setTimeout(this.onCompositionUpdate.bind(this), 0); + this.host._signal("compositionStart"); + this.host.on("mousedown", this.cancelComposition); //TODO: + var range = this.host.getSelectionRange(); + range.end.row = range.start.row; + range.end.column = range.start.column; + this.inComposition.markerRange = range; + this.inComposition.selectionStart = this.lastSelectionStart; + this.host.onCompositionStart(this.inComposition); + if (this.inComposition.useTextareaForIME) { + this.lastValue = this.text.value = ""; + this.lastSelectionStart = 0; + this.lastSelectionEnd = 0; + } + else { + if (this.text.msGetInputContext) + this.inComposition.context = this.text.msGetInputContext(); + if (this.text.getInputContext) + this.inComposition.context = this.text.getInputContext(); } - inComposition = false; }; - this.resetSelection = resetSelection; - - if (isFocused) - host.onFocus(); - - - var isAllSelected = function(text) { - return text.selectionStart === 0 && text.selectionEnd >= lastValue.length - && text.value === lastValue && lastValue - && text.selectionEnd !== lastSelectionEnd; + TextInput.prototype.onCompositionUpdate = function () { + if (!this.inComposition || !this.host.onCompositionUpdate || this.host.$readOnly) + return; + if (this.commandMode) + return this.cancelComposition(); + if (this.inComposition.useTextareaForIME) { + this.host.onCompositionUpdate(this.text.value); + } + else { + var data = this.text.value; + this.sendText(data); + if (this.inComposition.markerRange) { + if (this.inComposition.context) { + this.inComposition.markerRange.start.column = this.inComposition.selectionStart = this.inComposition.context.compositionStartOffset; + } + this.inComposition.markerRange.end.column = this.inComposition.markerRange.start.column + + this.lastSelectionEnd - this.inComposition.selectionStart + this.lastRestoreEnd; + } + } }; - - var onSelect = function(e) { - if (inComposition) + TextInput.prototype.onCompositionEnd = function (e) { + if (!this.host.onCompositionEnd || this.host.$readOnly) + return; + this.inComposition = false; + this.host.onCompositionEnd(); + this.host.off("mousedown", this.cancelComposition); + if (e) + this.onInput(); + }; + TextInput.prototype.onCut = function (e) { + this.doCopy(e, true); + }; + TextInput.prototype.onCopy = function (e) { + this.doCopy(e, false); + }; + TextInput.prototype.onPaste = function (e) { + var data = this.handleClipboardData(e); + if (clipboard.pasteCancelled()) return; - if (copied) { - copied = false; - } else if (isAllSelected(text)) { - host.selectAll(); - resetSelection(); - } else if (isMobile && text.selectionStart != lastSelectionStart) { - resetSelection(); + if (typeof data == "string") { + if (data) + this.host.onPaste(data, e); + if (useragent.isIE) + setTimeout(this.resetSelection); + event.preventDefault(e); + } + else { + this.text.value = ""; + this.pasted = true; } }; - - var inputHandler = null; - this.setInputHandler = function(cb) {inputHandler = cb;}; - this.getInputHandler = function() {return inputHandler;}; - var afterContextMenu = false; - - var sendText = function(value, fromInput) { - if (afterContextMenu) - afterContextMenu = false; - if (pasted) { - resetSelection(); + TextInput.prototype.doCopy = function (e, isCut) { + var _this = this; + var data = this.host.getCopyText(); + if (!data) + return event.preventDefault(e); + if (this.handleClipboardData(e, data)) { + if (isIOS) { + this.resetSelection(data); + this.copied = data; + setTimeout(function () { + _this.copied = false; + }, 10); + } + isCut ? this.host.onCut() : this.host.onCopy(); + event.preventDefault(e); + } + else { + this.copied = true; + this.text.value = data; + this.text.select(); + setTimeout(function () { + _this.copied = false; + _this.resetSelection(); + isCut ? _this.host.onCut() : _this.host.onCopy(); + }); + } + }; + TextInput.prototype.handleClipboardData = function (e, data, forceIEMime) { + var clipboardData = e.clipboardData || window["clipboardData"]; + if (!clipboardData || BROKEN_SETDATA) + return; + var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; + try { + if (data) { + return clipboardData.setData(mime, data) !== false; + } + else { + return clipboardData.getData(mime); + } + } + catch (e) { + if (!forceIEMime) + return this.handleClipboardData(e, data, true); + } + }; + TextInput.prototype.onInput = function (e) { + if (this.inComposition) + return this.onCompositionUpdate(); + if (e && e.inputType) { + if (e.inputType == "historyUndo") + return this.host.execCommand("undo"); + if (e.inputType == "historyRedo") + return this.host.execCommand("redo"); + } + var data = this.text.value; + var inserted = this.sendText(data, true); + if (data.length > MAX_LINE_LENGTH + 100 || valueResetRegex.test(inserted) || isMobile && this.lastSelectionStart + < 1 && this.lastSelectionStart == this.lastSelectionEnd) { + this.resetSelection(); + } + }; + TextInput.prototype.sendText = function (value, fromInput) { + if (this.afterContextMenu) + this.afterContextMenu = false; + if (this.pasted) { + this.resetSelection(); if (value) - host.onPaste(value); - pasted = false; + this.host.onPaste(value); + this.pasted = false; return ""; - } else { - var selectionStart = text.selectionStart; - var selectionEnd = text.selectionEnd; - - var extendLeft = lastSelectionStart; - var extendRight = lastValue.length - lastSelectionEnd; - + } + else { + var selectionStart = this.text.selectionStart; + var selectionEnd = this.text.selectionEnd; + var extendLeft = this.lastSelectionStart; + var extendRight = this.lastValue.length - this.lastSelectionEnd; var inserted = value; var restoreStart = value.length - selectionStart; var restoreEnd = value.length - selectionEnd; - var i = 0; - while (extendLeft > 0 && lastValue[i] == value[i]) { + while (extendLeft > 0 && this.lastValue[i] == value[i]) { i++; extendLeft--; } inserted = inserted.slice(i); i = 1; - while (extendRight > 0 && lastValue.length - i > lastSelectionStart - 1 && lastValue[lastValue.length - i] == value[value.length - i]) { + while (extendRight > 0 && this.lastValue.length - i > this.lastSelectionStart - 1 + && this.lastValue[this.lastValue.length - i] == value[value.length - i]) { i++; extendRight--; } - restoreStart -= i-1; - restoreEnd -= i-1; + restoreStart -= i - 1; + restoreEnd -= i - 1; var endIndex = inserted.length - i + 1; if (endIndex < 0) { extendLeft = -endIndex; endIndex = 0; - } + } inserted = inserted.slice(0, endIndex); if (!fromInput && !inserted && !restoreStart && !extendLeft && !extendRight && !restoreEnd) return ""; - sendingText = true; + this.sendingText = true; var shouldReset = false; if (useragent.isAndroid && inserted == ". ") { inserted = " "; shouldReset = true; } - - if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || commandMode) { - host.onTextInput(inserted); - } else { - host.onTextInput(inserted, { + if (inserted && !extendLeft && !extendRight && !restoreStart && !restoreEnd || this.commandMode) { + this.host.onTextInput(inserted); + } + else { + this.host.onTextInput(inserted, { extendLeft: extendLeft, extendRight: extendRight, restoreStart: restoreStart, restoreEnd: restoreEnd }); } - sendingText = false; - - lastValue = value; - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - lastRestoreEnd = restoreEnd; + this.sendingText = false; + this.lastValue = value; + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; + this.lastRestoreEnd = restoreEnd; return shouldReset ? "\n" : inserted; } }; - var onInput = function(e) { - if (inComposition) - return onCompositionUpdate(); - if (e && e.inputType) { - if (e.inputType == "historyUndo") return host.execCommand("undo"); - if (e.inputType == "historyRedo") return host.execCommand("redo"); - } - var data = text.value; - var inserted = sendText(data, true); - if ( - data.length > MAX_LINE_LENGTH + 100 - || valueResetRegex.test(inserted) - || isMobile && lastSelectionStart < 1 && lastSelectionStart == lastSelectionEnd - ) { - resetSelection(); + TextInput.prototype.onSelect = function (e) { + var _this = this; + if (this.inComposition) + return; + var isAllSelected = function (text) { + return text.selectionStart === 0 && text.selectionEnd >= _this.lastValue.length && text.value + === _this.lastValue && _this.lastValue && text.selectionEnd !== _this.lastSelectionEnd; + }; + if (this.copied) { + this.copied = false; + } + else if (isAllSelected(this.text)) { + this.host.selectAll(); + this.resetSelection(); + } + else if (isMobile && this.text.selectionStart != this.lastSelectionStart) { + this.resetSelection(); } }; - - var handleClipboardData = function(e, data, forceIEMime) { - var clipboardData = e.clipboardData || window.clipboardData; - if (!clipboardData || BROKEN_SETDATA) + TextInput.prototype.$resetSelectionIOS = function (value) { + if (!this.$isFocused || (this.copied && !value) || this.sendingText) return; - var mime = USE_IE_MIME_TYPE || forceIEMime ? "Text" : "text/plain"; - try { - if (data) { - return clipboardData.setData(mime, data) !== false; - } else { - return clipboardData.getData(mime); - } - } catch(e) { - if (!forceIEMime) - return handleClipboardData(e, data, true); + if (!value) + value = ""; + var newValue = "\n ab" + value + "cde fg\n"; + if (newValue != this.text.value) + this.text.value = this.lastValue = newValue; + var selectionStart = 4; + var selectionEnd = 4 + (value.length || (this.host.selection.isEmpty() ? 0 : 1)); + if (this.lastSelectionStart != selectionStart || this.lastSelectionEnd != selectionEnd) { + this.text.setSelectionRange(selectionStart, selectionEnd); } + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; }; - - var doCopy = function(e, isCut) { - var data = host.getCopyText(); - if (!data) - return event.preventDefault(e); - - if (handleClipboardData(e, data)) { - if (isIOS) { - resetSelection(data); - copied = data; - setTimeout(function () { - copied = false; - }, 10); + TextInput.prototype.$resetSelection = function () { + var _this = this; + if (this.inComposition || this.sendingText) + return; + if (!this.$isFocused && !this.afterContextMenu) + return; + this.inComposition = true; + var selectionStart = 0; + var selectionEnd = 0; + var line = ""; + var positionToSelection = function (row, column) { + var selection = column; + for (var i = 1; i <= row - _this.rowStart && i < 2 * _this.numberOfExtraLines + 1; i++) { + selection += _this.host.session.getLine(row - i).length + 1; + } + return selection; + }; + if (this.host.session) { + var selection = this.host.selection; + var range = selection.getRange(); + var row = selection.cursor.row; + if (row === this.rowEnd + 1) { + this.rowStart = this.rowEnd + 1; + this.rowEnd = this.rowStart + 2 * this.numberOfExtraLines; + } + else if (row === this.rowStart - 1) { + this.rowEnd = this.rowStart - 1; + this.rowStart = this.rowEnd - 2 * this.numberOfExtraLines; + } + else if (row < this.rowStart - 1 || row > this.rowEnd + 1) { + this.rowStart = row > this.numberOfExtraLines ? row - this.numberOfExtraLines : 0; + this.rowEnd = row > this.numberOfExtraLines ? row + this.numberOfExtraLines : 2 + * this.numberOfExtraLines; + } + var lines = []; + for (var i = this.rowStart; i <= this.rowEnd; i++) { + lines.push(this.host.session.getLine(i)); + } + line = lines.join('\n'); + selectionStart = positionToSelection(range.start.row, range.start.column); + selectionEnd = positionToSelection(range.end.row, range.end.column); + if (range.start.row < this.rowStart) { + var prevLine = this.host.session.getLine(this.rowStart - 1); + selectionStart = range.start.row < this.rowStart - 1 ? 0 : selectionStart; + selectionEnd += prevLine.length + 1; + line = prevLine + "\n" + line; + } + else if (range.end.row > this.rowEnd) { + var nextLine = this.host.session.getLine(this.rowEnd + 1); + selectionEnd = range.end.row > this.rowEnd + 1 ? nextLine.length : range.end.column; + selectionEnd += line.length + 1; + line = line + "\n" + nextLine; + } + else if (isMobile && row > 0) { + line = "\n" + line; + selectionEnd += 1; + selectionStart += 1; + } + if (line.length > MAX_LINE_LENGTH) { + if (selectionStart < MAX_LINE_LENGTH && selectionEnd < MAX_LINE_LENGTH) { + line = line.slice(0, MAX_LINE_LENGTH); + } + else { + line = "\n"; + if (selectionStart == selectionEnd) { + selectionStart = selectionEnd = 0; + } + else { + selectionStart = 0; + selectionEnd = 1; + } + } + } + var newValue = line + "\n\n"; + if (newValue != this.lastValue) { + this.text.value = this.lastValue = newValue; + this.lastSelectionStart = this.lastSelectionEnd = newValue.length; } - isCut ? host.onCut() : host.onCopy(); - event.preventDefault(e); - } else { - copied = true; - text.value = data; - text.select(); - setTimeout(function(){ - copied = false; - resetSelection(); - isCut ? host.onCut() : host.onCopy(); - }); } + if (this.afterContextMenu) { + this.lastSelectionStart = this.text.selectionStart; + this.lastSelectionEnd = this.text.selectionEnd; + } + if (this.lastSelectionEnd != selectionEnd || this.lastSelectionStart != selectionStart || this.text.selectionEnd + != this.lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization + ) { + try { + this.text.setSelectionRange(selectionStart, selectionEnd); + this.lastSelectionStart = selectionStart; + this.lastSelectionEnd = selectionEnd; + } + catch (e) { + } + } + this.inComposition = false; }; - - var onCut = function(e) { - doCopy(e, true); - }; - - var onCopy = function(e) { - doCopy(e, false); + TextInput.prototype.setHost = function (newHost) { + this.host = newHost; }; - - var onPaste = function(e) { - var data = handleClipboardData(e); - if (clipboard.pasteCancelled()) + TextInput.prototype.setNumberOfExtraLines = function (number) { + this.rowStart = Number.MAX_SAFE_INTEGER; + this.rowEnd = Number.MIN_SAFE_INTEGER; + if (number < 0) { + this.numberOfExtraLines = 0; return; - if (typeof data == "string") { - if (data) - host.onPaste(data, e); - if (useragent.isIE) - setTimeout(resetSelection); - event.preventDefault(e); - } - else { - text.value = ""; - pasted = true; } + this.numberOfExtraLines = number; }; - - event.addCommandKeyListener(text, host.onCommandKey.bind(host), host); - - event.addListener(text, "select", onSelect, host); - event.addListener(text, "input", onInput, host); - - event.addListener(text, "cut", onCut, host); - event.addListener(text, "copy", onCopy, host); - event.addListener(text, "paste", onPaste, host); - if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) { - event.addListener(parentNode, "keydown", function(e) { - if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) - return; - - switch (e.keyCode) { - case 67: - onCopy(e); - break; - case 86: - onPaste(e); - break; - case 88: - onCut(e); - break; - } - }, host); - } - var onCompositionStart = function(e) { - if (inComposition || !host.onCompositionStart || host.$readOnly) - return; - - inComposition = {}; - - if (commandMode) - return; - - if (e.data) - inComposition.useTextareaForIME = false; - - setTimeout(onCompositionUpdate, 0); - host._signal("compositionStart"); - host.on("mousedown", cancelComposition); - - var range = host.getSelectionRange(); - range.end.row = range.start.row; - range.end.column = range.start.column; - inComposition.markerRange = range; - inComposition.selectionStart = lastSelectionStart; - host.onCompositionStart(inComposition); - - if (inComposition.useTextareaForIME) { - lastValue = text.value = ""; - lastSelectionStart = 0; - lastSelectionEnd = 0; + TextInput.prototype.setAriaLabel = function () { + var ariaLabel = ""; + if (this.host.$textInputAriaLabel) { + ariaLabel += "".concat(this.host.$textInputAriaLabel, ", "); } - else { - if (text.msGetInputContext) - inComposition.context = text.msGetInputContext(); - if (text.getInputContext) - inComposition.context = text.getInputContext(); + if (this.host.session) { + var row = this.host.session.selection.cursor.row; + ariaLabel += nls("text-input.aria-label", "Cursor at row $0", [row + 1]); } + this.text.setAttribute("aria-label", ariaLabel); }; - - var onCompositionUpdate = function() { - if (!inComposition || !host.onCompositionUpdate || host.$readOnly) - return; - if (commandMode) - return cancelComposition(); - - if (inComposition.useTextareaForIME) { - host.onCompositionUpdate(text.value); + TextInput.prototype.setAriaOptions = function (options) { + if (options.activeDescendant) { + this.text.setAttribute("aria-haspopup", "true"); + this.text.setAttribute("aria-autocomplete", options.inline ? "both" : "list"); + this.text.setAttribute("aria-activedescendant", options.activeDescendant); } else { - var data = text.value; - sendText(data); - if (inComposition.markerRange) { - if (inComposition.context) { - inComposition.markerRange.start.column = inComposition.selectionStart - = inComposition.context.compositionStartOffset; - } - inComposition.markerRange.end.column = inComposition.markerRange.start.column - + lastSelectionEnd - inComposition.selectionStart + lastRestoreEnd; - } + this.text.setAttribute("aria-haspopup", "false"); + this.text.setAttribute("aria-autocomplete", "both"); + this.text.removeAttribute("aria-activedescendant"); + } + if (options.role) { + this.text.setAttribute("role", options.role); + } + if (options.setLabel) { + this.text.setAttribute("aria-roledescription", nls("text-input.aria-roledescription", "editor")); + this.setAriaLabel(); } }; - - var onCompositionEnd = function(e) { - if (!host.onCompositionEnd || host.$readOnly) return; - inComposition = false; - host.onCompositionEnd(); - host.off("mousedown", cancelComposition); - if (e) onInput(); + TextInput.prototype.focus = function () { + var _this = this; + this.setAriaOptions({ + setLabel: this.host.renderer.enableKeyboardAccessibility + }); + if (this.tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == "browser") + return this.text.focus({ preventScroll: true }); + var top = this.text.style.top; + this.text.style.position = "fixed"; + this.text.style.top = "0px"; + try { + var isTransformed = this.text.getBoundingClientRect().top != 0; + } + catch (e) { + return; + } + var ancestors = []; + if (isTransformed) { + var t = this.text.parentElement; + while (t && t.nodeType == 1) { + ancestors.push(t); + t.setAttribute("ace_nocontext", "true"); + if (!t.parentElement && t.getRootNode) + t = t.getRootNode()["host"]; + else + t = t.parentElement; + } + } + this.text.focus({ preventScroll: true }); + if (isTransformed) { + ancestors.forEach(function (p) { + p.removeAttribute("ace_nocontext"); + }); + } + setTimeout(function () { + _this.text.style.position = ""; + if (_this.text.style.top == "0px") + _this.text.style.top = top; + }, 0); }; - - - function cancelComposition() { - ignoreFocusEvents = true; - text.blur(); - text.focus(); - ignoreFocusEvents = false; - } - - var syncComposition = lang.delayedCall(onCompositionUpdate, 50).schedule.bind(null, null); - - function onKeyup(e) { - if (e.keyCode == 27 && text.value.length < text.selectionStart) { - if (!inComposition) - lastValue = text.value; - lastSelectionStart = lastSelectionEnd = -1; - resetSelection(); - } - syncComposition(); - } - - event.addListener(text, "compositionstart", onCompositionStart, host); - event.addListener(text, "compositionupdate", onCompositionUpdate, host); - event.addListener(text, "keyup", onKeyup, host); - event.addListener(text, "keydown", syncComposition, host); - event.addListener(text, "compositionend", onCompositionEnd, host); - - this.getElement = function() { - return text; + TextInput.prototype.blur = function () { + this.text.blur(); }; - this.setCommandMode = function(value) { - commandMode = value; - text.readOnly = false; + TextInput.prototype.isFocused = function () { + return this.$isFocused; }; - - this.setReadOnly = function(readOnly) { - if (!commandMode) - text.readOnly = readOnly; + TextInput.prototype.setInputHandler = function (cb) { + this.inputHandler = cb; }; - - this.setCopyWithEmptySelection = function(value) { + TextInput.prototype.getInputHandler = function () { + return this.inputHandler; }; - - this.onContextMenu = function(e) { - afterContextMenu = true; - resetSelection(); - host._emit("nativecontextmenu", {target: host, domEvent: e}); + TextInput.prototype.getElement = function () { + return this.text; + }; + TextInput.prototype.setCommandMode = function (value) { + this.commandMode = value; + this.text.readOnly = false; + }; + TextInput.prototype.setReadOnly = function (readOnly) { + if (!this.commandMode) + this.text.readOnly = readOnly; + }; + TextInput.prototype.setCopyWithEmptySelection = function (value) { + }; + TextInput.prototype.onContextMenu = function (e) { + this.afterContextMenu = true; + this.resetSelection(); + this.host._emit("nativecontextmenu", { + target: this.host, + domEvent: e + }); this.moveToMouse(e, true); }; - - this.moveToMouse = function(e, bringToFront) { - if (!tempStyle) - tempStyle = text.style.cssText; - text.style.cssText = (bringToFront ? "z-index:100000;" : "") - + (useragent.isIE ? "opacity:0.1;" : "") - + "text-indent: -" + (lastSelectionStart + lastSelectionEnd) * host.renderer.characterWidth * 0.5 + "px;"; - - var rect = host.container.getBoundingClientRect(); - var style = dom.computedStyle(host.container); + TextInput.prototype.moveToMouse = function (e, bringToFront) { + var _this = this; + if (!this.tempStyle) + this.tempStyle = this.text.style.cssText; + this.text.style.cssText = (bringToFront ? "z-index:100000;" : "") + (useragent.isIE ? "opacity:0.1;" : "") + + "text-indent: -" + (this.lastSelectionStart + this.lastSelectionEnd) * this.host.renderer.characterWidth + * 0.5 + "px;"; + var rect = this.host.container.getBoundingClientRect(); + var style = dom.computedStyle(this.host.container); var top = rect.top + (parseInt(style.borderTopWidth) || 0); - var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); - var maxTop = rect.bottom - top - text.clientHeight -2; - var move = function(e) { - dom.translate(text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); - }; + var left = rect.left + (parseInt(style.borderLeftWidth) || 0); + var maxTop = rect.bottom - top - this.text.clientHeight - 2; + var move = function (e) { + dom.translate(_this.text, e.clientX - left - 2, Math.min(e.clientY - top - 2, maxTop)); + }; move(e); - if (e.type != "mousedown") return; - - host.renderer.$isMousePressed = true; - - clearTimeout(closeTimeout); + this.host.renderer.$isMousePressed = true; + clearTimeout(this.closeTimeout); if (useragent.isWin) - event.capture(host.container, move, onContextMenuClose); - }; - - this.onContextMenuClose = onContextMenuClose; - var closeTimeout; - function onContextMenuClose() { - clearTimeout(closeTimeout); - closeTimeout = setTimeout(function () { - if (tempStyle) { - text.style.cssText = tempStyle; - tempStyle = ''; - } - host.renderer.$isMousePressed = false; - if (host.renderer.$keepTextAreaAtCursor) - host.renderer.$moveTextAreaToCursor(); - }, 0); - } - - var onContextMenu = function(e) { - host.textInput.onContextMenu(e); - onContextMenuClose(); + event.capture(this.host.container, move, this.onContextMenuClose.bind(this)); }; - event.addListener(text, "mouseup", onContextMenu, host); - event.addListener(text, "mousedown", function(e) { - e.preventDefault(); - onContextMenuClose(); - }, host); - event.addListener(host.renderer.scroller, "contextmenu", onContextMenu, host); - event.addListener(text, "contextmenu", onContextMenu, host); - - if (isIOS) - addIosSelectionHandler(parentNode, host, text); - - function addIosSelectionHandler(parentNode, host, text) { - var typingResetTimeout = null; - var typing = false; - - text.addEventListener("keydown", function (e) { - if (typingResetTimeout) clearTimeout(typingResetTimeout); - typing = true; - }, true); - - text.addEventListener("keyup", function (e) { - typingResetTimeout = setTimeout(function () { - typing = false; - }, 100); - }, true); - var detectArrowKeys = function(e) { - if (document.activeElement !== text) return; - if (typing || inComposition || host.$mouseHandler.isMousePressed) return; - - if (copied) { - return; - } - var selectionStart = text.selectionStart; - var selectionEnd = text.selectionEnd; - - var key = null; - var modifier = 0; - if (selectionStart == 0) { - key = KEYS.up; - } else if (selectionStart == 1) { - key = KEYS.home; - } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd] == "\n") { - key = KEYS.end; - } else if (selectionStart < lastSelectionStart && lastValue[selectionStart - 1] == " ") { - key = KEYS.left; - modifier = MODS.option; - } else if ( - selectionStart < lastSelectionStart - || ( - selectionStart == lastSelectionStart - && lastSelectionEnd != lastSelectionStart - && selectionStart == selectionEnd - ) - ) { - key = KEYS.left; - } else if (selectionEnd > lastSelectionEnd && lastValue.slice(0, selectionEnd).split("\n").length > 2) { - key = KEYS.down; - } else if (selectionEnd > lastSelectionEnd && lastValue[selectionEnd - 1] == " ") { - key = KEYS.right; - modifier = MODS.option; - } else if ( - selectionEnd > lastSelectionEnd - || ( - selectionEnd == lastSelectionEnd - && lastSelectionEnd != lastSelectionStart - && selectionStart == selectionEnd - ) - ) { - key = KEYS.right; - } - - if (selectionStart !== selectionEnd) - modifier |= MODS.shift; - - if (key) { - var result = host.onCommandKey({}, modifier, key); - if (!result && host.commands) { - key = KEYS.keyCodeToString(key); - var command = host.commands.findKeyCommand(modifier, key); - if (command) - host.execCommand(command); - } - lastSelectionStart = selectionStart; - lastSelectionEnd = selectionEnd; - resetSelection(""); - } - }; - document.addEventListener("selectionchange", detectArrowKeys); - host.on("destroy", function() { - document.removeEventListener("selectionchange", detectArrowKeys); - }); - } - - this.destroy = function() { - if (text.parentElement) - text.parentElement.removeChild(text); + TextInput.prototype.destroy = function () { + if (this.text.parentElement) + this.text.parentElement.removeChild(this.text); }; -}; - + return TextInput; +}()); exports.TextInput = TextInput; -exports.$setUserAgentForTests = function(_isMobile, _isIOS) { +exports.$setUserAgentForTests = function (_isMobile, _isIOS) { isMobile = _isMobile; isIOS = _isIOS; }; -}); -define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module) { -"use strict"; +}); +define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"], function(require, exports, module){"use strict"; var useragent = require("../lib/useragent"); - var DRAG_OFFSET = 0; // pixels var SCROLL_COOLDOWN_T = 550; // milliseconds - -function DefaultHandlers(mouseHandler) { - mouseHandler.$clickSelection = null; - - var editor = mouseHandler.editor; - editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); - editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); - editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); - editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); - editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); - - var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", - "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; - - exports.forEach(function(x) { - mouseHandler[x] = this[x]; - }, this); - - mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); - mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); -} - -(function() { - - this.onMouseDown = function(ev) { +var DefaultHandlers = /** @class */ (function () { + function DefaultHandlers(mouseHandler) { + mouseHandler.$clickSelection = null; + var editor = mouseHandler.editor; + editor.setDefaultHandler("mousedown", this.onMouseDown.bind(mouseHandler)); + editor.setDefaultHandler("dblclick", this.onDoubleClick.bind(mouseHandler)); + editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); + editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); + editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", + "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; + exports.forEach(function (x) { + mouseHandler[x] = this[x]; + }, this); + mouseHandler["selectByLines"] = this.extendSelectionBy.bind(mouseHandler, "getLineRange"); + mouseHandler["selectByWords"] = this.extendSelectionBy.bind(mouseHandler, "getWordRange"); + } + DefaultHandlers.prototype.onMouseDown = function (ev) { var inSelection = ev.inSelection(); var pos = ev.getDocumentPosition(); this.mousedownEvent = ev; var editor = this.editor; - var button = ev.getButton(); if (button !== 0) { var selectionRange = editor.getSelectionRange(); @@ -2296,7 +2866,6 @@ function DefaultHandlers(mouseHandler) { } return; } - this.mousedownEvent.time = Date.now(); if (inSelection && !editor.isFocused()) { editor.focus(); @@ -2306,41 +2875,37 @@ function DefaultHandlers(mouseHandler) { return; } } - this.captureMouse(ev); this.startSelect(pos, ev.domEvent._clicks > 1); return ev.preventDefault(); }; - - this.startSelect = function(pos, waitForClickSelection) { + DefaultHandlers.prototype.startSelect = function (pos, waitForClickSelection) { pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); var editor = this.editor; - if (!this.mousedownEvent) return; + if (!this.mousedownEvent) + return; if (this.mousedownEvent.getShiftKey()) editor.selection.selectToPosition(pos); else if (!waitForClickSelection) editor.selection.moveToPosition(pos); if (!waitForClickSelection) this.select(); - if (editor.renderer.scroller.setCapture) { - editor.renderer.scroller.setCapture(); - } editor.setStyle("ace_selecting"); this.setState("select"); }; - - this.select = function() { + DefaultHandlers.prototype.select = function () { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); if (this.$clickSelection) { var cmp = this.$clickSelection.comparePoint(cursor); - if (cmp == -1) { anchor = this.$clickSelection.end; - } else if (cmp == 1) { + } + else if (cmp == 1) { anchor = this.$clickSelection.start; - } else { - var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor, editor.session); cursor = orientedRange.cursor; anchor = orientedRange.anchor; } @@ -2349,28 +2914,29 @@ function DefaultHandlers(mouseHandler) { editor.selection.selectToPosition(cursor); editor.renderer.scrollCursorIntoView(); }; - - this.extendSelectionBy = function(unitName) { + DefaultHandlers.prototype.extendSelectionBy = function (unitName) { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); var range = editor.selection[unitName](cursor.row, cursor.column); if (this.$clickSelection) { var cmpStart = this.$clickSelection.comparePoint(range.start); var cmpEnd = this.$clickSelection.comparePoint(range.end); - if (cmpStart == -1 && cmpEnd <= 0) { anchor = this.$clickSelection.end; if (range.end.row != cursor.row || range.end.column != cursor.column) cursor = range.start; - } else if (cmpEnd == 1 && cmpStart >= 0) { + } + else if (cmpEnd == 1 && cmpStart >= 0) { anchor = this.$clickSelection.start; if (range.start.row != cursor.row || range.start.column != cursor.column) cursor = range.end; - } else if (cmpStart == -1 && cmpEnd == 1) { + } + else if (cmpStart == -1 && cmpEnd == 1) { cursor = range.end; anchor = range.start; - } else { - var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + } + else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor, editor.session); cursor = orientedRange.cursor; anchor = orientedRange.anchor; } @@ -2379,31 +2945,20 @@ function DefaultHandlers(mouseHandler) { editor.selection.selectToPosition(cursor); editor.renderer.scrollCursorIntoView(); }; - - this.selectEnd = - this.selectAllEnd = - this.selectByWordsEnd = - this.selectByLinesEnd = function() { + DefaultHandlers.prototype.selectByLinesEnd = function () { this.$clickSelection = null; this.editor.unsetStyle("ace_selecting"); - if (this.editor.renderer.scroller.releaseCapture) { - this.editor.renderer.scroller.releaseCapture(); - } }; - - this.focusWait = function() { + DefaultHandlers.prototype.focusWait = function () { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); var time = Date.now(); - if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimeout) this.startSelect(this.mousedownEvent.getDocumentPosition()); }; - - this.onDoubleClick = function(ev) { + DefaultHandlers.prototype.onDoubleClick = function (ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; var session = editor.session; - var range = session.getBracketRange(pos); if (range) { if (range.isEmpty()) { @@ -2411,50 +2966,44 @@ function DefaultHandlers(mouseHandler) { range.end.column++; } this.setState("select"); - } else { + } + else { range = editor.selection.getWordRange(pos.row, pos.column); this.setState("selectByWords"); } this.$clickSelection = range; this.select(); }; - - this.onTripleClick = function(ev) { + DefaultHandlers.prototype.onTripleClick = function (ev) { var pos = ev.getDocumentPosition(); var editor = this.editor; - this.setState("selectByLines"); var range = editor.getSelectionRange(); if (range.isMultiLine() && range.contains(pos.row, pos.column)) { this.$clickSelection = editor.selection.getLineRange(range.start.row); this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; - } else { + } + else { this.$clickSelection = editor.selection.getLineRange(pos.row); } this.select(); }; - - this.onQuadClick = function(ev) { + DefaultHandlers.prototype.onQuadClick = function (ev) { var editor = this.editor; - editor.selectAll(); this.$clickSelection = editor.getSelectionRange(); this.setState("selectAll"); }; - - this.onMouseWheel = function(ev) { + DefaultHandlers.prototype.onMouseWheel = function (ev) { if (ev.getAccelKey()) return; if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { ev.wheelX = ev.wheelY; ev.wheelY = 0; } - var editor = this.editor; - if (!this.$lastScroll) this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 }; - var prevScroll = this.$lastScroll; var t = ev.domEvent.timeStamp; var dt = t - prevScroll.t; @@ -2464,18 +3013,16 @@ function DefaultHandlers(mouseHandler) { vx = (vx + prevScroll.vx) / 2; vy = (vy + prevScroll.vy) / 2; } - var direction = Math.abs(vx / vy); - var canScroll = false; if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0)) canScroll = true; if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed)) canScroll = true; - if (canScroll) { prevScroll.allowed = t; - } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { + } + else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) { var isSlower = Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx) && Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy); if (isSlower) { @@ -2486,79 +3033,193 @@ function DefaultHandlers(mouseHandler) { prevScroll.allowed = 0; } } - prevScroll.t = t; prevScroll.vx = vx; prevScroll.vy = vy; - if (canScroll) { editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); return ev.stop(); } }; - -}).call(DefaultHandlers.prototype); - + return DefaultHandlers; +}()); +DefaultHandlers.prototype.selectEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectAllEnd = DefaultHandlers.prototype.selectByLinesEnd; +DefaultHandlers.prototype.selectByWordsEnd = DefaultHandlers.prototype.selectByLinesEnd; exports.DefaultHandlers = DefaultHandlers; - function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } - -function calcRangeOrientation(range, cursor) { +function calcRangeOrientation(range, cursor, session) { if (range.start.row == range.end.row) var cmp = 2 * cursor.column - range.start.column - range.end.column; else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) - var cmp = cursor.column - 4; + var cmp = 3 * cursor.column - 2 * session.getLine(range.start.row).length; else var cmp = 2 * cursor.row - range.start.row - range.end.row; - if (cmp < 0) - return {cursor: range.start, anchor: range.end}; + return { cursor: range.start, anchor: range.end }; else - return {cursor: range.end, anchor: range.start}; + return { cursor: range.end, anchor: range.start }; } }); -define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { -"use strict"; +define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = /** @class */ (function () { + function MouseEvent(domEvent, editor) { this.speed; this.wheelX; this.wheelY; + this.domEvent = domEvent; + this.editor = editor; + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + this.$pos = null; + this.$inSelection = null; + this.propagationStopped = false; + this.defaultPrevented = false; + } + MouseEvent.prototype.stopPropagation = function () { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + MouseEvent.prototype.preventDefault = function () { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + MouseEvent.prototype.stop = function () { + this.stopPropagation(); + this.preventDefault(); + }; + MouseEvent.prototype.getDocumentPosition = function () { + if (this.$pos) + return this.$pos; + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + MouseEvent.prototype.getGutterRow = function () { + var documentRow = this.getDocumentPosition().row; + var screenRow = this.editor.session.documentToScreenRow(documentRow, 0); + var screenTopRow = this.editor.session.documentToScreenRow(this.editor.renderer.$gutterLayer.$lines.get(0).row, 0); + return screenRow - screenTopRow; + }; + MouseEvent.prototype.inSelection = function () { + if (this.$inSelection !== null) + return this.$inSelection; + var editor = this.editor; + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + return this.$inSelection; + }; + MouseEvent.prototype.getButton = function () { + return event.getButton(this.domEvent); + }; + MouseEvent.prototype.getShiftKey = function () { + return this.domEvent.shiftKey; + }; + MouseEvent.prototype.getAccelKey = function () { + return useragent.isMac ? this.domEvent.metaKey : this.domEvent.ctrlKey; + }; + return MouseEvent; +}()); +exports.MouseEvent = MouseEvent; -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); +}); -var CLASSNAME = "ace_tooltip"; -function Tooltip (parentNode) { - this.isOpen = false; - this.$element = null; - this.$parentNode = parentNode; -} +define("ace/lib/scroll",["require","exports","module"], function(require, exports, module){exports.preventParentScroll = function preventParentScroll(event) { + event.stopPropagation(); + var target = event.currentTarget; + var contentOverflows = target.scrollHeight > target.clientHeight; + if (!contentOverflows) { + event.preventDefault(); + } +}; -(function() { - this.$init = function() { +}); + +define("ace/tooltip",["require","exports","module","ace/lib/dom","ace/lib/event","ace/range","ace/lib/scroll"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var Range = require("./range").Range; +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var CLASSNAME = "ace_tooltip"; +var Tooltip = /** @class */ (function () { + function Tooltip(parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; + } + Tooltip.prototype.$init = function () { this.$element = dom.createElement("div"); this.$element.className = CLASSNAME; this.$element.style.display = "none"; this.$parentNode.appendChild(this.$element); return this.$element; }; - this.getElement = function() { + Tooltip.prototype.getElement = function () { return this.$element || this.$init(); }; - this.setText = function(text) { + Tooltip.prototype.setText = function (text) { this.getElement().textContent = text; }; - this.setHtml = function(html) { + Tooltip.prototype.setHtml = function (html) { this.getElement().innerHTML = html; }; - this.setPosition = function(x, y) { + Tooltip.prototype.setPosition = function (x, y) { this.getElement().style.left = x + "px"; this.getElement().style.top = y + "px"; }; - this.setClassName = function(className) { + Tooltip.prototype.setClassName = function (className) { dom.addCssClass(this.getElement(), className); }; - this.show = function(text, x, y) { + Tooltip.prototype.setTheme = function (theme) { + if (this.theme) { + this.theme.isDark && dom.removeCssClass(this.getElement(), "ace_dark"); + this.theme.cssClass && dom.removeCssClass(this.getElement(), this.theme.cssClass); + } + if (theme.isDark) { + dom.addCssClass(this.getElement(), "ace_dark"); + } + if (theme.cssClass) { + dom.addCssClass(this.getElement(), theme.cssClass); + } + this.theme = { + isDark: theme.isDark, + cssClass: theme.cssClass + }; + }; + Tooltip.prototype.show = function (text, x, y) { if (text != null) this.setText(text); if (x != null && y != null) @@ -2568,56 +3229,340 @@ function Tooltip (parentNode) { this.isOpen = true; } }; - - this.hide = function() { + Tooltip.prototype.hide = function (e) { if (this.isOpen) { this.getElement().style.display = "none"; this.getElement().className = CLASSNAME; this.isOpen = false; } }; - this.getHeight = function() { + Tooltip.prototype.getHeight = function () { return this.getElement().offsetHeight; }; - this.getWidth = function() { + Tooltip.prototype.getWidth = function () { return this.getElement().offsetWidth; }; - - this.destroy = function() { + Tooltip.prototype.destroy = function () { this.isOpen = false; if (this.$element && this.$element.parentNode) { this.$element.parentNode.removeChild(this.$element); } }; - -}).call(Tooltip.prototype); - + return Tooltip; +}()); +var PopupManager = /** @class */ (function () { + function PopupManager() { + this.popups = []; + } + PopupManager.prototype.addPopup = function (popup) { + this.popups.push(popup); + this.updatePopups(); + }; + PopupManager.prototype.removePopup = function (popup) { + var index = this.popups.indexOf(popup); + if (index !== -1) { + this.popups.splice(index, 1); + this.updatePopups(); + } + }; + PopupManager.prototype.updatePopups = function () { + var e_1, _a, e_2, _b; + this.popups.sort(function (a, b) { return b.priority - a.priority; }); + var visiblepopups = []; + try { + for (var _c = __values(this.popups), _d = _c.next(); !_d.done; _d = _c.next()) { + var popup = _d.value; + var shouldDisplay = true; + try { + for (var visiblepopups_1 = (e_2 = void 0, __values(visiblepopups)), visiblepopups_1_1 = visiblepopups_1.next(); !visiblepopups_1_1.done; visiblepopups_1_1 = visiblepopups_1.next()) { + var visiblePopup = visiblepopups_1_1.value; + if (this.doPopupsOverlap(visiblePopup, popup)) { + shouldDisplay = false; + break; + } + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (visiblepopups_1_1 && !visiblepopups_1_1.done && (_b = visiblepopups_1.return)) _b.call(visiblepopups_1); + } + finally { if (e_2) throw e_2.error; } + } + if (shouldDisplay) { + visiblepopups.push(popup); + } + else { + popup.hide(); + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + }; + PopupManager.prototype.doPopupsOverlap = function (popupA, popupB) { + var rectA = popupA.getElement().getBoundingClientRect(); + var rectB = popupB.getElement().getBoundingClientRect(); + return (rectA.left < rectB.right && rectA.right > rectB.left && rectA.top < rectB.bottom && rectA.bottom + > rectB.top); + }; + return PopupManager; +}()); +var popupManager = new PopupManager(); +exports.popupManager = popupManager; exports.Tooltip = Tooltip; -}); - -define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { -"use strict"; -var dom = require("../lib/dom"); -var oop = require("../lib/oop"); -var event = require("../lib/event"); -var Tooltip = require("../tooltip").Tooltip; - +var HoverTooltip = /** @class */ (function (_super) { + __extends(HoverTooltip, _super); + function HoverTooltip(parentNode) { + if (parentNode === void 0) { parentNode = document.body; } + var _this = _super.call(this, parentNode) || this; + _this.timeout = undefined; + _this.lastT = 0; + _this.idleTime = 350; + _this.lastEvent = undefined; + _this.onMouseOut = _this.onMouseOut.bind(_this); + _this.onMouseMove = _this.onMouseMove.bind(_this); + _this.waitForHover = _this.waitForHover.bind(_this); + _this.hide = _this.hide.bind(_this); + var el = _this.getElement(); + el.style.whiteSpace = "pre-wrap"; + el.style.pointerEvents = "auto"; + el.addEventListener("mouseout", _this.onMouseOut); + el.tabIndex = -1; + el.addEventListener("blur", function () { + if (!el.contains(document.activeElement)) + this.hide(); + }.bind(_this)); + el.addEventListener("wheel", preventParentScroll); + return _this; + } + HoverTooltip.prototype.addToEditor = function (editor) { + editor.on("mousemove", this.onMouseMove); + editor.on("mousedown", this.hide); + var target = editor.renderer.getMouseEventTarget(); + if (target && typeof target.removeEventListener === "function") { + target.addEventListener("mouseout", this.onMouseOut, true); + } + }; + HoverTooltip.prototype.removeFromEditor = function (editor) { + editor.off("mousemove", this.onMouseMove); + editor.off("mousedown", this.hide); + var target = editor.renderer.getMouseEventTarget(); + if (target && typeof target.removeEventListener === "function") { + target.removeEventListener("mouseout", this.onMouseOut, true); + } + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + }; + HoverTooltip.prototype.onMouseMove = function (e, editor) { + this.lastEvent = e; + this.lastT = Date.now(); + var isMousePressed = editor.$mouseHandler.isMousePressed; + if (this.isOpen) { + var pos = this.lastEvent && this.lastEvent.getDocumentPosition(); + if (!this.range + || !this.range.contains(pos.row, pos.column) + || isMousePressed + || this.isOutsideOfText(this.lastEvent)) { + this.hide(); + } + } + if (this.timeout || isMousePressed) + return; + this.lastEvent = e; + this.timeout = setTimeout(this.waitForHover, this.idleTime); + }; + HoverTooltip.prototype.waitForHover = function () { + if (this.timeout) + clearTimeout(this.timeout); + var dt = Date.now() - this.lastT; + if (this.idleTime - dt > 10) { + this.timeout = setTimeout(this.waitForHover, this.idleTime - dt); + return; + } + this.timeout = null; + if (this.lastEvent && !this.isOutsideOfText(this.lastEvent)) { + this.$gatherData(this.lastEvent, this.lastEvent.editor); + } + }; + HoverTooltip.prototype.isOutsideOfText = function (e) { + var editor = e.editor; + var docPos = e.getDocumentPosition(); + var line = editor.session.getLine(docPos.row); + if (docPos.column == line.length) { + var screenPos = editor.renderer.pixelToScreenCoordinates(e.clientX, e.clientY); + var clippedPos = editor.session.documentToScreenPosition(docPos.row, docPos.column); + if (clippedPos.column != screenPos.column + || clippedPos.row != screenPos.row) { + return true; + } + } + return false; + }; + HoverTooltip.prototype.setDataProvider = function (value) { + this.$gatherData = value; + }; + HoverTooltip.prototype.showForRange = function (editor, range, domNode, startingEvent) { + if (startingEvent && startingEvent != this.lastEvent) + return; + if (this.isOpen && document.activeElement == this.getElement()) + return; + var renderer = editor.renderer; + if (!this.isOpen) { + popupManager.addPopup(this); + this.$registerCloseEvents(); + this.setTheme(renderer.theme); + } + this.isOpen = true; + this.range = Range.fromPoints(range.start, range.end); + var position = renderer.textToScreenCoordinates(range.start.row, range.start.column); + var rect = renderer.scroller.getBoundingClientRect(); + if (position.pageX < rect.left) + position.pageX = rect.left; + var element = this.getElement(); + element.innerHTML = ""; + element.appendChild(domNode); + element.style.maxHeight = ""; + element.style.display = "block"; + this.$setPosition(editor, position, true, range); + dom.$fixPositionBug(element); + }; + HoverTooltip.prototype.$setPosition = function (editor, position, withMarker, range) { + var MARGIN = 10; + withMarker && this.addMarker(range, editor.session); + var renderer = editor.renderer; + var element = this.getElement(); + var labelHeight = element.offsetHeight; + var labelWidth = element.offsetWidth; + var anchorTop = position.pageY; + var anchorLeft = position.pageX; + var spaceBelow = window.innerHeight - anchorTop - renderer.lineHeight; + var isAbove = this.$shouldPlaceAbove(labelHeight, anchorTop, spaceBelow - MARGIN); + element.style.maxHeight = (isAbove ? anchorTop : spaceBelow) - MARGIN + "px"; + element.style.top = isAbove ? "" : anchorTop + renderer.lineHeight + "px"; + element.style.bottom = isAbove ? window.innerHeight - anchorTop + "px" : ""; + element.style.left = Math.min(anchorLeft, window.innerWidth - labelWidth - MARGIN) + "px"; + }; + HoverTooltip.prototype.$shouldPlaceAbove = function (labelHeight, anchorTop, spaceBelow) { + return !(anchorTop - labelHeight < 0 && anchorTop < spaceBelow); + }; + HoverTooltip.prototype.addMarker = function (range, session) { + if (this.marker) { + this.$markerSession.removeMarker(this.marker); + } + this.$markerSession = session; + this.marker = session && session.addMarker(range, "ace_highlight-marker", "text"); + }; + HoverTooltip.prototype.hide = function (e) { + if (e && this.$fromKeyboard && e.type == "keydown") { + if (e.code == "Escape") { + return; + } + } + if (!e && document.activeElement == this.getElement()) + return; + if (e && e.target && (e.type != "keydown" || e.ctrlKey || e.metaKey) && this.$element.contains(e.target)) + return; + this.lastEvent = null; + if (this.timeout) + clearTimeout(this.timeout); + this.timeout = null; + this.addMarker(null); + if (this.isOpen) { + this.$fromKeyboard = false; + this.$removeCloseEvents(); + this.getElement().style.display = "none"; + this.isOpen = false; + popupManager.removePopup(this); + } + }; + HoverTooltip.prototype.$registerCloseEvents = function () { + window.addEventListener("keydown", this.hide, true); + window.addEventListener("wheel", this.hide, true); + window.addEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.$removeCloseEvents = function () { + window.removeEventListener("keydown", this.hide, true); + window.removeEventListener("wheel", this.hide, true); + window.removeEventListener("mousedown", this.hide, true); + }; + HoverTooltip.prototype.onMouseOut = function (e) { + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.lastEvent = null; + if (!this.isOpen) + return; + if (!e.relatedTarget || this.getElement().contains(e.relatedTarget)) + return; + if (e && e.currentTarget.contains(e.relatedTarget)) + return; + if (!e.relatedTarget.classList.contains("ace_content")) + this.hide(); + }; + return HoverTooltip; +}(Tooltip)); +exports.HoverTooltip = HoverTooltip; + +}); + +define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/mouse/mouse_event","ace/tooltip","ace/config","ace/range"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var dom = require("../lib/dom"); +var MouseEvent = require("./mouse_event").MouseEvent; +var HoverTooltip = require("../tooltip").HoverTooltip; +var nls = require("../config").nls; +var Range = require("../range").Range; function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; var gutter = editor.renderer.$gutterLayer; - var tooltip = new GutterTooltip(editor.container); - - mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + mouseHandler.$tooltip = new GutterTooltip(editor); + mouseHandler.$tooltip.addToEditor(editor); + mouseHandler.$tooltip.setDataProvider(function (e, editor) { + var row = e.getDocumentPosition().row; + mouseHandler.$tooltip.showTooltip(row); + }); + mouseHandler.editor.setDefaultHandler("guttermousedown", function (e) { if (!editor.isFocused() || e.getButton() != 0) return; var gutterRegion = gutter.getRegion(e); - if (gutterRegion == "foldWidgets") return; - var row = e.getDocumentPosition().row; var selection = editor.session.selection; - if (e.getShiftKey()) selection.selectTo(row, 0); else { @@ -2631,232 +3576,245 @@ function GutterHandler(mouseHandler) { mouseHandler.captureMouse(e); return e.preventDefault(); }); - - - var tooltipTimeout, mouseEvent, tooltipAnnotation; - - function showTooltip() { - var row = mouseEvent.getDocumentPosition().row; - var annotation = gutter.$annotations[row]; - if (!annotation) - return hideTooltip(); - - var maxRow = editor.session.getLength(); - if (row == maxRow) { - var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; - var pos = mouseEvent.$pos; - if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) - return hideTooltip(); - } - - - if (tooltipAnnotation == annotation) - return; - tooltipAnnotation = annotation.text.join("
"); - if (!tooltipAnnotation.length) return - - tooltip.setHtml(tooltipAnnotation); - var annotationClassName = annotation.className; - if (annotationClassName) { - tooltip.setClassName(annotationClassName.trim()); - } - - tooltip.show(); - editor._signal("showGutterTooltip", tooltip); - - editor.on("mousewheel", hideTooltip); - - if (mouseHandler.$tooltipFollowsMouse) { - moveTooltip(mouseEvent); - } else { - var gutterElement = mouseEvent.domEvent.target; - var rect = gutterElement.getBoundingClientRect(); - var style = tooltip.getElement().style; - style.left = rect.right + "px"; - style.top = rect.bottom + "px"; - } - } - - function hideTooltip() { - if (tooltipTimeout) - tooltipTimeout = clearTimeout(tooltipTimeout); - if (tooltipAnnotation) { - tooltip.hide(); - tooltipAnnotation = null; - editor._signal("hideGutterTooltip", tooltip); - editor.off("mousewheel", hideTooltip); - } - } - - function moveTooltip(e) { - tooltip.setPosition(e.x, e.y); +} +exports.GutterHandler = GutterHandler; +var GutterTooltip = /** @class */ (function (_super) { + __extends(GutterTooltip, _super); + function GutterTooltip(editor) { + var _this = _super.call(this, editor.container) || this; + _this.id = "gt" + (++GutterTooltip.$uid); + _this.editor = editor; + _this.visibleTooltipRow; + var el = _this.getElement(); + el.setAttribute("role", "tooltip"); + el.setAttribute("id", _this.id); + el.style.pointerEvents = "auto"; + _this.idleTime = 50; + _this.onDomMouseMove = _this.onDomMouseMove.bind(_this); + _this.onDomMouseOut = _this.onDomMouseOut.bind(_this); + _this.setClassName("ace_gutter-tooltip"); + return _this; } - - mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { - var target = e.domEvent.target || e.domEvent.srcElement; - if (dom.hasCssClass(target, "ace_fold-widget")) - return hideTooltip(); - - if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse) - moveTooltip(e); - - mouseEvent = e; - if (tooltipTimeout) - return; - tooltipTimeout = setTimeout(function() { - tooltipTimeout = null; - if (mouseEvent && !mouseHandler.isMousePressed) - showTooltip(); - else - hideTooltip(); - }, 50); + GutterTooltip.prototype.onDomMouseMove = function (domEvent) { + var aceEvent = new MouseEvent(domEvent, this.editor); + this.onMouseMove(aceEvent, this.editor); + }; + GutterTooltip.prototype.onDomMouseOut = function (domEvent) { + var aceEvent = new MouseEvent(domEvent, this.editor); + this.onMouseOut(aceEvent); + }; + GutterTooltip.prototype.addToEditor = function (editor) { + var gutter = editor.renderer.$gutter; + gutter.addEventListener("mousemove", this.onDomMouseMove); + gutter.addEventListener("mouseout", this.onDomMouseOut); + _super.prototype.addToEditor.call(this, editor); + }; + GutterTooltip.prototype.removeFromEditor = function (editor) { + var gutter = editor.renderer.$gutter; + gutter.removeEventListener("mousemove", this.onDomMouseMove); + gutter.removeEventListener("mouseout", this.onDomMouseOut); + _super.prototype.removeFromEditor.call(this, editor); + }; + GutterTooltip.prototype.destroy = function () { + if (this.editor) { + this.removeFromEditor(this.editor); + } + _super.prototype.destroy.call(this); + }; + Object.defineProperty(GutterTooltip, "annotationLabels", { + get: function () { + return { + error: { + singular: nls("gutter-tooltip.aria-label.error.singular", "error"), + plural: nls("gutter-tooltip.aria-label.error.plural", "errors") + }, + security: { + singular: nls("gutter-tooltip.aria-label.security.singular", "security finding"), + plural: nls("gutter-tooltip.aria-label.security.plural", "security findings") + }, + warning: { + singular: nls("gutter-tooltip.aria-label.warning.singular", "warning"), + plural: nls("gutter-tooltip.aria-label.warning.plural", "warnings") + }, + info: { + singular: nls("gutter-tooltip.aria-label.info.singular", "information message"), + plural: nls("gutter-tooltip.aria-label.info.plural", "information messages") + }, + hint: { + singular: nls("gutter-tooltip.aria-label.hint.singular", "suggestion"), + plural: nls("gutter-tooltip.aria-label.hint.plural", "suggestions") + } + }; + }, + enumerable: false, + configurable: true }); - - event.addListener(editor.renderer.$gutter, "mouseout", function(e) { - mouseEvent = null; - if (!tooltipAnnotation || tooltipTimeout) + GutterTooltip.prototype.showTooltip = function (row) { + var _a; + var gutter = this.editor.renderer.$gutterLayer; + var annotationsInRow = gutter.$annotations[row]; + var annotation; + if (annotationsInRow) + annotation = { + displayText: Array.from(annotationsInRow.displayText), + type: Array.from(annotationsInRow.type) + }; + else + annotation = { displayText: [], type: [] }; + var fold = gutter.session.getFoldLine(row); + if (fold && gutter.$showFoldedAnnotations) { + var annotationsInFold = { error: [], security: [], warning: [], info: [], hint: [] }; + var severityRank = { error: 1, security: 2, warning: 3, info: 4, hint: 5 }; + var mostSevereAnnotationTypeInFold; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!gutter.$annotations[i]) + continue; + for (var j = 0; j < gutter.$annotations[i].text.length; j++) { + var annotationType = gutter.$annotations[i].type[j]; + annotationsInFold[annotationType].push(gutter.$annotations[i].text[j]); + if (!mostSevereAnnotationTypeInFold || + severityRank[annotationType] < severityRank[mostSevereAnnotationTypeInFold]) { + mostSevereAnnotationTypeInFold = annotationType; + } + } + } + if (["error", "security", "warning"].includes(mostSevereAnnotationTypeInFold)) { + var summaryFoldedAnnotations = "".concat(GutterTooltip.annotationsToSummaryString(annotationsInFold), " in folded code."); + annotation.displayText.push(summaryFoldedAnnotations); + annotation.type.push(mostSevereAnnotationTypeInFold + "_fold"); + } + } + if (annotation.displayText.length === 0) + return this.hide(); + var annotationMessages = { error: [], security: [], warning: [], info: [], hint: [] }; + var iconClassName = gutter.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + for (var i = 0; i < annotation.displayText.length; i++) { + var lineElement = dom.createElement("span"); + var iconElement = dom.createElement("span"); + (_a = iconElement.classList).add.apply(_a, ["ace_".concat(annotation.type[i]), iconClassName]); + iconElement.setAttribute("aria-label", "".concat(GutterTooltip.annotationLabels[annotation.type[i].replace("_fold", "")].singular)); + iconElement.setAttribute("role", "img"); + iconElement.appendChild(dom.createTextNode(" ")); + lineElement.appendChild(iconElement); + lineElement.appendChild(dom.createTextNode(annotation.displayText[i])); + lineElement.appendChild(dom.createElement("br")); + annotationMessages[annotation.type[i].replace("_fold", "")].push(lineElement); + } + var tooltipElement = dom.createElement("span"); + annotationMessages.error.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.security.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.warning.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.info.forEach(function (el) { return tooltipElement.appendChild(el); }); + annotationMessages.hint.forEach(function (el) { return tooltipElement.appendChild(el); }); + tooltipElement.setAttribute("aria-live", "polite"); + var annotationNode = this.$findLinkedAnnotationNode(row); + if (annotationNode) { + annotationNode.setAttribute("aria-describedby", this.id); + } + var range = Range.fromPoints({ row: row, column: 0 }, { row: row, column: 0 }); + this.showForRange(this.editor, range, tooltipElement); + this.visibleTooltipRow = row; + this.editor._signal("showGutterTooltip", this); + }; + GutterTooltip.prototype.$setPosition = function (editor, _ignoredPosition, _withMarker, range) { + var gutterCell = this.$findCellByRow(range.start.row); + if (!gutterCell) return; - - tooltipTimeout = setTimeout(function() { - tooltipTimeout = null; - hideTooltip(); - }, 50); - }, editor); - - editor.on("changeSession", hideTooltip); -} - -function GutterTooltip(parentNode) { - Tooltip.call(this, parentNode); -} - -oop.inherits(GutterTooltip, Tooltip); - -(function(){ - this.setPosition = function(x, y) { - var windowWidth = window.innerWidth || document.documentElement.clientWidth; - var windowHeight = window.innerHeight || document.documentElement.clientHeight; - var width = this.getWidth(); - var height = this.getHeight(); - x += 15; - y += 15; - if (x + width > windowWidth) { - x -= (x + width) - windowWidth; - } - if (y + height > windowHeight) { - y -= 20 + height; - } - Tooltip.prototype.setPosition.call(this, x, y); - }; - -}).call(GutterTooltip.prototype); - - - -exports.GutterHandler = GutterHandler; - -}); - -define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -var MouseEvent = exports.MouseEvent = function(domEvent, editor) { - this.domEvent = domEvent; - this.editor = editor; - - this.x = this.clientX = domEvent.clientX; - this.y = this.clientY = domEvent.clientY; - - this.$pos = null; - this.$inSelection = null; - - this.propagationStopped = false; - this.defaultPrevented = false; -}; - -(function() { - - this.stopPropagation = function() { - event.stopPropagation(this.domEvent); - this.propagationStopped = true; + var el = gutterCell && gutterCell.element; + var anchorEl = el && (el.querySelector(".ace_gutter_annotation")); + if (!anchorEl) + return; + var r = anchorEl.getBoundingClientRect(); + if (!r) + return; + var position = { + pageX: r.right, + pageY: r.top + }; + return _super.prototype.$setPosition.call(this, editor, position, false, range); }; - - this.preventDefault = function() { - event.preventDefault(this.domEvent); - this.defaultPrevented = true; + GutterTooltip.prototype.$shouldPlaceAbove = function (labelHeight, anchorTop, spaceBelow) { + return spaceBelow < labelHeight; }; - - this.stop = function() { - this.stopPropagation(); - this.preventDefault(); + GutterTooltip.prototype.$findLinkedAnnotationNode = function (row) { + var cell = this.$findCellByRow(row); + if (cell) { + var element = cell.element; + if (element.childNodes.length > 2) { + return element.childNodes[2]; + } + } }; - this.getDocumentPosition = function() { - if (this.$pos) - return this.$pos; - - this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); - return this.$pos; + GutterTooltip.prototype.$findCellByRow = function (row) { + return this.editor.renderer.$gutterLayer.$lines.cells.find(function (el) { return el.row === row; }); }; - this.inSelection = function() { - if (this.$inSelection !== null) - return this.$inSelection; - - var editor = this.editor; - - - var selectionRange = editor.getSelectionRange(); - if (selectionRange.isEmpty()) - this.$inSelection = false; - else { - var pos = this.getDocumentPosition(); - this.$inSelection = selectionRange.contains(pos.row, pos.column); + GutterTooltip.prototype.hide = function (e) { + if (!this.isOpen) { + return; } - - return this.$inSelection; + this.$element.removeAttribute("aria-live"); + if (this.visibleTooltipRow != undefined) { + var annotationNode = this.$findLinkedAnnotationNode(this.visibleTooltipRow); + if (annotationNode) { + annotationNode.removeAttribute("aria-describedby"); + } + } + this.visibleTooltipRow = undefined; + this.editor._signal("hideGutterTooltip", this); + _super.prototype.hide.call(this, e); }; - this.getButton = function() { - return event.getButton(this.domEvent); + GutterTooltip.annotationsToSummaryString = function (annotations) { + var e_1, _a; + var summary = []; + var annotationTypes = ["error", "security", "warning", "info", "hint"]; + try { + for (var annotationTypes_1 = __values(annotationTypes), annotationTypes_1_1 = annotationTypes_1.next(); !annotationTypes_1_1.done; annotationTypes_1_1 = annotationTypes_1.next()) { + var annotationType = annotationTypes_1_1.value; + if (!annotations[annotationType].length) + continue; + var label = annotations[annotationType].length === 1 ? GutterTooltip.annotationLabels[annotationType].singular : GutterTooltip.annotationLabels[annotationType].plural; + summary.push("".concat(annotations[annotationType].length, " ").concat(label)); + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (annotationTypes_1_1 && !annotationTypes_1_1.done && (_a = annotationTypes_1.return)) _a.call(annotationTypes_1); + } + finally { if (e_1) throw e_1.error; } + } + return summary.join(", "); }; - this.getShiftKey = function() { - return this.domEvent.shiftKey; + GutterTooltip.prototype.isOutsideOfText = function (e) { + var editor = e.editor; + var rect = editor.renderer.$gutter.getBoundingClientRect(); + return !(e.clientX >= rect.left && e.clientX <= rect.right && + e.clientY >= rect.top && e.clientY <= rect.bottom); }; - - this.getAccelKey = useragent.isMac - ? function() { return this.domEvent.metaKey; } - : function() { return this.domEvent.ctrlKey; }; - -}).call(MouseEvent.prototype); + return GutterTooltip; +}(HoverTooltip)); +GutterTooltip.$uid = 0; +exports.GutterTooltip = GutterTooltip; }); -define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - +define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); var event = require("../lib/event"); var useragent = require("../lib/useragent"); - var AUTOSCROLL_DELAY = 200; var SCROLL_CURSOR_DELAY = 200; var SCROLL_CURSOR_HYSTERESIS = 5; - function DragdropHandler(mouseHandler) { - var editor = mouseHandler.editor; - var dragImage = dom.createElement("div"); dragImage.style.cssText = "top:-100px;position:absolute;z-index:2147483647;opacity:0.5"; dragImage.textContent = "\xa0"; - var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; - - exports.forEach(function(x) { + exports.forEach(function (x) { mouseHandler[x] = this[x]; }, this); editor.on("mousedown", this.onMouseDown.bind(mouseHandler)); - var mouseTarget = editor.container; var dragSelectionMarker, x, y; var timerId, range; @@ -2866,34 +3824,29 @@ function DragdropHandler(mouseHandler) { var autoScrollStartTime; var cursorMovedTime; var cursorPointOnCaretMoved; - - this.onDragStart = function(e) { + this.onDragStart = function (e) { if (this.cancelDrag || !mouseTarget.draggable) { var self = this; - setTimeout(function(){ + setTimeout(function () { self.startSelect(); self.captureMouse(e); }, 0); return e.preventDefault(); } range = editor.getSelectionRange(); - var dataTransfer = e.dataTransfer; dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; editor.container.appendChild(dragImage); - dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0); - setTimeout(function() { + setTimeout(function () { editor.container.removeChild(dragImage); }); dataTransfer.clearData(); dataTransfer.setData("Text", editor.session.getTextRange()); - isInternal = true; this.setState("drag"); }; - - this.onDragEnd = function(e) { + this.onDragEnd = function (e) { mouseTarget.draggable = false; isInternal = false; this.setState(null); @@ -2906,8 +3859,7 @@ function DragdropHandler(mouseHandler) { this.editor.unsetStyle("ace_dragging"); this.editor.renderer.setCursorStyle(""); }; - - this.onDragEnter = function(e) { + this.onDragEnter = function (e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; x = e.clientX; @@ -2918,8 +3870,7 @@ function DragdropHandler(mouseHandler) { e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; - - this.onDragOver = function(e) { + this.onDragOver = function (e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; x = e.clientX; @@ -2930,12 +3881,10 @@ function DragdropHandler(mouseHandler) { } if (onMouseMoveTimer !== null) onMouseMoveTimer = null; - e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); }; - - this.onDragLeave = function(e) { + this.onDragLeave = function (e) { counter--; if (counter <= 0 && dragSelectionMarker) { clearDragMarker(); @@ -2943,8 +3892,7 @@ function DragdropHandler(mouseHandler) { return event.preventDefault(e); } }; - - this.onDrop = function(e) { + this.onDrop = function (e) { if (!dragCursor) return; var dataTransfer = e.dataTransfer; @@ -2956,7 +3904,8 @@ function DragdropHandler(mouseHandler) { start: dragCursor, end: dragCursor }; - } else { + } + else { range = editor.moveText(range, dragCursor); } break; @@ -2964,7 +3913,8 @@ function DragdropHandler(mouseHandler) { range = editor.moveText(range, dragCursor, true); break; } - } else { + } + else { var dropData = dataTransfer.getData('Text'); range = { start: dragCursor, @@ -2976,14 +3926,12 @@ function DragdropHandler(mouseHandler) { clearDragMarker(); return event.preventDefault(e); }; - event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler), editor); event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler), editor); event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler), editor); - function scrollCursorIntoView(cursor, prevCursor) { var now = Date.now(); var vMovement = !prevCursor || cursor.row != prevCursor.row; @@ -2991,36 +3939,37 @@ function DragdropHandler(mouseHandler) { if (!cursorMovedTime || vMovement || hMovement) { editor.moveCursorToPosition(cursor); cursorMovedTime = now; - cursorPointOnCaretMoved = {x: x, y: y}; - } else { + cursorPointOnCaretMoved = { x: x, y: y }; + } + else { var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); if (distance > SCROLL_CURSOR_HYSTERESIS) { cursorMovedTime = null; - } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + } + else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { editor.renderer.scrollCursorIntoView(); cursorMovedTime = null; } } } - function autoScroll(cursor, prevCursor) { var now = Date.now(); var lineHeight = editor.renderer.layerConfig.lineHeight; var characterWidth = editor.renderer.layerConfig.characterWidth; var editorRect = editor.renderer.scroller.getBoundingClientRect(); var offsets = { - x: { - left: x - editorRect.left, - right: editorRect.right - x - }, - y: { - top: y - editorRect.top, - bottom: editorRect.bottom - y - } + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } }; var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); - var scrollCursor = {row: cursor.row, column: cursor.column}; + var scrollCursor = { row: cursor.row, column: cursor.column }; if (nearestXOffset / characterWidth <= 2) { scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); } @@ -3035,18 +3984,17 @@ function DragdropHandler(mouseHandler) { autoScrollStartTime = now; else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) editor.renderer.scrollCursorIntoView(scrollCursor); - } else { + } + else { autoScrollStartTime = null; } } - function onDragInterval() { var prevCursor = dragCursor; dragCursor = editor.renderer.screenToTextCoordinates(x, y); scrollCursorIntoView(dragCursor, prevCursor); autoScroll(dragCursor, prevCursor); } - function addDragMarker() { range = editor.selection.toOrientedRange(); dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); @@ -3059,7 +4007,6 @@ function DragdropHandler(mouseHandler) { counter = 0; event.addListener(document, "mousemove", onMouseMove); } - function clearDragMarker() { clearInterval(timerId); editor.session.removeMarker(dragSelectionMarker); @@ -3077,65 +4024,56 @@ function DragdropHandler(mouseHandler) { var onMouseMoveTimer = null; function onMouseMove() { if (onMouseMoveTimer == null) { - onMouseMoveTimer = setTimeout(function() { + onMouseMoveTimer = setTimeout(function () { if (onMouseMoveTimer != null && dragSelectionMarker) clearDragMarker(); }, 20); } } - function canAccept(dataTransfer) { var types = dataTransfer.types; - return !types || Array.prototype.some.call(types, function(type) { + return !types || Array.prototype.some.call(types, function (type) { return type == 'text/plain' || type == 'Text'; }); } - function getDropEffect(e) { var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; - var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; var effectAllowed = "uninitialized"; try { effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); - } catch (e) {} + } + catch (e) { } var dropEffect = "none"; - if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; else if (moveAllowed.indexOf(effectAllowed) >= 0) dropEffect = "move"; else if (copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = "copy"; - return dropEffect; } } - -(function() { - - this.dragWait = function() { +(function () { + this.dragWait = function () { var interval = Date.now() - this.mousedownEvent.time; if (interval > this.editor.getDragDelay()) this.startDrag(); }; - - this.dragWaitEnd = function() { + this.dragWaitEnd = function () { var target = this.editor.container; target.draggable = false; this.startSelect(this.mousedownEvent.getDocumentPosition()); this.selectEnd(); }; - - this.dragReadyEnd = function(e) { + this.dragReadyEnd = function (e) { this.editor.$resetCursorStyle(); this.editor.unsetStyle("ace_dragging"); this.editor.renderer.setCursorStyle(""); this.dragWaitEnd(); }; - - this.startDrag = function(){ + this.startDrag = function () { this.cancelDrag = false; var editor = this.editor; var target = editor.container; @@ -3146,8 +4084,7 @@ function DragdropHandler(mouseHandler) { editor.renderer.setCursorStyle(cursorStyle); this.setState("dragReady"); }; - - this.onMouseDrag = function(e) { + this.onMouseDrag = function (e) { var target = this.editor.container; if (useragent.isIE && this.state == "dragReady") { var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); @@ -3162,13 +4099,11 @@ function DragdropHandler(mouseHandler) { } } }; - - this.onMouseDown = function(e) { + this.onMouseDown = function (e) { if (!this.$dragEnabled) return; this.mousedownEvent = e; var editor = this.editor; - var inSelection = e.inSelection(); var button = e.getButton(); var clickCount = e.domEvent.detail || 1; @@ -3186,33 +4121,27 @@ function DragdropHandler(mouseHandler) { mouseTarget.draggable = true; } this.setState("dragWait"); - } else { + } + else { this.startDrag(); } this.captureMouse(e, this.onMouseDrag.bind(this)); e.defaultPrevented = true; } }; - }).call(DragdropHandler.prototype); - - function calcDistance(ax, ay, bx, by) { return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); } - exports.DragdropHandler = DragdropHandler; }); -define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"], function(require, exports, module){"use strict"; var MouseEvent = require("./mouse_event").MouseEvent; var event = require("../lib/event"); var dom = require("../lib/dom"); - -exports.addTouchListeners = function(el, editor) { +exports.addTouchListeners = function (el, editor) { var mode = "scroll"; var startX; var startY; @@ -3227,29 +4156,27 @@ exports.addTouchListeners = function(el, editor) { var vY = 0; var pressed; var contextMenu; - function createContextMenu() { var clipboard = window.navigator && window.navigator.clipboard; var isOpen = false; - var updateMenu = function() { + var updateMenu = function () { var selected = editor.getCopyText(); var hasUndo = editor.session.getUndoManager().hasUndo(); - contextMenu.replaceChild( - dom.buildDom(isOpen ? ["span", - !selected && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], - selected && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], - selected && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], - clipboard && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], - hasUndo && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], - ["span", { class: "ace_mobile-button", action: "find" }, "Find"], - ["span", { class: "ace_mobile-button", action: "openCommandPallete" }, "Pallete"] - ] : ["span"]), - contextMenu.firstChild - ); + contextMenu.replaceChild(dom.buildDom(isOpen ? ["span", + !selected && canExecuteCommand("selectall") && ["span", { class: "ace_mobile-button", action: "selectall" }, "Select All"], + selected && canExecuteCommand("copy") && ["span", { class: "ace_mobile-button", action: "copy" }, "Copy"], + selected && canExecuteCommand("cut") && ["span", { class: "ace_mobile-button", action: "cut" }, "Cut"], + clipboard && canExecuteCommand("paste") && ["span", { class: "ace_mobile-button", action: "paste" }, "Paste"], + hasUndo && canExecuteCommand("undo") && ["span", { class: "ace_mobile-button", action: "undo" }, "Undo"], + canExecuteCommand("find") && ["span", { class: "ace_mobile-button", action: "find" }, "Find"], + canExecuteCommand("openCommandPalette") && ["span", { class: "ace_mobile-button", action: "openCommandPalette" }, "Palette"] + ] : ["span"]), contextMenu.firstChild); + }; + var canExecuteCommand = function (/** @type {string} */ cmd) { + return editor.commands.canExecute(cmd, editor); }; - var handleClick = function(e) { + var handleClick = function (e) { var action = e.target.getAttribute("action"); - if (action == "more" || !isOpen) { isOpen = !isOpen; return updateMenu(); @@ -3270,31 +4197,38 @@ exports.addTouchListeners = function(el, editor) { } contextMenu.firstChild.style.display = "none"; isOpen = false; - if (action != "openCommandPallete") + if (action != "openCommandPalette") editor.focus(); }; contextMenu = dom.buildDom(["div", { class: "ace_mobile-menu", - ontouchstart: function(e) { - mode = "menu"; - e.stopPropagation(); - e.preventDefault(); - editor.textInput.focus(); - }, - ontouchend: function(e) { - e.stopPropagation(); - e.preventDefault(); - handleClick(e); - }, onclick: handleClick }, ["span"], ["span", { class: "ace_mobile-button", action: "more" }, "..."] ], editor.container); + contextMenu.addEventListener("touchstart", function (e) { + mode = "menu"; + e.stopPropagation(); + e.preventDefault(); + editor.textInput.focus(); + }); + contextMenu.addEventListener("touchend", function (e) { + e.stopPropagation(); + e.preventDefault(); + handleClick(e); + }); } function showContextMenu() { - if (!contextMenu) createContextMenu(); + if (!editor.getOption("enableMobileMenu")) { + if (contextMenu) { + hideContextMenu(); + } + return; + } + if (!contextMenu) + createContextMenu(); var cursor = editor.selection.cursor; var pagePos = editor.renderer.textToScreenCoordinates(cursor.row, cursor.column); var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX; @@ -3304,7 +4238,8 @@ exports.addTouchListeners = function(el, editor) { if (pagePos.pageX - rect.left < rect.width - 70) { contextMenu.style.left = ""; contextMenu.style.right = "10px"; - } else { + } + else { contextMenu.style.right = ""; contextMenu.style.left = leftOffset + scrollLeft - rect.left + "px"; } @@ -3317,7 +4252,6 @@ exports.addTouchListeners = function(el, editor) { contextMenu.style.display = "none"; editor.off("input", hideContextMenu); } - function handleLongTap() { longTouchTimer = null; clearTimeout(longTouchTimer); @@ -3339,13 +4273,15 @@ exports.addTouchListeners = function(el, editor) { : editor.session.getBracketRange(pos); if (range && !range.isEmpty()) { editor.selection.setRange(range); - } else { + } + else { editor.selection.selectWord(); } mode = "wait"; } - event.addListener(el, "contextmenu", function(e) { - if (!pressed) return; + event.addListener(el, "contextmenu", function (e) { + if (!pressed) + return; var textarea = editor.textInput.getElement(); textarea.focus(); }, editor); @@ -3358,7 +4294,6 @@ exports.addTouchListeners = function(el, editor) { mode = "zoom"; return; } - pressed = editor.$mouseHandler.isMousePressed = true; var h = editor.renderer.layerConfig.lineHeight; var w = editor.renderer.layerConfig.lineHeight; @@ -3369,51 +4304,39 @@ exports.addTouchListeners = function(el, editor) { var y = touchObj.clientY; if (Math.abs(startX - x) + Math.abs(startY - y) > h) touchStartT = -1; - startX = e.clientX = x; startY = e.clientY = y; vX = vY = 0; - var ev = new MouseEvent(e, editor); pos = ev.getDocumentPosition(); - if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) { clickCount++; e.preventDefault(); e.button = 0; switchToSelectionMode(); - } else { + } + else { clickCount = 0; var cursor = editor.selection.cursor; var anchor = editor.selection.isEmpty() ? cursor : editor.selection.anchor; - var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(cursor, true); var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(anchor, true); var rect = editor.renderer.scroller.getBoundingClientRect(); var offsetTop = editor.renderer.layerConfig.offset; var offsetLeft = editor.renderer.scrollLeft; - var weightedDistance = function(x, y) { + var weightedDistance = function (x, y) { x = x / w; y = y / h - 0.75; return x * x + y * y; }; - if (e.clientX < rect.left) { mode = "zoom"; return; } - - var diff1 = weightedDistance( - e.clientX - rect.left - cursorPos.left + offsetLeft, - e.clientY - rect.top - cursorPos.top + offsetTop - ); - var diff2 = weightedDistance( - e.clientX - rect.left - anchorPos.left + offsetLeft, - e.clientY - rect.top - anchorPos.top + offsetTop - ); + var diff1 = weightedDistance(e.clientX - rect.left - cursorPos.left + offsetLeft, e.clientY - rect.top - cursorPos.top + offsetTop); + var diff2 = weightedDistance(e.clientX - rect.left - anchorPos.left + offsetLeft, e.clientY - rect.top - anchorPos.top + offsetTop); if (diff1 < 3.5 && diff2 < 3.5) mode = diff1 > diff2 ? "cursor" : "anchor"; - if (diff2 < 3.5) mode = "anchor"; else if (diff1 < 3.5) @@ -3424,21 +4347,24 @@ exports.addTouchListeners = function(el, editor) { } touchStartT = t; }, editor); - event.addListener(el, "touchend", function (e) { pressed = editor.$mouseHandler.isMousePressed = false; - if (animationTimer) clearInterval(animationTimer); + if (animationTimer) + clearInterval(animationTimer); if (mode == "zoom") { mode = ""; animationSteps = 0; - } else if (longTouchTimer) { + } + else if (longTouchTimer) { editor.selection.moveToPosition(pos); animationSteps = 0; showContextMenu(); - } else if (mode == "scroll") { + } + else if (mode == "scroll") { animate(); hideContextMenu(); - } else { + } + else { showContextMenu(); } clearTimeout(longTouchTimer); @@ -3450,26 +4376,21 @@ exports.addTouchListeners = function(el, editor) { longTouchTimer = null; } var touches = e.touches; - if (touches.length > 1 || mode == "zoom") return; - + if (touches.length > 1 || mode == "zoom") + return; var touchObj = touches[0]; - var wheelX = startX - touchObj.clientX; var wheelY = startY - touchObj.clientY; - if (mode == "wait") { if (wheelX * wheelX + wheelY * wheelY > 4) mode = "cursor"; else return e.preventDefault(); } - startX = touchObj.clientX; startY = touchObj.clientY; - e.clientX = touchObj.clientX; e.clientY = touchObj.clientY; - var t = e.timeStamp; var dt = t - lastT; lastT = t; @@ -3478,8 +4399,10 @@ exports.addTouchListeners = function(el, editor) { mouseEvent.speed = 1; mouseEvent.wheelX = wheelX; mouseEvent.wheelY = wheelY; - if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0; - if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0; + if (10 * Math.abs(wheelX) < Math.abs(wheelY)) + wheelX = 0; + if (10 * Math.abs(wheelY) < Math.abs(wheelX)) + wheelY = 0; if (dt != 0) { vX = wheelX / dt; vY = wheelY / dt; @@ -3500,18 +4423,21 @@ exports.addTouchListeners = function(el, editor) { e.preventDefault(); } }, editor); - function animate() { animationSteps += 60; - animationTimer = setInterval(function() { + animationTimer = setInterval(function () { if (animationSteps-- <= 0) { clearInterval(animationTimer); animationTimer = null; } - if (Math.abs(vX) < 0.01) vX = 0; - if (Math.abs(vY) < 0.01) vY = 0; - if (animationSteps < 20) vX = 0.9 * vX; - if (animationSteps < 20) vY = 0.9 * vY; + if (Math.abs(vX) < 0.01) + vX = 0; + if (Math.abs(vY) < 0.01) + vY = 0; + if (animationSteps < 20) + vX = 0.9 * vX; + if (animationSteps < 20) + vY = 0.9 * vY; var oldScrollTop = editor.session.getScrollTop(); editor.renderer.scrollBy(10 * vX, 10 * vY); if (oldScrollTop == editor.session.getScrollTop()) @@ -3522,1674 +4448,1067 @@ exports.addTouchListeners = function(el, editor) { }); -define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; -var dom = require("./dom"); - -exports.get = function (url, callback) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - callback(xhr.responseText); - } +define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"], function(require, exports, module){"use strict"; +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var DefaultHandlers = require("./default_handlers").DefaultHandlers; +var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; +var MouseEvent = require("./mouse_event").MouseEvent; +var DragdropHandler = require("./dragdrop_handler").DragdropHandler; +var addTouchListeners = require("./touch_handler").addTouchListeners; +var config = require("../config"); +var MouseHandler = /** @class */ (function () { + function MouseHandler(editor) { this.$dragDelay; this.$dragEnabled; this.$mouseMoved; this.mouseEvent; this.$focusTimeout; + var _self = this; + this.editor = editor; + new DefaultHandlers(this); + new DefaultGutterHandler(this); + new DragdropHandler(this); + var focusEditor = function (e) { + var windowBlurred = !document.hasFocus || !document.hasFocus() + || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement()); + if (windowBlurred) + window.focus(); + editor.focus(); + setTimeout(function () { + if (!editor.isFocused()) + editor.focus(); + }); + }; + var mouseTarget = editor.renderer.getMouseEventTarget(); + event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"), editor); + event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"), editor); + event.addMultiMouseDownListener([ + mouseTarget, + editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner, + editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner, + editor.textInput && editor.textInput.getElement() + ].filter(Boolean), [400, 300, 250], this, "onMouseEvent", editor); + event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"), editor); + addTouchListeners(editor.container, editor); + var gutterEl = editor.renderer.$gutter; + event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), editor); + event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"), editor); + event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), editor); + event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), editor); + event.addListener(mouseTarget, "mousedown", focusEditor, editor); + event.addListener(gutterEl, "mousedown", focusEditor, editor); + if (useragent.isIE && editor.renderer.scrollBarV) { + event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor, editor); + event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor, editor); + } + editor.on("mousemove", function (e) { + if (_self.state || _self.$dragDelay || !_self.$dragEnabled) + return; + var character = editor.renderer.screenToTextCoordinates(e.x, e.y); + var range = editor.session.selection.getRange(); + var renderer = editor.renderer; + if (!range.isEmpty() && range.insideStart(character.row, character.column)) { + renderer.setCursorStyle("default"); + } + else { + renderer.setCursorStyle(""); + } + }, //@ts-expect-error TODO: seems mistyping - should be boolean + editor); + } + MouseHandler.prototype.onMouseEvent = function (name, e) { + if (!this.editor.session) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); }; - xhr.send(null); -}; - -exports.loadScript = function(path, callback) { - var head = dom.getDocumentHead(); - var s = document.createElement('script'); - - s.src = path; - head.appendChild(s); - - s.onload = s.onreadystatechange = function(_, isAbort) { - if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { - s = s.onload = s.onreadystatechange = null; - if (!isAbort) - callback(); + MouseHandler.prototype.onMouseMove = function (name, e) { + var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; + if (!listeners || !listeners.length) + return; + this.editor._emit(name, new MouseEvent(e, this.editor)); + }; + MouseHandler.prototype.onMouseWheel = function (name, e) { + var mouseEvent = new MouseEvent(e, this.editor); + mouseEvent.speed = this.$scrollSpeed * 2; + mouseEvent.wheelX = e.wheelX; + mouseEvent.wheelY = e.wheelY; + this.editor._emit(name, mouseEvent); + }; + MouseHandler.prototype.setState = function (state) { + this.state = state; + }; + MouseHandler.prototype.captureMouse = function (ev, mouseMoveHandler) { + this.x = ev.x; + this.y = ev.y; + this.isMousePressed = true; + var editor = this.editor; + var renderer = this.editor.renderer; + renderer.$isMousePressed = true; + var self = this; + var continueCapture = true; + var onMouseMove = function (e) { + if (!e) + return; + if (useragent.isWebKit && !e.which && self.releaseMouse) + return self.releaseMouse(); + self.x = e.clientX; + self.y = e.clientY; + mouseMoveHandler && mouseMoveHandler(e); + self.mouseEvent = new MouseEvent(e, self.editor); + self.$mouseMoved = true; + }; + var onCaptureEnd = function (e) { + editor.off("beforeEndOperation", onOperationEnd); + continueCapture = false; + if (editor.session) + onCaptureUpdate(); + self[self.state + "End"] && self[self.state + "End"](e); + self.state = ""; + self.isMousePressed = renderer.$isMousePressed = false; + if (renderer.$keepTextAreaAtCursor) + renderer.$moveTextAreaToCursor(); + self.$onCaptureMouseMove = self.releaseMouse = null; + e && self.onMouseEvent("mouseup", e); + editor.endOperation(); + }; + var onCaptureUpdate = function () { + self[self.state] && self[self.state](); + self.$mouseMoved = false; + }; + var onCaptureInterval = function () { + if (continueCapture) { + onCaptureUpdate(); + event.nextFrame(onCaptureInterval); + } + }; + if (useragent.isOldIE && ev.domEvent.type == "dblclick") { + return setTimeout(function () { onCaptureEnd(ev); }); } + var onOperationEnd = function (e) { + if (!self.releaseMouse) + return; + if (editor.curOp.command.name && editor.curOp.selectionChanged) { + self[self.state + "End"] && self[self.state + "End"](); + self.state = ""; + self.releaseMouse(); + } + }; + editor.on("beforeEndOperation", onOperationEnd); + editor.startOperation({ command: { name: "mouse" } }); + self.$onCaptureMouseMove = onMouseMove; + self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); + onCaptureInterval(); }; -}; -exports.qualifyURL = function(url) { - var a = document.createElement('a'); - a.href = url; - return a.href; -}; - + MouseHandler.prototype.cancelContextMenu = function () { + var stop = function (e) { + if (e && e.domEvent && e.domEvent.type != "contextmenu") + return; + this.editor.off("nativecontextmenu", stop); + if (e && e.domEvent) + event.stopEvent(e.domEvent); + }.bind(this); + setTimeout(stop, 10); + this.editor.on("nativecontextmenu", stop); + }; + MouseHandler.prototype.destroy = function () { + if (this.releaseMouse) + this.releaseMouse(); + if (this.$tooltip) + this.$tooltip.destroy(); + }; + return MouseHandler; +}()); +MouseHandler.prototype.releaseMouse = null; +config.defineOptions(MouseHandler.prototype, "mouseHandler", { + scrollSpeed: { initialValue: 2 }, + dragDelay: { initialValue: (useragent.isMac ? 150 : 0) }, + dragEnabled: { initialValue: true }, + focusTimeout: { initialValue: 0 }, }); +exports.MouseHandler = MouseHandler; -define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { -"use strict"; - -var EventEmitter = {}; -var stopPropagation = function() { this.propagationStopped = true; }; -var preventDefault = function() { this.defaultPrevented = true; }; - -EventEmitter._emit = -EventEmitter._dispatchEvent = function(eventName, e) { - this._eventRegistry || (this._eventRegistry = {}); - this._defaultHandlers || (this._defaultHandlers = {}); - - var listeners = this._eventRegistry[eventName] || []; - var defaultHandler = this._defaultHandlers[eventName]; - if (!listeners.length && !defaultHandler) - return; - - if (typeof e != "object" || !e) - e = {}; - - if (!e.type) - e.type = eventName; - if (!e.stopPropagation) - e.stopPropagation = stopPropagation; - if (!e.preventDefault) - e.preventDefault = preventDefault; - - listeners = listeners.slice(); - for (var i=0; i 0) { + if (action == 0x10) { + for (i = condPos; i < ix; i++) { + levels[i] = 1; + } + condPos = -1; + } + else { + condPos = -1; + } + } + cond = impTab[newState][6]; + if (cond) { + if (condPos == -1) { + condPos = ix; + } + } + else { + if (condPos > -1) { + for (i = condPos; i < ix; i++) { + levels[i] = newLevel; + } + condPos = -1; + } + } + if (charTypes[ix] == B) { + levels[ix] = 0; + } + hiLevel |= newLevel; + } + if (hasUBAT_S) { + for (i = 0; i < len; i++) { + if (charTypes[i] == S) { + levels[i] = dir; + for (var j = i - 1; j >= 0; j--) { + if (charTypes[j] == WS) { + levels[j] = dir; + } + else { + break; + } + } + } } - if (opt.forwardTo) - return this[opt.forwardTo] && this[opt.forwardTo].getOption(name); - return opt && opt.get ? opt.get.call(this) : this["$" + name]; } -}; - -function warn(message) { - if (typeof console != "undefined" && console.warn) - console.warn.apply(console, arguments); } - -function reportError(msg, data) { - var e = new Error(msg); - e.data = data; - if (typeof console == "object" && console.error) - console.error(e); - setTimeout(function() { throw e; }); +function _invertLevel(lev, levels, _array) { + if (hiLevel < lev) { + return; + } + if (lev == 1 && dir == RTL && !hasUBAT_B) { + _array.reverse(); + return; + } + var len = _array.length, start = 0, end, lo, hi, tmp; + while (start < len) { + if (levels[start] >= lev) { + end = start + 1; + while (end < len && levels[end] >= lev) { + end++; + } + for (lo = start, hi = end - 1; lo < hi; lo++, hi--) { + tmp = _array[lo]; + _array[lo] = _array[hi]; + _array[hi] = tmp; + } + start = end; + } + start++; + } } - -var AppConfig = function() { - this.$defaultOptions = {}; +function _getCharClass(chars, types, classes, ix) { + var cType = types[ix], wType, nType, len, i; + switch (cType) { + case L: + case R: + lastArabic = false; + case ON: + case AN: + return cType; + case EN: + return lastArabic ? AN : EN; + case AL: + lastArabic = true; + hasUBAT_AL = true; + return R; + case WS: + return ON; + case CS: + if (ix < 1 || (ix + 1) >= types.length || + ((wType = classes[ix - 1]) != EN && wType != AN) || + ((nType = types[ix + 1]) != EN && nType != AN)) { + return ON; + } + if (lastArabic) { + nType = AN; + } + return nType == wType ? nType : ON; + case ES: + wType = ix > 0 ? classes[ix - 1] : B; + if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN) { + return EN; + } + return ON; + case ET: + if (ix > 0 && classes[ix - 1] == EN) { + return EN; + } + if (lastArabic) { + return ON; + } + i = ix + 1; + len = types.length; + while (i < len && types[i] == ET) { + i++; + } + if (i < len && types[i] == EN) { + return EN; + } + return ON; + case NSM: + len = types.length; + i = ix + 1; + while (i < len && types[i] == NSM) { + i++; + } + if (i < len) { + var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; + wType = types[i]; + if (rtlCandidate && (wType == R || wType == AL)) { + return R; + } + } + if (ix < 1 || (wType = types[ix - 1]) == B) { + return ON; + } + return classes[ix - 1]; + case B: + lastArabic = false; + hasUBAT_B = true; + return dir; + case S: + hasUBAT_S = true; + return ON; + case LRE: + case RLE: + case LRO: + case RLO: + case PDF: + lastArabic = false; + case BN: + return ON; + } +} +function _getCharacterType(ch) { + var uc = ch.charCodeAt(0), hi = uc >> 8; + if (hi == 0) { + return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); + } + else if (hi == 5) { + return (/[\u0591-\u05f4]/.test(ch) ? R : L); + } + else if (hi == 6) { + if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) + return NSM; + else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) + return AN; + else if (uc == 0x066A) + return ET; + else if (/[\u06f0-\u06f9]/.test(ch)) + return EN; + else + return AL; + } + else if (hi == 0x20 && uc <= 0x205F) { + return UnicodeTBL20[uc & 0xFF]; + } + else if (hi == 0xFE) { + return (uc >= 0xFE70 ? AL : ON); + } + return ON; +} +function _isArabicDiacritics(ch) { + return (ch >= '\u064b' && ch <= '\u0655'); +} +exports.L = L; +exports.R = R; +exports.EN = EN; +exports.ON_R = 3; +exports.AN = 4; +exports.R_H = 5; +exports.B = 6; +exports.RLE = 7; +exports.DOT = "\xB7"; +exports.doBidiReorder = function (text, textCharTypes, isRtl) { + if (text.length < 2) + return {}; + var chars = text.split(""), logicalFromVisual = new Array(chars.length), bidiLevels = new Array(chars.length), levels = []; + dir = isRtl ? RTL : LTR; + _computeLevels(chars, levels, chars.length, textCharTypes); + for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++) + ; + _invertLevel(2, levels, logicalFromVisual); + _invertLevel(1, levels, logicalFromVisual); + for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width + if (textCharTypes[i] === AN) { + levels[i] = exports.AN; + } + else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) + || textCharTypes[i] === ON || textCharTypes[i] === BN)) { + levels[i] = exports.ON_R; + } + else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { + levels[i - 1] = levels[i] = exports.R_H; + i++; + } + } + if (chars[chars.length - 1] === exports.DOT) + levels[chars.length - 1] = exports.B; + if (chars[0] === '\u202B') + levels[0] = exports.RLE; + for (var i = 0; i < logicalFromVisual.length; i++) { + bidiLevels[i] = levels[logicalFromVisual[i]]; + } + return { 'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels }; +}; +exports.hasBidiCharacters = function (text, textCharTypes) { + var ret = false; + for (var i = 0; i < text.length; i++) { + textCharTypes[i] = _getCharacterType(text.charAt(i)); + if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) + ret = true; + } + return ret; +}; +exports.getVisualFromLogicalIdx = function (logIdx, rowMap) { + for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { + if (rowMap.logicalFromVisual[i] == logIdx) + return i; + } + return 0; }; -(function() { - oop.implement(this, EventEmitter); - this.defineOptions = function(obj, path, options) { - if (!obj.$options) - this.$defaultOptions[path] = obj.$options = {}; - - Object.keys(options).forEach(function(key) { - var opt = options[key]; - if (typeof opt == "string") - opt = {forwardTo: opt}; - - opt.name || (opt.name = key); - obj.$options[opt.name] = opt; - if ("initialValue" in opt) - obj["$" + opt.name] = opt.initialValue; - }); - oop.implement(obj, optionsProvider); - - return this; - }; +}); - this.resetOptions = function(obj) { - Object.keys(obj.$options).forEach(function(key) { - var opt = obj.$options[key]; - if ("value" in opt) - obj.setOption(key, opt.value); - }); +define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module){"use strict"; +var bidiUtil = require("./lib/bidiutil"); +var lang = require("./lib/lang"); +var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; +var BidiHandler = /** @class */ (function () { + function BidiHandler(session) { + this.session = session; + this.bidiMap = {}; + this.currentRow = null; + this.bidiUtil = bidiUtil; + this.charWidths = []; + this.EOL = "\xAC"; + this.showInvisibles = true; + this.isRtlDir = false; + this.$isRtl = false; + this.line = ""; + this.wrapIndent = 0; + this.EOF = "\xB6"; + this.RLE = "\u202B"; + this.contentWidth = 0; + this.fontMetrics = null; + this.rtlLineOffset = 0; + this.wrapOffset = 0; + this.isMoveLeftOperation = false; + this.seenBidi = bidiRE.test(session.getValue()); + } + BidiHandler.prototype.isBidiRow = function (screenRow, docRow, splitIndex) { + if (!this.seenBidi) + return false; + if (screenRow !== this.currentRow) { + this.currentRow = screenRow; + this.updateRowLine(docRow, splitIndex); + this.updateBidiMap(); + } + return this.bidiMap.bidiLevels; }; - - this.setDefaultValue = function(path, name, value) { - if (!path) { - for (path in this.$defaultOptions) - if (this.$defaultOptions[path][name]) - break; - if (!this.$defaultOptions[path][name]) - return false; + BidiHandler.prototype.onChange = function (delta) { + if (!this.seenBidi) { + if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { + this.seenBidi = true; + this.currentRow = null; + } } - var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {}); - if (opts[name]) { - if (opts.forwardTo) - this.setDefaultValue(opts.forwardTo, name, value); - else - opts[name].value = value; + else { + this.currentRow = null; } }; - - this.setDefaultValues = function(path, optionHash) { - Object.keys(optionHash).forEach(function(key) { - this.setDefaultValue(path, key, optionHash[key]); - }, this); - }; - - this.warn = warn; - this.reportError = reportError; - -}).call(AppConfig.prototype); - -exports.AppConfig = AppConfig; - -}); - -define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/dom","ace/lib/app_config"], function(require, exports, module) { -"no use strict"; - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var net = require("./lib/net"); -var dom = require("./lib/dom"); -var AppConfig = require("./lib/app_config").AppConfig; - -module.exports = exports = new AppConfig(); - -var global = (function() { - return this || typeof window != "undefined" && window; -})(); - -var options = { - packaged: false, - workerPath: null, - modePath: null, - themePath: null, - basePath: "", - suffix: ".js", - $moduleUrls: {}, - loadWorkerFromBlob: true, - sharedPopups: false, - useStrictCSP: null -}; - -exports.get = function(key) { - if (!options.hasOwnProperty(key)) - throw new Error("Unknown config key: " + key); - return options[key]; -}; - -exports.set = function(key, value) { - if (options.hasOwnProperty(key)) - options[key] = value; - else if (this.setDefaultValue("", key, value) == false) - throw new Error("Unknown config key: " + key); - if (key == "useStrictCSP") - dom.useStrictCSP(value); -}; - -exports.all = function() { - return lang.copyObject(options); -}; - -exports.$modes = {}; -exports.moduleUrl = function(name, component) { - if (options.$moduleUrls[name]) - return options.$moduleUrls[name]; - - var parts = name.split("/"); - component = component || parts[parts.length - 2] || ""; - var sep = component == "snippets" ? "/" : "-"; - var base = parts[parts.length - 1]; - if (component == "worker" && sep == "-") { - var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); - base = base.replace(re, ""); - } - - if ((!base || base == component) && parts.length > 1) - base = parts[parts.length - 2]; - var path = options[component + "Path"]; - if (path == null) { - path = options.basePath; - } else if (sep == "/") { - component = sep = ""; - } - if (path && path.slice(-1) != "/") - path += "/"; - return path + component + sep + base + this.get("suffix"); -}; - -exports.setModuleUrl = function(name, subst) { - return options.$moduleUrls[name] = subst; -}; - -exports.$loading = {}; -exports.loadModule = function(moduleName, onLoad) { - var module, moduleType; - if (Array.isArray(moduleName)) { - moduleType = moduleName[0]; - moduleName = moduleName[1]; - } - - try { - module = require(moduleName); - } catch (e) {} - if (module && !exports.$loading[moduleName]) - return onLoad && onLoad(module); - - if (!exports.$loading[moduleName]) - exports.$loading[moduleName] = []; - - exports.$loading[moduleName].push(onLoad); - - if (exports.$loading[moduleName].length > 1) - return; - - var afterLoad = function() { - require([moduleName], function(module) { - exports._emit("load.module", {name: moduleName, module: module}); - var listeners = exports.$loading[moduleName]; - exports.$loading[moduleName] = null; - listeners.forEach(function(onLoad) { - onLoad && onLoad(module); - }); - }); + BidiHandler.prototype.getDocumentRow = function () { + var docRow = 0; + var rowCache = this.session.$screenRowCache; + if (rowCache.length) { + var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); + if (index >= 0) + docRow = this.session.$docRowCache[index]; + } + return docRow; }; - - if (!exports.get("packaged")) - return afterLoad(); - - net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); - reportErrorIfPathIsNotConfigured(); -}; - -var reportErrorIfPathIsNotConfigured = function() { - if ( - !options.basePath && !options.workerPath - && !options.modePath && !options.themePath - && !Object.keys(options.$moduleUrls).length - ) { - console.error( - "Unable to infer path to ace from script src,", - "use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes", - "or with webpack use ace/webpack-resolver" - ); - reportErrorIfPathIsNotConfigured = function() {}; - } -}; -init(true);function init(packaged) { - - if (!global || !global.document) - return; - - options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); - - var scriptOptions = {}; - var scriptUrl = ""; - var currentScript = (document.currentScript || document._currentScript ); // native or polyfill - var currentDocument = currentScript && currentScript.ownerDocument || document; - - var scripts = currentDocument.getElementsByTagName("script"); - for (var i=0; i 0) { + currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); + if (currentIndex !== prevIndex) + break; + prevIndex = currentIndex; + splitIndex++; } } - - var m = src.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/); - if (m) - scriptUrl = m[1]; - } - - if (scriptUrl) { - scriptOptions.base = scriptOptions.base || scriptUrl; - scriptOptions.packaged = true; - } - - scriptOptions.basePath = scriptOptions.base; - scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base; - scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base; - scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base; - delete scriptOptions.base; - - for (var key in scriptOptions) - if (typeof scriptOptions[key] !== "undefined") - exports.set(key, scriptOptions[key]); -} - -exports.init = init; - -function deHyphenate(str) { - return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); }); -} - -exports.version = "1.7.1"; - -}); - -define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/mouse/touch_handler","ace/config"], function(require, exports, module) { -"use strict"; - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -var DefaultHandlers = require("./default_handlers").DefaultHandlers; -var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; -var MouseEvent = require("./mouse_event").MouseEvent; -var DragdropHandler = require("./dragdrop_handler").DragdropHandler; -var addTouchListeners = require("./touch_handler").addTouchListeners; -var config = require("../config"); - -var MouseHandler = function(editor) { - var _self = this; - this.editor = editor; - - new DefaultHandlers(this); - new DefaultGutterHandler(this); - new DragdropHandler(this); - - var focusEditor = function(e) { - var windowBlurred = !document.hasFocus || !document.hasFocus() - || !editor.isFocused() && document.activeElement == (editor.textInput && editor.textInput.getElement()); - if (windowBlurred) - window.focus(); - editor.focus(); - setTimeout(function () { - if (!editor.isFocused()) editor.focus(); + else { + splitIndex = this.currentRow; + } + return splitIndex; + }; + BidiHandler.prototype.updateRowLine = function (docRow, splitIndex) { + if (docRow === undefined) + docRow = this.getDocumentRow(); + var isLastRow = (docRow === this.session.getLength() - 1), endOfLine = isLastRow ? this.EOF : this.EOL; + this.wrapIndent = 0; + this.line = this.session.getLine(docRow); + this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; + if (this.session.$useWrapMode) { + var splits = this.session.$wrapData[docRow]; + if (splits) { + if (splitIndex === undefined) + splitIndex = this.getSplitIndex(); + if (splitIndex > 0 && splits.length) { + this.wrapIndent = splits.indent; + this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; + this.line = (splitIndex < splits.length) ? + this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : + this.line.substring(splits[splits.length - 1]); + } + else { + this.line = this.line.substring(0, splits[splitIndex]); + } + if (splitIndex == splits.length) { + this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; + } + } + } + else { + this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; + } + var session = this.session, shift = 0, size; + this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function (ch, i) { + if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { + size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; + shift += size - 1; + return lang.stringRepeat(bidiUtil.DOT, size); + } + return ch; }); + if (this.isRtlDir) { + this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; + this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; + } }; - - var mouseTarget = editor.renderer.getMouseEventTarget(); - event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click"), editor); - event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove"), editor); - event.addMultiMouseDownListener([ - mouseTarget, - editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner, - editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner, - editor.textInput && editor.textInput.getElement() - ].filter(Boolean), [400, 300, 250], this, "onMouseEvent", editor); - event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel"), editor); - addTouchListeners(editor.container, editor); - - var gutterEl = editor.renderer.$gutter; - event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown"), editor); - event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick"), editor); - event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick"), editor); - event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove"), editor); - - event.addListener(mouseTarget, "mousedown", focusEditor, editor); - event.addListener(gutterEl, "mousedown", focusEditor, editor); - if (useragent.isIE && editor.renderer.scrollBarV) { - event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor, editor); - event.addListener(editor.renderer.scrollBarH.element, "mousedown", focusEditor, editor); - } - - editor.on("mousemove", function(e){ - if (_self.state || _self.$dragDelay || !_self.$dragEnabled) - return; - - var character = editor.renderer.screenToTextCoordinates(e.x, e.y); - var range = editor.session.selection.getRange(); - var renderer = editor.renderer; - - if (!range.isEmpty() && range.insideStart(character.row, character.column)) { - renderer.setCursorStyle("default"); - } else { - renderer.setCursorStyle(""); + BidiHandler.prototype.updateBidiMap = function () { + var textCharTypes = []; + if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { + this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); + } + else { + this.bidiMap = {}; } - }, editor); -}; - -(function() { - this.onMouseEvent = function(name, e) { - if (!this.editor.session) return; - this.editor._emit(name, new MouseEvent(e, this.editor)); }; - - this.onMouseMove = function(name, e) { - var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; - if (!listeners || !listeners.length) + BidiHandler.prototype.markAsDirty = function () { + this.currentRow = null; + }; + BidiHandler.prototype.updateCharacterWidths = function (fontMetrics) { + if (this.characterWidth === fontMetrics.$characterSize.width) return; - - this.editor._emit(name, new MouseEvent(e, this.editor)); + this.fontMetrics = fontMetrics; + var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; + var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); + this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; + this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; + this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; + this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; + this.currentRow = null; }; - - this.onMouseWheel = function(name, e) { - var mouseEvent = new MouseEvent(e, this.editor); - mouseEvent.speed = this.$scrollSpeed * 2; - mouseEvent.wheelX = e.wheelX; - mouseEvent.wheelY = e.wheelY; - - this.editor._emit(name, mouseEvent); + BidiHandler.prototype.setShowInvisibles = function (showInvisibles) { + this.showInvisibles = showInvisibles; + this.currentRow = null; }; - - this.setState = function(state) { - this.state = state; + BidiHandler.prototype.setEolChar = function (eolChar) { + this.EOL = eolChar; }; - - this.captureMouse = function(ev, mouseMoveHandler) { - this.x = ev.x; - this.y = ev.y; - - this.isMousePressed = true; - var editor = this.editor; - var renderer = this.editor.renderer; - renderer.$isMousePressed = true; - - var self = this; - var onMouseMove = function(e) { - if (!e) return; - if (useragent.isWebKit && !e.which && self.releaseMouse) - return self.releaseMouse(); - - self.x = e.clientX; - self.y = e.clientY; - mouseMoveHandler && mouseMoveHandler(e); - self.mouseEvent = new MouseEvent(e, self.editor); - self.$mouseMoved = true; - }; - - var onCaptureEnd = function(e) { - editor.off("beforeEndOperation", onOperationEnd); - clearInterval(timerId); - if (editor.session) onCaptureInterval(); - self[self.state + "End"] && self[self.state + "End"](e); - self.state = ""; - self.isMousePressed = renderer.$isMousePressed = false; - if (renderer.$keepTextAreaAtCursor) - renderer.$moveTextAreaToCursor(); - self.$onCaptureMouseMove = self.releaseMouse = null; - e && self.onMouseEvent("mouseup", e); - editor.endOperation(); - }; - - var onCaptureInterval = function() { - self[self.state] && self[self.state](); - self.$mouseMoved = false; - }; - - if (useragent.isOldIE && ev.domEvent.type == "dblclick") { - return setTimeout(function() {onCaptureEnd(ev);}); - } - - var onOperationEnd = function(e) { - if (!self.releaseMouse) return; - if (editor.curOp.command.name && editor.curOp.selectionChanged) { - self[self.state + "End"] && self[self.state + "End"](); - self.state = ""; - self.releaseMouse(); - } - }; - - editor.on("beforeEndOperation", onOperationEnd); - editor.startOperation({command: {name: "mouse"}}); - - self.$onCaptureMouseMove = onMouseMove; - self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); - var timerId = setInterval(onCaptureInterval, 20); + BidiHandler.prototype.setContentWidth = function (width) { + this.contentWidth = width; }; - this.releaseMouse = null; - this.cancelContextMenu = function() { - var stop = function(e) { - if (e && e.domEvent && e.domEvent.type != "contextmenu") - return; - this.editor.off("nativecontextmenu", stop); - if (e && e.domEvent) - event.stopEvent(e.domEvent); - }.bind(this); - setTimeout(stop, 10); - this.editor.on("nativecontextmenu", stop); + BidiHandler.prototype.isRtlLine = function (row) { + if (this.$isRtl) + return true; + if (row != undefined) + return (this.session.getLine(row).charAt(0) == this.RLE); + else + return this.isRtlDir; }; - this.destroy = function() { - if (this.releaseMouse) this.releaseMouse(); + BidiHandler.prototype.setRtlDirection = function (editor, isRtlDir) { + var cursor = editor.getCursorPosition(); + for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { + if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) + editor.session.doc.removeInLine(row, 0, 1); + else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) + editor.session.doc.insert({ column: 0, row: row }, editor.session.$bidiHandler.RLE); + } }; -}).call(MouseHandler.prototype); - -config.defineOptions(MouseHandler.prototype, "mouseHandler", { - scrollSpeed: {initialValue: 2}, - dragDelay: {initialValue: (useragent.isMac ? 150 : 0)}, - dragEnabled: {initialValue: true}, - focusTimeout: {initialValue: 0}, - tooltipFollowsMouse: {initialValue: true} -}); - - -exports.MouseHandler = MouseHandler; -}); - -define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; -var dom = require("../lib/dom"); - -function FoldHandler(editor) { - - editor.on("click", function(e) { - var position = e.getDocumentPosition(); - var session = editor.session; - var fold = session.getFoldAt(position.row, position.column, 1); - if (fold) { - if (e.getAccelKey()) - session.removeFold(fold); - else - session.expandFold(fold); - - e.stop(); + BidiHandler.prototype.getPosLeft = function (col) { + col -= this.wrapIndent; + var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; + var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; + var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), levels = this.bidiMap.bidiLevels, left = 0; + if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) + visualIdx++; + for (var i = 0; i < visualIdx; i++) { + left += this.charWidths[levels[i]]; } - - var target = e.domEvent && e.domEvent.target; - if (target && dom.hasCssClass(target, "ace_inline_button")) { - if (dom.hasCssClass(target, "ace_toggle_wrap")) { - session.setOption("wrap", !session.getUseWrapMode()); - editor.renderer.scrollCursorIntoView(); + if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) + left += this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + if (this.isRtlDir) + left += this.rtlLineOffset; + return left; + }; + BidiHandler.prototype.getSelections = function (startCol, endCol) { + var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, isSelected = false, isSelectedPrev = false, selectionStart = 0; + if (this.wrapIndent) + offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { + logIdx = map.logicalFromVisual[visIdx]; + level = levels[visIdx]; + isSelected = (logIdx >= selColMin) && (logIdx < selColMax); + if (isSelected && !isSelectedPrev) { + selectionStart = offset; } + else if (!isSelected && isSelectedPrev) { + selections.push({ left: selectionStart, width: offset - selectionStart }); + } + offset += this.charWidths[level]; + isSelectedPrev = isSelected; } - }); - - editor.on("gutterclick", function(e) { - var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - - if (gutterRegion == "foldWidgets") { - var row = e.getDocumentPosition().row; - var session = editor.session; - if (session.foldWidgets && session.foldWidgets[row]) - editor.session.onFoldWidgetClick(row, e); - if (!editor.isFocused()) - editor.focus(); - e.stop(); + if (isSelected && (visIdx === levels.length)) { + selections.push({ left: selectionStart, width: offset - selectionStart }); } - }); - - editor.on("gutterdblclick", function(e) { - var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - - if (gutterRegion == "foldWidgets") { - var row = e.getDocumentPosition().row; - var session = editor.session; - var data = session.getParentFoldRangeData(row, true); - var range = data.range || data.firstRange; - - if (range) { - row = range.start.row; - var fold = session.getFoldAt(row, session.getLine(row).length, 1); - - if (fold) { - session.removeFold(fold); - } else { - session.addFold("...", range); - editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0}); - } + if (this.isRtlDir) { + for (var i = 0; i < selections.length; i++) { + selections[i].left += this.rtlLineOffset; } - e.stop(); } - }); -} - -exports.FoldHandler = FoldHandler; + return selections; + }; + BidiHandler.prototype.offsetToCol = function (posX) { + if (this.isRtlDir) + posX -= this.rtlLineOffset; + var logicalIdx = 0, posX = Math.max(posX, 0), offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, charWidth = this.charWidths[levels[visualIdx]]; + if (this.wrapIndent) + posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; + while (posX > offset + charWidth / 2) { + offset += charWidth; + if (visualIdx === levels.length - 1) { + charWidth = 0; + break; + } + charWidth = this.charWidths[levels[++visualIdx]]; + } + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)) { + if (posX < offset) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)) { + logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] + : this.bidiMap.logicalFromVisual[visualIdx - 1]); + } + else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) + || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))) { + logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; + } + else { + if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) + visualIdx--; + logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; + } + if (logicalIdx === 0 && this.isRtlDir) + logicalIdx++; + return (logicalIdx + this.wrapIndent); + }; + return BidiHandler; +}()); +exports.BidiHandler = BidiHandler; }); -define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"], function(require, exports, module) { -"use strict"; - -var keyUtil = require("../lib/keys"); -var event = require("../lib/event"); - -var KeyBinding = function(editor) { - this.$editor = editor; - this.$data = {editor: editor}; - this.$handlers = []; - this.setDefaultHandler(editor.commands); -}; - -(function() { - this.setDefaultHandler = function(kb) { - this.removeKeyboardHandler(this.$defaultHandler); - this.$defaultHandler = kb; - this.addKeyboardHandler(kb, 0); +define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = /** @class */ (function () { + function Selection(session) { + this.session = session; + this.doc = session.getDocument(); + this.clearSelection(); + this.cursor = this.lead = this.doc.createAnchor(0, 0); + this.anchor = this.doc.createAnchor(0, 0); + this.$silent = false; + var self = this; + this.cursor.on("change", function (e) { + self.$cursorChanged = true; + if (!self.$silent) + self._emit("changeCursor"); + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + this.anchor.on("change", function () { + self.$anchorChanged = true; + if (!self.$isEmpty && !self.$silent) + self._emit("changeSelection"); + }); + } + Selection.prototype.isEmpty = function () { + return this.$isEmpty || (this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column); }; - - this.setKeyboardHandler = function(kb) { - var h = this.$handlers; - if (h[h.length - 1] == kb) - return; - - while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler) - this.removeKeyboardHandler(h[h.length - 1]); - - this.addKeyboardHandler(kb, 1); + Selection.prototype.isMultiLine = function () { + return !this.$isEmpty && this.anchor.row != this.cursor.row; }; - - this.addKeyboardHandler = function(kb, pos) { - if (!kb) - return; - if (typeof kb == "function" && !kb.handleKeyboard) - kb.handleKeyboard = kb; - var i = this.$handlers.indexOf(kb); - if (i != -1) - this.$handlers.splice(i, 1); - - if (pos == undefined) - this.$handlers.push(kb); - else - this.$handlers.splice(pos, 0, kb); - - if (i == -1 && kb.attach) - kb.attach(this.$editor); + Selection.prototype.getCursor = function () { + return this.lead.getPosition(); }; - - this.removeKeyboardHandler = function(kb) { - var i = this.$handlers.indexOf(kb); - if (i == -1) - return false; - this.$handlers.splice(i, 1); - kb.detach && kb.detach(this.$editor); - return true; + Selection.prototype.setAnchor = function (row, column) { + this.$isEmpty = false; + this.anchor.setPosition(row, column); }; - - this.getKeyboardHandler = function() { - return this.$handlers[this.$handlers.length - 1]; + Selection.prototype.getAnchor = function () { + if (this.$isEmpty) + return this.getSelectionLead(); + return this.anchor.getPosition(); }; - - this.getStatusText = function() { - var data = this.$data; - var editor = data.editor; - return this.$handlers.map(function(h) { - return h.getStatusText && h.getStatusText(editor, data) || ""; - }).filter(Boolean).join(" "); + Selection.prototype.getSelectionLead = function () { + return this.lead.getPosition(); }; - - this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) { - var toExecute; - var success = false; - var commands = this.$editor.commands; - - for (var i = this.$handlers.length; i--;) { - toExecute = this.$handlers[i].handleKeyboard( - this.$data, hashId, keyString, keyCode, e - ); - if (!toExecute || !toExecute.command) - continue; - if (toExecute.command == "null") { - success = true; - } else { - success = commands.exec(toExecute.command, this.$editor, toExecute.args, e); - } - if (success && e && hashId != -1 && - toExecute.passEvent != true && toExecute.command.passEvent != true - ) { - event.stopEvent(e); - } - if (success) - break; - } - - if (!success && hashId == -1) { - toExecute = {command: "insertstring"}; - success = commands.exec("insertstring", this.$editor, keyString); - } - - if (success && this.$editor._signal) - this.$editor._signal("keyboardActivity", toExecute); - - return success; - }; - - this.onCommandKey = function(e, hashId, keyCode) { - var keyString = keyUtil.keyCodeToString(keyCode); - return this.$callKeyboardHandlers(hashId, keyString, keyCode, e); + Selection.prototype.isBackwards = function () { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); }; - - this.onTextInput = function(text) { - return this.$callKeyboardHandlers(-1, text); + Selection.prototype.getRange = function () { + var anchor = this.anchor; + var lead = this.lead; + if (this.$isEmpty) + return Range.fromPoints(lead, lead); + return this.isBackwards() + ? Range.fromPoints(lead, anchor) + : Range.fromPoints(anchor, lead); }; - -}).call(KeyBinding.prototype); - -exports.KeyBinding = KeyBinding; -}); - -define("ace/lib/bidiutil",["require","exports","module"], function(require, exports, module) { -"use strict"; - -var ArabicAlefBetIntervalsBegine = ['\u0621', '\u0641']; -var ArabicAlefBetIntervalsEnd = ['\u063A', '\u064a']; -var dir = 0, hiLevel = 0; -var lastArabic = false, hasUBAT_AL = false, hasUBAT_B = false, hasUBAT_S = false, hasBlockSep = false, hasSegSep = false; - -var impTab_LTR = [ [ 0, 3, 0, 1, 0, 0, 0 ], [ 0, 3, 0, 1, 2, 2, 0 ], [ 0, 3, 0, 0x11, 2, 0, 1 ], [ 0, 3, 5, 5, 4, 1, 0 ], [ 0, 3, 0x15, 0x15, 4, 0, 1 ], [ 0, 3, 5, 5, 4, 2, 0 ] -]; - -var impTab_RTL = [ [ 2, 0, 1, 1, 0, 1, 0 ], [ 2, 0, 1, 1, 0, 2, 0 ], [ 2, 0, 2, 1, 3, 2, 0 ], [ 2, 0, 2, 0x21, 3, 1, 1 ] -]; - -var LTR = 0, RTL = 1; - -var L = 0; -var R = 1; -var EN = 2; -var AN = 3; -var ON = 4; -var B = 5; -var S = 6; -var AL = 7; -var WS = 8; -var CS = 9; -var ES = 10; -var ET = 11; -var NSM = 12; -var LRE = 13; -var RLE = 14; -var PDF = 15; -var LRO = 16; -var RLO = 17; -var BN = 18; - -var UnicodeTBL00 = [ -BN,BN,BN,BN,BN,BN,BN,BN,BN,S,B,S,WS,B,BN,BN, -BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,B,B,B,S, -WS,ON,ON,ET,ET,ET,ON,ON,ON,ON,ON,ES,CS,ES,CS,CS, -EN,EN,EN,EN,EN,EN,EN,EN,EN,EN,CS,ON,ON,ON,ON,ON, -ON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L, -L,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,ON, -ON,L,L,L,L,L,L,L,L,L,L,L,L,L,L,L, -L,L,L,L,L,L,L,L,L,L,L,ON,ON,ON,ON,BN, -BN,BN,BN,BN,BN,B,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN, -BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN,BN, -CS,ON,ET,ET,ET,ET,ON,ON,ON,ON,L,ON,ON,BN,ON,ON, -ET,ET,EN,EN,ON,L,ON,ON,ON,EN,L,ON,ON,ON,ON,ON -]; - -var UnicodeTBL20 = [ -WS,WS,WS,WS,WS,WS,WS,WS,WS,WS,WS,BN,BN,BN,L,R , -ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,ON,ON,ON,ON,WS,B,LRE,RLE,PDF,LRO,RLO,CS, -ET,ET,ET,ET,ET,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,CS,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON, -ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,ON,WS -]; - -function _computeLevels(chars, levels, len, charTypes) { - var impTab = dir ? impTab_RTL : impTab_LTR - , prevState = null, newClass = null, newLevel = null, newState = 0 - , action = null, cond = null, condPos = -1, i = null, ix = null, classes = []; - - if (!charTypes) { - for (i = 0, charTypes = []; i < len; i++) { - charTypes[i] = _getCharacterType(chars[i]); - } - } - hiLevel = dir; - lastArabic = false; - hasUBAT_AL = false; - hasUBAT_B = false; - hasUBAT_S = false; - for (ix = 0; ix < len; ix++){ - prevState = newState; - classes[ix] = newClass = _getCharClass(chars, charTypes, classes, ix); - newState = impTab[prevState][newClass]; - action = newState & 0xF0; - newState &= 0x0F; - levels[ix] = newLevel = impTab[newState][5]; - if (action > 0){ - if (action == 0x10){ - for(i = condPos; i < ix; i++){ - levels[i] = 1; - } - condPos = -1; - } else { - condPos = -1; - } - } - cond = impTab[newState][6]; - if (cond){ - if(condPos == -1){ - condPos = ix; - } - }else{ - if (condPos > -1){ - for(i = condPos; i < ix; i++){ - levels[i] = newLevel; - } - condPos = -1; - } - } - if (charTypes[ix] == B){ - levels[ix] = 0; - } - hiLevel |= newLevel; - } - if (hasUBAT_S){ - for(i = 0; i < len; i++){ - if(charTypes[i] == S){ - levels[i] = dir; - for(var j = i - 1; j >= 0; j--){ - if(charTypes[j] == WS){ - levels[j] = dir; - }else{ - break; - } - } - } - } - } -} - -function _invertLevel(lev, levels, _array) { - if (hiLevel < lev){ - return; - } - if (lev == 1 && dir == RTL && !hasUBAT_B){ - _array.reverse(); - return; - } - var len = _array.length, start = 0, end, lo, hi, tmp; - while(start < len){ - if (levels[start] >= lev){ - end = start + 1; - while(end < len && levels[end] >= lev){ - end++; - } - for(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){ - tmp = _array[lo]; - _array[lo] = _array[hi]; - _array[hi] = tmp; - } - start = end; - } - start++; - } -} - -function _getCharClass(chars, types, classes, ix) { - var cType = types[ix], wType, nType, len, i; - switch(cType){ - case L: - case R: - lastArabic = false; - case ON: - case AN: - return cType; - case EN: - return lastArabic ? AN : EN; - case AL: - lastArabic = true; - hasUBAT_AL = true; - return R; - case WS: - return ON; - case CS: - if (ix < 1 || (ix + 1) >= types.length || - ((wType = classes[ix - 1]) != EN && wType != AN) || - ((nType = types[ix + 1]) != EN && nType != AN)){ - return ON; - } - if (lastArabic){nType = AN;} - return nType == wType ? nType : ON; - case ES: - wType = ix > 0 ? classes[ix - 1] : B; - if (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){ - return EN; - } - return ON; - case ET: - if (ix > 0 && classes[ix - 1] == EN){ - return EN; - } - if (lastArabic){ - return ON; - } - i = ix + 1; - len = types.length; - while (i < len && types[i] == ET){ - i++; - } - if (i < len && types[i] == EN){ - return EN; - } - return ON; - case NSM: - len = types.length; - i = ix + 1; - while (i < len && types[i] == NSM){ - i++; - } - if (i < len){ - var c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E; - - wType = types[i]; - if (rtlCandidate && (wType == R || wType == AL)){ - return R; - } - } - - if (ix < 1 || (wType = types[ix - 1]) == B){ - return ON; - } - return classes[ix - 1]; - case B: - lastArabic = false; - hasUBAT_B = true; - return dir; - case S: - hasUBAT_S = true; - return ON; - case LRE: - case RLE: - case LRO: - case RLO: - case PDF: - lastArabic = false; - case BN: - return ON; - } -} - -function _getCharacterType( ch ) { - var uc = ch.charCodeAt(0), hi = uc >> 8; - - if (hi == 0) { - return ((uc > 0x00BF) ? L : UnicodeTBL00[uc]); - } else if (hi == 5) { - return (/[\u0591-\u05f4]/.test(ch) ? R : L); - } else if (hi == 6) { - if (/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(ch)) - return NSM; - else if (/[\u0660-\u0669\u066b-\u066c]/.test(ch)) - return AN; - else if (uc == 0x066A) - return ET; - else if (/[\u06f0-\u06f9]/.test(ch)) - return EN; - else - return AL; - } else if (hi == 0x20 && uc <= 0x205F) { - return UnicodeTBL20[uc & 0xFF]; - } else if (hi == 0xFE) { - return (uc >= 0xFE70 ? AL : ON); - } - return ON; -} - -function _isArabicDiacritics( ch ) { - return (ch >= '\u064b' && ch <= '\u0655'); -} -exports.L = L; -exports.R = R; -exports.EN = EN; -exports.ON_R = 3; -exports.AN = 4; -exports.R_H = 5; -exports.B = 6; -exports.RLE = 7; - -exports.DOT = "\xB7"; -exports.doBidiReorder = function(text, textCharTypes, isRtl) { - if (text.length < 2) - return {}; - - var chars = text.split(""), logicalFromVisual = new Array(chars.length), - bidiLevels = new Array(chars.length), levels = []; - - dir = isRtl ? RTL : LTR; - - _computeLevels(chars, levels, chars.length, textCharTypes); - - for (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++); - - _invertLevel(2, levels, logicalFromVisual); - _invertLevel(1, levels, logicalFromVisual); - - for (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width - if (textCharTypes[i] === AN) { - levels[i] = exports.AN; - } else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE) - || textCharTypes[i] === ON || textCharTypes[i] === BN)) { - levels[i] = exports.ON_R; - } else if ((i > 0 && chars[i - 1] === '\u0644') && /\u0622|\u0623|\u0625|\u0627/.test(chars[i])) { - levels[i - 1] = levels[i] = exports.R_H; - i++; - } - } - if (chars[chars.length - 1] === exports.DOT) - levels[chars.length - 1] = exports.B; - - if (chars[0] === '\u202B') - levels[0] = exports.RLE; - - for (var i = 0; i < logicalFromVisual.length; i++) { - bidiLevels[i] = levels[logicalFromVisual[i]]; - } - - return {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels}; -}; -exports.hasBidiCharacters = function(text, textCharTypes){ - var ret = false; - for (var i = 0; i < text.length; i++){ - textCharTypes[i] = _getCharacterType(text.charAt(i)); - if (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL || textCharTypes[i] == AN)) - ret = true; - } - return ret; -}; -exports.getVisualFromLogicalIdx = function(logIdx, rowMap) { - for (var i = 0; i < rowMap.logicalFromVisual.length; i++) { - if (rowMap.logicalFromVisual[i] == logIdx) - return i; - } - return 0; -}; - -}); - -define("ace/bidihandler",["require","exports","module","ace/lib/bidiutil","ace/lib/lang"], function(require, exports, module) { -"use strict"; - -var bidiUtil = require("./lib/bidiutil"); -var lang = require("./lib/lang"); -var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\u202B]/; -var BidiHandler = function(session) { - this.session = session; - this.bidiMap = {}; - this.currentRow = null; - this.bidiUtil = bidiUtil; - this.charWidths = []; - this.EOL = "\xAC"; - this.showInvisibles = true; - this.isRtlDir = false; - this.$isRtl = false; - this.line = ""; - this.wrapIndent = 0; - this.EOF = "\xB6"; - this.RLE = "\u202B"; - this.contentWidth = 0; - this.fontMetrics = null; - this.rtlLineOffset = 0; - this.wrapOffset = 0; - this.isMoveLeftOperation = false; - this.seenBidi = bidiRE.test(session.getValue()); -}; - -(function() { - this.isBidiRow = function(screenRow, docRow, splitIndex) { - if (!this.seenBidi) - return false; - if (screenRow !== this.currentRow) { - this.currentRow = screenRow; - this.updateRowLine(docRow, splitIndex); - this.updateBidiMap(); + Selection.prototype.clearSelection = function () { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); } - return this.bidiMap.bidiLevels; }; - - this.onChange = function(delta) { - if (!this.seenBidi) { - if (delta.action == "insert" && bidiRE.test(delta.lines.join("\n"))) { - this.seenBidi = true; - this.currentRow = null; - } - } - else { - this.currentRow = null; - } + Selection.prototype.selectAll = function () { + this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); }; - - this.getDocumentRow = function() { - var docRow = 0; - var rowCache = this.session.$screenRowCache; - if (rowCache.length) { - var index = this.session.$getRowCacheIndex(rowCache, this.currentRow); - if (index >= 0) - docRow = this.session.$docRowCache[index]; - } - - return docRow; + Selection.prototype.setRange = function (range, reverse) { + var start = reverse ? range.end : range.start; + var end = reverse ? range.start : range.end; + this.$setSelection(start.row, start.column, end.row, end.column); }; - - this.getSplitIndex = function() { - var splitIndex = 0; - var rowCache = this.session.$screenRowCache; - if (rowCache.length) { - var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow); - while (this.currentRow - splitIndex > 0) { - currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1); - if (currentIndex !== prevIndex) - break; - - prevIndex = currentIndex; - splitIndex++; - } - } else { - splitIndex = this.currentRow; - } - - return splitIndex; + Selection.prototype.$setSelection = function (anchorRow, anchorColumn, cursorRow, cursorColumn) { + if (this.$silent) + return; + var wasEmpty = this.$isEmpty; + var wasMultiselect = this.inMultiSelectMode; + this.$silent = true; + this.$cursorChanged = this.$anchorChanged = false; + this.anchor.setPosition(anchorRow, anchorColumn); + this.cursor.setPosition(cursorRow, cursorColumn); + this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); + this.$silent = false; + if (this.$cursorChanged) + this._emit("changeCursor"); + if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) + this._emit("changeSelection"); }; - - this.updateRowLine = function(docRow, splitIndex) { - if (docRow === undefined) - docRow = this.getDocumentRow(); - - var isLastRow = (docRow === this.session.getLength() - 1), - endOfLine = isLastRow ? this.EOF : this.EOL; - - this.wrapIndent = 0; - this.line = this.session.getLine(docRow); - this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE; - if (this.session.$useWrapMode) { - var splits = this.session.$wrapData[docRow]; - if (splits) { - if (splitIndex === undefined) - splitIndex = this.getSplitIndex(); - - if(splitIndex > 0 && splits.length) { - this.wrapIndent = splits.indent; - this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L]; - this.line = (splitIndex < splits.length) ? - this.line.substring(splits[splitIndex - 1], splits[splitIndex]) : - this.line.substring(splits[splits.length - 1]); - } else { - this.line = this.line.substring(0, splits[splitIndex]); - } - } - if (splitIndex == splits.length) - this.line += (this.showInvisibles) ? endOfLine : bidiUtil.DOT; - } else { - this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT; - } - var session = this.session, shift = 0, size; - this.line = this.line.replace(/\t|[\u1100-\u2029, \u202F-\uFFE6]/g, function(ch, i){ - if (ch === '\t' || session.isFullWidth(ch.charCodeAt(0))) { - size = (ch === '\t') ? session.getScreenTabSize(i + shift) : 2; - shift += size - 1; - return lang.stringRepeat(bidiUtil.DOT, size); - } - return ch; + Selection.prototype.$moveSelection = function (mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + mover.call(this); + }; + Selection.prototype.selectTo = function (row, column) { + this.$moveSelection(function () { + this.moveCursorTo(row, column); }); - - if (this.isRtlDir) { - this.fontMetrics.$main.textContent = (this.line.charAt(this.line.length - 1) == bidiUtil.DOT) ? this.line.substr(0, this.line.length - 1) : this.line; - this.rtlLineOffset = this.contentWidth - this.fontMetrics.$main.getBoundingClientRect().width; - } }; - - this.updateBidiMap = function() { - var textCharTypes = []; - if (bidiUtil.hasBidiCharacters(this.line, textCharTypes) || this.isRtlDir) { - this.bidiMap = bidiUtil.doBidiReorder(this.line, textCharTypes, this.isRtlDir); - } else { - this.bidiMap = {}; - } + Selection.prototype.selectToPosition = function (pos) { + this.$moveSelection(function () { + this.moveCursorToPosition(pos); + }); }; - this.markAsDirty = function() { - this.currentRow = null; + Selection.prototype.moveTo = function (row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); }; - this.updateCharacterWidths = function(fontMetrics) { - if (this.characterWidth === fontMetrics.$characterSize.width) - return; - - this.fontMetrics = fontMetrics; - var characterWidth = this.characterWidth = fontMetrics.$characterSize.width; - var bidiCharWidth = fontMetrics.$measureCharWidth("\u05d4"); - - this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth; - this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth; - this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45; - this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0; - - this.currentRow = null; + Selection.prototype.moveToPosition = function (pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); }; - - this.setShowInvisibles = function(showInvisibles) { - this.showInvisibles = showInvisibles; - this.currentRow = null; + Selection.prototype.selectUp = function () { + this.$moveSelection(this.moveCursorUp); }; - - this.setEolChar = function(eolChar) { - this.EOL = eolChar; + Selection.prototype.selectDown = function () { + this.$moveSelection(this.moveCursorDown); }; - - this.setContentWidth = function(width) { - this.contentWidth = width; + Selection.prototype.selectRight = function () { + this.$moveSelection(this.moveCursorRight); }; - - this.isRtlLine = function(row) { - if (this.$isRtl) return true; - if (row != undefined) - return (this.session.getLine(row).charAt(0) == this.RLE); - else - return this.isRtlDir; + Selection.prototype.selectLeft = function () { + this.$moveSelection(this.moveCursorLeft); }; - - this.setRtlDirection = function(editor, isRtlDir) { - var cursor = editor.getCursorPosition(); - for (var row = editor.selection.getSelectionAnchor().row; row <= cursor.row; row++) { - if (!isRtlDir && editor.session.getLine(row).charAt(0) === editor.session.$bidiHandler.RLE) - editor.session.doc.removeInLine(row, 0, 1); - else if (isRtlDir && editor.session.getLine(row).charAt(0) !== editor.session.$bidiHandler.RLE) - editor.session.doc.insert({column: 0, row: row}, editor.session.$bidiHandler.RLE); - } - }; - this.getPosLeft = function(col) { - col -= this.wrapIndent; - var leftBoundary = (this.line.charAt(0) === this.RLE) ? 1 : 0; - var logicalIdx = (col > leftBoundary) ? (this.session.getOverwrite() ? col : col - 1) : leftBoundary; - var visualIdx = bidiUtil.getVisualFromLogicalIdx(logicalIdx, this.bidiMap), - levels = this.bidiMap.bidiLevels, left = 0; - - if (!this.session.getOverwrite() && col <= leftBoundary && levels[visualIdx] % 2 !== 0) - visualIdx++; - - for (var i = 0; i < visualIdx; i++) { - left += this.charWidths[levels[i]]; - } - - if (!this.session.getOverwrite() && (col > leftBoundary) && (levels[visualIdx] % 2 === 0)) - left += this.charWidths[levels[visualIdx]]; - - if (this.wrapIndent) - left += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - if (this.isRtlDir) - left += this.rtlLineOffset; - - return left; - }; - this.getSelections = function(startCol, endCol) { - var map = this.bidiMap, levels = map.bidiLevels, level, selections = [], offset = 0, - selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent, - isSelected = false, isSelectedPrev = false, selectionStart = 0; - - if (this.wrapIndent) - offset += this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) { - logIdx = map.logicalFromVisual[visIdx]; - level = levels[visIdx]; - isSelected = (logIdx >= selColMin) && (logIdx < selColMax); - if (isSelected && !isSelectedPrev) { - selectionStart = offset; - } else if (!isSelected && isSelectedPrev) { - selections.push({left: selectionStart, width: offset - selectionStart}); - } - offset += this.charWidths[level]; - isSelectedPrev = isSelected; - } - - if (isSelected && (visIdx === levels.length)) { - selections.push({left: selectionStart, width: offset - selectionStart}); - } - - if(this.isRtlDir) { - for (var i = 0; i < selections.length; i++) { - selections[i].left += this.rtlLineOffset; - } - } - return selections; - }; - this.offsetToCol = function(posX) { - if(this.isRtlDir) - posX -= this.rtlLineOffset; - - var logicalIdx = 0, posX = Math.max(posX, 0), - offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels, - charWidth = this.charWidths[levels[visualIdx]]; - - if (this.wrapIndent) - posX -= this.isRtlDir ? (-1 * this.wrapOffset) : this.wrapOffset; - - while(posX > offset + charWidth/2) { - offset += charWidth; - if(visualIdx === levels.length - 1) { - charWidth = 0; - break; - } - charWidth = this.charWidths[levels[++visualIdx]]; - } - - if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){ - if(posX < offset) - visualIdx--; - logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; - - } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){ - logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx] - : this.bidiMap.logicalFromVisual[visualIdx - 1]); - - } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0)) - || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){ - logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx]; - } else { - if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0) - visualIdx--; - logicalIdx = this.bidiMap.logicalFromVisual[visualIdx]; - } - - if (logicalIdx === 0 && this.isRtlDir) - logicalIdx++; - - return (logicalIdx + this.wrapIndent); - }; - -}).call(BidiHandler.prototype); - -exports.BidiHandler = BidiHandler; -}); - -define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var lang = require("./lib/lang"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Selection = function(session) { - this.session = session; - this.doc = session.getDocument(); - - this.clearSelection(); - this.cursor = this.lead = this.doc.createAnchor(0, 0); - this.anchor = this.doc.createAnchor(0, 0); - this.$silent = false; - - var self = this; - this.cursor.on("change", function(e) { - self.$cursorChanged = true; - if (!self.$silent) - self._emit("changeCursor"); - if (!self.$isEmpty && !self.$silent) - self._emit("changeSelection"); - if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) - self.$desiredColumn = null; - }); - - this.anchor.on("change", function() { - self.$anchorChanged = true; - if (!self.$isEmpty && !self.$silent) - self._emit("changeSelection"); - }); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.isEmpty = function() { - return this.$isEmpty || ( - this.anchor.row == this.lead.row && - this.anchor.column == this.lead.column - ); - }; - this.isMultiLine = function() { - return !this.$isEmpty && this.anchor.row != this.cursor.row; - }; - this.getCursor = function() { - return this.lead.getPosition(); - }; - this.setSelectionAnchor = function(row, column) { - this.$isEmpty = false; - this.anchor.setPosition(row, column); - }; - this.getAnchor = - this.getSelectionAnchor = function() { - if (this.$isEmpty) - return this.getSelectionLead(); - - return this.anchor.getPosition(); - }; - this.getSelectionLead = function() { - return this.lead.getPosition(); - }; - this.isBackwards = function() { - var anchor = this.anchor; - var lead = this.lead; - return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); - }; - this.getRange = function() { - var anchor = this.anchor; - var lead = this.lead; - - if (this.$isEmpty) - return Range.fromPoints(lead, lead); - - return this.isBackwards() - ? Range.fromPoints(lead, anchor) - : Range.fromPoints(anchor, lead); - }; - this.clearSelection = function() { - if (!this.$isEmpty) { - this.$isEmpty = true; - this._emit("changeSelection"); - } - }; - this.selectAll = function() { - this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE); - }; - this.setRange = - this.setSelectionRange = function(range, reverse) { - var start = reverse ? range.end : range.start; - var end = reverse ? range.start : range.end; - this.$setSelection(start.row, start.column, end.row, end.column); - }; - - this.$setSelection = function(anchorRow, anchorColumn, cursorRow, cursorColumn) { - if (this.$silent) - return; - var wasEmpty = this.$isEmpty; - var wasMultiselect = this.inMultiSelectMode; - this.$silent = true; - this.$cursorChanged = this.$anchorChanged = false; - this.anchor.setPosition(anchorRow, anchorColumn); - this.cursor.setPosition(cursorRow, cursorColumn); - this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor); - this.$silent = false; - if (this.$cursorChanged) - this._emit("changeCursor"); - if (this.$cursorChanged || this.$anchorChanged || wasEmpty != this.$isEmpty || wasMultiselect) - this._emit("changeSelection"); - }; - - this.$moveSelection = function(mover) { - var lead = this.lead; - if (this.$isEmpty) - this.setSelectionAnchor(lead.row, lead.column); - - mover.call(this); - }; - this.selectTo = function(row, column) { - this.$moveSelection(function() { - this.moveCursorTo(row, column); - }); - }; - this.selectToPosition = function(pos) { - this.$moveSelection(function() { - this.moveCursorToPosition(pos); - }); - }; - this.moveTo = function(row, column) { - this.clearSelection(); - this.moveCursorTo(row, column); - }; - this.moveToPosition = function(pos) { - this.clearSelection(); - this.moveCursorToPosition(pos); - }; - this.selectUp = function() { - this.$moveSelection(this.moveCursorUp); - }; - this.selectDown = function() { - this.$moveSelection(this.moveCursorDown); - }; - this.selectRight = function() { - this.$moveSelection(this.moveCursorRight); - }; - this.selectLeft = function() { - this.$moveSelection(this.moveCursorLeft); - }; - this.selectLineStart = function() { + Selection.prototype.selectLineStart = function () { this.$moveSelection(this.moveCursorLineStart); }; - this.selectLineEnd = function() { + Selection.prototype.selectLineEnd = function () { this.$moveSelection(this.moveCursorLineEnd); }; - this.selectFileEnd = function() { + Selection.prototype.selectFileEnd = function () { this.$moveSelection(this.moveCursorFileEnd); }; - this.selectFileStart = function() { + Selection.prototype.selectFileStart = function () { this.$moveSelection(this.moveCursorFileStart); }; - this.selectWordRight = function() { + Selection.prototype.selectWordRight = function () { this.$moveSelection(this.moveCursorWordRight); }; - this.selectWordLeft = function() { + Selection.prototype.selectWordLeft = function () { this.$moveSelection(this.moveCursorWordLeft); }; - this.getWordRange = function(row, column) { + Selection.prototype.getWordRange = function (row, column) { if (typeof column == "undefined") { var cursor = row || this.lead; row = cursor.row; @@ -5197,24 +5516,23 @@ var Selection = function(session) { } return this.session.getWordRange(row, column); }; - this.selectWord = function() { + Selection.prototype.selectWord = function () { this.setSelectionRange(this.getWordRange()); }; - this.selectAWord = function() { + Selection.prototype.selectAWord = function () { var cursor = this.getCursor(); var range = this.session.getAWordRange(cursor.row, cursor.column); this.setSelectionRange(range); }; - - this.getLineRange = function(row, excludeLastChar) { + Selection.prototype.getLineRange = function (row, excludeLastChar) { var rowStart = typeof row == "number" ? row : this.lead.row; var rowEnd; - var foldLine = this.session.getFoldLine(rowStart); if (foldLine) { rowStart = foldLine.start.row; rowEnd = foldLine.end.row; - } else { + } + else { rowEnd = rowStart; } if (excludeLastChar === true) @@ -5222,32 +5540,30 @@ var Selection = function(session) { else return new Range(rowStart, 0, rowEnd + 1, 0); }; - this.selectLine = function() { + Selection.prototype.selectLine = function () { this.setSelectionRange(this.getLineRange()); }; - this.moveCursorUp = function() { + Selection.prototype.moveCursorUp = function () { this.moveCursorBy(-1, 0); }; - this.moveCursorDown = function() { + Selection.prototype.moveCursorDown = function () { this.moveCursorBy(1, 0); }; - this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) { + Selection.prototype.wouldMoveIntoSoftTab = function (cursor, tabSize, direction) { var start = cursor.column; var end = cursor.column + tabSize; - if (direction < 0) { start = cursor.column - tabSize; end = cursor.column; } - return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length-1 == tabSize; + return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(" ").length - 1 == tabSize; }; - this.moveCursorLeft = function() { - var cursor = this.lead.getPosition(), - fold; - + Selection.prototype.moveCursorLeft = function () { + var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { this.moveCursorTo(fold.start.row, fold.start.column); - } else if (cursor.column === 0) { + } + else if (cursor.column === 0) { if (cursor.row > 0) { this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); } @@ -5256,14 +5572,14 @@ var Selection = function(session) { var tabSize = this.session.getTabSize(); if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) { this.moveCursorBy(0, -tabSize); - } else { + } + else { this.moveCursorBy(0, -1); } } }; - this.moveCursorRight = function() { - var cursor = this.lead.getPosition(), - fold; + Selection.prototype.moveCursorRight = function () { + var cursor = this.lead.getPosition(), fold; if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { this.moveCursorTo(fold.end.row, fold.end.column); } @@ -5277,27 +5593,24 @@ var Selection = function(session) { var cursor = this.lead; if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) { this.moveCursorBy(0, tabSize); - } else { + } + else { this.moveCursorBy(0, 1); } } }; - this.moveCursorLineStart = function() { + Selection.prototype.moveCursorLineStart = function () { var row = this.lead.row; var column = this.lead.column; var screenRow = this.session.documentToScreenRow(row, column); var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); - var beforeCursor = this.session.getDisplayLine( - row, null, firstColumnPosition.row, - firstColumnPosition.column - ); - + var beforeCursor = this.session.getDisplayLine(row, null, firstColumnPosition.row, firstColumnPosition.column); var leadingSpace = beforeCursor.match(/^\s*/); if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) firstColumnPosition.column += leadingSpace[0].length; this.moveCursorToPosition(firstColumnPosition); }; - this.moveCursorLineEnd = function() { + Selection.prototype.moveCursorLineEnd = function () { var lead = this.lead; var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); if (this.lead.column == lineEnd.column) { @@ -5308,23 +5621,21 @@ var Selection = function(session) { lineEnd.column = textEnd; } } - this.moveCursorTo(lineEnd.row, lineEnd.column); }; - this.moveCursorFileEnd = function() { + Selection.prototype.moveCursorFileEnd = function () { var row = this.doc.getLength() - 1; var column = this.doc.getLine(row).length; this.moveCursorTo(row, column); }; - this.moveCursorFileStart = function() { + Selection.prototype.moveCursorFileStart = function () { this.moveCursorTo(0, 0); }; - this.moveCursorLongWordRight = function() { + Selection.prototype.moveCursorLongWordRight = function () { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); - this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; var fold = this.session.getFoldAt(row, column, 1); @@ -5348,10 +5659,9 @@ var Selection = function(session) { column += this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } - this.moveCursorTo(row, column); }; - this.moveCursorLongWordLeft = function() { + Selection.prototype.moveCursorLongWordLeft = function () { var row = this.lead.row; var column = this.lead.column; var fold; @@ -5359,12 +5669,10 @@ var Selection = function(session) { this.moveCursorTo(fold.start.row, fold.start.column); return; } - var str = this.session.getFoldStringAt(row, column, -1); if (str == null) { str = this.doc.getLine(row).substring(0, column); } - var leftOfCursor = lang.stringReverse(str); this.session.nonTokenRe.lastIndex = 0; this.session.tokenRe.lastIndex = 0; @@ -5384,34 +5692,32 @@ var Selection = function(session) { column -= this.session.tokenRe.lastIndex; this.session.tokenRe.lastIndex = 0; } - this.moveCursorTo(row, column); }; - - this.$shortWordEndIndex = function(rightOfCursor) { + Selection.prototype.$shortWordEndIndex = function (rightOfCursor) { var index = 0, ch; var whitespaceRe = /\s/; var tokenRe = this.session.tokenRe; - tokenRe.lastIndex = 0; if (this.session.tokenRe.exec(rightOfCursor)) { index = this.session.tokenRe.lastIndex; - } else { + } + else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; - + index++; if (index < 1) { tokenRe.lastIndex = 0; - while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { tokenRe.lastIndex = 0; - index ++; + index++; if (whitespaceRe.test(ch)) { if (index > 2) { index--; break; - } else { + } + else { while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; + index++; if (index > 2) break; } @@ -5420,100 +5726,79 @@ var Selection = function(session) { } } tokenRe.lastIndex = 0; - return index; }; - - this.moveCursorShortWordRight = function() { + Selection.prototype.moveCursorShortWordRight = function () { var row = this.lead.row; var column = this.lead.column; var line = this.doc.getLine(row); var rightOfCursor = line.substring(column); - var fold = this.session.getFoldAt(row, column, 1); if (fold) return this.moveCursorTo(fold.end.row, fold.end.column); - if (column == line.length) { var l = this.doc.getLength(); do { row++; rightOfCursor = this.doc.getLine(row); } while (row < l && /^\s*$/.test(rightOfCursor)); - if (!/^\s+/.test(rightOfCursor)) rightOfCursor = ""; column = 0; } - var index = this.$shortWordEndIndex(rightOfCursor); - this.moveCursorTo(row, column + index); }; - - this.moveCursorShortWordLeft = function() { + Selection.prototype.moveCursorShortWordLeft = function () { var row = this.lead.row; var column = this.lead.column; - var fold; if (fold = this.session.getFoldAt(row, column, -1)) return this.moveCursorTo(fold.start.row, fold.start.column); - var line = this.session.getLine(row).substring(0, column); if (column === 0) { do { row--; line = this.doc.getLine(row); } while (row > 0 && /^\s*$/.test(line)); - column = line.length; if (!/\s+$/.test(line)) line = ""; } - var leftOfCursor = lang.stringReverse(line); var index = this.$shortWordEndIndex(leftOfCursor); - return this.moveCursorTo(row, column - index); }; - - this.moveCursorWordRight = function() { + Selection.prototype.moveCursorWordRight = function () { if (this.session.$selectLongWords) this.moveCursorLongWordRight(); else this.moveCursorShortWordRight(); }; - - this.moveCursorWordLeft = function() { + Selection.prototype.moveCursorWordLeft = function () { if (this.session.$selectLongWords) this.moveCursorLongWordLeft(); else this.moveCursorShortWordLeft(); }; - this.moveCursorBy = function(rows, chars) { - var screenPos = this.session.documentToScreenPosition( - this.lead.row, - this.lead.column - ); - + Selection.prototype.moveCursorBy = function (rows, chars) { + var screenPos = this.session.documentToScreenPosition(this.lead.row, this.lead.column); var offsetX; - if (chars === 0) { if (rows !== 0) { if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) { offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column); screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]); - } else { + } + else { offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0]; } } - if (this.$desiredColumn) screenPos.column = this.$desiredColumn; else this.$desiredColumn = screenPos.column; } - if (rows != 0 && this.session.lineWidgets && this.session.lineWidgets[this.lead.row]) { var widget = this.session.lineWidgets[this.lead.row]; if (rows < 0) @@ -5521,24 +5806,20 @@ var Selection = function(session) { else if (rows > 0) rows += widget.rowCount - (widget.rowsAbove || 0); } - var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX); - if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { - } this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); }; - this.moveCursorToPosition = function(position) { + Selection.prototype.moveCursorToPosition = function (position) { this.moveCursorTo(position.row, position.column); }; - this.moveCursorTo = function(row, column, keepDesiredColumn) { + Selection.prototype.moveCursorTo = function (row, column, keepDesiredColumn) { var fold = this.session.getFoldAt(row, column, 1); if (fold) { row = fold.start.row; column = fold.start.column; } - this.$keepDesiredColumnOnChange = true; var line = this.session.getLine(row); if (/[\uDC00-\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) { @@ -5549,78 +5830,75 @@ var Selection = function(session) { } this.lead.setPosition(row, column); this.$keepDesiredColumnOnChange = false; - if (!keepDesiredColumn) this.$desiredColumn = null; }; - this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + Selection.prototype.moveCursorToScreen = function (row, column, keepDesiredColumn) { var pos = this.session.screenToDocumentPosition(row, column); this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); }; - this.detach = function() { + Selection.prototype.detach = function () { this.lead.detach(); this.anchor.detach(); }; - - this.fromOrientedRange = function(range) { + Selection.prototype.fromOrientedRange = function (range) { this.setSelectionRange(range, range.cursor == range.start); this.$desiredColumn = range.desiredColumn || this.$desiredColumn; }; - - this.toOrientedRange = function(range) { + Selection.prototype.toOrientedRange = function (range) { var r = this.getRange(); if (range) { range.start.column = r.start.column; range.start.row = r.start.row; range.end.column = r.end.column; range.end.row = r.end.row; - } else { + } + else { range = r; } - range.cursor = this.isBackwards() ? range.start : range.end; range.desiredColumn = this.$desiredColumn; return range; }; - this.getRangeOfMovements = function(func) { + Selection.prototype.getRangeOfMovements = function (func) { var start = this.getCursor(); try { func(this); var end = this.getCursor(); return Range.fromPoints(start, end); - } catch(e) { + } + catch (e) { return Range.fromPoints(start, start); - } finally { + } + finally { this.moveCursorToPosition(start); } }; - - this.toJSON = function() { - if (this.rangeCount) { - var data = this.ranges.map(function(r) { + Selection.prototype.toJSON = function () { + if (this.rangeCount) { var data = this.ranges.map(function (r) { var r1 = r.clone(); r1.isBackwards = r.cursor == r.start; return r1; }); - } else { - var data = this.getRange(); + } + else { var data = this.getRange(); data.isBackwards = this.isBackwards(); } return data; }; - - this.fromJSON = function(data) { + Selection.prototype.fromJSON = function (data) { if (data.start == undefined) { if (this.rangeList && data.length > 1) { this.toSingleRange(data[0]); - for (var i = data.length; i--; ) { + for (var i = data.length; i--;) { var r = Range.fromPoints(data[i].start, data[i].end); if (data[i].isBackwards) r.cursor = r.start; this.addRange(r, true); } return; - } else { + } + else { data = data[0]; } } @@ -5628,124 +5906,117 @@ var Selection = function(session) { this.toSingleRange(data); this.setSelectionRange(data, data.isBackwards); }; - - this.isEqual = function(data) { + Selection.prototype.isEqual = function (data) { if ((data.length || this.rangeCount) && data.length != this.rangeCount) return false; if (!data.length || !this.ranges) return this.getRange().isEqual(data); - - for (var i = this.ranges.length; i--; ) { + for (var i = this.ranges.length; i--;) { if (!this.ranges[i].isEqual(data[i])) return false; } return true; }; - -}).call(Selection.prototype); - + return Selection; +}()); +Selection.prototype.setSelectionAnchor = Selection.prototype.setAnchor; +Selection.prototype.getSelectionAnchor = Selection.prototype.getAnchor; +Selection.prototype.setSelectionRange = Selection.prototype.setRange; +oop.implement(Selection.prototype, EventEmitter); exports.Selection = Selection; -}); -define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { -"use strict"; +}); -var config = require("./config"); +define("ace/tokenizer",["require","exports","module","ace/lib/report_error"], function(require, exports, module){"use strict"; +var reportError = require("./lib/report_error").reportError; var MAX_TOKEN_COUNT = 2000; -var Tokenizer = function(rules) { - this.states = rules; - - this.regExps = {}; - this.matchMappings = {}; - for (var key in this.states) { - var state = this.states[key]; - var ruleRegExps = []; - var matchTotal = 0; - var mapping = this.matchMappings[key] = {defaultToken: "text"}; - var flag = "g"; - - var splitterRurles = []; - for (var i = 0; i < state.length; i++) { - var rule = state[i]; - if (rule.defaultToken) - mapping.defaultToken = rule.defaultToken; - if (rule.caseInsensitive && flag.indexOf("i") === -1) - flag += "i"; - if (rule.unicode && flag.indexOf("u") === -1) - flag += "u"; - if (rule.regex == null) - continue; - - if (rule.regex instanceof RegExp) - rule.regex = rule.regex.toString().slice(1, -1); - var adjustedregex = rule.regex; - var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; - if (Array.isArray(rule.token)) { - if (rule.token.length == 1 || matchcount == 1) { - rule.token = rule.token[0]; - } else if (matchcount - 1 != rule.token.length) { - this.reportError("number of classes and regexp groups doesn't match", { - rule: rule, - groupCount: matchcount - 1 - }); - rule.token = rule.token[0]; - } else { - rule.tokenArray = rule.token; - rule.token = null; - rule.onMatch = this.$arrayTokens; - } - } else if (typeof rule.token == "function" && !rule.onMatch) { - if (matchcount > 1) - rule.onMatch = this.$applyToken; - else - rule.onMatch = rule.token; - } - - if (matchcount > 1) { - if (/\\\d/.test(rule.regex)) { - adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { - return "\\" + (parseInt(digit, 10) + matchTotal + 1); - }); - } else { - matchcount = 1; - adjustedregex = this.removeCapturingGroups(rule.regex); +var Tokenizer = /** @class */ (function () { + function Tokenizer(rules) { + this.splitRegex; + this.states = rules; + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = { defaultToken: "text" }; + var flag = "g"; + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive && flag.indexOf("i") === -1) + flag += "i"; + if (rule.unicode && flag.indexOf("u") === -1) + flag += "u"; + if (rule.regex == null) + continue; + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } + else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } + else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } } - if (!rule.splitRegex && typeof rule.token != "string") - splitterRurles.push(rule); // flag will be known only at the very end - } - - mapping[matchTotal] = i; - matchTotal += matchcount; - - ruleRegExps.push(adjustedregex); - if (!rule.onMatch) - rule.onMatch = null; - } - - if (!ruleRegExps.length) { - mapping[0] = 0; - ruleRegExps.push("$"); - } - - splitterRurles.forEach(function(rule) { - rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); - }, this); - - this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function (match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } + else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + mapping[matchTotal] = i; + matchTotal += matchcount; + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + splitterRurles.forEach(function (rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } } -}; - -(function() { - this.$setMaxTokenCount = function(m) { + Tokenizer.prototype.$setMaxTokenCount = function (m) { MAX_TOKEN_COUNT = m | 0; }; - - this.$applyToken = function(str) { + Tokenizer.prototype.$applyToken = function (str) { var values = this.splitRegex.exec(str).slice(1); var types = this.token.apply(this, values); if (typeof types === "string") - return [{type: types, value: str}]; - + return [{ type: types, value: str }]; var tokens = []; for (var i = 0, l = types.length; i < l; i++) { if (values[i]) @@ -5756,8 +6027,7 @@ var Tokenizer = function(rules) { } return tokens; }; - - this.$arrayTokens = function(str) { + Tokenizer.prototype.$arrayTokens = function (str) { if (!str) return []; var values = this.splitRegex.exec(str); @@ -5774,34 +6044,30 @@ var Tokenizer = function(rules) { } return tokens; }; - - this.removeCapturingGroups = function(src) { - var r = src.replace( - /\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, - function(x, y) {return y ? "(?:" : x;} - ); + Tokenizer.prototype.removeCapturingGroups = function (src) { + var r = src.replace(/\\.|\[(?:\\.|[^\\\]])*|\(\?[:=!<]|(\()/g, function (x, y) { return y ? "(?:" : x; }); return r; }; - - this.createSplitterRegexp = function(src, flag) { + Tokenizer.prototype.createSplitterRegexp = function (src, flag) { if (src.indexOf("(?=") != -1) { var stack = 0; var inChClass = false; var lastCapture = {}; - src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( - m, esc, parenOpen, parenClose, square, index - ) { + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function (m, esc, parenOpen, parenClose, square, index) { if (inChClass) { inChClass = square != "]"; - } else if (square) { + } + else if (square) { inChClass = true; - } else if (parenClose) { + } + else if (parenClose) { if (stack == lastCapture.stack) { - lastCapture.end = index+1; + lastCapture.end = index + 1; lastCapture.stack = -1; } stack--; - } else if (parenOpen) { + } + else if (parenOpen) { stack++; if (parenOpen.length != 1) { lastCapture.stack = stack; @@ -5810,16 +6076,16 @@ var Tokenizer = function(rules) { } return m; }); - if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); } - if (src.charAt(0) != "^") src = "^" + src; - if (src.charAt(src.length - 1) != "$") src += "$"; - - return new RegExp(src, (flag||"").replace("g", "")); + if (src.charAt(0) != "^") + src = "^" + src; + if (src.charAt(src.length - 1) != "$") + src += "$"; + return new RegExp(src, (flag || "").replace("g", "")); }; - this.getLineTokens = function(line, startState) { + Tokenizer.prototype.getLineTokens = function (line, startState) { if (startState && typeof startState != "string") { var stack = startState.slice(0); startState = stack[0]; @@ -5827,10 +6093,10 @@ var Tokenizer = function(rules) { stack.shift(); startState = stack.shift(); } - } else + } + else var stack = []; - - var currentState = startState || "start"; + var currentState = /**@type{string}*/ (startState) || "start"; var state = this.states[currentState]; if (!state) { currentState = "start"; @@ -5839,48 +6105,41 @@ var Tokenizer = function(rules) { var mapping = this.matchMappings[currentState]; var re = this.regExps[currentState]; re.lastIndex = 0; - var match, tokens = []; var lastIndex = 0; var matchAttempts = 0; - - var token = {type: null, value: ""}; - + var token = { type: null, value: "" }; while (match = re.exec(line)) { var type = mapping.defaultToken; var rule = null; var value = match[0]; var index = re.lastIndex; - if (index - value.length > lastIndex) { var skipped = line.substring(lastIndex, index - value.length); if (token.type == type) { token.value += skipped; - } else { + } + else { if (token.type) tokens.push(token); - token = {type: type, value: skipped}; + token = { type: type, value: skipped }; } } - - for (var i = 0; i < match.length-2; i++) { + for (var i = 0; i < match.length - 2; i++) { if (match[i + 1] === undefined) continue; - rule = state[mapping[i]]; - if (rule.onMatch) type = rule.onMatch(value, currentState, stack, line); else type = rule.token; - if (rule.next) { if (typeof rule.next == "string") { currentState = rule.next; - } else { + } + else { currentState = rule.next(currentState, stack); } - state = this.states[currentState]; if (!state) { this.reportError("state doesn't exist", currentState); @@ -5896,30 +6155,28 @@ var Tokenizer = function(rules) { lastIndex = index; break; } - if (value) { if (typeof type === "string") { if ((!rule || rule.merge !== false) && token.type === type) { token.value += value; - } else { + } + else { if (token.type) tokens.push(token); - token = {type: type, value: value}; + token = { type: type, value: value }; } - } else if (type) { + } + else if (type) { if (token.type) tokens.push(token); - token = {type: null, value: ""}; + token = { type: null, value: "" }; for (var i = 0; i < type.length; i++) tokens.push(type[i]); } } - if (lastIndex == line.length) break; - lastIndex = index; - if (matchAttempts++ > MAX_TOKEN_COUNT) { if (matchAttempts > 2 * line.length) { this.reportError("infinite loop with in ace tokenizer", { @@ -5940,47 +6197,39 @@ var Tokenizer = function(rules) { break; } } - if (token.type) tokens.push(token); - if (stack.length > 1) { if (stack[0] !== currentState) stack.unshift("#tmp", currentState); } return { - tokens : tokens, - state : stack.length ? stack : currentState + tokens: tokens, + state: stack.length ? stack : currentState }; }; - - this.reportError = config.reportError; - -}).call(Tokenizer.prototype); - + return Tokenizer; +}()); +Tokenizer.prototype.reportError = reportError; exports.Tokenizer = Tokenizer; -}); - -define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { -"use strict"; -var lang = require("../lib/lang"); - -var TextHighlightRules = function() { +}); +define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/deep_copy"], function(require, exports, module){"use strict"; +var deepCopy = require("../lib/deep_copy").deepCopy; +var TextHighlightRules; +TextHighlightRules = function () { this.$rules = { - "start" : [{ - token : "empty_line", - regex : '^$' - }, { - defaultToken : "text" - }] + "start": [{ + token: "empty_line", + regex: '^$' + }, { + defaultToken: "text" + }] }; }; - -(function() { - - this.addRules = function(rules, prefix) { +(function () { + this.addRules = function (rules, prefix) { if (!prefix) { for (var key in rules) this.$rules[key] = rules[key]; @@ -6002,11 +6251,9 @@ var TextHighlightRules = function() { this.$rules[prefix + key] = state; } }; - - this.getRules = function() { + this.getRules = function () { return this.$rules; }; - this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { var embedRules = typeof HighlightRules == "function" ? new HighlightRules().getRules() @@ -6014,45 +6261,40 @@ var TextHighlightRules = function() { if (states) { for (var i = 0; i < states.length; i++) states[i] = prefix + states[i]; - } else { + } + else { states = []; for (var key in embedRules) states.push(prefix + key); } - this.addRules(embedRules, prefix); - if (escapeRules) { var addRules = Array.prototype[append ? "push" : "unshift"]; for (var i = 0; i < states.length; i++) - addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + addRules.apply(this.$rules[states[i]], deepCopy(escapeRules)); } - if (!this.$embeds) this.$embeds = []; this.$embeds.push(prefix); }; - - this.getEmbeds = function() { + this.getEmbeds = function () { return this.$embeds; }; - - var pushState = function(currentState, stack) { + var pushState = function (currentState, stack) { if (currentState != "start" || stack.length) stack.unshift(this.nextState, currentState); return this.nextState; }; - var popState = function(currentState, stack) { + var popState = function (currentState, stack) { stack.shift(); return stack.shift() || "start"; }; - - this.normalizeRules = function() { + this.normalizeRules = function () { var id = 0; var rules = this.$rules; function processState(key) { var state = rules[key]; - state.processed = true; + state["processed"] = true; for (var i = 0; i < state.length; i++) { var rule = state[i]; var toInsert = null; @@ -6077,7 +6319,7 @@ var TextHighlightRules = function() { var next = rule.next || rule.push; if (next && Array.isArray(next)) { var stateName = rule.stateName; - if (!stateName) { + if (!stateName) { stateName = rule.token; if (typeof stateName != "string") stateName = stateName[0] || ""; @@ -6087,101 +6329,92 @@ var TextHighlightRules = function() { rules[stateName] = next; rule.next = stateName; processState(stateName); - } else if (next == "pop") { + } + else if (next == "pop") { rule.next = popState; } - if (rule.push) { rule.nextState = rule.next || rule.push; rule.next = pushState; delete rule.push; } - if (rule.rules) { for (var r in rule.rules) { if (rules[r]) { if (rules[r].push) rules[r].push.apply(rules[r], rule.rules[r]); - } else { + } + else { rules[r] = rule.rules[r]; } } } var includeName = typeof rule == "string" ? rule : rule.include; if (includeName) { + if (includeName === "$self") + includeName = "start"; if (Array.isArray(includeName)) - toInsert = includeName.map(function(x) { return rules[x]; }); + toInsert = includeName.map(function (x) { return rules[x]; }); else toInsert = rules[includeName]; } - if (toInsert) { var args = [i, 1].concat(toInsert); if (rule.noEscape) - args = args.filter(function(x) {return !x.next;}); + args = args.filter(function (x) { return !x.next; }); state.splice.apply(state, args); i--; } - if (rule.keywordMap) { - rule.token = this.createKeywordMapper( - rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive - ); + rule.token = this.createKeywordMapper(rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive); delete rule.defaultToken; } } } Object.keys(rules).forEach(processState, this); }; - - this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + this.createKeywordMapper = function (map, defaultToken, ignoreCase, splitChar) { var keywords = Object.create(null); this.$keywordList = []; - Object.keys(map).forEach(function(className) { + Object.keys(map).forEach(function (className) { var a = map[className]; var list = a.split(splitChar || "|"); - for (var i = list.length; i--; ) { + for (var i = list.length; i--;) { var word = list[i]; this.$keywordList.push(word); if (ignoreCase) - word = word.toLowerCase(); + word = word.toLowerCase(); keywords[word] = className; } }, this); map = null; return ignoreCase - ? function(value) {return keywords[value.toLowerCase()] || defaultToken; } - : function(value) {return keywords[value] || defaultToken; }; + ? function (value) { return keywords[value.toLowerCase()] || defaultToken; } + : function (value) { return keywords[value] || defaultToken; }; }; - - this.getKeywords = function() { + this.getKeywords = function () { return this.$keywords; }; - }).call(TextHighlightRules.prototype); - exports.TextHighlightRules = TextHighlightRules; -}); -define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { -"use strict"; +}); -var Behaviour = function() { - this.$behaviours = {}; +define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module){"use strict"; +var Behaviour; +Behaviour = function () { + this.$behaviours = {}; }; - (function () { - this.add = function (name, action, callback) { switch (undefined) { - case this.$behaviours: - this.$behaviours = {}; - case this.$behaviours[name]: - this.$behaviours[name] = {}; + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; } this.$behaviours[name][action] = callback; }; - this.addBehaviours = function (behaviours) { for (var key in behaviours) { for (var action in behaviours[key]) { @@ -6189,26 +6422,25 @@ var Behaviour = function() { } } }; - this.remove = function (name) { if (this.$behaviours && this.$behaviours[name]) { delete this.$behaviours[name]; } }; - this.inherit = function (mode, filter) { if (typeof mode === "function") { var behaviours = new mode().getBehaviours(filter); - } else { + } + else { var behaviours = mode.getBehaviours(filter); } this.addBehaviours(behaviours); }; - this.getBehaviours = function (filter) { if (!filter) { return this.$behaviours; - } else { + } + else { var ret = {}; for (var i = 0; i < filter.length; i++) { if (this.$behaviours[filter[i]]) { @@ -6218,43 +6450,35 @@ var Behaviour = function() { return ret; } }; - }).call(Behaviour.prototype); - exports.Behaviour = Behaviour; -}); -define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; +}); +define("ace/token_iterator",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; var Range = require("./range").Range; -var TokenIterator = function(session, initialRow, initialColumn) { - this.$session = session; - this.$row = initialRow; - this.$rowTokens = session.getTokens(initialRow); - - var token = session.getTokenAt(initialRow, initialColumn); - this.$tokenIndex = token ? token.index : -1; -}; - -(function() { - this.stepBackward = function() { +var TokenIterator = /** @class */ (function () { + function TokenIterator(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; + } + TokenIterator.prototype.stepBackward = function () { this.$tokenIndex -= 1; - while (this.$tokenIndex < 0) { this.$row -= 1; if (this.$row < 0) { this.$row = 0; return null; } - this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = this.$rowTokens.length - 1; } - return this.$rowTokens[this.$tokenIndex]; - }; - this.stepForward = function() { + }; + TokenIterator.prototype.stepForward = function () { this.$tokenIndex += 1; var rowCount; while (this.$tokenIndex >= this.$rowTokens.length) { @@ -6265,71 +6489,60 @@ var TokenIterator = function(session, initialRow, initialColumn) { this.$row = rowCount - 1; return null; } - this.$rowTokens = this.$session.getTokens(this.$row); this.$tokenIndex = 0; } - return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentToken = function () { + }; + TokenIterator.prototype.getCurrentToken = function () { return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentTokenRow = function () { + }; + TokenIterator.prototype.getCurrentTokenRow = function () { return this.$row; - }; - this.getCurrentTokenColumn = function() { + }; + TokenIterator.prototype.getCurrentTokenColumn = function () { var rowTokens = this.$rowTokens; var tokenIndex = this.$tokenIndex; var column = rowTokens[tokenIndex].start; if (column !== undefined) return column; - column = 0; while (tokenIndex > 0) { tokenIndex -= 1; column += rowTokens[tokenIndex].value.length; } - - return column; + return column; }; - this.getCurrentTokenPosition = function() { - return {row: this.$row, column: this.getCurrentTokenColumn()}; + TokenIterator.prototype.getCurrentTokenPosition = function () { + return { row: this.$row, column: this.getCurrentTokenColumn() }; }; - this.getCurrentTokenRange = function() { + TokenIterator.prototype.getCurrentTokenRange = function () { var token = this.$rowTokens[this.$tokenIndex]; var column = this.getCurrentTokenColumn(); return new Range(this.$row, column, this.$row, column + token.value.length); }; - -}).call(TokenIterator.prototype); - + return TokenIterator; +}()); exports.TokenIterator = TokenIterator; -}); -define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { -"use strict"; +}); +define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module){"use strict"; var oop = require("../../lib/oop"); var Behaviour = require("../behaviour").Behaviour; var TokenIterator = require("../../token_iterator").TokenIterator; var lang = require("../../lib/lang"); - -var SAFE_INSERT_IN_TOKENS = - ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; -var SAFE_INSERT_BEFORE_TOKENS = - ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; - +var SAFE_INSERT_IN_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = ["text", "paren.rparen", "rparen", "paren", "punctuation.operator", "comment"]; var context; var contextCache = {}; -var defaultQuotes = {'"' : '"', "'" : "'"}; - -var initContext = function(editor) { +var defaultQuotes = { '"': '"', "'": "'" }; +var initContext = function (editor) { var id = -1; if (editor.multiSelect) { id = editor.selection.index; if (contextCache.rangeCount != editor.multiSelect.rangeCount) - contextCache = {rangeCount: editor.multiSelect.rangeCount}; + contextCache = { rangeCount: editor.multiSelect.rangeCount }; } if (contextCache[id]) return context = contextCache[id]; @@ -6343,38 +6556,54 @@ var initContext = function(editor) { maybeInsertedLineEnd: "" }; }; - -var getWrapped = function(selection, selected, opening, closing) { +var getWrapped = function (selection, selected, opening, closing) { var rowDiff = selection.end.row - selection.start.row; return { text: opening + selected + closing, selection: [ - 0, - selection.start.column + 1, - rowDiff, - selection.end.column + (rowDiff ? 0 : 1) - ] + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] }; }; - -var CstyleBehaviour = function(options) { - this.add("braces", "insertion", function(state, action, editor, session, text) { +var CstyleBehaviour; +CstyleBehaviour = function (options) { + options = options || {}; + this.add("braces", "insertion", function (state, action, editor, session, text) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); if (text == '{') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); + var token = session.getTokenAt(cursor.row, cursor.column); if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '{', '}'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { - if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) { + } + else if (token && /(?:string)\.quasi|\.xml/.test(token.type)) { + var excludeTokens = [ + /tag\-(?:open|name)/, /attribute\-name/ + ]; + if (excludeTokens.some(function (el) { return el.test(token.type); }) || /(string)\.quasi/.test(token.type) + && token.value[cursor.column - token.start - 1] !== '$') + return; + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options.braces) { CstyleBehaviour.recordAutoInsert(editor, session, "}"); return { text: '{}', selection: [1, 1] }; - } else { + } + else { CstyleBehaviour.recordMaybeInsert(editor, session, "{"); return { text: '{', @@ -6382,11 +6611,12 @@ var CstyleBehaviour = function(options) { }; } } - } else if (text == '}') { + } + else if (text == '}') { initContext(editor); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == '}') { - var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket('}', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6395,7 +6625,8 @@ var CstyleBehaviour = function(options) { }; } } - } else if (text == "\n" || text == "\r\n") { + } + else if (text == "\n" || text == "\r\n") { initContext(editor); var closing = ""; if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { @@ -6404,28 +6635,29 @@ var CstyleBehaviour = function(options) { } var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar === '}') { - var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + var openBracePos = session.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 }, '}'); if (!openBracePos) - return null; + return null; var next_indent = this.$getIndent(session.getLine(openBracePos.row)); - } else if (closing) { + } + else if (closing) { var next_indent = this.$getIndent(line); - } else { + } + else { CstyleBehaviour.clearMaybeInsertedClosing(); return; } var indent = next_indent + session.getTabString(); - return { text: '\n' + indent + '\n' + next_indent + closing, selection: [1, indent.length, 1, indent.length] }; - } else { + } + else { CstyleBehaviour.clearMaybeInsertedClosing(); } }); - - this.add("braces", "deletion", function(state, action, editor, session, range) { + this.add("braces", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '{') { initContext(editor); @@ -6434,33 +6666,35 @@ var CstyleBehaviour = function(options) { if (rightChar == '}') { range.end.column++; return range; - } else { + } + else { context.maybeInsertedBrackets--; } } }); - - this.add("parens", "insertion", function(state, action, editor, session, text) { + this.add("parens", "insertion", function (state, action, editor, session, text) { if (text == '(') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '(', ')'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, ")"); return { text: '()', selection: [1, 1] }; } - } else if (text == ')') { + } + else if (text == ')') { initContext(editor); var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ')') { - var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket(')', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6471,8 +6705,7 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("parens", "deletion", function(state, action, editor, session, range) { + this.add("parens", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '(') { initContext(editor); @@ -6484,28 +6717,29 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("brackets", "insertion", function(state, action, editor, session, text) { + this.add("brackets", "insertion", function (state, action, editor, session, text) { if (text == '[') { initContext(editor); var selection = editor.getSelectionRange(); var selected = session.doc.getTextRange(selection); if (selected !== "" && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, '[', ']'); - } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + } + else if (CstyleBehaviour.isSaneInsertion(editor, session)) { CstyleBehaviour.recordAutoInsert(editor, session, "]"); return { text: '[]', selection: [1, 1] }; } - } else if (text == ']') { + } + else if (text == ']') { initContext(editor); var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); var rightChar = line.substring(cursor.column, cursor.column + 1); if (rightChar == ']') { - var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + var matching = session.$findOpeningBracket(']', { column: cursor.column + 1, row: cursor.row }); if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { CstyleBehaviour.popAutoInsertedClosing(); return { @@ -6516,8 +6750,7 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("brackets", "deletion", function(state, action, editor, session, range) { + this.add("brackets", "deletion", function (state, action, editor, session, range) { var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && selected == '[') { initContext(editor); @@ -6529,11 +6762,10 @@ var CstyleBehaviour = function(options) { } } }); - - this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + this.add("string_dquotes", "insertion", function (state, action, editor, session, text) { var quotes = session.$mode.$quotes || defaultQuotes; if (text.length == 1 && quotes[text]) { - if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) return; initContext(editor); var quote = text; @@ -6541,26 +6773,25 @@ var CstyleBehaviour = function(options) { var selected = session.doc.getTextRange(selection); if (selected !== "" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) { return getWrapped(selection, selected, quote, quote); - } else if (!selected) { + } + else if (!selected) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - var leftChar = line.substring(cursor.column-1, cursor.column); + var leftChar = line.substring(cursor.column - 1, cursor.column); var rightChar = line.substring(cursor.column, cursor.column + 1); - var token = session.getTokenAt(cursor.row, cursor.column); var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); if (leftChar == "\\" && token && /escape/.test(token.type)) return null; - var stringBefore = token && /string|escape/.test(token.type); var stringAfter = !rightToken || /string|escape/.test(rightToken.type); - var pair; if (rightChar == quote) { pair = stringBefore !== stringAfter; if (pair && /string\.end/.test(rightToken.type)) pair = false; - } else { + } + else { if (stringBefore && !stringAfter) return null; // wrap string with different quote if (stringBefore && stringAfter) @@ -6569,27 +6800,27 @@ var CstyleBehaviour = function(options) { wordRe.lastIndex = 0; var isWordBefore = wordRe.test(leftChar); wordRe.lastIndex = 0; - var isWordAfter = wordRe.test(leftChar); - if (isWordBefore || isWordAfter) + var isWordAfter = wordRe.test(rightChar); + var pairQuotesAfter = session.$mode.$pairQuotesAfter; + var shouldPairQuotes = pairQuotesAfter && pairQuotesAfter[quote] && pairQuotesAfter[quote].test(leftChar); + if ((!shouldPairQuotes && isWordBefore) || isWordAfter) return null; // before or after alphanumeric if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) return null; // there is rightChar and it isn't closing var charBefore = line[cursor.column - 2]; - if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) + if (leftChar == quote && (charBefore == quote || wordRe.test(charBefore))) return null; pair = true; } return { text: pair ? quote + quote : "", - selection: [1,1] + selection: [1, 1] }; } } }); - - this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + this.add("string_dquotes", "deletion", function (state, action, editor, session, range) { var quotes = session.$mode.$quotes || defaultQuotes; - var selected = session.doc.getTextRange(range); if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) { initContext(editor); @@ -6601,11 +6832,71 @@ var CstyleBehaviour = function(options) { } } }); - + if (options.closeDocComment !== false) { + this.add("doc comment end", "insertion", function (state, action, editor, session, text) { + if (state === "doc-start" && (text === "\n" || text === "\r\n") && editor.selection.isEmpty()) { + var cursor = editor.getCursorPosition(); + if (cursor.column === 0) { + return; + } + var line = session.doc.getLine(cursor.row); + var nextLine = session.doc.getLine(cursor.row + 1); + var tokens = session.getTokens(cursor.row); + var index = 0; + for (var i = 0; i < tokens.length; i++) { + index += tokens[i].value.length; + var currentToken = tokens[i]; + if (index >= cursor.column) { + if (index === cursor.column) { + if (!/\.doc/.test(currentToken.type)) { + return; + } + if (/\*\//.test(currentToken.value)) { + var nextToken = tokens[i + 1]; + if (!nextToken || !/\.doc/.test(nextToken.type)) { + return; + } + } + } + var cursorPosInToken = cursor.column - (index - currentToken.value.length); + var closeDocPos = currentToken.value.indexOf("*/"); + var openDocPos = currentToken.value.indexOf("/**", closeDocPos > -1 ? closeDocPos + 2 : 0); + if (openDocPos !== -1 && cursorPosInToken > openDocPos && cursorPosInToken < openDocPos + 3) { + return; + } + if (closeDocPos !== -1 && openDocPos !== -1 && cursorPosInToken >= closeDocPos + && cursorPosInToken <= openDocPos || !/\.doc/.test(currentToken.type)) { + return; + } + break; + } + } + var indent = this.$getIndent(line); + if (/\s*\*/.test(nextLine)) { + if (/^\s*\*/.test(line)) { + return { + text: text + indent + "* ", + selection: [1, 2 + indent.length, 1, 2 + indent.length] + }; + } + else { + return { + text: text + indent + " * ", + selection: [1, 3 + indent.length, 1, 3 + indent.length] + }; + } + } + if (/\/\*\*/.test(line.substring(0, cursor.column))) { + return { + text: text + indent + " * " + text + " " + indent + "*/", + selection: [1, 4 + indent.length, 1, 4 + indent.length] + }; + } + } + }); + } }; - - -CstyleBehaviour.isSaneInsertion = function(editor, session) { +CstyleBehaviour.isSaneInsertion = function (editor, session) { var cursor = editor.getCursorPosition(); var iterator = new TokenIterator(session, cursor.row, cursor.column); if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { @@ -6619,69 +6910,57 @@ CstyleBehaviour.isSaneInsertion = function(editor, session) { return iterator.getCurrentTokenRow() !== cursor.row || this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); }; - -CstyleBehaviour.$matchTokenType = function(token, types) { +CstyleBehaviour["$matchTokenType"] = function (token, types) { return types.indexOf(token.type || token) > -1; }; - -CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { +CstyleBehaviour["recordAutoInsert"] = function (editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + if (!this["isAutoInsertedClosing"](cursor, line, context.autoInsertedLineEnd[0])) context.autoInsertedBrackets = 0; context.autoInsertedRow = cursor.row; context.autoInsertedLineEnd = bracket + line.substr(cursor.column); context.autoInsertedBrackets++; }; - -CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { +CstyleBehaviour["recordMaybeInsert"] = function (editor, session, bracket) { var cursor = editor.getCursorPosition(); var line = session.doc.getLine(cursor.row); - if (!this.isMaybeInsertedClosing(cursor, line)) + if (!this["isMaybeInsertedClosing"](cursor, line)) context.maybeInsertedBrackets = 0; context.maybeInsertedRow = cursor.row; context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; context.maybeInsertedLineEnd = line.substr(cursor.column); context.maybeInsertedBrackets++; }; - -CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { +CstyleBehaviour["isAutoInsertedClosing"] = function (cursor, line, bracket) { return context.autoInsertedBrackets > 0 && cursor.row === context.autoInsertedRow && bracket === context.autoInsertedLineEnd[0] && line.substr(cursor.column) === context.autoInsertedLineEnd; }; - -CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { +CstyleBehaviour["isMaybeInsertedClosing"] = function (cursor, line) { return context.maybeInsertedBrackets > 0 && cursor.row === context.maybeInsertedRow && line.substr(cursor.column) === context.maybeInsertedLineEnd && line.substr(0, cursor.column) == context.maybeInsertedLineStart; }; - -CstyleBehaviour.popAutoInsertedClosing = function() { +CstyleBehaviour["popAutoInsertedClosing"] = function () { context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); context.autoInsertedBrackets--; }; - -CstyleBehaviour.clearMaybeInsertedClosing = function() { +CstyleBehaviour["clearMaybeInsertedClosing"] = function () { if (context) { context.maybeInsertedBrackets = 0; context.maybeInsertedRow = -1; } }; - - - oop.inherits(CstyleBehaviour, Behaviour); - exports.CstyleBehaviour = CstyleBehaviour; -}); -define("ace/unicode",["require","exports","module"], function(require, exports, module) { -"use strict"; -var wordChars = [48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2]; +}); +define("ace/unicode",["require","exports","module"], function(require, exports, module){"use strict"; +var wordChars = [48, 9, 8, 25, 5, 0, 2, 25, 48, 0, 11, 0, 5, 0, 6, 22, 2, 30, 2, 457, 5, 11, 15, 4, 8, 0, 2, 0, 18, 116, 2, 1, 3, 3, 9, 0, 2, 2, 2, 0, 2, 19, 2, 82, 2, 138, 2, 4, 3, 155, 12, 37, 3, 0, 8, 38, 10, 44, 2, 0, 2, 1, 2, 1, 2, 0, 9, 26, 6, 2, 30, 10, 7, 61, 2, 9, 5, 101, 2, 7, 3, 9, 2, 18, 3, 0, 17, 58, 3, 100, 15, 53, 5, 0, 6, 45, 211, 57, 3, 18, 2, 5, 3, 11, 3, 9, 2, 1, 7, 6, 2, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 0, 4, 3, 3, 8, 3, 1, 3, 3, 9, 0, 5, 1, 2, 4, 3, 11, 16, 2, 2, 5, 5, 1, 3, 21, 2, 6, 2, 1, 2, 1, 2, 1, 3, 0, 2, 4, 5, 1, 3, 2, 4, 0, 8, 3, 2, 0, 8, 15, 12, 2, 2, 8, 2, 2, 2, 21, 2, 6, 2, 1, 2, 4, 3, 9, 2, 2, 2, 2, 3, 0, 16, 3, 3, 9, 18, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 3, 8, 3, 1, 3, 2, 9, 1, 5, 1, 2, 4, 3, 9, 2, 0, 17, 1, 2, 5, 4, 2, 2, 3, 4, 1, 2, 0, 2, 1, 4, 1, 4, 2, 4, 11, 5, 4, 4, 2, 2, 3, 3, 0, 7, 0, 15, 9, 18, 2, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 4, 7, 2, 2, 2, 3, 8, 1, 2, 1, 7, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 3, 8, 2, 2, 2, 3, 8, 1, 8, 0, 2, 3, 3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 15, 4, 7, 2, 2, 2, 3, 10, 0, 9, 3, 3, 9, 11, 5, 3, 1, 2, 17, 4, 23, 2, 8, 2, 0, 3, 6, 4, 0, 5, 5, 2, 0, 2, 7, 19, 1, 14, 57, 6, 14, 2, 9, 40, 1, 2, 0, 3, 1, 2, 0, 3, 0, 7, 3, 2, 6, 2, 2, 2, 0, 2, 0, 3, 1, 2, 12, 2, 2, 3, 4, 2, 0, 2, 5, 3, 9, 3, 1, 35, 0, 24, 1, 7, 9, 12, 0, 2, 0, 2, 0, 5, 9, 2, 35, 5, 19, 2, 5, 5, 7, 2, 35, 10, 0, 58, 73, 7, 77, 3, 37, 11, 42, 2, 0, 4, 328, 2, 3, 3, 6, 2, 0, 2, 3, 3, 40, 2, 3, 3, 32, 2, 3, 3, 6, 2, 0, 2, 3, 3, 14, 2, 56, 2, 3, 3, 66, 5, 0, 33, 15, 17, 84, 13, 619, 3, 16, 2, 25, 6, 74, 22, 12, 2, 6, 12, 20, 12, 19, 13, 12, 2, 2, 2, 1, 13, 51, 3, 29, 4, 0, 5, 1, 3, 9, 34, 2, 3, 9, 7, 87, 9, 42, 6, 69, 11, 28, 4, 11, 5, 11, 11, 39, 3, 4, 12, 43, 5, 25, 7, 10, 38, 27, 5, 62, 2, 28, 3, 10, 7, 9, 14, 0, 89, 75, 5, 9, 18, 8, 13, 42, 4, 11, 71, 55, 9, 9, 4, 48, 83, 2, 2, 30, 14, 230, 23, 280, 3, 5, 3, 37, 3, 5, 3, 7, 2, 0, 2, 0, 2, 0, 2, 30, 3, 52, 2, 6, 2, 0, 4, 2, 2, 6, 4, 3, 3, 5, 5, 12, 6, 2, 2, 6, 67, 1, 20, 0, 29, 0, 14, 0, 17, 4, 60, 12, 5, 0, 4, 11, 18, 0, 5, 0, 3, 9, 2, 0, 4, 4, 7, 0, 2, 0, 2, 0, 2, 3, 2, 10, 3, 3, 6, 4, 5, 0, 53, 1, 2684, 46, 2, 46, 2, 132, 7, 6, 15, 37, 11, 53, 10, 0, 17, 22, 10, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 6, 2, 31, 48, 0, 470, 1, 36, 5, 2, 4, 6, 1, 5, 85, 3, 1, 3, 2, 2, 89, 2, 3, 6, 40, 4, 93, 18, 23, 57, 15, 513, 6581, 75, 20939, 53, 1164, 68, 45, 3, 268, 4, 27, 21, 31, 3, 13, 13, 1, 2, 24, 9, 69, 11, 1, 38, 8, 3, 102, 3, 1, 111, 44, 25, 51, 13, 68, 12, 9, 7, 23, 4, 0, 5, 45, 3, 35, 13, 28, 4, 64, 15, 10, 39, 54, 10, 13, 3, 9, 7, 22, 4, 1, 5, 66, 25, 2, 227, 42, 2, 1, 3, 9, 7, 11171, 13, 22, 5, 48, 8453, 301, 3, 61, 3, 105, 39, 6, 13, 4, 6, 11, 2, 12, 2, 4, 2, 0, 2, 1, 2, 1, 2, 107, 34, 362, 19, 63, 3, 53, 41, 11, 5, 15, 17, 6, 13, 1, 25, 2, 33, 4, 2, 134, 20, 9, 8, 25, 5, 0, 2, 25, 12, 88, 4, 5, 3, 5, 3, 5, 3, 2]; var code = 0; var str = []; for (var i = 0; i < wordChars.length; i += 2) { @@ -6689,15 +6968,12 @@ for (var i = 0; i < wordChars.length; i += 2) { if (wordChars[i + 1]) str.push(45, code += wordChars[i + 1]); } - exports.wordChars = String.fromCharCode.apply(null, str); }); -define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { -"use strict"; +define("ace/mode/text",["require","exports","module","ace/config","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; var config = require("../config"); - var Tokenizer = require("../tokenizer").Tokenizer; var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; @@ -6705,38 +6981,30 @@ var unicode = require("../unicode"); var lang = require("../lib/lang"); var TokenIterator = require("../token_iterator").TokenIterator; var Range = require("../range").Range; - -var Mode = function() { +var Mode; +Mode = function () { this.HighlightRules = TextHighlightRules; }; - -(function() { +(function () { this.$defaultBehaviour = new CstyleBehaviour(); - this.tokenRe = new RegExp("^[" + unicode.wordChars + "\\$_]+", "g"); - this.nonTokenRe = new RegExp("^(?:[^" + unicode.wordChars + "\\$_]|\\s])+", "g"); - - this.getTokenizer = function() { + this.getTokenizer = function () { if (!this.$tokenizer) { this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); } return this.$tokenizer; }; - this.lineCommentStart = ""; this.blockComment = ""; - - this.toggleCommentLines = function(state, session, startRow, endRow) { + this.toggleCommentLines = function (state, session, startRow, endRow) { var doc = session.doc; - var ignoreBlankLines = true; var shouldRemove = true; var minIndent = Infinity; var tabSize = session.getTabSize(); var insertAtTabStop = false; - if (!this.lineCommentStart) { if (!this.blockComment) return false; @@ -6744,25 +7012,22 @@ var Mode = function() { var lineCommentEnd = this.blockComment.end; var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); - - var comment = function(line, i) { + var comment = function (line, i) { if (testRemove(line, i)) return; if (!ignoreBlankLines || /\S/.test(line)) { - doc.insertInLine({row: i, column: line.length}, lineCommentEnd); - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + doc.insertInLine({ row: i, column: line.length }, lineCommentEnd); + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); } }; - - var uncomment = function(line, i) { + var uncomment = function (line, i) { var m; if (m = line.match(regexpEnd)) doc.removeInLine(i, line.length - m[0].length, line.length); if (m = line.match(regexpStart)) doc.removeInLine(i, m[1].length, m[0].length); }; - - var testRemove = function(line, row) { + var testRemove = function (line, row) { if (regexpStart.test(line)) return true; var tokens = session.getTokens(row); @@ -6771,40 +7036,40 @@ var Mode = function() { return true; } }; - } else { + } + else { if (Array.isArray(this.lineCommentStart)) { var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); var lineCommentStart = this.lineCommentStart[0]; - } else { + } + else { var regexpStart = lang.escapeRegExp(this.lineCommentStart); var lineCommentStart = this.lineCommentStart; } regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); - insertAtTabStop = session.getUseSoftTabs(); - - var uncomment = function(line, i) { + var uncomment = function (line, i) { var m = line.match(regexpStart); - if (!m) return; + if (!m) + return; var start = m[1].length, end = m[0].length; if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") end--; doc.removeInLine(i, start, end); }; var commentWithSpace = lineCommentStart + " "; - var comment = function(line, i) { + var comment = function (line, i) { if (!ignoreBlankLines || /\S/.test(line)) { if (shouldInsertSpace(line, minIndent, minIndent)) - doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + doc.insertInLine({ row: i, column: minIndent }, commentWithSpace); else - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + doc.insertInLine({ row: i, column: minIndent }, lineCommentStart); } }; - var testRemove = function(line, i) { + var testRemove = function (line, i) { return regexpStart.test(line); }; - - var shouldInsertSpace = function(line, before, after) { + var shouldInsertSpace = function (line, before, after) { var spaces = 0; while (before-- && line.charAt(before) == " ") spaces++; @@ -6819,52 +7084,43 @@ var Mode = function() { return spaces % tabSize == 0; }; } - function iter(fun) { for (var i = startRow; i <= endRow; i++) fun(doc.getLine(i), i); } - - var minEmptyLength = Infinity; - iter(function(line, i) { + iter(function (line, i) { var indent = line.search(/\S/); if (indent !== -1) { if (indent < minIndent) minIndent = indent; if (shouldRemove && !testRemove(line, i)) shouldRemove = false; - } else if (minEmptyLength > line.length) { + } + else if (minEmptyLength > line.length) { minEmptyLength = line.length; } }); - if (minIndent == Infinity) { minIndent = minEmptyLength; ignoreBlankLines = false; shouldRemove = false; } - if (insertAtTabStop && minIndent % tabSize != 0) minIndent = Math.floor(minIndent / tabSize) * tabSize; - iter(shouldRemove ? uncomment : comment); }; - - this.toggleBlockComment = function(state, session, range, cursor) { + this.toggleBlockComment = function (state, session, range, cursor) { var comment = this.blockComment; if (!comment) return; if (!comment.start && comment[0]) comment = comment[0]; - var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); - var sel = session.selection; var initialRange = session.selection.toOrientedRange(); var startRow, colDiff; - if (token && /comment/.test(token.type)) { var startRange, endRange; while (token && /comment/.test(token.type)) { @@ -6877,7 +7133,6 @@ var Mode = function() { } token = iterator.stepBackward(); } - var iterator = new TokenIterator(session, cursor.row, cursor.column); var token = iterator.getCurrentToken(); while (token && /comment/.test(token.type)) { @@ -6897,7 +7152,8 @@ var Mode = function() { startRow = startRange.start.row; colDiff = -comment.start.length; } - } else { + } + else { colDiff = comment.start.length; startRow = range.start.row; session.insert(range.end, comment.end); @@ -6909,26 +7165,20 @@ var Mode = function() { initialRange.end.column += colDiff; session.selection.fromOrientedRange(initialRange); }; - - this.getNextLineIndent = function(state, line, tab) { + this.getNextLineIndent = function (state, line, tab) { return this.$getIndent(line); }; - - this.checkOutdent = function(state, line, input) { + this.checkOutdent = function (state, line, input) { return false; }; - - this.autoOutdent = function(state, doc, row) { + this.autoOutdent = function (state, doc, row) { }; - - this.$getIndent = function(line) { + this.$getIndent = function (line) { return line.match(/^\s*/)[0]; }; - - this.createWorker = function(session) { + this.createWorker = function (session) { return null; }; - this.createModeDelegates = function (mapping) { this.$embeds = []; this.$modes = {}; @@ -6945,22 +7195,24 @@ var Mode = function() { this.$modes[i] = mode; } } - - var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; - + var _loop_1 = function (i) { + (function (scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = + function () { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this_1)); + }; + var this_1 = this; for (var i = 0; i < delegations.length; i++) { - (function(scope) { - var functionName = delegations[i]; - var defaultHandler = scope[functionName]; - scope[delegations[i]] = function() { - return this.$delegator(functionName, arguments, defaultHandler); - }; - }(this)); + _loop_1(i); } }; - - this.$delegator = function(method, args, defaultHandler) { + this.$delegator = function (method, args, defaultHandler) { var state = args[0] || "start"; if (typeof state != "string") { if (Array.isArray(state[2])) { @@ -6971,10 +7223,9 @@ var Mode = function() { } state = state[0] || "start"; } - for (var i = 0; i < this.$embeds.length; i++) { - if (!this.$modes[this.$embeds[i]]) continue; - + if (!this.$modes[this.$embeds[i]]) + continue; var split = state.split(this.$embeds[i]); if (!split[0] && split[1]) { args[0] = split[1]; @@ -6985,8 +7236,7 @@ var Mode = function() { var ret = defaultHandler.apply(this, args); return defaultHandler ? ret : undefined; }; - - this.transformAction = function(state, action, editor, session, param) { + this.transformAction = function (state, action, editor, session, param) { if (this.$behaviour) { var behaviours = this.$behaviour.getBehaviours(); for (var key in behaviours) { @@ -6999,10 +7249,9 @@ var Mode = function() { } } }; - - this.getKeywords = function(append) { + this.getKeywords = function (append) { if (!this.completionKeywords) { - var rules = this.$tokenizer.rules; + var rules = this.$tokenizer["rules"]; var completionKeywords = []; for (var rule in rules) { var ruleItr = rules[rule]; @@ -7012,7 +7261,7 @@ var Mode = function() { completionKeywords.push(ruleItr[r].regex); } else if (typeof ruleItr[r].token === "object") { - for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { if (/keyword|support|storage/.test(ruleItr[r].token[a])) { var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; completionKeywords.push(rule.substr(1, rule.length - 2)); @@ -7027,16 +7276,14 @@ var Mode = function() { return this.$keywordList; return completionKeywords.concat(this.$keywordList || []); }; - - this.$createKeywordList = function() { + this.$createKeywordList = function () { if (!this.$highlightRules) this.getTokenizer(); return this.$keywordList = this.$highlightRules.$keywordList || []; }; - - this.getCompletions = function(state, session, pos, prefix) { + this.getCompletions = function (state, session, pos, prefix) { var keywords = this.$keywordList || this.$createKeywordList(); - return keywords.map(function(word) { + return keywords.map(function (word) { return { name: word, value: word, @@ -7045,303 +7292,598 @@ var Mode = function() { }; }); }; - this.$id = "ace/mode/text"; }).call(Mode.prototype); - exports.Mode = Mode; -}); - -define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { -"use strict"; - -function throwDeltaError(delta, errorText){ - console.log("Invalid Delta:", delta); - throw "Invalid Delta: " + errorText; -} - -function positionInDocument(docLines, position) { - return position.row >= 0 && position.row < docLines.length && - position.column >= 0 && position.column <= docLines[position.row].length; -} - -function validateDelta(docLines, delta) { - if (delta.action != "insert" && delta.action != "remove") - throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); - if (!(delta.lines instanceof Array)) - throwDeltaError(delta, "delta.lines must be an Array"); - if (!delta.start || !delta.end) - throwDeltaError(delta, "delta.start/end must be an present"); - var start = delta.start; - if (!positionInDocument(docLines, delta.start)) - throwDeltaError(delta, "delta.start must be contained in document"); - var end = delta.end; - if (delta.action == "remove" && !positionInDocument(docLines, end)) - throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); - var numRangeRows = end.row - start.row; - var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); - if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) - throwDeltaError(delta, "delta.range must match delta lines"); -} -exports.applyDelta = function(docLines, delta, doNotValidate) { - - var row = delta.start.row; - var startColumn = delta.start.column; - var line = docLines[row] || ""; - switch (delta.action) { - case "insert": - var lines = delta.lines; - if (lines.length === 1) { - docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); - } else { - var args = [row, 1].concat(delta.lines); - docLines.splice.apply(docLines, args); - docLines[row] = line.substring(0, startColumn) + docLines[row]; - docLines[row + delta.lines.length - 1] += line.substring(startColumn); - } - break; - case "remove": - var endColumn = delta.end.column; - var endRow = delta.end.row; - if (row === endRow) { - docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); - } else { - docLines.splice( - row, endRow - row + 1, - line.substring(0, startColumn) + docLines[endRow].substring(endColumn) - ); - } - break; - } -}; }); -define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.$onChange = this.onChange.bind(this); - this.attach(doc); - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.getPosition = function() { - return this.$clipPositionToDocument(this.row, this.column); +define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; +var dom = require("./lib/dom"); +var LineWidgets = /** @class */ (function () { + function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); + } + LineWidgets.prototype.getRowLength = function (row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this["$useWrapMode"] || !this["$wrapData"][row]) { + return 1 + h; + } + else { + return this["$wrapData"][row].length + 1 + h; + } }; - this.getDocument = function() { - return this.document; + LineWidgets.prototype.$getWidgetScreenLength = function () { + var screenRows = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; }; - this.$insertRight = false; - this.onChange = function(delta) { - if (delta.start.row == delta.end.row && delta.start.row != this.row) + LineWidgets.prototype.$onChangeEditor = function (e) { + this.attach(e.editor); + }; + LineWidgets.prototype.attach = function (editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + if (this.editor == editor) return; - - if (delta.start.row > this.row) + this.detach(); + this.editor = editor; + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + LineWidgets.prototype.detach = function (e) { + var editor = this.editor; + if (!editor) return; - - var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); - this.setPosition(point.row, point.column, true); + this.editor = null; + editor.widgetManager = null; + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function (w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); }; - - function $pointsInOrder(point1, point2, equalPointsInOrder) { - var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; - return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); - } - - function $getTransformedPoint(delta, point, moveIfEqual) { - var deltaIsInsert = delta.action == "insert"; - var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); - var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); - var deltaStart = delta.start; - var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. - if ($pointsInOrder(point, deltaStart, moveIfEqual)) { - return { - row: point.row, - column: point.column - }; + LineWidgets.prototype.updateOnFold = function (e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; } - if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { - return { - row: point.row + deltaRowShift, - column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) - }; + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } + else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } } - - return { - row: deltaStart.row, - column: deltaStart.column - }; - } - this.setPosition = function(row, column, noClip) { - var pos; - if (noClip) { - pos = { - row: row, - column: column - }; - } else { - pos = this.$clipPositionToDocument(row, column); + }; + LineWidgets.prototype.updateOnChange = function (delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var startRow = delta.start.row; + var len = delta.end.row - startRow; + if (len === 0) { } - - if (this.row == pos.row && this.column == pos.column) + else if (delta.action == "remove") { + var removed = lineWidgets.splice(startRow + 1, len); + if (!lineWidgets[startRow] && removed[removed.length - 1]) { + lineWidgets[startRow] = removed.pop(); + } + removed.forEach(function (w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } + else { + var args = new Array(len); + if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { + if (delta.start.column > lineWidgets[startRow].column) + startRow++; + } + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + LineWidgets.prototype.$updateRows = function () { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; - - var old = { - row: this.row, - column: this.column - }; - - this.row = pos.row; - this.column = pos.column; - this._signal("change", { - old: old, - value: pos + var noWidgets = true; + lineWidgets.forEach(function (w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } }); + if (noWidgets) + this.session.lineWidgets = null; }; - this.detach = function() { - this.document.off("change", this.$onChange); - }; - this.attach = function(doc) { - this.document = doc || this.document; - this.document.on("change", this.$onChange); - }; - this.$clipPositionToDocument = function(row, column) { - var pos = {}; - - if (row >= this.document.getLength()) { - pos.row = Math.max(0, this.document.getLength() - 1); - pos.column = this.document.getLine(pos.row).length; + LineWidgets.prototype.$registerLineWidget = function (w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } } - else if (row < 0) { - pos.row = 0; - pos.column = 0; + this.session.lineWidgets[w.row] = w; + return w; + }; + LineWidgets.prototype.addLineWidget = function (w) { + this.$registerLineWidget(w); + w.session = this.session; + if (!this.editor) + return w; + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; } - else { - pos.row = row; - pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + if (w.text && !w.el) { + w.el = dom.createElement("div"); + w.el.textContent = w.text; } - - if (column < 0) - pos.column = 0; - - return pos; + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + if (w.className) { + dom.addCssClass(w.el, w.className); + } + w.el.style.position = "absolute"; + w.el.style.zIndex = "5"; + renderer.container.appendChild(w.el); + w._inDocument = true; + if (!w.coverGutter) { + w.el.style.zIndex = "3"; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; }; - -}).call(Anchor.prototype); + LineWidgets.prototype.removeLineWidget = function (w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) + try { + w.editor.destroy(); + } + catch (e) { } + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row]; + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } + else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", { data: { start: { row: w.row } } }); + this.$updateRows(); + }; + LineWidgets.prototype.getWidgetsAtRow = function (row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + LineWidgets.prototype.onWidgetChanged = function (w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + LineWidgets.prototype.measureWidgets = function (e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + if (!changedWidgets || !changedWidgets.length) + return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) + continue; + if (w.session != this.session) + continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + w.h = w.el.offsetHeight; + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", { data: { start: { row: min } } }); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + LineWidgets.prototype.renderWidgets = function (e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + while (first > 0 && !lineWidgets[first]) + first--; + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) + continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({ row: i, column: 0 }, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } + else { + w.el.style.right = ""; + } + } + }; + return LineWidgets; +}()); +exports.LineWidgets = LineWidgets; }); -define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var applyDelta = require("./apply_delta").applyDelta; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Anchor = require("./anchor").Anchor; - -var Document = function(textOrLines) { - this.$lines = [""]; - if (textOrLines.length === 0) { - this.$lines = [""]; - } else if (Array.isArray(textOrLines)) { - this.insertMergedLines({row: 0, column: 0}, textOrLines); - } else { - this.insert({row: 0, column:0}, textOrLines); +define("ace/apply_delta",["require","exports","module"], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} +exports.applyDelta = function (docLines, delta, doNotValidate) { + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } + else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); + } + break; } }; -(function() { - - oop.implement(this, EventEmitter); +}); - this.initialize = function(text) { - this.refresh(text); - }; - this.setValue = function(text) { - var len = this.getLength() - 1; - this.remove(new Range(0, 0, len, this.getLine(len).length)); - this.insert({row: 0, column: 0}, text); +define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { + return this.$clipPositionToDocument(this.row, this.column); }; - this.getValue = function() { - return this.getAllLines().join(this.getNewLineCharacter()); + Anchor.prototype.getDocument = function () { + return this.document; }; - this.createAnchor = function(row, column) { - return new Anchor(this, row, column); + Anchor.prototype.onChange = function (delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + if (delta.start.row > this.row) + return; + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); + this.setPosition(point.row, point.column, true); }; - if ("aaa".split(/a/).length === 0) { - this.$split = function(text) { - return text.replace(/\r\n|\r/g, "\n").split("\n"); - }; - } else { - this.$split = function(text) { - return text.split(/\r\n|\r|\n/); + Anchor.prototype.setPosition = function (row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } + else { + pos = this.$clipPositionToDocument(row, column); + } + if (this.row == pos.row && this.column == pos.column) + return; + var old = { + row: this.row, + column: this.column }; - } - - - this.$detectNewLine = function(text) { - var match = text.match(/^.*?(\r\n|\r|\n)/m); - this.$autoNewLine = match ? match[1] : "\n"; - this._signal("changeNewLineMode"); + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); }; - this.getNewLineCharacter = function() { - switch (this.$newLineMode) { - case "windows": - return "\r\n"; - case "unix": - return "\n"; - default: - return this.$autoNewLine || "\n"; - } + Anchor.prototype.detach = function () { + this.document.off("change", this.$onChange); }; + Anchor.prototype.attach = function (doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + Anchor.prototype.$clipPositionToDocument = function (row, column) { + var pos = {}; + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + if (column < 0) + pos.column = 0; + return pos; + }; + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; + +}); - this.$autoNewLine = ""; - this.$newLineMode = "auto"; - this.setNewLineMode = function(newLineMode) { - if (this.$newLineMode === newLineMode) - return; - +define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; +var Document = /** @class */ (function () { + function Document(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } + } + Document.prototype.setValue = function (text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({ row: 0, column: 0 }, text || ""); + }; + Document.prototype.getValue = function () { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + Document.prototype.createAnchor = function (row, column) { + return new Anchor(this, row, column); + }; + Document.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + Document.prototype.getNewLineCharacter = function () { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + Document.prototype.setNewLineMode = function (newLineMode) { + if (this.$newLineMode === newLineMode) + return; this.$newLineMode = newLineMode; this._signal("changeNewLineMode"); }; - this.getNewLineMode = function() { + Document.prototype.getNewLineMode = function () { return this.$newLineMode; }; - this.isNewLine = function(text) { + Document.prototype.isNewLine = function (text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; - this.getLine = function(row) { + Document.prototype.getLine = function (row) { return this.$lines[row] || ""; }; - this.getLines = function(firstRow, lastRow) { + Document.prototype.getLines = function (firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; - this.getAllLines = function() { + Document.prototype.getAllLines = function () { return this.getLines(0, this.getLength()); }; - this.getLength = function() { + Document.prototype.getLength = function () { return this.$lines.length; }; - this.getTextRange = function(range) { + Document.prototype.getTextRange = function (range) { return this.getLinesForRange(range).join(this.getNewLineCharacter()); }; - this.getLinesForRange = function(range) { + Document.prototype.getLinesForRange = function (range) { var lines; if (range.start.row === range.end.row) { lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; - } else { + } + else { lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; @@ -7350,45 +7892,43 @@ var Document = function(textOrLines) { } return lines; }; - this.insertLines = function(row, lines) { + Document.prototype.insertLines = function (row, lines) { console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); return this.insertFullLines(row, lines); }; - this.removeLines = function(firstRow, lastRow) { + Document.prototype.removeLines = function (firstRow, lastRow) { console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); return this.removeFullLines(firstRow, lastRow); }; - this.insertNewLine = function(position) { + Document.prototype.insertNewLine = function (position) { console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); return this.insertMergedLines(position, ["", ""]); }; - this.insert = function(position, text) { + Document.prototype.insert = function (position, text) { if (this.getLength() <= 1) this.$detectNewLine(text); - return this.insertMergedLines(position, this.$split(text)); }; - this.insertInLine = function(position, text) { + Document.prototype.insertInLine = function (position, text) { var start = this.clippedPos(position.row, position.column); var end = this.pos(position.row, position.column + text.length); - this.applyDelta({ start: start, end: end, action: "insert", lines: [text] }, true); - return this.clonePos(end); }; - - this.clippedPos = function(row, column) { + Document.prototype.clippedPos = function (row, column) { var length = this.getLength(); if (row === undefined) { row = length; - } else if (row < 0) { + } + else if (row < 0) { row = 0; - } else if (row >= length) { + } + else if (row >= length) { row = length - 1; column = undefined; } @@ -7396,115 +7936,87 @@ var Document = function(textOrLines) { if (column == undefined) column = line.length; column = Math.min(Math.max(column, 0), line.length); - return {row: row, column: column}; + return { row: row, column: column }; }; - - this.clonePos = function(pos) { - return {row: pos.row, column: pos.column}; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; }; - - this.pos = function(row, column) { - return {row: row, column: column}; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; }; - - this.$clipPosition = function(position) { + Document.prototype.$clipPosition = function (position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length - 1).length; - } else { + } + else { position.row = Math.max(0, position.row); position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); } return position; }; - - this.refresh = function(text, row){ - var row = row || 0 - var lines = this.$split(text); - if (lines.length > 0xFFFF) { - var end = this.refresh(row, lines.slice(0xFFFF)); - lines = lines.slice(0, 0xFFFF); - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - context: 'refresh', - range: range, - lines: lines - }; - this._emit("change", { data: delta }); - return {row:0, column:0}; - } - this.insertFullLines = function(row, lines) { + Document.prototype.insertFullLines = function (row, lines) { row = Math.min(Math.max(row, 0), this.getLength()); var column = 0; if (row < this.getLength()) { lines = lines.concat([""]); column = 0; - } else { + } + else { lines = [""].concat(lines); row--; column = this.$lines[row].length; } - this.insertMergedLines({row: row, column: column}, lines); + this.insertMergedLines({ row: row, column: column }, lines); }; - this.insertMergedLines = function(position, lines) { + Document.prototype.insertMergedLines = function (position, lines) { var start = this.clippedPos(position.row, position.column); var end = { row: start.row + lines.length - 1, column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length }; - this.applyDelta({ start: start, end: end, action: "insert", lines: lines }); - return this.clonePos(end); }; - this.remove = function(range) { + Document.prototype.remove = function (range) { var start = this.clippedPos(range.start.row, range.start.column); var end = this.clippedPos(range.end.row, range.end.column); this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }); return this.clonePos(start); }; - this.removeInLine = function(row, startColumn, endColumn) { + Document.prototype.removeInLine = function (row, startColumn, endColumn) { var start = this.clippedPos(row, startColumn); var end = this.clippedPos(row, endColumn); - this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }, true); - return this.clonePos(start); }; - this.removeFullLines = function(firstRow, lastRow) { + Document.prototype.removeFullLines = function (firstRow, lastRow) { firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); - lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; - var deleteLastNewLine = lastRow < this.getLength() - 1; - var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); - var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); - var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); - var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); var range = new Range(startRow, startCol, endRow, endCol); var deletedLines = this.$lines.slice(firstRow, lastRow + 1); - this.applyDelta({ start: range.start, end: range.end, @@ -7513,7 +8025,7 @@ var Document = function(textOrLines) { }); return deletedLines; }; - this.removeNewLine = function(row) { + Document.prototype.removeNewLine = function (row) { if (row < this.getLength() - 1 && row >= 0) { this.applyDelta({ start: this.pos(row, this.getLine(row).length), @@ -7523,14 +8035,13 @@ var Document = function(textOrLines) { }); } }; - this.replace = function(range, text) { + Document.prototype.replace = function (range, text) { if (!(range instanceof Range)) range = Range.fromPoints(range.start, range.end); if (text.length === 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; - this.remove(range); var end; if (text) { @@ -7539,26 +8050,24 @@ var Document = function(textOrLines) { else { end = range.start; } - return end; }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { this.revertDelta(deltas[i]); } }; - this.applyDelta = function(delta, doNotValidate) { + Document.prototype.applyDelta = function (delta, doNotValidate) { var isInsert = delta.action == "insert"; if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] : !Range.comparePoints(delta.start, delta.end)) { return; } - if (isInsert && delta.lines.length > 20000) { this.$splitAndapplyLargeDelta(delta, 20000); } @@ -7567,18 +8076,14 @@ var Document = function(textOrLines) { this._signal("change", delta); } }; - - this.$safeApplyDelta = function(delta) { + Document.prototype.$safeApplyDelta = function (delta) { var docLength = this.$lines.length; - if ( - delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength - || delta.action == "insert" && delta.start.row <= docLength - ) { + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { this.applyDelta(delta); } }; - - this.$splitAndapplyLargeDelta = function(delta, MAX) { + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { var lines = delta.lines; var l = lines.length - MAX + 1; var row = delta.start.row; @@ -7599,7 +8104,7 @@ var Document = function(textOrLines) { delta.start.column = column; this.applyDelta(delta, true); }; - this.revertDelta = function(delta) { + Document.prototype.revertDelta = function (delta) { this.$safeApplyDelta({ start: this.clonePos(delta.start), end: this.clonePos(delta.end), @@ -7607,7836 +8112,8343 @@ var Document = function(textOrLines) { lines: delta.lines.slice() }); }; - this.indexToPosition = function(index, startRow) { + Document.prototype.indexToPosition = function (index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; + return { row: i, column: index + lines[i].length + newlineLength }; } - return {row: l-1, column: index + lines[l-1].length + newlineLength}; + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; }; - this.positionToIndex = function(pos, startRow) { + Document.prototype.positionToIndex = function (pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; - return index + pos.column; }; - -}).call(Document.prototype); - + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); exports.Document = Document; -}); -define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; +}); +define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var BackgroundTokenizer = function(tokenizer, editor) { - this.running = false; - this.lines = []; - this.states = []; - this.currentLine = 0; - this.tokenizer = tokenizer; - - var self = this; - - this.$worker = function() { - if (!self.running) { return; } - - var workerStart = new Date(); - var currentLine = self.currentLine; - var endLine = -1; - var doc = self.doc; - - var startLine = currentLine; - while (self.lines[currentLine]) - currentLine++; - - var len = doc.getLength(); - var processedLines = 0; - self.running = false; - while (currentLine < len) { - self.$tokenizeRow(currentLine); - endLine = currentLine; - do { +var BackgroundTokenizer = /** @class */ (function () { + function BackgroundTokenizer(tokenizer, session) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + var self = this; + this.$worker = function () { + if (!self.running) { + return; + } + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + var startLine = currentLine; + while (self.lines[currentLine]) currentLine++; - } while (self.lines[currentLine]); - processedLines ++; - if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { - self.running = setTimeout(self.$worker, 20); - break; + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } } - } - self.currentLine = currentLine; - - if (endLine == -1) - endLine = currentLine; - - if (startLine <= endLine) - self.fireUpdateEvent(startLine, endLine); - }; -}; - -(function(){ - - oop.implement(this, EventEmitter); - this.setTokenizer = function(tokenizer) { + self.currentLine = currentLine; + if (endLine == -1) + endLine = currentLine; + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; + } + BackgroundTokenizer.prototype.setTokenizer = function (tokenizer) { this.tokenizer = tokenizer; this.lines = []; this.states = []; - this.start(0); }; - this.setDocument = function(doc) { + BackgroundTokenizer.prototype.setDocument = function (doc) { this.doc = doc; this.lines = []; this.states = []; - this.stop(); }; - this.fireUpdateEvent = function(firstRow, lastRow) { + BackgroundTokenizer.prototype.fireUpdateEvent = function (firstRow, lastRow) { var data = { first: firstRow, last: lastRow }; - this._signal("update", {data: data}); + this._signal("update", { data: data }); }; - this.start = function(startRow) { + BackgroundTokenizer.prototype.start = function (startRow) { this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); this.lines.splice(this.currentLine, this.lines.length); this.states.splice(this.currentLine, this.states.length); - this.stop(); this.running = setTimeout(this.$worker, 700); }; - - this.scheduleStart = function() { + BackgroundTokenizer.prototype.scheduleStart = function () { if (!this.running) this.running = setTimeout(this.$worker, 700); }; - - this.$updateOnChange = function(delta) { + BackgroundTokenizer.prototype.$updateOnChange = function (delta) { var startRow = delta.start.row; var len = delta.end.row - startRow; - if (len === 0) { this.lines[startRow] = null; - } else if (delta.action == "remove") { + } + else if (delta.action == "remove") { this.lines.splice(startRow, len + 1, null); this.states.splice(startRow, len + 1, null); - } else { + } + else { var args = Array(len + 1); args.unshift(startRow, 1); this.lines.splice.apply(this.lines, args); this.states.splice.apply(this.states, args); } - this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); - this.stop(); }; - this.stop = function() { + BackgroundTokenizer.prototype.stop = function () { if (this.running) clearTimeout(this.running); this.running = false; }; - this.getTokens = function(row) { + BackgroundTokenizer.prototype.getTokens = function (row) { return this.lines[row] || this.$tokenizeRow(row); }; - this.getState = function(row) { + BackgroundTokenizer.prototype.getState = function (row) { if (this.currentLine == row) this.$tokenizeRow(row); return this.states[row] || "start"; }; - - this.$tokenizeRow = function(row) { + BackgroundTokenizer.prototype.$tokenizeRow = function (row) { var line = this.doc.getLine(row); var state = this.states[row - 1]; - var data = this.tokenizer.getLineTokens(line, state, row); - if (this.states[row] + "" !== data.state + "") { this.states[row] = data.state; this.lines[row + 1] = null; if (this.currentLine > row + 1) this.currentLine = row + 1; - } else if (this.currentLine == row) { + } + else if (this.currentLine == row) { this.currentLine = row + 1; } - return this.lines[row] = data.tokens; }; - - this.cleanup = function() { + BackgroundTokenizer.prototype.cleanup = function () { this.running = false; this.lines = []; this.states = []; this.currentLine = 0; this.removeAllListeners(); }; - -}).call(BackgroundTokenizer.prototype); - + return BackgroundTokenizer; +}()); +oop.implement(BackgroundTokenizer.prototype, EventEmitter); exports.BackgroundTokenizer = BackgroundTokenizer; -}); -define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { -"use strict"; +}); +define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/range"], function(require, exports, module){"use strict"; var lang = require("./lib/lang"); -var oop = require("./lib/oop"); var Range = require("./range").Range; - -var SearchHighlight = function(regExp, clazz, type) { - this.setRegexp(regExp); - this.clazz = clazz; - this.type = type || "text"; -}; - -(function() { - this.MAX_RANGES = 500; - - this.setRegexp = function(regExp) { - if (this.regExp+"" == regExp+"") +var SearchHighlight = /** @class */ (function () { + function SearchHighlight(regExp, clazz, type) { + if (type === void 0) { type = "text"; } + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type; + this.docLen = 0; + } + SearchHighlight.prototype.setRegexp = function (regExp) { + if (this.regExp + "" == regExp + "") return; this.regExp = regExp; this.cache = []; }; - - this.update = function(html, markerLayer, session, config) { + SearchHighlight.prototype.update = function (html, markerLayer, session, config) { if (!this.regExp) return; - var start = config.firstRow, end = config.lastRow; + var start = config.firstRow; + var end = config.lastRow; var renderedMarkerRanges = {}; - + var _search = session.$editor && session.$editor.$search; + var mtSearch = _search && _search.$isMultilineSearch(session.$editor.getLastSearchOptions()); for (var i = start; i <= end; i++) { var ranges = this.cache[i]; - if (ranges == null) { - ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); - if (ranges.length > this.MAX_RANGES) - ranges = ranges.slice(0, this.MAX_RANGES); - ranges = ranges.map(function(match) { - return new Range(i, match.offset, i, match.offset + match.length); - }); + if (ranges == null || session.getValue().length != this.docLen) { + if (mtSearch) { + ranges = []; + var match = _search.$multiLineForward(session, this.regExp, i, end); + if (match) { + var end_row = match.endRow <= end ? match.endRow - 1 : end; + if (end_row > i) + i = end_row; + ranges.push(new Range(match.startRow, match.startCol, match.endRow, match.endCol)); + } + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + } + else { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function (match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + } this.cache[i] = ranges.length ? ranges : ""; } - - for (var j = ranges.length; j --; ) { + if (ranges.length === 0) + continue; + for (var j = ranges.length; j--;) { var rangeToAddMarkerTo = ranges[j].toScreenRange(session); var rangeAsString = rangeToAddMarkerTo.toString(); - if (renderedMarkerRanges[rangeAsString]) continue; - + if (renderedMarkerRanges[rangeAsString]) + continue; renderedMarkerRanges[rangeAsString] = true; - markerLayer.drawSingleLineMarker( - html, rangeToAddMarkerTo, this.clazz, config); + markerLayer.drawSingleLineMarker(html, rangeToAddMarkerTo, this.clazz, config); } } + this.docLen = session.getValue().length; }; - -}).call(SearchHighlight.prototype); - + return SearchHighlight; +}()); +SearchHighlight.prototype.MAX_RANGES = 500; exports.SearchHighlight = SearchHighlight; -}); -define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; +}); -var Range = require("../range").Range; -function FoldLine(foldData, folds) { - this.foldData = foldData; - if (Array.isArray(folds)) { - this.folds = folds; - } else { - folds = this.folds = [ folds ]; +define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var UndoManager = /** @class */ (function () { + function UndoManager() { + this.$keepRedoStack; + this.$maxRev = 0; + this.$fromUndo = false; + this.$undoDepth = Infinity; + this.reset(); } - - var last = folds[folds.length - 1]; - this.range = new Range(folds[0].start.row, folds[0].start.column, - last.end.row, last.end.column); - this.start = this.range.start; - this.end = this.range.end; - - this.folds.forEach(function(fold) { - fold.setFoldLine(this); - }, this); -} - -(function() { - this.shiftRow = function(shift) { - this.start.row += shift; - this.end.row += shift; - this.folds.forEach(function(fold) { - fold.start.row += shift; - fold.end.row += shift; - }); + UndoManager.prototype.addSession = function (session) { + this.$session = session; }; - - this.addFold = function(fold) { - if (fold.sameRow) { - if (fold.start.row < this.startRow || fold.endRow > this.endRow) { - throw new Error("Can't add a fold to this FoldLine as it has no connection"); - } - this.folds.push(fold); - this.folds.sort(function(a, b) { - return -a.range.compareEnd(b.start.row, b.start.column); - }); - if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { - this.start.row = fold.start.row; - this.start.column = fold.start.column; + UndoManager.prototype.add = function (delta, allowMerge, session) { + if (this.$fromUndo) + return; + if (delta == this.$lastDelta) + return; + if (!this.$keepRedoStack) + this.$redoStack.length = 0; + if (allowMerge === false || !this.lastDeltas) { + this.lastDeltas = []; + var undoStackLength = this.$undoStack.length; + if (undoStackLength > this.$undoDepth - 1) { + this.$undoStack.splice(0, undoStackLength - this.$undoDepth + 1); } - } else if (fold.start.row == this.end.row) { - this.folds.push(fold); - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (fold.end.row == this.start.row) { - this.folds.unshift(fold); - this.start.row = fold.start.row; - this.start.column = fold.start.column; - } else { - throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + this.$undoStack.push(this.lastDeltas); + delta.id = this.$rev = ++this.$maxRev; } - fold.foldLine = this; + if (delta.action == "remove" || delta.action == "insert") + this.$lastDelta = delta; + this.lastDeltas.push(delta); }; - - this.containsRow = function(row) { - return row >= this.start.row && row <= this.end.row; + UndoManager.prototype.addSelection = function (selection, rev) { + this.selections.push({ + value: selection, + rev: rev || this.$rev + }); }; - - this.walk = function(callback, endRow, endColumn) { - var lastEnd = 0, - folds = this.folds, - fold, - cmp, stop, isNewRow = true; - - if (endRow == null) { - endRow = this.end.row; - endColumn = this.end.column; - } - - for (var i = 0; i < folds.length; i++) { - fold = folds[i]; - - cmp = fold.range.compareStart(endRow, endColumn); - if (cmp == -1) { - callback(null, endRow, endColumn, lastEnd, isNewRow); - return; - } - - stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); - stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); - if (stop || cmp === 0) { - return; - } - isNewRow = !fold.sameRow; - lastEnd = fold.end.column; - } - callback(null, endRow, endColumn, lastEnd, isNewRow); + UndoManager.prototype.startNewGroup = function () { + this.lastDeltas = null; + return this.$rev; }; - - this.getNextFoldTo = function(row, column) { - var fold, cmp; - for (var i = 0; i < this.folds.length; i++) { - fold = this.folds[i]; - cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - return { - fold: fold, - kind: "after" - }; - } else if (cmp === 0) { - return { - fold: fold, - kind: "inside" - }; - } + UndoManager.prototype.markIgnored = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id <= from) + break; + if (delta.id < to) + delta.ignore = true; } - return null; + this.lastDeltas = null; }; - - this.addRemoveChars = function(row, column, len) { - var ret = this.getNextFoldTo(row, column), - fold, folds; - if (ret) { - fold = ret.fold; - if (ret.kind == "inside" - && fold.start.column != column - && fold.start.row != row) - { - window.console && window.console.log(row, column, fold); - } else if (fold.start.row == row) { - folds = this.folds; - var i = folds.indexOf(fold); - if (i === 0) { - this.start.column += len; - } - for (i; i < folds.length; i++) { - fold = folds[i]; - fold.start.column += len; - if (!fold.sameRow) { - return; - } - fold.end.column += len; - } - this.end.column += len; + UndoManager.prototype.getSelection = function (rev, after) { + var stack = this.selections; + for (var i = stack.length; i--;) { + var selection = stack[i]; + if (selection.rev < rev) { + if (after) + selection = stack[i + 1]; + return selection; } } }; - - this.split = function(row, column) { - var pos = this.getNextFoldTo(row, column); - - if (!pos || pos.kind == "inside") - return null; - - var fold = pos.fold; - var folds = this.folds; - var foldData = this.foldData; - - var i = folds.indexOf(fold); - var foldBefore = folds[i - 1]; - this.end.row = foldBefore.end.row; - this.end.column = foldBefore.end.column; - folds = folds.splice(i, folds.length - i); - - var newFoldLine = new FoldLine(foldData, folds); - foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); - return newFoldLine; + UndoManager.prototype.getRevision = function () { + return this.$rev; }; - - this.merge = function(foldLineNext) { - var folds = foldLineNext.folds; - for (var i = 0; i < folds.length; i++) { - this.addFold(folds[i]); + UndoManager.prototype.getDeltas = function (from, to) { + if (to == null) + to = this.$rev + 1; + var stack = this.$undoStack; + var end = null, start = 0; + for (var i = stack.length; i--;) { + var delta = stack[i][0]; + if (delta.id < to && !end) + end = i + 1; + if (delta.id <= from) { + start = i + 1; + break; + } } - var foldData = this.foldData; - foldData.splice(foldData.indexOf(foldLineNext), 1); + return stack.slice(start, end); }; - - this.toString = function() { - var ret = [this.range.toString() + ": [" ]; - - this.folds.forEach(function(fold) { - ret.push(" " + fold.toString()); - }); - ret.push("]"); - return ret.join("\n"); + UndoManager.prototype.getChangedRanges = function (from, to) { + if (to == null) + to = this.$rev + 1; }; - - this.idxToPosition = function(idx) { - var lastFoldEndColumn = 0; - - for (var i = 0; i < this.folds.length; i++) { - var fold = this.folds[i]; - - idx -= fold.start.column - lastFoldEndColumn; - if (idx < 0) { - return { - row: fold.start.row, - column: fold.start.column + idx - }; - } - - idx -= fold.placeholder.length; - if (idx < 0) { - return fold.start; - } - - lastFoldEndColumn = fold.end.column; + UndoManager.prototype.getChangedLines = function (from, to) { + if (to == null) + to = this.$rev + 1; + }; + UndoManager.prototype.undo = function (session, dontSelect) { + this.lastDeltas = null; + var stack = this.$undoStack; + if (!rearrangeUndoStack(stack, stack.length)) + return; + if (!session) + session = this.$session; + if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length) + this.$redoStack = []; + this.$fromUndo = true; + var deltaSet = stack.pop(); + var undoSelectionRange = null; + if (deltaSet) { + undoSelectionRange = session.undoChanges(deltaSet, dontSelect); + this.$redoStack.push(deltaSet); + this.$syncRev(); } - - return { - row: this.end.row, - column: this.end.column + idx - }; + this.$fromUndo = false; + return undoSelectionRange; }; -}).call(FoldLine.prototype); - -exports.FoldLine = FoldLine; -}); - -define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; -var Range = require("./range").Range; -var comparePoints = Range.comparePoints; - -var RangeList = function() { - this.ranges = []; - this.$bias = 1; -}; - -(function() { - this.comparePoints = comparePoints; - - this.pointIndex = function(pos, excludeEdges, startIndex) { - var list = this.ranges; - - for (var i = startIndex || 0; i < list.length; i++) { - var range = list[i]; - var cmpEnd = comparePoints(pos, range.end); - if (cmpEnd > 0) - continue; - var cmpStart = comparePoints(pos, range.start); - if (cmpEnd === 0) - return excludeEdges && cmpStart !== 0 ? -i-2 : i; - if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) - return i; - - return -i-1; + UndoManager.prototype.redo = function (session, dontSelect) { + this.lastDeltas = null; + if (!session) + session = this.$session; + this.$fromUndo = true; + if (this.$redoStackBaseRev != this.$rev) { + var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1); + rebaseRedoStack(this.$redoStack, diff); + this.$redoStackBaseRev = this.$rev; + this.$redoStack.forEach(function (x) { + x[0].id = ++this.$maxRev; + }, this); } - return -i - 1; + var deltaSet = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltaSet) { + redoSelectionRange = session.redoChanges(deltaSet, dontSelect); + this.$undoStack.push(deltaSet); + this.$syncRev(); + } + this.$fromUndo = false; + return redoSelectionRange; }; - - this.add = function(range) { - var excludeEdges = !range.isEmpty(); - var startIndex = this.pointIndex(range.start, excludeEdges); - if (startIndex < 0) - startIndex = -startIndex - 1; - - var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); - - if (endIndex < 0) - endIndex = -endIndex - 1; - else - endIndex++; - return this.ranges.splice(startIndex, endIndex - startIndex, range); + UndoManager.prototype.$syncRev = function () { + var stack = this.$undoStack; + var nextDelta = stack[stack.length - 1]; + var id = nextDelta && nextDelta[0].id || 0; + this.$redoStackBaseRev = id; + this.$rev = id; }; - - this.addList = function(list) { - var removed = []; - for (var i = list.length; i--; ) { - removed.push.apply(removed, this.add(list[i])); - } - return removed; + UndoManager.prototype.reset = function () { + this.lastDeltas = null; + this.$lastDelta = null; + this.$undoStack = []; + this.$redoStack = []; + this.$rev = 0; + this.mark = 0; + this.$redoStackBaseRev = this.$rev; + this.selections = []; }; - - this.substractPoint = function(pos) { - var i = this.pointIndex(pos); - - if (i >= 0) - return this.ranges.splice(i, 1); + UndoManager.prototype.canUndo = function () { + return this.$undoStack.length > 0; }; - this.merge = function() { - var removed = []; - var list = this.ranges; - - list = list.sort(function(a, b) { - return comparePoints(a.start, b.start); - }); - - var next = list[0], range; - for (var i = 1; i < list.length; i++) { - range = next; - next = list[i]; - var cmp = comparePoints(range.end, next.start); - if (cmp < 0) - continue; - - if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) - continue; - - if (comparePoints(range.end, next.end) < 0) { - range.end.row = next.end.row; - range.end.column = next.end.column; - } - - list.splice(i, 1); - removed.push(next); - next = range; - i--; - } - - this.ranges = list; - - return removed; + UndoManager.prototype.canRedo = function () { + return this.$redoStack.length > 0; }; - - this.contains = function(row, column) { - return this.pointIndex({row: row, column: column}) >= 0; + UndoManager.prototype.bookmark = function (rev) { + if (rev == undefined) + rev = this.$rev; + this.mark = rev; }; - - this.containsPoint = function(pos) { - return this.pointIndex(pos) >= 0; + UndoManager.prototype.isAtBookmark = function () { + return this.$rev === this.mark; }; - - this.rangeAtPoint = function(pos) { - var i = this.pointIndex(pos); - if (i >= 0) - return this.ranges[i]; + UndoManager.prototype.toJSON = function () { + return { + $redoStack: this.$redoStack, + $undoStack: this.$undoStack + }; }; - - - this.clipRows = function(startRow, endRow) { - var list = this.ranges; - if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) - return []; - - var startIndex = this.pointIndex({row: startRow, column: 0}); - if (startIndex < 0) - startIndex = -startIndex - 1; - var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); - if (endIndex < 0) - endIndex = -endIndex - 1; - - var clipped = []; - for (var i = startIndex; i < endIndex; i++) { - clipped.push(list[i]); - } - return clipped; + UndoManager.prototype.fromJSON = function (json) { + this.reset(); + this.$undoStack = json.$undoStack; + this.$redoStack = json.$redoStack; }; - - this.removeAll = function() { - return this.ranges.splice(0, this.ranges.length); - }; - - this.attach = function(session) { - if (this.session) - this.detach(); - - this.session = session; - this.onChange = this.$onChange.bind(this); - - this.session.on('change', this.onChange); - }; - - this.detach = function() { - if (!this.session) - return; - this.session.removeListener('change', this.onChange); - this.session = null; + UndoManager.prototype.$prettyPrint = function (delta) { + if (delta) + return stringifyDelta(delta); + return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); }; - - this.$onChange = function(delta) { - var start = delta.start; - var end = delta.end; - var startRow = start.row; - var endRow = end.row; - var ranges = this.ranges; - for (var i = 0, n = ranges.length; i < n; i++) { - var r = ranges[i]; - if (r.end.row >= startRow) - break; - } - - if (delta.action == "insert") { - var lineDif = endRow - startRow; - var colDiff = -start.column + end.column; - for (; i < n; i++) { - var r = ranges[i]; - if (r.start.row > startRow) - break; - - if (r.start.row == startRow && r.start.column >= start.column) { - if (r.start.column == start.column && this.$bias <= 0) { - } else { - r.start.column += colDiff; - r.start.row += lineDif; - } - } - if (r.end.row == startRow && r.end.column >= start.column) { - if (r.end.column == start.column && this.$bias < 0) { - continue; - } - if (r.end.column == start.column && colDiff > 0 && i < n - 1) { - if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) - r.end.column -= colDiff; - } - r.end.column += colDiff; - r.end.row += lineDif; - } + return UndoManager; +}()); +UndoManager.prototype.hasUndo = UndoManager.prototype.canUndo; +UndoManager.prototype.hasRedo = UndoManager.prototype.canRedo; +UndoManager.prototype.isClean = UndoManager.prototype.isAtBookmark; +UndoManager.prototype.markClean = UndoManager.prototype.bookmark; +function rearrangeUndoStack(stack, pos) { + for (var i = pos; i--;) { + var deltaSet = stack[i]; + if (deltaSet && !deltaSet[0].ignore) { + while (i < pos - 1) { + var swapped = swapGroups(stack[i], stack[i + 1]); + stack[i] = swapped[0]; + stack[i + 1] = swapped[1]; + i++; } - } else { - var lineDif = startRow - endRow; - var colDiff = start.column - end.column; - for (; i < n; i++) { - var r = ranges[i]; - - if (r.start.row > endRow) - break; - - if (r.end.row < endRow - && ( - startRow < r.end.row - || startRow == r.end.row && start.column < r.end.column - ) - ) { - r.end.row = startRow; - r.end.column = start.column; - } - else if (r.end.row == endRow) { - if (r.end.column <= end.column) { - if (lineDif || r.end.column > start.column) { - r.end.column = start.column; - r.end.row = start.row; - } - } - else { - r.end.column += colDiff; - r.end.row += lineDif; - } - } - else if (r.end.row > endRow) { - r.end.row += lineDif; - } - - if (r.start.row < endRow - && ( - startRow < r.start.row - || startRow == r.start.row && start.column < r.start.column - ) - ) { - r.start.row = startRow; - r.start.column = start.column; - } - else if (r.start.row == endRow) { - if (r.start.column <= end.column) { - if (lineDif || r.start.column > start.column) { - r.start.column = start.column; - r.start.row = start.row; - } - } - else { - r.start.column += colDiff; - r.start.row += lineDif; - } + return true; + } + } +} +var Range = require("./range").Range; +var cmp = Range.comparePoints; +var comparePoints = Range.comparePoints; +function $updateMarkers(delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) + end = start; + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (point.bias == 1) { + cmp = 1; } - else if (r.start.row > endRow) { - r.start.row += lineDif; + else { + point.bias == -1; + continue; } } } - - if (lineDif != 0 && i < n) { - for (; i < n; i++) { - var r = ranges[i]; - r.start.row += lineDif; - r.end.row += lineDif; - } - } - }; - -}).call(RangeList.prototype); - -exports.RangeList = RangeList; -}); - -define("ace/edit_session/fold",["require","exports","module","ace/range_list","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var RangeList = require("../range_list").RangeList; -var oop = require("../lib/oop"); -var Fold = exports.Fold = function(range, placeholder) { - this.foldLine = null; - this.placeholder = placeholder; - this.range = range; - this.start = range.start; - this.end = range.end; - - this.sameRow = range.start.row == range.end.row; - this.subFolds = this.ranges = []; -}; - -oop.inherits(Fold, RangeList); - -(function() { - - this.toString = function() { - return '"' + this.placeholder + '" ' + this.range.toString(); - }; - - this.setFoldLine = function(foldLine) { - this.foldLine = foldLine; - this.subFolds.forEach(function(fold) { - fold.setFoldLine(foldLine); - }); - }; - - this.clone = function() { - var range = this.range.clone(); - var fold = new Fold(range, this.placeholder); - this.subFolds.forEach(function(subFold) { - fold.subFolds.push(subFold.clone()); - }); - fold.collapseChildren = this.collapseChildren; - return fold; - }; - - this.addSubFold = function(fold) { - if (this.range.isEqual(fold)) - return; - consumeRange(fold, this.start); - - var row = fold.start.row, column = fold.start.column; - for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { - cmp = this.subFolds[i].range.compare(row, column); - if (cmp != 1) - break; - } - var afterStart = this.subFolds[i]; - var firstConsumed = 0; - - if (cmp == 0) { - if (afterStart.range.containsRange(fold)) - return afterStart.addSubFold(fold); - else - firstConsumed = 1; - } - var row = fold.range.end.row, column = fold.range.end.column; - for (var j = i, cmp = -1; j < this.subFolds.length; j++) { - cmp = this.subFolds[j].range.compare(row, column); - if (cmp != 1) - break; + var cmp2 = isInsert ? cmp : comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; } - if (cmp == 0) j++; - var consumedFolds = this.subFolds.splice(i, j - i, fold); - var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; - for (var k = firstConsumed; k < last; k++) { - fold.addSubFold(consumedFolds[k]); + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; } - fold.setFoldLine(this.foldLine); - - return fold; - }; - - this.restoreRange = function(range) { - return restoreRange(range, this.start); - }; - -}).call(Fold.prototype); - -function consumePoint(point, anchor) { - point.row -= anchor.row; - if (point.row == 0) - point.column -= anchor.column; + } } -function consumeRange(range, anchor) { - consumePoint(range.start, anchor); - consumePoint(range.end, anchor); +function clonePos(pos) { + return { row: pos.row, column: pos.column }; } -function restorePoint(point, anchor) { - if (point.row == 0) - point.column += anchor.column; - point.row += anchor.row; +function cloneDelta(d) { + return { + start: clonePos(d.start), + end: clonePos(d.end), + action: d.action, + lines: d.lines.slice() + }; } -function restoreRange(range, anchor) { - restorePoint(range.start, anchor); - restorePoint(range.end, anchor); +function stringifyDelta(d) { + d = d || this; + if (Array.isArray(d)) { + return d.map(stringifyDelta).join("\n"); + } + var type = ""; + if (d.action) { + type = d.action == "insert" ? "+" : "-"; + type += "[" + d.lines + "]"; + } + else if (d.value) { + if (Array.isArray(d.value)) { + type = d.value.map(stringifyRange).join("\n"); + } + else { + type = stringifyRange(d.value); + } + } + if (d.start) { + type += stringifyRange(d); + } + if (d.id || d.rev) { + type += "\t(" + (d.id || d.rev) + ")"; + } + return type; } - -}); - -define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { -"use strict"; - -var Range = require("../range").Range; -var FoldLine = require("./fold_line").FoldLine; -var Fold = require("./fold").Fold; -var TokenIterator = require("../token_iterator").TokenIterator; - -function Folding() { - this.getFoldAt = function(row, column, side) { - var foldLine = this.getFoldLine(row); - if (!foldLine) +function stringifyRange(r) { + return r.start.row + ":" + r.start.column + + "=>" + r.end.row + ":" + r.end.column; +} +function swap(d1, d2) { + var i1 = d1.action == "insert"; + var i2 = d2.action == "insert"; + if (i1 && i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); + } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); + } + else { return null; - - var folds = foldLine.folds; - for (var i = 0; i < folds.length; i++) { - var range = folds[i].range; - if (range.contains(row, column)) { - if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { - continue; - } else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { - continue; - } - return folds[i]; - } } - }; - this.getFoldsInRange = function(range) { - var start = range.start; - var end = range.end; - var foldLines = this.$foldData; - var foundFolds = []; - - start.column += 1; - end.column -= 1; - - for (var i = 0; i < foldLines.length; i++) { - var cmp = foldLines[i].range.compareRange(range); - if (cmp == 2) { - continue; - } - else if (cmp == -2) { - break; - } - - var folds = foldLines[i].folds; - for (var j = 0; j < folds.length; j++) { - var fold = folds[j]; - cmp = fold.range.compareRange(range); - if (cmp == -2) { - break; - } else if (cmp == 2) { - continue; - } else - if (cmp == 42) { - break; - } - foundFolds.push(fold); - } + } + else if (i1 && !i2) { + if (cmp(d2.start, d1.end) >= 0) { + shift(d2, d1, -1); } - start.column -= 1; - end.column += 1; - - return foundFolds; - }; - - this.getFoldsInRangeList = function(ranges) { - if (Array.isArray(ranges)) { - var folds = []; - ranges.forEach(function(range) { - folds = folds.concat(this.getFoldsInRange(range)); - }, this); - } else { - var folds = this.getFoldsInRange(ranges); + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); } - return folds; - }; - this.getAllFolds = function() { - var folds = []; - var foldLines = this.$foldData; - - for (var i = 0; i < foldLines.length; i++) - for (var j = 0; j < foldLines[i].folds.length; j++) - folds.push(foldLines[i].folds[j]); - - return folds; - }; - this.getFoldStringAt = function(row, column, trim, foldLine) { - foldLine = foldLine || this.getFoldLine(row); - if (!foldLine) + else { return null; - - var lastFold = { - end: { column: 0 } - }; - var str, fold; - for (var i = 0; i < foldLine.folds.length; i++) { - fold = foldLine.folds[i]; - var cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - str = this - .getLine(fold.start.row) - .substring(lastFold.end.column, fold.start.column); - break; - } - else if (cmp === 0) { - return null; - } - lastFold = fold; } - if (!str) - str = this.getLine(fold.start.row).substring(lastFold.end.column); - - if (trim == -1) - return str.substring(0, column - lastFold.end.column); - else if (trim == 1) - return str.substring(column - lastFold.end.column); - else - return str; - }; - - this.getFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { - return foldLine; - } else if (foldLine.end.row > docRow) { - return null; - } + } + else if (!i1 && i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); } - return null; - }; - this.getNextFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.end.row >= docRow) { - return foldLine; - } + else if (cmp(d2.start, d1.start) <= 0) { + shift(d1, d2, +1); } - return null; - }; - - this.getFoldedRowCount = function(first, last) { - var foldData = this.$foldData, rowCount = last-first+1; - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i], - end = foldLine.end.row, - start = foldLine.start.row; - if (end >= last) { - if (start < last) { - if (start >= first) - rowCount -= last-start; - else - rowCount = 0; // in one fold - } - break; - } else if (end >= first){ - if (start >= first) // fold inside range - rowCount -= end-start; - else - rowCount -= end-first+1; - } + else { + return null; + } + } + else if (!i1 && !i2) { + if (cmp(d2.start, d1.start) >= 0) { + shift(d2, d1, +1); + } + else if (cmp(d2.end, d1.start) <= 0) { + shift(d1, d2, -1); } - return rowCount; - }; - - this.$addFoldLine = function(foldLine) { - this.$foldData.push(foldLine); - this.$foldData.sort(function(a, b) { - return a.start.row - b.start.row; - }); - return foldLine; - }; - this.addFold = function(placeholder, range) { - var foldData = this.$foldData; - var added = false; - var fold; - - if (placeholder instanceof Fold) - fold = placeholder; else { - fold = new Fold(range, placeholder); - fold.collapseChildren = range.collapseChildren; + return null; } - this.$clipRangeToDocument(fold.range); - - var startRow = fold.start.row; - var startColumn = fold.start.column; - var endRow = fold.end.row; - var endColumn = fold.end.column; - - var startFold = this.getFoldAt(startRow, startColumn, 1); - var endFold = this.getFoldAt(endRow, endColumn, -1); - if (startFold && endFold == startFold) - return startFold.addSubFold(fold); - - if (startFold && !startFold.range.isStart(startRow, startColumn)) - this.removeFold(startFold); - - if (endFold && !endFold.range.isEnd(endRow, endColumn)) - this.removeFold(endFold); - var folds = this.getFoldsInRange(fold.range); - if (folds.length > 0) { - this.removeFolds(folds); - if (!fold.collapseChildren) { - folds.forEach(function(subFold) { - fold.addSubFold(subFold); - }); + } + return [d2, d1]; +} +function swapGroups(ds1, ds2) { + for (var i = ds1.length; i--;) { + for (var j = 0; j < ds2.length; j++) { + if (!swap(ds1[i], ds2[j])) { + while (i < ds1.length) { + while (j--) { + swap(ds2[j], ds1[i]); + } + j = ds2.length; + i++; + } + return [ds1, ds2]; } } - - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (endRow == foldLine.start.row) { - foldLine.addFold(fold); - added = true; - break; - } else if (startRow == foldLine.end.row) { - foldLine.addFold(fold); - added = true; - if (!fold.sameRow) { - var foldLineNext = foldData[i + 1]; - if (foldLineNext && foldLineNext.start.row == endRow) { - foldLine.merge(foldLineNext); - break; - } - } - break; - } else if (endRow <= foldLine.start.row) { - break; + } + ds1.selectionBefore = ds2.selectionBefore = + ds1.selectionAfter = ds2.selectionAfter = null; + return [ds2, ds1]; +} +function xform(d1, c1) { + var i1 = d1.action == "insert"; + var i2 = c1.action == "insert"; + if (i1 && i2) { + if (cmp(d1.start, c1.start) < 0) { + shift(c1, d1, 1); + } + else { + shift(d1, c1, 1); + } + } + else if (i1 && !i2) { + if (cmp(d1.start, c1.end) >= 0) { + shift(d1, c1, -1); + } + else if (cmp(d1.start, c1.start) <= 0) { + shift(c1, d1, +1); + } + else { + shift(d1, Range.fromPoints(c1.start, d1.start), -1); + shift(c1, d1, +1); + } + } + else if (!i1 && i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.start, d1.start) <= 0) { + shift(d1, c1, +1); + } + else { + shift(c1, Range.fromPoints(d1.start, c1.start), -1); + shift(d1, c1, +1); + } + } + else if (!i1 && !i2) { + if (cmp(c1.start, d1.end) >= 0) { + shift(c1, d1, -1); + } + else if (cmp(c1.end, d1.start) <= 0) { + shift(d1, c1, -1); + } + else { + var before, after; + if (cmp(d1.start, c1.start) < 0) { + before = d1; + d1 = splitDelta(d1, c1.start); + } + if (cmp(d1.end, c1.end) > 0) { + after = splitDelta(d1, c1.end); + } + shiftPos(c1.end, d1.start, d1.end, -1); + if (after && !before) { + d1.lines = after.lines; + d1.start = after.start; + d1.end = after.end; + after = d1; } + return [c1, before, after].filter(Boolean); } - - if (!added) - foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); - - if (this.$useWrapMode) - this.$updateWrapData(foldLine.start.row, foldLine.start.row); - else - this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); - this.$modified = true; - this._signal("changeFold", { data: fold, action: "add" }); - - return fold; - }; - - this.addFolds = function(folds) { - folds.forEach(function(fold) { - this.addFold(fold); - }, this); + } + return [c1, d1]; +} +function shift(d1, d2, dir) { + shiftPos(d1.start, d2.start, d2.end, dir); + shiftPos(d1.end, d2.start, d2.end, dir); +} +function shiftPos(pos, start, end, dir) { + if (pos.row == (dir == 1 ? start : end).row) { + pos.column += dir * (end.column - start.column); + } + pos.row += dir * (end.row - start.row); +} +function splitDelta(c, pos) { + var lines = c.lines; + var end = c.end; + c.end = clonePos(pos); + var rowsBefore = c.end.row - c.start.row; + var otherLines = lines.splice(rowsBefore, lines.length); + var col = rowsBefore ? pos.column : pos.column - c.start.column; + lines.push(otherLines[0].substring(0, col)); + otherLines[0] = otherLines[0].substr(col); + var rest = { + start: clonePos(pos), + end: end, + lines: otherLines, + action: c.action }; - - this.removeFold = function(fold) { - var foldLine = fold.foldLine; - var startRow = foldLine.start.row; - var endRow = foldLine.end.row; - - var foldLines = this.$foldData; - var folds = foldLine.folds; - if (folds.length == 1) { - foldLines.splice(foldLines.indexOf(foldLine), 1); - } else - if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { - folds.pop(); - foldLine.end.row = folds[folds.length - 1].end.row; - foldLine.end.column = folds[folds.length - 1].end.column; - } else - if (foldLine.range.isStart(fold.start.row, fold.start.column)) { - folds.shift(); - foldLine.start.row = folds[0].start.row; - foldLine.start.column = folds[0].start.column; - } else - if (fold.sameRow) { - folds.splice(folds.indexOf(fold), 1); - } else - { - var newFoldLine = foldLine.split(fold.start.row, fold.start.column); - folds = newFoldLine.folds; - folds.shift(); - newFoldLine.start.row = folds[0].start.row; - newFoldLine.start.column = folds[0].start.column; + return rest; +} +function moveDeltasByOne(redoStack, d) { + d = cloneDelta(d); + for (var j = redoStack.length; j--;) { + var deltaSet = redoStack[j]; + for (var i = 0; i < deltaSet.length; i++) { + var x = deltaSet[i]; + var xformed = xform(x, d); + d = xformed[0]; + if (xformed.length != 2) { + if (xformed[2]) { + deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); + i++; + } + else if (!xformed[1]) { + deltaSet.splice(i, 1); + i--; + } + } } - - if (!this.$updating) { - if (this.$useWrapMode) - this.$updateWrapData(startRow, endRow); - else - this.$updateRowLengthCache(startRow, endRow); + if (!deltaSet.length) { + redoStack.splice(j, 1); } - this.$modified = true; - this._signal("changeFold", { data: fold, action: "remove" }); - }; - - this.removeFolds = function(folds) { - var cloneFolds = []; - for (var i = 0; i < folds.length; i++) { - cloneFolds.push(folds[i]); + } + return redoStack; +} +function rebaseRedoStack(redoStack, deltaSets) { + for (var i = 0; i < deltaSets.length; i++) { + var deltas = deltaSets[i]; + for (var j = 0; j < deltas.length; j++) { + moveDeltasByOne(redoStack, deltas[j]); } + } +} +exports.UndoManager = UndoManager; - cloneFolds.forEach(function(fold) { - this.removeFold(fold); - }, this); - this.$modified = true; - }; +}); - this.expandFold = function(fold) { - this.removeFold(fold); - fold.subFolds.forEach(function(subFold) { - fold.restoreRange(subFold); - this.addFold(subFold); - }, this); - if (fold.collapseChildren > 0) { - this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); +define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../range").Range; +var FoldLine = /** @class */ (function () { + function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; } - fold.subFolds = []; - }; - - this.expandFolds = function(folds) { - folds.forEach(function(fold) { - this.expandFold(fold); + else { + folds = this.folds = [folds]; + } + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + this.folds.forEach(function (fold) { + fold.setFoldLine(this); }, this); + } + FoldLine.prototype.shiftRow = function (shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function (fold) { + fold.start.row += shift; + fold.end.row += shift; + }); }; - - this.unfold = function(location, expandInner) { - var range, folds; - if (location == null) { - range = new Range(0, 0, this.getLength(), 0); - if (expandInner == null) expandInner = true; - } else if (typeof location == "number") { - range = new Range(location, 0, location, this.getLine(location).length); - } else if ("row" in location) { - range = Range.fromPoints(location, location); - } else if (Array.isArray(location)) { - folds = []; - location.forEach(function(range) { - folds = folds.concat(this.unfold(range)); - }, this); - return folds; - } else { - range = location; + FoldLine.prototype.addFold = function (fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function (a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } + else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } } - - folds = this.getFoldsInRangeList(range); - var outermostFolds = folds; - while ( - folds.length == 1 - && Range.comparePoints(folds[0].start, range.start) < 0 - && Range.comparePoints(folds[0].end, range.end) > 0 - ) { - this.expandFolds(folds); - folds = this.getFoldsInRangeList(range); + else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; } - - if (expandInner != false) { - this.removeFolds(folds); - } else { - this.expandFolds(folds); + else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; } - if (outermostFolds.length) - return outermostFolds; + else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; }; - this.isRowFolded = function(docRow, startFoldRow) { - return !!this.getFoldLine(docRow, startFoldRow); + FoldLine.prototype.containsRow = function (row) { + return row >= this.start.row && row <= this.end.row; }; - - this.getRowFoldEnd = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.end.row : docRow; - }; - - this.getRowFoldStart = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.start.row : docRow; - }; - - this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { - if (startRow == null) - startRow = foldLine.start.row; - if (startColumn == null) - startColumn = 0; - if (endRow == null) - endRow = foldLine.end.row; - if (endColumn == null) - endColumn = this.getLine(endRow).length; - var doc = this.doc; - var textLine = ""; - - foldLine.walk(function(placeholder, row, column, lastColumn) { - if (row < startRow) + FoldLine.prototype.walk = function (callback, endRow, endColumn) { + var lastEnd = 0, folds = this.folds, fold, cmp, stop, isNewRow = true; + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); return; - if (row == startRow) { - if (column < startColumn) - return; - lastColumn = Math.max(startColumn, lastColumn); } - - if (placeholder != null) { - textLine += placeholder; - } else { - textLine += doc.getLine(row).substring(lastColumn, column); + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; } - }, endRow, endColumn); - return textLine; - }; - - this.getDisplayLine = function(row, endColumn, startRow, startColumn) { - var foldLine = this.getFoldLine(row); - - if (!foldLine) { - var line; - line = this.doc.getLine(row); - return line.substring(startColumn || 0, endColumn || line.length); - } else { - return this.getFoldDisplayLine( - foldLine, row, endColumn, startRow, startColumn); + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; } + callback(null, endRow, endColumn, lastEnd, isNewRow); }; - - this.$cloneFoldData = function() { - var fd = []; - fd = this.$foldData.map(function(foldLine) { - var folds = foldLine.folds.map(function(fold) { - return fold.clone(); - }); - return new FoldLine(fd, folds); - }); - - return fd; - }; - - this.toggleFold = function(tryToUnfold) { - var selection = this.selection; - var range = selection.getRange(); - var fold; - var bracketPos; - - if (range.isEmpty()) { - var cursor = range.start; - fold = this.getFoldAt(cursor.row, cursor.column); - - if (fold) { - this.expandFold(fold); - return; - } else if (bracketPos = this.findMatchingBracket(cursor)) { - if (range.comparePoint(bracketPos) == 1) { - range.end = bracketPos; - } else { - range.start = bracketPos; - range.start.column++; - range.end.column--; - } - } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { - if (range.comparePoint(bracketPos) == 1) - range.end = bracketPos; - else - range.start = bracketPos; - - range.start.column++; - } else { - range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + FoldLine.prototype.getNextFoldTo = function (row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; } - } else { - var folds = this.getFoldsInRange(range); - if (tryToUnfold && folds.length) { - this.expandFolds(folds); - return; - } else if (folds.length == 1 ) { - fold = folds[0]; + else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; } } - - if (!fold) - fold = this.getFoldAt(range.start.row, range.start.column); - - if (fold && fold.range.toString() == range.toString()) { - this.expandFold(fold); - return; - } - - var placeholder = "..."; - if (!range.isMultiLine()) { - placeholder = this.getTextRange(range); - if (placeholder.length < 4) - return; - placeholder = placeholder.trim().substring(0, 2) + ".."; - } - - this.addFold(placeholder, range); + return null; }; - - this.getCommentFoldRange = function(row, column, dir) { - var iterator = new TokenIterator(this, row, column); - var token = iterator.getCurrentToken(); - var type = token && token.type; - if (token && /^comment|string/.test(type)) { - type = type.match(/comment|string/)[0]; - if (type == "comment") - type += "|doc-start"; - var re = new RegExp(type); - var range = new Range(); - if (dir != 1) { - do { - token = iterator.stepBackward(); - } while (token && re.test(token.type)); - iterator.stepForward(); + FoldLine.prototype.addRemoveChars = function (row, column, len) { + var ret = this.getNextFoldTo(row, column), fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) { + window.console && window.console.log(row, column, fold); } - - range.start.row = iterator.getCurrentTokenRow(); - range.start.column = iterator.getCurrentTokenColumn() + 2; - - iterator = new TokenIterator(this, row, column); - - if (dir != -1) { - var lastRow = -1; - do { - token = iterator.stepForward(); - if (lastRow == -1) { - var state = this.getState(iterator.$row); - if (!re.test(state)) - lastRow = iterator.$row; - } else if (iterator.$row > lastRow) { - break; + else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; } - } while (token && re.test(token.type)); - token = iterator.stepBackward(); - } else - token = iterator.getCurrentToken(); - - range.end.row = iterator.getCurrentTokenRow(); - range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; - return range; + fold.end.column += len; + } + this.end.column += len; + } } }; - - this.foldAll = function(startRow, endRow, depth, test) { - if (depth == undefined) - depth = 100000; // JSON.stringify doesn't hanle Infinity - var foldWidgets = this.foldWidgets; - if (!foldWidgets) - return; // mode doesn't support folding - endRow = endRow || this.getLength(); - startRow = startRow || 0; - for (var row = startRow; row < endRow; row++) { - if (foldWidgets[row] == null) - foldWidgets[row] = this.getFoldWidget(row); - if (foldWidgets[row] != "start") - continue; - - if (test && !test(row)) continue; - - var range = this.getFoldWidgetRange(row); - if (range && range.isMultiLine() - && range.end.row <= endRow - && range.start.row >= startRow - ) { - row = range.end.row; - range.collapseChildren = depth; - this.addFold("...", range); - } + FoldLine.prototype.split = function (row, column) { + var pos = this.getNextFoldTo(row, column); + if (!pos || pos.kind == "inside") + return null; + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + FoldLine.prototype.merge = function (foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); }; - - this.foldToLevel = function(level) { - this.foldAll(); - while (level-- > 0) - this.unfold(null, false); + FoldLine.prototype.toString = function () { + var ret = [this.range.toString() + ": ["]; + this.folds.forEach(function (fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); }; - - this.foldAllComments = function() { - var session = this; - this.foldAll(null, null, null, function(row) { - var tokens = session.getTokens(row); - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (token.type == "text" && /^\s+$/.test(token.value)) - continue; - if (/comment/.test(token.type)) - return true; - return false; + FoldLine.prototype.idxToPosition = function (idx) { + var lastFoldEndColumn = 0; + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; } - }); + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + lastFoldEndColumn = fold.end.column; + } + return { + row: this.end.row, + column: this.end.column + idx + }; }; - this.$foldStyles = { - "manual": 1, - "markbegin": 1, - "markbeginend": 1 - }; - this.$foldStyle = "markbegin"; - this.setFoldStyle = function(style) { - if (!this.$foldStyles[style]) - throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); - - if (this.$foldStyle == style) - return; + return FoldLine; +}()); +exports.FoldLine = FoldLine; - this.$foldStyle = style; - - if (style == "manual") - this.unfold(); - var mode = this.$foldMode; - this.$setFolding(null); - this.$setFolding(mode); - }; +}); - this.$setFolding = function(foldMode) { - if (this.$foldMode == foldMode) - return; - - this.$foldMode = foldMode; - - this.off('change', this.$updateFoldWidgets); - this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); - this._signal("changeAnnotation"); - - if (!foldMode || this.$foldStyle == "manual") { - this.foldWidgets = null; - return; +define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; +var RangeList = /** @class */ (function () { + function RangeList() { + this.ranges = []; + this.$bias = 1; + } + RangeList.prototype.pointIndex = function (pos, excludeEdges, startIndex) { + var list = this.ranges; + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i - 2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + return -i - 1; } - - this.foldWidgets = []; - this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); - this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); - - this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); - this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); - this.on('change', this.$updateFoldWidgets); - this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + return -i - 1; }; - - this.getParentFoldRangeData = function (row, ignoreCurrent) { - var fw = this.foldWidgets; - if (!fw || (ignoreCurrent && fw[row])) - return {}; - - var i = row - 1, firstRange; - while (i >= 0) { - var c = fw[i]; - if (c == null) - c = fw[i] = this.getFoldWidget(i); - - if (c == "start") { - var range = this.getFoldWidgetRange(i); - if (!firstRange) - firstRange = range; - if (range && range.end.row >= row) - break; - } - i--; - } - - return { - range: i !== -1 && range, - firstRange: firstRange - }; + RangeList.prototype.add = function (range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); }; - - this.onFoldWidgetClick = function(row, e) { - e = e.domEvent; - var options = { - children: e.shiftKey, - all: e.ctrlKey || e.metaKey, - siblings: e.altKey - }; - - var range = this.$toggleFoldWidget(row, options); - if (!range) { - var el = (e.target || e.srcElement); - if (el && /ace_fold-widget/.test(el.className)) - el.className += " ace_invalid"; + RangeList.prototype.addList = function (list) { + var removed = []; + for (var i = list.length; i--;) { + removed.push.apply(removed, this.add(list[i])); } + return removed; }; - - this.$toggleFoldWidget = function(row, options) { - if (!this.getFoldWidget) - return; - var type = this.getFoldWidget(row); - var line = this.getLine(row); - - var dir = type === "end" ? -1 : 1; - var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); - - if (fold) { - if (options.children || options.all) - this.removeFold(fold); - else - this.expandFold(fold); - return fold; - } - - var range = this.getFoldWidgetRange(row, true); - if (range && !range.isMultiLine()) { - fold = this.getFoldAt(range.start.row, range.start.column, 1); - if (fold && range.isEqual(fold.range)) { - this.removeFold(fold); - return fold; - } - } - - if (options.siblings) { - var data = this.getParentFoldRangeData(row); - if (data.range) { - var startRow = data.range.start.row + 1; - var endRow = data.range.end.row; - } - this.foldAll(startRow, endRow, options.all ? 10000 : 0); - } else if (options.children) { - endRow = range ? range.end.row : this.getLength(); - this.foldAll(row + 1, endRow, options.all ? 10000 : 0); - } else if (range) { - if (options.all) - range.collapseChildren = 10000; - this.addFold("...", range); - } - - return range; + RangeList.prototype.substractPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges.splice(i, 1); }; - - - - this.toggleFoldWidget = function(toggleParent) { - var row = this.selection.getCursor().row; - row = this.getRowFoldStart(row); - var range = this.$toggleFoldWidget(row, {}); - - if (range) - return; - var data = this.getParentFoldRangeData(row, true); - range = data.range || data.firstRange; - - if (range) { - row = range.start.row; - var fold = this.getFoldAt(row, this.getLine(row).length, 1); - - if (fold) { - this.removeFold(fold); - } else { - this.addFold("...", range); + RangeList.prototype.merge = function () { + var removed = []; + var list = this.ranges; + list = list.sort(function (a, b) { + return comparePoints(a.start, b.start); + }); + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; } + list.splice(i, 1); + removed.push(next); + next = range; + i--; } + this.ranges = list; + return removed; }; - - this.updateFoldWidgets = function(delta) { - var firstRow = delta.start.row; - var len = delta.end.row - firstRow; - - if (len === 0) { - this.foldWidgets[firstRow] = null; - } else if (delta.action == 'remove') { - this.foldWidgets.splice(firstRow, len + 1, null); - } else { - var args = Array(len + 1); - args.unshift(firstRow, 1); - this.foldWidgets.splice.apply(this.foldWidgets, args); - } + RangeList.prototype.contains = function (row, column) { + return this.pointIndex({ row: row, column: column }) >= 0; }; - this.tokenizerUpdateFoldWidgets = function(e) { - var rows = e.data; - if (rows.first != rows.last) { - if (this.foldWidgets.length > rows.first) - this.foldWidgets.splice(rows.first, this.foldWidgets.length); - } + RangeList.prototype.containsPoint = function (pos) { + return this.pointIndex(pos) >= 0; }; -} - -exports.Folding = Folding; - -}); - -define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { -"use strict"; - -var TokenIterator = require("../token_iterator").TokenIterator; -var Range = require("../range").Range; - - -function BracketMatch() { - - this.findMatchingBracket = function(position, chr) { - if (position.column == 0) return null; - - var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); - if (charBeforeCursor == "") return null; - - var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); - if (!match) - return null; - - if (match[1]) - return this.$findClosingBracket(match[1], position); - else - return this.$findOpeningBracket(match[2], position); + RangeList.prototype.rangeAtPoint = function (pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; }; - - this.getBracketRange = function(pos) { - var line = this.getLine(pos.row); - var before = true, range; - - var chr = line.charAt(pos.column - 1); - var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - chr = line.charAt(pos.column); - pos = {row: pos.row, column: pos.column + 1}; - match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - before = false; + RangeList.prototype.clipRows = function (startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + var startIndex = this.pointIndex({ row: startRow, column: 0 }); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({ row: endRow, column: 0 }, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); } - if (!match) - return null; - - if (match[1]) { - var bracketPos = this.$findClosingBracket(match[1], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(pos, bracketPos); - if (!before) { - range.end.column++; - range.start.column--; - } - range.cursor = range.end; - } else { - var bracketPos = this.$findOpeningBracket(match[2], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(bracketPos, pos); - if (!before) { - range.start.column++; - range.end.column--; - } - range.cursor = range.start; - } - - return range; + return clipped; }; - this.getMatchingBracketRanges = function(pos) { - var line = this.getLine(pos.row); - - var chr = line.charAt(pos.column - 1); - var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - chr = line.charAt(pos.column); - pos = {row: pos.row, column: pos.column + 1}; - match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - } - - if (!match) - return null; - - var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); - var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) - : this.$findOpeningBracket(match[2], pos); - if (!bracketPos) - return [startRange]; - var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); - - return [startRange, endRange]; + RangeList.prototype.removeAll = function () { + return this.ranges.splice(0, this.ranges.length); }; - - this.$brackets = { - ")": "(", - "(": ")", - "]": "[", - "[": "]", - "{": "}", - "}": "{", - "<": ">", - ">": "<" + RangeList.prototype.attach = function (session) { + if (this.session) + this.detach(); + this.session = session; + this.onChange = this.$onChange.bind(this); + this.session.on('change', this.onChange); }; - - this.$findOpeningBracket = function(bracket, position, typeRe) { - var openBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) + RangeList.prototype.detach = function () { + if (!this.session) return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("rparen", ".paren") - .replace(/\b(?:end)\b/, "(?:start|begin|end)") - + ")+" - ); + this.session.removeListener('change', this.onChange); + this.session = null; + }; + RangeList.prototype.$onChange = function (delta) { + var start = delta.start; + var end = delta.end; + var startRow = start.row; + var endRow = end.row; + var ranges = this.ranges; + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row >= startRow) + break; } - var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; - var value = token.value; - - while (true) { - - while (valueIndex >= 0) { - var chr = value.charAt(valueIndex); - if (chr == openBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; + if (delta.action == "insert") { + var lineDif = endRow - startRow; + var colDiff = -start.column + end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > startRow) + break; + if (r.start.row == startRow && r.start.column >= start.column) { + if (r.start.column == start.column && this.$bias <= 0) { + } + else { + r.start.column += colDiff; + r.start.row += lineDif; } } - else if (chr == bracket) { - depth += 1; + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$bias < 0) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i + 1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; } - valueIndex -= 1; } - do { - token = iterator.stepBackward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - value = token.value; - valueIndex = value.length - 1; - } - - return null; - }; - - this.$findClosingBracket = function(bracket, position, typeRe) { - var closingBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) - return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("lparen", ".paren") - .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") - + ")+" - ); } - var valueIndex = position.column - iterator.getCurrentTokenColumn(); - - while (true) { - - var value = token.value; - var valueLength = value.length; - while (valueIndex < valueLength) { - var chr = value.charAt(valueIndex); - if (chr == closingBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; + else { + var lineDif = startRow - endRow; + var colDiff = start.column - end.column; + for (; i < n; i++) { + var r = ranges[i]; + if (r.start.row > endRow) + break; + if (r.end.row < endRow + && (startRow < r.end.row + || startRow == r.end.row && start.column < r.end.column)) { + r.end.row = startRow; + r.end.column = start.column; + } + else if (r.end.row == endRow) { + if (r.end.column <= end.column) { + if (lineDif || r.end.column > start.column) { + r.end.column = start.column; + r.end.row = start.row; + } + } + else { + r.end.column += colDiff; + r.end.row += lineDif; } } - else if (chr == bracket) { - depth += 1; + else if (r.end.row > endRow) { + r.end.row += lineDif; + } + if (r.start.row < endRow + && (startRow < r.start.row + || startRow == r.start.row && start.column < r.start.column)) { + r.start.row = startRow; + r.start.column = start.column; + } + else if (r.start.row == endRow) { + if (r.start.column <= end.column) { + if (lineDif || r.start.column > start.column) { + r.start.column = start.column; + r.start.row = start.row; + } + } + else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + else if (r.start.row > endRow) { + r.start.row += lineDif; } - valueIndex += 1; } - do { - token = iterator.stepForward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - valueIndex = 0; } - - return null; + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } }; -} -exports.BracketMatch = BracketMatch; + return RangeList; +}()); +RangeList.prototype.comparePoints = comparePoints; +exports.RangeList = RangeList; }); -define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); -var lang = require("./lib/lang"); -var BidiHandler = require("./bidihandler").BidiHandler; -var config = require("./config"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Selection = require("./selection").Selection; -var TextMode = require("./mode/text").Mode; -var Range = require("./range").Range; -var Document = require("./document").Document; -var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; -var SearchHighlight = require("./search_highlight").SearchHighlight; - -var EditSession = function(text, mode) { - this.$breakpoints = []; - this.$decorations = []; - this.$frontMarkers = {}; - this.$backMarkers = {}; - this.$markerId = 1; - this.$undoSelect = true; - - this.$foldData = []; - this.id = "session" + (++EditSession.$uid); - this.$foldData.toString = function() { - return this.join("\n"); +define("ace/edit_session/fold",["require","exports","module","ace/range_list"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; - this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); - - var _self = this; - this.bgTokenizer.on("update", function(e) { - _self._signal("tokenizerUpdate", e); - }); - - this.on("changeFold", this.onChangeFold.bind(this)); - this.$onChange = this.onChange.bind(this); - - if (typeof text != "object" || !text.getLine) - text = new Document(text); - - this.setDocument(text); - this.selection = new Selection(this); - this.$bidiHandler = new BidiHandler(this); - - config.resetOptions(this); - this.setMode(mode); - config._signal("session", this); - - this.destroyed = false; -}; - - -EditSession.$uid = 0; - -(function() { - - oop.implement(this, EventEmitter); - this.setDocument = function(doc) { - if (this.doc) - this.doc.off("change", this.$onChange); - - this.doc = doc; - doc.on("change", this.$onChange, true); - - this.bgTokenizer.setDocument(this.getDocument()); - - this.resetCaches(); +})(); +var RangeList = require("../range_list").RangeList; +var Fold = /** @class */ (function (_super) { + __extends(Fold, _super); + function Fold(range, placeholder) { + var _this = _super.call(this) || this; + _this.foldLine = null; + _this.placeholder = placeholder; + _this.range = range; + _this.start = range.start; + _this.end = range.end; + _this.sameRow = range.start.row == range.end.row; + _this.subFolds = _this.ranges = []; + return _this; + } + Fold.prototype.toString = function () { + return '"' + this.placeholder + '" ' + this.range.toString(); }; - this.getDocument = function() { - return this.doc; + Fold.prototype.setFoldLine = function (foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function (fold) { + fold.setFoldLine(foldLine); + }); }; - this.$resetRowCache = function(docRow) { - if (!docRow) { - this.$docRowCache = []; - this.$screenRowCache = []; + Fold.prototype.clone = function () { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function (subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + Fold.prototype.addSubFold = function (fold) { + if (this.range.isEqual(fold)) return; + consumeRange(fold, this.start); + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; } - var l = this.$docRowCache.length; - var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; - if (l > i) { - this.$docRowCache.splice(i, l); - this.$screenRowCache.splice(i, l); - } - }; - - this.$getRowCacheIndex = function(cacheArray, val) { - var low = 0; - var hi = cacheArray.length - 1; - - while (low <= hi) { - var mid = (low + hi) >> 1; - var c = cacheArray[mid]; - - if (val > c) - low = mid + 1; - else if (val < c) - hi = mid - 1; + var afterStart = this.subFolds[i]; + var firstConsumed = 0; + if (cmp == 0) { + if (afterStart.range.containsRange(fold)) + return afterStart.addSubFold(fold); else - return mid; + firstConsumed = 1; } - - return low -1; - }; - - this.resetCaches = function() { - this.$modified = true; - this.$wrapData = []; - this.$rowLengthCache = []; - this.$resetRowCache(0); - if (!this.destroyed) - this.bgTokenizer.start(0); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + if (cmp == 0) + j++; + var consumedFolds = this.subFolds.splice(i, j - i, fold); + var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length; + for (var k = firstConsumed; k < last; k++) { + fold.addSubFold(consumedFolds[k]); + } + fold.setFoldLine(this.foldLine); + return fold; }; - - this.onChangeFold = function(e) { - var fold = e.data; - this.$resetRowCache(fold.start.row); + Fold.prototype.restoreRange = function (range) { + return restoreRange(range, this.start); }; + return Fold; +}(RangeList)); +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} +exports.Fold = Fold; - this.onChange = function(delta) { - this.$modified = true; - this.$bidiHandler.onChange(delta); - this.$resetRowCache(delta.start.row); +}); - var removedFolds = this.$updateInternalDataOnChange(delta); - if (!this.$fromUndo && this.$undoManager) { - if (removedFolds && removedFolds.length) { - this.$undoManager.add({ - action: "removeFolds", - folds: removedFolds - }, this.mergeUndoDeltas); - this.mergeUndoDeltas = true; +define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator","ace/mouse/mouse_event"], function(require, exports, module){// @ts-nocheck +"use strict"; +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; +var MouseEvent = require("../mouse/mouse_event").MouseEvent; +function Folding() { + this.getFoldAt = function (row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var range = folds[i].range; + if (range.contains(row, column)) { + if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) { + continue; + } + else if (side == -1 && range.isStart(row, column) && !range.isEmpty()) { + continue; + } + return folds[i]; } - this.$undoManager.add(delta, this.mergeUndoDeltas); - this.mergeUndoDeltas = true; - - this.$informUndoManager.schedule(); } - - this.bgTokenizer.$updateOnChange(delta); - this._signal("change", delta); - }; - this.setValue = function(text) { - this.doc.setValue(text); - this.selection.moveTo(0, 0); - - this.$resetRowCache(0); - this.setUndoManager(this.$undoManager); - this.getUndoManager().reset(); - }; - this.getValue = - this.toString = function() { - return this.doc.getValue(); - }; - this.getSelection = function() { - return this.selection; - }; - this.getState = function(row) { - return this.bgTokenizer.getState(row); - }; - this.getTokens = function(row) { - return this.bgTokenizer.getTokens(row); }; - this.getTokenAt = function(row, column) { - var tokens = this.bgTokenizer.getTokens(row); - var token, c = 0; - if (column == null) { - var i = tokens.length - 1; - c = this.getLine(row).length; - } else { - for (var i = 0; i < tokens.length; i++) { - c += tokens[i].value.length; - if (c >= column) + this.getFoldsInRange = function (range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + start.column += 1; + end.column -= 1; + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } + else if (cmp == 2) { + continue; + } + else + if (cmp == 42) { break; + } + foundFolds.push(fold); } } - token = tokens[i]; - if (!token) - return null; - token.index = i; - token.start = c - token.value.length; - return token; + start.column -= 1; + end.column += 1; + return foundFolds; }; - this.setUndoManager = function(undoManager) { - this.$undoManager = undoManager; - - if (this.$informUndoManager) - this.$informUndoManager.cancel(); - - if (undoManager) { - var self = this; - undoManager.addSession(this); - this.$syncInformUndoManager = function() { - self.$informUndoManager.cancel(); - self.mergeUndoDeltas = false; - }; - this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); - } else { - this.$syncInformUndoManager = function() {}; + this.getFoldsInRangeList = function (ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function (range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); } - }; - this.markUndoGroup = function() { - if (this.$syncInformUndoManager) - this.$syncInformUndoManager(); - }; - - this.$defaultUndoManager = { - undo: function() {}, - redo: function() {}, - hasUndo: function() {}, - hasRedo: function() {}, - reset: function() {}, - add: function() {}, - addSelection: function() {}, - startNewGroup: function() {}, - addSession: function() {} - }; - this.getUndoManager = function() { - return this.$undoManager || this.$defaultUndoManager; - }; - this.getTabString = function() { - if (this.getUseSoftTabs()) { - return lang.stringRepeat(" ", this.getTabSize()); - } else { - return "\t"; + else { + var folds = this.getFoldsInRange(ranges); } + return folds; }; - this.setUseSoftTabs = function(val) { - this.setOption("useSoftTabs", val); - }; - this.getUseSoftTabs = function() { - return this.$useSoftTabs && !this.$mode.$indentWithTabs; - }; - this.setTabSize = function(tabSize) { - this.setOption("tabSize", tabSize); - }; - this.getTabSize = function() { - return this.$tabSize; - }; - this.isTabStop = function(position) { - return this.$useSoftTabs && (position.column % this.$tabSize === 0); + this.getAllFolds = function () { + var folds = []; + var foldLines = this.$foldData; + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + return folds; }; - this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { - this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + this.getFoldStringAt = function (row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; }; - this.getNavigateWithinSoftTabs = function() { - return this.$navigateWithinSoftTabs; - }; - - this.$overwrite = false; - this.setOverwrite = function(overwrite) { - this.setOption("overwrite", overwrite); - }; - this.getOverwrite = function() { - return this.$overwrite; - }; - this.toggleOverwrite = function() { - this.setOverwrite(!this.$overwrite); - }; - this.addGutterDecoration = function(row, className) { - if (!this.$decorations[row]) - this.$decorations[row] = ""; - this.$decorations[row] += " " + className; - this._signal("changeBreakpoint", {}); - }; - this.removeGutterDecoration = function(row, className) { - this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); - this._signal("changeBreakpoint", {}); + this.getFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } + else if (foldLine.end.row > docRow) { + return null; + } + } + return null; }; - this.getBreakpoints = function() { - return this.$breakpoints; + this.getNextFoldLine = function (docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; }; - this.setBreakpoints = function(rows) { - this.$breakpoints = []; - for (var i=0; i= last) { + if (start < last) { + if (start >= first) + rowCount -= last - start; + else + rowCount = 0; // in one fold + } + break; + } + else if (end >= first) { + if (start >= first) // fold inside range + rowCount -= end - start; + else + rowCount -= end - first + 1; + } } - this._signal("changeBreakpoint", {}); + return rowCount; }; - this.clearBreakpoints = function() { - this.$breakpoints = []; - this._signal("changeBreakpoint", {}); + this.$addFoldLine = function (foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function (a, b) { + return a.start.row - b.start.row; + }); + return foldLine; }; - this.setBreakpoint = function(row, className) { - if (className === undefined) - className = "ace_breakpoint"; - if (className) - this.$breakpoints[row] = className; + this.addFold = function (placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + if (!fold.collapseChildren) { + folds.forEach(function (subFold) { + fold.addSubFold(subFold); + }); + } + } + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } + else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } + else if (endRow <= foldLine.start.row) { + break; + } + } + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); else - delete this.$breakpoints[row]; - this._signal("changeBreakpoint", {}); + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + return fold; }; - this.clearBreakpoint = function(row) { - delete this.$breakpoints[row]; - this._signal("changeBreakpoint", {}); + this.addFolds = function (folds) { + folds.forEach(function (fold) { + this.addFold(fold); + }, this); }; - this.addMarker = function(range, clazz, type, inFront) { - var id = this.$markerId++; - - var marker = { - range : range, - type : type || "line", - renderer: typeof type == "function" ? type : null, - clazz : clazz, - inFront: !!inFront, - id: id - }; - - if (inFront) { - this.$frontMarkers[id] = marker; - this._signal("changeFrontMarker"); - } else { - this.$backMarkers[id] = marker; - this._signal("changeBackMarker"); + this.removeFold = function (fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); } - - return id; - }; - this.addDynamicMarker = function(marker, inFront) { - if (!marker.update) - return; - var id = this.$markerId++; - marker.id = id; - marker.inFront = !!inFront; - - if (inFront) { - this.$frontMarkers[id] = marker; - this._signal("changeFrontMarker"); - } else { - this.$backMarkers[id] = marker; - this._signal("changeBackMarker"); + else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; } - - return marker; - }; - this.removeMarker = function(markerId) { - var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId]; - if (!marker) - return; - - var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers; - delete (markers[markerId]); - this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"); - }; - this.getMarkers = function(inFront) { - return inFront ? this.$frontMarkers : this.$backMarkers; - }; - - this.highlight = function(re) { - if (!this.$searchHighlight) { - var highlight = new SearchHighlight(null, "ace_selected-word", "text"); - this.$searchHighlight = this.addDynamicMarker(highlight); + else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; } - this.$searchHighlight.setRegexp(re); - }; - this.highlightLines = function(startRow, endRow, clazz, inFront) { - if (typeof endRow != "number") { - clazz = endRow; - endRow = startRow; + else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); } - if (!clazz) - clazz = "ace_step"; - - var range = new Range(startRow, 0, endRow, Infinity); - range.id = this.addMarker(range, clazz, "fullLine", inFront); - return range; + else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); }; - this.setAnnotations = function(annotations) { - this.$annotations = annotations; - this._signal("changeAnnotation", {}); + this.removeFolds = function (folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + cloneFolds.forEach(function (fold) { + this.removeFold(fold); + }, this); + this.$modified = true; }; - this.getAnnotations = function() { - return this.$annotations || []; + this.expandFold = function (fold) { + this.removeFold(fold); + fold.subFolds.forEach(function (subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row + 1, fold.end.row, fold.collapseChildren - 1); + } + fold.subFolds = []; }; - this.clearAnnotations = function() { - this.setAnnotations([]); + this.expandFolds = function (folds) { + folds.forEach(function (fold) { + this.expandFold(fold); + }, this); }; - this.$detectNewLine = function(text) { - var match = text.match(/^.*?(\r?\n)/m); - if (match) { - this.$autoNewLine = match[1]; - } else { - this.$autoNewLine = "\n"; + this.unfold = function (location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + if (expandInner == null) + expandInner = true; } - }; - this.getWordRange = function(row, column) { - var line = this.getLine(row); - - var inToken = false; - if (column > 0) - inToken = !!line.charAt(column - 1).match(this.tokenRe); - - if (!inToken) - inToken = !!line.charAt(column).match(this.tokenRe); - - if (inToken) - var re = this.tokenRe; - else if (/^\s+$/.test(line.slice(column-1, column+1))) - var re = /\s/; - else - var re = this.nonTokenRe; - - var start = column; - if (start > 0) { - do { - start--; - } - while (start >= 0 && line.charAt(start).match(re)); - start++; - } - - var end = column; - while (end < line.length && line.charAt(end).match(re)) { - end++; - } - - return new Range(row, start, row, end); - }; - this.getAWordRange = function(row, column) { - var wordRange = this.getWordRange(row, column); - var line = this.getLine(wordRange.end.row); - - while (line.charAt(wordRange.end.column).match(/[ \t]/)) { - wordRange.end.column += 1; + else if (typeof location == "number") { + range = new Range(location, 0, location, this.getLine(location).length); } - return wordRange; - }; - this.setNewLineMode = function(newLineMode) { - this.doc.setNewLineMode(newLineMode); - }; - this.getNewLineMode = function() { - return this.doc.getNewLineMode(); - }; - this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; - this.getUseWorker = function() { return this.$useWorker; }; - this.onReloadTokenizer = function(e) { - var rows = e.data; - this.bgTokenizer.start(rows.first); - this._signal("tokenizerUpdate", e); - }; - - this.$modes = config.$modes; - this.$mode = null; - this.$modeId = null; - this.setMode = function(mode, cb) { - if (mode && typeof mode === "object") { - if (mode.getTokenizer) - return this.$onChangeMode(mode); - var options = mode; - var path = options.path; - } else { - path = mode || "ace/mode/text"; + else if ("row" in location) { + range = Range.fromPoints(location, location); } - if (!this.$modes["ace/mode/text"]) - this.$modes["ace/mode/text"] = new TextMode(); - - if (this.$modes[path] && !options) { - this.$onChangeMode(this.$modes[path]); - cb && cb(); - return; + else if (Array.isArray(location)) { + folds = []; + location.forEach(function (range) { + folds = folds.concat(this.unfold(range)); + }, this); + return folds; } - this.$modeId = path; - config.loadModule(["mode", path], function(m) { - if (this.$modeId !== path) - return cb && cb(); - if (this.$modes[path] && !options) { - this.$onChangeMode(this.$modes[path]); - } else if (m && m.Mode) { - m = new m.Mode(options); - if (!options) { - this.$modes[path] = m; - m.$id = path; - } - this.$onChangeMode(m); - } - cb && cb(); - }.bind(this)); - if (!this.$mode) - this.$onChangeMode(this.$modes["ace/mode/text"], true); - }; - - this.$onChangeMode = function(mode, $isPlaceholder) { - if (!$isPlaceholder) - this.$modeId = mode.$id; - if (this.$mode === mode) - return; - - var oldMode = this.$mode; - this.$mode = mode; - - this.$stopWorker(); - - if (this.$useWorker) - this.$startWorker(); - - var tokenizer = mode.getTokenizer(); - - if(tokenizer.on !== undefined) { - var onReloadTokenizer = this.onReloadTokenizer.bind(this); - tokenizer.on("update", onReloadTokenizer); + else { + range = location; } - - this.bgTokenizer.setTokenizer(tokenizer); - this.bgTokenizer.setDocument(this.getDocument()); - - this.tokenRe = mode.tokenRe; - this.nonTokenRe = mode.nonTokenRe; - - - if (!$isPlaceholder) { - if (mode.attachToSession) - mode.attachToSession(this); - this.$options.wrapMethod.set.call(this, this.$wrapMethod); - this.$setFolding(mode.foldingRules); - this.bgTokenizer.start(0); - this._emit("changeMode", {oldMode: oldMode, mode: mode}); + folds = this.getFoldsInRangeList(range); + var outermostFolds = folds; + while (folds.length == 1 + && Range.comparePoints(folds[0].start, range.start) < 0 + && Range.comparePoints(folds[0].end, range.end) > 0) { + this.expandFolds(folds); + folds = this.getFoldsInRangeList(range); } - }; - - this.$stopWorker = function() { - if (this.$worker) { - this.$worker.terminate(); - this.$worker = null; + if (expandInner != false) { + this.removeFolds(folds); } - }; - - this.$startWorker = function() { - try { - this.$worker = this.$mode.createWorker(this); - } catch (e) { - config.warn("Could not load worker", e); - this.$worker = null; + else { + this.expandFolds(folds); } + if (outermostFolds.length) + return outermostFolds; }; - this.getMode = function() { - return this.$mode; - }; - - this.$scrollTop = 0; - this.setScrollTop = function(scrollTop) { - if (this.$scrollTop === scrollTop || isNaN(scrollTop)) - return; - - this.$scrollTop = scrollTop; - this._signal("changeScrollTop", scrollTop); + this.isRowFolded = function (docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); }; - this.getScrollTop = function() { - return this.$scrollTop; + this.getRowFoldEnd = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; }; - - this.$scrollLeft = 0; - this.setScrollLeft = function(scrollLeft) { - if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) - return; - - this.$scrollLeft = scrollLeft; - this._signal("changeScrollLeft", scrollLeft); + this.getRowFoldStart = function (docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; }; - this.getScrollLeft = function() { - return this.$scrollLeft; + this.getFoldDisplayLine = function (foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + foldLine.walk(function (placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + if (placeholder != null) { + textLine += placeholder; + } + else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; }; - this.getScreenWidth = function() { - this.$computeWidth(); - if (this.lineWidgets) - return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); - return this.screenWidth; + this.getDisplayLine = function (row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } + else { + return this.getFoldDisplayLine(foldLine, row, endColumn, startRow, startColumn); + } }; - - this.getLineWidgetMaxWidth = function() { - if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth; - var width = 0; - this.lineWidgets.forEach(function(w) { - if (w && w.screenWidth > width) - width = w.screenWidth; + this.$cloneFoldData = function () { + var fd = []; + fd = this.$foldData.map(function (foldLine) { + var folds = foldLine.folds.map(function (fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); }); - return this.lineWidgetWidth = width; + return fd; }; - - this.$computeWidth = function(force) { - if (this.$modified || force) { - this.$modified = false; - - if (this.$useWrapMode) - return this.screenWidth = this.$wrapLimit; - - var lines = this.doc.getAllLines(); - var cache = this.$rowLengthCache; - var longestScreenLine = 0; - var foldIndex = 0; - var foldLine = this.$foldData[foldIndex]; - var foldStart = foldLine ? foldLine.start.row : Infinity; - var len = lines.length; - - for (var i = 0; i < len; i++) { - if (i > foldStart) { - i = foldLine.end.row + 1; - if (i >= len) - break; - foldLine = this.$foldData[foldIndex++]; - foldStart = foldLine ? foldLine.start.row : Infinity; + this.toggleFold = function (tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + if (fold) { + this.expandFold(fold); + return; + } + else if (tryToUnfold) { + var foldLine = this.getFoldLine(cursor.row); + if (foldLine) + this.expandFolds(foldLine.folds); + return; + } + else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } + else { + range.start = bracketPos; + range.start.column++; + range.end.column--; } - - if (cache[i] == null) - cache[i] = this.$getStringScreenWidth(lines[i])[0]; - - if (cache[i] > longestScreenLine) - longestScreenLine = cache[i]; } - this.screenWidth = longestScreenLine; - } - }; - this.getLine = function(row) { - return this.doc.getLine(row); - }; - this.getLines = function(firstRow, lastRow) { - return this.doc.getLines(firstRow, lastRow); - }; - this.getLength = function() { - return this.doc.getLength(); - }; - this.getTextRange = function(range) { - return this.doc.getTextRange(range || this.selection.getRange()); - }; - this.insert = function(position, text) { - return this.doc.insert(position, text); - }; - this.remove = function(range) { - return this.doc.remove(range); - }; - this.removeFullLines = function(firstRow, lastRow){ - return this.doc.removeFullLines(firstRow, lastRow); - }; - this.undoChanges = function(deltas, dontSelect) { - if (!deltas.length) - return; - - this.$fromUndo = true; - for (var i = deltas.length - 1; i != -1; i--) { - var delta = deltas[i]; - if (delta.action == "insert" || delta.action == "remove") { - this.doc.revertDelta(delta); - } else if (delta.folds) { - this.addFolds(delta.folds); + else if (bracketPos = this.findMatchingBracket({ row: cursor.row, column: cursor.column + 1 })) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + range.start.column++; + } + else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; } } - if (!dontSelect && this.$undoSelect) { - if (deltas.selectionBefore) - this.selection.fromJSON(deltas.selectionBefore); - else - this.selection.setRange(this.$getUndoSelection(deltas, true)); + else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } + else if (folds.length == 1) { + fold = folds[0]; + } } - this.$fromUndo = false; - }; - this.redoChanges = function(deltas, dontSelect) { - if (!deltas.length) + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); return; - - this.$fromUndo = true; - for (var i = 0; i < deltas.length; i++) { - var delta = deltas[i]; - if (delta.action == "insert" || delta.action == "remove") { - this.doc.$safeApplyDelta(delta); - } } - - if (!dontSelect && this.$undoSelect) { - if (deltas.selectionAfter) - this.selection.fromJSON(deltas.selectionAfter); - else - this.selection.setRange(this.$getUndoSelection(deltas, false)); + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; } - this.$fromUndo = false; - }; - this.setUndoSelect = function(enable) { - this.$undoSelect = enable; + this.addFold(placeholder, range); }; - - this.$getUndoSelection = function(deltas, isUndo) { - function isInsert(delta) { - return isUndo ? delta.action !== "insert" : delta.action === "insert"; - } - - var range, point; - - for (var i = 0; i < deltas.length; i++) { - var delta = deltas[i]; - if (!delta.start) continue; // skip folds - if (!range) { - if (isInsert(delta)) { - range = Range.fromPoints(delta.start, delta.end); - } else { - range = Range.fromPoints(delta.start, delta.start); - } - continue; + this.getCommentFoldRange = function (row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + var type = token && token.type; + if (token && /^comment|string/.test(type)) { + type = type.match(/comment|string/)[0]; + if (type == "comment") + type += "|doc-start|\\.doc"; + var re = new RegExp(type); + var range = new Range(); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + token = iterator.stepForward(); } - - if (isInsert(delta)) { - point = delta.start; - if (range.compare(point.row, point.column) == -1) { - range.setStart(point); - } - point = delta.end; - if (range.compare(point.row, point.column) == 1) { - range.setEnd(point); - } - } else { - point = delta.start; - if (range.compare(point.row, point.column) == -1) { - range = Range.fromPoints(delta.start, delta.start); - } + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + token.value.length; + iterator = new TokenIterator(this, row, column); + var initState = this.getState(iterator.$row); + if (dir != -1) { + var lastRow = -1; + do { + token = iterator.stepForward(); + if (lastRow == -1) { + var state = this.getState(iterator.$row); + if (initState.toString() !== state.toString()) + lastRow = iterator.$row; + } + else if (iterator.$row > lastRow) { + break; + } + } while (token && re.test(token.type)); + token = iterator.stepBackward(); } + else + token = iterator.getCurrentToken(); + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn(); + if (range.start.row == range.end.row && range.start.column > range.end.column) + return; + return range; } - return range; }; - this.replace = function(range, text) { - return this.doc.replace(range, text); - }; - this.moveText = function(fromRange, toPosition, copy) { - var text = this.getTextRange(fromRange); - var folds = this.getFoldsInRange(fromRange); - - var toRange = Range.fromPoints(toPosition, toPosition); - if (!copy) { - this.remove(fromRange); - var rowDiff = fromRange.start.row - fromRange.end.row; - var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; - if (collDiff) { - if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) - toRange.start.column += collDiff; - if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) - toRange.end.column += collDiff; - } - if (rowDiff && toRange.start.row >= fromRange.end.row) { - toRange.start.row += rowDiff; - toRange.end.row += rowDiff; + this.foldAll = function (startRow, endRow, depth, test) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + if (test && !test(row)) + continue; + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow) { + row = range.end.row; + range.collapseChildren = depth; + this.addFold("...", range); } } - - toRange.end = this.insert(toRange.start, text); - if (folds.length) { - var oldStart = fromRange.start; - var newStart = toRange.start; - var rowDiff = newStart.row - oldStart.row; - var collDiff = newStart.column - oldStart.column; - this.addFolds(folds.map(function(x) { - x = x.clone(); - if (x.start.row == oldStart.row) - x.start.column += collDiff; - if (x.end.row == oldStart.row) - x.end.column += collDiff; - x.start.row += rowDiff; - x.end.row += rowDiff; - return x; - })); - } - - return toRange; }; - this.indentRows = function(startRow, endRow, indentString) { - indentString = indentString.replace(/\t/g, this.getTabString()); - for (var row=startRow; row<=endRow; row++) - this.doc.insertInLine({row: row, column: 0}, indentString); + this.foldToLevel = function (level) { + this.foldAll(); + while (level-- > 0) + this.unfold(null, false); }; - this.outdentRows = function (range) { - var rowRange = range.collapseRows(); - var deleteRange = new Range(0, 0, 0, 0); - var size = this.getTabSize(); - - for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { - var line = this.getLine(i); - - deleteRange.start.row = i; - deleteRange.end.row = i; - for (var j = 0; j < size; ++j) - if (line.charAt(j) != ' ') - break; - if (j < size && line.charAt(j) == '\t') { - deleteRange.start.column = j; - deleteRange.end.column = j + 1; - } else { - deleteRange.start.column = 0; - deleteRange.end.column = j; + this.foldAllComments = function () { + var session = this; + this.foldAll(null, null, null, function (row) { + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token.type == "text" && /^\s+$/.test(token.value)) + continue; + if (/comment/.test(token.type)) + return true; + return false; } - this.remove(deleteRange); - } - }; - - this.$moveLines = function(firstRow, lastRow, dir) { - firstRow = this.getRowFoldStart(firstRow); - lastRow = this.getRowFoldEnd(lastRow); - if (dir < 0) { - var row = this.getRowFoldStart(firstRow + dir); - if (row < 0) return 0; - var diff = row-firstRow; - } else if (dir > 0) { - var row = this.getRowFoldEnd(lastRow + dir); - if (row > this.doc.getLength()-1) return 0; - var diff = row-lastRow; - } else { - firstRow = this.$clipRowToDocument(firstRow); - lastRow = this.$clipRowToDocument(lastRow); - var diff = lastRow - firstRow + 1; - } - - var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); - var folds = this.getFoldsInRange(range).map(function(x){ - x = x.clone(); - x.start.row += diff; - x.end.row += diff; - return x; }); - - var lines = dir == 0 - ? this.doc.getLines(firstRow, lastRow) - : this.doc.removeFullLines(firstRow, lastRow); - this.doc.insertFullLines(firstRow+diff, lines); - folds.length && this.addFolds(folds); - return diff; - }; - this.moveLinesUp = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, -1); - }; - this.moveLinesDown = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, 1); }; - this.duplicateLines = function(firstRow, lastRow) { - return this.$moveLines(firstRow, lastRow, 0); - }; - - - this.$clipRowToDocument = function(row) { - return Math.max(0, Math.min(row, this.doc.getLength()-1)); + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 }; - - this.$clipColumnToRow = function(row, column) { - if (column < 0) - return 0; - return Math.min(this.doc.getLine(row).length, column); + this.$foldStyle = "markbegin"; + this.setFoldStyle = function (style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + if (this.$foldStyle == style) + return; + this.$foldStyle = style; + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); }; - - - this.$clipPositionToDocument = function(row, column) { - column = Math.max(0, column); - - if (row < 0) { - row = 0; - column = 0; - } else { - var len = this.doc.getLength(); - if (row >= len) { - row = len - 1; - column = this.doc.getLine(len-1).length; - } else { - column = Math.min(this.doc.getLine(row).length, column); + this.$setFolding = function (foldMode) { + if (this.$foldMode == foldMode) + return; + this.$foldMode = foldMode; + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; } + i--; } - return { - row: row, - column: column + range: i !== -1 && range, + firstRange: firstRange }; }; - - this.$clipRangeToDocument = function(range) { - if (range.start.row < 0) { - range.start.row = 0; - range.start.column = 0; - } else { - range.start.column = this.$clipColumnToRow( - range.start.row, - range.start.column - ); + this.onFoldWidgetClick = function (row, e) { + if (e instanceof MouseEvent) + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; } - - var len = this.doc.getLength() - 1; - if (range.end.row > len) { - range.end.row = len; - range.end.column = this.doc.getLine(len).length; - } else { - range.end.column = this.$clipColumnToRow( - range.end.row, - range.end.column - ); + }; + this.$toggleFoldWidget = function (row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } + else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } + else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); } return range; }; - this.$wrapLimit = 80; - this.$useWrapMode = false; - this.$wrapLimitRange = { - min : null, - max : null - }; - this.setUseWrapMode = function(useWrapMode) { - if (useWrapMode != this.$useWrapMode) { - this.$useWrapMode = useWrapMode; - this.$modified = true; - this.$resetRowCache(0); - if (useWrapMode) { - var len = this.getLength(); - this.$wrapData = Array(len); - this.$updateWrapData(0, len - 1); + this.toggleFoldWidget = function (toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + if (fold) { + this.removeFold(fold); + } + else { + this.addFold("...", range); } - - this._signal("changeWrapMode"); } }; - this.getUseWrapMode = function() { - return this.$useWrapMode; - }; - this.setWrapLimitRange = function(min, max) { - if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { - this.$wrapLimitRange = { min: min, max: max }; - this.$modified = true; - this.$bidiHandler.markAsDirty(); - if (this.$useWrapMode) - this._signal("changeWrapMode"); + this.updateFoldWidgets = function (delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + this.foldWidgets[firstRow] = null; + } + else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } + else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); } }; - this.adjustWrapLimit = function(desiredLimit, $printMargin) { - var limits = this.$wrapLimitRange; - if (limits.max < 0) - limits = {min: $printMargin, max: $printMargin}; - var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); - if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { - this.$wrapLimit = wrapLimit; - this.$modified = true; - if (this.$useWrapMode) { - this.$updateWrapData(0, this.getLength() - 1); - this.$resetRowCache(0); - this._signal("changeWrapLimit"); - } - return true; + this.tokenizerUpdateFoldWidgets = function (e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); } - return false; }; +} +exports.Folding = Folding; - this.$constrainWrapLimit = function(wrapLimit, min, max) { - if (min) - wrapLimit = Math.max(min, wrapLimit); - - if (max) - wrapLimit = Math.min(max, wrapLimit); +}); - return wrapLimit; +define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module){"use strict"; +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; +function BracketMatch() { + this.findMatchingBracket = function (position, chr) { + if (position.column == 0) + return null; + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column - 1); + if (charBeforeCursor == "") + return null; + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); }; - this.getWrapLimit = function() { - return this.$wrapLimit; + this.getBracketRange = function (pos) { + var line = this.getLine(pos.row); + var before = true, range; + var chr = line.charAt(pos.column - 1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = { row: pos.row, column: pos.column + 1 }; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } + else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + return range; }; - this.setWrapLimit = function (limit) { - this.setWrapLimitRange(limit, limit); + this.getMatchingBracketRanges = function (pos, isBackwards) { + var line = this.getLine(pos.row); + var bracketsRegExp = /([\(\[\{])|([\)\]\}])/; + var chr = !isBackwards && line.charAt(pos.column - 1); + var match = chr && chr.match(bracketsRegExp); + if (!match) { + chr = (isBackwards === undefined || isBackwards) && line.charAt(pos.column); + pos = { + row: pos.row, + column: pos.column + 1 + }; + match = chr && chr.match(bracketsRegExp); + } + if (!match) + return null; + var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column); + var bracketPos = match[1] ? this.$findClosingBracket(match[1], pos) + : this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return [startRange]; + var endRange = new Range(bracketPos.row, bracketPos.column, bracketPos.row, bracketPos.column + 1); + return [startRange, endRange]; }; - this.getWrapLimitRange = function() { - return { - min : this.$wrapLimitRange.min, - max : this.$wrapLimitRange.max - }; + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{", + "<": ">", + ">": "<" }; - - this.$updateInternalDataOnChange = function(delta) { - var useWrapMode = this.$useWrapMode; - var action = delta.action; - var start = delta.start; - var end = delta.end; - var firstRow = start.row; - var lastRow = end.row; - var len = lastRow - firstRow; - var removedFolds = null; - - this.$updating = true; - if (len != 0) { - if (action === "remove") { - this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); - - var foldLines = this.$foldData; - removedFolds = this.getFoldsInRange(delta); - this.removeFolds(removedFolds); - - var foldLine = this.getFoldLine(end.row); - var idx = 0; - if (foldLine) { - foldLine.addRemoveChars(end.row, end.column, start.column - end.column); - foldLine.shiftRow(-len); - - var foldLineBefore = this.getFoldLine(firstRow); - if (foldLineBefore && foldLineBefore !== foldLine) { - foldLineBefore.merge(foldLine); - foldLine = foldLineBefore; + this.$findOpeningBracket = function (bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + .replace(/-close\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + while (true) { + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; } - idx = foldLines.indexOf(foldLine) + 1; } - - for (idx; idx < foldLines.length; idx++) { - var foldLine = foldLines[idx]; - if (foldLine.start.row >= end.row) { - foldLine.shiftRow(-len); - } + else if (chr == bracket) { + depth += 1; } - - lastRow = firstRow; - } else { - var args = Array(len); - args.unshift(firstRow, 0); - var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; - arr.splice.apply(arr, args); - var foldLines = this.$foldData; - var foldLine = this.getFoldLine(firstRow); - var idx = 0; - if (foldLine) { - var cmp = foldLine.range.compareInside(start.row, start.column); - if (cmp == 0) { - foldLine = foldLine.split(start.row, start.column); - if (foldLine) { - foldLine.shiftRow(len); - foldLine.addRemoveChars(lastRow, 0, end.column - start.column); - } - } else - if (cmp == -1) { - foldLine.addRemoveChars(firstRow, 0, end.column - start.column); - foldLine.shiftRow(len); + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + value = token.value; + valueIndex = value.length - 1; + } + return null; + }; + this.$findClosingBracket = function (bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + if (!typeRe) { + typeRe = new RegExp("(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + .replace(/-open\b/, "-(close|open)") + + ")+"); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + while (true) { + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return { row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn() }; } - idx = foldLines.indexOf(foldLine) + 1; } - - for (idx; idx < foldLines.length; idx++) { - var foldLine = foldLines[idx]; - if (foldLine.start.row >= firstRow) { - foldLine.shiftRow(len); - } + else if (chr == bracket) { + depth += 1; } + valueIndex += 1; } - } else { - len = Math.abs(delta.start.column - delta.end.column); - if (action === "remove") { - removedFolds = this.getFoldsInRange(delta); - this.removeFolds(removedFolds); - - len = -len; - } - var foldLine = this.getFoldLine(firstRow); - if (foldLine) { - foldLine.addRemoveChars(firstRow, start.column, len); - } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + if (token == null) + break; + valueIndex = 0; } - - if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { - console.error("doc.getLength() and $wrapData.length have to be the same!"); + return null; + }; + this.getMatchingTags = function (pos) { + var iterator = new TokenIterator(this, pos.row, pos.column); + var token = this.$findTagName(iterator); + if (!token) + return; + var prevToken = iterator.stepBackward(); + if (prevToken.value === '<') { + return this.$findClosingTag(iterator, token); + } + else { + return this.$findOpeningTag(iterator, token); } - this.$updating = false; - - if (useWrapMode) - this.$updateWrapData(firstRow, lastRow); - else - this.$updateRowLengthCache(firstRow, lastRow); - - return removedFolds; }; - - this.$updateRowLengthCache = function(firstRow, lastRow, b) { - this.$rowLengthCache[firstRow] = null; - this.$rowLengthCache[lastRow] = null; + this.$findTagName = function (iterator) { + var token = iterator.getCurrentToken(); + var found = false; + var backward = false; + if (token && token.type.indexOf('tag-name') === -1) { + do { + if (backward) + token = iterator.stepBackward(); + else + token = iterator.stepForward(); + if (token) { + if (token.value === "/>") { + backward = true; + } + else if (token.type.indexOf('tag-name') !== -1) { + found = true; + } + } + } while (token && !found); + } + return token; }; - - this.$updateWrapData = function(firstRow, lastRow) { - var lines = this.doc.getAllLines(); - var tabSize = this.getTabSize(); - var wrapData = this.$wrapData; - var wrapLimit = this.$wrapLimit; - var tokens; - var foldLine; - - var row = firstRow; - lastRow = Math.min(lastRow, lines.length - 1); - while (row <= lastRow) { - foldLine = this.getFoldLine(row, foldLine); - if (!foldLine) { - tokens = this.$getDisplayTokens(lines[row]); - wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); - row ++; - } else { - tokens = []; - foldLine.walk(function(placeholder, row, column, lastColumn) { - var walkTokens; - if (placeholder != null) { - walkTokens = this.$getDisplayTokens( - placeholder, tokens.length); - walkTokens[0] = PLACEHOLDER_START; - for (var i = 1; i < walkTokens.length; i++) { - walkTokens[i] = PLACEHOLDER_BODY; + this.$findClosingTag = function (iterator, token) { + var prevToken; + var currentTag = token.value; + var tag = token.value; + var depth = 0; + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); + token = iterator.stepForward(); + var openTagName = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + token.value.length); + var foundOpenTagEnd = false; + do { + prevToken = token; + if (prevToken.type.indexOf('tag-close') !== -1 && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + token = iterator.stepForward(); + if (token) { + if (token.value === '>' && !foundOpenTagEnd) { + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for `>` + foundOpenTagEnd = true; + } + if (token.type.indexOf('tag-name') !== -1) { + currentTag = token.value; + if (tag === currentTag) { + if (prevToken.value === '<') { + depth++; + } + else if (prevToken.value === '') { + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + else { + return; + } } - } else { - walkTokens = this.$getDisplayTokens( - lines[row].substring(lastColumn, column), - tokens.length); } - tokens = tokens.concat(walkTokens); - }.bind(this), - foldLine.end.row, - lines[foldLine.end.row].length + 1 - ); - - wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); - row = foldLine.end.row + 1; + } + } + else if (tag === currentTag && token.value === '/>') { // self-closing tag + depth--; + if (depth < 0) { //found self-closing tag end + var closeTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 2); + var closeTagName = closeTagStart; + var closeTagEnd = closeTagName; + var openTagEnd = new Range(openTagName.end.row, openTagName.end.column, openTagName.end.row, openTagName.end.column + 1); + } + } } + } while (token && depth >= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; } }; - var CHAR = 1, - CHAR_EXT = 2, - PLACEHOLDER_START = 3, - PLACEHOLDER_BODY = 4, - PUNCTUATION = 9, - SPACE = 10, - TAB = 11, - TAB_SPACE = 12; - - - this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { - if (tokens.length == 0) { - return []; + this.$findOpeningTag = function (iterator, token) { + var prevToken = iterator.getCurrentToken(); + var tag = token.value; + var depth = 0; + var startRow = iterator.getCurrentTokenRow(); + var startColumn = iterator.getCurrentTokenColumn(); + var endColumn = startColumn + 2; + var closeTagStart = new Range(startRow, startColumn, startRow, endColumn); //Range for ") + return; + var closeTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + iterator.stepBackward(); + iterator.stepBackward(); + do { + token = prevToken; + startRow = iterator.getCurrentTokenRow(); + startColumn = iterator.getCurrentTokenColumn(); + endColumn = startColumn + token.value.length; + prevToken = iterator.stepBackward(); + if (token) { + if (token.type.indexOf('tag-name') !== -1) { + if (tag === token.value) { + if (prevToken.value === '<') { + depth++; + if (depth > 0) { //found opening tag + var openTagName = new Range(startRow, startColumn, startRow, endColumn); + var openTagStart = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for < + do { + token = iterator.stepForward(); + } while (token && token.value !== '>'); + var openTagEnd = new Range(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn(), iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); //Range for > + } + } + else if (prevToken.value === '') { // self-closing tag + var stepCount = 0; + var tmpToken = prevToken; + while (tmpToken) { + if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { + depth--; + break; + } + else if (tmpToken.value === '<') { + break; + } + tmpToken = iterator.stepBackward(); + stepCount++; + } + for (var i = 0; i < stepCount; i++) { + iterator.stepForward(); + } + } + } + } while (prevToken && depth <= 0); + if (openTagStart && openTagEnd && closeTagStart && closeTagEnd && openTagName && closeTagName) { + return { + openTag: new Range(openTagStart.start.row, openTagStart.start.column, openTagEnd.end.row, openTagEnd.end.column), + closeTag: new Range(closeTagStart.start.row, closeTagStart.start.column, closeTagEnd.end.row, closeTagEnd.end.column), + openTagName: openTagName, + closeTagName: closeTagName + }; + } + }; +} +exports.BracketMatch = BracketMatch; - var splits = []; - var displayLength = tokens.length; - var lastSplit = 0, lastDocSplit = 0; - - var isCode = this.$wrapAsCode; - - var indentedSoftWrap = this.$indentedSoftWrap; - var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) - || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); +}); - function getWrapIndent() { - var indentation = 0; - if (maxIndent === 0) - return indentation; - if (indentedSoftWrap) { - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (token == SPACE) - indentation += 1; - else if (token == TAB) - indentation += tabSize; - else if (token == TAB_SPACE) - continue; - else - break; - } +define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/bidihandler","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/line_widgets","ace/document","ace/background_tokenizer","ace/search_highlight","ace/undomanager","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module){"use strict"; +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var BidiHandler = require("./bidihandler").BidiHandler; +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var LineWidgets = require("./line_widgets").LineWidgets; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; +var UndoManager = require("./undomanager").UndoManager; +var EditSession = /** @class */ (function () { + function EditSession(text, mode) { this.doc; + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + this.$editor = null; + this.prevOp = {}; + this.$foldData = []; + this.id = "session" + (++EditSession.$uid); + this.$foldData.toString = function () { + return this.join("\n"); + }; + this.$gutterCustomWidgets = {}; + this.bgTokenizer = new BackgroundTokenizer((new TextMode()).getTokenizer(), this); + var _self = this; + this.bgTokenizer.on("update", function (e) { + _self._signal("tokenizerUpdate", e); + }); + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + if (typeof text != "object" || !text.getLine) + text = new Document(/**@type{string}*/ (text)); + this.setDocument(text); + this.selection = new Selection(this); + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + this.selection.on("changeCursor", this.$onSelectionChange); + this.$bidiHandler = new BidiHandler(this); + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); + this.destroyed = false; + this.$initOperationListeners(); + } + EditSession.prototype.$initOperationListeners = function () { + var _this = this; + this.curOp = null; + this.on("change", function () { + if (!_this.curOp) { + _this.startOperation(); + _this.curOp.selectionBefore = _this.$lastSel; } - if (isCode && indentedSoftWrap !== false) - indentation += tabSize; - return Math.min(indentation, maxIndent); - } - function addSplit(screenPos) { - var len = screenPos - lastSplit; - for (var i = lastSplit; i < screenPos; i++) { - var ch = tokens[i]; - if (ch === 12 || ch === 2) len -= 1; + _this.curOp.docChanged = true; + }, true); + this.on("changeSelection", function () { + if (!_this.curOp) { + _this.startOperation(); + _this.curOp.selectionBefore = _this.$lastSel; } - - if (!splits.length) { - indent = getWrapIndent(); - splits.indent = indent; + _this.curOp.selectionChanged = true; + }, true); + this.$operationResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); + }; + EditSession.prototype.startOperation = function (commandEvent) { + if (this.curOp) { + if (!commandEvent || this.curOp.command) { + return; } - lastDocSplit += len; - splits.push(lastDocSplit); - lastSplit = screenPos; + this.prevOp = this.curOp; } - var indent = 0; - while (displayLength - lastSplit > wrapLimit - indent) { - var split = lastSplit + wrapLimit - indent; - if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { - addSplit(split); - continue; - } - if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { - for (split; split != lastSplit - 1; split--) { - if (tokens[split] == PLACEHOLDER_START) { - break; - } - } - if (split > lastSplit) { - addSplit(split); - continue; - } - split = lastSplit + wrapLimit; - for (split; split < tokens.length; split++) { - if (tokens[split] != PLACEHOLDER_BODY) { - break; - } - } - if (split == tokens.length) { - break; // Breaks the while-loop. - } - addSplit(split); - continue; - } - var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); - while (split > minSplit && tokens[split] < PLACEHOLDER_START) { - split --; - } - if (isCode) { - while (split > minSplit && tokens[split] < PLACEHOLDER_START) { - split --; - } - while (split > minSplit && tokens[split] == PUNCTUATION) { - split --; - } - } else { - while (split > minSplit && tokens[split] < SPACE) { - split --; - } - } - if (split > minSplit) { - addSplit(++split); - continue; - } - split = lastSplit + wrapLimit; - if (tokens[split] == CHAR_EXT) - split--; - addSplit(split - indent); + if (!commandEvent) { + commandEvent = {}; } - return splits; + this.$operationResetTimer.schedule(); + this.curOp = { + command: commandEvent.command || {}, + args: commandEvent.args + }; + this.curOp.selectionBefore = this.selection.toJSON(); + this._signal("startOperation", commandEvent); }; - this.$getDisplayTokens = function(str, offset) { - var arr = []; - var tabSize; - offset = offset || 0; - - for (var i = 0; i < str.length; i++) { - var c = str.charCodeAt(i); - if (c == 9) { - tabSize = this.getScreenTabSize(arr.length + offset); - arr.push(TAB); - for (var n = 1; n < tabSize; n++) { - arr.push(TAB_SPACE); - } - } - else if (c == 32) { - arr.push(SPACE); - } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { - arr.push(PUNCTUATION); + EditSession.prototype.endOperation = function (e) { + if (this.curOp) { + if (e && e.returnValue === false) { + this.curOp = null; + this._signal("endOperation", e); + return; } - else if (c >= 0x1100 && isFullWidth(c)) { - arr.push(CHAR, CHAR_EXT); - } else { - arr.push(CHAR); + if (e == true && this.curOp.command && this.curOp.command.name == "mouse") { + return; } + var currentSelection = this.selection.toJSON(); + this.curOp.selectionAfter = currentSelection; + this.$lastSel = this.selection.toJSON(); + this.getUndoManager().addSelection(currentSelection); + this._signal("beforeEndOperation"); + this.prevOp = this.curOp; + this.curOp = null; + this._signal("endOperation", e); } - return arr; }; - this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { - if (maxScreenColumn == 0) - return [0, 0]; - if (maxScreenColumn == null) - maxScreenColumn = Infinity; - screenColumn = screenColumn || 0; - - var c, column; - for (column = 0; column < str.length; column++) { - c = str.charCodeAt(column); - if (c == 9) { - screenColumn += this.getScreenTabSize(screenColumn); - } - else if (c >= 0x1100 && isFullWidth(c)) { - screenColumn += 2; - } else { - screenColumn += 1; - } - if (screenColumn > maxScreenColumn) { - break; - } - } - - return [screenColumn, column]; + EditSession.prototype.setDocument = function (doc) { + if (this.doc) + this.doc.off("change", this.$onChange); + this.doc = doc; + doc.on("change", this.$onChange, true); + this.bgTokenizer.setDocument(this.getDocument()); + this.resetCaches(); }; - - this.lineWidgets = null; - this.getRowLength = function(row) { - var h = 1; - if (this.lineWidgets) - h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; - - if (!this.$useWrapMode || !this.$wrapData[row]) - return h; - else - return this.$wrapData[row].length + h; + EditSession.prototype.getDocument = function () { + return this.doc; }; - this.getRowLineCount = function(row) { - if (!this.$useWrapMode || !this.$wrapData[row]) { - return 1; - } else { - return this.$wrapData[row].length + 1; + Object.defineProperty(EditSession.prototype, "widgetManager", { + get: function () { + var widgetManager = new LineWidgets(this); + this.widgetManager = widgetManager; + if (this.$editor) + widgetManager.attach(this.$editor); + return widgetManager; + }, + set: function (value) { + Object.defineProperty(this, "widgetManager", { + writable: true, + enumerable: true, + configurable: true, + value: value, + }); + }, + enumerable: false, + configurable: true + }); + EditSession.prototype.$resetRowCache = function (docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; } - }; - - this.getRowWrapIndent = function(screenRow) { - if (this.$useWrapMode) { - var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); - var splits = this.$wrapData[pos.row]; - return splits.length && splits[0] < pos.column ? splits.indent : 0; - } else { - return 0; + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); } }; - this.getScreenLastRowColumn = function(screenRow) { - var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); - return this.documentToScreenColumn(pos.row, pos.column); + EditSession.prototype.$getRowCacheIndex = function (cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + return low - 1; }; - this.getDocumentLastRowColumn = function(docRow, docColumn) { - var screenRow = this.documentToScreenRow(docRow, docColumn); - return this.getScreenLastRowColumn(screenRow); + EditSession.prototype.resetCaches = function () { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (!this.destroyed) + this.bgTokenizer.start(0); }; - this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { - var screenRow = this.documentToScreenRow(docRow, docColumn); - return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + EditSession.prototype.onChangeFold = function (e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); }; - this.getRowSplitData = function(row) { - if (!this.$useWrapMode) { - return undefined; - } else { - return this.$wrapData[row]; + EditSession.prototype.onChange = function (delta) { + this.$modified = true; + this.$bidiHandler.onChange(delta); + this.$resetRowCache(delta.start.row); + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager) { + if (removedFolds && removedFolds.length) { + this.$undoManager.add({ + action: "removeFolds", + folds: removedFolds + }, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + } + this.$undoManager.add(delta, this.mergeUndoDeltas); + this.mergeUndoDeltas = true; + this.$informUndoManager.schedule(); } + this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); }; - this.getScreenTabSize = function(screenColumn) { - return this.$tabSize - (screenColumn % this.$tabSize | 0); + EditSession.prototype.onSelectionChange = function () { + this._signal("changeSelection"); }; - - - this.screenToDocumentRow = function(screenRow, screenColumn) { - return this.screenToDocumentPosition(screenRow, screenColumn).row; + EditSession.prototype.setValue = function (text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + this.$resetRowCache(0); + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); }; - - - this.screenToDocumentColumn = function(screenRow, screenColumn) { - return this.screenToDocumentPosition(screenRow, screenColumn).column; + EditSession.fromJSON = function (session) { + if (typeof session == "string") + session = JSON.parse(session); + var undoManager = new UndoManager(); + undoManager.$undoStack = session.history.$undoStack; + undoManager.$redoStack = session.history.$redoStack; + undoManager.mark = session.history.mark; + undoManager.$rev = session.history.rev; + var editSession = new EditSession(session.value); + session.folds.forEach(function (fold) { + editSession.addFold("...", Range.fromPoints(fold.start, fold.end)); + }); + editSession.setAnnotations(session.annotations); + editSession.setBreakpoints(session.breakpoints); + editSession.setMode(session.mode); + editSession.setScrollLeft(session.scrollLeft); + editSession.setScrollTop(session.scrollTop); + editSession.setUndoManager(undoManager); + editSession.selection.fromJSON(session.selection); + return editSession; + }; + EditSession.prototype.toJSON = function () { + return { + annotations: this.$annotations, + breakpoints: this.$breakpoints, + folds: this.getAllFolds().map(function (fold) { + return fold.range; + }), + history: this.getUndoManager(), + mode: this.$mode.$id, + scrollLeft: this.$scrollLeft, + scrollTop: this.$scrollTop, + selection: this.selection.toJSON(), + value: this.doc.getValue() + }; }; - this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) { - if (screenRow < 0) - return {row: 0, column: 0}; - - var line; - var docRow = 0; - var docColumn = 0; - var column; - var row = 0; - var rowLength = 0; - - var rowCache = this.$screenRowCache; - var i = this.$getRowCacheIndex(rowCache, screenRow); - var l = rowCache.length; - if (l && i >= 0) { - var row = rowCache[i]; - var docRow = this.$docRowCache[i]; - var doCache = screenRow > rowCache[l - 1]; - } else { - var doCache = !l; + EditSession.prototype.toString = function () { + return this.doc.getValue(); + }; + EditSession.prototype.getSelection = function () { + return this.selection; + }; + EditSession.prototype.getState = function (row) { + return this.bgTokenizer.getState(row); + }; + EditSession.prototype.getTokens = function (row) { + return this.bgTokenizer.getTokens(row); + }; + EditSession.prototype.getTokenAt = function (row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + var i = tokens.length - 1; + c = this.getLine(row).length; } - - var maxRow = this.getLength() - 1; - var foldLine = this.getNextFoldLine(docRow); - var foldStart = foldLine ? foldLine.start.row : Infinity; - - while (row <= screenRow) { - rowLength = this.getRowLength(docRow); - if (row + rowLength > screenRow || docRow >= maxRow) { - break; - } else { - row += rowLength; - docRow++; - if (docRow > foldStart) { - docRow = foldLine.end.row+1; - foldLine = this.getNextFoldLine(docRow, foldLine); - foldStart = foldLine ? foldLine.start.row : Infinity; - } - } - - if (doCache) { - this.$docRowCache.push(docRow); - this.$screenRowCache.push(row); + else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; } } - - if (foldLine && foldLine.start.row <= docRow) { - line = this.getFoldDisplayLine(foldLine); - docRow = foldLine.start.row; - } else if (row + rowLength <= screenRow || docRow > maxRow) { - return { - row: maxRow, - column: this.getLine(maxRow).length + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + EditSession.prototype.setUndoManager = function (undoManager) { + this.$undoManager = undoManager; + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + if (undoManager) { + var self = this; + undoManager.addSession(this); + this.$syncInformUndoManager = function () { + self.$informUndoManager.cancel(); + self.mergeUndoDeltas = false; }; - } else { - line = this.getLine(docRow); - foldLine = null; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); } - var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); - if (this.$useWrapMode) { - var splits = this.$wrapData[docRow]; - if (splits) { - column = splits[splitIndex]; - if(splitIndex > 0 && splits.length) { - wrapIndent = splits.indent; - docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; - line = line.substring(docColumn); - } - } + else { + this.$syncInformUndoManager = function () { }; } - - if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) - screenColumn = this.$bidiHandler.offsetToCol(offsetX); - - docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; - if (this.$useWrapMode && docColumn >= column) - docColumn = column - 1; - - if (foldLine) - return foldLine.idxToPosition(docColumn); - - return {row: docRow, column: docColumn}; }; - this.documentToScreenPosition = function(docRow, docColumn) { - if (typeof docColumn === "undefined") - var pos = this.$clipPositionToDocument(docRow.row, docRow.column); - else - pos = this.$clipPositionToDocument(docRow, docColumn); - - docRow = pos.row; - docColumn = pos.column; - - var screenRow = 0; - var foldStartRow = null; - var fold = null; - fold = this.getFoldAt(docRow, docColumn, 1); - if (fold) { - docRow = fold.start.row; - docColumn = fold.start.column; - } - - var rowEnd, row = 0; - - - var rowCache = this.$docRowCache; - var i = this.$getRowCacheIndex(rowCache, docRow); - var l = rowCache.length; - if (l && i >= 0) { - var row = rowCache[i]; - var screenRow = this.$screenRowCache[i]; - var doCache = docRow > rowCache[l - 1]; - } else { - var doCache = !l; + EditSession.prototype.markUndoGroup = function () { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + EditSession.prototype.getUndoManager = function () { + return this.$undoManager || this.$defaultUndoManager; + }; + EditSession.prototype.getTabString = function () { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); } - - var foldLine = this.getNextFoldLine(row); - var foldStart = foldLine ?foldLine.start.row :Infinity; - - while (row < docRow) { - if (row >= foldStart) { - rowEnd = foldLine.end.row + 1; - if (rowEnd > docRow) - break; - foldLine = this.getNextFoldLine(rowEnd, foldLine); - foldStart = foldLine ?foldLine.start.row :Infinity; - } - else { - rowEnd = row + 1; - } - - screenRow += this.getRowLength(row); - row = rowEnd; - - if (doCache) { - this.$docRowCache.push(row); - this.$screenRowCache.push(screenRow); - } + else { + return "\t"; } - var textLine = ""; - if (foldLine && row >= foldStart) { - textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); - foldStartRow = foldLine.start.row; - } else { - textLine = this.getLine(docRow).substring(0, docColumn); - foldStartRow = docRow; + }; + EditSession.prototype.setUseSoftTabs = function (val) { + this.setOption("useSoftTabs", val); + }; + EditSession.prototype.getUseSoftTabs = function () { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + EditSession.prototype.setTabSize = function (tabSize) { + this.setOption("tabSize", tabSize); + }; + EditSession.prototype.getTabSize = function () { + return this.$tabSize; + }; + EditSession.prototype.isTabStop = function (position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + EditSession.prototype.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) { + this.setOption("navigateWithinSoftTabs", navigateWithinSoftTabs); + }; + EditSession.prototype.getNavigateWithinSoftTabs = function () { + return this.$navigateWithinSoftTabs; + }; + EditSession.prototype.setOverwrite = function (overwrite) { + this.setOption("overwrite", overwrite); + }; + EditSession.prototype.getOverwrite = function () { + return this.$overwrite; + }; + EditSession.prototype.toggleOverwrite = function () { + this.setOverwrite(!this.$overwrite); + }; + EditSession.prototype.addGutterDecoration = function (row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.removeGutterCustomWidget = function (row) { + if (this.$editor) { + this.$editor.renderer.$gutterLayer.$removeCustomWidget(row); } - var wrapIndent = 0; - if (this.$useWrapMode) { - var wrapRow = this.$wrapData[foldStartRow]; - if (wrapRow) { - var screenRowOffset = 0; - while (textLine.length >= wrapRow[screenRowOffset]) { - screenRow ++; - screenRowOffset++; - } - textLine = textLine.substring( - wrapRow[screenRowOffset - 1] || 0, textLine.length - ); - wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; - } + }; + EditSession.prototype.addGutterCustomWidget = function (row, attributes) { + if (this.$editor) { + this.$editor.renderer.$gutterLayer.$addCustomWidget(row, attributes); } - - if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) - screenRow += this.lineWidgets[row].rowsAbove; - - return { - row: screenRow, - column: wrapIndent + this.$getStringScreenWidth(textLine)[0] - }; }; - this.documentToScreenColumn = function(row, docColumn) { - return this.documentToScreenPosition(row, docColumn).column; + EditSession.prototype.removeGutterDecoration = function (row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); }; - this.documentToScreenRow = function(docRow, docColumn) { - return this.documentToScreenPosition(docRow, docColumn).row; + EditSession.prototype.getBreakpoints = function () { + return this.$breakpoints; }; - this.getScreenLength = function() { - var screenRows = 0; - var fold = null; - if (!this.$useWrapMode) { - screenRows = this.getLength(); - var foldData = this.$foldData; - for (var i = 0; i < foldData.length; i++) { - fold = foldData[i]; - screenRows -= fold.end.row - fold.start.row; - } - } else { - var lastRow = this.$wrapData.length; - var row = 0, i = 0; - var fold = this.$foldData[i++]; - var foldStart = fold ? fold.start.row :Infinity; - - while (row < lastRow) { - var splits = this.$wrapData[row]; - screenRows += splits ? splits.length + 1 : 1; - row ++; - if (row > foldStart) { - row = fold.end.row+1; - fold = this.$foldData[i++]; - foldStart = fold ?fold.start.row :Infinity; - } - } + EditSession.prototype.setBreakpoints = function (rows) { + this.$breakpoints = []; + for (var i = 0; i < rows.length; i++) { + this.$breakpoints[rows[i]] = "ace_breakpoint"; } - if (this.lineWidgets) - screenRows += this.$getWidgetScreenLength(); - - return screenRows; + this._signal("changeBreakpoint", {}); }; - this.$setFontMetrics = function(fm) { - if (!this.$enableVarChar) return; - this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { - if (maxScreenColumn === 0) - return [0, 0]; - if (!maxScreenColumn) - maxScreenColumn = Infinity; - screenColumn = screenColumn || 0; - - var c, column; - for (column = 0; column < str.length; column++) { - c = str.charAt(column); - if (c === "\t") { - screenColumn += this.getScreenTabSize(screenColumn); - } else { - screenColumn += fm.getCharacterWidth(c); - } - if (screenColumn > maxScreenColumn) { - break; - } - } - - return [screenColumn, column]; - }; + EditSession.prototype.clearBreakpoints = function () { + this.$breakpoints = []; + this._signal("changeBreakpoint", {}); }; - - this.destroy = function() { - if (!this.destroyed) { - this.bgTokenizer.setDocument(null); - this.bgTokenizer.cleanup(); - this.destroyed = true; + EditSession.prototype.setBreakpoint = function (row, className) { + if (className === undefined) + className = "ace_breakpoint"; + if (className) + this.$breakpoints[row] = className; + else + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.clearBreakpoint = function (row) { + delete this.$breakpoints[row]; + this._signal("changeBreakpoint", {}); + }; + EditSession.prototype.addMarker = function (range, clazz, type, inFront) { + var id = this.$markerId++; + var marker = { + range: range, + type: type || "line", + renderer: typeof type == "function" ? type : null, + clazz: clazz, + inFront: !!inFront, + id: id + }; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); } - this.$stopWorker(); - this.removeAllListeners(); - if (this.doc) { - this.doc.off("change", this.$onChange); + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); } - this.selection.detach(); - }; - - this.isFullWidth = isFullWidth; - function isFullWidth(c) { - if (c < 0x1100) - return false; - return c >= 0x1100 && c <= 0x115F || - c >= 0x11A3 && c <= 0x11A7 || - c >= 0x11FA && c <= 0x11FF || - c >= 0x2329 && c <= 0x232A || - c >= 0x2E80 && c <= 0x2E99 || - c >= 0x2E9B && c <= 0x2EF3 || - c >= 0x2F00 && c <= 0x2FD5 || - c >= 0x2FF0 && c <= 0x2FFB || - c >= 0x3000 && c <= 0x303E || - c >= 0x3041 && c <= 0x3096 || - c >= 0x3099 && c <= 0x30FF || - c >= 0x3105 && c <= 0x312D || - c >= 0x3131 && c <= 0x318E || - c >= 0x3190 && c <= 0x31BA || - c >= 0x31C0 && c <= 0x31E3 || - c >= 0x31F0 && c <= 0x321E || - c >= 0x3220 && c <= 0x3247 || - c >= 0x3250 && c <= 0x32FE || - c >= 0x3300 && c <= 0x4DBF || - c >= 0x4E00 && c <= 0xA48C || - c >= 0xA490 && c <= 0xA4C6 || - c >= 0xA960 && c <= 0xA97C || - c >= 0xAC00 && c <= 0xD7A3 || - c >= 0xD7B0 && c <= 0xD7C6 || - c >= 0xD7CB && c <= 0xD7FB || - c >= 0xF900 && c <= 0xFAFF || - c >= 0xFE10 && c <= 0xFE19 || - c >= 0xFE30 && c <= 0xFE52 || - c >= 0xFE54 && c <= 0xFE66 || - c >= 0xFE68 && c <= 0xFE6B || - c >= 0xFF01 && c <= 0xFF60 || - c >= 0xFFE0 && c <= 0xFFE6; - } - -}).call(EditSession.prototype); - -require("./edit_session/folding").Folding.call(EditSession.prototype); -require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); - - -config.defineOptions(EditSession.prototype, "session", { - wrap: { - set: function(value) { - if (!value || value == "off") - value = false; - else if (value == "free") - value = true; - else if (value == "printMargin") - value = -1; - else if (typeof value == "string") - value = parseInt(value, 10) || false; - - if (this.$wrap == value) - return; - this.$wrap = value; - if (!value) { - this.setUseWrapMode(false); - } else { - var col = typeof value == "number" ? value : null; - this.setWrapLimitRange(col, col); - this.setUseWrapMode(true); - } - }, - get: function() { - if (this.getUseWrapMode()) { - if (this.$wrap == -1) - return "printMargin"; - if (!this.getWrapLimitRange().min) - return "free"; - return this.$wrap; - } - return "off"; - }, - handlesSet: true - }, - wrapMethod: { - set: function(val) { - val = val == "auto" - ? this.$mode.type != "text" - : val != "text"; - if (val != this.$wrapAsCode) { - this.$wrapAsCode = val; - if (this.$useWrapMode) { - this.$useWrapMode = false; - this.setUseWrapMode(true); - } - } - }, - initialValue: "auto" - }, - indentedSoftWrap: { - set: function() { - if (this.$useWrapMode) { - this.$useWrapMode = false; - this.setUseWrapMode(true); - } - }, - initialValue: true - }, - firstLineNumber: { - set: function() {this._signal("changeBreakpoint");}, - initialValue: 1 - }, - useWorker: { - set: function(useWorker) { - this.$useWorker = useWorker; - - this.$stopWorker(); - if (useWorker) - this.$startWorker(); - }, - initialValue: true - }, - useSoftTabs: {initialValue: true}, - tabSize: { - set: function(tabSize) { - tabSize = parseInt(tabSize); - if (tabSize > 0 && this.$tabSize !== tabSize) { - this.$modified = true; - this.$rowLengthCache = []; - this.$tabSize = tabSize; - this._signal("changeTabSize"); - } - }, - initialValue: 4, - handlesSet: true - }, - navigateWithinSoftTabs: {initialValue: false}, - foldStyle: { - set: function(val) {this.setFoldStyle(val);}, - handlesSet: true - }, - overwrite: { - set: function(val) {this._signal("changeOverwrite");}, - initialValue: false - }, - newLineMode: { - set: function(val) {this.doc.setNewLineMode(val);}, - get: function() {return this.doc.getNewLineMode();}, - handlesSet: true - }, - mode: { - set: function(val) { this.setMode(val); }, - get: function() { return this.$modeId; }, - handlesSet: true - } -}); - -exports.EditSession = EditSession; -}); - -define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { -"use strict"; - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var Range = require("./range").Range; - -var Search = function() { - this.$options = {}; -}; - -(function() { - this.set = function(options) { - oop.mixin(this.$options, options); - return this; + return id; }; - this.getOptions = function() { - return lang.copyObject(this.$options); + EditSession.prototype.addDynamicMarker = function (marker, inFront) { + if (!marker.update) + return; + var id = this.$markerId++; + marker.id = id; + marker.inFront = !!inFront; + if (inFront) { + this.$frontMarkers[id] = marker; + this._signal("changeFrontMarker"); + } + else { + this.$backMarkers[id] = marker; + this._signal("changeBackMarker"); + } + return marker; }; - this.setOptions = function(options) { - this.$options = options; + EditSession.prototype.removeMarker = function (markerId) { + var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId]; + if (!marker) + return; + var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers; + delete (markers[markerId]); + this._signal(marker.inFront ? "changeFrontMarker" : "changeBackMarker"); }; - this.find = function(session) { - var options = this.$options; - var iterator = this.$matchIterator(session, options); - if (!iterator) - return false; - - var firstRange = null; - iterator.forEach(function(sr, sc, er, ec) { - firstRange = new Range(sr, sc, er, ec); - if (sc == ec && options.start && options.start.start - && options.skipCurrent != false && firstRange.isEqual(options.start) - ) { - firstRange = null; - return false; - } - - return true; - }); - - return firstRange; + EditSession.prototype.getMarkers = function (inFront) { + return inFront ? this.$frontMarkers : this.$backMarkers; }; - this.findAll = function(session) { - var options = this.$options; - if (!options.needle) - return []; - this.$assembleRegExp(options); - - var range = options.range; - var lines = range - ? session.getLines(range.start.row, range.end.row) - : session.doc.getAllLines(); - - var ranges = []; - var re = options.re; - if (options.$isMultiLine) { - var len = re.length; - var maxRow = lines.length - len; - var prevRange; - outer: for (var row = re.offset || 0; row <= maxRow; row++) { - for (var j = 0; j < len; j++) - if (lines[row + j].search(re[j]) == -1) - continue outer; - - var startLine = lines[row]; - var line = lines[row + len - 1]; - var startIndex = startLine.length - startLine.match(re[0])[0].length; - var endIndex = line.match(re[len - 1])[0].length; - - if (prevRange && prevRange.end.row === row && - prevRange.end.column > startIndex - ) { - continue; - } - ranges.push(prevRange = new Range( - row, startIndex, row + len - 1, endIndex - )); - if (len > 2) - row = row + len - 2; - } - } else { - for (var i = 0; i < lines.length; i++) { - var matches = lang.getMatchOffsets(lines[i], re); - for (var j = 0; j < matches.length; j++) { - var match = matches[j]; - ranges.push(new Range(i, match.offset, i, match.offset + match.length)); - } - } + EditSession.prototype.highlight = function (re) { + if (!this.$searchHighlight) { + var highlight = new SearchHighlight(null, "ace_selected-word", "text"); + this.$searchHighlight = this.addDynamicMarker(highlight); } - - if (range) { - var startColumn = range.start.column; - var endColumn = range.start.column; - var i = 0, j = ranges.length - 1; - while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) - i++; - - while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) - j--; - - ranges = ranges.slice(i, j + 1); - for (i = 0, j = ranges.length; i < j; i++) { - ranges[i].start.row += range.start.row; - ranges[i].end.row += range.start.row; - } + this.$searchHighlight.setRegexp(re); + }; + EditSession.prototype.highlightLines = function (startRow, endRow, clazz, inFront) { + if (typeof endRow != "number") { + clazz = endRow; + endRow = startRow; } - - return ranges; + if (!clazz) + clazz = "ace_step"; + var range = new Range(startRow, 0, endRow, Infinity); + range.id = this.addMarker(range, clazz, "fullLine", inFront); + return range; }; - this.replace = function(input, replacement) { - var options = this.$options; - - var re = this.$assembleRegExp(options); - if (options.$isMultiLine) - return replacement; - - if (!re) - return; - - var match = re.exec(input); - if (!match || match[0].length != input.length) - return null; - - replacement = input.replace(re, replacement); - if (options.preserveCase) { - replacement = replacement.split(""); - for (var i = Math.min(input.length, input.length); i--; ) { - var ch = input[i]; - if (ch && ch.toLowerCase() != ch) - replacement[i] = replacement[i].toUpperCase(); - else - replacement[i] = replacement[i].toLowerCase(); - } - replacement = replacement.join(""); - } - - return replacement; + EditSession.prototype.setAnnotations = function (annotations) { + this.$annotations = annotations; + this._signal("changeAnnotation", {}); }; - - this.$assembleRegExp = function(options, $disableFakeMultiline) { - if (options.needle instanceof RegExp) - return options.re = options.needle; - - var needle = options.needle; - - if (!options.needle) - return options.re = false; - - if (!options.regExp) - needle = lang.escapeRegExp(needle); - - if (options.wholeWord) - needle = addWordBoundary(needle, options); - - var modifier = options.caseSensitive ? "gm" : "gmi"; - - options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); - if (options.$isMultiLine) - return options.re = this.$assembleMultilineRegExp(needle, modifier); - - try { - var re = new RegExp(needle, modifier); - } catch(e) { - re = false; - } - return options.re = re; + EditSession.prototype.getAnnotations = function () { + return this.$annotations || []; }; - - this.$assembleMultilineRegExp = function(needle, modifier) { - var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); - var re = []; - for (var i = 0; i < parts.length; i++) try { - re.push(new RegExp(parts[i], modifier)); - } catch(e) { - return false; - } - return re; + EditSession.prototype.clearAnnotations = function () { + this.setAnnotations([]); }; - - this.$matchIterator = function(session, options) { - var re = this.$assembleRegExp(options); - if (!re) - return false; - var backwards = options.backwards == true; - var skipCurrent = options.skipCurrent != false; - - var range = options.range; - var start = options.start; - if (!start) - start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); - - if (start.start) - start = start[skipCurrent != backwards ? "end" : "start"]; - - var firstRow = range ? range.start.row : 0; - var lastRow = range ? range.end.row : session.getLength() - 1; - - if (backwards) { - var forEach = function(callback) { - var row = start.row; - if (forEachInLine(row, start.column, callback)) - return; - for (row--; row >= firstRow; row--) - if (forEachInLine(row, Number.MAX_VALUE, callback)) - return; - if (options.wrap == false) - return; - for (row = lastRow, firstRow = start.row; row >= firstRow; row--) - if (forEachInLine(row, Number.MAX_VALUE, callback)) - return; - }; + EditSession.prototype.$detectNewLine = function (text) { + var match = text.match(/^.*?(\r?\n)/m); + if (match) { + this.$autoNewLine = match[1]; } else { - var forEach = function(callback) { - var row = start.row; - if (forEachInLine(row, start.column, callback)) - return; - for (row = row + 1; row <= lastRow; row++) - if (forEachInLine(row, 0, callback)) - return; - if (options.wrap == false) - return; - for (row = firstRow, lastRow = start.row; row <= lastRow; row++) - if (forEachInLine(row, 0, callback)) - return; - }; + this.$autoNewLine = "\n"; } - - if (options.$isMultiLine) { - var len = re.length; - var forEachInLine = function(row, offset, callback) { - var startRow = backwards ? row - len + 1 : row; - if (startRow < 0 || startRow + len > session.getLength()) return; - var line = session.getLine(startRow); - var startIndex = line.search(re[0]); - if (!backwards && startIndex < offset || startIndex === -1) return; - for (var i = 1; i < len; i++) { - line = session.getLine(startRow + i); - if (line.search(re[i]) == -1) - return; - } - var endIndex = line.match(re[len - 1])[0].length; - if (backwards && endIndex > offset) return; - if (callback(startRow, startIndex, startRow + len - 1, endIndex)) - return true; - }; + }; + EditSession.prototype.getWordRange = function (row, column) { + var line = this.getLine(row); + var inToken = false; + if (column > 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column - 1, column + 1))) + var re = /\s/; + else + var re = this.nonTokenRe; + var start = column; + if (start > 0) { + do { + start--; + } while (start >= 0 && line.charAt(start).match(re)); + start++; } - else if (backwards) { - var forEachInLine = function(row, endIndex, callback) { - var line = session.getLine(row); - var matches = []; - var m, last = 0; - re.lastIndex = 0; - while((m = re.exec(line))) { - var length = m[0].length; - last = m.index; - if (!length) { - if (last >= line.length) break; - re.lastIndex = last += 1; - } - if (m.index + length > endIndex) - break; - matches.push(m.index, length); - } - for (var i = matches.length - 1; i >= 0; i -= 2) { - var column = matches[i - 1]; - var length = matches[i]; - if (callback(row, column, row, column + length)) - return true; - } - }; + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; } - else { - var forEachInLine = function(row, startIndex, callback) { - var line = session.getLine(row); - var last; - var m; - re.lastIndex = startIndex; - while((m = re.exec(line))) { - var length = m[0].length; - last = m.index; - if (callback(row, last, row,last + length)) - return true; - if (!length) { - re.lastIndex = last += 1; - if (last >= line.length) return false; - } - } - }; + return new Range(row, start, row, end); + }; + EditSession.prototype.getAWordRange = function (row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; } - return {forEach: forEach}; + return wordRange; }; - -}).call(Search.prototype); - -function addWordBoundary(needle, options) { - function wordBoundary(c) { - if (/\w/.test(c) || options.regExp) return "\\b"; - return ""; - } - return wordBoundary(needle[0]) + needle - + wordBoundary(needle[needle.length - 1]); -} - -exports.Search = Search; -}); - -define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { -"use strict"; - -var keyUtil = require("../lib/keys"); -var useragent = require("../lib/useragent"); -var KEY_MODS = keyUtil.KEY_MODS; - -function HashHandler(config, platform) { - this.platform = platform || (useragent.isMac ? "mac" : "win"); - this.commands = {}; - this.commandKeyBinding = {}; - this.addCommands(config); - this.$singleCommand = true; -} - -function MultiHashHandler(config, platform) { - HashHandler.call(this, config, platform); - this.$singleCommand = false; -} - -MultiHashHandler.prototype = HashHandler.prototype; - -(function() { - - - this.addCommand = function(command) { - if (this.commands[command.name]) - this.removeCommand(command); - - this.commands[command.name] = command; - - if (command.bindKey) - this._buildKeyHash(command); + EditSession.prototype.setNewLineMode = function (newLineMode) { + this.doc.setNewLineMode(newLineMode); }; - - this.removeCommand = function(command, keepCommand) { - var name = command && (typeof command === 'string' ? command : command.name); - command = this.commands[name]; - if (!keepCommand) - delete this.commands[name]; - var ckb = this.commandKeyBinding; - for (var keyId in ckb) { - var cmdGroup = ckb[keyId]; - if (cmdGroup == command) { - delete ckb[keyId]; - } else if (Array.isArray(cmdGroup)) { - var i = cmdGroup.indexOf(command); - if (i != -1) { - cmdGroup.splice(i, 1); - if (cmdGroup.length == 1) - ckb[keyId] = cmdGroup[0]; - } - } - } + EditSession.prototype.getNewLineMode = function () { + return this.doc.getNewLineMode(); }; - - this.bindKey = function(key, command, position) { - if (typeof key == "object" && key) { - if (position == undefined) - position = key.position; - key = key[this.platform]; + EditSession.prototype.setUseWorker = function (useWorker) { this.setOption("useWorker", useWorker); }; + EditSession.prototype.getUseWorker = function () { return this.$useWorker; }; + EditSession.prototype.onReloadTokenizer = function (e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + EditSession.prototype.setMode = function (mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; } - if (!key) + else { + path = /**@type{string}*/ (mode) || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); return; - if (typeof command == "function") - return this.addCommand({exec: command, bindKey: key, name: command.name || key}); - - key.split("|").forEach(function(keyPart) { - var chain = ""; - if (keyPart.indexOf(" ") != -1) { - var parts = keyPart.split(/\s+/); - keyPart = parts.pop(); - parts.forEach(function(keyPart) { - var binding = this.parseKeys(keyPart); - var id = KEY_MODS[binding.hashId] + binding.key; - chain += (chain ? " " : "") + id; - this._addCommandToBinding(chain, "chainKeys"); - }, this); - chain += " "; + } + this.$modeId = path; + config.loadModule(["mode", path], function (m) { + if (this.destroyed) { + return; } - var binding = this.parseKeys(keyPart); - var id = KEY_MODS[binding.hashId] + binding.key; - this._addCommandToBinding(chain + id, command, position); - }, this); - }; - - function getPosition(command) { - return typeof command == "object" && command.bindKey - && command.bindKey.position - || (command.isDefault ? -100 : 0); - } - this._addCommandToBinding = function(keyId, command, position) { - var ckb = this.commandKeyBinding, i; - if (!command) { - delete ckb[keyId]; - } else if (!ckb[keyId] || this.$singleCommand) { - ckb[keyId] = command; - } else { - if (!Array.isArray(ckb[keyId])) { - ckb[keyId] = [ckb[keyId]]; - } else if ((i = ckb[keyId].indexOf(command)) != -1) { - ckb[keyId].splice(i, 1); - } - - if (typeof position != "number") { - position = getPosition(command); + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); } - - var commands = ckb[keyId]; - for (i = 0; i < commands.length; i++) { - var other = commands[i]; - var otherPos = getPosition(other); - if (otherPos > position) - break; + else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); } - commands.splice(i, 0, command); + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + EditSession.prototype.$onChangeMode = function (mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + var oldMode = this.$mode; + this.$mode = mode; + this.$stopWorker(); + if (this.$useWorker) + this.$startWorker(); + var tokenizer = mode.getTokenizer(); + if (tokenizer.on !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.on("update", onReloadTokenizer); + } + this.bgTokenizer.setTokenizer(tokenizer); + this.bgTokenizer.setDocument(this.getDocument()); + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode", { oldMode: oldMode, mode: mode }); } }; - - this.addCommands = function(commands) { - commands && Object.keys(commands).forEach(function(name) { - var command = commands[name]; - if (!command) - return; - - if (typeof command === "string") - return this.bindKey(command, name); - - if (typeof command === "function") - command = { exec: command }; - - if (typeof command !== "object") - return; - - if (!command.name) - command.name = name; - - this.addCommand(command); - }, this); + EditSession.prototype.$stopWorker = function () { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } }; - - this.removeCommands = function(commands) { - Object.keys(commands).forEach(function(name) { - this.removeCommand(commands[name]); - }, this); + EditSession.prototype.$startWorker = function () { + try { + this.$worker = this.$mode.createWorker(this); + } + catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } }; - - this.bindKeys = function(keyList) { - Object.keys(keyList).forEach(function(key) { - this.bindKey(key, keyList[key]); - }, this); + EditSession.prototype.getMode = function () { + return this.$mode; }; - - this._buildKeyHash = function(command) { - this.bindKey(command.bindKey, command); + EditSession.prototype.setScrollTop = function (scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); }; - this.parseKeys = function(keys) { - var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x;}); - var key = parts.pop(); - - var keyCode = keyUtil[key]; - if (keyUtil.FUNCTION_KEYS[keyCode]) - key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); - else if (!parts.length) - return {key: key, hashId: -1}; - else if (parts.length == 1 && parts[0] == "shift") - return {key: key.toUpperCase(), hashId: -1}; - - var hashId = 0; - for (var i = parts.length; i--;) { - var modifier = keyUtil.KEY_MODS[parts[i]]; - if (modifier == null) { - if (typeof console != "undefined") - console.error("invalid modifier " + parts[i] + " in " + keys); - return false; + EditSession.prototype.getScrollTop = function () { + return this.$scrollTop; + }; + EditSession.prototype.setScrollLeft = function (scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + EditSession.prototype.getScrollLeft = function () { + return this.$scrollLeft; + }; + EditSession.prototype.getScreenWidth = function () { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + EditSession.prototype.getLineWidgetMaxWidth = function () { + if (this.lineWidgetsWidth != null) + return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function (w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + EditSession.prototype.$computeWidth = function (force) { + if (this.$modified || force) { + this.$modified = false; + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; } - hashId |= modifier; + this.screenWidth = longestScreenLine; } - return {key: key, hashId: hashId}; }; - - this.findKeyCommand = function findKeyCommand(hashId, keyString) { - var key = KEY_MODS[hashId] + keyString; - return this.commandKeyBinding[key]; + EditSession.prototype.getLine = function (row) { + return this.doc.getLine(row); }; - - this.handleKeyboard = function(data, hashId, keyString, keyCode) { - if (keyCode < 0) return; - var key = KEY_MODS[hashId] + keyString; - var command = this.commandKeyBinding[key]; - if (data.$keyChain) { - data.$keyChain += " " + key; - command = this.commandKeyBinding[data.$keyChain] || command; - } - - if (command) { - if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { - data.$keyChain = data.$keyChain || key; - return {command: "null"}; + EditSession.prototype.getLines = function (firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + EditSession.prototype.getLength = function () { + return this.doc.getLength(); + }; + EditSession.prototype.getTextRange = function (range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + EditSession.prototype.insert = function (position, text) { + return this.doc.insert(position, text); + }; + EditSession.prototype.remove = function (range) { + return this.doc.remove(range); + }; + EditSession.prototype.removeFullLines = function (firstRow, lastRow) { + return this.doc.removeFullLines(firstRow, lastRow); + }; + EditSession.prototype.undoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.revertDelta(delta); + } + else if (delta.folds) { + this.addFolds(delta.folds); } } - - if (data.$keyChain) { - if ((!hashId || hashId == 4) && keyString.length == 1) - data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input - else if (hashId == -1 || keyCode > 0) - data.$keyChain = ""; // reset keyChain + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionBefore) + this.selection.fromJSON(deltas.selectionBefore); + else + this.selection.setRange(this.$getUndoSelection(deltas, true)); } - return {command: command}; - }; - - this.getStatusText = function(editor, data) { - return data.$keyChain || ""; + this.$fromUndo = false; }; - -}).call(HashHandler.prototype); - -exports.HashHandler = HashHandler; -exports.MultiHashHandler = MultiHashHandler; -}); - -define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - -var oop = require("../lib/oop"); -var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; -var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var CommandManager = function(platform, commands) { - MultiHashHandler.call(this, commands, platform); - this.byName = this.commands; - this.setDefaultHandler("exec", function(e) { - if (!e.args) { - return e.command.exec(e.editor, {}, e.event, true); - } - return e.command.exec(e.editor, e.args, e.event, false); - }); -}; - -oop.inherits(CommandManager, MultiHashHandler); - -(function() { - - oop.implement(this, EventEmitter); - - this.exec = function(command, editor, args) { - if (Array.isArray(command)) { - for (var i = command.length; i--; ) { - if (this.exec(command[i], editor, args)) return true; + EditSession.prototype.redoChanges = function (deltas, dontSelect) { + if (!deltas.length) + return; + this.$fromUndo = true; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.action == "insert" || delta.action == "remove") { + this.doc.$safeApplyDelta(delta); } - return false; } - - if (typeof command === "string") - command = this.commands[command]; - - if (!command) - return false; - - if (editor && editor.$readOnly && !command.readOnly) - return false; - - if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) - return false; - - var e = {editor: editor, command: command, args: args}; - e.returnValue = this._emit("exec", e); - this._signal("afterExec", e); - - return e.returnValue === false ? false : true; + if (!dontSelect && this.$undoSelect) { + if (deltas.selectionAfter) + this.selection.fromJSON(deltas.selectionAfter); + else + this.selection.setRange(this.$getUndoSelection(deltas, false)); + } + this.$fromUndo = false; }; - - this.toggleRecording = function(editor) { - if (this.$inReplay) - return; - - editor && editor._emit("changeStatus"); - if (this.recording) { - this.macro.pop(); - this.off("exec", this.$addCommandToMacro); - - if (!this.macro.length) - this.macro = this.oldMacro; - - return this.recording = false; + EditSession.prototype.setUndoSelect = function (enable) { + this.$undoSelect = enable; + }; + EditSession.prototype.$getUndoSelection = function (deltas, isUndo) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; } - if (!this.$addCommandToMacro) { - this.$addCommandToMacro = function(e) { - this.macro.push([e.command, e.args]); - }.bind(this); + var range, point; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (!delta.start) + continue; // skip folds + if (!range) { + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + } + else { + range = Range.fromPoints(delta.start, delta.start); + } + continue; + } + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + } + else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + } } - - this.oldMacro = this.macro; - this.macro = []; - this.on("exec", this.$addCommandToMacro); - return this.recording = true; + return range; }; - - this.replay = function(editor) { - if (this.$inReplay || !this.macro) - return; - - if (this.recording) - return this.toggleRecording(editor); - - try { - this.$inReplay = true; - this.macro.forEach(function(x) { - if (typeof x == "string") - this.exec(x, editor); - else - this.exec(x[0], editor, x[1]); - }, this); - } finally { - this.$inReplay = false; + EditSession.prototype.replace = function (range, text) { + return this.doc.replace(range, text); + }; + EditSession.prototype.moveText = function (fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function (x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); } + return toRange; }; - - this.trimMacro = function(m) { - return m.map(function(x){ - if (typeof x[0] != "string") - x[0] = x[0].name; - if (!x[1]) - x = x[0]; - return x; - }); + EditSession.prototype.indentRows = function (startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row = startRow; row <= endRow; row++) + this.doc.insertInLine({ row: row, column: 0 }, indentString); }; - -}).call(CommandManager.prototype); - -exports.CommandManager = CommandManager; - -}); - -define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { -"use strict"; - -var lang = require("../lib/lang"); -var config = require("../config"); -var Range = require("../range").Range; - -function bindKey(win, mac) { - return {win: win, mac: mac}; -} -exports.commands = [{ - name: "showSettingsMenu", - description: "Show settings menu", - bindKey: bindKey("Ctrl-,", "Command-,"), - exec: function(editor) { - config.loadModule("ace/ext/settings_menu", function(module) { - module.init(editor); - editor.showSettingsMenu(); - }); - }, - readOnly: true -}, { - name: "goToNextError", - description: "Go to next error", - bindKey: bindKey("Alt-E", "F4"), - exec: function(editor) { - config.loadModule("./ext/error_marker", function(module) { - module.showErrorMarker(editor, 1); - }); - }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "goToPreviousError", - description: "Go to previous error", - bindKey: bindKey("Alt-Shift-E", "Shift-F4"), - exec: function(editor) { - config.loadModule("./ext/error_marker", function(module) { - module.showErrorMarker(editor, -1); - }); - }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "selectall", - description: "Select all", - bindKey: bindKey("Ctrl-A", "Command-A"), - exec: function(editor) { editor.selectAll(); }, - readOnly: true -}, { - name: "centerselection", - description: "Center selection", - bindKey: bindKey(null, "Ctrl-L"), - exec: function(editor) { editor.centerSelection(); }, - readOnly: true -}, { - name: "gotoline", - description: "Go to line...", - bindKey: bindKey("Ctrl-L", "Command-L"), - exec: function(editor, line) { - if (typeof line === "number" && !isNaN(line)) - editor.gotoLine(line); - editor.prompt({ $type: "gotoLine" }); - }, - readOnly: true -}, { - name: "fold", - bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), - exec: function(editor) { editor.session.toggleFold(false); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "unfold", - bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), - exec: function(editor) { editor.session.toggleFold(true); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "toggleFoldWidget", - description: "Toggle fold widget", - bindKey: bindKey("F2", "F2"), - exec: function(editor) { editor.session.toggleFoldWidget(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "toggleParentFoldWidget", - description: "Toggle parent fold widget", - bindKey: bindKey("Alt-F2", "Alt-F2"), - exec: function(editor) { editor.session.toggleFoldWidget(true); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "foldall", - description: "Fold all", - bindKey: bindKey(null, "Ctrl-Command-Option-0"), - exec: function(editor) { editor.session.foldAll(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "foldAllComments", - description: "Fold all comments", - bindKey: bindKey(null, "Ctrl-Command-Option-0"), - exec: function(editor) { editor.session.foldAllComments(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "foldOther", - description: "Fold other", - bindKey: bindKey("Alt-0", "Command-Option-0"), - exec: function(editor) { - editor.session.foldAll(); - editor.session.unfold(editor.selection.getAllRanges()); - }, - scrollIntoView: "center", - readOnly: true -}, { - name: "unfoldall", - description: "Unfold all", - bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), - exec: function(editor) { editor.session.unfold(); }, - scrollIntoView: "center", - readOnly: true -}, { - name: "findnext", - description: "Find next", - bindKey: bindKey("Ctrl-K", "Command-G"), - exec: function(editor) { editor.findNext(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "findprevious", - description: "Find previous", - bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), - exec: function(editor) { editor.findPrevious(); }, - multiSelectAction: "forEach", - scrollIntoView: "center", - readOnly: true -}, { - name: "selectOrFindNext", - description: "Select or find next", - bindKey: bindKey("Alt-K", "Ctrl-G"), - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - else - editor.findNext(); - }, - readOnly: true -}, { - name: "selectOrFindPrevious", - description: "Select or find previous", - bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - else - editor.findPrevious(); - }, - readOnly: true -}, { - name: "find", - description: "Find", - bindKey: bindKey("Ctrl-F", "Command-F"), - exec: function(editor) { - config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor);}); - }, - readOnly: true -}, { - name: "overwrite", - description: "Overwrite", - bindKey: "Insert", - exec: function(editor) { editor.toggleOverwrite(); }, - readOnly: true -}, { - name: "selecttostart", - description: "Select to start", - bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), - exec: function(editor) { editor.getSelection().selectFileStart(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "gotostart", - description: "Go to start", - bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), - exec: function(editor) { editor.navigateFileStart(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "selectup", - description: "Select up", - bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), - exec: function(editor) { editor.getSelection().selectUp(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "golineup", - description: "Go line up", - bindKey: bindKey("Up", "Up|Ctrl-P"), - exec: function(editor, args) { editor.navigateUp(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttoend", - description: "Select to end", - bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), - exec: function(editor) { editor.getSelection().selectFileEnd(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "gotoend", - description: "Go to end", - bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), - exec: function(editor) { editor.navigateFileEnd(); }, - multiSelectAction: "forEach", - readOnly: true, - scrollIntoView: "animate", - aceCommandGroup: "fileJump" -}, { - name: "selectdown", - description: "Select down", - bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), - exec: function(editor) { editor.getSelection().selectDown(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "golinedown", - description: "Go line down", - bindKey: bindKey("Down", "Down|Ctrl-N"), - exec: function(editor, args) { editor.navigateDown(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectwordleft", - description: "Select word left", - bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), - exec: function(editor) { editor.getSelection().selectWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotowordleft", - description: "Go to word left", - bindKey: bindKey("Ctrl-Left", "Option-Left"), - exec: function(editor) { editor.navigateWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttolinestart", - description: "Select to line start", - bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), - exec: function(editor) { editor.getSelection().selectLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotolinestart", - description: "Go to line start", - bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), - exec: function(editor) { editor.navigateLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectleft", - description: "Select left", - bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), - exec: function(editor) { editor.getSelection().selectLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotoleft", - description: "Go to left", - bindKey: bindKey("Left", "Left|Ctrl-B"), - exec: function(editor, args) { editor.navigateLeft(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectwordright", - description: "Select word right", - bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), - exec: function(editor) { editor.getSelection().selectWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotowordright", - description: "Go to word right", - bindKey: bindKey("Ctrl-Right", "Option-Right"), - exec: function(editor) { editor.navigateWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selecttolineend", - description: "Select to line end", - bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), - exec: function(editor) { editor.getSelection().selectLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotolineend", - description: "Go to line end", - bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), - exec: function(editor) { editor.navigateLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectright", - description: "Select right", - bindKey: bindKey("Shift-Right", "Shift-Right"), - exec: function(editor) { editor.getSelection().selectRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "gotoright", - description: "Go to right", - bindKey: bindKey("Right", "Right|Ctrl-F"), - exec: function(editor, args) { editor.navigateRight(args.times); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectpagedown", - description: "Select page down", - bindKey: "Shift-PageDown", - exec: function(editor) { editor.selectPageDown(); }, - readOnly: true -}, { - name: "pagedown", - description: "Page down", - bindKey: bindKey(null, "Option-PageDown"), - exec: function(editor) { editor.scrollPageDown(); }, - readOnly: true -}, { - name: "gotopagedown", - description: "Go to page down", - bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), - exec: function(editor) { editor.gotoPageDown(); }, - readOnly: true -}, { - name: "selectpageup", - description: "Select page up", - bindKey: "Shift-PageUp", - exec: function(editor) { editor.selectPageUp(); }, - readOnly: true -}, { - name: "pageup", - description: "Page up", - bindKey: bindKey(null, "Option-PageUp"), - exec: function(editor) { editor.scrollPageUp(); }, - readOnly: true -}, { - name: "gotopageup", - description: "Go to page up", - bindKey: "PageUp", - exec: function(editor) { editor.gotoPageUp(); }, - readOnly: true -}, { - name: "scrollup", - description: "Scroll up", - bindKey: bindKey("Ctrl-Up", null), - exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, - readOnly: true -}, { - name: "scrolldown", - description: "Scroll down", - bindKey: bindKey("Ctrl-Down", null), - exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, - readOnly: true -}, { - name: "selectlinestart", - description: "Select line start", - bindKey: "Shift-Home", - exec: function(editor) { editor.getSelection().selectLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectlineend", - description: "Select line end", - bindKey: "Shift-End", - exec: function(editor) { editor.getSelection().selectLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "togglerecording", - description: "Toggle recording", - bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), - exec: function(editor) { editor.commands.toggleRecording(editor); }, - readOnly: true -}, { - name: "replaymacro", - description: "Replay macro", - bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), - exec: function(editor) { editor.commands.replay(editor); }, - readOnly: true -}, { - name: "jumptomatching", - description: "Jump to matching", - bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), - exec: function(editor) { editor.jumpToMatching(); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "selecttomatching", - description: "Select to matching", - bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), - exec: function(editor) { editor.jumpToMatching(true); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "expandToMatching", - description: "Expand to matching", - bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), - exec: function(editor) { editor.jumpToMatching(true, true); }, - multiSelectAction: "forEach", - scrollIntoView: "animate", - readOnly: true -}, { - name: "passKeysToBrowser", - description: "Pass keys to browser", - bindKey: bindKey(null, null), - exec: function() {}, - passEvent: true, - readOnly: true -}, { - name: "copy", - description: "Copy", - exec: function(editor) { - }, - readOnly: true -}, -{ - name: "cut", - description: "Cut", - exec: function(editor) { - var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); - var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); - editor._emit("cut", range); - - if (!range.isEmpty()) - editor.session.remove(range); - editor.clearSelection(); - }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "paste", - description: "Paste", - exec: function(editor, args) { - editor.$handlePaste(args); - }, - scrollIntoView: "cursor" -}, { - name: "removeline", - description: "Remove line", - bindKey: bindKey("Ctrl-D", "Command-D"), - exec: function(editor) { editor.removeLines(); }, - scrollIntoView: "cursor", - multiSelectAction: "forEachLine" -}, { - name: "duplicateSelection", - description: "Duplicate selection", - bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), - exec: function(editor) { editor.duplicateSelection(); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "sortlines", - description: "Sort lines", - bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), - exec: function(editor) { editor.sortLines(); }, - scrollIntoView: "selection", - multiSelectAction: "forEachLine" -}, { - name: "togglecomment", - description: "Toggle comment", - bindKey: bindKey("Ctrl-/", "Command-/"), - exec: function(editor) { editor.toggleCommentLines(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "toggleBlockComment", - description: "Toggle block comment", - bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), - exec: function(editor) { editor.toggleBlockComment(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "modifyNumberUp", - description: "Modify number up", - bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), - exec: function(editor) { editor.modifyNumber(1); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "modifyNumberDown", - description: "Modify number down", - bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), - exec: function(editor) { editor.modifyNumber(-1); }, - scrollIntoView: "cursor", - multiSelectAction: "forEach" -}, { - name: "replace", - description: "Replace", - bindKey: bindKey("Ctrl-H", "Command-Option-F"), - exec: function(editor) { - config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true);}); - } -}, { - name: "undo", - description: "Undo", - bindKey: bindKey("Ctrl-Z", "Command-Z"), - exec: function(editor) { editor.undo(); } -}, { - name: "redo", - description: "Redo", - bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), - exec: function(editor) { editor.redo(); } -}, { - name: "copylinesup", - description: "Copy lines up", - bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), - exec: function(editor) { editor.copyLinesUp(); }, - scrollIntoView: "cursor" -}, { - name: "movelinesup", - description: "Move lines up", - bindKey: bindKey("Alt-Up", "Option-Up"), - exec: function(editor) { editor.moveLinesUp(); }, - scrollIntoView: "cursor" -}, { - name: "copylinesdown", - description: "Copy lines down", - bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), - exec: function(editor) { editor.copyLinesDown(); }, - scrollIntoView: "cursor" -}, { - name: "movelinesdown", - description: "Move lines down", - bindKey: bindKey("Alt-Down", "Option-Down"), - exec: function(editor) { editor.moveLinesDown(); }, - scrollIntoView: "cursor" -}, { - name: "del", - description: "Delete", - bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), - exec: function(editor) { editor.remove("right"); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "backspace", - description: "Backspace", - bindKey: bindKey( - "Shift-Backspace|Backspace", - "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" - ), - exec: function(editor) { editor.remove("left"); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "cut_or_delete", - description: "Cut or delete", - bindKey: bindKey("Shift-Delete", null), - exec: function(editor) { - if (editor.selection.isEmpty()) { - editor.remove("left"); - } else { - return false; - } - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolinestart", - description: "Remove to line start", - bindKey: bindKey("Alt-Backspace", "Command-Backspace"), - exec: function(editor) { editor.removeToLineStart(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolineend", - description: "Remove to line end", - bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), - exec: function(editor) { editor.removeToLineEnd(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolinestarthard", - description: "Remove to line start hard", - bindKey: bindKey("Ctrl-Shift-Backspace", null), - exec: function(editor) { - var range = editor.selection.getRange(); - range.start.column = 0; - editor.session.remove(range); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removetolineendhard", - description: "Remove to line end hard", - bindKey: bindKey("Ctrl-Shift-Delete", null), - exec: function(editor) { - var range = editor.selection.getRange(); - range.end.column = Number.MAX_VALUE; - editor.session.remove(range); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removewordleft", - description: "Remove word left", - bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), - exec: function(editor) { editor.removeWordLeft(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "removewordright", - description: "Remove word right", - bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), - exec: function(editor) { editor.removeWordRight(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "outdent", - description: "Outdent", - bindKey: bindKey("Shift-Tab", "Shift-Tab"), - exec: function(editor) { editor.blockOutdent(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "indent", - description: "Indent", - bindKey: bindKey("Tab", "Tab"), - exec: function(editor) { editor.indent(); }, - multiSelectAction: "forEach", - scrollIntoView: "selectionPart" -}, { - name: "blockoutdent", - description: "Block outdent", - bindKey: bindKey("Ctrl-[", "Ctrl-["), - exec: function(editor) { editor.blockOutdent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "blockindent", - description: "Block indent", - bindKey: bindKey("Ctrl-]", "Ctrl-]"), - exec: function(editor) { editor.blockIndent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "selectionPart" -}, { - name: "insertstring", - description: "Insert string", - exec: function(editor, str) { editor.insert(str); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "inserttext", - description: "Insert text", - exec: function(editor, args) { - editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "splitline", - description: "Split line", - bindKey: bindKey(null, "Ctrl-O"), - exec: function(editor) { editor.splitLine(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "transposeletters", - description: "Transpose letters", - bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), - exec: function(editor) { editor.transposeLetters(); }, - multiSelectAction: function(editor) {editor.transposeSelections(1); }, - scrollIntoView: "cursor" -}, { - name: "touppercase", - description: "To uppercase", - bindKey: bindKey("Ctrl-U", "Ctrl-U"), - exec: function(editor) { editor.toUpperCase(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "tolowercase", - description: "To lowercase", - bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), - exec: function(editor) { editor.toLowerCase(); }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "autoindent", - description: "Auto Indent", - bindKey: bindKey(null, null), - exec: function(editor) { editor.autoIndent(); }, - multiSelectAction: "forEachLine", - scrollIntoView: "animate" -}, { - name: "expandtoline", - description: "Expand to line", - bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), - exec: function(editor) { - var range = editor.selection.getRange(); - - range.start.column = range.end.column = 0; - range.end.row++; - editor.selection.setRange(range, false); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "joinlines", - description: "Join lines", - bindKey: bindKey(null, null), - exec: function(editor) { - var isBackwards = editor.selection.isBackwards(); - var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); - var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); - var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; - var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); - var selectedCount = selectedText.replace(/\n\s*/, " ").length; - var insertLine = editor.session.doc.getLine(selectionStart.row); - - for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { - var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); - if (curLine.length !== 0) { - curLine = " " + curLine; + EditSession.prototype.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } + else { + deleteRange.start.column = 0; + deleteRange.end.column = j; } - insertLine += curLine; + this.remove(deleteRange); } - - if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { - insertLine += editor.session.doc.getNewLineCharacter(); + }; + EditSession.prototype.$moveLines = function (firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) + return 0; + var diff = row - firstRow; } - - editor.clearSelection(); - editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); - - if (selectedCount > 0) { - editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); - editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); - } else { - firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; - editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength() - 1) + return 0; + var diff = row - lastRow; } - }, - multiSelectAction: "forEach", - readOnly: true -}, { - name: "invertSelection", - description: "Invert selection", - bindKey: bindKey(null, null), - exec: function(editor) { - var endRow = editor.session.doc.getLength() - 1; - var endCol = editor.session.doc.getLine(endRow).length; - var ranges = editor.selection.rangeList.ranges; - var newRanges = []; - if (ranges.length < 1) { - ranges = [editor.selection.getRange()]; + else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; } - - for (var i = 0; i < ranges.length; i++) { - if (i == (ranges.length - 1)) { - if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { - newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); - } + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function (x) { + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow + diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + EditSession.prototype.moveLinesUp = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + EditSession.prototype.moveLinesDown = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + EditSession.prototype.duplicateLines = function (firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + EditSession.prototype.$clipRowToDocument = function (row) { + return Math.max(0, Math.min(row, this.doc.getLength() - 1)); + }; + EditSession.prototype.$clipColumnToRow = function (row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + EditSession.prototype.$clipPositionToDocument = function (row, column) { + column = Math.max(0, column); + if (row < 0) { + row = 0; + column = 0; + } + else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len - 1).length; } - - if (i === 0) { - if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { - newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); - } - } else { - newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + else { + column = Math.min(this.doc.getLine(row).length, column); } } - - editor.exitMultiSelectMode(); - editor.clearSelection(); - - for(var i = 0; i < newRanges.length; i++) { - editor.selection.addRange(newRanges[i], false); + return { + row: row, + column: column + }; + }; + EditSession.prototype.$clipRangeToDocument = function (range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; } - }, - readOnly: true, - scrollIntoView: "none" -}, { - name: "addLineAfter", - description: "Add new line after the current line", - exec: function(editor) { - editor.selection.clearSelection(); - editor.navigateLineEnd(); - editor.insert("\n"); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "addLineBefore", - description: "Add new line before the current line", - exec: function(editor) { - editor.selection.clearSelection(); - var cursor = editor.getCursorPosition(); - editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); - editor.insert("\n"); - if (cursor.row === 0) editor.navigateUp(); - }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "openCommandPallete", - description: "Open command pallete", - bindKey: bindKey("F1", "F1"), - exec: function(editor) { - editor.prompt({ $type: "commands" }); - }, - readOnly: true -}, { - name: "modeSelect", - description: "Change language mode...", - bindKey: bindKey(null, null), - exec: function(editor) { - editor.prompt({ $type: "modes" }); - }, - readOnly: true -}]; - -for (var i = 1; i < 9; i++) { - exports.commands.push({ - name: "foldToLevel" + i, - description: "Fold To Level " + i, - level: i, - exec: function(editor) { editor.session.foldToLevel(this.level); }, - scrollIntoView: "center", - readOnly: true - }); -} - -}); - -define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/clipboard"], function(require, exports, module) { -"use strict"; - -require("./lib/fixoldbrowsers"); - -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); -var lang = require("./lib/lang"); -var useragent = require("./lib/useragent"); -var TextInput = require("./keyboard/textinput").TextInput; -var MouseHandler = require("./mouse/mouse_handler").MouseHandler; -var FoldHandler = require("./mouse/fold_handler").FoldHandler; -var KeyBinding = require("./keyboard/keybinding").KeyBinding; -var EditSession = require("./edit_session").EditSession; -var Search = require("./search").Search; -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var CommandManager = require("./commands/command_manager").CommandManager; -var defaultCommands = require("./commands/default_commands").commands; -var config = require("./config"); -var TokenIterator = require("./token_iterator").TokenIterator; - -var clipboard = require("./clipboard"); -var Editor = function(renderer, session, options) { - this.$toDestroy = []; - var container = renderer.getContainerElement(); - this.container = container; - this.renderer = renderer; - this.id = "editor" + (++Editor.$uid); - - this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); - if (typeof document == "object") { - this.textInput = new TextInput(renderer.getTextAreaContainer(), this); - this.renderer.textarea = this.textInput.getElement(); - this.$mouseHandler = new MouseHandler(this); - new FoldHandler(this); - } - - this.keyBinding = new KeyBinding(this); - - this.$search = new Search().set({ - wrap: true - }); - - this.$historyTracker = this.$historyTracker.bind(this); - this.commands.on("exec", this.$historyTracker); - - this.$initOperationListeners(); - - this._$emitInputEvent = lang.delayedCall(function() { - this._signal("input", {}); - if (this.session && !this.session.destroyed) - this.session.bgTokenizer.scheduleStart(); - }.bind(this)); - - this.on("change", function(_, _self) { - _self._$emitInputEvent.schedule(31); - }); - - this.setSession(session || options && options.session || new EditSession("")); - config.resetOptions(this); - if (options) - this.setOptions(options); - config._signal("editor", this); -}; - -Editor.$uid = 0; - -(function(){ - - oop.implement(this, EventEmitter); - - this.$initOperationListeners = function() { - this.commands.on("exec", this.startOperation.bind(this), true); - this.commands.on("afterExec", this.endOperation.bind(this), true); - - this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true)); - this.on("change", function() { - if (!this.curOp) { - this.startOperation(); - this.curOp.selectionBefore = this.$lastSel; - } - this.curOp.docChanged = true; - }.bind(this), true); - - this.on("changeSelection", function() { - if (!this.curOp) { - this.startOperation(); - this.curOp.selectionBefore = this.$lastSel; - } - this.curOp.selectionChanged = true; - }.bind(this), true); - }; - - this.curOp = null; - this.prevOp = {}; - this.startOperation = function(commandEvent) { - if (this.curOp) { - if (!commandEvent || this.curOp.command) - return; - this.prevOp = this.curOp; + else { + range.start.column = this.$clipColumnToRow(range.start.row, range.start.column); } - if (!commandEvent) { - this.previousCommand = null; - commandEvent = {}; + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; } - - this.$opResetTimer.schedule(); - this.curOp = this.session.curOp = { - command: commandEvent.command || {}, - args: commandEvent.args, - scrollTop: this.renderer.scrollTop - }; - this.curOp.selectionBefore = this.selection.toJSON(); + else { + range.end.column = this.$clipColumnToRow(range.end.row, range.end.column); + } + return range; }; - - this.endOperation = function(e) { - if (this.curOp && this.session) { - if (e && e.returnValue === false || !this.session) - return (this.curOp = null); - if (e == true && this.curOp.command && this.curOp.command.name == "mouse") - return; - this._signal("beforeEndOperation"); - if (!this.curOp) return; - var command = this.curOp.command; - var scrollIntoView = command && command.scrollIntoView; - if (scrollIntoView) { - switch (scrollIntoView) { - case "center-animate": - scrollIntoView = "animate"; - case "center": - this.renderer.scrollCursorIntoView(null, 0.5); - break; - case "animate": - case "cursor": - this.renderer.scrollCursorIntoView(); - break; - case "selectionPart": - var range = this.selection.getRange(); - var config = this.renderer.layerConfig; - if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { - this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); - } - break; - default: - break; - } - if (scrollIntoView == "animate") - this.renderer.animateScrolling(this.curOp.scrollTop); + EditSession.prototype.setUseWrapMode = function (useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); } - var sel = this.selection.toJSON(); - this.curOp.selectionAfter = sel; - this.$lastSel = this.selection.toJSON(); - this.session.getUndoManager().addSelection(sel); - this.prevOp = this.curOp; - this.curOp = null; + this._signal("changeWrapMode"); } }; - this.$mergeableCommands = ["backspace", "del", "insertstring"]; - this.$historyTracker = function(e) { - if (!this.$mergeUndoDeltas) - return; - - var prev = this.prevOp; - var mergeableCommands = this.$mergeableCommands; - var shouldMerge = prev.command && (e.command.name == prev.command.name); - if (e.command.name == "insertstring") { - var text = e.args; - if (this.mergeNextCommand === undefined) - this.mergeNextCommand = true; - - shouldMerge = shouldMerge - && this.mergeNextCommand // previous command allows to coalesce with - && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type - - this.mergeNextCommand = true; - } else { - shouldMerge = shouldMerge - && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable - } - - if ( - this.$mergeUndoDeltas != "always" - && Date.now() - this.sequenceStartTime > 2000 - ) { - shouldMerge = false; // the sequence is too long + EditSession.prototype.getUseWrapMode = function () { + return this.$useWrapMode; + }; + EditSession.prototype.setWrapLimitRange = function (min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + this.$bidiHandler.markAsDirty(); + if (this.$useWrapMode) + this._signal("changeWrapMode"); } - - if (shouldMerge) - this.session.mergeUndoDeltas = true; - else if (mergeableCommands.indexOf(e.command.name) !== -1) - this.sequenceStartTime = Date.now(); }; - this.setKeyboardHandler = function(keyboardHandler, cb) { - if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { - this.$keybindingId = keyboardHandler; - var _self = this; - config.loadModule(["keybinding", keyboardHandler], function(module) { - if (_self.$keybindingId == keyboardHandler) - _self.keyBinding.setKeyboardHandler(module && module.handler); - cb && cb(); - }); - } else { - this.$keybindingId = null; - this.keyBinding.setKeyboardHandler(keyboardHandler); - cb && cb(); + EditSession.prototype.adjustWrapLimit = function (desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = { min: $printMargin, max: $printMargin }; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; } + return false; }; - this.getKeyboardHandler = function() { - return this.keyBinding.getKeyboardHandler(); + EditSession.prototype.$constrainWrapLimit = function (wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + if (max) + wrapLimit = Math.min(max, wrapLimit); + return wrapLimit; }; - this.setSession = function(session) { - if (this.session == session) - return; - if (this.curOp) this.endOperation(); - this.curOp = {}; - - var oldSession = this.session; - if (oldSession) { - this.session.off("change", this.$onDocumentChange); - this.session.off("changeMode", this.$onChangeMode); - this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); - this.session.off("changeTabSize", this.$onChangeTabSize); - this.session.off("changeWrapLimit", this.$onChangeWrapLimit); - this.session.off("changeWrapMode", this.$onChangeWrapMode); - this.session.off("changeFold", this.$onChangeFold); - this.session.off("changeFrontMarker", this.$onChangeFrontMarker); - this.session.off("changeBackMarker", this.$onChangeBackMarker); - this.session.off("changeBreakpoint", this.$onChangeBreakpoint); - this.session.off("changeAnnotation", this.$onChangeAnnotation); - this.session.off("changeOverwrite", this.$onCursorChange); - this.session.off("changeScrollTop", this.$onScrollTopChange); - this.session.off("changeScrollLeft", this.$onScrollLeftChange); - - var selection = this.session.getSelection(); - selection.off("changeCursor", this.$onCursorChange); - selection.off("changeSelection", this.$onSelectionChange); - } - - this.session = session; - if (session) { - this.$onDocumentChange = this.onDocumentChange.bind(this); - session.on("change", this.$onDocumentChange); - this.renderer.setSession(session); - - this.$onChangeMode = this.onChangeMode.bind(this); - session.on("changeMode", this.$onChangeMode); - - this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); - session.on("tokenizerUpdate", this.$onTokenizerUpdate); - - this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); - session.on("changeTabSize", this.$onChangeTabSize); - - this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); - session.on("changeWrapLimit", this.$onChangeWrapLimit); - - this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); - session.on("changeWrapMode", this.$onChangeWrapMode); - - this.$onChangeFold = this.onChangeFold.bind(this); - session.on("changeFold", this.$onChangeFold); - - this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); - this.session.on("changeFrontMarker", this.$onChangeFrontMarker); - - this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); - this.session.on("changeBackMarker", this.$onChangeBackMarker); - - this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); - this.session.on("changeBreakpoint", this.$onChangeBreakpoint); - - this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); - this.session.on("changeAnnotation", this.$onChangeAnnotation); - - this.$onCursorChange = this.onCursorChange.bind(this); - this.session.on("changeOverwrite", this.$onCursorChange); - - this.$onScrollTopChange = this.onScrollTopChange.bind(this); - this.session.on("changeScrollTop", this.$onScrollTopChange); - - this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); - this.session.on("changeScrollLeft", this.$onScrollLeftChange); - - this.selection = session.getSelection(); - this.selection.on("changeCursor", this.$onCursorChange); - - this.$onSelectionChange = this.onSelectionChange.bind(this); - this.selection.on("changeSelection", this.$onSelectionChange); - - this.onChangeMode(); - - this.onCursorChange(); - - this.onScrollTopChange(); - this.onScrollLeftChange(); - this.onSelectionChange(); - this.onChangeFrontMarker(); - this.onChangeBackMarker(); - this.onChangeBreakpoint(); - this.onChangeAnnotation(); - this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); - this.renderer.updateFull(); - } else { - this.selection = null; - this.renderer.setSession(session); - } - - this._signal("changeSession", { - session: session, - oldSession: oldSession - }); - - this.curOp = null; - - oldSession && oldSession._signal("changeEditor", {oldEditor: this}); - session && session._signal("changeEditor", {editor: this}); - - if (session && !session.destroyed) - session.bgTokenizer.scheduleStart(); - }; - this.getSession = function() { - return this.session; - }; - this.setValue = function(val, cursorPos) { - this.session.doc.setValue(val); - - if (!cursorPos) - this.selectAll(); - else if (cursorPos == 1) - this.navigateFileEnd(); - else if (cursorPos == -1) - this.navigateFileStart(); - - return val; - }; - this.getValue = function() { - return this.session.getValue(); - }; - this.getSelection = function() { - return this.selection; - }; - this.resize = function(force) { - this.renderer.onResize(force); - }; - this.setTheme = function(theme, cb) { - this.renderer.setTheme(theme, cb); - }; - this.getTheme = function() { - return this.renderer.getTheme(); - }; - this.setStyle = function(style) { - this.renderer.setStyle(style); - }; - this.unsetStyle = function(style) { - this.renderer.unsetStyle(style); + EditSession.prototype.getWrapLimit = function () { + return this.$wrapLimit; }; - this.getFontSize = function () { - return this.getOption("fontSize") || - dom.computedStyle(this.container).fontSize; + EditSession.prototype.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); }; - this.setFontSize = function(size) { - this.setOption("fontSize", size); + EditSession.prototype.getWrapLimitRange = function () { + return { + min: this.$wrapLimitRange.min, + max: this.$wrapLimitRange.max + }; }; - - this.$highlightBrackets = function() { - if (this.$highlightPending) { - return; - } - var self = this; - this.$highlightPending = true; - setTimeout(function () { - self.$highlightPending = false; - var session = self.session; - if (!session || session.destroyed) return; - if (session.$bracketHighlight) { - session.$bracketHighlight.markerIds.forEach(function(id) { - session.removeMarker(id); - }); - session.$bracketHighlight = null; + EditSession.prototype.$updateInternalDataOnChange = function (delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + lastRow = firstRow; } - var ranges = session.getMatchingBracketRanges(self.getCursorPosition()); - if (!ranges && session.$mode.getMatching) - ranges = session.$mode.getMatching(self.session); - if (!ranges) - return; - - var markerType = "ace_bracket"; - if (!Array.isArray(ranges)) { - ranges = [ranges]; - } else if (ranges.length == 1) { - markerType = "ace_error_bracket"; + else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache; + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } + else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } } - if (ranges.length == 2) { - if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) - ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; - else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) - ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + len = -len; } - - session.$bracketHighlight = { - ranges: ranges, - markerIds: ranges.map(function(range) { - return session.addMarker(range, markerType, "text"); - }) - }; - }, 50); - }; - this.$highlightTags = function() { - if (this.$highlightTagPending) - return; - var self = this; - this.$highlightTagPending = true; - setTimeout(function() { - self.$highlightTagPending = false; - - var session = self.session; - if (!session || session.destroyed) return; - - var pos = self.getCursorPosition(); - var iterator = new TokenIterator(self.session, pos.row, pos.column); - var token = iterator.getCurrentToken(); - - if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - return; + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); } - - if (token.type.indexOf("tag-open") !== -1) { - token = iterator.stepForward(); - if (!token) - return; + } + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + return removedFolds; + }; + EditSession.prototype.$updateRowLengthCache = function (firstRow, lastRow) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + EditSession.prototype.$updateWrapData = function (firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row++; } - - var tag = token.value; - var currentTag = token.value; - var depth = 0; - var prevToken = iterator.stepBackward(); - - if (prevToken.value === '<'){ - do { - prevToken = token; - token = iterator.stepForward(); - - if (token) { - if (token.type.indexOf('tag-name') !== -1) { - currentTag = token.value; - if (tag === currentTag) { - if (prevToken.value === '<') { - depth++; - } else if (prevToken.value === '') { // self closing tag - depth--; + else { + tokens = []; + foldLine.walk(function (placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens(placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; } } - - } while (token && depth >= 0); - } else { - do { - token = prevToken; - prevToken = iterator.stepBackward(); - - if (token) { - if (token.type.indexOf('tag-name') !== -1) { - if (tag === token.value) { - if (prevToken.value === '<') { - depth++; - } else if (prevToken.value === '') { // self closing tag - var stepCount = 0; - var tmpToken = prevToken; - while (tmpToken) { - if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) { - depth--; - break; - } else if (tmpToken.value === '<') { - break; - } - tmpToken = iterator.stepBackward(); - stepCount++; - } - for (var i = 0; i < stepCount; i++) { - iterator.stepForward(); - } - } + else { + walkTokens = this.$getDisplayTokens(lines[row].substring(lastColumn, column), tokens.length); } - } while (prevToken && depth <= 0); - iterator.stepForward(); - } - - if (!token) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - return; + tokens = tokens.concat(walkTokens); + }.bind(this), foldLine.end.row, lines[foldLine.end.row].length + 1); + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; } - - var row = iterator.getCurrentTokenRow(); - var column = iterator.getCurrentTokenColumn(); - var range = new Range(row, column, row, column+token.value.length); - var sbm = session.$backMarkers[session.$tagHighlight]; - if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - } - - if (!session.$tagHighlight) - session.$tagHighlight = session.addMarker(range, "ace_bracket", "text"); - }, 50); - }; - this.focus = function() { - this.textInput.focus(); - }; - this.isFocused = function() { - return this.textInput.isFocused(); - }; - this.blur = function() { - this.textInput.blur(); - }; - this.onFocus = function(e) { - if (this.$isFocused) - return; - this.$isFocused = true; - this.renderer.showCursor(); - this.renderer.visualizeFocus(); - this._emit("focus", e); - }; - this.onBlur = function(e) { - if (!this.$isFocused) - return; - this.$isFocused = false; - this.renderer.hideCursor(); - this.renderer.visualizeBlur(); - this._emit("blur", e); - }; - - this.$cursorChange = function() { - this.renderer.updateCursor(); - this.$highlightBrackets(); - this.$highlightTags(); - this.$updateHighlightActiveLine(); + } }; - this.onDocumentChange = function(delta) { - var wrap = this.session.$useWrapMode; - var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); - this.renderer.updateLines(delta.start.row, lastRow, wrap); - - this._signal("change", delta); - this.$cursorChange(); - }; - - this.onTokenizerUpdate = function(e) { - var rows = e.data; - this.renderer.updateLines(rows.first, rows.last); + EditSession.prototype.$computeWrapSplits = function (tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + var isCode = this.$wrapAsCode; + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var len = screenPos - lastSplit; + for (var i = lastSplit; i < screenPos; i++) { + var ch = tokens[i]; + if (ch === 12 || ch === 2) + len -= 1; + } + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit - (wrapLimit >> 2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split--; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split--; + } + } + else { + while (split > minSplit && tokens[split] < SPACE) { + split--; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; }; - - - this.onScrollTopChange = function() { - this.renderer.scrollToY(this.session.getScrollTop()); + EditSession.prototype.$getDisplayTokens = function (str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } + else if ((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } + else { + arr.push(CHAR); + } + } + return arr; }; - - this.onScrollLeftChange = function() { - this.renderer.scrollToX(this.session.getScrollLeft()); + EditSession.prototype.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } + else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; }; - this.onCursorChange = function() { - this.$cursorChange(); - this._signal("changeSelection"); + EditSession.prototype.getRowLength = function (row) { + var h = 1; + if (this.lineWidgets) + h += this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + if (!this.$useWrapMode || !this.$wrapData[row]) + return h; + else + return this.$wrapData[row].length + h; }; - - this.$updateHighlightActiveLine = function() { - var session = this.getSession(); - - var highlight; - if (this.$highlightActiveLine) { - if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) - highlight = this.getCursorPosition(); - if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) - highlight = false; - if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) - highlight = false; + EditSession.prototype.getRowLineCount = function (row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; } - - if (session.$highlightLineMarker && !highlight) { - session.removeMarker(session.$highlightLineMarker.id); - session.$highlightLineMarker = null; - } else if (!session.$highlightLineMarker && highlight) { - var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); - range.id = session.addMarker(range, "ace_active-line", "screenLine"); - session.$highlightLineMarker = range; - } else if (highlight) { - session.$highlightLineMarker.start.row = highlight.row; - session.$highlightLineMarker.end.row = highlight.row; - session.$highlightLineMarker.start.column = highlight.column; - session._signal("changeBackMarker"); + else { + return this.$wrapData[row].length + 1; } }; - - this.onSelectionChange = function(e) { - var session = this.session; - - if (session.$selectionMarker) { - session.removeMarker(session.$selectionMarker); + EditSession.prototype.getRowWrapIndent = function (screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; } - session.$selectionMarker = null; - - if (!this.selection.isEmpty()) { - var range = this.selection.getRange(); - var style = this.getSelectionStyle(); - session.$selectionMarker = session.addMarker(range, "ace_selection", style); - } else { - this.$updateHighlightActiveLine(); + else { + return 0; } - - var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); - this.session.highlight(re); - - this._signal("changeSelection"); }; - - this.$getSelectionHighLightRegexp = function() { - var session = this.session; - - var selection = this.getSelectionRange(); - if (selection.isEmpty() || selection.isMultiLine()) - return; - - var startColumn = selection.start.column; - var endColumn = selection.end.column; - var line = session.getLine(selection.start.row); - - var needle = line.substring(startColumn, endColumn); - if (needle.length > 5000 || !/[\w\d]/.test(needle)) - return; - - var re = this.$search.$assembleRegExp({ - wholeWord: true, - caseSensitive: true, - needle: needle - }); - - var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); - if (!re.test(wordWithBoundary)) - return; - - return re; + EditSession.prototype.getScreenLastRowColumn = function (screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); }; - - - this.onChangeFrontMarker = function() { - this.renderer.updateFrontMarkers(); + EditSession.prototype.getDocumentLastRowColumn = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); }; - - this.onChangeBackMarker = function() { - this.renderer.updateBackMarkers(); + EditSession.prototype.getDocumentLastRowColumnPosition = function (docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); }; - - - this.onChangeBreakpoint = function() { - this.renderer.updateBreakpoints(); + EditSession.prototype.getRowSplitData = function (row) { + if (!this.$useWrapMode) { + return undefined; + } + else { + return this.$wrapData[row]; + } }; - - this.onChangeAnnotation = function() { - this.renderer.setAnnotations(this.session.getAnnotations()); - }; - - - this.onChangeMode = function(e) { - this.renderer.updateText(); - this._emit("changeMode", e); - }; - - - this.onChangeWrapLimit = function() { - this.renderer.updateFull(); - }; - - this.onChangeWrapMode = function() { - this.renderer.onResize(true); + EditSession.prototype.getScreenTabSize = function (screenColumn) { + return this.$tabSize - (screenColumn % this.$tabSize | 0); }; - - - this.onChangeFold = function() { - this.$updateHighlightActiveLine(); - this.renderer.updateFull(); + EditSession.prototype.screenToDocumentRow = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; }; - this.getSelectedText = function() { - return this.session.getTextRange(this.getSelectionRange()); + EditSession.prototype.screenToDocumentColumn = function (screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; }; - this.getCopyText = function() { - var text = this.getSelectedText(); - var nl = this.session.doc.getNewLineCharacter(); - var copyLine= false; - if (!text && this.$copyWithEmptySelection) { - copyLine = true; - var ranges = this.selection.getAllRanges(); - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (i && ranges[i - 1].start.row == range.start.row) - continue; - text += this.session.getLine(range.start.row) + nl; - } + EditSession.prototype.screenToDocumentPosition = function (screenRow, screenColumn, offsetX) { + if (screenRow < 0) + return { row: 0, column: 0 }; + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; } - var e = {text: text}; - this._signal("copy", e); - clipboard.lineMode = copyLine ? e.text : false; - return e.text; - }; - this.onCopy = function() { - this.commands.exec("copy", this); - }; - this.onCut = function() { - this.commands.exec("cut", this); - }; - this.onPaste = function(text, event) { - var e = {text: text, event: event}; - this.commands.exec("paste", this, e); - }; - - this.$handlePaste = function(e) { - if (typeof e == "string") - e = {text: e}; - this._signal("paste", e); - var text = e.text; - - var lineMode = text === clipboard.lineMode; - var session = this.session; - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { - if (lineMode) - session.insert({ row: this.selection.lead.row, column: 0 }, text); - else - this.insert(text); - } else if (lineMode) { - this.selection.rangeList.ranges.forEach(function(range) { - session.insert({ row: range.start.row, column: 0 }, text); - }); - } else { - var lines = text.split(/\r\n|\r|\n/); - var ranges = this.selection.rangeList.ranges; - - var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); - if (lines.length != ranges.length || isFullLine) - return this.commands.exec("insertstring", this, text); - - for (var i = ranges.length; i--;) { - var range = ranges[i]; - if (!range.isEmpty()) - session.remove(range); - - session.insert(range.start, lines[i]); - } + else { + var doCache = !l; } - }; - - this.execCommand = function(command, args) { - return this.commands.exec(command, this, args); - }; - this.insert = function(text, pasted) { - var session = this.session; - var mode = session.getMode(); - var cursor = this.getCursorPosition(); - - if (this.getBehavioursEnabled() && !pasted) { - var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); - if (transform) { - if (text !== transform.text) { - if (!this.inVirtualSelectionMode) { - this.session.mergeUndoDeltas = false; - this.mergeNextCommand = false; - } + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } + else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row + 1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; } - text = transform.text; - } - } - - if (text == "\t") - text = this.session.getTabString(); - if (!this.selection.isEmpty()) { - var range = this.getSelectionRange(); - cursor = this.session.remove(range); - this.clearSelection(); - } - else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { - var range = new Range.fromPoints(cursor, cursor); - range.end.column += text.length; - this.session.remove(range); - } - - if (text == "\n" || text == "\r\n") { - var line = session.getLine(cursor.row); - if (cursor.column > line.search(/\S|$/)) { - var d = line.substr(cursor.column).search(/\S|$/); - session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); } } - this.clearSelection(); - - var start = cursor.column; - var lineState = session.getState(cursor.row); - var line = session.getLine(cursor.row); - var shouldOutdent = mode.checkOutdent(lineState, line, text); - session.insert(cursor, text); - - if (transform && transform.selection) { - if (transform.selection.length == 2) { // Transform relative to the current column - this.selection.setSelectionRange( - new Range(cursor.row, start + transform.selection[0], - cursor.row, start + transform.selection[1])); - } else { // Transform relative to the current row. - this.selection.setSelectionRange( - new Range(cursor.row + transform.selection[0], - transform.selection[1], - cursor.row + transform.selection[2], - transform.selection[3])); - } + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; } - if (this.$enableAutoIndent) { - if (session.getDocument().isNewLine(text)) { - var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); - - session.insert({row: cursor.row+1, column: 0}, lineIndent); - } - if (shouldOutdent) - mode.autoOutdent(lineState, session, cursor.row); + else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; } - }; - - this.autoIndent = function () { - var session = this.session; - var mode = session.getMode(); - - var startRow, endRow; - if (this.selection.isEmpty()) { - startRow = 0; - endRow = session.doc.getLength() - 1; - } else { - var selectedRange = this.getSelectionRange(); - - startRow = selectedRange.start.row; - endRow = selectedRange.end.row; + else { + line = this.getLine(docRow); + foldLine = null; } - - var prevLineState = ""; - var prevLine = ""; - var lineIndent = ""; - var line, currIndent, range; - var tab = session.getTabString(); - - for (var row = startRow; row <= endRow; row++) { - if (row > 0) { - prevLineState = session.getState(row - 1); - prevLine = session.getLine(row - 1); - lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); - } - - line = session.getLine(row); - currIndent = mode.$getIndent(line); - if (lineIndent !== currIndent) { - if (currIndent.length > 0) { - range = new Range(row, 0, row, currIndent.length); - session.remove(range); - } - if (lineIndent.length > 0) { - session.insert({row: row, column: 0}, lineIndent); + var wrapIndent = 0, splitIndex = Math.floor(screenRow - row); + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + column = splits[splitIndex]; + if (splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); } } - - mode.autoOutdent(prevLineState, session, row); } + if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)) + screenColumn = this.$bidiHandler.offsetToCol(offsetX); + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + if (foldLine) + return foldLine.idxToPosition(docColumn); + return { row: docRow, column: docColumn }; }; - - - this.onTextInput = function(text, composition) { - if (!composition) - return this.keyBinding.onTextInput(text); - - this.startOperation({command: { name: "insertstring" }}); - var applyComposition = this.applyComposition.bind(this, text, composition); - if (this.selection.rangeCount) - this.forEachSelection(applyComposition); + EditSession.prototype.documentToScreenPosition = function (docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(/**@type{Point}*/ (docRow).row, /**@type{Point}*/ (docRow).column); else - applyComposition(); - this.endOperation(); - }; - - this.applyComposition = function(text, composition) { - if (composition.extendLeft || composition.extendRight) { - var r = this.selection.getRange(); - r.start.column -= composition.extendLeft; - r.end.column += composition.extendRight; - if (r.start.column < 0) { - r.start.row--; - r.start.column += this.session.getLine(r.start.row).length + 1; - } - this.selection.setRange(r); - if (!text && !r.isEmpty()) - this.remove(); + pos = this.$clipPositionToDocument(/**@type{number}*/ (docRow), docColumn); + docRow = pos.row; + docColumn = pos.column; + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; } - if (text || !this.selection.isEmpty()) - this.insert(text, true); - if (composition.restoreStart || composition.restoreEnd) { - var r = this.selection.getRange(); - r.start.column -= composition.restoreStart; - r.end.column -= composition.restoreEnd; - this.selection.setRange(r); + var rowEnd, row = 0; + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; } - }; - - this.onCommandKey = function(e, hashId, keyCode) { - return this.keyBinding.onCommandKey(e, hashId, keyCode); - }; - this.setOverwrite = function(overwrite) { - this.session.setOverwrite(overwrite); - }; - this.getOverwrite = function() { - return this.session.getOverwrite(); - }; - this.toggleOverwrite = function() { - this.session.toggleOverwrite(); - }; - this.setScrollSpeed = function(speed) { - this.setOption("scrollSpeed", speed); - }; - this.getScrollSpeed = function() { - return this.getOption("scrollSpeed"); - }; - this.setDragDelay = function(dragDelay) { - this.setOption("dragDelay", dragDelay); - }; - this.getDragDelay = function() { - return this.getOption("dragDelay"); - }; - this.setSelectionStyle = function(val) { - this.setOption("selectionStyle", val); - }; - this.getSelectionStyle = function() { - return this.getOption("selectionStyle"); - }; - this.setHighlightActiveLine = function(shouldHighlight) { - this.setOption("highlightActiveLine", shouldHighlight); - }; - this.getHighlightActiveLine = function() { - return this.getOption("highlightActiveLine"); - }; - this.setHighlightGutterLine = function(shouldHighlight) { - this.setOption("highlightGutterLine", shouldHighlight); - }; - - this.getHighlightGutterLine = function() { - return this.getOption("highlightGutterLine"); - }; - this.setHighlightSelectedWord = function(shouldHighlight) { - this.setOption("highlightSelectedWord", shouldHighlight); - }; - this.getHighlightSelectedWord = function() { - return this.$highlightSelectedWord; - }; - - this.setAnimatedScroll = function(shouldAnimate){ - this.renderer.setAnimatedScroll(shouldAnimate); - }; - - this.getAnimatedScroll = function(){ - return this.renderer.getAnimatedScroll(); - }; - this.setShowInvisibles = function(showInvisibles) { - this.renderer.setShowInvisibles(showInvisibles); - }; - this.getShowInvisibles = function() { - return this.renderer.getShowInvisibles(); - }; - - this.setDisplayIndentGuides = function(display) { - this.renderer.setDisplayIndentGuides(display); - }; - - this.getDisplayIndentGuides = function() { - return this.renderer.getDisplayIndentGuides(); - }; - this.setShowPrintMargin = function(showPrintMargin) { - this.renderer.setShowPrintMargin(showPrintMargin); - }; - this.getShowPrintMargin = function() { - return this.renderer.getShowPrintMargin(); - }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.renderer.setPrintMarginColumn(showPrintMargin); - }; - this.getPrintMarginColumn = function() { - return this.renderer.getPrintMarginColumn(); - }; - this.setReadOnly = function(readOnly) { - this.setOption("readOnly", readOnly); - }; - this.getReadOnly = function() { - return this.getOption("readOnly"); - }; - this.setBehavioursEnabled = function (enabled) { - this.setOption("behavioursEnabled", enabled); - }; - this.getBehavioursEnabled = function () { - return this.getOption("behavioursEnabled"); - }; - this.setWrapBehavioursEnabled = function (enabled) { - this.setOption("wrapBehavioursEnabled", enabled); - }; - this.getWrapBehavioursEnabled = function () { - return this.getOption("wrapBehavioursEnabled"); - }; - this.setShowFoldWidgets = function(show) { - this.setOption("showFoldWidgets", show); - - }; - this.getShowFoldWidgets = function() { - return this.getOption("showFoldWidgets"); - }; - - this.setFadeFoldWidgets = function(fade) { - this.setOption("fadeFoldWidgets", fade); - }; - - this.getFadeFoldWidgets = function() { - return this.getOption("fadeFoldWidgets"); - }; - this.remove = function(dir) { - if (this.selection.isEmpty()){ - if (dir == "left") - this.selection.selectLeft(); - else - this.selection.selectRight(); + else { + var doCache = !l; } - - var range = this.getSelectionRange(); - if (this.getBehavioursEnabled()) { - var session = this.session; - var state = session.getState(range.start.row); - var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); - - if (range.end.column === 0) { - var text = session.getTextRange(range); - if (text[text.length - 1] == "\n") { - var line = session.getLine(range.end.row); - if (/^\s+$/.test(line)) { - range.end.column = line.length; - } + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + else { + rowEnd = row + 1; + } + screenRow += this.getRowLength(row); + row = rowEnd; + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } + else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow++; + screenRowOffset++; } + textLine = textLine.substring(wrapRow[screenRowOffset - 1] || 0, textLine.length); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; } - if (new_range) - range = new_range; } - - this.session.remove(range); - this.clearSelection(); - }; - this.removeWordRight = function() { - if (this.selection.isEmpty()) - this.selection.selectWordRight(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + if (this.lineWidgets && this.lineWidgets[row] && this.lineWidgets[row].rowsAbove) + screenRow += this.lineWidgets[row].rowsAbove; + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; }; - this.removeWordLeft = function() { - if (this.selection.isEmpty()) - this.selection.selectWordLeft(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + EditSession.prototype.documentToScreenColumn = function (row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; }; - this.removeToLineStart = function() { - if (this.selection.isEmpty()) - this.selection.selectLineStart(); - if (this.selection.isEmpty()) - this.selection.selectLeft(); - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + EditSession.prototype.documentToScreenRow = function (docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; }; - this.removeToLineEnd = function() { - if (this.selection.isEmpty()) - this.selection.selectLineEnd(); - - var range = this.getSelectionRange(); - if (range.start.column == range.end.column && range.start.row == range.end.row) { - range.end.column = 0; - range.end.row++; + EditSession.prototype.getScreenLength = function () { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } } - - this.session.remove(range); - this.clearSelection(); - }; - this.splitLine = function() { - if (!this.selection.isEmpty()) { - this.session.remove(this.getSelectionRange()); - this.clearSelection(); + else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row : Infinity; + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row++; + if (row > foldStart) { + row = fold.end.row + 1; + fold = this.$foldData[i++]; + foldStart = fold ? fold.start.row : Infinity; + } + } } - - var cursor = this.getCursorPosition(); - this.insert("\n"); - this.moveCursorToPosition(cursor); + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + return screenRows; }; - this.transposeLetters = function() { - if (!this.selection.isEmpty()) { - return; - } - - var cursor = this.getCursorPosition(); - var column = cursor.column; - if (column === 0) + EditSession.prototype.$setFontMetrics = function (fm) { + if (!this.$enableVarChar) return; - - var line = this.session.getLine(cursor.row); - var swap, range; - if (column < line.length) { - swap = line.charAt(column) + line.charAt(column-1); - range = new Range(cursor.row, column-1, cursor.row, column+1); - } - else { - swap = line.charAt(column-1) + line.charAt(column-2); - range = new Range(cursor.row, column-2, cursor.row, column); - } - this.session.replace(range, swap); - this.session.selection.moveToPosition(range.end); + this.$getStringScreenWidth = function (str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } + else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + return [screenColumn, column]; + }; }; - this.toLowerCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); + EditSession.prototype.getPrecedingCharacter = function () { + var pos = this.selection.getCursor(); + if (pos.column === 0) { + return pos.row === 0 ? "" : this.doc.getNewLineCharacter(); } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toLowerCase()); - this.selection.setSelectionRange(originalRange); + var currentLine = this.getLine(pos.row); + return currentLine[pos.column - 1]; }; - this.toUpperCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); + EditSession.prototype.destroy = function () { + if (!this.destroyed) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer.cleanup(); + this.destroyed = true; } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toUpperCase()); - this.selection.setSelectionRange(originalRange); + this.endOperation(); + this.$stopWorker(); + this.removeAllListeners(); + if (this.doc) { + this.doc.off("change", this.$onChange); + } + if (this.selection) { + this.selection.off("changeCursor", this.$onSelectionChange); + this.selection.off("changeSelection", this.$onSelectionChange); + } + this.selection.detach(); }; - this.indent = function() { - var session = this.session; - var range = this.getSelectionRange(); - - if (range.start.row < range.end.row) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); - return; - } else if (range.start.column < range.end.column) { - var text = session.getTextRange(range); - if (!/^\s+$/.test(text)) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); + return EditSession; +}()); +EditSession.$uid = 0; +EditSession.prototype.$modes = config.$modes; +EditSession.prototype.getValue = EditSession.prototype.toString; +EditSession.prototype.$defaultUndoManager = { + undo: function () { }, + redo: function () { }, + hasUndo: function () { }, + hasRedo: function () { }, + reset: function () { }, + add: function () { }, + addSelection: function () { }, + startNewGroup: function () { }, + addSession: function () { } +}; +EditSession.prototype.$overwrite = false; +EditSession.prototype.$mode = null; +EditSession.prototype.$modeId = null; +EditSession.prototype.$scrollTop = 0; +EditSession.prototype.$scrollLeft = 0; +EditSession.prototype.$wrapLimit = 80; +EditSession.prototype.$useWrapMode = false; +EditSession.prototype.$wrapLimitRange = { + min: null, + max: null +}; +EditSession.prototype.lineWidgets = null; +EditSession.prototype.isFullWidth = isFullWidth; +oop.implement(EditSession.prototype, EventEmitter); +var CHAR = 1, CHAR_EXT = 2, PLACEHOLDER_START = 3, PLACEHOLDER_BODY = 4, PUNCTUATION = 9, SPACE = 10, TAB = 11, TAB_SPACE = 12; +function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; +} +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function (value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + if (this.$wrap == value) return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); } - } - - var line = session.getLine(range.start.row); - var position = range.start; - var size = session.getTabSize(); - var column = session.documentToScreenColumn(position.row, position.column); - - if (this.session.getUseSoftTabs()) { - var count = (size - column % size); - var indentString = lang.stringRepeat(" ", count); - } else { - var count = column % size; - while (line[range.start.column - 1] == " " && count) { - range.start.column--; - count--; + else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); } - this.selection.setSelectionRange(range); - indentString = "\t"; - } - return this.insert(indentString); - }; - this.blockIndent = function() { - var rows = this.$getSelectedRows(); - this.session.indentRows(rows.first, rows.last, "\t"); - }; - this.blockOutdent = function() { - var selection = this.session.getSelection(); - this.session.outdentRows(selection.getRange()); - }; - this.sortLines = function() { - var rows = this.$getSelectedRows(); - var session = this.session; - - var lines = []; - for (var i = rows.first; i <= rows.last; i++) - lines.push(session.getLine(i)); + }, + get: function () { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function (val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { + set: function () { + if (this.$useWrapMode) { + this.$useWrapMode = false; + this.setUseWrapMode(true); + } + }, + initialValue: true + }, + firstLineNumber: { + set: function () { this._signal("changeBreakpoint"); }, + initialValue: 1 + }, + useWorker: { + set: function (useWorker) { + this.$useWorker = useWorker; + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: { initialValue: true }, + tabSize: { + set: function (tabSize) { + tabSize = parseInt(tabSize); + if (tabSize > 0 && this.$tabSize !== tabSize) { + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + } + }, + initialValue: 4, + handlesSet: true + }, + navigateWithinSoftTabs: { initialValue: false }, + foldStyle: { + set: function (val) { this.setFoldStyle(val); }, + handlesSet: true + }, + overwrite: { + set: function (val) { this._signal("changeOverwrite"); }, + initialValue: false + }, + newLineMode: { + set: function (val) { this.doc.setNewLineMode(val); }, + get: function () { return this.doc.getNewLineMode(); }, + handlesSet: true + }, + mode: { + set: function (val) { this.setMode(val); }, + get: function () { return this.$modeId; }, + handlesSet: true + } +}); +exports.EditSession = EditSession; - lines.sort(function(a, b) { - if (a.toLowerCase() < b.toLowerCase()) return -1; - if (a.toLowerCase() > b.toLowerCase()) return 1; - return 0; - }); +}); - var deleteRange = new Range(0, 0, 0, 0); - for (var i = rows.first; i <= rows.last; i++) { - var line = session.getLine(i); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = line.length; - session.replace(deleteRange, lines[i-rows.first]); - } +define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module){"use strict"; +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; +var Search = /** @class */ (function () { + function Search() { + this.$options = {}; + } + Search.prototype.set = function (options) { + oop.mixin(this.$options, options); + return this; }; - this.toggleCommentLines = function() { - var state = this.session.getState(this.getCursorPosition().row); - var rows = this.$getSelectedRows(); - this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + Search.prototype.getOptions = function () { + return lang.copyObject(this.$options); }; - - this.toggleBlockComment = function() { - var cursor = this.getCursorPosition(); - var state = this.session.getState(cursor.row); - var range = this.getSelectionRange(); - this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + Search.prototype.setOptions = function (options) { + this.$options = options; }; - this.getNumberAt = function(row, column) { - var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; - _numberRx.lastIndex = 0; - - var s = this.session.getLine(row); - while (_numberRx.lastIndex < column) { - var m = _numberRx.exec(s); - if(m.index <= column && m.index+m[0].length >= column){ - var number = { - value: m[0], - start: m.index, - end: m.index+m[0].length - }; - return number; + Search.prototype.find = function (session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + var firstRange = null; + iterator.forEach(function (sr, sc, er, ec) { + firstRange = new Range(sr, sc, er, ec); + if (sc == ec && options.start && /**@type{Range}*/ (options.start).start + && options.skipCurrent != false && firstRange.isEqual(/**@type{Range}*/ (options.start))) { + firstRange = null; + return false; } - } - return null; + return true; + }); + return firstRange; }; - this.modifyNumber = function(amount) { - var row = this.selection.getCursor().row; - var column = this.selection.getCursor().column; - var charRange = new Range(row, column-1, row, column); - - var c = this.session.getTextRange(charRange); - if (!isNaN(parseFloat(c)) && isFinite(c)) { - var nr = this.getNumberAt(row, column); - if (nr) { - var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; - var decimals = nr.start + nr.value.length - fp; - - var t = parseFloat(nr.value); - t *= Math.pow(10, decimals); - - - if(fp !== nr.end && column < fp){ - amount *= Math.pow(10, nr.end - column - 1); - } else { - amount *= Math.pow(10, nr.end - column); + Search.prototype.findAll = function (session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex) { + continue; } - - t += amount; - t /= Math.pow(10, decimals); - var nnr = t.toFixed(decimals); - var replaceRange = new Range(row, nr.start, row, nr.end); - this.session.replace(replaceRange, nnr); - this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); - + ranges.push(prevRange = new Range(row, startIndex, row + len - 1, endIndex)); + if (len > 2) + row = row + len - 2; } - } else { - this.toggleWord(); } - }; - - this.$toggleWordPairs = [ - ["first", "last"], - ["true", "false"], - ["yes", "no"], - ["width", "height"], - ["top", "bottom"], - ["right", "left"], - ["on", "off"], - ["x", "y"], - ["get", "set"], - ["max", "min"], - ["horizontal", "vertical"], - ["show", "hide"], - ["add", "remove"], - ["up", "down"], - ["before", "after"], - ["even", "odd"], - ["in", "out"], - ["inside", "outside"], - ["next", "previous"], - ["increase", "decrease"], - ["attach", "detach"], - ["&&", "||"], - ["==", "!="] - ]; - - this.toggleWord = function () { - var row = this.selection.getCursor().row; - var column = this.selection.getCursor().column; - this.selection.selectWord(); - var currentState = this.getSelectedText(); - var currWordStart = this.selection.getWordRange().start.column; - var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); - var delta = column - currWordStart - 1; - if (delta < 0) delta = 0; - var curLength = 0, itLength = 0; - var that = this; - if (currentState.match(/[A-Za-z0-9_]+/)) { - wordParts.forEach(function (item, i) { - itLength = curLength + item.length; - if (delta >= curLength && delta <= itLength) { - currentState = item; - that.selection.clearSelection(); - that.moveCursorTo(row, curLength + currWordStart); - that.selection.selectTo(row, itLength + currWordStart); + else { + for (var matches, i = 0; i < lines.length; i++) { + if (this.$isMultilineSearch(options)) { + var lng = lines.length - 1; + matches = this.$multiLineForward(session, re, i, lng); + if (matches) { + var end_row = matches.endRow <= lng ? matches.endRow - 1 : lng; + if (end_row > i) + i = end_row; + ranges.push(new Range(matches.startRow, matches.startCol, matches.endRow, matches.endCol)); + } } - curLength = itLength; - }); - } - - var wordPairs = this.$toggleWordPairs; - var reg; - for (var i = 0; i < wordPairs.length; i++) { - var item = wordPairs[i]; - for (var j = 0; j <= 1; j++) { - var negate = +!j; - var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); - if (firstCondition) { - var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); - if (secondCondition) { - reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { - var res = item[negate]; - if (result.toUpperCase() == result) { - res = res.toUpperCase(); - } else if (result.charAt(0).toUpperCase() == result.charAt(0)) { - res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); - } - return res; - }); - this.insert(reg); - reg = ""; + else { + matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); } } } } - }; - this.removeLines = function() { - var rows = this.$getSelectedRows(); - this.session.removeFullLines(rows.first, rows.last); - this.clearSelection(); - }; - - this.duplicateSelection = function() { - var sel = this.selection; - var doc = this.session; - var range = sel.getRange(); - var reverse = sel.isBackwards(); - if (range.isEmpty()) { - var row = range.start.row; - doc.duplicateLines(row, row); - } else { - var point = reverse ? range.start : range.end; - var endPoint = doc.insert(point, doc.getTextRange(range), false); - range.start = point; - range.end = endPoint; - - sel.setSelectionRange(range, reverse); + if (range) { + var startColumn = range.start.column; + var endColumn = range.end.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == 0) + i++; + var endRow = range.end.row - range.start.row; + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == endRow) + j--; + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } } + return ranges; }; - this.moveLinesDown = function() { - this.$moveLines(1, false); - }; - this.moveLinesUp = function() { - this.$moveLines(-1, false); - }; - this.moveText = function(range, toPosition, copy) { - return this.session.moveText(range, toPosition, copy); - }; - this.copyLinesUp = function() { - this.$moveLines(-1, true); - }; - this.copyLinesDown = function() { - this.$moveLines(1, true); - }; - this.$moveLines = function(dir, copy) { - var rows, moved; - var selection = this.selection; - if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { - var range = selection.toOrientedRange(); - rows = this.$getSelectedRows(range); - moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); - if (copy && dir == -1) moved = 0; - range.moveBy(moved, 0); - selection.fromOrientedRange(range); - } else { - var ranges = selection.rangeList.ranges; - selection.rangeList.detach(this.session); - this.inVirtualSelectionMode = true; - - var diff = 0; - var totalDiff = 0; - var l = ranges.length; - for (var i = 0; i < l; i++) { - var rangeIndex = i; - ranges[i].moveBy(diff, 0); - rows = this.$getSelectedRows(ranges[i]); - var first = rows.first; - var last = rows.last; - while (++i < l) { - if (totalDiff) ranges[i].moveBy(totalDiff, 0); - var subRows = this.$getSelectedRows(ranges[i]); - if (copy && subRows.first != last) + Search.prototype.parseReplaceString = function (replaceString) { + var CharCode = { + DollarSign: 36, + Ampersand: 38, + Digit0: 48, + Digit1: 49, + Digit9: 57, + Backslash: 92, + n: 110, + t: 116 + }; + var replacement = ''; + for (var i = 0, len = replaceString.length; i < len; i++) { + var chCode = replaceString.charCodeAt(i); + if (chCode === CharCode.Backslash) { + i++; + if (i >= len) { + replacement += "\\"; + break; + } + var nextChCode = replaceString.charCodeAt(i); + switch (nextChCode) { + case CharCode.Backslash: + replacement += "\\"; break; - else if (!copy && subRows.first > last + 1) + case CharCode.n: + replacement += "\n"; + break; + case CharCode.t: + replacement += "\t"; break; - last = subRows.last; } - i--; - diff = this.session.$moveLines(first, last, copy ? 0 : dir); - if (copy && dir == -1) rangeIndex = i + 1; - while (rangeIndex <= i) { - ranges[rangeIndex].moveBy(diff, 0); - rangeIndex++; + continue; + } + if (chCode === CharCode.DollarSign) { + i++; + if (i >= len) { + replacement += "$"; + break; + } + var nextChCode_1 = replaceString.charCodeAt(i); + if (nextChCode_1 === CharCode.DollarSign) { + replacement += "$$"; + continue; + } + if (nextChCode_1 === CharCode.Digit0 || nextChCode_1 === CharCode.Ampersand) { + replacement += "$&"; + continue; + } + if (CharCode.Digit1 <= nextChCode_1 && nextChCode_1 <= CharCode.Digit9) { + replacement += "$" + replaceString[i]; + continue; } - if (!copy) diff = 0; - totalDiff += diff; } - - selection.fromOrientedRange(selection.ranges[0]); - selection.rangeList.attach(this.session); - this.inVirtualSelectionMode = false; + replacement += replaceString[i]; } + return replacement || replaceString; }; - this.$getSelectedRows = function(range) { - range = (range || this.getSelectionRange()).collapseRows(); - - return { - first: this.session.getRowFoldStart(range.start.row), - last: this.session.getRowFoldEnd(range.end.row) - }; - }; - - this.onCompositionStart = function(compositionState) { - this.renderer.showComposition(compositionState); - }; - - this.onCompositionUpdate = function(text) { - this.renderer.setCompositionText(text); - }; - - this.onCompositionEnd = function() { - this.renderer.hideComposition(); - }; - this.getFirstVisibleRow = function() { - return this.renderer.getFirstVisibleRow(); - }; - this.getLastVisibleRow = function() { - return this.renderer.getLastVisibleRow(); - }; - this.isRowVisible = function(row) { - return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); - }; - this.isRowFullyVisible = function(row) { - return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); - }; - this.$getVisibleRowCount = function() { - return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; - }; - - this.$moveByPage = function(dir, select) { - var renderer = this.renderer; - var config = this.renderer.layerConfig; - var rows = dir * Math.floor(config.height / config.lineHeight); - - if (select === true) { - this.selection.$moveSelection(function(){ - this.moveCursorBy(rows, 0); - }); - } else if (select === false) { - this.selection.moveCursorBy(rows, 0); - this.selection.clearSelection(); + Search.prototype.replace = function (input, replacement) { + var options = this.$options; + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + if (!re) + return; + var mtSearch = this.$isMultilineSearch(options); + if (mtSearch) + input = input.replace(/\r\n|\r|\n/g, "\n"); + var match = re.exec(input); + if (!match || (!mtSearch && match[0].length != input.length)) + return null; + replacement = options.regExp + ? this.parseReplaceString(replacement) + : replacement.replace(/\$/g, "$$$$"); + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--;) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); } - - var scrollTop = renderer.scrollTop; - - renderer.scrollBy(0, rows * config.lineHeight); - if (select != null) - renderer.scrollCursorIntoView(null, 0.5); - - renderer.animateScrolling(scrollTop); - }; - this.selectPageDown = function() { - this.$moveByPage(1, true); - }; - this.selectPageUp = function() { - this.$moveByPage(-1, true); - }; - this.gotoPageDown = function() { - this.$moveByPage(1, false); - }; - this.gotoPageUp = function() { - this.$moveByPage(-1, false); - }; - this.scrollPageDown = function() { - this.$moveByPage(1); - }; - this.scrollPageUp = function() { - this.$moveByPage(-1); + return replacement; }; - this.scrollToRow = function(row) { - this.renderer.scrollToRow(row); + Search.prototype.$assembleRegExp = function (options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + var needle = options.needle; + if (!options.needle) + return options.re = false; + if (!options.regExp) + needle = lang.escapeRegExp(needle); + var modifier = options.caseSensitive ? "gm" : "gmi"; + try { + new RegExp(needle, "u"); + options.$supportsUnicodeFlag = true; + modifier += "u"; + } + catch (e) { + options.$supportsUnicodeFlag = false; //left for backward compatibility with previous versions for cases like /ab\{2}/gu + } + if (options.wholeWord) + needle = addWordBoundary(needle, options); + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + try { + var re = new RegExp(needle, modifier); + } + catch (e) { + re = false; + } + return options.re = re; }; - this.scrollToLine = function(line, center, animate, callback) { - this.renderer.scrollToLine(line, center, animate, callback); + Search.prototype.$assembleMultilineRegExp = function (needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) + try { + re.push(new RegExp(parts[i], modifier)); + } + catch (e) { + return false; + } + return re; }; - this.centerSelection = function() { - var range = this.getSelectionRange(); - var pos = { - row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), - column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) - }; - this.renderer.alignCursor(pos, 0.5); + Search.prototype.$isMultilineSearch = function (options) { + return options.re && /\\r\\n|\\r|\\n/.test(options.re.source) && options.regExp && !options.$isMultiLine; }; - this.getCursorPosition = function() { - return this.selection.getCursor(); + Search.prototype.$multiLineForward = function (session, re, start, last) { + var line, chunk = chunkEnd(session, start); + for (var row = start; row <= last;) { + for (var i = 0; i < chunk; i++) { + if (row > last) + break; + var next = session.getLine(row++); + line = line == null ? next : line + "\n" + next; + } + var match = re.exec(line); + re.lastIndex = 0; + if (match) { + var beforeMatch = line.slice(0, match.index).split("\n"); + var matchedText = match[0].split("\n"); + var startRow = start + beforeMatch.length - 1; + var startCol = beforeMatch[beforeMatch.length - 1].length; + var endRow = startRow + matchedText.length - 1; + var endCol = matchedText.length == 1 + ? startCol + matchedText[0].length + : matchedText[matchedText.length - 1].length; + return { + startRow: startRow, + startCol: startCol, + endRow: endRow, + endCol: endCol + }; + } + } + return null; }; - this.getCursorPositionScreen = function() { - return this.session.documentToScreenPosition(this.getCursorPosition()); + Search.prototype.$multiLineBackward = function (session, re, endIndex, start, first) { + var line, chunk = chunkEnd(session, start), endMargin = session.getLine(start).length - endIndex; + for (var row = start; row >= first;) { + for (var i = 0; i < chunk && row >= first; i++) { + var next = session.getLine(row--); + line = line == null ? next : next + "\n" + line; + } + var match = multiLineBackwardMatch(line, re, endMargin); + if (match) { + var beforeMatch = line.slice(0, match.index).split("\n"); + var matchedText = match[0].split("\n"); + var startRow = row + beforeMatch.length; + var startCol = beforeMatch[beforeMatch.length - 1].length; + var endRow = startRow + matchedText.length - 1; + var endCol = matchedText.length == 1 + ? startCol + matchedText[0].length + : matchedText[matchedText.length - 1].length; + return { + startRow: startRow, + startCol: startCol, + endRow: endRow, + endCol: endCol + }; + } + } + return null; }; - this.getSelectionRange = function() { - return this.selection.getRange(); - }; - this.selectAll = function() { - this.selection.selectAll(); - }; - this.clearSelection = function() { - this.selection.clearSelection(); - }; - this.moveCursorTo = function(row, column) { - this.selection.moveCursorTo(row, column); - }; - this.moveCursorToPosition = function(pos) { - this.selection.moveCursorToPosition(pos); - }; - this.jumpToMatching = function(select, expand) { - var cursor = this.getCursorPosition(); - var iterator = new TokenIterator(this.session, cursor.row, cursor.column); - var prevToken = iterator.getCurrentToken(); - var token = prevToken || iterator.stepForward(); - - if (!token) return; - var matchType; - var found = false; - var depth = {}; - var i = cursor.column - token.start; - var bracketType; - var brackets = { - ")": "(", - "(": "(", - "]": "[", - "[": "[", - "{": "{", - "}": "{" - }; - - do { - if (token.value.match(/[{}()\[\]]/g)) { - for (; i < token.value.length && !found; i++) { - if (!brackets[token.value[i]]) { - continue; - } - - bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); - - if (isNaN(depth[bracketType])) { - depth[bracketType] = 0; - } - - switch (token.value[i]) { - case '(': - case '[': - case '{': - depth[bracketType]++; - break; - case ')': - case ']': - case '}': - depth[bracketType]--; - - if (depth[bracketType] === -1) { - matchType = 'bracket'; - found = true; - } - break; - } - } - } - else if (token.type.indexOf('tag-name') !== -1) { - if (isNaN(depth[token.value])) { - depth[token.value] = 0; - } - - if (prevToken.value === '<') { - depth[token.value]++; + Search.prototype.$matchIterator = function (session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + var mtSearch = this.$isMultilineSearch(options); + var mtForward = this.$multiLineForward; + var mtBackward = this.$multiLineBackward; + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + var supportsUnicodeFlag = re.unicode; + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + if (backwards) { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row--; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + if (options.wrap == false) + return; + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (forEachInLine(row, Number.MAX_VALUE, callback)) + return; + }; + } + else { + var forEach = function (callback) { + var row = start.row; + if (forEachInLine(row, start.column, callback)) + return; + for (row = row + 1; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + if (options.wrap == false) + return; + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (forEachInLine(row, 0, callback)) + return; + }; + } + if (options.$isMultiLine) { + var len = re.length; + var forEachInLine = function (row, offset, callback) { + var startRow = backwards ? row - len + 1 : row; + if (startRow < 0 || startRow + len > session.getLength()) + return; + var line = session.getLine(startRow); + var startIndex = line.search(re[0]); + if (!backwards && startIndex < offset || startIndex === -1) + return; + for (var i = 1; i < len; i++) { + line = session.getLine(startRow + i); + if (line.search(re[i]) == -1) + return; } - else if (prevToken.value === ' offset) + return; + if (callback(startRow, startIndex, startRow + len - 1, endIndex)) + return true; + }; + } + else if (backwards) { + var forEachInLine = function (row, endIndex, callback) { + if (mtSearch) { + var pos = mtBackward(session, re, endIndex, row, firstRow); + if (!pos) + return false; + if (callback(pos.startRow, pos.startCol, pos.endRow, pos.endCol)) + return true; } - - if (depth[token.value] === -1) { - matchType = 'tag'; - found = true; + else { + var line = session.getLine(row); + var matches = []; + var m, last = 0; + re.lastIndex = 0; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (!length) { + if (last >= line.length) + break; + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + } + if (m.index + length > endIndex) + break; + matches.push(m.index, length); + } + for (var i = matches.length - 1; i >= 0; i -= 2) { + var column = matches[i - 1]; + var length = matches[i]; + if (callback(row, column, row, column + length)) + return true; + } } - } - - if (!found) { - prevToken = token; - token = iterator.stepForward(); - i = 0; - } - } while (token && !found); - if (!matchType) - return; - - var range, pos; - if (matchType === 'bracket') { - range = this.session.getBracketRange(cursor); - if (!range) { - range = new Range( - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() + i - 1, - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() + i - 1 - ); - pos = range.start; - if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2) - range = this.session.getBracketRange(pos); - } + }; } - else if (matchType === 'tag') { - if (token && token.type.indexOf('tag-name') !== -1) - var tag = token.value; - else - return; - - range = new Range( - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() - 2, - iterator.getCurrentTokenRow(), - iterator.getCurrentTokenColumn() - 2 - ); - if (range.compare(cursor.row, cursor.column) === 0) { - found = false; - do { - token = prevToken; - prevToken = iterator.stepBackward(); - - if (prevToken) { - if (prevToken.type.indexOf('tag-close') !== -1) { - range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1); - } - - if (token.value === tag && token.type.indexOf('tag-name') !== -1) { - if (prevToken.value === '<') { - depth[tag]++; - } - else if (prevToken.value === ' row) + row = end_row; + } + if (!pos) + return false; + if (callback(pos.startRow, pos.startCol, pos.endRow, pos.endCol)) + return true; + } + else { + var line = session.getLine(row); + var last; + var m; + while ((m = re.exec(line))) { + var length = m[0].length; + last = m.index; + if (callback(row, last, row, last + length)) + return true; + if (!length) { + re.lastIndex = last += lang.skipEmptyMatch(line, last, supportsUnicodeFlag); + if (last >= line.length) + return false; } } - } while (prevToken && !found); - } - if (token && token.type.indexOf('tag-name')) { - pos = range.start; - if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) - pos = range.end; - } - } - - pos = range && range.cursor || pos; - if (pos) { - if (select) { - if (range && expand) { - this.selection.setRange(range); - } else if (range && range.isEqual(this.getSelectionRange())) { - this.clearSelection(); - } else { - this.selection.selectTo(pos.row, pos.column); } - } else { - this.selection.moveTo(pos.row, pos.column); - } - } - }; - this.gotoLine = function(lineNumber, column, animate) { - this.selection.clearSelection(); - this.session.unfold({row: lineNumber - 1, column: column || 0}); - this.exitMultiSelectMode && this.exitMultiSelectMode(); - this.moveCursorTo(lineNumber - 1, column || 0); - - if (!this.isRowFullyVisible(lineNumber - 1)) - this.scrollToLine(lineNumber - 1, true, animate); - }; - this.navigateTo = function(row, column) { - this.selection.moveTo(row, column); - }; - this.navigateUp = function(times) { - if (this.selection.isMultiLine() && !this.selection.isBackwards()) { - var selectionStart = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionStart); + }; } - this.selection.clearSelection(); - this.selection.moveCursorBy(-times || -1, 0); + return { forEach: forEach }; }; - this.navigateDown = function(times) { - if (this.selection.isMultiLine() && this.selection.isBackwards()) { - var selectionEnd = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionEnd); + return Search; +}()); +function addWordBoundary(needle, options) { + var supportsLookbehind = lang.supportsLookbehind(); + function wordBoundary(c, firstChar) { + if (firstChar === void 0) { firstChar = true; } + var wordRegExp = supportsLookbehind && options.$supportsUnicodeFlag ? new RegExp("[\\p{L}\\p{N}_]", "u") : new RegExp("\\w"); + if (wordRegExp.test(c) || options.regExp) { + if (supportsLookbehind && options.$supportsUnicodeFlag) { + if (firstChar) + return "(?<=^|[^\\p{L}\\p{N}_])"; + return "(?=[^\\p{L}\\p{N}_]|$)"; + } + return "\\b"; } - this.selection.clearSelection(); - this.selection.moveCursorBy(times || 1, 0); + return ""; + } + var needleArray = Array.from(needle); + var firstChar = needleArray[0]; + var lastChar = needleArray[needleArray.length - 1]; + return wordBoundary(firstChar) + needle + wordBoundary(lastChar, false); +} +function multiLineBackwardMatch(line, re, endMargin) { + var match = null; + var from = 0; + while (from <= line.length) { + re.lastIndex = from; + var newMatch = re.exec(line); + if (!newMatch) + break; + var end = newMatch.index + newMatch[0].length; + if (end > line.length - endMargin) + break; + if (!match || end > match.index + match[0].length) + match = newMatch; + from = newMatch.index + 1; + } + return match; +} +function chunkEnd(session, start) { + var base = 5000, startPosition = { row: start, column: 0 }, startIndex = session.doc.positionToIndex(startPosition), targetIndex = startIndex + base, targetPosition = session.doc.indexToPosition(targetIndex), targetLine = targetPosition.row; + return targetLine + 1; +} +exports.Search = Search; + +}); + +define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; +var MultiHashHandler = /** @class */ (function () { + function MultiHashHandler(config, platform) { + this.$init(config, platform, false); + } + MultiHashHandler.prototype.$init = function (config, platform, $singleCommand) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = $singleCommand; + }; + MultiHashHandler.prototype.addCommand = function (command) { + if (this.commands[command.name]) + this.removeCommand(command); + this.commands[command.name] = command; + if (command.bindKey) + this._buildKeyHash(command); }; - this.navigateLeft = function(times) { - if (!this.selection.isEmpty()) { - var selectionStart = this.getSelectionRange().start; - this.moveCursorToPosition(selectionStart); - } - else { - times = times || 1; - while (times--) { - this.selection.moveCursorLeft(); + MultiHashHandler.prototype.removeCommand = function (command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } + else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } } } - this.clearSelection(); }; - this.navigateRight = function(times) { - if (!this.selection.isEmpty()) { - var selectionEnd = this.getSelectionRange().end; - this.moveCursorToPosition(selectionEnd); + MultiHashHandler.prototype.bindKey = function (key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({ exec: command, bindKey: key, name: command.name || /**@type{string}*/ (key) }); (key).split("|").forEach(function (keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function (keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + MultiHashHandler.prototype._addCommandToBinding = function (keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } + else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; } else { - times = times || 1; - while (times--) { - this.selection.moveCursorRight(); + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } + else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + if (typeof position != "number") { + position = getPosition(command); + } + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; } + commands.splice(i, 0, command); } - this.clearSelection(); - }; - this.navigateLineStart = function() { - this.selection.moveCursorLineStart(); - this.clearSelection(); - }; - this.navigateLineEnd = function() { - this.selection.moveCursorLineEnd(); - this.clearSelection(); }; - this.navigateFileEnd = function() { - this.selection.moveCursorFileEnd(); - this.clearSelection(); + MultiHashHandler.prototype.addCommands = function (commands) { + commands && Object.keys(commands).forEach(function (name) { + var command = commands[name]; + if (!command) + return; + if (typeof command === "string") + return this.bindKey(command, name); + if (typeof command === "function") + command = { exec: command }; + if (typeof command !== "object") + return; + if (!command.name) + command.name = name; + this.addCommand(command); + }, this); }; - this.navigateFileStart = function() { - this.selection.moveCursorFileStart(); - this.clearSelection(); + MultiHashHandler.prototype.removeCommands = function (commands) { + Object.keys(commands).forEach(function (name) { + this.removeCommand(commands[name]); + }, this); }; - this.navigateWordRight = function() { - this.selection.moveCursorWordRight(); - this.clearSelection(); + MultiHashHandler.prototype.bindKeys = function (keyList) { + Object.keys(keyList).forEach(function (key) { + this.bindKey(key, keyList[key]); + }, this); }; - this.navigateWordLeft = function() { - this.selection.moveCursorWordLeft(); - this.clearSelection(); + MultiHashHandler.prototype._buildKeyHash = function (command) { + this.bindKey(command.bindKey, command); }; - this.replace = function(replacement, options) { - if (options) - this.$search.set(options); - - var range = this.$search.find(this.session); - var replaced = 0; - if (!range) - return replaced; - - if (this.$tryReplace(range, replacement)) { - replaced = 1; + MultiHashHandler.prototype.parseKeys = function (keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function (x) { return x; }); + var key = parts.pop(); + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return { key: key, hashId: -1 }; + else if (parts.length == 1 && parts[0] == "shift") + return { key: key.toUpperCase(), hashId: -1 }; + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; } - - this.selection.setSelectionRange(range); - this.renderer.scrollSelectionIntoView(range.start, range.end); - - return replaced; + return { key: key, hashId: hashId }; }; - this.replaceAll = function(replacement, options) { - if (options) { - this.$search.set(options); + MultiHashHandler.prototype.findKeyCommand = function (hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + MultiHashHandler.prototype.handleKeyboard = function (data, hashId, keyString, keyCode) { + if (keyCode < 0) + return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; } - - var ranges = this.$search.findAll(this.session); - var replaced = 0; - if (!ranges.length) - return replaced; - - var selection = this.getSelectionRange(); - this.selection.moveTo(0, 0); - - for (var i = ranges.length - 1; i >= 0; --i) { - if(this.$tryReplace(ranges[i], replacement)) { - replaced++; + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return { command: "null" }; } } - - this.selection.setSelectionRange(selection); - - return replaced; - }; - - this.$tryReplace = function(range, replacement) { - var input = this.session.getTextRange(range); - replacement = this.$search.replace(input, replacement); - if (replacement !== null) { - range.end = this.session.replace(range, replacement); - return range; - } else { - return null; + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain } + return { command: command }; }; - this.getLastSearchOptions = function() { - return this.$search.getOptions(); + MultiHashHandler.prototype.getStatusText = function (editor, data) { + return data.$keyChain || ""; }; - this.find = function(needle, options, animate) { - if (!options) - options = {}; + return MultiHashHandler; +}()); +function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position + || (command.isDefault ? -100 : 0); +} +var HashHandler = /** @class */ (function (_super) { + __extends(HashHandler, _super); + function HashHandler(config, platform) { + var _this = _super.call(this, config, platform) || this; + _this.$singleCommand = true; + return _this; + } + return HashHandler; +}(MultiHashHandler)); +HashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, true); +}; +MultiHashHandler.call = function (thisArg, config, platform) { + MultiHashHandler.prototype.$init.call(thisArg, config, platform, false); +}; +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; - if (typeof needle == "string" || needle instanceof RegExp) - options.needle = needle; - else if (typeof needle == "object") - oop.mixin(options, needle); +}); - var range = this.selection.getRange(); - if (options.needle == null) { - needle = this.session.getTextRange(range) - || this.$search.$options.needle; - if (!needle) { - range = this.session.getWordRange(range.start.row, range.start.column); - needle = this.session.getTextRange(range); +define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var CommandManager = /** @class */ (function (_super) { + __extends(CommandManager, _super); + function CommandManager(platform, commands) { + var _this = _super.call(this, commands, platform) || this; + _this.byName = _this.commands; + _this.setDefaultHandler("exec", function (e) { + if (!e.args) { + return e.command.exec(e.editor, {}, e.event, true); + } + return e.command.exec(e.editor, e.args, e.event, false); + }); + return _this; + } + CommandManager.prototype.exec = function (command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--;) { + if (this.exec(command[i], editor, args)) + return true; } - this.$search.set({needle: needle}); + return false; } - - this.$search.set(options); - if (!options.start) - this.$search.set({start: range}); - - var newRange = this.$search.find(this.session); - if (options.preventScroll) - return newRange; - if (newRange) { - this.revealRange(newRange, animate); - return newRange; + if (typeof command === "string") + command = this.commands[command]; + var e = { editor: editor, command: command, args: args }; + if (!this.canExecute(command, editor)) { + this._signal("commandUnavailable", e); + return false; } - if (options.backwards) - range.start = range.end; - else - range.end = range.start; - this.selection.setRange(range); - }; - this.findNext = function(options, animate) { - this.find({skipCurrent: true, backwards: false}, options, animate); - }; - this.findPrevious = function(options, animate) { - this.find(options, {skipCurrent: true, backwards: true}, animate); - }; - - this.revealRange = function(range, animate) { - this.session.unfold(range); - this.selection.setSelectionRange(range); - - var scrollTop = this.renderer.scrollTop; - this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); - if (animate !== false) - this.renderer.animateScrolling(scrollTop); - }; - this.undo = function() { - this.session.getUndoManager().undo(this.session); - this.renderer.scrollCursorIntoView(null, 0.5); - }; - this.redo = function() { - this.session.getUndoManager().redo(this.session); - this.renderer.scrollCursorIntoView(null, 0.5); + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + return e.returnValue === false ? false : true; }; - this.destroy = function() { - if (this.$toDestroy) { - this.$toDestroy.forEach(function(el) { - el.destroy(); - }); - this.$toDestroy = null; - } - if (this.$mouseHandler) - this.$mouseHandler.destroy(); - this.renderer.destroy(); - this._signal("destroy", this); - if (this.session) - this.session.destroy(); - if (this._$emitInputEvent) - this._$emitInputEvent.cancel(); - this.removeAllListeners(); + CommandManager.prototype.canExecute = function (command, editor) { + if (typeof command === "string") + command = this.commands[command]; + if (!command) + return false; + if (editor && editor.$readOnly && !command.readOnly) + return false; + if (this.$checkCommandState != false && command.isAvailable && !command.isAvailable(editor)) + return false; + return true; }; - this.setAutoScrollEditorIntoView = function(enable) { - if (!enable) + CommandManager.prototype.toggleRecording = function (editor) { + if (this.$inReplay) return; - var rect; - var self = this; - var shouldScroll = false; - if (!this.$scrollAnchor) - this.$scrollAnchor = document.createElement("div"); - var scrollAnchor = this.$scrollAnchor; - scrollAnchor.style.cssText = "position:absolute"; - this.container.insertBefore(scrollAnchor, this.container.firstChild); - var onChangeSelection = this.on("changeSelection", function() { - shouldScroll = true; - }); - var onBeforeRender = this.renderer.on("beforeRender", function() { - if (shouldScroll) - rect = self.renderer.container.getBoundingClientRect(); - }); - var onAfterRender = this.renderer.on("afterRender", function() { - if (shouldScroll && rect && (self.isFocused() - || self.searchBox && self.searchBox.isFocused()) - ) { - var renderer = self.renderer; - var pos = renderer.$cursorLayer.$pixelPos; - var config = renderer.layerConfig; - var top = pos.top - config.offset; - if (pos.top >= 0 && top + rect.top < 0) { - shouldScroll = true; - } else if (pos.top < config.height && - pos.top + rect.top + config.lineHeight > window.innerHeight) { - shouldScroll = false; - } else { - shouldScroll = null; - } - if (shouldScroll != null) { - scrollAnchor.style.top = top + "px"; - scrollAnchor.style.left = pos.left + "px"; - scrollAnchor.style.height = config.lineHeight + "px"; - scrollAnchor.scrollIntoView(shouldScroll); - } - shouldScroll = rect = null; - } - }); - this.setAutoScrollEditorIntoView = function(enable) { - if (enable) - return; - delete this.setAutoScrollEditorIntoView; - this.off("changeSelection", onChangeSelection); - this.renderer.off("afterRender", onAfterRender); - this.renderer.off("beforeRender", onBeforeRender); - }; + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.off("exec", this.$addCommandToMacro); + if (!this.macro.length) + this.macro = this.oldMacro; + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function (e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; }; - - - this.$resetCursorStyle = function() { - var style = this.$cursorStyle || "ace"; - var cursorLayer = this.renderer.$cursorLayer; - if (!cursorLayer) + CommandManager.prototype.replay = function (editor) { + if (this.$inReplay || !this.macro) return; - cursorLayer.setSmoothBlinking(/smooth/.test(style)); - cursorLayer.isBlinking = !this.$readOnly && style != "wide"; - dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + if (this.recording) + return this.toggleRecording(editor); + try { + this.$inReplay = true; + this.macro.forEach(function (x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } + finally { + this.$inReplay = false; + } }; - this.prompt = function(message, options, callback) { - var editor = this; - config.loadModule("./ext/prompt", function (module) { - module.prompt(editor, message, options, callback); + CommandManager.prototype.trimMacro = function (m) { + return m.map(function (x) { + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; }); }; + return CommandManager; +}(MultiHashHandler)); +oop.implement(CommandManager.prototype, EventEmitter); +exports.CommandManager = CommandManager; -}).call(Editor.prototype); - - +}); -config.defineOptions(Editor.prototype, "editor", { - selectionStyle: { - set: function(style) { - this.onSelectionChange(); - this._signal("changeSelectionStyle", {data: style}); +define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module){"use strict"; +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; +function bindKey(win, mac) { + return { win: win, mac: mac }; +} +exports.commands = [{ + name: "showSettingsMenu", + description: "Show settings menu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function (editor) { + config.loadModule("ace/ext/settings_menu", function (module) { + module.init(editor); + editor.showSettingsMenu(); + }); }, - initialValue: "line" - }, - highlightActiveLine: { - set: function() {this.$updateHighlightActiveLine();}, - initialValue: true - }, - highlightSelectedWord: { - set: function(shouldHighlight) {this.$onSelectionChange();}, - initialValue: true - }, - readOnly: { - set: function(readOnly) { - this.textInput.setReadOnly(readOnly); - this.$resetCursorStyle(); + readOnly: true + }, { + name: "goToNextError", + description: "Go to next error", + bindKey: bindKey("Alt-E", "F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, 1); + }); }, - initialValue: false - }, - copyWithEmptySelection: { - set: function(value) { - this.textInput.setCopyWithEmptySelection(value); + scrollIntoView: "animate", + readOnly: true + }, { + name: "goToPreviousError", + description: "Go to previous error", + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), + exec: function (editor) { + config.loadModule("ace/ext/error_marker", function (module) { + module.showErrorMarker(editor, -1); + }); }, - initialValue: false - }, - cursorStyle: { - set: function(val) { this.$resetCursorStyle(); }, - values: ["ace", "slim", "smooth", "wide"], - initialValue: "ace" - }, - mergeUndoDeltas: { - values: [false, true, "always"], - initialValue: true - }, - behavioursEnabled: {initialValue: true}, - wrapBehavioursEnabled: {initialValue: true}, - enableAutoIndent: {initialValue: true}, - autoScrollEditorIntoView: { - set: function(val) {this.setAutoScrollEditorIntoView(val);} - }, - keyboardHandler: { - set: function(val) { this.setKeyboardHandler(val); }, - get: function() { return this.$keybindingId; }, - handlesSet: true - }, - value: { - set: function(val) { this.session.setValue(val); }, - get: function() { return this.getValue(); }, - handlesSet: true, - hidden: true - }, - session: { - set: function(val) { this.setSession(val); }, - get: function() { return this.session; }, - handlesSet: true, - hidden: true - }, - - showLineNumbers: { - set: function(show) { - this.renderer.$gutterLayer.setShowLineNumbers(show); - this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); - if (show && this.$relativeLineNumbers) - relativeNumberRenderer.attach(this); + scrollIntoView: "animate", + readOnly: true + }, { + name: "selectall", + description: "Select all", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function (editor) { editor.selectAll(); }, + readOnly: true + }, { + name: "centerselection", + description: "Center selection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function (editor) { editor.centerSelection(); }, + readOnly: true + }, { + name: "gotoline", + description: "Go to line...", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function (editor, line) { + if (typeof line === "number" && !isNaN(line)) + editor.gotoLine(line); + editor.prompt({ $type: "gotoLine" }); + }, + readOnly: true + }, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function (editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function (editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleFoldWidget", + description: "Toggle fold widget", + bindKey: bindKey("F2", "F2"), + exec: function (editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "toggleParentFoldWidget", + description: "Toggle parent fold widget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function (editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "foldall", + description: "Fold all", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldAllComments", + description: "Fold all comments", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function (editor) { editor.session.foldAllComments(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "foldOther", + description: "Fold other", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function (editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true + }, { + name: "unfoldall", + description: "Unfold all", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function (editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true + }, { + name: "findnext", + description: "Find next", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function (editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "findprevious", + description: "Find previous", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function (editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true + }, { + name: "selectOrFindNext", + description: "Select or find next", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); else - relativeNumberRenderer.detach(this); + editor.findNext(); }, - initialValue: true - }, - relativeLineNumbers: { - set: function(value) { - if (this.$showLineNumbers && value) - relativeNumberRenderer.attach(this); + readOnly: true + }, { + name: "selectOrFindPrevious", + description: "Select or find previous", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); else - relativeNumberRenderer.detach(this); - } + editor.findPrevious(); + }, + readOnly: true + }, { + name: "find", + description: "Find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor); }); + }, + readOnly: true + }, { + name: "overwrite", + description: "Overwrite", + bindKey: "Insert", + exec: function (editor) { editor.toggleOverwrite(); }, + readOnly: true + }, { + name: "selecttostart", + description: "Select to start", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), + exec: function (editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotostart", + description: "Go to start", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function (editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectup", + description: "Select up", + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), + exec: function (editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golineup", + description: "Go line up", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function (editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttoend", + description: "Select to end", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), + exec: function (editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "gotoend", + description: "Go to end", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function (editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" + }, { + name: "selectdown", + description: "Select down", + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), + exec: function (editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "golinedown", + description: "Go line down", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function (editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordleft", + description: "Select word left", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function (editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordleft", + description: "Go to word left", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function (editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolinestart", + description: "Select to line start", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolinestart", + description: "Go to line start", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function (editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectleft", + description: "Select left", + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), + exec: function (editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoleft", + description: "Go to left", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function (editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectwordright", + description: "Select word right", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function (editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotowordright", + description: "Go to word right", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function (editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selecttolineend", + description: "Select to line end", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotolineend", + description: "Go to line end", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function (editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectright", + description: "Select right", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function (editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "gotoright", + description: "Go to right", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function (editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectpagedown", + description: "Select page down", + bindKey: "Shift-PageDown", + exec: function (editor) { editor.selectPageDown(); }, + readOnly: true + }, { + name: "pagedown", + description: "Page down", + bindKey: bindKey(null, "Option-PageDown"), + exec: function (editor) { editor.scrollPageDown(); }, + readOnly: true + }, { + name: "gotopagedown", + description: "Go to page down", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function (editor) { editor.gotoPageDown(); }, + readOnly: true + }, { + name: "selectpageup", + description: "Select page up", + bindKey: "Shift-PageUp", + exec: function (editor) { editor.selectPageUp(); }, + readOnly: true + }, { + name: "pageup", + description: "Page up", + bindKey: bindKey(null, "Option-PageUp"), + exec: function (editor) { editor.scrollPageUp(); }, + readOnly: true + }, { + name: "gotopageup", + description: "Go to page up", + bindKey: "PageUp", + exec: function (editor) { editor.gotoPageUp(); }, + readOnly: true + }, { + name: "scrollup", + description: "Scroll up", + bindKey: bindKey("Ctrl-Up", null), + exec: function (e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "scrolldown", + description: "Scroll down", + bindKey: bindKey("Ctrl-Down", null), + exec: function (e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true + }, { + name: "selectlinestart", + description: "Select line start", + bindKey: "Shift-Home", + exec: function (editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectlineend", + description: "Select line end", + bindKey: "Shift-End", + exec: function (editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "togglerecording", + description: "Toggle recording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function (editor) { editor.commands.toggleRecording(editor); }, + readOnly: true + }, { + name: "replaymacro", + description: "Replay macro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function (editor) { editor.commands.replay(editor); }, + readOnly: true + }, { + name: "jumptomatching", + description: "Jump to matching", + bindKey: bindKey("Ctrl-\\|Ctrl-P", "Command-\\"), + exec: function (editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "selecttomatching", + description: "Select to matching", + bindKey: bindKey("Ctrl-Shift-\\|Ctrl-Shift-P", "Command-Shift-\\"), + exec: function (editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "expandToMatching", + description: "Expand to matching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function (editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true + }, { + name: "passKeysToBrowser", + description: "Pass keys to browser", + bindKey: bindKey(null, null), + exec: function () { }, + passEvent: true, + readOnly: true + }, { + name: "copy", + description: "Copy", + exec: function (editor) { + }, + readOnly: true }, - placeholder: { - set: function(message) { - if (!this.$updatePlaceholder) { - this.$updatePlaceholder = function() { - var value = this.session && (this.renderer.$composition || this.getValue()); - if (value && this.renderer.placeholderNode) { - this.renderer.off("afterRender", this.$updatePlaceholder); - dom.removeCssClass(this.container, "ace_hasPlaceholder"); - this.renderer.placeholderNode.remove(); - this.renderer.placeholderNode = null; - } else if (!value && !this.renderer.placeholderNode) { - this.renderer.on("afterRender", this.$updatePlaceholder); - dom.addCssClass(this.container, "ace_hasPlaceholder"); - var el = dom.createElement("div"); - el.className = "ace_placeholder"; - el.textContent = this.$placeholder || ""; - this.renderer.placeholderNode = el; - this.renderer.content.appendChild(this.renderer.placeholderNode); - } else if (!value && this.renderer.placeholderNode) { - this.renderer.placeholderNode.textContent = this.$placeholder || ""; - } - }.bind(this); - this.on("input", this.$updatePlaceholder); + { + name: "cut", + description: "Cut", + exec: function (editor) { + var cutLine = editor.$copyWithEmptySelection && editor.selection.isEmpty(); + var range = cutLine ? editor.selection.getLineRange() : editor.selection.getRange(); + editor._emit("cut", range); + if (!range.isEmpty()) + editor.session.remove(range); + editor.clearSelection(); + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "paste", + description: "Paste", + exec: function (editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" + }, { + name: "removeline", + description: "Remove line", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function (editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" + }, { + name: "duplicateSelection", + description: "Duplicate selection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function (editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "sortlines", + description: "Sort lines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function (editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" + }, { + name: "togglecomment", + description: "Toggle comment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function (editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "toggleBlockComment", + description: "Toggle block comment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function (editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "modifyNumberUp", + description: "Modify number up", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function (editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "modifyNumberDown", + description: "Modify number down", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function (editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" + }, { + name: "replace", + description: "Replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor, true); }); + } + }, { + name: "undo", + description: "Undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function (editor) { editor.undo(); } + }, { + name: "redo", + description: "Redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function (editor) { editor.redo(); } + }, { + name: "copylinesup", + description: "Copy lines up", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function (editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesup", + description: "Move lines up", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function (editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" + }, { + name: "copylinesdown", + description: "Copy lines down", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function (editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "movelinesdown", + description: "Move lines down", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function (editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" + }, { + name: "del", + description: "Delete", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function (editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "backspace", + description: "Backspace", + bindKey: bindKey("Shift-Backspace|Backspace", "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"), + exec: function (editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "cut_or_delete", + description: "Cut or delete", + bindKey: bindKey("Shift-Delete", null), + exec: function (editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); } - this.$updatePlaceholder(); - } - }, - - hScrollBarAlwaysVisible: "renderer", - vScrollBarAlwaysVisible: "renderer", - highlightGutterLine: "renderer", - animatedScroll: "renderer", - showInvisibles: "renderer", - showPrintMargin: "renderer", - printMarginColumn: "renderer", - printMargin: "renderer", - fadeFoldWidgets: "renderer", - showFoldWidgets: "renderer", - displayIndentGuides: "renderer", - showGutter: "renderer", - fontSize: "renderer", - fontFamily: "renderer", - maxLines: "renderer", - minLines: "renderer", - scrollPastEnd: "renderer", - fixedWidthGutter: "renderer", - theme: "renderer", - hasCssTransforms: "renderer", - maxPixelHeight: "renderer", - useTextareaForIME: "renderer", - - scrollSpeed: "$mouseHandler", - dragDelay: "$mouseHandler", - dragEnabled: "$mouseHandler", - focusTimeout: "$mouseHandler", - tooltipFollowsMouse: "$mouseHandler", + else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestart", + description: "Remove to line start", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function (editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineend", + description: "Remove to line end", + bindKey: bindKey("Alt-Delete", "Ctrl-K|Command-Delete"), + exec: function (editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolinestarthard", + description: "Remove to line start hard", + bindKey: bindKey("Ctrl-Shift-Backspace", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = 0; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removetolineendhard", + description: "Remove to line end hard", + bindKey: bindKey("Ctrl-Shift-Delete", null), + exec: function (editor) { + var range = editor.selection.getRange(); + range.end.column = Number.MAX_VALUE; + editor.session.remove(range); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordleft", + description: "Remove word left", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function (editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "removewordright", + description: "Remove word right", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function (editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "outdent", + description: "Outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "indent", + description: "Indent", + bindKey: bindKey("Tab", "Tab"), + exec: function (editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" + }, { + name: "blockoutdent", + description: "Block outdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function (editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "blockindent", + description: "Block indent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function (editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" + }, { + name: "insertstring", + description: "Insert string", + exec: function (editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "inserttext", + description: "Insert text", + exec: function (editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "splitline", + description: "Split line", + bindKey: bindKey(null, "Ctrl-O"), + exec: function (editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "transposeletters", + description: "Transpose letters", + bindKey: bindKey("Alt-Shift-X", "Ctrl-T"), + exec: function (editor) { editor.transposeLetters(); }, + multiSelectAction: function (editor) { editor.transposeSelections(1); }, + scrollIntoView: "cursor" + }, { + name: "touppercase", + description: "To uppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function (editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "tolowercase", + description: "To lowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function (editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "autoindent", + description: "Auto Indent", + bindKey: bindKey(null, null), + exec: function (editor) { editor.autoIndent(); }, + scrollIntoView: "animate" + }, { + name: "expandtoline", + description: "Expand to line", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function (editor) { + var range = editor.selection.getRange(); + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "openlink", + bindKey: bindKey("Ctrl+F3", "F3"), + exec: function (editor) { editor.openLink(); } + }, { + name: "joinlines", + description: "Join lines", + bindKey: bindKey(null, null), + exec: function (editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } + else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true + }, { + name: "invertSelection", + description: "Invert selection", + bindKey: bindKey(null, null), + exec: function (editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } + else { + newRanges.push(new Range(ranges[i - 1].end.row, ranges[i - 1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + editor.exitMultiSelectMode(); + editor.clearSelection(); + for (var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" + }, { + name: "addLineAfter", + description: "Add new line after the current line", + exec: function (editor) { + editor.selection.clearSelection(); + editor.navigateLineEnd(); + editor.insert("\n"); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "addLineBefore", + description: "Add new line before the current line", + exec: function (editor) { + editor.selection.clearSelection(); + var cursor = editor.getCursorPosition(); + editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE); + editor.insert("\n"); + if (cursor.row === 0) + editor.navigateUp(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "openCommandPallete", + exec: function (editor) { + console.warn("This is an obsolete command. Please use `openCommandPalette` instead."); + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "openCommandPalette", + description: "Open command palette", + bindKey: bindKey("F1", "F1"), + exec: function (editor) { + editor.prompt({ $type: "commands" }); + }, + readOnly: true + }, { + name: "modeSelect", + description: "Change language mode...", + bindKey: bindKey(null, null), + exec: function (editor) { + editor.prompt({ $type: "modes" }); + }, + readOnly: true + }]; +for (var i = 1; i < 9; i++) { + exports.commands.push({ + name: "foldToLevel" + i, + description: "Fold To Level " + i, + level: i, + exec: function (editor) { editor.session.foldToLevel(this.level); }, + scrollIntoView: "center", + readOnly: true + }); +} - firstLineNumber: "session", - overwrite: "session", - newLineMode: "session", - useWorker: "session", - useSoftTabs: "session", - navigateWithinSoftTabs: "session", - tabSize: "session", - wrap: "session", - indentedSoftWrap: "session", - foldStyle: "session", - mode: "session" }); - -var relativeNumberRenderer = { - getText: function(session, row) { - return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; - }, - getWidth: function(session, lastLineNumber, config) { - return Math.max( - lastLineNumber.toString().length, - (config.lastRow + 1).toString().length, - 2 - ) * config.characterWidth; - }, - update: function(e, editor) { - editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); - }, - attach: function(editor) { - editor.renderer.$gutterLayer.$renderer = this; - editor.on("changeSelection", this.update); - this.update(null, editor); - }, - detach: function(editor) { - if (editor.renderer.$gutterLayer.$renderer == this) - editor.renderer.$gutterLayer.$renderer = null; - editor.off("changeSelection", this.update); - this.update(null, editor); +define("ace/keyboard/gutter_handler",["require","exports","module","ace/lib/keys"], function(require, exports, module){"use strict"; +var keys = require('../lib/keys'); +var GutterKeyboardHandler = /** @class */ (function () { + function GutterKeyboardHandler(editor) { + this.editor = editor; + this.gutterLayer = editor.renderer.$gutterLayer; + this.element = editor.renderer.$gutter; + this.lines = editor.renderer.$gutterLayer.$lines; + this.activeRowIndex = null; + this.activeLane = null; + this.annotationTooltip = this.editor.$mouseHandler.$tooltip; } -}; + GutterKeyboardHandler.prototype.addListener = function () { + this.element.addEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.addEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.on("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.removeListener = function () { + this.element.removeEventListener("keydown", this.$onGutterKeyDown.bind(this)); + this.element.removeEventListener("focusout", this.$blurGutter.bind(this)); + this.editor.off("mousewheel", this.$blurGutter.bind(this)); + }; + GutterKeyboardHandler.prototype.$onGutterKeyDown = function (e) { + if (this.annotationTooltip.isOpen) { + e.preventDefault(); + if (e.keyCode === keys["escape"]) + this.annotationTooltip.hide(); + return; + } + if (e.target === this.element) { + if (e.keyCode != keys["enter"]) { + return; + } + e.preventDefault(); + var row = this.editor.getCursorPosition().row; + if (!this.editor.isRowVisible(row)) + this.editor.scrollToLine(row, true, true); + setTimeout( + function () { + var index = this.$rowToRowIndex(this.gutterLayer.$cursorCell.row); + var nearestFoldLaneWidgetIndex = this.$findNearestFoldLaneWidget(index); + var nearestAnnotationIndex = this.$findNearestAnnotation(index); + if (nearestFoldLaneWidgetIndex === null && nearestAnnotationIndex === null) + return; + var futureActiveRowIndex = this.$findClosestNumber(nearestFoldLaneWidgetIndex, nearestAnnotationIndex, index); + if (futureActiveRowIndex === nearestFoldLaneWidgetIndex) { + this.activeLane = "fold"; + this.activeRowIndex = nearestFoldLaneWidgetIndex; + if (this.$isCustomWidgetVisible(nearestFoldLaneWidgetIndex)) { + this.$focusCustomWidget(this.activeRowIndex); + return; + } + else { + this.$focusFoldWidget(this.activeRowIndex); + return; + } + } + else { + this.activeRowIndex = nearestAnnotationIndex; + this.activeLane = "annotation"; + this.$focusAnnotation(this.activeRowIndex); + return; + } + }.bind(this), 10); + return; + } + this.$handleGutterKeyboardInteraction(e); + setTimeout(function () { + this.editor._signal("gutterkeydown", new GutterKeyboardEvent(e, this)); + }.bind(this), 10); + }; + GutterKeyboardHandler.prototype.$handleGutterKeyboardInteraction = function (e) { + if (e.keyCode === keys["tab"]) { + e.preventDefault(); + return; + } + if (e.keyCode === keys["escape"]) { + e.preventDefault(); + this.$blurGutter(); + this.element.focus(); + this.lane = null; + return; + } + if (e.keyCode === keys["up"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetUp(); + break; + case "annotation": + this.$moveAnnotationUp(); + break; + } + return; + } + if (e.keyCode === keys["down"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + this.$moveFoldWidgetDown(); + break; + case "annotation": + this.$moveAnnotationDown(); + break; + } + return; + } + if (e.keyCode === keys["left"]) { + e.preventDefault(); + this.$switchLane("annotation"); + return; + } + if (e.keyCode === keys["right"]) { + e.preventDefault(); + this.$switchLane("fold"); + return; + } + if (e.keyCode === keys["enter"] || e.keyCode === keys["space"]) { + e.preventDefault(); + switch (this.activeLane) { + case "fold": + var row = this.$rowIndexToRow(this.activeRowIndex); + var customWidget = this.editor.session.$gutterCustomWidgets[row]; + if (customWidget) { + if (customWidget.callbacks && customWidget.callbacks.onClick) { + customWidget.callbacks.onClick(e, row); + } + } + else if (this.gutterLayer.session.foldWidgets[row] === 'start') { + this.editor.session.onFoldWidgetClick(this.$rowIndexToRow(this.activeRowIndex), e); + setTimeout( + function () { + if (this.$rowIndexToRow(this.activeRowIndex) !== row) { + this.$blurFoldWidget(this.activeRowIndex); + this.activeRowIndex = this.$rowToRowIndex(row); + this.$focusFoldWidget(this.activeRowIndex); + } + }.bind(this), 10); + break; + } + else if (this.gutterLayer.session.foldWidgets[this.$rowIndexToRow(this.activeRowIndex)] === 'end') { + break; + } + return; + case "annotation": + this.annotationTooltip.showTooltip(this.$rowIndexToRow(this.activeRowIndex)); + this.annotationTooltip.$fromKeyboard = true; + break; + } + return; + } + }; + GutterKeyboardHandler.prototype.$blurGutter = function () { + if (this.activeRowIndex !== null) { + switch (this.activeLane) { + case "fold": + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + break; + case "annotation": + this.$blurAnnotation(this.activeRowIndex); + break; + } + } + if (this.annotationTooltip.isOpen) + this.annotationTooltip.hide(); + return; + }; + GutterKeyboardHandler.prototype.$isFoldWidgetVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getFoldWidget(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$isCustomWidgetVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = !!this.$getCustomWidget(index); + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$isAnnotationVisible = function (index) { + var isRowFullyVisible = this.editor.isRowFullyVisible(this.$rowIndexToRow(index)); + var isIconVisible = this.$getAnnotation(index).style.display !== "none"; + return isRowFullyVisible && isIconVisible; + }; + GutterKeyboardHandler.prototype.$getFoldWidget = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[1]; + }; + GutterKeyboardHandler.prototype.$getCustomWidget = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[3]; + }; + GutterKeyboardHandler.prototype.$getAnnotation = function (index) { + var cell = this.lines.get(index); + var element = cell.element; + return element.childNodes[2]; + }; + GutterKeyboardHandler.prototype.$findNearestFoldLaneWidget = function (index) { + if (this.$isCustomWidgetVisible(index)) + return index; + if (this.$isFoldWidgetVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isCustomWidgetVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isCustomWidgetVisible(index + i)) + return index + i; + if (index - i >= 0 && this.$isFoldWidgetVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isFoldWidgetVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$findNearestAnnotation = function (index) { + if (this.$isAnnotationVisible(index)) + return index; + var i = 0; + while (index - i > 0 || index + i < this.lines.getLength() - 1) { + i++; + if (index - i >= 0 && this.$isAnnotationVisible(index - i)) + return index - i; + if (index + i <= this.lines.getLength() - 1 && this.$isAnnotationVisible(index + i)) + return index + i; + } + return null; + }; + GutterKeyboardHandler.prototype.$focusFoldWidget = function (index) { + if (index == null) + return; + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.add(this.editor.renderer.keyboardFocusClassName); + foldWidget.focus(); + }; + GutterKeyboardHandler.prototype.$focusCustomWidget = function (index) { + if (index == null) + return; + var customWidget = this.$getCustomWidget(index); + if (customWidget) { + customWidget.classList.add(this.editor.renderer.keyboardFocusClassName); + customWidget.focus(); + } + }; + GutterKeyboardHandler.prototype.$focusAnnotation = function (index) { + if (index == null) + return; + var annotation = this.$getAnnotation(index); + annotation.classList.add(this.editor.renderer.keyboardFocusClassName); + annotation.focus(); + }; + GutterKeyboardHandler.prototype.$blurFoldWidget = function (index) { + var foldWidget = this.$getFoldWidget(index); + foldWidget.classList.remove(this.editor.renderer.keyboardFocusClassName); + foldWidget.blur(); + }; + GutterKeyboardHandler.prototype.$blurCustomWidget = function (index) { + var customWidget = this.$getCustomWidget(index); + if (customWidget) { + customWidget.classList.remove(this.editor.renderer.keyboardFocusClassName); + customWidget.blur(); + } + }; + GutterKeyboardHandler.prototype.$blurAnnotation = function (index) { + var annotation = this.$getAnnotation(index); + annotation.classList.remove(this.editor.renderer.keyboardFocusClassName); + annotation.blur(); + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isFoldWidgetVisible(index) || this.$isCustomWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = index; + if (this.$isFoldWidgetVisible(index)) { + this.$focusFoldWidget(this.activeRowIndex); + } + else { + this.$focusCustomWidget(this.activeRowIndex); + } + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveFoldWidgetDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isFoldWidgetVisible(index) || this.$isCustomWidgetVisible(index)) { + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = index; + if (this.$isFoldWidgetVisible(index)) { + this.$focusFoldWidget(this.activeRowIndex); + } + else { + this.$focusCustomWidget(this.activeRowIndex); + } + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationUp = function () { + var index = this.activeRowIndex; + while (index > 0) { + index--; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$moveAnnotationDown = function () { + var index = this.activeRowIndex; + while (index < this.lines.getLength() - 1) { + index++; + if (this.$isAnnotationVisible(index)) { + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = index; + this.$focusAnnotation(this.activeRowIndex); + return; + } + } + return; + }; + GutterKeyboardHandler.prototype.$findClosestNumber = function (num1, num2, target) { + if (num1 === null) + return num2; + if (num2 === null) + return num1; + return (Math.abs(target - num1) <= Math.abs(target - num2)) ? num1 : num2; + }; + GutterKeyboardHandler.prototype.$switchLane = function (desinationLane) { + switch (desinationLane) { + case "annotation": + if (this.activeLane === "annotation") { + break; + } + var annotationIndex = this.$findNearestAnnotation(this.activeRowIndex); + if (annotationIndex == null) { + break; + } + this.activeLane = "annotation"; + this.$blurFoldWidget(this.activeRowIndex); + this.$blurCustomWidget(this.activeRowIndex); + this.activeRowIndex = annotationIndex; + this.$focusAnnotation(this.activeRowIndex); + break; + case "fold": + if (this.activeLane === "fold") { + break; + } + var foldLaneWidgetIndex = this.$findNearestFoldLaneWidget(this.activeRowIndex); + if (foldLaneWidgetIndex === null) { + break; + } + this.activeLane = "fold"; + this.$blurAnnotation(this.activeRowIndex); + this.activeRowIndex = foldLaneWidgetIndex; + if (this.$isCustomWidgetVisible(foldLaneWidgetIndex)) { + this.$focusCustomWidget(this.activeRowIndex); + } + else { + this.$focusFoldWidget(this.activeRowIndex); + } + break; + } + return; + }; + GutterKeyboardHandler.prototype.$rowIndexToRow = function (index) { + var cell = this.lines.get(index); + if (cell) + return cell.row; + return null; + }; + GutterKeyboardHandler.prototype.$rowToRowIndex = function (row) { + for (var i = 0; i < this.lines.getLength(); i++) { + var cell = this.lines.get(i); + if (cell.row == row) + return i; + } + return null; + }; + return GutterKeyboardHandler; +}()); +exports.GutterKeyboardHandler = GutterKeyboardHandler; +var GutterKeyboardEvent = /** @class */ (function () { + function GutterKeyboardEvent(domEvent, gutterKeyboardHandler) { + this.gutterKeyboardHandler = gutterKeyboardHandler; + this.domEvent = domEvent; + } + GutterKeyboardEvent.prototype.getKey = function () { + return keys.keyCodeToString(this.domEvent.keyCode); + }; + GutterKeyboardEvent.prototype.getRow = function () { + return this.gutterKeyboardHandler.$rowIndexToRow(this.gutterKeyboardHandler.activeRowIndex); + }; + GutterKeyboardEvent.prototype.isInAnnotationLane = function () { + return this.gutterKeyboardHandler.activeLane === "annotation"; + }; + GutterKeyboardEvent.prototype.isInFoldLane = function () { + return this.gutterKeyboardHandler.activeLane === "fold"; + }; + return GutterKeyboardEvent; +}()); +exports.GutterKeyboardEvent = GutterKeyboardEvent; -exports.Editor = Editor; }); -define("ace/undomanager",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; -var UndoManager = function() { - this.$maxRev = 0; - this.$fromUndo = false; - this.reset(); -}; - -(function() { - - this.addSession = function(session) { - this.$session = session; +define("ace/editor",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/keyboard/gutter_handler","ace/config","ace/clipboard","ace/lib/keys","ace/lib/event","ace/tooltip"], function(require, exports, module){"use strict"; +var __values = (this && this.__values) || function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } }; - this.add = function(delta, allowMerge, session) { - if (this.$fromUndo) return; - if (delta == this.$lastDelta) return; - if (!this.$keepRedoStack) this.$redoStack.length = 0; - if (allowMerge === false || !this.lastDeltas) { - this.lastDeltas = []; - this.$undoStack.push(this.lastDeltas); - delta.id = this.$rev = ++this.$maxRev; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +}; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var GutterKeyboardHandler = require("./keyboard/gutter_handler").GutterKeyboardHandler; +var nls = require("./config").nls; +var clipboard = require("./clipboard"); +var keys = require('./lib/keys'); +var event = require("./lib/event"); +var HoverTooltip = require("./tooltip").HoverTooltip; +var Editor = /** @class */ (function () { + function Editor(renderer, session, options) { + this.id = "editor" + (++Editor.$uid); this.session; + this.$toDestroy = []; + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + if (typeof document == "object") { + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + } + this.keyBinding = new KeyBinding(this); + this.$search = new Search().set({ + wrap: true + }); + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + this.$initOperationListeners(); + this._$emitInputEvent = lang.delayedCall(function () { + this._signal("input", {}); + if (this.session && !this.session.destroyed) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + this.on("change", function (_, _self) { + _self._$emitInputEvent.schedule(31); + }); + this.setSession(session || options && options.session || new EditSession("")); + config.resetOptions(this); + if (options) + this.setOptions(options); + config._signal("editor", this); + } + Editor.prototype.$initOperationListeners = function () { + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + }; + Editor.prototype.startOperation = function (commandEvent) { + this.session.startOperation(commandEvent); + }; + Editor.prototype.endOperation = function (e) { + this.session.endOperation(e); + }; + Editor.prototype.onStartOperation = function (commandEvent) { + this.curOp = this.session.curOp; + this.curOp.scrollTop = this.renderer.scrollTop; + this.prevOp = this.session.prevOp; + if (!commandEvent) { + this.previousCommand = null; + } + }; + Editor.prototype.onEndOperation = function (e) { + if (this.curOp && this.session) { + if (e && e.returnValue === false) { + this.curOp = null; + return; + } + this._signal("beforeEndOperation"); + if (!this.curOp) + return; + var command = this.curOp.command; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + this.$lastSel = this.session.selection.toJSON(); + this.prevOp = this.curOp; + this.curOp = null; + } + }; + Editor.prototype.$historyTracker = function (e) { + if (!this.$mergeUndoDeltas) + return; + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + this.mergeNextCommand = true; + } + else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + if (this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000) { + shouldMerge = false; // the sequence is too long + } + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + Editor.prototype.setKeyboardHandler = function (keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string" && keyboardHandler != "ace") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function (module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } + else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + Editor.prototype.getKeyboardHandler = function () { + return this.keyBinding.getKeyboardHandler(); + }; + Editor.prototype.setSession = function (session) { + if (this.session == session) + return; + if (this.curOp) + this.endOperation(); + this.curOp = {}; + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + this.session.off("startOperation", this.$onStartOperation); + this.session.off("endOperation", this.$onEndOperation); + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + this.$onStartOperation = this.onStartOperation.bind(this); + this.session.on("startOperation", this.$onStartOperation); + this.$onEndOperation = this.onEndOperation.bind(this); + this.session.on("endOperation", this.$onEndOperation); + this.onChangeMode(); + this.onCursorChange(); + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } + else { + this.selection = null; + this.renderer.setSession(session); + } + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + this.curOp = null; + oldSession && oldSession._signal("changeEditor", { oldEditor: this }); + if (oldSession) + oldSession.$editor = null; + session && session._signal("changeEditor", { editor: this }); + if (session) + session.$editor = this; + if (session && !session.destroyed) + session.bgTokenizer.scheduleStart(); + }; + Editor.prototype.getSession = function () { + return this.session; + }; + Editor.prototype.setValue = function (val, cursorPos) { + this.session.doc.setValue(val); + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + return val; + }; + Editor.prototype.getValue = function () { + return this.session.getValue(); + }; + Editor.prototype.getSelection = function () { + return this.selection; + }; + Editor.prototype.resize = function (force) { + this.renderer.onResize(force); + }; + Editor.prototype.setTheme = function (theme, cb) { + this.renderer.setTheme(theme, cb); + }; + Editor.prototype.getTheme = function () { + return this.renderer.getTheme(); + }; + Editor.prototype.setStyle = function (style, incluude) { + this.renderer.setStyle(style, incluude); + }; + Editor.prototype.unsetStyle = function (style) { + this.renderer.unsetStyle(style); + }; + Editor.prototype.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container).fontSize; + }; + Editor.prototype.setFontSize = function (size) { + this.setOption("fontSize", size); + }; + Editor.prototype.$highlightBrackets = function () { + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function () { + self.$highlightPending = false; + var session = self.session; + if (!session || session.destroyed) + return; + if (session.$bracketHighlight) { + session.$bracketHighlight.markerIds.forEach(function (id) { + session.removeMarker(id); + }); + session.$bracketHighlight = null; + } + var pos = self.getCursorPosition(); + var handler = self.getKeyboardHandler(); + var isBackwards = handler && handler.$getDirectionForHighlight && handler.$getDirectionForHighlight(self); + var ranges = session.getMatchingBracketRanges(pos, isBackwards); + if (!ranges) { + var iterator = new TokenIterator(session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + if (token && /\b(?:tag-open|tag-name)/.test(token.type)) { + var tagNamesRanges = session.getMatchingTags(pos); + if (tagNamesRanges) { + ranges = [ + tagNamesRanges.openTagName.isEmpty() ? tagNamesRanges.openTag : tagNamesRanges.openTagName, + tagNamesRanges.closeTagName.isEmpty() ? tagNamesRanges.closeTag : tagNamesRanges.closeTagName + ]; + } + } + } + if (!ranges && session.$mode.getMatching) + ranges = session.$mode.getMatching(self.session); + if (!ranges) { + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + return; + } + var markerType = "ace_bracket"; + if (!Array.isArray(ranges)) { + ranges = [ranges]; + } + else if (ranges.length == 1) { + markerType = "ace_error_bracket"; + } + if (ranges.length == 2) { + if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0) + ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)]; + else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0) + ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)]; + } + session.$bracketHighlight = { + ranges: ranges, + markerIds: ranges.map(function (range) { + return session.addMarker(range, markerType, "text"); + }) + }; + if (self.getHighlightIndentGuides()) + self.renderer.$textLayer.$highlightIndentGuide(); + }, 50); + }; + Editor.prototype.focus = function () { + this.textInput.focus(); + }; + Editor.prototype.isFocused = function () { + return this.textInput.isFocused(); + }; + Editor.prototype.blur = function () { + this.textInput.blur(); + }; + Editor.prototype.onFocus = function (e) { + if (this.$isFocused) + return; + this.$isFocused = true; + this.renderer.showCursor(); + this.renderer.visualizeFocus(); + this._emit("focus", e); + }; + Editor.prototype.onBlur = function (e) { + if (!this.$isFocused) + return; + this.$isFocused = false; + this.renderer.hideCursor(); + this.renderer.visualizeBlur(); + this._emit("blur", e); + }; + Editor.prototype.$cursorChange = function () { + this.renderer.updateCursor(); + this.$highlightBrackets(); + this.$updateHighlightActiveLine(); + }; + Editor.prototype.onDocumentChange = function (delta) { + var wrap = this.session.$useWrapMode; + var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity); + this.renderer.updateLines(delta.start.row, lastRow, wrap); + this._signal("change", delta); + this.$cursorChange(); + }; + Editor.prototype.onTokenizerUpdate = function (e) { + var rows = e.data; + this.renderer.updateLines(rows.first, rows.last); + }; + Editor.prototype.onScrollTopChange = function () { + this.renderer.scrollToY(this.session.getScrollTop()); + }; + Editor.prototype.onScrollLeftChange = function () { + this.renderer.scrollToX(this.session.getScrollLeft()); + }; + Editor.prototype.onCursorChange = function () { + this.$cursorChange(); + this._signal("changeSelection"); + }; + Editor.prototype.$updateHighlightActiveLine = function () { + var session = this.getSession(); + var highlight; + if (this.$highlightActiveLine) { + if (this.$selectionStyle != "line" || !this.selection.isMultiLine()) + highlight = this.getCursorPosition(); + if (this.renderer.theme && this.renderer.theme.$selectionColorConflict && !this.selection.isEmpty()) + highlight = false; + if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) + highlight = false; + } + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } + else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } + else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + Editor.prototype.onSelectionChange = function (e) { + var session = this.session; + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } + else { + this.$updateHighlightActiveLine(); + } + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + this._signal("changeSelection"); + }; + Editor.prototype.$getSelectionHighLightRegexp = function () { + var session = this.session; + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + var startColumn = selection.start.column; + var endColumn = selection.end.column; + var line = session.getLine(selection.start.row); + var needle = line.substring(startColumn, endColumn); + if (needle.length > 5000 || !/[\w\d]/.test(needle)) + return; + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1); + if (!re.test(wordWithBoundary)) + return; + return re; + }; + Editor.prototype.onChangeFrontMarker = function () { + this.renderer.updateFrontMarkers(); + }; + Editor.prototype.onChangeBackMarker = function () { + this.renderer.updateBackMarkers(); + }; + Editor.prototype.onChangeBreakpoint = function () { + this.renderer.updateBreakpoints(); + }; + Editor.prototype.onChangeAnnotation = function () { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + Editor.prototype.onChangeMode = function (e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + Editor.prototype.onChangeWrapLimit = function () { + this.renderer.updateFull(); + }; + Editor.prototype.onChangeWrapMode = function () { + this.renderer.onResize(true); + }; + Editor.prototype.onChangeFold = function () { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + Editor.prototype.getSelectedText = function () { + return this.session.getTextRange(this.getSelectionRange()); + }; + Editor.prototype.getCopyText = function () { + var text = this.getSelectedText(); + var nl = this.session.doc.getNewLineCharacter(); + var copyLine = false; + if (!text && this.$copyWithEmptySelection) { + copyLine = true; + var ranges = this.selection.getAllRanges(); + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (i && ranges[i - 1].start.row == range.start.row) + continue; + text += this.session.getLine(range.start.row) + nl; + } + } + var e = { text: text }; + this._signal("copy", e); + clipboard.lineMode = copyLine ? e.text : false; + return e.text; + }; + Editor.prototype.onCopy = function () { + this.commands.exec("copy", this); + }; + Editor.prototype.onCut = function () { + this.commands.exec("cut", this); + }; + Editor.prototype.onPaste = function (text, event) { + var e = { text: text, event: event }; + this.commands.exec("paste", this, e); + }; + Editor.prototype.$handlePaste = function (e) { + if (typeof e == "string") + e = { text: e }; + this._signal("paste", e); + var text = e.text; + var lineMode = text === clipboard.lineMode; + var session = this.session; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + if (lineMode) + session.insert({ row: this.selection.lead.row, column: 0 }, text); + else + this.insert(text); + } + else if (lineMode) { + this.selection.rangeList.ranges.forEach(function (range) { + session.insert({ row: range.start.row, column: 0 }, text); + }); + } + else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]); + if (lines.length != ranges.length || isFullLine) + return this.commands.exec("insertstring", this, text); + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + session.remove(range); + session.insert(range.start, lines[i]); + } + } + }; + Editor.prototype.execCommand = function (command, args) { + return this.commands.exec(command, this, args); + }; + Editor.prototype.insert = function (text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + if (!this.inVirtualSelectionMode) { + this.session.mergeUndoDeltas = false; + this.mergeNextCommand = false; + } + } + text = transform.text; + } + } + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite() && text.indexOf("\n") == -1) { + var range = Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + session.insert(cursor, text); + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange(new Range(cursor.row, start + transform.selection[0], cursor.row, start + transform.selection[1])); + } + else { // Transform relative to the current row. + this.selection.setSelectionRange(new Range(cursor.row + transform.selection[0], transform.selection[1], cursor.row + transform.selection[2], transform.selection[3])); + } + } + if (this.$enableAutoIndent) { + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + session.insert({ row: cursor.row + 1, column: 0 }, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + } + }; + Editor.prototype.autoIndent = function () { + var session = this.session; + var mode = session.getMode(); + var ranges = this.selection.isEmpty() + ? [new Range(0, 0, session.doc.getLength() - 1, 0)] + : this.selection.getAllRanges(); + var prevLineState = ""; + var prevLine = ""; + var lineIndent = ""; + var tab = session.getTabString(); + for (var i = 0; i < ranges.length; i++) { + var startRow = ranges[i].start.row; + var endRow = ranges[i].end.row; + for (var row = startRow; row <= endRow; row++) { + if (row > 0) { + prevLineState = session.getState(row - 1); + prevLine = session.getLine(row - 1); + lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab); + } + var line = session.getLine(row); + var currIndent = mode.$getIndent(line); + if (lineIndent !== currIndent) { + if (currIndent.length > 0) { + var range = new Range(row, 0, row, currIndent.length); + session.remove(range); + } + if (lineIndent.length > 0) { + session.insert({ row: row, column: 0 }, lineIndent); + } + } + mode.autoOutdent(prevLineState, session, row); + } + } + }; + Editor.prototype.onTextInput = function (text, composition) { + if (!composition) + return this.keyBinding.onTextInput(text); + this.startOperation({ command: { name: "insertstring" } }); + var applyComposition = this.applyComposition.bind(this, text, composition); + if (this.selection.rangeCount) + this.forEachSelection(applyComposition); + else + applyComposition(); + this.endOperation(); + }; + Editor.prototype.applyComposition = function (text, composition) { + if (composition.extendLeft || composition.extendRight) { + var r = this.selection.getRange(); + r.start.column -= composition.extendLeft; + r.end.column += composition.extendRight; + if (r.start.column < 0) { + r.start.row--; + r.start.column += this.session.getLine(r.start.row).length + 1; + } + this.selection.setRange(r); + if (!text && !r.isEmpty()) + this.remove(); + } + if (text || !this.selection.isEmpty()) + this.insert(text, true); + if (composition.restoreStart || composition.restoreEnd) { + var r = this.selection.getRange(); + r.start.column -= composition.restoreStart; + r.end.column -= composition.restoreEnd; + this.selection.setRange(r); + } + }; + Editor.prototype.onCommandKey = function (e, hashId, keyCode) { + return this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + Editor.prototype.setOverwrite = function (overwrite) { + this.session.setOverwrite(overwrite); + }; + Editor.prototype.getOverwrite = function () { + return this.session.getOverwrite(); + }; + Editor.prototype.toggleOverwrite = function () { + this.session.toggleOverwrite(); + }; + Editor.prototype.setScrollSpeed = function (speed) { + this.setOption("scrollSpeed", speed); + }; + Editor.prototype.getScrollSpeed = function () { + return this.getOption("scrollSpeed"); + }; + Editor.prototype.setDragDelay = function (dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + Editor.prototype.getDragDelay = function () { + return this.getOption("dragDelay"); + }; + Editor.prototype.setSelectionStyle = function (val) { + this.setOption("selectionStyle", val); + }; + Editor.prototype.getSelectionStyle = function () { + return this.getOption("selectionStyle"); + }; + Editor.prototype.setHighlightActiveLine = function (shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + Editor.prototype.getHighlightActiveLine = function () { + return this.getOption("highlightActiveLine"); + }; + Editor.prototype.setHighlightGutterLine = function (shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + Editor.prototype.getHighlightGutterLine = function () { + return this.getOption("highlightGutterLine"); + }; + Editor.prototype.setHighlightSelectedWord = function (shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + Editor.prototype.getHighlightSelectedWord = function () { + return this.$highlightSelectedWord; + }; + Editor.prototype.setAnimatedScroll = function (shouldAnimate) { + this.renderer.setAnimatedScroll(shouldAnimate); + }; + Editor.prototype.getAnimatedScroll = function () { + return this.renderer.getAnimatedScroll(); + }; + Editor.prototype.setShowInvisibles = function (showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + Editor.prototype.getShowInvisibles = function () { + return this.renderer.getShowInvisibles(); + }; + Editor.prototype.setDisplayIndentGuides = function (display) { + this.renderer.setDisplayIndentGuides(display); + }; + Editor.prototype.getDisplayIndentGuides = function () { + return this.renderer.getDisplayIndentGuides(); + }; + Editor.prototype.setHighlightIndentGuides = function (highlight) { + this.renderer.setHighlightIndentGuides(highlight); + }; + Editor.prototype.getHighlightIndentGuides = function () { + return this.renderer.getHighlightIndentGuides(); + }; + Editor.prototype.setShowPrintMargin = function (showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + Editor.prototype.getShowPrintMargin = function () { + return this.renderer.getShowPrintMargin(); + }; + Editor.prototype.setPrintMarginColumn = function (showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + Editor.prototype.getPrintMarginColumn = function () { + return this.renderer.getPrintMarginColumn(); + }; + Editor.prototype.setReadOnly = function (readOnly) { + this.setOption("readOnly", readOnly); + }; + Editor.prototype.getReadOnly = function () { + return this.getOption("readOnly"); + }; + Editor.prototype.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + Editor.prototype.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + Editor.prototype.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + Editor.prototype.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + Editor.prototype.setShowFoldWidgets = function (show) { + this.setOption("showFoldWidgets", show); + }; + Editor.prototype.getShowFoldWidgets = function () { + return this.getOption("showFoldWidgets"); + }; + Editor.prototype.setFadeFoldWidgets = function (fade) { + this.setOption("fadeFoldWidgets", fade); + }; + Editor.prototype.getFadeFoldWidgets = function () { + return this.getOption("fadeFoldWidgets"); + }; + Editor.prototype.remove = function (dir) { + if (this.selection.isEmpty()) { + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.removeWordRight = function () { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeWordLeft = function () { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineStart = function () { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + if (this.selection.isEmpty()) + this.selection.selectLeft(); + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + Editor.prototype.removeToLineEnd = function () { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + this.session.remove(range); + this.clearSelection(); + }; + Editor.prototype.splitLine = function () { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + Editor.prototype.setGhostText = function (text, position) { + this.renderer.setGhostText(text, position); + }; + Editor.prototype.removeGhostText = function () { + this.renderer.removeGhostText(); + }; + Editor.prototype.transposeLetters = function () { + if (!this.selection.isEmpty()) { + return; + } + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column - 1); + range = new Range(cursor.row, column - 1, cursor.row, column + 1); + } + else { + swap = line.charAt(column - 1) + line.charAt(column - 2); + range = new Range(cursor.row, column - 2, cursor.row, column); + } + this.session.replace(range, swap); + this.session.selection.moveToPosition(range.end); + }; + Editor.prototype.toLowerCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.toUpperCase = function () { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + Editor.prototype.indent = function () { + var session = this.session; + var range = this.getSelectionRange(); + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } + else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + Editor.prototype.blockIndent = function () { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + Editor.prototype.blockOutdent = function () { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + Editor.prototype.sortLines = function () { + var rows = this.$getSelectedRows(); + var session = this.session; + var lines = []; + for (var i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + lines.sort(function (a, b) { + if (a.toLowerCase() < b.toLowerCase()) + return -1; + if (a.toLowerCase() > b.toLowerCase()) + return 1; + return 0; + }); + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i - rows.first]); + } + }; + Editor.prototype.toggleCommentLines = function () { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + Editor.prototype.toggleBlockComment = function () { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + Editor.prototype.getNumberAt = function (row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if (m.index <= column && m.index + m[0].length >= column) { + var number = { + value: m[0], + start: m.index, + end: m.index + m[0].length + }; + return number; + } + } + return null; + }; + Editor.prototype.modifyNumber = function (amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column - 1, row, column); + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + if (fp !== nr.end && column < fp) { + amount *= Math.pow(10, nr.end - column - 1); + } + else { + amount *= Math.pow(10, nr.end - column); + } + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start + 1, column + nnr.length - nr.value.length)); + } + } + else { + this.toggleWord(); + } + }; + Editor.prototype.toggleWord = function () { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + this.selection.selectWord(); + var currentState = this.getSelectedText(); + var currWordStart = this.selection.getWordRange().start.column; + var wordParts = currentState.replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, '$1 ').split(/\s/); + var delta = column - currWordStart - 1; + if (delta < 0) + delta = 0; + var curLength = 0, itLength = 0; + var that = this; + if (currentState.match(/[A-Za-z0-9_]+/)) { + wordParts.forEach(function (item, i) { + itLength = curLength + item.length; + if (delta >= curLength && delta <= itLength) { + currentState = item; + that.selection.clearSelection(); + that.moveCursorTo(row, curLength + currWordStart); + that.selection.selectTo(row, itLength + currWordStart); + } + curLength = itLength; + }); + } + var wordPairs = this.$toggleWordPairs; + var reg; + for (var i = 0; i < wordPairs.length; i++) { + var item = wordPairs[i]; + for (var j = 0; j <= 1; j++) { + var negate = +!j; + var firstCondition = currentState.match(new RegExp('^\\s?_?(' + lang.escapeRegExp(item[j]) + ')\\s?$', 'i')); + if (firstCondition) { + var secondCondition = currentState.match(new RegExp('([_]|^|\\s)(' + lang.escapeRegExp(firstCondition[1]) + ')($|\\s)', 'g')); + if (secondCondition) { + reg = currentState.replace(new RegExp(lang.escapeRegExp(item[j]), 'i'), function (result) { + var res = item[negate]; + if (result.toUpperCase() == result) { + res = res.toUpperCase(); + } + else if (result.charAt(0).toUpperCase() == result.charAt(0)) { + res = res.substr(0, 0) + item[negate].charAt(0).toUpperCase() + res.substr(1); + } + return res; + }); + this.insert(reg); + reg = ""; + } + } + } + } + }; + Editor.prototype.findLinkAt = function (row, column) { + var e_1, _a; + var line = this.session.getLine(row); + var wordParts = line.split(/((?:https?|ftp):\/\/[\S]+)/); + var columnPosition = column; + if (columnPosition < 0) + columnPosition = 0; + var previousPosition = 0, currentPosition = 0, match; + try { + for (var wordParts_1 = __values(wordParts), wordParts_1_1 = wordParts_1.next(); !wordParts_1_1.done; wordParts_1_1 = wordParts_1.next()) { + var item = wordParts_1_1.value; + currentPosition = previousPosition + item.length; + if (columnPosition >= previousPosition && columnPosition <= currentPosition) { + if (item.match(/((?:https?|ftp):\/\/[\S]+)/)) { + match = item.replace(/[\s:.,'";}\]]+$/, ""); + break; + } + } + previousPosition = currentPosition; + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (wordParts_1_1 && !wordParts_1_1.done && (_a = wordParts_1.return)) _a.call(wordParts_1); + } + finally { if (e_1) throw e_1.error; } + } + return match; + }; + Editor.prototype.openLink = function () { + var cursor = this.selection.getCursor(); + var url = this.findLinkAt(cursor.row, cursor.column); + if (url) + window.open(url, '_blank'); + return url != null; + }; + Editor.prototype.removeLines = function () { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + Editor.prototype.duplicateSelection = function () { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } + else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range)); + range.start = point; + range.end = endPoint; + sel.setSelectionRange(range, reverse); + } + }; + Editor.prototype.moveLinesDown = function () { + this.$moveLines(1, false); + }; + Editor.prototype.moveLinesUp = function () { + this.$moveLines(-1, false); + }; + Editor.prototype.moveText = function (range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + Editor.prototype.copyLinesUp = function () { + this.$moveLines(-1, true); + }; + Editor.prototype.copyLinesDown = function () { + this.$moveLines(1, true); + }; + Editor.prototype.$moveLines = function (dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) + moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } + else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) + ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) + rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) + diff = 0; + totalDiff += diff; + } + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + Editor.prototype.$getSelectedRows = function (range) { + range = (range || this.getSelectionRange()).collapseRows(); + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + Editor.prototype.onCompositionStart = function (compositionState) { + this.renderer.showComposition(compositionState); + }; + Editor.prototype.onCompositionUpdate = function (text) { + this.renderer.setCompositionText(text); + }; + Editor.prototype.onCompositionEnd = function () { + this.renderer.hideComposition(); + }; + Editor.prototype.getFirstVisibleRow = function () { + return this.renderer.getFirstVisibleRow(); + }; + Editor.prototype.getLastVisibleRow = function () { + return this.renderer.getLastVisibleRow(); + }; + Editor.prototype.isRowVisible = function (row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + Editor.prototype.isRowFullyVisible = function (row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + Editor.prototype.$getVisibleRowCount = function () { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + Editor.prototype.$moveByPage = function (dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + if (select === true) { + this.selection.$moveSelection(function () { + this.moveCursorBy(rows, 0); + }); + } + else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + var scrollTop = renderer.scrollTop; + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + renderer.animateScrolling(scrollTop); + }; + Editor.prototype.selectPageDown = function () { + this.$moveByPage(1, true); + }; + Editor.prototype.selectPageUp = function () { + this.$moveByPage(-1, true); + }; + Editor.prototype.gotoPageDown = function () { + this.$moveByPage(1, false); + }; + Editor.prototype.gotoPageUp = function () { + this.$moveByPage(-1, false); + }; + Editor.prototype.scrollPageDown = function () { + this.$moveByPage(1); + }; + Editor.prototype.scrollPageUp = function () { + this.$moveByPage(-1); + }; + Editor.prototype.scrollToRow = function (row) { + this.renderer.scrollToRow(row); + }; + Editor.prototype.scrollToLine = function (line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + Editor.prototype.centerSelection = function () { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + Editor.prototype.getCursorPosition = function () { + return this.selection.getCursor(); + }; + Editor.prototype.getCursorPositionScreen = function () { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + Editor.prototype.getSelectionRange = function () { + return this.selection.getRange(); + }; + Editor.prototype.selectAll = function () { + this.selection.selectAll(); + }; + Editor.prototype.clearSelection = function () { + this.selection.clearSelection(); + }; + Editor.prototype.moveCursorTo = function (row, column) { + this.selection.moveCursorTo(row, column); + }; + Editor.prototype.moveCursorToPosition = function (pos) { + this.selection.moveCursorToPosition(pos); + }; + Editor.prototype.jumpToMatching = function (select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var tokenCount = 0; + if (prevToken && prevToken.type.indexOf('tag-name') !== -1) { + prevToken = iterator.stepBackward(); + } + var token = prevToken || iterator.stepForward(); + if (!token) + return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + if (prevToken.value === '<' && tokenCount > 1) { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if (this.$tryReplace(ranges[i], replacement)) { + replaced++; + } } - this.$fromUndo = false; - - return redoSelectionRange; - }; - - this.$syncRev = function() { - var stack = this.$undoStack; - var nextDelta = stack[stack.length - 1]; - var id = nextDelta && nextDelta[0].id || 0; - this.$redoStackBaseRev = id; - this.$rev = id; + this.selection.setSelectionRange(selection); + return replaced; }; - this.reset = function() { - this.lastDeltas = null; - this.$lastDelta = null; - this.$undoStack = []; - this.$redoStack = []; - this.$rev = 0; - this.mark = 0; - this.$redoStackBaseRev = this.$rev; - this.selections = []; + Editor.prototype.$tryReplace = function (range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } + else { + return null; + } }; - this.canUndo = function() { - return this.$undoStack.length > 0; + Editor.prototype.getLastSearchOptions = function () { + return this.$search.getOptions(); }; - this.canRedo = function() { - return this.$redoStack.length > 0; + Editor.prototype.find = function (needle, options, animate) { + if (!options) + options = {}; + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({ needle: needle }); + } + this.$search.set(options); + if (!options.start) + this.$search.set({ start: range }); + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); }; - this.bookmark = function(rev) { - if (rev == undefined) - rev = this.$rev; - this.mark = rev; + Editor.prototype.findNext = function (options, animate) { + this.find({ skipCurrent: true, backwards: false }, options, animate); }; - this.isAtBookmark = function() { - return this.$rev === this.mark; + Editor.prototype.findPrevious = function (options, animate) { + this.find(options, { skipCurrent: true, backwards: true }, animate); }; - - this.toJSON = function() { - + Editor.prototype.revealRange = function (range, animate) { + this.session.unfold(range); + this.selection.setSelectionRange(range); + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); }; - - this.fromJSON = function() { - + Editor.prototype.undo = function () { + this.session.getUndoManager().undo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); }; - - this.hasUndo = this.canUndo; - this.hasRedo = this.canRedo; - this.isClean = this.isAtBookmark; - this.markClean = this.bookmark; - - this.$prettyPrint = function(delta) { - if (delta) return stringifyDelta(delta); - return stringifyDelta(this.$undoStack) + "\n---\n" + stringifyDelta(this.$redoStack); + Editor.prototype.redo = function () { + this.session.getUndoManager().redo(this.session); + this.renderer.scrollCursorIntoView(null, 0.5); }; -}).call(UndoManager.prototype); - -function rearrangeUndoStack(stack, pos) { - for (var i = pos; i--; ) { - var deltaSet = stack[i]; - if (deltaSet && !deltaSet[0].ignore) { - while(i < pos - 1) { - var swapped = swapGroups(stack[i], stack[i + 1]); - stack[i] = swapped[0]; - stack[i + 1] = swapped[1]; - i++; - } - return true; - } - } -} - -var Range = require("./range").Range; -var cmp = Range.comparePoints; -var comparePoints = Range.comparePoints; - -function $updateMarkers(delta) { - var isInsert = delta.action == "insert"; - var start = delta.start; - var end = delta.end; - var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); - var colShift = (end.column - start.column) * (isInsert ? 1 : -1); - if (isInsert) end = start; - - for (var i in this.marks) { - var point = this.marks[i]; - var cmp = comparePoints(point, start); - if (cmp < 0) { - continue; // delta starts after the range + Editor.prototype.destroy = function () { + this.destroyed = true; + if (this.$toDestroy) { + this.$toDestroy.forEach(function (el) { + el.destroy(); + }); + this.$toDestroy = []; } - if (cmp === 0) { - if (isInsert) { - if (point.bias == 1) { - cmp = 1; + if (this.$mouseHandler) + this.$mouseHandler.destroy(); + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) + this.session.destroy(); + if (this._$emitInputEvent) + this._$emitInputEvent.cancel(); + this.removeAllListeners(); + }; + Editor.prototype.setAutoScrollEditorIntoView = function (enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function () { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function () { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function () { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused())) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } + else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; } else { - point.bias == -1; - continue; + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); } + shouldScroll = rect = null; } - } - var cmp2 = isInsert ? cmp : comparePoints(point, end); - if (cmp2 > 0) { - point.row += rowShift; - point.column += point.row == end.row ? colShift : 0; - continue; - } - if (!isInsert && cmp2 <= 0) { - point.row = start.row; - point.column = start.column; - if (cmp2 === 0) - point.bias = 1; - } - } -} - - - -function clonePos(pos) { - return {row: pos.row,column: pos.column}; -} -function cloneDelta(d) { - return { - start: clonePos(d.start), - end: clonePos(d.end), - action: d.action, - lines: d.lines.slice() + }); + this.setAutoScrollEditorIntoView = function (enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; }; -} -function stringifyDelta(d) { - d = d || this; - if (Array.isArray(d)) { - return d.map(stringifyDelta).join("\n"); - } - var type = ""; - if (d.action) { - type = d.action == "insert" ? "+" : "-"; - type += "[" + d.lines + "]"; - } else if (d.value) { - if (Array.isArray(d.value)) { - type = d.value.map(stringifyRange).join("\n"); - } else { - type = stringifyRange(d.value); - } - } - if (d.start) { - type += stringifyRange(d); - } - if (d.id || d.rev) { - type += "\t(" + (d.id || d.rev) + ")"; - } - return type; -} -function stringifyRange(r) { - return r.start.row + ":" + r.start.column - + "=>" + r.end.row + ":" + r.end.column; -} - -function swap(d1, d2) { - var i1 = d1.action == "insert"; - var i2 = d2.action == "insert"; - - if (i1 && i2) { - if (cmp(d2.start, d1.end) >= 0) { - shift(d2, d1, -1); - } else if (cmp(d2.start, d1.start) <= 0) { - shift(d1, d2, +1); - } else { - return null; - } - } else if (i1 && !i2) { - if (cmp(d2.start, d1.end) >= 0) { - shift(d2, d1, -1); - } else if (cmp(d2.end, d1.start) <= 0) { - shift(d1, d2, -1); - } else { - return null; - } - } else if (!i1 && i2) { - if (cmp(d2.start, d1.start) >= 0) { - shift(d2, d1, +1); - } else if (cmp(d2.start, d1.start) <= 0) { - shift(d1, d2, +1); - } else { - return null; - } - } else if (!i1 && !i2) { - if (cmp(d2.start, d1.start) >= 0) { - shift(d2, d1, +1); - } else if (cmp(d2.end, d1.start) <= 0) { - shift(d1, d2, -1); - } else { - return null; - } - } - return [d2, d1]; -} -function swapGroups(ds1, ds2) { - for (var i = ds1.length; i--; ) { - for (var j = 0; j < ds2.length; j++) { - if (!swap(ds1[i], ds2[j])) { - while (i < ds1.length) { - while (j--) { - swap(ds2[j], ds1[i]); - } - j = ds2.length; - i++; - } - return [ds1, ds2]; - } - } - } - ds1.selectionBefore = ds2.selectionBefore = - ds1.selectionAfter = ds2.selectionAfter = null; - return [ds2, ds1]; -} -function xform(d1, c1) { - var i1 = d1.action == "insert"; - var i2 = c1.action == "insert"; - - if (i1 && i2) { - if (cmp(d1.start, c1.start) < 0) { - shift(c1, d1, 1); - } else { - shift(d1, c1, 1); - } - } else if (i1 && !i2) { - if (cmp(d1.start, c1.end) >= 0) { - shift(d1, c1, -1); - } else if (cmp(d1.start, c1.start) <= 0) { - shift(c1, d1, +1); - } else { - shift(d1, Range.fromPoints(c1.start, d1.start), -1); - shift(c1, d1, +1); - } - } else if (!i1 && i2) { - if (cmp(c1.start, d1.end) >= 0) { - shift(c1, d1, -1); - } else if (cmp(c1.start, d1.start) <= 0) { - shift(d1, c1, +1); - } else { - shift(c1, Range.fromPoints(d1.start, c1.start), -1); - shift(d1, c1, +1); - } - } else if (!i1 && !i2) { - if (cmp(c1.start, d1.end) >= 0) { - shift(c1, d1, -1); - } else if (cmp(c1.end, d1.start) <= 0) { - shift(d1, c1, -1); - } else { - var before, after; - if (cmp(d1.start, c1.start) < 0) { - before = d1; - d1 = splitDelta(d1, c1.start); + Editor.prototype.$resetCursorStyle = function () { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + Editor.prototype.prompt = function (message, options, callback) { + var editor = this; + config.loadModule("ace/ext/prompt", function (module) { + module.prompt(editor, message, options, callback); + }); + }; + Object.defineProperty(Editor.prototype, "hoverTooltip", { + get: function () { + return this.$hoverTooltip || (this.$hoverTooltip = new HoverTooltip(this.container)); + }, + set: function (value) { + if (this.$hoverTooltip) + this.$hoverTooltip.destroy(); + this.$hoverTooltip = value; + }, + enumerable: false, + configurable: true + }); + return Editor; +}()); +Editor.$uid = 0; +Editor.prototype.curOp = null; +Editor.prototype.prevOp = {}; +Editor.prototype.$mergeableCommands = ["backspace", "del", "insertstring"]; +Editor.prototype.$toggleWordPairs = [ + ["first", "last"], + ["true", "false"], + ["yes", "no"], + ["width", "height"], + ["top", "bottom"], + ["right", "left"], + ["on", "off"], + ["x", "y"], + ["get", "set"], + ["max", "min"], + ["horizontal", "vertical"], + ["show", "hide"], + ["add", "remove"], + ["up", "down"], + ["before", "after"], + ["even", "odd"], + ["in", "out"], + ["inside", "outside"], + ["next", "previous"], + ["increase", "decrease"], + ["attach", "detach"], + ["&&", "||"], + ["==", "!="] +]; +oop.implement(Editor.prototype, EventEmitter); +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function (style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", { data: style }); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function () { this.$updateHighlightActiveLine(); }, + initialValue: true + }, + highlightSelectedWord: { + set: function (shouldHighlight) { this.$onSelectionChange(); }, + initialValue: true + }, + readOnly: { + set: function (/**@type{boolean}*/ readOnly) { + var _this = this; + this.textInput.setReadOnly(readOnly); + if (this.destroyed) + return; + this.$resetCursorStyle(); + if (!this.$readOnlyCallback) { + this.$readOnlyCallback = function (e) { + var shouldShow = false; + if (e && e.type == "keydown") { + if (e && e.key && !e.ctrlKey && !e.metaKey) { + if (e.key == " ") + e.preventDefault(); + shouldShow = e.key.length == 1; + } + if (!shouldShow) + return; + } + else if (e && e.type !== "exec") { + shouldShow = true; + } + if (shouldShow) { + var domNode = dom.createElement("div"); + domNode.textContent = nls("editor.tooltip.disable-editing", "Editing is disabled"); + if (!_this.hoverTooltip.isOpen) { + _this.hoverTooltip.showForRange(_this, _this.getSelectionRange(), domNode); + } + } + else if (_this.hoverTooltip && _this.hoverTooltip.isOpen) { + _this.hoverTooltip.hide(); + } + }; } - if (cmp(d1.end, c1.end) > 0) { - after = splitDelta(d1, c1.end); + var textArea = this.textInput.getElement(); + if (readOnly) { + event.addListener(textArea, "keydown", this.$readOnlyCallback, this); + this.commands.on("exec", this.$readOnlyCallback); + this.commands.on("commandUnavailable", this.$readOnlyCallback); } - - shiftPos(c1.end, d1.start, d1.end, -1); - if (after && !before) { - d1.lines = after.lines; - d1.start = after.start; - d1.end = after.end; - after = d1; + else { + event.removeListener(textArea, "keydown", this.$readOnlyCallback); + this.commands.off("exec", this.$readOnlyCallback); + this.commands.off("commandUnavailable", this.$readOnlyCallback); } - - return [c1, before, after].filter(Boolean); + }, + initialValue: false + }, + copyWithEmptySelection: { + set: function (value) { + this.textInput.setCopyWithEmptySelection(value); + }, + initialValue: false + }, + cursorStyle: { + set: function (val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: { initialValue: true }, + wrapBehavioursEnabled: { initialValue: true }, + enableAutoIndent: { initialValue: true }, + autoScrollEditorIntoView: { + set: function (val) { this.setAutoScrollEditorIntoView(val); } + }, + keyboardHandler: { + set: function (val) { this.setKeyboardHandler(val); }, + get: function () { return this.$keybindingId; }, + handlesSet: true + }, + value: { + set: function (val) { this.session.setValue(val); }, + get: function () { return this.getValue(); }, + handlesSet: true, + hidden: true + }, + session: { + set: function (val) { this.setSession(val); }, + get: function () { return this.session; }, + handlesSet: true, + hidden: true + }, + showLineNumbers: { + set: function (show) { + this.renderer.$gutterLayer.setShowLineNumbers(show); + this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER); + if (show && this.$relativeLineNumbers) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); + }, + initialValue: true + }, + relativeLineNumbers: { + set: function (value) { + if (this.$showLineNumbers && value) + relativeNumberRenderer.attach(this); + else + relativeNumberRenderer.detach(this); } - } - return [c1, d1]; -} - -function shift(d1, d2, dir) { - shiftPos(d1.start, d2.start, d2.end, dir); - shiftPos(d1.end, d2.start, d2.end, dir); -} -function shiftPos(pos, start, end, dir) { - if (pos.row == (dir == 1 ? start : end).row) { - pos.column += dir * (end.column - start.column); - } - pos.row += dir * (end.row - start.row); -} -function splitDelta(c, pos) { - var lines = c.lines; - var end = c.end; - c.end = clonePos(pos); - var rowsBefore = c.end.row - c.start.row; - var otherLines = lines.splice(rowsBefore, lines.length); - - var col = rowsBefore ? pos.column : pos.column - c.start.column; - lines.push(otherLines[0].substring(0, col)); - otherLines[0] = otherLines[0].substr(col) ; - var rest = { - start: clonePos(pos), - end: end, - lines: otherLines, - action: c.action - }; - return rest; -} - -function moveDeltasByOne(redoStack, d) { - d = cloneDelta(d); - for (var j = redoStack.length; j--;) { - var deltaSet = redoStack[j]; - for (var i = 0; i < deltaSet.length; i++) { - var x = deltaSet[i]; - var xformed = xform(x, d); - d = xformed[0]; - if (xformed.length != 2) { - if (xformed[2]) { - deltaSet.splice(i + 1, 1, xformed[1], xformed[2]); - i++; - } else if (!xformed[1]) { - deltaSet.splice(i, 1); - i--; - } + }, + placeholder: { + set: function (message) { + if (!this.$updatePlaceholder) { + this.$updatePlaceholder = function () { + var hasValue = this.session && (this.renderer.$composition || + this.session.getLength() > 1 || this.session.getLine(0).length > 0); + if (hasValue && this.renderer.placeholderNode) { + this.renderer.off("afterRender", this.$updatePlaceholder); + dom.removeCssClass(this.container, "ace_hasPlaceholder"); + this.renderer.placeholderNode.remove(); + this.renderer.placeholderNode = null; + } + else if (!hasValue && !this.renderer.placeholderNode) { + this.renderer.on("afterRender", this.$updatePlaceholder); + dom.addCssClass(this.container, "ace_hasPlaceholder"); + var el = dom.createElement("div"); + el.className = "ace_placeholder"; + el.textContent = this.$placeholder || ""; + this.renderer.placeholderNode = el; + this.renderer.content.appendChild(this.renderer.placeholderNode); + } + else if (!hasValue && this.renderer.placeholderNode) { + this.renderer.placeholderNode.textContent = this.$placeholder || ""; + } + }.bind(this); + this.on("input", this.$updatePlaceholder); } + this.$updatePlaceholder(); } - if (!deltaSet.length) { - redoStack.splice(j, 1); - } - } - return redoStack; -} -function rebaseRedoStack(redoStack, deltaSets) { - for (var i = 0; i < deltaSets.length; i++) { - var deltas = deltaSets[i]; - for (var j = 0; j < deltas.length; j++) { - moveDeltasByOne(redoStack, deltas[j]); - } + }, + enableKeyboardAccessibility: { + set: function (value) { + var blurCommand = { + name: "blurTextInput", + description: "Set focus to the editor content div to allow tabbing through the page", + bindKey: "Esc", + exec: function (editor) { + editor.blur(); + editor.renderer.scroller.focus(); + }, + readOnly: true + }; + var focusOnEnterKeyup = function (e) { + if (e.target == this.renderer.scroller && e.keyCode === keys['enter']) { + e.preventDefault(); + var row = this.getCursorPosition().row; + if (!this.isRowVisible(row)) + this.scrollToLine(row, true, true); + this.focus(); + } + }; + var gutterKeyboardHandler; + if (value) { + this.renderer.enableKeyboardAccessibility = true; + this.renderer.keyboardFocusClassName = "ace_keyboard-focus"; + this.textInput.getElement().setAttribute("tabindex", -1); + this.textInput.setNumberOfExtraLines(useragent.isWin ? 3 : 0); + this.renderer.scroller.setAttribute("tabindex", 0); + this.renderer.scroller.setAttribute("role", "group"); + this.renderer.scroller.setAttribute("aria-roledescription", nls("editor.scroller.aria-roledescription", "editor")); + this.renderer.scroller.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.scroller.setAttribute("aria-label", nls("editor.scroller.aria-label", "Editor content, press Enter to start editing, press Escape to exit")); + this.renderer.scroller.addEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.addCommand(blurCommand); + this.renderer.$gutter.setAttribute("tabindex", 0); + this.renderer.$gutter.setAttribute("aria-hidden", false); + this.renderer.$gutter.setAttribute("role", "group"); + this.renderer.$gutter.setAttribute("aria-roledescription", nls("editor.gutter.aria-roledescription", "editor gutter")); + this.renderer.$gutter.setAttribute("aria-label", nls("editor.gutter.aria-label", "Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit")); + this.renderer.$gutter.classList.add(this.renderer.keyboardFocusClassName); + this.renderer.content.setAttribute("aria-hidden", true); + if (!gutterKeyboardHandler) + gutterKeyboardHandler = new GutterKeyboardHandler(this); + gutterKeyboardHandler.addListener(); + this.textInput.setAriaOptions({ + setLabel: true + }); + } + else { + this.renderer.enableKeyboardAccessibility = false; + this.textInput.getElement().setAttribute("tabindex", 0); + this.textInput.setNumberOfExtraLines(0); + this.renderer.scroller.setAttribute("tabindex", -1); + this.renderer.scroller.removeAttribute("role"); + this.renderer.scroller.removeAttribute("aria-roledescription"); + this.renderer.scroller.classList.remove(this.renderer.keyboardFocusClassName); + this.renderer.scroller.removeAttribute("aria-label"); + this.renderer.scroller.removeEventListener("keyup", focusOnEnterKeyup.bind(this)); + this.commands.removeCommand(blurCommand); + this.renderer.content.removeAttribute("aria-hidden"); + this.renderer.$gutter.setAttribute("tabindex", -1); + this.renderer.$gutter.setAttribute("aria-hidden", true); + this.renderer.$gutter.removeAttribute("role"); + this.renderer.$gutter.removeAttribute("aria-roledescription"); + this.renderer.$gutter.removeAttribute("aria-label"); + this.renderer.$gutter.classList.remove(this.renderer.keyboardFocusClassName); + if (gutterKeyboardHandler) + gutterKeyboardHandler.removeListener(); + } + }, + initialValue: false + }, + textInputAriaLabel: { + set: function (val) { this.$textInputAriaLabel = val; }, + initialValue: "" + }, + enableMobileMenu: { + set: function (val) { this.$enableMobileMenu = val; }, + initialValue: true + }, + customScrollbar: "renderer", + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + displayIndentGuides: "renderer", + highlightIndentGuides: "renderer", + showGutter: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + hasCssTransforms: "renderer", + maxPixelHeight: "renderer", + useTextareaForIME: "renderer", + useResizeObserver: "renderer", + useSvgGutterIcons: "renderer", + showFoldedAnnotations: "renderer", + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimeout: "$mouseHandler", + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + navigateWithinSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); +var relativeNumberRenderer = { + getText: function (/**@type{EditSession}*/ session, /**@type{number}*/ row) { + return (Math.abs(session.selection.lead.row - row) || (row + 1 + (row < 9 ? "\xb7" : ""))) + ""; + }, + getWidth: function (session, /**@type{number}*/ lastLineNumber, config) { + return Math.max(lastLineNumber.toString().length, (config.lastRow + 1).toString().length, 2) * config.characterWidth; + }, + update: function (e, /**@type{Editor}*/ editor) { + editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER); + }, + attach: function (/**@type{Editor}*/ editor) { + editor.renderer.$gutterLayer.$renderer = this; + editor.on("changeSelection", this.update); + this.update(null, editor); + }, + detach: function (/**@type{Editor}*/ editor) { + if (editor.renderer.$gutterLayer.$renderer == this) + editor.renderer.$gutterLayer.$renderer = null; + editor.off("changeSelection", this.update); + this.update(null, editor); } -} - -exports.UndoManager = UndoManager; +}; +exports.Editor = Editor; }); -define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/lines",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); - -var Lines = function(element, canvasHeight) { - this.element = element; - this.canvasHeight = canvasHeight || 500000; - this.element.style.height = (this.canvasHeight * 2) + "px"; - - this.cells = []; - this.cellCache = []; - this.$offsetCoefficient = 0; -}; - -(function() { - - this.moveContainer = function(config) { +var Lines = /** @class */ (function () { + function Lines(element, canvasHeight) { + this.element = element; + this.canvasHeight = canvasHeight || 500000; + this.element.style.height = (this.canvasHeight * 2) + "px"; + this.cells = []; + this.cellCache = []; + this.$offsetCoefficient = 0; + } + Lines.prototype.moveContainer = function (config) { dom.translate(this.element, 0, -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) - config.offset * this.$offsetCoefficient); - }; - - this.pageChanged = function(oldConfig, newConfig) { - return ( - Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== - Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight) - ); }; - - this.computeLineTop = function(row, config, session) { + Lines.prototype.pageChanged = function (oldConfig, newConfig) { + return (Math.floor((oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight) !== + Math.floor((newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight)); + }; + Lines.prototype.computeLineTop = function (row, config, session) { var screenTop = config.firstRowScreen * config.lineHeight; var screenPage = Math.floor(screenTop / this.canvasHeight); var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight; return lineTop - (screenPage * this.canvasHeight); }; - - this.computeLineHeight = function(row, config, session) { + Lines.prototype.computeLineHeight = function (row, config, session) { return config.lineHeight * session.getRowLineCount(row); }; - - this.getLength = function() { + Lines.prototype.getLength = function () { return this.cells.length; }; - - this.get = function(index) { + Lines.prototype.get = function (index) { return this.cells[index]; }; - - this.shift = function() { + Lines.prototype.shift = function () { this.$cacheCell(this.cells.shift()); }; - - this.pop = function() { + Lines.prototype.pop = function () { this.$cacheCell(this.cells.pop()); }; - - this.push = function(cell) { + Lines.prototype.push = function (cell) { if (Array.isArray(cell)) { this.cells.push.apply(this.cells, cell); var fragment = dom.createFragment(this.element); - for (var i=0; i foldStart) { row = fold.end.row + 1; @@ -15575,68 +16580,57 @@ var Gutter = function(parentEl) { if (row > lastRow) { while (this.$lines.getLength() > index + 1) this.$lines.pop(); - break; } - cell = this.$lines.get(++index); if (cell) { cell.row = row; - } else { + } + else { cell = this.$lines.createCell(row, config, this.session, onCreateCell); this.$lines.push(cell); } - this.$renderCell(cell, config, fold, row); row++; } - this._signal("afterRender"); this.$updateGutterWidth(config); + if (this.$showCursorMarker && this.$highlightGutterLine) + this.$updateCursorMarker(); }; - - this.$updateGutterWidth = function(config) { + Gutter.prototype.$updateGutterWidth = function (config) { var session = this.session; - var gutterRenderer = session.gutterRenderer || this.$renderer; - var firstLineNumber = session.$firstLineNumber; var lastLineText = this.$lines.last() ? this.$lines.last().text : ""; - if (this.$fixedWidth || session.$useWrapMode) lastLineText = session.getLength() + firstLineNumber - 1; - - var gutterWidth = gutterRenderer + var gutterWidth = gutterRenderer ? gutterRenderer.getWidth(session, lastLineText, config) : lastLineText.toString().length * config.characterWidth; - var padding = this.$padding || this.$computePadding(); gutterWidth += padding.left + padding.right; if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { - this.gutterWidth = gutterWidth; - this.element.parentNode.style.width = - this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this.gutterWidth = gutterWidth; (this.element.parentNode).style.width = + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; this._signal("changeGutterWidth", gutterWidth); } }; - - this.$updateCursorRow = function() { + Gutter.prototype.$updateCursorRow = function () { if (!this.$highlightGutterLine) return; - var position = this.session.selection.getCursor(); if (this.$cursorRow === position.row) return; - this.$cursorRow = position.row; }; - - this.updateLineHighlight = function() { + Gutter.prototype.updateLineHighlight = function () { + if (this.$showCursorMarker) + this.$updateCursorMarker(); if (!this.$highlightGutterLine) return; var row = this.session.selection.cursor.row; this.$cursorRow = row; - if (this.$cursorCell && this.$cursorCell.row == row) return; if (this.$cursorCell) @@ -15659,93 +16653,99 @@ var Gutter = function(parentEl) { } } }; - - this.scrollLines = function(config) { + Gutter.prototype.$updateCursorMarker = function () { + if (!this.session) + return; + var session = this.session; + if (!this.$highlightElement) { + this.$highlightElement = dom.createElement("div"); + this.$highlightElement.className = "ace_gutter-cursor"; + this.$highlightElement.style.pointerEvents = "none"; + this.element.appendChild(this.$highlightElement); + } + var pos = session.selection.cursor; + var config = this.config; + var lines = this.$lines; + var screenTop = config.firstRowScreen * config.lineHeight; + var screenPage = Math.floor(screenTop / lines.canvasHeight); + var lineTop = session.documentToScreenRow(pos) * config.lineHeight; + var top = lineTop - (screenPage * lines.canvasHeight); + dom.setStyle(this.$highlightElement.style, "height", config.lineHeight + "px"); + dom.setStyle(this.$highlightElement.style, "top", top + "px"); + }; + Gutter.prototype.scrollLines = function (config) { var oldConfig = this.config; this.config = config; - this.$updateCursorRow(); if (this.$lines.pageChanged(oldConfig, config)) return this.update(config); - this.$lines.moveContainer(config); - - var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar - this.session.getLength() - 1); + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + this.session.getLength() - 1); var oldLastRow = this.oldLastRow; this.oldLastRow = lastRow; - if (!oldConfig || oldLastRow < config.firstRow) return this.update(config); - if (lastRow < oldConfig.firstRow) return this.update(config); - if (oldConfig.firstRow < config.firstRow) - for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) this.$lines.shift(); - if (oldLastRow > lastRow) - for (var row=this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row>0; row--) + for (var row = this.session.getFoldedRowCount(lastRow + 1, oldLastRow); row > 0; row--) this.$lines.pop(); - if (config.firstRow < oldConfig.firstRow) { this.$lines.unshift(this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1)); } - if (lastRow > oldLastRow) { this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow)); } - this.updateLineHighlight(); - this._signal("afterRender"); this.$updateGutterWidth(config); }; - - this.$renderLines = function(config, firstRow, lastRow) { + Gutter.prototype.$renderLines = function (config, firstRow, lastRow) { var fragment = []; var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > lastRow) break; - var cell = this.$lines.createCell(row, config, this.session, onCreateCell); this.$renderCell(cell, config, foldLine, row); fragment.push(cell); - row++; } return fragment; }; - - this.$renderCell = function(cell, config, fold, row) { + Gutter.prototype.$renderCell = function (cell, config, fold, row) { var element = cell.element; - var session = this.session; - var textNode = element.childNodes[0]; var foldWidget = element.childNodes[1]; - + var annotationNode = element.childNodes[2]; + var customWidget = element.childNodes[3]; + var annotationIconNode = annotationNode.firstChild; var firstLineNumber = session.$firstLineNumber; - var breakpoints = session.$breakpoints; var decorations = session.$decorations; var gutterRenderer = session.gutterRenderer || this.$renderer; var foldWidgets = this.$showFoldWidgets && session.foldWidgets; var foldStart = fold ? fold.start.row : Number.MAX_VALUE; - - var className = "ace_gutter-cell "; + var lineHeight = config.lineHeight + "px"; + var className = this.$useSvgGutterIcons ? "ace_gutter-cell_svg-icons " : "ace_gutter-cell "; + var iconClassName = this.$useSvgGutterIcons ? "ace_icon_svg" : "ace_icon"; + var rowText = (gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber).toString(); if (this.$highlightGutterLine) { - if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { + if (row == this.$cursorRow || (fold && row < this.$cursorRow && row >= foldStart && this.$cursorRow <= fold.end.row)) { className += "ace_gutter-active-line "; if (this.$cursorCell != cell) { if (this.$cursorCell) @@ -15754,95 +16754,274 @@ var Gutter = function(parentEl) { } } } - if (breakpoints[row]) className += breakpoints[row]; if (decorations[row]) className += decorations[row]; - if (this.$annotations[row]) + if (this.$annotations[row] && row !== foldStart) className += this.$annotations[row].className; - if (element.className != className) - element.className = className; - if (foldWidgets) { var c = foldWidgets[row]; if (c == null) c = foldWidgets[row] = session.getFoldWidget(row); } - if (c) { - var className = "ace_fold-widget ace_" + c; - if (c == "start" && row == foldStart && row < fold.end.row) - className += " ace_closed"; + var foldClass = "ace_fold-widget ace_" + c; + var isClosedFold = c == "start" && row == foldStart && row < fold.end.row; + if (isClosedFold) { + foldClass += " ace_closed"; + var foldAnnotationClass = ""; + var annotationInFold = false; + for (var i = row + 1; i <= fold.end.row; i++) { + if (!this.$annotations[i]) + continue; + if (this.$annotations[i].className === " ace_error") { + annotationInFold = true; + foldAnnotationClass = " ace_error_fold"; + break; + } + if (this.$annotations[i].className === " ace_security") { + annotationInFold = true; + foldAnnotationClass = " ace_security_fold"; + } + else if (this.$annotations[i].className === " ace_warning" && + foldAnnotationClass !== " ace_security_fold") { + annotationInFold = true; + foldAnnotationClass = " ace_warning_fold"; + } + } + className += foldAnnotationClass; + } else - className += " ace_open"; - if (foldWidget.className != className) - foldWidget.className = className; - - var foldHeight = config.lineHeight + "px"; - dom.setStyle(foldWidget.style, "height", foldHeight); + foldClass += " ace_open"; + if (foldWidget.className != foldClass) + foldWidget.className = foldClass; + dom.setStyle(foldWidget.style, "height", lineHeight); dom.setStyle(foldWidget.style, "display", "inline-block"); - } else { + foldWidget.setAttribute("role", "button"); + foldWidget.setAttribute("tabindex", "-1"); + var foldRange = session.getFoldWidgetRange(row); + if (foldRange) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.range.aria-label", "Toggle code folding, rows $0 through $1", [ + foldRange.start.row + 1, + foldRange.end.row + 1 + ])); + else { + if (fold) + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.closed.aria-label", "Toggle code folding, rows $0 through $1", [ + fold.start.row + 1, + fold.end.row + 1 + ])); + else + foldWidget.setAttribute("aria-label", nls("gutter.code-folding.open.aria-label", "Toggle code folding, row $0", [row + 1])); + } + if (isClosedFold) { + foldWidget.setAttribute("aria-expanded", "false"); + foldWidget.setAttribute("title", nls("gutter.code-folding.closed.title", "Unfold code")); + } + else { + foldWidget.setAttribute("aria-expanded", "true"); + foldWidget.setAttribute("title", nls("gutter.code-folding.open.title", "Fold code")); + } + } + else { if (foldWidget) { dom.setStyle(foldWidget.style, "display", "none"); + foldWidget.setAttribute("tabindex", "0"); + foldWidget.removeAttribute("role"); + foldWidget.removeAttribute("aria-label"); + } + } + var customWidgetAttributes = this.session.$gutterCustomWidgets[row]; + if (customWidgetAttributes) { + this.$addCustomWidget(row, customWidgetAttributes, cell); + } + else if (customWidget) { + this.$removeCustomWidget(row, cell); + } + if (annotationInFold && this.$showFoldedAnnotations) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + annotationIconNode.className += foldAnnotationClass; + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (foldAnnotationClass) { + case " ace_error_fold": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security_fold": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning_fold": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); } - - var text = (gutterRenderer - ? gutterRenderer.getText(session, row) - : row + firstLineNumber).toString(); - - if (text !== textNode.data) { - textNode.data = text; + else if (this.$annotations[row]) { + annotationNode.className = "ace_gutter_annotation"; + annotationIconNode.className = iconClassName; + if (this.$useSvgGutterIcons) + annotationIconNode.className += this.$annotations[row].className; + else + element.classList.add(this.$annotations[row].className.replace(" ", "")); + dom.setStyle(annotationIconNode.style, "height", lineHeight); + dom.setStyle(annotationNode.style, "display", "block"); + dom.setStyle(annotationNode.style, "height", lineHeight); + var ariaLabel; + switch (this.$annotations[row].className) { + case " ace_error": + ariaLabel = nls("gutter.annotation.aria-label.error", "Error, read annotations row $0", [rowText]); + break; + case " ace_security": + ariaLabel = nls("gutter.annotation.aria-label.security", "Security finding, read annotations row $0", [rowText]); + break; + case " ace_warning": + ariaLabel = nls("gutter.annotation.aria-label.warning", "Warning, read annotations row $0", [rowText]); + break; + case " ace_info": + ariaLabel = nls("gutter.annotation.aria-label.info", "Info, read annotations row $0", [rowText]); + break; + case " ace_hint": + ariaLabel = nls("gutter.annotation.aria-label.hint", "Suggestion, read annotations row $0", [rowText]); + break; + } + annotationNode.setAttribute("aria-label", ariaLabel); + annotationNode.setAttribute("tabindex", "-1"); + annotationNode.setAttribute("role", "button"); + } + else { + dom.setStyle(annotationNode.style, "display", "none"); + annotationNode.removeAttribute("aria-label"); + annotationNode.removeAttribute("role"); + annotationNode.setAttribute("tabindex", "0"); + } + if (rowText !== textNode.data) { + textNode.data = rowText; } - + if (element.className != className) + element.className = className; dom.setStyle(cell.element.style, "height", this.$lines.computeLineHeight(row, config, session) + "px"); dom.setStyle(cell.element.style, "top", this.$lines.computeLineTop(row, config, session) + "px"); - - cell.text = text; + cell.text = rowText; + if (annotationNode.style.display === "none" && foldWidget.style.display === "none" && !customWidgetAttributes) + cell.element.setAttribute("aria-hidden", true); + else + cell.element.setAttribute("aria-hidden", false); return cell; }; - - this.$fixedWidth = false; - - this.$highlightGutterLine = true; - this.$renderer = ""; - this.setHighlightGutterLine = function(highlightGutterLine) { + Gutter.prototype.setHighlightGutterLine = function (highlightGutterLine) { this.$highlightGutterLine = highlightGutterLine; + if (!highlightGutterLine && this.$highlightElement) { + this.$highlightElement.remove(); + this.$highlightElement = null; + } }; - - this.$showLineNumbers = true; - this.$renderer = ""; - this.setShowLineNumbers = function(show) { + Gutter.prototype.setShowLineNumbers = function (show) { this.$renderer = !show && { - getWidth: function() {return 0;}, - getText: function() {return "";} + getWidth: function () { return 0; }, + getText: function () { return ""; } }; }; - - this.getShowLineNumbers = function() { + Gutter.prototype.getShowLineNumbers = function () { return this.$showLineNumbers; }; - - this.$showFoldWidgets = true; - this.setShowFoldWidgets = function(show) { + Gutter.prototype.setShowFoldWidgets = function (show) { if (show) dom.addCssClass(this.element, "ace_folding-enabled"); else dom.removeCssClass(this.element, "ace_folding-enabled"); - this.$showFoldWidgets = show; this.$padding = null; }; - - this.getShowFoldWidgets = function() { + Gutter.prototype.getShowFoldWidgets = function () { return this.$showFoldWidgets; }; - - this.$computePadding = function() { + Gutter.prototype.$hideFoldWidget = function (row, cell) { + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var foldWidget = rowCell.element.childNodes[1]; + if (foldWidget) { + dom.setStyle(foldWidget.style, "display", "none"); + } + } + }; + Gutter.prototype.$showFoldWidget = function (row, cell) { + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var foldWidget = rowCell.element.childNodes[1]; + if (foldWidget && this.session.foldWidgets && this.session.foldWidgets[rowCell.row]) { + dom.setStyle(foldWidget.style, "display", "inline-block"); + } + } + }; + Gutter.prototype.$getGutterCell = function (row) { + var cells = this.$lines.cells; + var min = 0; + var max = cells.length - 1; + if (row < cells[0].row || row > cells[max].row) + return; + while (min <= max) { + var mid = Math.floor((min + max) / 2); + var cell = cells[mid]; + if (cell.row > row) { + max = mid - 1; + } + else if (cell.row < row) { + min = mid + 1; + } + else { + return cell; + } + } + return cell; + }; + Gutter.prototype.$addCustomWidget = function (row, _a, cell) { + var className = _a.className, label = _a.label, title = _a.title, callbacks = _a.callbacks; + this.session.$gutterCustomWidgets[row] = { className: className, label: label, title: title, callbacks: callbacks }; + this.$hideFoldWidget(row, cell); + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var customWidget = rowCell.element.querySelector(".ace_custom-widget"); + if (customWidget) { + customWidget.remove(); + } + customWidget = dom.createElement("span"); + customWidget.className = "ace_custom-widget ".concat(className); + customWidget.setAttribute("tabindex", "-1"); + customWidget.setAttribute("role", 'button'); + customWidget.setAttribute("aria-label", label); + customWidget.setAttribute("title", title); + dom.setStyle(customWidget.style, "display", "inline-block"); + dom.setStyle(customWidget.style, "height", "inherit"); + if (callbacks && callbacks.onClick) { + customWidget.addEventListener("click", function (e) { + callbacks.onClick(e, row); + e.stopPropagation(); + }); + } + rowCell.element.appendChild(customWidget); + } + }; + Gutter.prototype.$removeCustomWidget = function (row, cell) { + delete this.session.$gutterCustomWidgets[row]; + this.$showFoldWidget(row, cell); + var rowCell = cell || this.$getGutterCell(row); + if (rowCell && rowCell.element) { + var customWidget = rowCell.element.querySelector(".ace_custom-widget"); + if (customWidget) { + rowCell.element.removeChild(customWidget); + } + } + }; + Gutter.prototype.$computePadding = function () { if (!this.element.firstChild) - return {left: 0, right: 0}; - var style = dom.computedStyle(this.element.firstChild); + return { left: 0, right: 0 }; + var style = dom.computedStyle(/**@type{Element}*/ (this.element.firstChild)); this.$padding = {}; this.$padding.left = (parseInt(style.borderLeftWidth) || 0) + (parseInt(style.paddingLeft) || 0) + 1; @@ -15850,8 +17029,7 @@ var Gutter = function(parentEl) { + (parseInt(style.paddingRight) || 0); return this.$padding; }; - - this.getRegion = function(point) { + Gutter.prototype.getRegion = function (point) { var padding = this.$padding || this.$computePadding(); var rect = this.element.getBoundingClientRect(); if (point.x < padding.left + rect.left) @@ -15859,118 +17037,111 @@ var Gutter = function(parentEl) { if (this.$showFoldWidgets && point.x > rect.right - padding.right) return "foldWidgets"; }; - -}).call(Gutter.prototype); - + return Gutter; +}()); +Gutter.prototype.$fixedWidth = false; +Gutter.prototype.$highlightGutterLine = true; +Gutter.prototype.$renderer = undefined; +Gutter.prototype.$showLineNumbers = true; +Gutter.prototype.$showFoldWidgets = true; +oop.implement(Gutter.prototype, EventEmitter); function onCreateCell(element) { var textNode = document.createTextNode(''); element.appendChild(textNode); - var foldWidget = dom.createElement("span"); element.appendChild(foldWidget); - + var annotationNode = dom.createElement("span"); + element.appendChild(annotationNode); + var annotationIconNode = dom.createElement("span"); + annotationNode.appendChild(annotationIconNode); return element; } - exports.Gutter = Gutter; }); -define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module){"use strict"; var Range = require("../range").Range; var dom = require("../lib/dom"); - -var Marker = function(parentEl) { - this.element = dom.createElement("div"); - this.element.className = "ace_layer ace_marker-layer"; - parentEl.appendChild(this.element); -}; - -(function() { - - this.$padding = 0; - - this.setPadding = function(padding) { +var Marker = /** @class */ (function () { + function Marker(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); + } + Marker.prototype.setPadding = function (padding) { this.$padding = padding; }; - this.setSession = function(session) { + Marker.prototype.setSession = function (session) { this.session = session; }; - - this.setMarkers = function(markers) { + Marker.prototype.setMarkers = function (markers) { this.markers = markers; }; - - this.elt = function(className, css) { + Marker.prototype.elt = function (className, css) { var x = this.i != -1 && this.element.childNodes[this.i]; if (!x) { x = document.createElement("div"); this.element.appendChild(x); this.i = -1; - } else { + } + else { this.i++; } x.style.cssText = css; x.className = className; }; - - this.update = function(config) { - if (!config) return; - + Marker.prototype.update = function (config) { + if (!config) + return; this.config = config; - this.i = 0; var html; for (var key in this.markers) { var marker = this.markers[key]; - if (!marker.range) { marker.update(html, this, this.session, config); continue; } - var range = marker.range.clipRows(config.firstRow, config.lastRow); - if (range.isEmpty()) continue; - + if (range.isEmpty()) + continue; range = range.toScreenRange(this.session); if (marker.renderer) { var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; marker.renderer(html, range, left, top, config); - } else if (marker.type == "fullLine") { + } + else if (marker.type == "fullLine") { this.drawFullLineMarker(html, range, marker.clazz, config); - } else if (marker.type == "screenLine") { + } + else if (marker.type == "screenLine") { this.drawScreenLineMarker(html, range, marker.clazz, config); - } else if (range.isMultiLine()) { + } + else if (range.isMultiLine()) { if (marker.type == "text") this.drawTextMarker(html, range, marker.clazz, config); else this.drawMultiLineMarker(html, range, marker.clazz, config); - } else { + } + else { this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); } } - if (this.i !=-1) { + if (this.i != -1) { while (this.i < this.element.childElementCount) this.element.removeChild(this.element.lastChild); } }; - - this.$getTop = function(row, layerConfig) { + Marker.prototype.$getTop = function (row, layerConfig) { return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; }; - - function getBorderClass(tl, tr, br, bl) { - return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); - } - this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + Marker.prototype.drawTextMarker = function (stringBuilder, range, clazz, layerConfig, extraStyle) { var session = this.session; var start = range.start.row; var end = range.end.row; var row = start; - var prev = 0; + var prev = 0; var curr = 0; var next = session.getScreenLastRowColumn(row); var lineRange = new Range(row, range.start.column, row, curr); @@ -15981,158 +17152,123 @@ var Marker = function(parentEl) { prev = curr; curr = next; next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; - this.drawSingleLineMarker(stringBuilder, lineRange, - clazz + (row == start ? " ace_start" : "") + " ace_br" - + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), - layerConfig, row == end ? 0 : 1, extraStyle); + this.drawSingleLineMarker(stringBuilder, lineRange, clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), layerConfig, row == end ? 0 : 1, extraStyle); } }; - this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawMultiLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var padding = this.$padding; var height = config.lineHeight; var top = this.$getTop(range.start.row, config); var left = padding + range.start.column * config.characterWidth; extraStyle = extraStyle || ""; - if (this.session.$bidiHandler.isBidiRow(range.start.row)) { - var range1 = range.clone(); - range1.end.row = range1.start.row; - range1.end.column = this.session.getLine(range1.start.row).length; - this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); - } else { - this.elt( - clazz + " ace_br1 ace_start", - "height:"+ height+ "px;"+ "right:0;"+ "top:"+top+ "px;left:"+ left+ "px;" + (extraStyle || "") - ); + var range1 = range.clone(); + range1.end.row = range1.start.row; + range1.end.column = this.session.getLine(range1.start.row).length; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br1 ace_start", config, null, extraStyle); + } + else { + this.elt(clazz + " ace_br1 ace_start", "height:" + height + "px;" + "right:" + padding + "px;" + "top:" + top + "px;left:" + left + "px;" + (extraStyle || "")); } if (this.session.$bidiHandler.isBidiRow(range.end.row)) { - var range1 = range.clone(); - range1.start.row = range1.end.row; - range1.start.column = 0; - this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); - } else { + var range1 = range.clone(); + range1.start.row = range1.end.row; + range1.start.column = 0; + this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + " ace_br12", config, null, extraStyle); + } + else { top = this.$getTop(range.end.row, config); var width = range.end.column * config.characterWidth; - - this.elt( - clazz + " ace_br12", - "height:"+ height+ "px;"+ - "width:"+ width+ "px;"+ - "top:"+ top+ "px;"+ - "left:"+ padding+ "px;"+ (extraStyle || "") - ); + this.elt(clazz + " ace_br12", "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); } height = (range.end.row - range.start.row - 1) * config.lineHeight; if (height <= 0) return; top = this.$getTop(range.start.row + 1, config); - var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); - - this.elt( - clazz + (radiusClass ? " ace_br" + radiusClass : ""), - "height:"+ height+ "px;"+ - "right:0;"+ - "top:"+ top+ "px;"+ - "left:"+ padding+ "px;"+ (extraStyle || "") - ); - }; - this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + this.elt(clazz + (radiusClass ? " ace_br" + radiusClass : ""), "height:" + height + "px;" + + "right:" + padding + "px;" + + "top:" + top + "px;" + + "left:" + padding + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { if (this.session.$bidiHandler.isBidiRow(range.start.row)) return this.drawBidiSingleLineMarker(stringBuilder, range, clazz, config, extraLength, extraStyle); var height = config.lineHeight; var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; - var top = this.$getTop(range.start.row, config); var left = this.$padding + range.start.column * config.characterWidth; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "width:"+ width+ "px;"+ - "top:"+ top+ "px;"+ - "left:"+ left+ "px;"+ (extraStyle || "") - ); - }; - this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + this.elt(clazz, "height:" + height + "px;" + + "width:" + width + "px;" + + "top:" + top + "px;" + + "left:" + left + "px;" + (extraStyle || "")); + }; + Marker.prototype.drawBidiSingleLineMarker = function (stringBuilder, range, clazz, config, extraLength, extraStyle) { var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding; var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column); - - selections.forEach(function(selection) { - this.elt( - clazz, - "height:" + height + "px;" + - "width:" + selection.width + (extraLength || 0) + "px;" + + selections.forEach(function (selection) { + this.elt(clazz, "height:" + height + "px;" + + "width:" + (selection.width + (extraLength || 0)) + "px;" + "top:" + top + "px;" + - "left:" + (padding + selection.left) + "px;" + (extraStyle || "") - ); + "left:" + (padding + selection.left) + "px;" + (extraStyle || "")); }, this); }; - - this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawFullLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; if (range.start.row != range.end.row) height += this.$getTop(range.end.row, config) - top; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "top:"+ top+ "px;"+ - "left:0;right:0;"+ (extraStyle || "") - ); + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); }; - - this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + Marker.prototype.drawScreenLineMarker = function (stringBuilder, range, clazz, config, extraStyle) { var top = this.$getTop(range.start.row, config); var height = config.lineHeight; - - this.elt( - clazz, - "height:"+ height+ "px;"+ - "top:"+ top+ "px;"+ - "left:0;right:0;"+ (extraStyle || "") - ); - }; - -}).call(Marker.prototype); - + this.elt(clazz, "height:" + height + "px;" + + "top:" + top + "px;" + + "left:0;right:0;" + (extraStyle || "")); + }; + return Marker; +}()); +Marker.prototype.$padding = 0; +function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); +} exports.Marker = Marker; }); -define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; +define("ace/layer/text_util",["require","exports","module"], function(require, exports, module){// Tokens for which Ace just uses a simple TextNode and does not add any special className. +var textTokens = new Set(["text", "rparen", "lparen"]); +exports.isTextToken = function (tokenType) { + return textTokens.has(tokenType); +}; + +}); +define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter","ace/config","ace/layer/text_util"], function(require, exports, module){"use strict"; var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var Lines = require("./lines").Lines; var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var Text = function(parentEl) { - this.dom = dom; - this.element = this.dom.createElement("div"); - this.element.className = "ace_layer ace_text-layer"; - parentEl.appendChild(this.element); - this.$updateEolChar = this.$updateEolChar.bind(this); - this.$lines = new Lines(this.element); -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.EOF_CHAR = "\xB6"; - this.EOL_CHAR_LF = "\xAC"; - this.EOL_CHAR_CRLF = "\xa4"; - this.EOL_CHAR = this.EOL_CHAR_LF; - this.TAB_CHAR = "\u2014"; //"\u21E5"; - this.SPACE_CHAR = "\xB7"; - this.$padding = 0; - this.MAX_LINE_LENGTH = 10000; - - this.$updateEolChar = function() { +var nls = require("../config").nls; +var isTextToken = require("./text_util").isTextToken; +var Text = /** @class */ (function () { + function Text(parentEl) { + this.dom = dom; + this.element = this.dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); + this.$lines = new Lines(this.element); + } + Text.prototype.$updateEolChar = function () { var doc = this.session.doc; var unixMode = doc.getNewLineCharacter() == "\n" && doc.getNewLineMode() != "windows"; var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF; @@ -16141,162 +17277,138 @@ var Text = function(parentEl) { return true; } }; - - this.setPadding = function(padding) { + Text.prototype.setPadding = function (padding) { this.$padding = padding; this.element.style.margin = "0 " + padding + "px"; }; - - this.getLineHeight = function() { + Text.prototype.getLineHeight = function () { return this.$fontMetrics.$characterSize.height || 0; }; - - this.getCharacterWidth = function() { + Text.prototype.getCharacterWidth = function () { return this.$fontMetrics.$characterSize.width || 0; }; - - this.$setFontMetrics = function(measure) { + Text.prototype.$setFontMetrics = function (measure) { this.$fontMetrics = measure; - this.$fontMetrics.on("changeCharacterSize", function(e) { + this.$fontMetrics.on("changeCharacterSize", + function (e) { this._signal("changeCharacterSize", e); }.bind(this)); this.$pollSizeChanges(); }; - - this.checkForSizeChanges = function() { + Text.prototype.checkForSizeChanges = function () { this.$fontMetrics.checkForSizeChanges(); }; - this.$pollSizeChanges = function() { + Text.prototype.$pollSizeChanges = function () { return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); }; - this.setSession = function(session) { + Text.prototype.setSession = function (session) { this.session = session; if (session) this.$computeTabString(); }; - - this.showInvisibles = false; - this.showSpaces = false; - this.showTabs = false; - this.showEOL = false; - this.setShowInvisibles = function(showInvisibles) { + Text.prototype.setShowInvisibles = function (showInvisibles) { if (this.showInvisibles == showInvisibles) return false; - this.showInvisibles = showInvisibles; if (typeof showInvisibles == "string") { this.showSpaces = /tab/i.test(showInvisibles); this.showTabs = /space/i.test(showInvisibles); this.showEOL = /eol/i.test(showInvisibles); - } else { + } + else { this.showSpaces = this.showTabs = this.showEOL = showInvisibles; } this.$computeTabString(); return true; }; - - this.displayIndentGuides = true; - this.setDisplayIndentGuides = function(display) { + Text.prototype.setDisplayIndentGuides = function (display) { if (this.displayIndentGuides == display) return false; - this.displayIndentGuides = display; this.$computeTabString(); return true; }; - - this.$tabStrings = []; - this.onChangeTabSize = - this.$computeTabString = function() { + Text.prototype.setHighlightIndentGuides = function (highlight) { + if (this.$highlightIndentGuides === highlight) + return false; + this.$highlightIndentGuides = highlight; + return highlight; + }; + Text.prototype.$computeTabString = function () { var tabSize = this.session.getTabSize(); - this.tabSize = tabSize; - var tabStr = this.$tabStrings = [0]; + this.tabSize = tabSize; var tabStr = this.$tabStrings = [0]; for (var i = 1; i < tabSize + 1; i++) { if (this.showTabs) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_tab"; span.textContent = lang.stringRepeat(this.TAB_CHAR, i); tabStr.push(span); - } else { + } + else { tabStr.push(this.dom.createTextNode(lang.stringRepeat(" ", i), this.element)); } } if (this.displayIndentGuides) { - this.$indentGuideRe = /\s\S| \t|\t |\s$/; + this.$indentGuideRe = /\s\S| \t|\t |\s$/; var className = "ace_indent-guide"; var spaceClass = this.showSpaces ? " ace_invisible ace_invisible_space" : ""; var spaceContent = this.showSpaces ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize) : lang.stringRepeat(" ", this.tabSize); - var tabClass = this.showTabs ? " ace_invisible ace_invisible_tab" : ""; - var tabContent = this.showTabs + var tabContent = this.showTabs ? lang.stringRepeat(this.TAB_CHAR, this.tabSize) : spaceContent; - var span = this.dom.createElement("span"); span.className = className + spaceClass; span.textContent = spaceContent; this.$tabStrings[" "] = span; - var span = this.dom.createElement("span"); span.className = className + tabClass; span.textContent = tabContent; this.$tabStrings["\t"] = span; } }; - - this.updateLines = function(config, firstRow, lastRow) { + Text.prototype.updateLines = function (config, firstRow, lastRow) { if (this.config.lastRow != config.lastRow || this.config.firstRow != config.firstRow) { return this.update(config); } - this.config = config; - var first = Math.max(firstRow, config.firstRow); var last = Math.min(lastRow, config.lastRow); - var lineElements = this.element.childNodes; var lineElementsIdx = 0; - for (var row = config.firstRow; row < first; row++) { var foldLine = this.session.getFoldLine(row); if (foldLine) { if (foldLine.containsRow(first)) { first = foldLine.start.row; break; - } else { + } + else { row = foldLine.end.row; } } - lineElementsIdx ++; + lineElementsIdx++; } - var heightChanged = false; var row = first; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); - foldStart = foldLine ? foldLine.start.row :Infinity; + foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > last) - break; - - var lineElement = lineElements[lineElementsIdx++]; + break; var lineElement = lineElements[lineElementsIdx++]; if (lineElement) { this.dom.removeChildren(lineElement); - this.$renderLine( - lineElement, row, row == foldStart ? foldLine : false - ); - + this.$renderLine(lineElement, row, row == foldStart ? foldLine : false); if (heightChanged) lineElement.style.top = this.$lines.computeLineTop(row, config, this.session) + "px"; - var height = (config.lineHeight * this.session.getRowLength(row)) + "px"; if (lineElement.style.height != height) { heightChanged = true; @@ -16312,110 +17424,80 @@ var Text = function(parentEl) { } } }; - - this.scrollLines = function(config) { + Text.prototype.scrollLines = function (config) { var oldConfig = this.config; this.config = config; - if (this.$lines.pageChanged(oldConfig, config)) return this.update(config); - this.$lines.moveContainer(config); - var lastRow = config.lastRow; var oldLastRow = oldConfig ? oldConfig.lastRow : -1; - if (!oldConfig || oldLastRow < config.firstRow) return this.update(config); - if (lastRow < oldConfig.firstRow) return this.update(config); - if (!oldConfig || oldConfig.lastRow < config.firstRow) return this.update(config); - if (config.lastRow < oldConfig.firstRow) return this.update(config); - if (oldConfig.firstRow < config.firstRow) - for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + for (var row = this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row > 0; row--) this.$lines.shift(); - if (oldConfig.lastRow > config.lastRow) - for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + for (var row = this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row > 0; row--) this.$lines.pop(); - if (config.firstRow < oldConfig.firstRow) { this.$lines.unshift(this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1)); } - if (config.lastRow > oldConfig.lastRow) { this.$lines.push(this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow)); } + this.$highlightIndentGuide(); }; - - this.$renderLinesFragment = function(config, firstRow, lastRow) { + Text.prototype.$renderLinesFragment = function (config, firstRow, lastRow) { var fragment = []; var row = firstRow; var foldLine = this.session.getNextFoldLine(row); var foldStart = foldLine ? foldLine.start.row : Infinity; - while (true) { if (row > foldStart) { - row = foldLine.end.row+1; + row = foldLine.end.row + 1; foldLine = this.session.getNextFoldLine(row, foldLine); foldStart = foldLine ? foldLine.start.row : Infinity; } if (row > lastRow) break; - var line = this.$lines.createCell(row, config, this.session); - var lineEl = line.element; this.dom.removeChildren(lineEl); dom.setStyle(lineEl.style, "height", this.$lines.computeLineHeight(row, config, this.session) + "px"); dom.setStyle(lineEl.style, "top", this.$lines.computeLineTop(row, config, this.session) + "px"); this.$renderLine(lineEl, row, row == foldStart ? foldLine : false); - if (this.$useLineGroups()) { lineEl.className = "ace_line_group"; - } else { + } + else { lineEl.className = "ace_line"; } fragment.push(line); - row++; } return fragment; }; - - this.update = function(config) { + Text.prototype.update = function (config) { this.$lines.moveContainer(config); - this.config = config; - var firstRow = config.firstRow; var lastRow = config.lastRow; - var lines = this.$lines; while (lines.getLength()) lines.pop(); - lines.push(this.$renderLinesFragment(config, firstRow, lastRow)); }; - - this.$textToken = { - "text": true, - "rparen": true, - "lparen": true - }; - - this.$renderToken = function(parent, screenColumn, token, value) { + Text.prototype.$renderToken = function (parent, screenColumn, token, value) { var self = this; - var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; - + var re = /(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC\u2066\u2067\u2068\u202A\u202B\u202D\u202E\u202C\u2069\u2060\u2061\u2062\u2063\u2064\u206A\u206B\u206B\u206C\u206D\u206E\u206F]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g; var valueFragment = this.dom.createFragment(this.element); - var m; var i = 0; while (m = re.exec(value)) { @@ -16424,45 +17506,46 @@ var Text = function(parentEl) { var controlCharacter = m[3]; var cjkSpace = m[4]; var cjk = m[5]; - if (!self.showSpaces && simpleSpace) continue; - var before = i != m.index ? value.slice(i, m.index) : ""; - i = m.index + m[0].length; - if (before) { valueFragment.appendChild(this.dom.createTextNode(before, this.element)); } - if (tab) { var tabSize = self.session.getScreenTabSize(screenColumn + m.index); - valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true)); + var text = self.$tabStrings[tabSize].cloneNode(true); + text["charCount"] = 1; + valueFragment.appendChild(text); screenColumn += tabSize - 1; - } else if (simpleSpace) { + } + else if (simpleSpace) { if (self.showSpaces) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_space"; span.textContent = lang.stringRepeat(self.SPACE_CHAR, simpleSpace.length); valueFragment.appendChild(span); - } else { - valueFragment.appendChild(this.com.createTextNode(simpleSpace, this.element)); } - } else if (controlCharacter) { + else { + valueFragment.appendChild(this.dom.createTextNode(simpleSpace, this.element)); + } + } + else if (controlCharacter) { var span = this.dom.createElement("span"); span.className = "ace_invisible ace_invisible_space ace_invalid"; span.textContent = lang.stringRepeat(self.SPACE_CHAR, controlCharacter.length); valueFragment.appendChild(span); - } else if (cjkSpace) { + } + else if (cjkSpace) { screenColumn += 1; - var span = this.dom.createElement("span"); span.style.width = (self.config.characterWidth * 2) + "px"; span.className = self.showSpaces ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace; valueFragment.appendChild(span); - } else if (cjk) { + } + else if (cjk) { screenColumn += 1; var span = this.dom.createElement("span"); span.style.width = (self.config.characterWidth * 2) + "px"; @@ -16471,64 +17554,168 @@ var Text = function(parentEl) { valueFragment.appendChild(span); } } - valueFragment.appendChild(this.dom.createTextNode(i ? value.slice(i) : value, this.element)); - - if (!this.$textToken[token.type]) { + if (!isTextToken(token.type)) { var classes = "ace_" + token.type.replace(/\./g, " ace_"); var span = this.dom.createElement("span"); - if (token.type == "fold") + if (token.type == "fold") { span.style.width = (token.value.length * this.config.characterWidth) + "px"; - + span.setAttribute("title", nls("inline-fold.closed.title", "Unfold code")); + } span.className = classes; span.appendChild(valueFragment); - parent.appendChild(span); } else { parent.appendChild(valueFragment); } - return screenColumn + value.length; }; - - this.renderIndentGuide = function(parent, value, max) { + Text.prototype.renderIndentGuide = function (parent, value, max) { var cols = value.search(this.$indentGuideRe); if (cols <= 0 || cols >= max) return value; if (value[0] == " ") { cols -= cols % this.tabSize; - var count = cols/this.tabSize; - for (var i=0; i ranges[i].start.row) { + this.$highlightIndentGuideMarker.dir = -1; + } + else { + this.$highlightIndentGuideMarker.dir = 1; + } + break; + } + } + } + if (!this.$highlightIndentGuideMarker.end) { + if (lines[cursor.row] !== '' && cursor.column === lines[cursor.row].length) { + this.$highlightIndentGuideMarker.dir = 1; + for (var i = cursor.row + 1; i < lines.length; i++) { + var line = lines[i]; + var currentIndent = /^\s*/.exec(line)[0].length; + if (line !== '') { + this.$highlightIndentGuideMarker.end = i; + if (currentIndent <= initialIndent) + break; + } + } + } + } + this.$renderHighlightIndentGuide(); + }; + Text.prototype.$clearActiveIndentGuide = function () { + var activeIndentGuides = this.element.querySelectorAll(".ace_indent-guide-active"); + for (var i = 0; i < activeIndentGuides.length; i++) { + activeIndentGuides[i].classList.remove("ace_indent-guide-active"); + } + }; + Text.prototype.$setIndentGuideActive = function (cell, indentLevel) { + var line = this.session.doc.getLine(cell.row); + if (line !== "") { + var element = cell.element; + if (cell.element.classList && cell.element.classList.contains("ace_line_group")) { + if (cell.element.childNodes.length > 0) { + element = cell.element.childNodes[0]; + } + else { + return; + } + } + var childNodes = element.childNodes; + if (childNodes) { + var node = childNodes[indentLevel - 1]; + if (node && node.classList && node.classList.contains("ace_indent-guide")) + node.classList.add("ace_indent-guide-active"); + } + } + }; + Text.prototype.$renderHighlightIndentGuide = function () { + if (!this.$lines) + return; + var cells = this.$lines.cells; + this.$clearActiveIndentGuide(); + var indentLevel = this.$highlightIndentGuideMarker.indentLevel; + if (indentLevel !== 0) { + if (this.$highlightIndentGuideMarker.dir === 1) { + for (var i = 0; i < cells.length; i++) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row >= this.$highlightIndentGuideMarker.start + + 1) { + if (cell.row >= this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + else { + for (var i = cells.length - 1; i >= 0; i--) { + var cell = cells[i]; + if (this.$highlightIndentGuideMarker.end && cell.row < this.$highlightIndentGuideMarker.start) { + if (cell.row < this.$highlightIndentGuideMarker.end) + break; + this.$setIndentGuideActive(cell, indentLevel); + } + } + } + } + }; + Text.prototype.$createLineElement = function (parent) { var lineEl = this.dom.createElement("div"); lineEl.className = "ace_line"; lineEl.style.height = this.config.lineHeight + "px"; - return lineEl; }; - - this.$renderWrappedLine = function(parent, tokens, splits) { + Text.prototype.$renderWrappedLine = function (parent, tokens, splits) { var chars = 0; var split = 0; var splitChars = splits[0]; var screenColumn = 0; - var lineEl = this.$createLineElement(); parent.appendChild(lineEl); - for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; @@ -16539,44 +17726,35 @@ var Text = function(parentEl) { continue; chars -= value.length; } - if (chars + value.length < splitChars) { screenColumn = this.$renderToken(lineEl, screenColumn, token, value); chars += value.length; - } else { + } + else { while (chars + value.length >= splitChars) { - screenColumn = this.$renderToken( - lineEl, screenColumn, - token, value.substring(0, splitChars - chars) - ); + screenColumn = this.$renderToken(lineEl, screenColumn, token, value.substring(0, splitChars - chars)); value = value.substring(splitChars - chars); chars = splitChars; - lineEl = this.$createLineElement(); parent.appendChild(lineEl); - - lineEl.appendChild(this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element)); - - split ++; + var text = this.dom.createTextNode(lang.stringRepeat("\xa0", splits.indent), this.element); + text["charCount"] = 0; // not to take into account when we are counting columns + lineEl.appendChild(text); + split++; screenColumn = 0; splitChars = splits[split] || Number.MAX_VALUE; } if (value.length != 0) { chars += value.length; - screenColumn = this.$renderToken( - lineEl, screenColumn, token, value - ); + screenColumn = this.$renderToken(lineEl, screenColumn, token, value); } } } - if (splits[splits.length - 1] > this.MAX_LINE_LENGTH) this.$renderOverflowMessage(lineEl, screenColumn, null, "", true); }; - - this.$renderSimpleLine = function(parent, tokens) { + Text.prototype.$renderSimpleLine = function (parent, tokens) { var screenColumn = 0; - for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; @@ -16590,33 +17768,28 @@ var Text = function(parentEl) { screenColumn = this.$renderToken(parent, screenColumn, token, value); } }; - - this.$renderOverflowMessage = function(parent, screenColumn, token, value, hide) { - token && this.$renderToken(parent, screenColumn, token, - value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); - + Text.prototype.$renderOverflowMessage = function (parent, screenColumn, token, value, hide) { + token && this.$renderToken(parent, screenColumn, token, value.slice(0, this.MAX_LINE_LENGTH - screenColumn)); var overflowEl = this.dom.createElement("span"); overflowEl.className = "ace_inline_button ace_keyword ace_toggle_wrap"; overflowEl.textContent = hide ? "" : ""; - - parent.appendChild(overflowEl); + parent.appendChild(overflowEl); }; - this.$renderLine = function(parent, row, foldLine) { + Text.prototype.$renderLine = function (parent, row, foldLine) { if (!foldLine && foldLine != false) foldLine = this.session.getFoldLine(row); - if (foldLine) var tokens = this.$getFoldLineTokens(row, foldLine); else var tokens = this.session.getTokens(row); - var lastLineEl = parent; if (tokens.length) { var splits = this.session.getRowSplitData(row); if (splits && splits.length) { this.$renderWrappedLine(parent, tokens, splits); var lastLineEl = parent.lastChild; - } else { + } + else { var lastLineEl = parent; if (this.$useLineGroups()) { lastLineEl = this.$createLineElement(); @@ -16624,33 +17797,28 @@ var Text = function(parentEl) { } this.$renderSimpleLine(lastLineEl, tokens); } - } else if (this.$useLineGroups()) { + } + else if (this.$useLineGroups()) { lastLineEl = this.$createLineElement(); parent.appendChild(lastLineEl); } - if (this.showEOL && lastLineEl) { if (foldLine) row = foldLine.end.row; - var invisibleEl = this.dom.createElement("span"); invisibleEl.className = "ace_invisible ace_invisible_eol"; invisibleEl.textContent = row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR; - lastLineEl.appendChild(invisibleEl); } }; - - this.$getFoldLineTokens = function(row, foldLine) { + Text.prototype.$getFoldLineTokens = function (row, foldLine) { var session = this.session; var renderTokens = []; - function addTokens(tokens, from, to) { var idx = 0, col = 0; while ((col + tokens[idx].value.length) < from) { col += tokens[idx].value.length; idx++; - if (idx == tokens.length) return; } @@ -16658,16 +17826,13 @@ var Text = function(parentEl) { var value = tokens[idx].value.substring(from - col); if (value.length > (to - from)) value = value.substring(0, to - from); - renderTokens.push({ type: tokens[idx].type, value: value }); - col = from + value.length; idx += 1; } - while (col < to && idx < tokens.length) { var value = tokens[idx].value; if (value.length + col > to) { @@ -16675,114 +17840,112 @@ var Text = function(parentEl) { type: tokens[idx].type, value: value.substring(0, to - col) }); - } else + } + else renderTokens.push(tokens[idx]); col += value.length; idx += 1; } } - var tokens = session.getTokens(row); - foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + foldLine.walk(function (placeholder, row, column, lastColumn, isNewRow) { if (placeholder != null) { renderTokens.push({ type: "fold", value: placeholder }); - } else { + } + else { if (isNewRow) tokens = session.getTokens(row); - if (tokens.length) addTokens(tokens, lastColumn, column); } }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); - return renderTokens; }; - - this.$useLineGroups = function() { + Text.prototype.$useLineGroups = function () { return this.session.getUseWrapMode(); }; - - this.destroy = function() {}; -}).call(Text.prototype); - + return Text; +}()); +Text.prototype.EOF_CHAR = "\xB6"; +Text.prototype.EOL_CHAR_LF = "\xAC"; +Text.prototype.EOL_CHAR_CRLF = "\xa4"; +Text.prototype.EOL_CHAR = Text.prototype.EOL_CHAR_LF; +Text.prototype.TAB_CHAR = "\u2014"; //"\u21E5"; +Text.prototype.SPACE_CHAR = "\xB7"; +Text.prototype.$padding = 0; +Text.prototype.MAX_LINE_LENGTH = 10000; +Text.prototype.showInvisibles = false; +Text.prototype.showSpaces = false; +Text.prototype.showTabs = false; +Text.prototype.showEOL = false; +Text.prototype.displayIndentGuides = true; +Text.prototype.$highlightIndentGuides = true; +Text.prototype.$tabStrings = []; +Text.prototype.destroy = {}; +Text.prototype.onChangeTabSize = Text.prototype.$computeTabString; +oop.implement(Text.prototype, EventEmitter); exports.Text = Text; }); -define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); - -var Cursor = function(parentEl) { - this.element = dom.createElement("div"); - this.element.className = "ace_layer ace_cursor-layer"; - parentEl.appendChild(this.element); - - this.isVisible = false; - this.isBlinking = true; - this.blinkInterval = 1000; - this.smoothBlinking = false; - - this.cursors = []; - this.cursor = this.addCursor(); - dom.addCssClass(this.element, "ace_hidden-cursors"); - this.$updateCursors = this.$updateOpacity.bind(this); -}; - -(function() { - - this.$updateOpacity = function(val) { +var Cursor = /** @class */ (function () { + function Cursor(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = this.$updateOpacity.bind(this); + } + Cursor.prototype.$updateOpacity = function (val) { var cursors = this.cursors; - for (var i = cursors.length; i--; ) + for (var i = cursors.length; i--;) dom.setStyle(cursors[i].style, "opacity", val ? "" : "0"); }; - - this.$startCssAnimation = function() { + Cursor.prototype.$startCssAnimation = function () { var cursors = this.cursors; - for (var i = cursors.length; i--; ) + for (var i = cursors.length; i--;) cursors[i].style.animationDuration = this.blinkInterval + "ms"; - this.$isAnimating = true; - setTimeout(function() { + setTimeout(function () { if (this.$isAnimating) { dom.addCssClass(this.element, "ace_animate-blinking"); } }.bind(this)); }; - - this.$stopCssAnimation = function() { + Cursor.prototype.$stopCssAnimation = function () { this.$isAnimating = false; dom.removeCssClass(this.element, "ace_animate-blinking"); }; - - this.$padding = 0; - this.setPadding = function(padding) { + Cursor.prototype.setPadding = function (padding) { this.$padding = padding; }; - - this.setSession = function(session) { + Cursor.prototype.setSession = function (session) { this.session = session; }; - - this.setBlinking = function(blinking) { + Cursor.prototype.setBlinking = function (blinking) { if (blinking != this.isBlinking) { this.isBlinking = blinking; this.restartTimer(); } }; - - this.setBlinkInterval = function(blinkInterval) { + Cursor.prototype.setBlinkInterval = function (blinkInterval) { if (blinkInterval != this.blinkInterval) { this.blinkInterval = blinkInterval; this.restartTimer(); } }; - - this.setSmoothBlinking = function(smoothBlinking) { + Cursor.prototype.setSmoothBlinking = function (smoothBlinking) { if (smoothBlinking != this.smoothBlinking) { this.smoothBlinking = smoothBlinking; dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); @@ -16790,145 +17953,122 @@ var Cursor = function(parentEl) { this.restartTimer(); } }; - - this.addCursor = function() { + Cursor.prototype.addCursor = function () { var el = dom.createElement("div"); el.className = "ace_cursor"; this.element.appendChild(el); this.cursors.push(el); return el; }; - - this.removeCursor = function() { + Cursor.prototype.removeCursor = function () { if (this.cursors.length > 1) { var el = this.cursors.pop(); el.parentNode.removeChild(el); return el; } }; - - this.hideCursor = function() { + Cursor.prototype.hideCursor = function () { this.isVisible = false; dom.addCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; - - this.showCursor = function() { + Cursor.prototype.showCursor = function () { this.isVisible = true; dom.removeCssClass(this.element, "ace_hidden-cursors"); this.restartTimer(); }; - - this.restartTimer = function() { + Cursor.prototype.restartTimer = function () { var update = this.$updateCursors; clearInterval(this.intervalId); clearTimeout(this.timeoutId); this.$stopCssAnimation(); - if (this.smoothBlinking) { this.$isSmoothBlinking = false; dom.removeCssClass(this.element, "ace_smooth-blinking"); } - update(true); - if (!this.isBlinking || !this.blinkInterval || !this.isVisible) { this.$stopCssAnimation(); return; } - if (this.smoothBlinking) { this.$isSmoothBlinking = true; - setTimeout(function() { + setTimeout(function () { if (this.$isSmoothBlinking) { dom.addCssClass(this.element, "ace_smooth-blinking"); } }.bind(this)); } - if (dom.HAS_CSS_ANIMATION) { this.$startCssAnimation(); - } else { - var blink = function(){ - this.timeoutId = setTimeout(function() { + } + else { + var blink = /**@this{Cursor}*/ function () { + this.timeoutId = setTimeout(function () { update(false); }, 0.6 * this.blinkInterval); }.bind(this); - - this.intervalId = setInterval(function() { + this.intervalId = setInterval(function () { update(true); blink(); }, this.blinkInterval); blink(); } }; - - this.getPixelPosition = function(position, onScreen) { + Cursor.prototype.getPixelPosition = function (position, onScreen) { if (!this.config || !this.session) - return {left : 0, top : 0}; - + return { left: 0, top: 0 }; if (!position) position = this.session.selection.getCursor(); var pos = this.session.documentToScreenPosition(position); var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row) ? this.session.$bidiHandler.getPosLeft(pos.column) : pos.column * this.config.characterWidth); - var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * this.config.lineHeight; - - return {left : cursorLeft, top : cursorTop}; + return { left: cursorLeft, top: cursorTop }; }; - - this.isCursorInView = function(pixelPos, config) { + Cursor.prototype.isCursorInView = function (pixelPos, config) { return pixelPos.top >= 0 && pixelPos.top < config.maxHeight; }; - - this.update = function(config) { + Cursor.prototype.update = function (config) { this.config = config; - var selections = this.session.$selectionMarkers; var i = 0, cursorIndex = 0; - - if (selections === undefined || selections.length === 0){ - selections = [{cursor: null}]; + if (selections === undefined || selections.length === 0) { + selections = [{ cursor: null }]; } - for (var i = 0, n = selections.length; i < n; i++) { var pixelPos = this.getPixelPosition(selections[i].cursor, true); if ((pixelPos.top > config.height + config.offset || - pixelPos.top < 0) && i > 1) { + pixelPos.top < 0) && i > 1) { continue; } - var element = this.cursors[cursorIndex++] || this.addCursor(); var style = element.style; - if (!this.drawCursor) { if (!this.isCursorInView(pixelPos, config)) { dom.setStyle(style, "display", "none"); - } else { + } + else { dom.setStyle(style, "display", "block"); dom.translate(element, pixelPos.left, pixelPos.top); dom.setStyle(style, "width", Math.round(config.characterWidth) + "px"); dom.setStyle(style, "height", config.lineHeight + "px"); } - } else { + } + else { this.drawCursor(element, pixelPos, config, selections[i], this.session); } } while (this.cursors.length > cursorIndex) this.removeCursor(); - var overwrite = this.session.getOverwrite(); this.$setOverwrite(overwrite); this.$pixelPos = pixelPos; this.restartTimer(); }; - - this.drawCursor = null; - - this.$setOverwrite = function(overwrite) { + Cursor.prototype.$setOverwrite = function (overwrite) { if (overwrite != this.overwrite) { this.overwrite = overwrite; if (overwrite) @@ -16937,270 +18077,485 @@ var Cursor = function(parentEl) { dom.removeCssClass(this.element, "ace_overwrite-cursors"); } }; - - this.destroy = function() { + Cursor.prototype.destroy = function () { clearInterval(this.intervalId); clearTimeout(this.timeoutId); }; - -}).call(Cursor.prototype); - + return Cursor; +}()); +Cursor.prototype.$padding = 0; +Cursor.prototype.drawCursor = null; exports.Cursor = Cursor; }); -define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { -"use strict"; - +define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var oop = require("./lib/oop"); var dom = require("./lib/dom"); var event = require("./lib/event"); var EventEmitter = require("./lib/event_emitter").EventEmitter; var MAX_SCROLL_H = 0x8000; -var ScrollBar = function(parent) { - this.element = dom.createElement("div"); - this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; - - this.inner = dom.createElement("div"); - this.inner.className = "ace_scrollbar-inner"; - this.inner.textContent = "\xa0"; - this.element.appendChild(this.inner); - - parent.appendChild(this.element); - - this.setVisible(false); - this.skipEvent = false; - - event.addListener(this.element, "scroll", this.onScroll.bind(this)); - event.addListener(this.element, "mousedown", event.preventDefault); -}; - -(function() { - oop.implement(this, EventEmitter); - - this.setVisible = function(isVisible) { +var Scrollbar = /** @class */ (function () { + function Scrollbar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + classSuffix; + this.element.tabIndex = -1; + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.inner.textContent = "\xa0"; + this.element.appendChild(this.inner); + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); + } + Scrollbar.prototype.setVisible = function (isVisible) { this.element.style.display = isVisible ? "" : "none"; this.isVisible = isVisible; this.coeff = 1; }; -}).call(ScrollBar.prototype); -var VScrollBar = function(parent, renderer) { - ScrollBar.call(this, parent); - this.scrollTop = 0; - this.scrollHeight = 0; - renderer.$scrollbarWidth = - this.width = dom.scrollbarWidth(parent.ownerDocument); - this.inner.style.width = - this.element.style.width = (this.width || 15) + 5 + "px"; - this.$minWidth = 0; -}; - -oop.inherits(VScrollBar, ScrollBar); - -(function() { - - this.classSuffix = '-v'; - this.onScroll = function() { + return Scrollbar; +}()); +oop.implement(Scrollbar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + renderer.$scrollbarWidth = + _this.width = dom.scrollbarWidth(parent.ownerDocument); + _this.inner.style.width = + _this.element.style.width = (_this.width || 15) + 5 + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onScroll = function () { if (!this.skipEvent) { this.scrollTop = this.element.scrollTop; if (this.coeff != 1) { var h = this.element.clientHeight / this.scrollHeight; this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); } - this._emit("scroll", {data: this.scrollTop}); + this._emit("scroll", { data: this.scrollTop }); } this.skipEvent = false; }; - this.getWidth = function() { + VScrollBar.prototype.getWidth = function () { return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); }; - this.setHeight = function(height) { + VScrollBar.prototype.setHeight = function (height) { this.element.style.height = height + "px"; }; - this.setInnerHeight = - this.setScrollHeight = function(height) { + VScrollBar.prototype.setScrollHeight = function (height) { this.scrollHeight = height; if (height > MAX_SCROLL_H) { this.coeff = MAX_SCROLL_H / height; height = MAX_SCROLL_H; - } else if (this.coeff != 1) { + } + else if (this.coeff != 1) { this.coeff = 1; } this.inner.style.height = height + "px"; }; - this.setScrollTop = function(scrollTop) { + VScrollBar.prototype.setScrollTop = function (scrollTop) { if (this.scrollTop != scrollTop) { this.skipEvent = true; this.scrollTop = scrollTop; this.element.scrollTop = scrollTop * this.coeff; } }; - -}).call(VScrollBar.prototype); -var HScrollBar = function(parent, renderer) { - ScrollBar.call(this, parent); - this.scrollLeft = 0; - this.height = renderer.$scrollbarWidth; - this.inner.style.height = - this.element.style.height = (this.height || 15) + 5 + "px"; -}; - -oop.inherits(HScrollBar, ScrollBar); - -(function() { - - this.classSuffix = '-h'; - this.onScroll = function() { + return VScrollBar; +}(Scrollbar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.height = renderer.$scrollbarWidth; + _this.inner.style.height = + _this.element.style.height = (_this.height || 15) + 5 + "px"; + return _this; + } + HScrollBar.prototype.onScroll = function () { if (!this.skipEvent) { this.scrollLeft = this.element.scrollLeft; - this._emit("scroll", {data: this.scrollLeft}); + this._emit("scroll", { data: this.scrollLeft }); + } + this.skipEvent = false; + }; + HScrollBar.prototype.getHeight = function () { + return this.isVisible ? this.height : 0; + }; + HScrollBar.prototype.setWidth = function (width) { + this.element.style.width = width + "px"; + }; + HScrollBar.prototype.setInnerWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollWidth = function (width) { + this.inner.style.width = width + "px"; + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + return HScrollBar; +}(Scrollbar)); +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; + +}); + +define("ace/scrollbar_custom",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +dom.importCssString(".ace_editor>.ace_sb-v div, .ace_editor>.ace_sb-h div{\n position: absolute;\n background: rgba(128, 128, 128, 0.6);\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n border: 1px solid #bbb;\n border-radius: 2px;\n z-index: 8;\n}\n.ace_editor>.ace_sb-v, .ace_editor>.ace_sb-h {\n position: absolute;\n z-index: 6;\n background: none;\n overflow: hidden!important;\n}\n.ace_editor>.ace_sb-v {\n z-index: 6;\n right: 0;\n top: 0;\n width: 12px;\n}\n.ace_editor>.ace_sb-v div {\n z-index: 8;\n right: 0;\n width: 100%;\n}\n.ace_editor>.ace_sb-h {\n bottom: 0;\n left: 0;\n height: 12px;\n}\n.ace_editor>.ace_sb-h div {\n bottom: 0;\n height: 100%;\n}\n.ace_editor>.ace_sb_grabbed {\n z-index: 8;\n background: #000;\n}", "ace_scrollbar.css", false); +var ScrollBar = /** @class */ (function () { + function ScrollBar(parent, classSuffix) { + this.element = dom.createElement("div"); + this.element.className = "ace_sb" + classSuffix; + this.inner = dom.createElement("div"); + this.inner.className = ""; + this.element.appendChild(this.inner); + this.VScrollWidth = 12; + this.HScrollHeight = 12; + parent.appendChild(this.element); + this.setVisible(false); + this.skipEvent = false; + event.addMultiMouseDownListener(this.element, [500, 300, 300], this, "onMouseDown"); + } + ScrollBar.prototype.setVisible = function (isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + this.coeff = 1; + }; + return ScrollBar; +}()); +oop.implement(ScrollBar.prototype, EventEmitter); +var VScrollBar = /** @class */ (function (_super) { + __extends(VScrollBar, _super); + function VScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-v') || this; + _this.scrollTop = 0; + _this.scrollHeight = 0; + _this.parent = parent; + _this.width = _this.VScrollWidth; + _this.renderer = renderer; + _this.inner.style.width = _this.element.style.width = (_this.width || 15) + "px"; + _this.$minWidth = 0; + return _this; + } + VScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageY = e.clientY; + var onMouseMove = function (e) { + mousePageY = e.clientY; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startY = e.clientY; + var startTop = this.thumbTop; + var onScrollInterval = function () { + if (mousePageY === undefined) + return; + var scrollTop = self.scrollTopFromThumbTop(startTop + mousePageY - startY); + if (scrollTop === self.scrollTop) + return; + self._emit("scroll", { data: scrollTop }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); + } + var top = e.clientY - this.element.getBoundingClientRect().top - this.thumbHeight / 2; + this._emit("scroll", { data: this.scrollTopFromThumbTop(top) }); + return event.preventDefault(e); + }; + VScrollBar.prototype.getHeight = function () { + return this.height; + }; + VScrollBar.prototype.scrollTopFromThumbTop = function (thumbTop) { + var scrollTop = thumbTop * (this.pageHeight - this.viewHeight) / (this.slideHeight - this.thumbHeight); + scrollTop = scrollTop >> 0; + if (scrollTop < 0) { + scrollTop = 0; + } + else if (scrollTop > this.pageHeight - this.viewHeight) { + scrollTop = this.pageHeight - this.viewHeight; + } + return scrollTop; + }; + VScrollBar.prototype.getWidth = function () { + return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0); + }; + VScrollBar.prototype.setHeight = function (height) { + this.height = Math.max(0, height); + this.slideHeight = this.height; + this.viewHeight = this.height; + this.setScrollHeight(this.pageHeight, true); + }; + VScrollBar.prototype.setScrollHeight = function (height, force) { + if (this.pageHeight === height && !force) + return; + this.pageHeight = height; + this.thumbHeight = this.slideHeight * this.viewHeight / this.pageHeight; + if (this.thumbHeight > this.slideHeight) + this.thumbHeight = this.slideHeight; + if (this.thumbHeight < 15) + this.thumbHeight = 15; + this.inner.style.height = this.thumbHeight + "px"; + if (this.scrollTop > (this.pageHeight - this.viewHeight)) { + this.scrollTop = (this.pageHeight - this.viewHeight); + if (this.scrollTop < 0) + this.scrollTop = 0; + this._emit("scroll", { data: this.scrollTop }); + } + }; + VScrollBar.prototype.setScrollTop = function (scrollTop) { + this.scrollTop = scrollTop; + if (scrollTop < 0) + scrollTop = 0; + this.thumbTop = scrollTop * (this.slideHeight - this.thumbHeight) / (this.pageHeight - this.viewHeight); + this.inner.style.top = this.thumbTop + "px"; + }; + return VScrollBar; +}(ScrollBar)); +VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight; +var HScrollBar = /** @class */ (function (_super) { + __extends(HScrollBar, _super); + function HScrollBar(parent, renderer) { + var _this = _super.call(this, parent, '-h') || this; + _this.scrollLeft = 0; + _this.scrollWidth = 0; + _this.height = _this.HScrollHeight; + _this.inner.style.height = _this.element.style.height = (_this.height || 12) + "px"; + _this.renderer = renderer; + return _this; + } + HScrollBar.prototype.onMouseDown = function (eType, e) { + if (eType !== "mousedown") + return; + if (event.getButton(e) !== 0 || e.detail === 2) { + return; + } + if (e.target === this.inner) { + var self = this; + var mousePageX = e.clientX; + var onMouseMove = function (e) { + mousePageX = e.clientX; + }; + var onMouseUp = function () { + clearInterval(timerId); + }; + var startX = e.clientX; + var startLeft = this.thumbLeft; + var onScrollInterval = function () { + if (mousePageX === undefined) + return; + var scrollLeft = self.scrollLeftFromThumbLeft(startLeft + mousePageX - startX); + if (scrollLeft === self.scrollLeft) + return; + self._emit("scroll", { data: scrollLeft }); + }; + event.capture(this.inner, onMouseMove, onMouseUp); + var timerId = setInterval(onScrollInterval, 20); + return event.preventDefault(e); } - this.skipEvent = false; + var left = e.clientX - this.element.getBoundingClientRect().left - this.thumbWidth / 2; + this._emit("scroll", { data: this.scrollLeftFromThumbLeft(left) }); + return event.preventDefault(e); }; - this.getHeight = function() { + HScrollBar.prototype.getHeight = function () { return this.isVisible ? this.height : 0; }; - this.setWidth = function(width) { - this.element.style.width = width + "px"; - }; - this.setInnerWidth = function(width) { - this.inner.style.width = width + "px"; - }; - this.setScrollWidth = function(width) { - this.inner.style.width = width + "px"; - }; - this.setScrollLeft = function(scrollLeft) { - if (this.scrollLeft != scrollLeft) { - this.skipEvent = true; - this.scrollLeft = this.element.scrollLeft = scrollLeft; + HScrollBar.prototype.scrollLeftFromThumbLeft = function (thumbLeft) { + var scrollLeft = thumbLeft * (this.pageWidth - this.viewWidth) / (this.slideWidth - this.thumbWidth); + scrollLeft = scrollLeft >> 0; + if (scrollLeft < 0) { + scrollLeft = 0; + } + else if (scrollLeft > this.pageWidth - this.viewWidth) { + scrollLeft = this.pageWidth - this.viewWidth; } + return scrollLeft; }; - -}).call(HScrollBar.prototype); - - + HScrollBar.prototype.setWidth = function (width) { + this.width = Math.max(0, width); + this.element.style.width = this.width + "px"; + this.slideWidth = this.width; + this.viewWidth = this.width; + this.setScrollWidth(this.pageWidth, true); + }; + HScrollBar.prototype.setScrollWidth = function (width, force) { + if (this.pageWidth === width && !force) + return; + this.pageWidth = width; + this.thumbWidth = this.slideWidth * this.viewWidth / this.pageWidth; + if (this.thumbWidth > this.slideWidth) + this.thumbWidth = this.slideWidth; + if (this.thumbWidth < 15) + this.thumbWidth = 15; + this.inner.style.width = this.thumbWidth + "px"; + if (this.scrollLeft > (this.pageWidth - this.viewWidth)) { + this.scrollLeft = (this.pageWidth - this.viewWidth); + if (this.scrollLeft < 0) + this.scrollLeft = 0; + this._emit("scroll", { data: this.scrollLeft }); + } + }; + HScrollBar.prototype.setScrollLeft = function (scrollLeft) { + this.scrollLeft = scrollLeft; + if (scrollLeft < 0) + scrollLeft = 0; + this.thumbLeft = scrollLeft * (this.slideWidth - this.thumbWidth) / (this.pageWidth - this.viewWidth); + this.inner.style.left = (this.thumbLeft) + "px"; + }; + return HScrollBar; +}(ScrollBar)); +HScrollBar.prototype.setInnerWidth = HScrollBar.prototype.setScrollWidth; exports.ScrollBar = VScrollBar; // backward compatibility exports.ScrollBarV = VScrollBar; // backward compatibility exports.ScrollBarH = HScrollBar; // backward compatibility - exports.VScrollBar = VScrollBar; exports.HScrollBar = HScrollBar; -}); -define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { -"use strict"; +}); +define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module){"use strict"; var event = require("./lib/event"); - - -var RenderLoop = function(onRender, win) { - this.onRender = onRender; - this.pending = false; - this.changes = 0; - this.$recursionLimit = 2; - this.window = win || window; - var _self = this; - this._flush = function(ts) { - _self.pending = false; - var changes = _self.changes; - - if (changes) { - event.blockIdle(100); - _self.changes = 0; - _self.onRender(changes); - } - - if (_self.changes) { - if (_self.$recursionLimit-- < 0) return; - _self.schedule(); - } else { - _self.$recursionLimit = 2; - } - }; -}; - -(function() { - - this.schedule = function(change) { +var RenderLoop = /** @class */ (function () { + function RenderLoop(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.$recursionLimit = 2; + this.window = win || window; + var _self = this; + this._flush = function (ts) { + _self.pending = false; + var changes = _self.changes; + if (changes) { + event.blockIdle(100); + _self.changes = 0; + _self.onRender(changes); + } + if (_self.changes) { + if (_self.$recursionLimit-- < 0) + return; + _self.schedule(); + } + else { + _self.$recursionLimit = 2; + } + }; + } + RenderLoop.prototype.schedule = function (change) { this.changes = this.changes | change; if (this.changes && !this.pending) { event.nextFrame(this._flush); this.pending = true; } }; - - this.clear = function(change) { + RenderLoop.prototype.clear = function (change) { var changes = this.changes; this.changes = 0; return changes; }; - -}).call(RenderLoop.prototype); - + return RenderLoop; +}()); exports.RenderLoop = RenderLoop; -}); -define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { +}); -var oop = require("../lib/oop"); +define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module){var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); var event = require("../lib/event"); var useragent = require("../lib/useragent"); var EventEmitter = require("../lib/event_emitter").EventEmitter; - -var CHAR_COUNT = 256; +var CHAR_COUNT = 512; var USE_OBSERVER = typeof ResizeObserver == "function"; var L = 200; - -var FontMetrics = exports.FontMetrics = function(parentEl) { - this.el = dom.createElement("div"); - this.$setMeasureNodeStyles(this.el.style, true); - - this.$main = dom.createElement("div"); - this.$setMeasureNodeStyles(this.$main.style); - - this.$measureNode = dom.createElement("div"); - this.$setMeasureNodeStyles(this.$measureNode.style); - - - this.el.appendChild(this.$main); - this.el.appendChild(this.$measureNode); - parentEl.appendChild(this.el); - - this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); - - this.$characterSize = {width: 0, height: 0}; - - - if (USE_OBSERVER) - this.$addObserver(); - else - this.checkForSizeChanges(); -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.$characterSize = {width: 0, height: 0}; - - this.$setMeasureNodeStyles = function(style, isRoot) { +var FontMetrics = /** @class */ (function () { + function FontMetrics(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + this.$measureNode.textContent = lang.stringRepeat("X", CHAR_COUNT); + this.$characterSize = { width: 0, height: 0 }; + if (USE_OBSERVER) + this.$addObserver(); + else + this.checkForSizeChanges(); + } + FontMetrics.prototype.$setMeasureNodeStyles = function (style, isRoot) { style.width = style.height = "auto"; style.left = style.top = "0px"; style.visibility = "hidden"; style.position = "absolute"; style.whiteSpace = "pre"; - if (useragent.isIE < 8) { style["font-family"] = "inherit"; - } else { + } + else { style.font = "inherit"; } style.overflow = isRoot ? "hidden" : "visible"; }; - - this.checkForSizeChanges = function(size) { + FontMetrics.prototype.checkForSizeChanges = function (size) { if (size === undefined) size = this.$measureSizes(); if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { @@ -17210,39 +18565,35 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { this.$characterSize = size; this.charSizes = Object.create(null); this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; - this._emit("changeCharacterSize", {data: size}); + this._emit("changeCharacterSize", { data: size }); } }; - - this.$addObserver = function() { + FontMetrics.prototype.$addObserver = function () { var self = this; - this.$observer = new window.ResizeObserver(function(e) { + this.$observer = new window.ResizeObserver(function (e) { self.checkForSizeChanges(); }); this.$observer.observe(this.$measureNode); }; - - this.$pollSizeChanges = function() { + FontMetrics.prototype.$pollSizeChanges = function () { if (this.$pollSizeChangesTimer || this.$observer) return this.$pollSizeChangesTimer; var self = this; - return this.$pollSizeChangesTimer = event.onIdle(function cb() { self.checkForSizeChanges(); event.onIdle(cb, 500); }, 500); }; - - this.setPolling = function(val) { + FontMetrics.prototype.setPolling = function (val) { if (val) { this.$pollSizeChanges(); - } else if (this.$pollSizeChangesTimer) { + } + else if (this.$pollSizeChangesTimer) { clearInterval(this.$pollSizeChangesTimer); this.$pollSizeChangesTimer = 0; } }; - - this.$measureSizes = function(node) { + FontMetrics.prototype.$measureSizes = function (node) { var size = { height: (node || this.$measureNode).clientHeight, width: (node || this.$measureNode).clientWidth / CHAR_COUNT @@ -17251,43 +18602,39 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { return null; return size; }; - - this.$measureCharWidth = function(ch) { + FontMetrics.prototype.$measureCharWidth = function (ch) { this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT); var rect = this.$main.getBoundingClientRect(); return rect.width / CHAR_COUNT; }; - - this.getCharacterWidth = function(ch) { + FontMetrics.prototype.getCharacterWidth = function (ch) { var w = this.charSizes[ch]; if (w === undefined) { w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; } return w; }; - - this.destroy = function() { + FontMetrics.prototype.destroy = function () { clearInterval(this.$pollSizeChangesTimer); if (this.$observer) this.$observer.disconnect(); if (this.el && this.el.parentNode) this.el.parentNode.removeChild(this.el); }; - - - this.$getZoom = function getZoom(element) { - if (!element || !element.parentElement) return 1; - return (window.getComputedStyle(element).zoom || 1) * getZoom(element.parentElement); + FontMetrics.prototype.$getZoom = function (element) { + if (!element || !element.parentElement) + return 1; + return (Number(window.getComputedStyle(element)["zoom"]) || 1) * this.$getZoom(element.parentElement); }; - this.$initTransformMeasureNodes = function() { - var t = function(t, l) { + FontMetrics.prototype.$initTransformMeasureNodes = function () { + var t = function (t, l) { return ["div", { - style: "position: absolute;top:" + t + "px;left:" + l + "px;" - }]; + style: "position: absolute;top:" + t + "px;left:" + l + "px;" + }]; }; this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el); }; - this.transformCoordinates = function(clientPos, elPos) { + FontMetrics.prototype.transformCoordinates = function (clientPos, elPos) { if (clientPos) { var zoom = this.$getZoom(this.el); clientPos = mul(1 / zoom, clientPos); @@ -17302,45 +18649,185 @@ var FontMetrics = exports.FontMetrics = function(parentEl) { function sub(a, b) { return [a[0] - b[0], a[1] - b[1]]; } function add(a, b) { return [a[0] + b[0], a[1] + b[1]]; } function mul(a, b) { return [a * b[0], a * b[1]]; } - if (!this.els) this.$initTransformMeasureNodes(); - function p(el) { var r = el.getBoundingClientRect(); return [r.left, r.top]; } - var a = p(this.els[0]); var b = p(this.els[1]); var c = p(this.els[2]); var d = p(this.els[3]); - var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a))); - var m1 = mul(1 + h[0], sub(b, a)); var m2 = mul(1 + h[1], sub(c, a)); - if (elPos) { var x = elPos; var k = h[0] * x[0] / L + h[1] * x[1] / L + 1; var ut = add(mul(x[0], m1), mul(x[1], m2)); - return add(mul(1 / k / L, ut), a); + return add(mul(1 / k / L, ut), a); } var u = sub(clientPos, a); var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u); return mul(L, f); }; - -}).call(FontMetrics.prototype); + return FontMetrics; +}()); +FontMetrics.prototype.$characterSize = { width: 0, height: 0 }; +oop.implement(FontMetrics.prototype, EventEmitter); +exports.FontMetrics = FontMetrics; }); -define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"], function(require, exports, module) { -"use strict"; +define("ace/css/editor-css",["require","exports","module"], function(require, exports, module){/* +styles = [] +for (var i = 1; i < 16; i++) { + styles.push(".ace_br" + i + "{" + ( + ["top-left", "top-right", "bottom-right", "bottom-left"] + ).map(function(x, j) { + return i & (1< .ace_line, .ace_text-layer > .ace_line_group {\n contain: style size layout;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n}\n\n.ace_hidpi .ace_text-layer,\n.ace_hidpi .ace_gutter-layer,\n.ace_hidpi .ace_content,\n.ace_hidpi .ace_gutter {\n contain: strict;\n}\n.ace_hidpi .ace_text-layer > .ace_line, \n.ace_hidpi .ace_text-layer > .ace_line_group {\n contain: strict;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n box-sizing: border-box;\n border-left: 2px solid;\n /* workaround for smooth cursor repaintng whole screen in chrome */\n transform: translatez(0);\n}\n\n.ace_multiselect .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_slim-cursors .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_overwrite-cursors .ace_cursor {\n border-left-width: 0;\n border-bottom: 1px solid;\n}\n\n.ace_hidden-cursors .ace_cursor {\n opacity: 0.2;\n}\n\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\n opacity: 0;\n}\n\n.ace_smooth-blinking .ace_cursor {\n transition: opacity 0.18s;\n}\n\n.ace_animate-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: step-end;\n animation-name: blink-ace-animate;\n animation-iteration-count: infinite;\n}\n\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: ease-in-out;\n animation-name: blink-ace-animate-smooth;\n}\n \n@keyframes blink-ace-animate {\n from, to { opacity: 1; }\n 60% { opacity: 0; }\n}\n\n@keyframes blink-ace-animate-smooth {\n from, to { opacity: 1; }\n 45% { opacity: 1; }\n 60% { opacity: 0; }\n 85% { opacity: 0; }\n}\n\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 6;\n}\n\n.ace_marker-layer .ace_error_bracket {\n position: absolute;\n border-bottom: 1px solid #DE5555;\n border-radius: 0;\n}\n\n.ace_marker-layer .ace_active-line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected-word {\n position: absolute;\n z-index: 4;\n box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n box-sizing: border-box;\n\n display: inline-block;\n height: 11px;\n margin-top: -2px;\n vertical-align: middle;\n\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n color: transparent;\n\n border: 1px solid black;\n border-radius: 2px;\n\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n background-image:\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\n url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\n}\n\n.ace_tooltip {\n background-color: #f5f5f5;\n border: 1px solid gray;\n border-radius: 1px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n color: black;\n padding: 3px 4px;\n position: fixed;\n z-index: 999999;\n box-sizing: border-box;\n cursor: default;\n white-space: pre-wrap;\n word-wrap: break-word;\n line-height: normal;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n pointer-events: none;\n overflow: auto;\n max-width: min(33em, 66vw);\n overscroll-behavior: contain;\n}\n.ace_tooltip pre {\n white-space: pre-wrap;\n}\n\n.ace_tooltip.ace_dark {\n background-color: #636363;\n color: #fff;\n}\n\n.ace_tooltip:focus {\n outline: 1px solid #5E9ED6;\n}\n\n.ace_icon {\n display: inline-block;\n width: 18px;\n vertical-align: top;\n}\n\n.ace_icon_svg {\n display: inline-block;\n width: 12px;\n vertical-align: top;\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-size: 12px;\n -webkit-mask-position: center;\n}\n\n.ace_folding-enabled > .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell_svg-icons {\n padding-right: 13px;\n}\n\n.ace_fold-widget, .ace_custom-widget {\n box-sizing: border-box;\n\n margin: 0 -12px 0 1px;\n display: none;\n width: 11px;\n vertical-align: top;\n\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\n background-repeat: no-repeat;\n background-position: center;\n\n border-radius: 3px;\n \n border: 1px solid transparent;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_custom-widget {\n background: none;\n}\n\n.ace_folding-enabled .ace_fold-widget {\n display: inline-block; \n}\n\n.ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\n}\n\n.ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\n}\n\n.ace_fold-widget:hover {\n border: 1px solid rgba(0, 0, 0, 0.3);\n background-color: rgba(255, 255, 255, 0.2);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n}\n\n.ace_fold-widget:active {\n border: 1px solid rgba(0, 0, 0, 0.4);\n background-color: rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n/**\n * Dark version for fold widgets\n */\n.ace_dark .ace_fold-widget {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\n}\n.ace_dark .ace_fold-widget.ace_end {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget.ace_closed {\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\n}\n.ace_dark .ace_fold-widget:hover {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n background-color: rgba(255, 255, 255, 0.1);\n}\n.ace_dark .ace_fold-widget:active {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n}\n\n.ace_inline_button {\n border: 1px solid lightgray;\n display: inline-block;\n margin: -1px 8px;\n padding: 0 5px;\n pointer-events: auto;\n cursor: pointer;\n}\n.ace_inline_button:hover {\n border-color: gray;\n background: rgba(200,200,200,0.2);\n display: inline-block;\n pointer-events: auto;\n}\n\n.ace_fold-widget.ace_invalid {\n background-color: #FFB4B4;\n border-color: #DE5555;\n}\n\n.ace_fade-fold-widgets .ace_fold-widget {\n transition: opacity 0.4s ease 0.05s;\n opacity: 0;\n}\n\n.ace_fade-fold-widgets:hover .ace_fold-widget {\n transition: opacity 0.05s ease 0.05s;\n opacity:1;\n}\n\n.ace_underline {\n text-decoration: underline;\n}\n\n.ace_bold {\n font-weight: bold;\n}\n\n.ace_nobold .ace_bold {\n font-weight: normal;\n}\n\n.ace_italic {\n font-style: italic;\n}\n\n\n.ace_error-marker {\n background-color: rgba(255, 0, 0,0.2);\n position: absolute;\n z-index: 9;\n}\n\n.ace_highlight-marker {\n background-color: rgba(255, 255, 0,0.2);\n position: absolute;\n z-index: 8;\n}\n\n.ace_mobile-menu {\n position: absolute;\n line-height: 1.5;\n border-radius: 4px;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n background: white;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #dcdcdc;\n color: black;\n}\n.ace_dark > .ace_mobile-menu {\n background: #333;\n color: #ccc;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #444;\n\n}\n.ace_mobile-button {\n padding: 2px;\n cursor: pointer;\n overflow: hidden;\n}\n.ace_mobile-button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_mobile-button:active {\n background-color: #ddd;\n}\n\n.ace_placeholder {\n position: relative;\n font-family: arial;\n transform: scale(0.9);\n transform-origin: left;\n white-space: pre;\n opacity: 0.7;\n margin: 0 10px;\n z-index: 1;\n}\n\n.ace_ghost_text {\n opacity: 0.5;\n font-style: italic;\n}\n\n.ace_ghost_text_container > div {\n white-space: pre;\n}\n\n.ghost_text_line_wrapped::after {\n content: \"\u21A9\";\n position: absolute;\n}\n\n.ace_lineWidgetContainer.ace_ghost_text {\n margin: 0px 4px\n}\n\n.ace_screenreader-only {\n position:absolute;\n left:-10000px;\n top:auto;\n width:1px;\n height:1px;\n overflow:hidden;\n}\n\n.ace_hidden_token {\n display: none;\n}"; + +}); + +define("ace/layer/decorators",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module){"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var Decorator = /** @class */ (function () { + function Decorator(scrollbarV, renderer) { + this.renderer = renderer; + this.pixelRatio = 1; + this.maxHeight = renderer.layerConfig.maxHeight; + this.lineHeight = renderer.layerConfig.lineHeight; + this.minDecorationHeight = (2 * this.pixelRatio) | 0; + this.halfMinDecorationHeight = (this.minDecorationHeight / 2) | 0; + this.colors = {}; + this.colors.dark = { + "error": "rgba(255, 18, 18, 1)", + "warning": "rgba(18, 136, 18, 1)", + "info": "rgba(18, 18, 136, 1)", + }; + this.colors.light = { + "error": "rgb(255,51,51)", + "warning": "rgb(32,133,72)", + "info": "rgb(35,68,138)", + }; + this.setScrollBarV(scrollbarV); + } + Decorator.prototype.$createCanvas = function () { + this.canvas = dom.createElement("canvas"); + this.canvas.style.top = 0 + "px"; + this.canvas.style.right = 0 + "px"; + this.canvas.style.zIndex = "7"; + this.canvas.style.position = "absolute"; + }; + Decorator.prototype.setScrollBarV = function (scrollbarV) { + this.$createCanvas(); + this.scrollbarV = scrollbarV; + scrollbarV.element.appendChild(this.canvas); + this.setDimensions(); + }; + Decorator.prototype.$updateDecorators = function (config) { + if (typeof this.canvas.getContext !== "function") { + return; + } + var colors = (this.renderer.theme.isDark === true) ? this.colors.dark : this.colors.light; + this.setDimensions(config); + var ctx = this.canvas.getContext("2d"); + function compare(a, b) { + if (a.priority < b.priority) + return -1; + if (a.priority > b.priority) + return 1; + return 0; + } + var annotations = this.renderer.session.$annotations; + ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + if (annotations) { + var priorities = { + "info": 1, + "warning": 2, + "error": 3 + }; + annotations.forEach(function (item) { + item["priority"] = priorities[item.type] || null; + }); + annotations = annotations.sort(compare); + for (var i = 0; i < annotations.length; i++) { + var row = annotations[i].row; + var offset1 = this.getVerticalOffsetForRow(row); + var offset2 = offset1 + this.lineHeight; + var y1 = Math.round(this.heightRatio * offset1); + var y2 = Math.round(this.heightRatio * offset2); + var ycenter = Math.round((y1 + y2) / 2); + var halfHeight = (y2 - ycenter); + if (halfHeight < this.halfMinDecorationHeight) { + halfHeight = this.halfMinDecorationHeight; + } + if (ycenter - halfHeight < 0) { + ycenter = halfHeight; + } + if (ycenter + halfHeight > this.canvasHeight) { + ycenter = this.canvasHeight - halfHeight; + } + var from = ycenter - halfHeight; + var to = ycenter + halfHeight; + var zoneHeight = to - from; + ctx.fillStyle = colors[annotations[i].type] || null; + ctx.fillRect(0, from, Math.round(this.oneZoneWidth - 1), zoneHeight); + } + } + var cursor = this.renderer.session.selection.getCursor(); + if (cursor) { + var currentY = Math.round(this.getVerticalOffsetForRow(cursor.row) * this.heightRatio); + ctx.fillStyle = "rgba(0, 0, 0, 0.5)"; + ctx.fillRect(0, currentY, this.canvasWidth, 2); + } + }; + Decorator.prototype.getVerticalOffsetForRow = function (row) { + row = row | 0; + var offset = this.renderer.session.documentToScreenRow(row, 0) * this.lineHeight; + return offset; + }; + Decorator.prototype.setDimensions = function (config) { + config = config || this.renderer.layerConfig; + this.maxHeight = config.maxHeight; + this.lineHeight = config.lineHeight; + this.canvasHeight = config.height; + this.canvasWidth = this.scrollbarV.width || this.canvasWidth; + this.setZoneWidth(); + this.canvas.width = this.canvasWidth; + this.canvas.height = this.canvasHeight; + if (this.maxHeight < this.canvasHeight) { + this.heightRatio = 1; + } + else { + this.heightRatio = this.canvasHeight / this.maxHeight; + } + }; + Decorator.prototype.setZoneWidth = function () { + this.oneZoneWidth = this.canvasWidth; + }; + Decorator.prototype.destroy = function () { + this.canvas.parentNode.removeChild(this.canvas); + }; + return Decorator; +}()); +oop.implement(Decorator.prototype, EventEmitter); +exports.Decorator = Decorator; + +}); +define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/scrollbar_custom","ace/scrollbar_custom","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/css/editor-css","ace/layer/decorators","ace/lib/useragent","ace/layer/text_util"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var dom = require("./lib/dom"); +var lang = require("./lib/lang"); var config = require("./config"); var GutterLayer = require("./layer/gutter").Gutter; var MarkerLayer = require("./layer/marker").Marker; @@ -17348,660 +18835,133 @@ var TextLayer = require("./layer/text").Text; var CursorLayer = require("./layer/cursor").Cursor; var HScrollBar = require("./scrollbar").HScrollBar; var VScrollBar = require("./scrollbar").VScrollBar; +var HScrollBarCustom = require("./scrollbar_custom").HScrollBar; +var VScrollBarCustom = require("./scrollbar_custom").VScrollBar; var RenderLoop = require("./renderloop").RenderLoop; var FontMetrics = require("./layer/font_metrics").FontMetrics; var EventEmitter = require("./lib/event_emitter").EventEmitter; -var editorCss = "\ -.ace_br1 {border-top-left-radius : 3px;}\ -.ace_br2 {border-top-right-radius : 3px;}\ -.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ -.ace_br4 {border-bottom-right-radius: 3px;}\ -.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ -.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ -.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ -.ace_br8 {border-bottom-left-radius : 3px;}\ -.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ -.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ -.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ -.ace_editor {\ -position: relative;\ -overflow: hidden;\ -padding: 0;\ -font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ -direction: ltr;\ -text-align: left;\ --webkit-tap-highlight-color: rgba(0, 0, 0, 0);\ -}\ -.ace_scroller {\ -position: absolute;\ -overflow: hidden;\ -top: 0;\ -bottom: 0;\ -background-color: inherit;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -cursor: text;\ -}\ -.ace_content {\ -position: absolute;\ -box-sizing: border-box;\ -min-width: 100%;\ -contain: style size layout;\ -font-variant-ligatures: no-common-ligatures;\ -}\ -.ace_dragging .ace_scroller:before{\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -bottom: 0;\ -content: '';\ -background: rgba(250, 250, 250, 0.01);\ -z-index: 1000;\ -}\ -.ace_dragging.ace_dark .ace_scroller:before{\ -background: rgba(0, 0, 0, 0.01);\ -}\ -.ace_gutter {\ -position: absolute;\ -overflow : hidden;\ -width: auto;\ -top: 0;\ -bottom: 0;\ -left: 0;\ -cursor: default;\ -z-index: 4;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -contain: style size layout;\ -}\ -.ace_gutter-active-line {\ -position: absolute;\ -left: 0;\ -right: 0;\ -}\ -.ace_scroller.ace_scroll-left {\ -box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ -}\ -.ace_gutter-cell {\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -padding-left: 19px;\ -padding-right: 6px;\ -background-repeat: no-repeat;\ -}\ -.ace_gutter-cell.ace_error {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_warning {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ -background-position: 2px center;\ -}\ -.ace_dark .ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ -}\ -.ace_scrollbar {\ -contain: strict;\ -position: absolute;\ -right: 0;\ -bottom: 0;\ -z-index: 6;\ -}\ -.ace_scrollbar-inner {\ -position: absolute;\ -cursor: text;\ -left: 0;\ -top: 0;\ -}\ -.ace_scrollbar-v{\ -overflow-x: hidden;\ -overflow-y: scroll;\ -top: 0;\ -}\ -.ace_scrollbar-h {\ -overflow-x: scroll;\ -overflow-y: hidden;\ -left: 0;\ -}\ -.ace_print-margin {\ -position: absolute;\ -height: 100%;\ -}\ -.ace_text-input {\ -position: absolute;\ -z-index: 0;\ -width: 0.5em;\ -height: 1em;\ -opacity: 0;\ -background: transparent;\ --moz-appearance: none;\ -appearance: none;\ -border: none;\ -resize: none;\ -outline: none;\ -overflow: hidden;\ -font: inherit;\ -padding: 0 1px;\ -margin: 0 -1px;\ -contain: strict;\ --ms-user-select: text;\ --moz-user-select: text;\ --webkit-user-select: text;\ -user-select: text;\ -white-space: pre!important;\ -}\ -.ace_text-input.ace_composition {\ -background: transparent;\ -color: inherit;\ -z-index: 1000;\ -opacity: 1;\ -}\ -.ace_composition_placeholder { color: transparent }\ -.ace_composition_marker { \ -border-bottom: 1px solid;\ -position: absolute;\ -border-radius: 0;\ -margin-top: 1px;\ -}\ -[ace_nocontext=true] {\ -transform: none!important;\ -filter: none!important;\ -clip-path: none!important;\ -mask : none!important;\ -contain: none!important;\ -perspective: none!important;\ -mix-blend-mode: initial!important;\ -z-index: auto;\ -}\ -.ace_layer {\ -z-index: 1;\ -position: absolute;\ -overflow: hidden;\ -word-wrap: normal;\ -white-space: pre;\ -height: 100%;\ -width: 100%;\ -box-sizing: border-box;\ -pointer-events: none;\ -}\ -.ace_gutter-layer {\ -position: relative;\ -width: auto;\ -text-align: right;\ -pointer-events: auto;\ -height: 1000000px;\ -contain: style size layout;\ -}\ -.ace_text-layer {\ -font: inherit !important;\ -position: absolute;\ -height: 1000000px;\ -width: 1000000px;\ -contain: style size layout;\ -}\ -.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\ -contain: style size layout;\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -}\ -.ace_hidpi .ace_text-layer,\ -.ace_hidpi .ace_gutter-layer,\ -.ace_hidpi .ace_content,\ -.ace_hidpi .ace_gutter {\ -contain: strict;\ -will-change: transform;\ -}\ -.ace_hidpi .ace_text-layer > .ace_line, \ -.ace_hidpi .ace_text-layer > .ace_line_group {\ -contain: strict;\ -}\ -.ace_cjk {\ -display: inline-block;\ -text-align: center;\ -}\ -.ace_cursor-layer {\ -z-index: 4;\ -}\ -.ace_cursor {\ -z-index: 4;\ -position: absolute;\ -box-sizing: border-box;\ -border-left: 2px solid;\ -transform: translatez(0);\ -}\ -.ace_multiselect .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_slim-cursors .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_overwrite-cursors .ace_cursor {\ -border-left-width: 0;\ -border-bottom: 1px solid;\ -}\ -.ace_hidden-cursors .ace_cursor {\ -opacity: 0.2;\ -}\ -.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\ -opacity: 0;\ -}\ -.ace_smooth-blinking .ace_cursor {\ -transition: opacity 0.18s;\ -}\ -.ace_animate-blinking .ace_cursor {\ -animation-duration: 1000ms;\ -animation-timing-function: step-end;\ -animation-name: blink-ace-animate;\ -animation-iteration-count: infinite;\ -}\ -.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\ -animation-duration: 1000ms;\ -animation-timing-function: ease-in-out;\ -animation-name: blink-ace-animate-smooth;\ -}\ -@keyframes blink-ace-animate {\ -from, to { opacity: 1; }\ -60% { opacity: 0; }\ -}\ -@keyframes blink-ace-animate-smooth {\ -from, to { opacity: 1; }\ -45% { opacity: 1; }\ -60% { opacity: 0; }\ -85% { opacity: 0; }\ -}\ -.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ -position: absolute;\ -z-index: 3;\ -}\ -.ace_marker-layer .ace_selection {\ -position: absolute;\ -z-index: 5;\ -}\ -.ace_marker-layer .ace_bracket {\ -position: absolute;\ -z-index: 6;\ -}\ -.ace_marker-layer .ace_error_bracket {\ -position: absolute;\ -border-bottom: 1px solid #DE5555;\ -border-radius: 0;\ -}\ -.ace_marker-layer .ace_active-line {\ -position: absolute;\ -z-index: 2;\ -}\ -.ace_marker-layer .ace_selected-word {\ -position: absolute;\ -z-index: 4;\ -box-sizing: border-box;\ -}\ -.ace_line .ace_fold {\ -box-sizing: border-box;\ -display: inline-block;\ -height: 11px;\ -margin-top: -2px;\ -vertical-align: middle;\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ -background-repeat: no-repeat, repeat-x;\ -background-position: center center, top left;\ -color: transparent;\ -border: 1px solid black;\ -border-radius: 2px;\ -cursor: pointer;\ -pointer-events: auto;\ -}\ -.ace_dark .ace_fold {\ -}\ -.ace_fold:hover{\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ -}\ -.ace_tooltip {\ -background-color: #FFF;\ -background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ -border: 1px solid gray;\ -border-radius: 1px;\ -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ -color: black;\ -max-width: 100%;\ -padding: 3px 4px;\ -position: fixed;\ -z-index: 999999;\ -box-sizing: border-box;\ -cursor: default;\ -white-space: pre;\ -word-wrap: break-word;\ -line-height: normal;\ -font-style: normal;\ -font-weight: normal;\ -letter-spacing: normal;\ -pointer-events: none;\ -}\ -.ace_folding-enabled > .ace_gutter-cell {\ -padding-right: 13px;\ -}\ -.ace_fold-widget {\ -box-sizing: border-box;\ -margin: 0 -12px 0 1px;\ -display: none;\ -width: 11px;\ -vertical-align: top;\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: center;\ -border-radius: 3px;\ -border: 1px solid transparent;\ -cursor: pointer;\ -}\ -.ace_folding-enabled .ace_fold-widget {\ -display: inline-block; \ -}\ -.ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ -}\ -.ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ -}\ -.ace_fold-widget:hover {\ -border: 1px solid rgba(0, 0, 0, 0.3);\ -background-color: rgba(255, 255, 255, 0.2);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ -}\ -.ace_fold-widget:active {\ -border: 1px solid rgba(0, 0, 0, 0.4);\ -background-color: rgba(0, 0, 0, 0.05);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ -}\ -.ace_dark .ace_fold-widget {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ -}\ -.ace_dark .ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget:hover {\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -background-color: rgba(255, 255, 255, 0.1);\ -}\ -.ace_dark .ace_fold-widget:active {\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -}\ -.ace_inline_button {\ -border: 1px solid lightgray;\ -display: inline-block;\ -margin: -1px 8px;\ -padding: 0 5px;\ -pointer-events: auto;\ -cursor: pointer;\ -}\ -.ace_inline_button:hover {\ -border-color: gray;\ -background: rgba(200,200,200,0.2);\ -display: inline-block;\ -pointer-events: auto;\ -}\ -.ace_fold-widget.ace_invalid {\ -background-color: #FFB4B4;\ -border-color: #DE5555;\ -}\ -.ace_fade-fold-widgets .ace_fold-widget {\ -transition: opacity 0.4s ease 0.05s;\ -opacity: 0;\ -}\ -.ace_fade-fold-widgets:hover .ace_fold-widget {\ -transition: opacity 0.05s ease 0.05s;\ -opacity:1;\ -}\ -.ace_underline {\ -text-decoration: underline;\ -}\ -.ace_bold {\ -font-weight: bold;\ -}\ -.ace_nobold .ace_bold {\ -font-weight: normal;\ -}\ -.ace_italic {\ -font-style: italic;\ -}\ -.ace_error-marker {\ -background-color: rgba(255, 0, 0,0.2);\ -position: absolute;\ -z-index: 9;\ -}\ -.ace_highlight-marker {\ -background-color: rgba(255, 255, 0,0.2);\ -position: absolute;\ -z-index: 8;\ -}\ -.ace_mobile-menu {\ -position: absolute;\ -line-height: 1.5;\ -border-radius: 4px;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -background: white;\ -box-shadow: 1px 3px 2px grey;\ -border: 1px solid #dcdcdc;\ -color: black;\ -}\ -.ace_dark > .ace_mobile-menu {\ -background: #333;\ -color: #ccc;\ -box-shadow: 1px 3px 2px grey;\ -border: 1px solid #444;\ -}\ -.ace_mobile-button {\ -padding: 2px;\ -cursor: pointer;\ -overflow: hidden;\ -}\ -.ace_mobile-button:hover {\ -background-color: #eee;\ -opacity:1;\ -}\ -.ace_mobile-button:active {\ -background-color: #ddd;\ -}\ -.ace_placeholder {\ -font-family: arial;\ -transform: scale(0.9);\ -transform-origin: left;\ -white-space: pre;\ -opacity: 0.7;\ -margin: 0 10px;\ -}"; - +var editorCss = require("./css/editor-css"); +var Decorator = require("./layer/decorators").Decorator; var useragent = require("./lib/useragent"); -var HIDE_TEXTAREA = useragent.isIE; - +var isTextToken = require("./layer/text_util").isTextToken; dom.importCssString(editorCss, "ace_editor.css", false); - -var VirtualRenderer = function(container, theme) { - var _self = this; - - this.container = container || dom.createElement("div"); - - dom.addCssClass(this.container, "ace_editor"); - if (dom.HI_DPI) dom.addCssClass(this.container, "ace_hidpi"); - - this.setTheme(theme); - if (config.get("useStrictCSP") == null) - config.set("useStrictCSP", false); - - this.$gutter = dom.createElement("div"); - this.$gutter.className = "ace_gutter"; - this.container.appendChild(this.$gutter); - this.$gutter.setAttribute("aria-hidden", true); - - this.scroller = dom.createElement("div"); - this.scroller.className = "ace_scroller"; - - this.container.appendChild(this.scroller); - - this.content = dom.createElement("div"); - this.content.className = "ace_content"; - this.scroller.appendChild(this.content); - - this.$gutterLayer = new GutterLayer(this.$gutter); - this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); - - this.$markerBack = new MarkerLayer(this.content); - - var textLayer = this.$textLayer = new TextLayer(this.content); - this.canvas = textLayer.element; - - this.$markerFront = new MarkerLayer(this.content); - - this.$cursorLayer = new CursorLayer(this.content); - this.$horizScroll = false; - this.$vScroll = false; - - this.scrollBar = - this.scrollBarV = new VScrollBar(this.container, this); - this.scrollBarH = new HScrollBar(this.container, this); - this.scrollBarV.on("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollTop(e.data - _self.scrollMargin.top); - }); - this.scrollBarH.on("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollLeft(e.data - _self.scrollMargin.left); - }); - - this.scrollTop = 0; - this.scrollLeft = 0; - - this.cursorPos = { - row : 0, - column : 0 - }; - - this.$fontMetrics = new FontMetrics(this.container); - this.$textLayer.$setFontMetrics(this.$fontMetrics); - this.$textLayer.on("changeCharacterSize", function(e) { - _self.updateCharacterSize(); - _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); - _self._signal("changeCharacterSize", e); - }); - - this.$size = { - width: 0, - height: 0, - scrollerHeight: 0, - scrollerWidth: 0, - $dirty: true - }; - - this.layerConfig = { - width : 1, - padding : 0, - firstRow : 0, - firstRowScreen: 0, - lastRow : 0, - lineHeight : 0, - characterWidth : 0, - minHeight : 1, - maxHeight : 1, - offset : 0, - height : 1, - gutterOffset: 1 - }; - - this.scrollMargin = { - left: 0, - right: 0, - top: 0, - bottom: 0, - v: 0, - h: 0 - }; - - this.margin = { - left: 0, - right: 0, - top: 0, - bottom: 0, - v: 0, - h: 0 - }; - - this.$keepTextAreaAtCursor = !useragent.isIOS; - - this.$loop = new RenderLoop( - this.$renderChanges.bind(this), - this.container.ownerDocument.defaultView - ); - this.$loop.schedule(this.CHANGE_FULL); - - this.updateCharacterSize(); - this.setPadding(4); - config.resetOptions(this); - config._signal("renderer", this); -}; - -(function() { - - this.CHANGE_CURSOR = 1; - this.CHANGE_MARKER = 2; - this.CHANGE_GUTTER = 4; - this.CHANGE_SCROLL = 8; - this.CHANGE_LINES = 16; - this.CHANGE_TEXT = 32; - this.CHANGE_SIZE = 64; - this.CHANGE_MARKER_BACK = 128; - this.CHANGE_MARKER_FRONT = 256; - this.CHANGE_FULL = 512; - this.CHANGE_H_SCROLL = 1024; - - oop.implement(this, EventEmitter); - - this.updateCharacterSize = function() { +var VirtualRenderer = /** @class */ (function () { + function VirtualRenderer(container, theme) { + var _self = this; + this.container = container || dom.createElement("div"); + dom.addCssClass(this.container, "ace_editor"); + if (dom.HI_DPI) + dom.addCssClass(this.container, "ace_hidpi"); + this.setTheme(theme); + if (config.get("useStrictCSP") == null) + config.set("useStrictCSP", false); + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + this.$gutter.setAttribute("aria-hidden", "true"); + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + this.$markerBack = new MarkerLayer(this.content); + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + this.$markerFront = new MarkerLayer(this.content); + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.on("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + this.scrollTop = 0; + this.scrollLeft = 0; + this.cursorPos = { + row: 0, + column: 0 + }; + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.on("changeCharacterSize", function (e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + this.layerConfig = { + width: 1, + padding: 0, + firstRow: 0, + firstRowScreen: 0, + lastRow: 0, + lineHeight: 0, + characterWidth: 0, + minHeight: 1, + maxHeight: 1, + offset: 0, + height: 1, + gutterOffset: 1 + }; + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.margin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + this.$keepTextAreaAtCursor = !useragent.isIOS; + this.$loop = new RenderLoop(this.$renderChanges.bind(this), this.container.ownerDocument.defaultView); + this.$loop.schedule(this.CHANGE_FULL); + this.updateCharacterSize(); + this.setPadding(4); + this.$addResizeObserver(); + config.resetOptions(this); + config._signal("renderer", this); + } + VirtualRenderer.prototype.updateCharacterSize = function () { if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { this.$allowBoldFonts = this.$textLayer.allowBoldFonts; this.setStyle("ace_nobold", !this.$allowBoldFonts); } - this.layerConfig.characterWidth = - this.characterWidth = this.$textLayer.getCharacterWidth(); + this.characterWidth = this.$textLayer.getCharacterWidth(); this.layerConfig.lineHeight = - this.lineHeight = this.$textLayer.getLineHeight(); + this.lineHeight = this.$textLayer.getLineHeight(); this.$updatePrintMargin(); dom.setStyle(this.scroller.style, "line-height", this.lineHeight + "px"); }; - this.setSession = function(session) { + VirtualRenderer.prototype.setSession = function (session) { if (this.session) this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); - this.session = session; if (session && this.scrollMargin.top && session.getScrollTop() <= 0) session.setScrollTop(-this.scrollMargin.top); - this.$cursorLayer.setSession(session); this.$markerBack.setSession(session); this.$markerFront.setSession(session); @@ -18009,19 +18969,16 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.setSession(session); if (!session) return; - this.$loop.schedule(this.CHANGE_FULL); this.session.$setFontMetrics(this.$fontMetrics); this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; - this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); this.onChangeNewLineMode(); this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); }; - this.updateLines = function(firstRow, lastRow, force) { + VirtualRenderer.prototype.updateLines = function (firstRow, lastRow, force) { if (lastRow === undefined) lastRow = Infinity; - if (!this.$changedLines) { this.$changedLines = { firstRow: firstRow, @@ -18031,7 +18988,6 @@ var VirtualRenderer = function(container, theme) { else { if (this.$changedLines.firstRow > firstRow) this.$changedLines.firstRow = firstRow; - if (this.$changedLines.lastRow < lastRow) this.$changedLines.lastRow = lastRow; } @@ -18045,38 +19001,34 @@ var VirtualRenderer = function(container, theme) { return; this.$loop.schedule(this.CHANGE_LINES); }; - - this.onChangeNewLineMode = function() { + VirtualRenderer.prototype.onChangeNewLineMode = function () { this.$loop.schedule(this.CHANGE_TEXT); this.$textLayer.$updateEolChar(); this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR); }; - - this.onChangeTabSize = function() { + VirtualRenderer.prototype.onChangeTabSize = function () { this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); this.$textLayer.onChangeTabSize(); }; - this.updateText = function() { + VirtualRenderer.prototype.updateText = function () { this.$loop.schedule(this.CHANGE_TEXT); }; - this.updateFull = function(force) { + VirtualRenderer.prototype.updateFull = function (force) { if (force) this.$renderChanges(this.CHANGE_FULL, true); else this.$loop.schedule(this.CHANGE_FULL); }; - this.updateFontSize = function() { + VirtualRenderer.prototype.updateFontSize = function () { this.$textLayer.checkForSizeChanges(); }; - - this.$changes = 0; - this.$updateSizeAsync = function() { + VirtualRenderer.prototype.$updateSizeAsync = function () { if (this.$loop.pending) this.$size.$dirty = true; else this.onResize(); }; - this.onResize = function(force, gutterWidth, width, height) { + VirtualRenderer.prototype.onResize = function (force, gutterWidth, width, height) { if (this.resizing > 2) return; else if (this.resizing > 0) @@ -18086,28 +19038,33 @@ var VirtualRenderer = function(container, theme) { var el = this.container; if (!height) height = el.clientHeight || el.scrollHeight; + if (!height && this.$maxLines && this.lineHeight > 1) { + if (!el.style.height || el.style.height == "0px") { + el.style.height = "1px"; + height = el.clientHeight || el.scrollHeight; + } + } if (!width) width = el.clientWidth || el.scrollWidth; var changes = this.$updateCachedSize(force, gutterWidth, width, height); - - + if (this.$resizeTimer) + this.$resizeTimer.cancel(); if (!this.$size.scrollerHeight || (!width && !height)) return this.resizing = 0; - if (force) this.$gutterLayer.$padding = null; - if (force) this.$renderChanges(changes | this.$changes, true); else this.$loop.schedule(changes | this.$changes); - if (this.resizing) this.resizing = 0; this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null; + if (this.$customScrollbar) { + this.$updateCustomScrollbar(true); + } }; - - this.$updateCachedSize = function(force, gutterWidth, width, height) { + VirtualRenderer.prototype.$updateCachedSize = function (force, gutterWidth, width, height) { height -= (this.$extraHeight || 0); var changes = 0; var size = this.$size; @@ -18120,124 +19077,114 @@ var VirtualRenderer = function(container, theme) { if (height && (force || size.height != height)) { size.height = height; changes |= this.CHANGE_SIZE; - size.scrollerHeight = size.height; if (this.$horizScroll) size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.setHeight(size.scrollerHeight); this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; - changes = changes | this.CHANGE_SCROLL; } - if (width && (force || size.width != width)) { changes |= this.CHANGE_SIZE; size.width = width; - if (gutterWidth == null) gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; - this.gutterWidth = gutterWidth; - dom.setStyle(this.scrollBarH.element.style, "left", gutterWidth + "px"); dom.setStyle(this.scroller.style, "left", gutterWidth + this.margin.left + "px"); size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h); dom.setStyle(this.$gutter.style, "left", this.margin.left + "px"); - var right = this.scrollBarV.getWidth() + "px"; dom.setStyle(this.scrollBarH.element.style, "right", right); dom.setStyle(this.scroller.style, "right", right); dom.setStyle(this.scroller.style, "bottom", this.scrollBarH.getHeight()); - + this.scrollBarH.setWidth(size.scrollerWidth); if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) { changes |= this.CHANGE_FULL; } } - size.$dirty = !width || !height; - if (changes) this._signal("resize", oldSize); - return changes; }; - - this.onGutterResize = function(width) { + VirtualRenderer.prototype.onGutterResize = function (width) { var gutterWidth = this.$showGutter ? width : 0; if (gutterWidth != this.gutterWidth) this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); - if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { this.$loop.schedule(this.CHANGE_FULL); - } else if (this.$size.$dirty) { + } + else if (this.$size.$dirty) { this.$loop.schedule(this.CHANGE_FULL); - } else { + } + else { this.$computeLayerConfig(); } }; - this.adjustWrapLimit = function() { + VirtualRenderer.prototype.adjustWrapLimit = function () { var availableWidth = this.$size.scrollerWidth - this.$padding * 2; var limit = Math.floor(availableWidth / this.characterWidth); return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); }; - this.setAnimatedScroll = function(shouldAnimate){ + VirtualRenderer.prototype.setAnimatedScroll = function (shouldAnimate) { this.setOption("animatedScroll", shouldAnimate); }; - this.getAnimatedScroll = function() { + VirtualRenderer.prototype.getAnimatedScroll = function () { return this.$animatedScroll; }; - this.setShowInvisibles = function(showInvisibles) { + VirtualRenderer.prototype.setShowInvisibles = function (showInvisibles) { this.setOption("showInvisibles", showInvisibles); this.session.$bidiHandler.setShowInvisibles(showInvisibles); }; - this.getShowInvisibles = function() { + VirtualRenderer.prototype.getShowInvisibles = function () { return this.getOption("showInvisibles"); }; - this.getDisplayIndentGuides = function() { + VirtualRenderer.prototype.getDisplayIndentGuides = function () { return this.getOption("displayIndentGuides"); }; - - this.setDisplayIndentGuides = function(display) { + VirtualRenderer.prototype.setDisplayIndentGuides = function (display) { this.setOption("displayIndentGuides", display); }; - this.setShowPrintMargin = function(showPrintMargin) { + VirtualRenderer.prototype.getHighlightIndentGuides = function () { + return this.getOption("highlightIndentGuides"); + }; + VirtualRenderer.prototype.setHighlightIndentGuides = function (highlight) { + this.setOption("highlightIndentGuides", highlight); + }; + VirtualRenderer.prototype.setShowPrintMargin = function (showPrintMargin) { this.setOption("showPrintMargin", showPrintMargin); }; - this.getShowPrintMargin = function() { + VirtualRenderer.prototype.getShowPrintMargin = function () { return this.getOption("showPrintMargin"); }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.setOption("printMarginColumn", showPrintMargin); + VirtualRenderer.prototype.setPrintMarginColumn = function (printMarginColumn) { + this.setOption("printMarginColumn", printMarginColumn); }; - this.getPrintMarginColumn = function() { + VirtualRenderer.prototype.getPrintMarginColumn = function () { return this.getOption("printMarginColumn"); }; - this.getShowGutter = function(){ + VirtualRenderer.prototype.getShowGutter = function () { return this.getOption("showGutter"); }; - this.setShowGutter = function(show){ + VirtualRenderer.prototype.setShowGutter = function (show) { return this.setOption("showGutter", show); }; - - this.getFadeFoldWidgets = function(){ + VirtualRenderer.prototype.getFadeFoldWidgets = function () { return this.getOption("fadeFoldWidgets"); }; - - this.setFadeFoldWidgets = function(show) { + VirtualRenderer.prototype.setFadeFoldWidgets = function (show) { this.setOption("fadeFoldWidgets", show); }; - - this.setHighlightGutterLine = function(shouldHighlight) { + VirtualRenderer.prototype.setHighlightGutterLine = function (shouldHighlight) { this.setOption("highlightGutterLine", shouldHighlight); }; - - this.getHighlightGutterLine = function() { + VirtualRenderer.prototype.getHighlightGutterLine = function () { return this.getOption("highlightGutterLine"); }; - - this.$updatePrintMargin = function() { + VirtualRenderer.prototype.$updatePrintMargin = function () { if (!this.$showPrintMargin && !this.$printMarginEl) return; - if (!this.$printMarginEl) { var containerEl = dom.createElement("div"); containerEl.className = "ace_layer ace_print-margin-layer"; @@ -18246,25 +19193,24 @@ var VirtualRenderer = function(container, theme) { containerEl.appendChild(this.$printMarginEl); this.content.insertBefore(containerEl, this.content.firstChild); } - var style = this.$printMarginEl.style; style.left = Math.round(this.characterWidth * this.$printMarginColumn + this.$padding) + "px"; style.visibility = this.$showPrintMargin ? "visible" : "hidden"; - if (this.session && this.session.$wrap == -1) this.adjustWrapLimit(); }; - this.getContainerElement = function() { + VirtualRenderer.prototype.getContainerElement = function () { return this.container; }; - this.getMouseEventTarget = function() { + VirtualRenderer.prototype.getMouseEventTarget = function () { return this.scroller; }; - this.getTextAreaContainer = function() { + VirtualRenderer.prototype.getTextAreaContainer = function () { return this.container; }; - this.$moveTextAreaToCursor = function() { - if (this.$isMousePressed) return; + VirtualRenderer.prototype.$moveTextAreaToCursor = function () { + if (this.$isMousePressed) + return; var style = this.textarea.style; var composition = this.$composition; if (!this.$keepTextAreaAtCursor && !composition) { @@ -18276,18 +19222,15 @@ var VirtualRenderer = function(container, theme) { return; if (composition && composition.markerRange) pixelPos = this.$cursorLayer.getPixelPosition(composition.markerRange.start, true); - var config = this.layerConfig; var posTop = pixelPos.top; var posLeft = pixelPos.left; posTop -= config.offset; - - var h = composition && composition.useTextareaForIME ? this.lineHeight : HIDE_TEXTAREA ? 0 : 1; + var h = composition && composition.useTextareaForIME || useragent.isMobile ? this.lineHeight : 1; if (posTop < 0 || posTop > config.height - h) { dom.translate(this.textarea, 0, 0); return; } - var w = 1; var maxTop = this.$size.height - h; if (!composition) { @@ -18302,24 +19245,21 @@ var VirtualRenderer = function(container, theme) { posTop += this.lineHeight + 2; } } - posLeft -= this.scrollLeft; if (posLeft > this.$size.scrollerWidth - w) posLeft = this.$size.scrollerWidth - w; - posLeft += this.gutterWidth + this.margin.left; - dom.setStyle(style, "height", h + "px"); dom.setStyle(style, "width", w + "px"); dom.translate(this.textarea, Math.min(posLeft, this.$size.scrollerWidth - w), Math.min(posTop, maxTop)); }; - this.getFirstVisibleRow = function() { + VirtualRenderer.prototype.getFirstVisibleRow = function () { return this.layerConfig.firstRow; }; - this.getFirstFullyVisibleRow = function() { + VirtualRenderer.prototype.getFirstFullyVisibleRow = function () { return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); }; - this.getLastFullyVisibleRow = function() { + VirtualRenderer.prototype.getLastFullyVisibleRow = function () { var config = this.layerConfig; var lastRow = config.lastRow; var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; @@ -18327,12 +19267,10 @@ var VirtualRenderer = function(container, theme) { return lastRow - 1; return lastRow; }; - this.getLastVisibleRow = function() { + VirtualRenderer.prototype.getLastVisibleRow = function () { return this.layerConfig.lastRow; }; - - this.$padding = null; - this.setPadding = function(padding) { + VirtualRenderer.prototype.setPadding = function (padding) { this.$padding = padding; this.$textLayer.setPadding(padding); this.$cursorLayer.setPadding(padding); @@ -18341,45 +19279,42 @@ var VirtualRenderer = function(container, theme) { this.$loop.schedule(this.CHANGE_FULL); this.$updatePrintMargin(); }; - - this.setScrollMargin = function(top, bottom, left, right) { + VirtualRenderer.prototype.setScrollMargin = function (top, bottom, left, right) { var sm = this.scrollMargin; - sm.top = top|0; - sm.bottom = bottom|0; - sm.right = right|0; - sm.left = left|0; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; sm.v = sm.top + sm.bottom; sm.h = sm.left + sm.right; if (sm.top && this.scrollTop <= 0 && this.session) this.session.setScrollTop(-sm.top); this.updateFull(); }; - - this.setMargin = function(top, bottom, left, right) { + VirtualRenderer.prototype.setMargin = function (top, bottom, left, right) { var sm = this.margin; - sm.top = top|0; - sm.bottom = bottom|0; - sm.right = right|0; - sm.left = left|0; + sm.top = top | 0; + sm.bottom = bottom | 0; + sm.right = right | 0; + sm.left = left | 0; sm.v = sm.top + sm.bottom; sm.h = sm.left + sm.right; this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height); this.updateFull(); }; - this.getHScrollBarAlwaysVisible = function() { + VirtualRenderer.prototype.getHScrollBarAlwaysVisible = function () { return this.$hScrollBarAlwaysVisible; }; - this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + VirtualRenderer.prototype.setHScrollBarAlwaysVisible = function (alwaysVisible) { this.setOption("hScrollBarAlwaysVisible", alwaysVisible); }; - this.getVScrollBarAlwaysVisible = function() { + VirtualRenderer.prototype.getVScrollBarAlwaysVisible = function () { return this.$vScrollBarAlwaysVisible; }; - this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + VirtualRenderer.prototype.setVScrollBarAlwaysVisible = function (alwaysVisible) { this.setOption("vScrollBarAlwaysVisible", alwaysVisible); }; - - this.$updateScrollBarV = function() { + VirtualRenderer.prototype.$updateScrollBarV = function () { var scrollHeight = this.layerConfig.maxHeight; var scrollerHeight = this.$size.scrollerHeight; if (!this.$maxLines && this.$scrollPastEnd) { @@ -18392,29 +19327,25 @@ var VirtualRenderer = function(container, theme) { this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); }; - this.$updateScrollBarH = function() { + VirtualRenderer.prototype.$updateScrollBarH = function () { this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); }; - - this.$frozen = false; - this.freeze = function() { + VirtualRenderer.prototype.freeze = function () { this.$frozen = true; }; - - this.unfreeze = function() { + VirtualRenderer.prototype.unfreeze = function () { this.$frozen = false; }; - - this.$renderChanges = function(changes, force) { + VirtualRenderer.prototype.$renderChanges = function (changes, force) { if (this.$changes) { changes |= this.$changes; this.$changes = 0; } if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { this.$changes |= changes; - return; - } + return; + } if (this.$size.$dirty) { this.$changes |= changes; return this.onResize(true); @@ -18422,23 +19353,19 @@ var VirtualRenderer = function(container, theme) { if (!this.lineHeight) { this.$textLayer.checkForSizeChanges(); } - this._signal("beforeRender", changes); - if (this.session && this.session.$bidiHandler) this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics); - var config = this.layerConfig; if (changes & this.CHANGE_FULL || changes & this.CHANGE_SIZE || changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES || changes & this.CHANGE_SCROLL || - changes & this.CHANGE_H_SCROLL - ) { + changes & this.CHANGE_H_SCROLL) { changes |= this.$computeLayerConfig() | this.$loop.clear(); if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { - var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + var st = this.scrollTop + (config.firstRow - Math.max(this.layerConfig.firstRow, 0)) * this.lineHeight; if (st > 0) { this.scrollTop = st; changes = changes | this.CHANGE_SCROLL; @@ -18449,24 +19376,26 @@ var VirtualRenderer = function(container, theme) { this.$updateScrollBarV(); if (changes & this.CHANGE_H_SCROLL) this.$updateScrollBarH(); - dom.translate(this.content, -this.scrollLeft, -config.offset); - var width = config.width + 2 * this.$padding + "px"; var height = config.minHeight + "px"; - dom.setStyle(this.content.style, "width", width); dom.setStyle(this.content.style, "height", height); } if (changes & this.CHANGE_H_SCROLL) { dom.translate(this.content, -this.scrollLeft, -config.offset); - this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller " : "ace_scroller ace_scroll-left "; + if (this.enableKeyboardAccessibility) + this.scroller.className += this.keyboardFocusClassName; } if (changes & this.CHANGE_FULL) { this.$changedLines = null; this.$textLayer.update(config); if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } this.$markerBack.update(config); this.$markerFront.update(config); this.$cursorLayer.update(config); @@ -18480,13 +19409,15 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.update(config); else this.$textLayer.scrollLines(config); - if (this.$showGutter) { if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES) this.$gutterLayer.update(config); else this.$gutterLayer.scrollLines(config); } + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } this.$markerBack.update(config); this.$markerFront.update(config); this.$cursorLayer.update(config); @@ -18494,109 +19425,98 @@ var VirtualRenderer = function(container, theme) { this._signal("afterRender", changes); return; } - if (changes & this.CHANGE_TEXT) { this.$changedLines = null; this.$textLayer.update(config); if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_LINES) { if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { if (this.$showGutter) this.$gutterLayer.update(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } else if (changes & this.CHANGE_CURSOR) { if (this.$highlightGutterLine) this.$gutterLayer.updateLineHighlight(config); + if (this.$customScrollbar) { + this.$scrollDecorator.$updateDecorators(config); + } } - if (changes & this.CHANGE_CURSOR) { this.$cursorLayer.update(config); this.$moveTextAreaToCursor(); } - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { this.$markerFront.update(config); } - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { this.$markerBack.update(config); } - this._signal("afterRender", changes); }; - - - this.$autosize = function() { + VirtualRenderer.prototype.$autosize = function () { var height = this.session.getScreenLength() * this.lineHeight; var maxHeight = this.$maxLines * this.lineHeight; - var desiredHeight = Math.min(maxHeight, - Math.max((this.$minLines || 1) * this.lineHeight, height) - ) + this.scrollMargin.v + (this.$extraHeight || 0); + var desiredHeight = Math.min(maxHeight, Math.max((this.$minLines || 1) * this.lineHeight, height)) + this.scrollMargin.v + (this.$extraHeight || 0); if (this.$horizScroll) desiredHeight += this.scrollBarH.getHeight(); if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) desiredHeight = this.$maxPixelHeight; - var hideScrollbars = desiredHeight <= 2 * this.lineHeight; var vScroll = !hideScrollbars && height > maxHeight; - if (desiredHeight != this.desiredHeight || this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { if (vScroll != this.$vScroll) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } - var w = this.container.clientWidth; this.container.style.height = desiredHeight + "px"; this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); this.desiredHeight = desiredHeight; - this._signal("autosize"); } }; - - this.$computeLayerConfig = function() { + VirtualRenderer.prototype.$computeLayerConfig = function () { var session = this.session; var size = this.$size; - var hideScrollbars = size.height <= 2 * this.lineHeight; var screenLines = this.session.getScreenLength(); var maxHeight = screenLines * this.lineHeight; - var longestLine = this.$getLongestLine(); - var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || size.scrollerWidth - longestLine - 2 * this.$padding < 0); - var hScrollChanged = this.$horizScroll !== horizScroll; if (hScrollChanged) { this.$horizScroll = horizScroll; this.scrollBarH.setVisible(horizScroll); } var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine - if (this.$maxLines && this.lineHeight > 1) + if (this.$maxLines && this.lineHeight > 1) { this.$autosize(); - + hideScrollbars = size.height <= 2 * this.lineHeight; + } var minHeight = size.scrollerHeight + this.lineHeight; - var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd : 0; maxHeight += scrollPastEnd; - var sm = this.scrollMargin; - this.session.setScrollTop(Math.max(-sm.top, - Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); - - this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, - longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); - + this.session.setScrollTop(Math.max(-sm.top, Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); var vScrollChanged = vScrollBefore !== vScroll; @@ -18604,7 +19524,6 @@ var VirtualRenderer = function(container, theme) { this.$vScroll = vScroll; this.scrollBarV.setVisible(vScroll); } - var offset = this.scrollTop % this.lineHeight; var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); @@ -18616,18 +19535,18 @@ var VirtualRenderer = function(container, theme) { if (foldLine) { firstRow = foldLine.start.row; } - firstRowScreen = session.documentToScreenRow(firstRow, 0); firstRowHeight = session.getRowLength(firstRow) * lineHeight; - lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + - firstRowHeight; - + firstRowHeight; offset = this.scrollTop - firstRowScreen * lineHeight; - + if (offset < 0 && firstRowScreen > 0) { + firstRowScreen = Math.max(0, firstRowScreen + Math.floor(offset / lineHeight)); + offset = this.scrollTop - firstRowScreen * lineHeight; + } var changes = 0; - if (this.layerConfig.width != longestLine || hScrollChanged) + if (this.layerConfig.width != longestLine || hScrollChanged) changes = this.CHANGE_H_SCROLL; if (hScrollChanged || vScrollChanged) { changes |= this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); @@ -18635,38 +19554,37 @@ var VirtualRenderer = function(container, theme) { if (vScrollChanged) longestLine = this.$getLongestLine(); } - this.layerConfig = { - width : longestLine, - padding : this.$padding, - firstRow : firstRow, + width: longestLine, + padding: this.$padding, + firstRow: firstRow, firstRowScreen: firstRowScreen, - lastRow : lastRow, - lineHeight : lineHeight, - characterWidth : this.characterWidth, - minHeight : minHeight, - maxHeight : maxHeight, - offset : offset, - gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, - height : this.$size.scrollerHeight + lastRow: lastRow, + lineHeight: lineHeight, + characterWidth: this.characterWidth, + minHeight: minHeight, + maxHeight: maxHeight, + offset: offset, + gutterOffset: lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height: this.$size.scrollerHeight }; - if (this.session.$bidiHandler) this.session.$bidiHandler.setContentWidth(longestLine - this.$padding); - return changes; }; - - this.$updateLines = function() { - if (!this.$changedLines) return; + VirtualRenderer.prototype.$updateLines = function () { + if (!this.$changedLines) + return; var firstRow = this.$changedLines.firstRow; var lastRow = this.$changedLines.lastRow; this.$changedLines = null; - var layerConfig = this.layerConfig; - - if (firstRow > layerConfig.lastRow + 1) { return; } - if (lastRow < layerConfig.firstRow) { return; } + if (firstRow > layerConfig.lastRow + 1) { + return; + } + if (lastRow < layerConfig.firstRow) { + return; + } if (lastRow === Infinity) { if (this.$showGutter) this.$gutterLayer.update(layerConfig); @@ -18676,2633 +19594,2237 @@ var VirtualRenderer = function(container, theme) { this.$textLayer.updateLines(layerConfig, firstRow, lastRow); return true; }; - - this.$getLongestLine = function() { + VirtualRenderer.prototype.$getLongestLine = function () { var charCount = this.session.getScreenWidth(); if (this.showInvisibles && !this.session.$useWrapMode) charCount += 1; - if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH) charCount = this.$textLayer.MAX_LINE_LENGTH + 30; - return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); }; - this.updateFrontMarkers = function() { + VirtualRenderer.prototype.updateFrontMarkers = function () { this.$markerFront.setMarkers(this.session.getMarkers(true)); this.$loop.schedule(this.CHANGE_MARKER_FRONT); }; - this.updateBackMarkers = function() { + VirtualRenderer.prototype.updateBackMarkers = function () { this.$markerBack.setMarkers(this.session.getMarkers()); this.$loop.schedule(this.CHANGE_MARKER_BACK); }; - this.addGutterDecoration = function(row, className){ + VirtualRenderer.prototype.addGutterDecoration = function (row, className) { this.$gutterLayer.addGutterDecoration(row, className); }; - this.removeGutterDecoration = function(row, className){ + VirtualRenderer.prototype.removeGutterDecoration = function (row, className) { this.$gutterLayer.removeGutterDecoration(row, className); }; - this.updateBreakpoints = function(rows) { + VirtualRenderer.prototype.updateBreakpoints = function (rows) { + this._rows = rows; this.$loop.schedule(this.CHANGE_GUTTER); }; - this.setAnnotations = function(annotations) { + VirtualRenderer.prototype.setAnnotations = function (annotations) { this.$gutterLayer.setAnnotations(annotations); this.$loop.schedule(this.CHANGE_GUTTER); }; - this.updateCursor = function() { + VirtualRenderer.prototype.updateCursor = function () { this.$loop.schedule(this.CHANGE_CURSOR); }; - this.hideCursor = function() { + VirtualRenderer.prototype.hideCursor = function () { this.$cursorLayer.hideCursor(); }; - this.showCursor = function() { + VirtualRenderer.prototype.showCursor = function () { this.$cursorLayer.showCursor(); }; - - this.scrollSelectionIntoView = function(anchor, lead, offset) { + VirtualRenderer.prototype.scrollSelectionIntoView = function (anchor, lead, offset) { this.scrollCursorIntoView(anchor, offset); this.scrollCursorIntoView(lead, offset); }; - this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + VirtualRenderer.prototype.scrollCursorIntoView = function (cursor, offset, $viewMargin) { if (this.$size.scrollerHeight === 0) return; - var pos = this.$cursorLayer.getPixelPosition(cursor); - - var left = pos.left; - var top = pos.top; - + var newLeft = pos.left; + var newTop = pos.top; var topMargin = $viewMargin && $viewMargin.top || 0; var bottomMargin = $viewMargin && $viewMargin.bottom || 0; - - var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; - - if (scrollTop + topMargin > top) { - if (offset && scrollTop + topMargin > top + this.lineHeight) - top -= offset * this.$size.scrollerHeight; - if (top === 0) - top = -this.scrollMargin.top; - this.session.setScrollTop(top); - } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { - if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) - top += offset * this.$size.scrollerHeight; - this.session.setScrollTop(top + this.lineHeight + bottomMargin - this.$size.scrollerHeight); - } - - var scrollLeft = this.scrollLeft; - - if (scrollLeft > left) { - if (left < this.$padding + 2 * this.layerConfig.characterWidth) - left = -this.scrollMargin.left; - this.session.setScrollLeft(left); - } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { - this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); - } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { - this.session.setScrollLeft(0); - } - }; - this.getScrollTop = function() { - return this.session.getScrollTop(); - }; - this.getScrollLeft = function() { - return this.session.getScrollLeft(); - }; - this.getScrollTopRow = function() { - return this.scrollTop / this.lineHeight; - }; - this.getScrollBottomRow = function() { - return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); - }; - this.scrollToRow = function(row) { - this.session.setScrollTop(row * this.lineHeight); - }; - - this.alignCursor = function(cursor, alignment) { - if (typeof cursor == "number") - cursor = {row: cursor, column: 0}; - - var pos = this.$cursorLayer.getPixelPosition(cursor); - var h = this.$size.scrollerHeight - this.lineHeight; - var offset = pos.top - h * (alignment || 0); - - this.session.setScrollTop(offset); - return offset; - }; - - this.STEPS = 8; - this.$calcSteps = function(fromValue, toValue){ - var i = 0; - var l = this.STEPS; - var steps = []; - - var func = function(t, x_min, dx) { - return dx * (Math.pow(t - 1, 3) + 1) + x_min; - }; - - for (i = 0; i < l; ++i) - steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); - - return steps; - }; - this.scrollToLine = function(line, center, animate, callback) { - var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); - var offset = pos.top; - if (center) - offset -= this.$size.scrollerHeight / 2; - - var initialScroll = this.scrollTop; - this.session.setScrollTop(offset); - if (animate !== false) - this.animateScrolling(initialScroll, callback); - }; - - this.animateScrolling = function(fromValue, callback) { - var toValue = this.scrollTop; - if (!this.$animatedScroll) - return; - var _self = this; - - if (fromValue == toValue) - return; - if (this.$scrollAnimation) { - var oldSteps = this.$scrollAnimation.steps; - if (oldSteps.length) { - fromValue = oldSteps[0]; - if (fromValue == toValue) - return; - } - } - - var steps = _self.$calcSteps(fromValue, toValue); - this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; - - clearInterval(this.$timer); - - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - this.$timer = setInterval(function() { - if (!_self.session) - return clearInterval(_self.$timer); - if (steps.length) { - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - } else if (toValue != null) { - _self.session.$scrollTop = -1; - _self.session.setScrollTop(toValue); - toValue = null; - } else { - _self.$timer = clearInterval(_self.$timer); - _self.$scrollAnimation = null; - callback && callback(); - } - }, 10); - }; - this.scrollToY = function(scrollTop) { - if (this.scrollTop !== scrollTop) { - this.$loop.schedule(this.CHANGE_SCROLL); - this.scrollTop = scrollTop; - } - }; - this.scrollToX = function(scrollLeft) { - if (this.scrollLeft !== scrollLeft) - this.scrollLeft = scrollLeft; - this.$loop.schedule(this.CHANGE_H_SCROLL); - }; - this.scrollTo = function(x, y) { - this.session.setScrollTop(y); - this.session.setScrollLeft(x); - }; - this.scrollBy = function(deltaX, deltaY) { - deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); - deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); - }; - this.isScrollableBy = function(deltaX, deltaY) { - if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) - return true; - if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) - return true; - if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) - return true; - if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth - - this.layerConfig.width < -1 + this.scrollMargin.right) - return true; - }; - - this.pixelToScreenCoordinates = function(x, y) { - var canvasPos; - if (this.$hasCssTransforms) { - canvasPos = {top:0, left: 0}; - var p = this.$fontMetrics.transformCoordinates([x, y]); - x = p[1] - this.gutterWidth - this.margin.left; - y = p[0]; - } else { - canvasPos = this.scroller.getBoundingClientRect(); - } - - var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; - var offset = offsetX / this.characterWidth; - var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); - var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); - - return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX}; - }; - - this.screenToTextCoordinates = function(x, y) { - var canvasPos; - if (this.$hasCssTransforms) { - canvasPos = {top:0, left: 0}; - var p = this.$fontMetrics.transformCoordinates([x, y]); - x = p[1] - this.gutterWidth - this.margin.left; - y = p[0]; - } else { - canvasPos = this.scroller.getBoundingClientRect(); - } - - var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; - var offset = offsetX / this.characterWidth; - var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); - - var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); - - return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); - }; - this.textToScreenCoordinates = function(row, column) { - var canvasPos = this.scroller.getBoundingClientRect(); - var pos = this.session.documentToScreenPosition(row, column); - - var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) - ? this.session.$bidiHandler.getPosLeft(pos.column) - : Math.round(pos.column * this.characterWidth)); - - var y = pos.row * this.lineHeight; - - return { - pageX: canvasPos.left + x - this.scrollLeft, - pageY: canvasPos.top + y - this.scrollTop - }; - }; - this.visualizeFocus = function() { - dom.addCssClass(this.container, "ace_focus"); - }; - this.visualizeBlur = function() { - dom.removeCssClass(this.container, "ace_focus"); - }; - this.showComposition = function(composition) { - this.$composition = composition; - if (!composition.cssText) { - composition.cssText = this.textarea.style.cssText; - } - if (composition.useTextareaForIME == undefined) - composition.useTextareaForIME = this.$useTextareaForIME; - - if (this.$useTextareaForIME) { - dom.addCssClass(this.textarea, "ace_composition"); - this.textarea.style.cssText = ""; - this.$moveTextAreaToCursor(); - this.$cursorLayer.element.style.display = "none"; + this.$stopAnimation = true; + } + var currentTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + if (currentTop + topMargin > newTop) { + if (offset && currentTop + topMargin > newTop + this.lineHeight) + newTop -= offset * this.$size.scrollerHeight; + if (newTop === 0) + newTop = -this.scrollMargin.top; + this.session.setScrollTop(newTop); + } + else if (currentTop + this.$size.scrollerHeight - bottomMargin < newTop + this.lineHeight) { + if (offset && currentTop + this.$size.scrollerHeight - bottomMargin < newTop - this.lineHeight) + newTop += offset * this.$size.scrollerHeight; + this.session.setScrollTop(newTop + this.lineHeight + bottomMargin - this.$size.scrollerHeight); + } + var currentLeft = this.scrollLeft; + var twoCharsWidth = 2 * this.layerConfig.characterWidth; + if (newLeft - twoCharsWidth < currentLeft) { + newLeft -= twoCharsWidth; + if (newLeft < this.$padding + twoCharsWidth) { + newLeft = -this.scrollMargin.left; + } + this.session.setScrollLeft(newLeft); } else { - composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); - } - }; - this.setCompositionText = function(text) { - var cursor = this.session.selection.cursor; - this.addToken(text, "composition_placeholder", cursor.row, cursor.column); - this.$moveTextAreaToCursor(); - }; - this.hideComposition = function() { - if (!this.$composition) - return; - - if (this.$composition.markerId) - this.session.removeMarker(this.$composition.markerId); - - dom.removeCssClass(this.textarea, "ace_composition"); - this.textarea.style.cssText = this.$composition.cssText; - var cursor = this.session.selection.cursor; - this.removeExtraToken(cursor.row, cursor.column); - this.$composition = null; - this.$cursorLayer.element.style.display = ""; - }; - - this.addToken = function(text, type, row, column) { - var session = this.session; - session.bgTokenizer.lines[row] = null; - var newToken = {type: type, value: text}; - var tokens = session.getTokens(row); - if (column == null) { - tokens.push(newToken); - } else { - var l = 0; - for (var i =0; i < tokens.length; i++) { - var token = tokens[i]; - l += token.value.length; - if (column <= l) { - var diff = token.value.length - (l - column); - var before = token.value.slice(0, diff); - var after = token.value.slice(diff); - - tokens.splice(i, 1, {type: token.type, value: before}, newToken, {type: token.type, value: after}); - break; - } + newLeft += twoCharsWidth; + if (currentLeft + this.$size.scrollerWidth < newLeft + this.characterWidth) { + this.session.setScrollLeft(Math.round(newLeft + this.characterWidth - this.$size.scrollerWidth)); } - } - this.updateLines(row, row); - }; - - this.removeExtraToken = function(row, column) { - this.updateLines(row, row); - }; - this.setTheme = function(theme, cb) { - var _self = this; - this.$themeId = theme; - _self._dispatchEvent('themeChange',{theme:theme}); - - if (!theme || typeof theme == "string") { - var moduleName = theme || this.$options.theme.initialValue; - config.loadModule(["theme", moduleName], afterLoad); - } else { - afterLoad(theme); - } - - function afterLoad(module) { - if (_self.$themeId != theme) - return cb && cb(); - if (!module || !module.cssClass) - throw new Error("couldn't load module " + theme + " or it didn't call define"); - if (module.$id) - _self.$themeId = module.$id; - dom.importCssString( - module.cssText, - module.cssClass, - _self.container - ); - - if (_self.theme) - dom.removeCssClass(_self.container, _self.theme.cssClass); - - var padding = "padding" in module ? module.padding - : "padding" in (_self.theme || {}) ? 4 : _self.$padding; - if (_self.$padding && padding != _self.$padding) - _self.setPadding(padding); - _self.$theme = module.cssClass; - - _self.theme = module; - dom.addCssClass(_self.container, module.cssClass); - dom.setCssClass(_self.container, "ace_dark", module.isDark); - if (_self.$size) { - _self.$size.width = 0; - _self.$updateSizeAsync(); + else if (currentLeft <= this.$padding && newLeft - currentLeft < this.characterWidth) { + this.session.setScrollLeft(0); } - - _self._dispatchEvent('themeLoaded', {theme:module}); - cb && cb(); } }; - this.getTheme = function() { - return this.$themeId; + VirtualRenderer.prototype.getScrollTop = function () { + return this.session.getScrollTop(); }; - this.setStyle = function(style, include) { - dom.setCssClass(this.container, style, include !== false); + VirtualRenderer.prototype.getScrollLeft = function () { + return this.session.getScrollLeft(); }; - this.unsetStyle = function(style) { - dom.removeCssClass(this.container, style); + VirtualRenderer.prototype.getScrollTopRow = function () { + return this.scrollTop / this.lineHeight; }; - - this.setCursorStyle = function(style) { - dom.setStyle(this.scroller.style, "cursor", style); + VirtualRenderer.prototype.getScrollBottomRow = function () { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); }; - this.setMouseCursor = function(cursorStyle) { - dom.setStyle(this.scroller.style, "cursor", cursorStyle); + VirtualRenderer.prototype.scrollToRow = function (row) { + this.session.setScrollTop(row * this.lineHeight); }; - - this.attachToShadowRoot = function() { - dom.importCssString(editorCss, "ace_editor.css", this.container); + VirtualRenderer.prototype.alignCursor = function (cursor, alignment) { + if (typeof cursor == "number") + cursor = { row: cursor, column: 0 }; + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + this.session.setScrollTop(offset); + return offset; }; - this.destroy = function() { - this.freeze(); - this.$fontMetrics.destroy(); - this.$cursorLayer.destroy(); - this.removeAllListeners(); - this.container.textContent = ""; + VirtualRenderer.prototype.$calcSteps = function (fromValue, toValue) { + var i = 0; + var l = this.STEPS; + var steps = []; + var func = function (t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + return steps; }; - -}).call(VirtualRenderer.prototype); - - -config.defineOptions(VirtualRenderer.prototype, "renderer", { - animatedScroll: {initialValue: false}, - showInvisibles: { - set: function(value) { - if (this.$textLayer.setShowInvisibles(value)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: false - }, - showPrintMargin: { - set: function() { this.$updatePrintMargin(); }, - initialValue: true - }, - printMarginColumn: { - set: function() { this.$updatePrintMargin(); }, - initialValue: 80 - }, - printMargin: { - set: function(val) { - if (typeof val == "number") - this.$printMarginColumn = val; - this.$showPrintMargin = !!val; - this.$updatePrintMargin(); - }, - get: function() { - return this.$showPrintMargin && this.$printMarginColumn; - } - }, - showGutter: { - set: function(show){ - this.$gutter.style.display = show ? "block" : "none"; - this.$loop.schedule(this.CHANGE_FULL); - this.onGutterResize(); - }, - initialValue: true - }, - fadeFoldWidgets: { - set: function(show) { - dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); - }, - initialValue: false - }, - showFoldWidgets: { - set: function(show) { - this.$gutterLayer.setShowFoldWidgets(show); - this.$loop.schedule(this.CHANGE_GUTTER); - }, - initialValue: true - }, - displayIndentGuides: { - set: function(show) { - if (this.$textLayer.setDisplayIndentGuides(show)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: true - }, - highlightGutterLine: { - set: function(shouldHighlight) { - this.$gutterLayer.setHighlightGutterLine(shouldHighlight); - this.$loop.schedule(this.CHANGE_GUTTER); - }, - initialValue: true - }, - hScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - vScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - fontSize: { - set: function(size) { - if (typeof size == "number") - size = size + "px"; - this.container.style.fontSize = size; - this.updateFontSize(); - }, - initialValue: 12 - }, - fontFamily: { - set: function(name) { - this.container.style.fontFamily = name; - this.updateFontSize(); - } - }, - maxLines: { - set: function(val) { - this.updateFull(); - } - }, - minLines: { - set: function(val) { - if (!(this.$minLines < 0x1ffffffffffff)) - this.$minLines = 0; - this.updateFull(); - } - }, - maxPixelHeight: { - set: function(val) { - this.updateFull(); - }, - initialValue: 0 - }, - scrollPastEnd: { - set: function(val) { - val = +val || 0; - if (this.$scrollPastEnd == val) - return; - this.$scrollPastEnd = val; - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: 0, - handlesSet: true - }, - fixedWidthGutter: { - set: function(val) { - this.$gutterLayer.$fixedWidth = !!val; - this.$loop.schedule(this.CHANGE_GUTTER); - } - }, - theme: { - set: function(val) { this.setTheme(val); }, - get: function() { return this.$themeId || this.theme; }, - initialValue: "./theme/textmate", - handlesSet: true - }, - hasCssTransforms: { - }, - useTextareaForIME: { - initialValue: !useragent.isMobile && !useragent.isIE - } -}); - -exports.VirtualRenderer = VirtualRenderer; -}); - -define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { -"use strict"; - -var oop = require("../lib/oop"); -var net = require("../lib/net"); -var EventEmitter = require("../lib/event_emitter").EventEmitter; -var config = require("../config"); - -function $workerBlob(workerUrl) { - var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; - try { - return new Blob([script], {"type": "application/javascript"}); - } catch (e) { // Backwards-compatibility - var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; - var blobBuilder = new BlobBuilder(); - blobBuilder.append(script); - return blobBuilder.getBlob("application/javascript"); - } -} - -function createWorker(workerUrl) { - if (typeof Worker == "undefined") - return { postMessage: function() {}, terminate: function() {} }; - if (config.get("loadWorkerFromBlob")) { - var blob = $workerBlob(workerUrl); - var URL = window.URL || window.webkitURL; - var blobURL = URL.createObjectURL(blob); - return new Worker(blobURL); - } - return new Worker(workerUrl); -} - -var WorkerClient = function(worker) { - if (!worker.postMessage) - worker = this.$createWorkerFromOldConfig.apply(this, arguments); - - this.$worker = worker; - this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); - this.changeListener = this.changeListener.bind(this); - this.onMessage = this.onMessage.bind(this); - - this.callbackId = 1; - this.callbacks = {}; - - this.$worker.onmessage = this.onMessage; -}; - -(function(){ - - oop.implement(this, EventEmitter); - - this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { - if (require.nameToUrl && !require.toUrl) - require.toUrl = require.nameToUrl; - - if (config.get("packaged") || !require.toUrl) { - workerUrl = workerUrl || config.moduleUrl(mod, "worker"); - } else { - var normalizePath = this.$normalizePath; - workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); - - var tlns = {}; - topLevelNamespaces.forEach(function(ns) { - tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); - }); + VirtualRenderer.prototype.scrollToLine = function (line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({ row: line, column: 0 }); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + VirtualRenderer.prototype.animateScrolling = function (fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + if (fromValue == toValue) + return; + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } } - - this.$worker = createWorker(workerUrl); - if (importScripts) { - this.send("importScripts", importScripts); + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = { from: fromValue, to: toValue, steps: steps }; + clearInterval(this.$timer); + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + function endAnimation() { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + _self.$stopAnimation = false; + callback && callback(); } - this.$worker.postMessage({ - init : true, - tlns : tlns, - module : mod, - classname : classname - }); - return this.$worker; + this.$timer = setInterval(function () { + if (_self.$stopAnimation) { + endAnimation(); + return; + } + if (!_self.session) + return clearInterval(_self.$timer); + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } + else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } + else { + endAnimation(); + } + }, 10); }; - - this.onMessage = function(e) { - var msg = e.data; - switch (msg.type) { - case "event": - this._signal(msg.name, {data: msg.data}); - break; - case "call": - var callback = this.callbacks[msg.id]; - if (callback) { - callback(msg.data); - delete this.callbacks[msg.id]; - } - break; - case "error": - this.reportError(msg.data); - break; - case "log": - window.console && console.log && console.log.apply(console, msg.data); - break; + VirtualRenderer.prototype.scrollToY = function (scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; } }; - - this.reportError = function(err) { - window.console && console.error && console.error(err); + VirtualRenderer.prototype.scrollToX = function (scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); }; - - this.$normalizePath = function(path) { - return net.qualifyURL(path); + VirtualRenderer.prototype.scrollTo = function (x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(x); }; - - this.terminate = function() { - this._signal("terminate", {}); - this.deltaQueue = null; - this.$worker.terminate(); - this.$worker = null; - if (this.$doc) - this.$doc.off("change", this.changeListener); - this.$doc = null; + VirtualRenderer.prototype.scrollBy = function (deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); }; - - this.send = function(cmd, args) { - this.$worker.postMessage({command: cmd, args: args}); + VirtualRenderer.prototype.isScrollableBy = function (deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; }; - - this.call = function(cmd, args, callback) { - if (callback) { - var id = this.callbackId++; - this.callbacks[id] = callback; - args.push(id); + VirtualRenderer.prototype.pixelToScreenCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; } - this.send(cmd, args); + else { + canvasPos = this.scroller.getBoundingClientRect(); + } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + return { row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX }; }; - - this.emit = function(event, data) { - try { - if (data.data && data.data.err) - data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; - this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); + VirtualRenderer.prototype.screenToTextCoordinates = function (x, y) { + var canvasPos; + if (this.$hasCssTransforms) { + canvasPos = { top: 0, left: 0 }; + var p = this.$fontMetrics.transformCoordinates([x, y]); + x = p[1] - this.gutterWidth - this.margin.left; + y = p[0]; } - catch(ex) { - console.error(ex.stack); + else { + canvasPos = this.scroller.getBoundingClientRect(); } + var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding; + var offset = offsetX / this.characterWidth; + var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset); + var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; + return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX); }; - - this.attachToDocument = function(doc) { - if (this.$doc) - this.terminate(); - - this.$doc = doc; - this.call("setValue", [doc.getValue()]); - doc.on("change", this.changeListener, true); + VirtualRenderer.prototype.textToScreenCoordinates = function (row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row) + ? this.session.$bidiHandler.getPosLeft(pos.column) + : Math.round(pos.column * this.characterWidth)); + var y = pos.row * this.lineHeight; + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; }; - - this.changeListener = function(delta) { - if (!this.deltaQueue) { - this.deltaQueue = []; - setTimeout(this.$sendDeltaQueue, 0); - } - if (delta.action == "insert") - this.deltaQueue.push(delta.start, delta.lines); - else - this.deltaQueue.push(delta.start, delta.end); + VirtualRenderer.prototype.visualizeFocus = function () { + dom.addCssClass(this.container, "ace_focus"); }; - - this.$sendDeltaQueue = function() { - var q = this.deltaQueue; - if (!q) return; - this.deltaQueue = null; - if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { - this.call("setValue", [this.$doc.getValue()]); - } else - this.emit("change", {data: q}); + VirtualRenderer.prototype.visualizeBlur = function () { + dom.removeCssClass(this.container, "ace_focus"); }; - -}).call(WorkerClient.prototype); - - -var UIWorkerClient = function(topLevelNamespaces, mod, classname) { - var main = null; - var emitSync = false; - var sender = Object.create(EventEmitter); - - var messageBuffer = []; - var workerClient = new WorkerClient({ - messageBuffer: messageBuffer, - terminate: function() {}, - postMessage: function(e) { - messageBuffer.push(e); - if (!main) return; - if (emitSync) - setTimeout(processNext); - else - processNext(); + VirtualRenderer.prototype.showComposition = function (composition) { + this.$composition = composition; + if (!composition.cssText) { + composition.cssText = this.textarea.style.cssText; + } + if (composition.useTextareaForIME == undefined) + composition.useTextareaForIME = this.$useTextareaForIME; + if (this.$useTextareaForIME) { + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + this.$cursorLayer.element.style.display = "none"; + } + else { + composition.markerId = this.session.addMarker(composition.markerRange, "ace_composition_marker", "text"); } - }); - - workerClient.setEmitSync = function(val) { emitSync = val; }; - - var processNext = function() { - var msg = messageBuffer.shift(); - if (msg.command) - main[msg.command].apply(main, msg.args); - else if (msg.event) - sender._signal(msg.event, msg.data); }; - - sender.postMessage = function(msg) { - workerClient.onMessage({data: msg}); + VirtualRenderer.prototype.setCompositionText = function (text) { + var cursor = this.session.selection.cursor; + this.addToken(text, "composition_placeholder", cursor.row, cursor.column); + this.$moveTextAreaToCursor(); }; - sender.callback = function(data, callbackId) { - this.postMessage({type: "call", id: callbackId, data: data}); + VirtualRenderer.prototype.hideComposition = function () { + if (!this.$composition) + return; + if (this.$composition.markerId) + this.session.removeMarker(this.$composition.markerId); + dom.removeCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = this.$composition.cssText; + var cursor = this.session.selection.cursor; + this.removeExtraToken(cursor.row, cursor.column); + this.$composition = null; + this.$cursorLayer.element.style.display = ""; }; - sender.emit = function(name, data) { - this.postMessage({type: "event", name: name, data: data}); + VirtualRenderer.prototype.setGhostText = function (text, position) { + var cursor = this.session.selection.cursor; + var insertPosition = position || { row: cursor.row, column: cursor.column }; + this.removeGhostText(); + var textChunks = this.$calculateWrappedTextChunks(text, insertPosition); + this.addToken(textChunks[0].text, "ghost_text", insertPosition.row, insertPosition.column); + this.$ghostText = { + text: text, + position: { + row: insertPosition.row, + column: insertPosition.column + } + }; + var widgetDiv = dom.createElement("div"); + if (textChunks.length > 1) { + var hiddenTokens = this.hideTokensAfterPosition(insertPosition.row, insertPosition.column); + var lastLineDiv; + textChunks.slice(1).forEach(function (el) { + var chunkDiv = dom.createElement("div"); + var chunkSpan = dom.createElement("span"); + chunkSpan.className = "ace_ghost_text"; + if (el.wrapped) + chunkDiv.className = "ghost_text_line_wrapped"; + if (el.text.length === 0) + el.text = " "; + chunkSpan.appendChild(dom.createTextNode(el.text)); + chunkDiv.appendChild(chunkSpan); + widgetDiv.appendChild(chunkDiv); + lastLineDiv = chunkDiv; + }); + hiddenTokens.forEach(function (token) { + var element = dom.createElement("span"); + if (!isTextToken(token.type)) + element.className = "ace_" + token.type.replace(/\./g, " ace_"); + element.appendChild(dom.createTextNode(token.value)); + lastLineDiv.appendChild(element); + }); + this.$ghostTextWidget = { + el: widgetDiv, + row: insertPosition.row, + column: insertPosition.column, + className: "ace_ghost_text_container" + }; + this.session.widgetManager.addLineWidget(this.$ghostTextWidget); + var pixelPosition = this.$cursorLayer.getPixelPosition(insertPosition, true); + var el = this.container; + var height = el.getBoundingClientRect().height; + var ghostTextHeight = textChunks.length * this.lineHeight; + var fitsY = ghostTextHeight < (height - pixelPosition.top); + if (fitsY) + return; + if (ghostTextHeight < height) { + this.scrollBy(0, (textChunks.length - 1) * this.lineHeight); + } + else { + this.scrollToRow(insertPosition.row); + } + } }; - - config.loadModule(["worker", mod], function(Main) { - main = new Main[classname](sender); - while (messageBuffer.length) - processNext(); - }); - - return workerClient; -}; - -exports.UIWorkerClient = UIWorkerClient; -exports.WorkerClient = WorkerClient; -exports.createWorker = createWorker; - - -}); - -define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { -"use strict"; - -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var oop = require("./lib/oop"); - -var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { - var _self = this; - this.length = length; - this.session = session; - this.doc = session.getDocument(); - this.mainClass = mainClass; - this.othersClass = othersClass; - this.$onUpdate = this.onUpdate.bind(this); - this.doc.on("change", this.$onUpdate, true); - this.$others = others; - - this.$onCursorChange = function() { - setTimeout(function() { - _self.onCursorChange(); - }); + VirtualRenderer.prototype.$calculateWrappedTextChunks = function (text, position) { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth) - 2; + limit = limit <= 0 ? 60 : limit; // this is a hack to prevent the editor from crashing when the window is too small + var textLines = text.split(/\r?\n/); + var textChunks = []; + for (var i = 0; i < textLines.length; i++) { + var displayTokens = this.session.$getDisplayTokens(textLines[i], position.column); + var wrapSplits = this.session.$computeWrapSplits(displayTokens, limit, this.session.$tabSize); + if (wrapSplits.length > 0) { + var start = 0; + wrapSplits.push(textLines[i].length); + for (var j = 0; j < wrapSplits.length; j++) { + var textSlice = textLines[i].slice(start, wrapSplits[j]); + textChunks.push({ text: textSlice, wrapped: true }); + start = wrapSplits[j]; + } + } + else { + textChunks.push({ text: textLines[i], wrapped: false }); + } + } + return textChunks; }; - - this.$pos = pos; - var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; - this.$undoStackDepth = undoStack.length; - this.setup(); - - session.selection.on("changeCursor", this.$onCursorChange); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.setup = function() { - var _self = this; - var doc = this.doc; - var session = this.session; - - this.selectionBefore = session.selection.toJSON(); - if (session.selection.inMultiSelectMode) - session.selection.toSingleRange(); - - this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); - var pos = this.pos; - pos.$insertRight = true; - pos.detach(); - pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); - this.others = []; - this.$others.forEach(function(other) { - var anchor = doc.createAnchor(other.row, other.column); - anchor.$insertRight = true; - anchor.detach(); - _self.others.push(anchor); - }); - session.setUndoSelect(false); + VirtualRenderer.prototype.removeGhostText = function () { + if (!this.$ghostText) + return; + var position = this.$ghostText.position; + this.removeExtraToken(position.row, position.column); + if (this.$ghostTextWidget) { + this.session.widgetManager.removeLineWidget(this.$ghostTextWidget); + this.$ghostTextWidget = null; + } + this.$ghostText = null; }; - this.showOtherMarkers = function() { - if (this.othersActive) return; + VirtualRenderer.prototype.addToken = function (text, type, row, column) { var session = this.session; - var _self = this; - this.othersActive = true; - this.others.forEach(function(anchor) { - anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); - }); + session.bgTokenizer.lines[row] = null; + var newToken = { type: type, value: text }; + var tokens = session.getTokens(row); + if (column == null || !tokens.length) { + tokens.push(newToken); + } + else { + var l = 0; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (column <= l) { + var diff = token.value.length - (l - column); + var before = token.value.slice(0, diff); + var after = token.value.slice(diff); + tokens.splice(i, 1, { type: token.type, value: before }, newToken, { type: token.type, value: after }); + break; + } + } + } + this.updateLines(row, row); }; - this.hideOtherMarkers = function() { - if (!this.othersActive) return; - this.othersActive = false; - for (var i = 0; i < this.others.length; i++) { - this.session.removeMarker(this.others[i].markerId); + VirtualRenderer.prototype.hideTokensAfterPosition = function (row, column) { + var tokens = this.session.getTokens(row); + var l = 0; + var hasPassedCursor = false; + var hiddenTokens = []; + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + l += token.value.length; + if (token.type === "ghost_text") + continue; + if (hasPassedCursor) { + hiddenTokens.push({ type: token.type, value: token.value }); + token.type = "hidden_token"; + continue; + } + if (l === column) { + hasPassedCursor = true; + } } + this.updateLines(row, row); + return hiddenTokens; }; - this.onUpdate = function(delta) { - if (this.$updating) - return this.updateAnchors(delta); - - var range = delta; - if (range.start.row !== range.end.row) return; - if (range.start.row !== this.pos.row) return; - this.$updating = true; - var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; - var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; - var distanceFromStart = range.start.column - this.pos.column; - - this.updateAnchors(delta); - - if (inMainRange) - this.length += lengthDiff; - - if (inMainRange && !this.session.$fromUndo) { - if (delta.action === 'insert') { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - this.doc.insertMergedLines(newPos, delta.lines); + VirtualRenderer.prototype.removeExtraToken = function (row, column) { + this.session.bgTokenizer.lines[row] = null; + this.updateLines(row, row); + }; + VirtualRenderer.prototype.setTheme = function (theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange', { theme: theme }); + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } + else { + afterLoad(theme); + } + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + if (module.$id) + _self.$themeId = module.$id; + dom.importCssString(module.cssText, module.cssClass, _self.container); + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + if (_self.$gutterLayer) { + var showGutterCursor = module["$showGutterCursorMarker"]; + if (showGutterCursor && !_self.$gutterLayer.$showCursorMarker) { + _self.$gutterLayer.$showCursorMarker = "theme"; } - } else if (delta.action === 'remove') { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + else if (!showGutterCursor && _self.$gutterLayer.$showCursorMarker == "theme") { + _self.$gutterLayer.$showCursorMarker = null; } } + _self.$theme = module.cssClass; + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + _self._dispatchEvent('themeLoaded', { theme: module }); + cb && cb(); + if (useragent.isSafari && _self.scroller) { + _self.scroller.style.background = "red"; + _self.scroller.style.background = ""; + } } - - this.$updating = false; - this.updateMarkers(); }; - - this.updateAnchors = function(delta) { - this.pos.onChange(delta); - for (var i = this.others.length; i--;) - this.others[i].onChange(delta); - this.updateMarkers(); + VirtualRenderer.prototype.getTheme = function () { + return this.$themeId; }; - - this.updateMarkers = function() { - if (this.$updating) - return; - var _self = this; - var session = this.session; - var updateMarker = function(pos, className) { - session.removeMarker(pos.markerId); - pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); - }; - updateMarker(this.pos, this.mainClass); - for (var i = this.others.length; i--;) - updateMarker(this.others[i], this.othersClass); + VirtualRenderer.prototype.setStyle = function (style, include) { + dom.setCssClass(this.container, style, include !== false); }; - - this.onCursorChange = function(event) { - if (this.$updating || !this.session) return; - var pos = this.session.selection.getCursor(); - if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { - this.showOtherMarkers(); - this._emit("cursorEnter", event); - } else { - this.hideOtherMarkers(); - this._emit("cursorLeave", event); - } - }; - this.detach = function() { - this.session.removeMarker(this.pos && this.pos.markerId); - this.hideOtherMarkers(); - this.doc.off("change", this.$onUpdate); - this.session.selection.off("changeCursor", this.$onCursorChange); - this.session.setUndoSelect(true); - this.session = null; + VirtualRenderer.prototype.unsetStyle = function (style) { + dom.removeCssClass(this.container, style); }; - this.cancel = function() { - if (this.$undoStackDepth === -1) - return; - var undoManager = this.session.getUndoManager(); - var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; - for (var i = 0; i < undosRequired; i++) { - undoManager.undo(this.session, true); - } - if (this.selectionBefore) - this.session.selection.fromJSON(this.selectionBefore); + VirtualRenderer.prototype.setCursorStyle = function (style) { + dom.setStyle(this.scroller.style, "cursor", style); }; -}).call(PlaceHolder.prototype); - - -exports.PlaceHolder = PlaceHolder; -}); - -define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -function isSamePoint(p1, p2) { - return p1.row == p2.row && p1.column == p2.column; -} - -function onMouseDown(e) { - var ev = e.domEvent; - var alt = ev.altKey; - var shift = ev.shiftKey; - var ctrl = ev.ctrlKey; - var accel = e.getAccelKey(); - var button = e.getButton(); - - if (ctrl && useragent.isMac) - button = ev.button; - - if (e.editor.inMultiSelectMode && button == 2) { - e.editor.textInput.onContextMenu(e.domEvent); - return; - } - - if (!ctrl && !alt && !accel) { - if (button === 0 && e.editor.inMultiSelectMode) - e.editor.exitMultiSelectMode(); - return; - } - - if (button !== 0) - return; - - var editor = e.editor; - var selection = editor.selection; - var isMultiSelect = editor.inMultiSelectMode; - var pos = e.getDocumentPosition(); - var cursor = selection.getCursor(); - var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); - - var mouseX = e.x, mouseY = e.y; - var onMouseSelection = function(e) { - mouseX = e.clientX; - mouseY = e.clientY; + VirtualRenderer.prototype.setMouseCursor = function (cursorStyle) { + dom.setStyle(this.scroller.style, "cursor", cursorStyle); }; - - var session = editor.session; - var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var screenCursor = screenAnchor; - - var selectionMode; - if (editor.$mouseHandler.$enableJumpToDef) { - if (ctrl && alt || accel && alt) - selectionMode = shift ? "block" : "add"; - else if (alt && editor.$blockSelectEnabled) - selectionMode = "block"; - } else { - if (accel && !alt) { - selectionMode = "add"; - if (!isMultiSelect && shift) - return; - } else if (alt && editor.$blockSelectEnabled) { - selectionMode = "block"; - } - } - - if (selectionMode && useragent.isMac && ev.ctrlKey) { - editor.$mouseHandler.cancelContextMenu(); - } - - if (selectionMode == "add") { - if (!isMultiSelect && inSelection) - return; // dragging - - if (!isMultiSelect) { - var range = selection.toOrientedRange(); - editor.addSelectionMarker(range); + VirtualRenderer.prototype.attachToShadowRoot = function () { + dom.importCssString(editorCss, "ace_editor.css", this.container); + }; + VirtualRenderer.prototype.destroy = function () { + this.freeze(); + this.$fontMetrics.destroy(); + this.$cursorLayer.destroy(); + this.removeAllListeners(); + this.container.textContent = ""; + this.setOption("useResizeObserver", false); + }; + VirtualRenderer.prototype.$updateCustomScrollbar = function (val) { + var _self = this; + this.$horizScroll = this.$vScroll = null; + this.scrollBarV.element.remove(); + this.scrollBarH.element.remove(); + if (val === true) { + this.scrollBarV = new VScrollBarCustom(this.container, this); + this.scrollBarH = new HScrollBarCustom(this.container, this); + this.scrollBarV.setHeight(this.$size.scrollerHeight); + this.scrollBarH.setWidth(this.$size.scrollerWidth); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + if (!this.$scrollDecorator) { + this.$scrollDecorator = new Decorator(this.scrollBarV, this); + this.$scrollDecorator.$updateDecorators(); + } + else { + this.$scrollDecorator.setScrollBarV(this.scrollBarV); + this.$scrollDecorator.$updateDecorators(); + } } - - var oldRange = selection.rangeList.rangeAtPoint(pos); - - editor.inVirtualSelectionMode = true; - - if (shift) { - oldRange = null; - range = selection.ranges[0] || range; - editor.removeSelectionMarker(range); + else { + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function (e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); } - editor.once("mouseup", function() { - var tmpSel = selection.toOrientedRange(); - - if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) - selection.substractPoint(tmpSel.cursor); + }; + VirtualRenderer.prototype.$addResizeObserver = function () { + if (!window.ResizeObserver || this.$resizeObserver) + return; + var self = this; + this.$resizeTimer = lang.delayedCall(function () { + if (!self.destroyed) + self.onResize(); + }, 50); + this.$resizeObserver = new window.ResizeObserver(function (e) { + var w = e[0].contentRect.width; + var h = e[0].contentRect.height; + if (Math.abs(self.$size.width - w) > 1 + || Math.abs(self.$size.height - h) > 1) { + self.$resizeTimer.delay(); + } else { - if (shift) { - selection.substractPoint(range.cursor); - } else if (range) { - editor.removeSelectionMarker(range); - selection.addRange(range); - } - selection.addRange(tmpSel); + self.$resizeTimer.cancel(); } - editor.inVirtualSelectionMode = false; }); - - } else if (selectionMode == "block") { - e.stop(); - editor.inVirtualSelectionMode = true; - var initialRange; - var rectSel = []; - var blockSelect = function() { - var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); - - if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) - return; - screenCursor = newCursor; - - editor.selection.moveToPosition(cursor); - editor.renderer.scrollCursorIntoView(); - - editor.removeSelectionMarkers(rectSel); - rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); - if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) - rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); - rectSel.forEach(editor.addSelectionMarker, editor); - editor.updateSelectionMarkers(); - }; - if (isMultiSelect && !accel) { - selection.toSingleRange(); - } else if (!isMultiSelect && accel) { - initialRange = selection.toOrientedRange(); - editor.addSelectionMarker(initialRange); + this.$resizeObserver.observe(this.container); + }; + return VirtualRenderer; +}()); +VirtualRenderer.prototype.CHANGE_CURSOR = 1; +VirtualRenderer.prototype.CHANGE_MARKER = 2; +VirtualRenderer.prototype.CHANGE_GUTTER = 4; +VirtualRenderer.prototype.CHANGE_SCROLL = 8; +VirtualRenderer.prototype.CHANGE_LINES = 16; +VirtualRenderer.prototype.CHANGE_TEXT = 32; +VirtualRenderer.prototype.CHANGE_SIZE = 64; +VirtualRenderer.prototype.CHANGE_MARKER_BACK = 128; +VirtualRenderer.prototype.CHANGE_MARKER_FRONT = 256; +VirtualRenderer.prototype.CHANGE_FULL = 512; +VirtualRenderer.prototype.CHANGE_H_SCROLL = 1024; +VirtualRenderer.prototype.$changes = 0; +VirtualRenderer.prototype.$padding = null; +VirtualRenderer.prototype.$frozen = false; +VirtualRenderer.prototype.STEPS = 8; +oop.implement(VirtualRenderer.prototype, EventEmitter); +config.defineOptions(VirtualRenderer.prototype, "renderer", { + useResizeObserver: { + set: function (value) { + if (!value && this.$resizeObserver) { + this.$resizeObserver.disconnect(); + this.$resizeTimer.cancel(); + this.$resizeTimer = this.$resizeObserver = null; + } + else if (value && !this.$resizeObserver) { + this.$addResizeObserver(); + } } - - if (shift) - screenAnchor = session.documentToScreenPosition(selection.lead); - else - selection.moveToPosition(pos); - - screenCursor = {row: -1, column: -1}; - - var onMouseSelectionEnd = function(e) { - blockSelect(); - clearInterval(timerId); - editor.removeSelectionMarkers(rectSel); - if (!rectSel.length) - rectSel = [selection.toOrientedRange()]; - if (initialRange) { - editor.removeSelectionMarker(initialRange); - selection.toSingleRange(initialRange); + }, + animatedScroll: { initialValue: false }, + showInvisibles: { + set: function (value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function () { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function () { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function (val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function () { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function (show) { + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + useSvgGutterIcons: { + set: function (value) { + this.$gutterLayer.$useSvgGutterIcons = value; + }, + initialValue: false + }, + showFoldedAnnotations: { + set: function (value) { + this.$gutterLayer.$showFoldedAnnotations = value; + }, + initialValue: false + }, + fadeFoldWidgets: { + set: function (show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function (show) { + this.$gutterLayer.setShowFoldWidgets(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function (show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightIndentGuides: { + set: function (show) { + if (this.$textLayer.setHighlightIndentGuides(show) == true) { + this.$textLayer.$highlightIndentGuide(); } - for (var i = 0; i < rectSel.length; i++) - selection.addRange(rectSel[i]); - editor.inVirtualSelectionMode = false; - editor.$mouseHandler.$clickSelection = null; - }; - - var onSelectionInterval = blockSelect; - - event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); - var timerId = setInterval(function() {onSelectionInterval();}, 20); - - return e.preventDefault(); + else { + this.$textLayer.$clearActiveIndentGuide(this.$textLayer.$lines.cells); + } + }, + initialValue: true + }, + highlightGutterLine: { + set: function (shouldHighlight) { + this.$gutterLayer.setHighlightGutterLine(shouldHighlight); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + hScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function (val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function (size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function (name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function (val) { + this.updateFull(); + } + }, + minLines: { + set: function (val) { + if (!(this.$minLines < 0x1ffffffffffff)) + this.$minLines = 0; + this.updateFull(); + } + }, + maxPixelHeight: { + set: function (val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function (val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function (val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + customScrollbar: { + set: function (val) { + this.$updateCustomScrollbar(val); + }, + initialValue: false + }, + theme: { + set: function (val) { this.setTheme(val); }, + get: function () { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + }, + hasCssTransforms: {}, + useTextareaForIME: { + initialValue: !useragent.isMobile && !useragent.isIE } -} - - -exports.onMouseDown = onMouseDown; - }); - -define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { -exports.defaultCommands = [{ - name: "addCursorAbove", - description: "Add cursor above", - exec: function(editor) { editor.selectMoreLines(-1); }, - bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorBelow", - description: "Add cursor below", - exec: function(editor) { editor.selectMoreLines(1); }, - bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorAboveSkipCurrent", - description: "Add cursor above (skip current)", - exec: function(editor) { editor.selectMoreLines(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "addCursorBelowSkipCurrent", - description: "Add cursor below (skip current)", - exec: function(editor) { editor.selectMoreLines(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectMoreBefore", - description: "Select more before", - exec: function(editor) { editor.selectMore(-1); }, - bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectMoreAfter", - description: "Select more after", - exec: function(editor) { editor.selectMore(1); }, - bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectNextBefore", - description: "Select next before", - exec: function(editor) { editor.selectMore(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectNextAfter", - description: "Select next after", - exec: function(editor) { editor.selectMore(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, - scrollIntoView: "cursor", - readOnly: true -}, { - name: "toggleSplitSelectionIntoLines", - description: "Split into lines", - exec: function(editor) { - if (editor.multiSelect.rangeCount > 1) - editor.multiSelect.joinSelections(); - else - editor.multiSelect.splitIntoLines(); - }, - bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, - readOnly: true -}, { - name: "splitSelectionIntoLines", - description: "Split into lines", - exec: function(editor) { editor.multiSelect.splitIntoLines(); }, - readOnly: true -}, { - name: "alignCursors", - description: "Align cursors", - exec: function(editor) { editor.alignCursors(); }, - bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, - scrollIntoView: "cursor" -}, { - name: "findAll", - description: "Find all", - exec: function(editor) { editor.findAll(); }, - bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, - scrollIntoView: "cursor", - readOnly: true -}]; -exports.multiSelectCommands = [{ - name: "singleSelection", - description: "Single selection", - bindKey: "esc", - exec: function(editor) { editor.exitMultiSelectMode(); }, - scrollIntoView: "cursor", - readOnly: true, - isAvailable: function(editor) {return editor && editor.inMultiSelectMode;} -}]; - -var HashHandler = require("../keyboard/hash_handler").HashHandler; -exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); +exports.VirtualRenderer = VirtualRenderer; }); -define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { - -var RangeList = require("./range_list").RangeList; -var Range = require("./range").Range; -var Selection = require("./selection").Selection; -var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; -var event = require("./lib/event"); -var lang = require("./lib/lang"); -var commands = require("./commands/multi_select_commands"); -exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); -var Search = require("./search").Search; -var search = new Search(); - -function find(session, needle, dir) { - search.$options.wrap = true; - search.$options.needle = needle; - search.$options.backwards = dir == -1; - return search.find(session); -} -var EditSession = require("./edit_session").EditSession; -(function() { - this.getSelectionMarkers = function() { - return this.$selectionMarkers; - }; -}).call(EditSession.prototype); -(function() { - this.ranges = null; - this.rangeList = null; - this.addRange = function(range, $blockChangeEvents) { - if (!range) - return; - - if (!this.inMultiSelectMode && this.rangeCount === 0) { - var oldRange = this.toOrientedRange(); - this.rangeList.add(oldRange); - this.rangeList.add(range); - if (this.rangeList.ranges.length != 2) { - this.rangeList.removeAll(); - return $blockChangeEvents || this.fromOrientedRange(range); - } - this.rangeList.removeAll(); - this.rangeList.add(oldRange); - this.$onAddRange(oldRange); - } +define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; - if (!range.cursor) - range.cursor = range.end; +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); - var removed = this.rangeList.add(range); +function $workerBlob(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } +} - this.$onAddRange(range); +function createWorker(workerUrl) { + if (typeof Worker == "undefined") + return { postMessage: function() {}, terminate: function() {} }; + if (config.get("loadWorkerFromBlob")) { + var blob = $workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + return new Worker(blobURL); + } + return new Worker(workerUrl); +} - if (removed.length) - this.$onRemoveRange(removed); +var WorkerClient = function(worker) { + if (!worker.postMessage) + worker = this.$createWorkerFromOldConfig.apply(this, arguments); - if (this.rangeCount > 1 && !this.inMultiSelectMode) { - this._signal("multiSelect"); - this.inMultiSelectMode = true; - this.session.$undoSelect = false; - this.rangeList.attach(this.session); - } + this.$worker = worker; + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); - return $blockChangeEvents || this.fromOrientedRange(range); - }; - this.toSingleRange = function(range) { - range = range || this.ranges[0]; - var removed = this.rangeList.removeAll(); - if (removed.length) - this.$onRemoveRange(removed); + this.callbackId = 1; + this.callbacks = {}; - range && this.fromOrientedRange(range); - }; - this.substractPoint = function(pos) { - var removed = this.rangeList.substractPoint(pos); - if (removed) { - this.$onRemoveRange(removed); - return removed[0]; - } - }; - this.mergeOverlappingRanges = function() { - var removed = this.rangeList.merge(); - if (removed.length) - this.$onRemoveRange(removed); - }; + this.$worker.onmessage = this.onMessage; +}; - this.$onAddRange = function(range) { - this.rangeCount = this.rangeList.ranges.length; - this.ranges.unshift(range); - this._signal("addRange", {range: range}); - }; +(function(){ - this.$onRemoveRange = function(removed) { - this.rangeCount = this.rangeList.ranges.length; - if (this.rangeCount == 1 && this.inMultiSelectMode) { - var lastRange = this.rangeList.ranges.pop(); - removed.push(lastRange); - this.rangeCount = 0; - } + oop.implement(this, EventEmitter); - for (var i = removed.length; i--; ) { - var index = this.ranges.indexOf(removed[i]); - this.ranges.splice(index, 1); - } + this.$createWorkerFromOldConfig = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) { + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; - this._signal("removeRange", {ranges: removed}); + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); - if (this.rangeCount === 0 && this.inMultiSelectMode) { - this.inMultiSelectMode = false; - this._signal("singleSelect"); - this.session.$undoSelect = true; - this.rangeList.detach(this.session); + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); } - lastRange = lastRange || this.ranges[0]; - if (lastRange && !lastRange.isEqual(this.getRange())) - this.fromOrientedRange(lastRange); + this.$worker = createWorker(workerUrl); + if (importScripts) { + this.send("importScripts", importScripts); + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + return this.$worker; }; - this.$initRangeList = function() { - if (this.rangeList) - return; - this.rangeList = new RangeList(); - this.ranges = []; - this.rangeCount = 0; - }; - this.getAllRanges = function() { - return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; - }; - this.splitIntoLines = function () { - var ranges = this.ranges.length ? this.ranges : [this.getRange()]; - var newRanges = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - var row = range.start.row; - var endRow = range.end.row; - if (row === endRow) { - newRanges.push(range.clone()); - } else { - newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); - while (++row < endRow) - newRanges.push(this.getLineRange(row, true)); - newRanges.push(new Range(endRow, 0, endRow, range.end.column)); - } - if (i == 0 && !this.isBackwards()) - newRanges = newRanges.reverse(); + this.onMessage = function(e) { + var msg = e.data; + switch (msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; } - this.toSingleRange(); - for (var i = newRanges.length; i--;) - this.addRange(newRanges[i]); }; - this.joinSelections = function () { - var ranges = this.rangeList.ranges; - var lastRange = ranges[ranges.length - 1]; - var range = Range.fromPoints(ranges[0].start, lastRange.end); - - this.toSingleRange(); - this.setSelectionRange(range, lastRange.cursor == lastRange.start); + this.reportError = function(err) { + window.console && console.error && console.error(err); }; - this.toggleBlockSelection = function () { - if (this.rangeCount > 1) { - var ranges = this.rangeList.ranges; - var lastRange = ranges[ranges.length - 1]; - var range = Range.fromPoints(ranges[0].start, lastRange.end); - this.toSingleRange(); - this.setSelectionRange(range, lastRange.cursor == lastRange.start); - } else { - var cursor = this.session.documentToScreenPosition(this.cursor); - var anchor = this.session.documentToScreenPosition(this.anchor); + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; - var rectSel = this.rectangularRangeBlock(cursor, anchor); - rectSel.forEach(this.addRange, this); - } + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker.onerror = function(e) { + e.preventDefault(); + }; + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; }; - this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { - var rectSel = []; - var xBackwards = screenCursor.column < screenAnchor.column; - if (xBackwards) { - var startColumn = screenCursor.column; - var endColumn = screenAnchor.column; - var startOffsetX = screenCursor.offsetX; - var endOffsetX = screenAnchor.offsetX; - } else { - var startColumn = screenAnchor.column; - var endColumn = screenCursor.column; - var startOffsetX = screenAnchor.offsetX; - var endOffsetX = screenCursor.offsetX; - } + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; - var yBackwards = screenCursor.row < screenAnchor.row; - if (yBackwards) { - var startRow = screenCursor.row; - var endRow = screenAnchor.row; - } else { - var startRow = screenAnchor.row; - var endRow = screenCursor.row; + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); } + this.send(cmd, args); + }; - if (startColumn < 0) - startColumn = 0; - if (startRow < 0) - startRow = 0; - - if (startRow == endRow) - includeEmptyLines = true; - - var docEnd; - for (var row = startRow; row <= endRow; row++) { - var range = Range.fromPoints( - this.session.screenToDocumentPosition(row, startColumn, startOffsetX), - this.session.screenToDocumentPosition(row, endColumn, endOffsetX) - ); - if (range.isEmpty()) { - if (docEnd && isSamePoint(range.end, docEnd)) - break; - docEnd = range.end; - } - range.cursor = xBackwards ? range.start : range.end; - rectSel.push(range); + this.emit = function(event, data) { + try { + if (data.data && data.data.err) + data.data.err = {message: data.data.err.message, stack: data.data.err.stack, code: data.data.err.code}; + this.$worker && this.$worker.postMessage({event: event, data: {data: data.data}}); } - - if (yBackwards) - rectSel.reverse(); - - if (!includeEmptyLines) { - var end = rectSel.length - 1; - while (rectSel[end].isEmpty() && end > 0) - end--; - if (end > 0) { - var start = 0; - while (rectSel[start].isEmpty()) - start++; - } - for (var i = end; i >= start; i--) { - if (rectSel[i].isEmpty()) - rectSel.splice(i, 1); - } + catch(ex) { + console.error(ex.stack); } - - return rectSel; - }; -}).call(Selection.prototype); -var Editor = require("./editor").Editor; -(function() { - this.updateSelectionMarkers = function() { - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); }; - this.addSelectionMarker = function(orientedRange) { - if (!orientedRange.cursor) - orientedRange.cursor = orientedRange.end; - var style = this.getSelectionStyle(); - orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + this.attachToDocument = function(doc) { + if (this.$doc) + this.terminate(); - this.session.$selectionMarkers.push(orientedRange); - this.session.selectionMarkerCount = this.session.$selectionMarkers.length; - return orientedRange; - }; - this.removeSelectionMarker = function(range) { - if (!range.marker) - return; - this.session.removeMarker(range.marker); - var index = this.session.$selectionMarkers.indexOf(range); - if (index != -1) - this.session.$selectionMarkers.splice(index, 1); - this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener, true); }; - this.removeSelectionMarkers = function(ranges) { - var markerList = this.session.$selectionMarkers; - for (var i = ranges.length; i--; ) { - var range = ranges[i]; - if (!range.marker) - continue; - this.session.removeMarker(range.marker); - var index = markerList.indexOf(range); - if (index != -1) - markerList.splice(index, 1); + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); } - this.session.selectionMarkerCount = markerList.length; + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); }; - this.$onAddRange = function(e) { - this.addSelectionMarker(e.range); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); }; - this.$onRemoveRange = function(e) { - this.removeSelectionMarkers(e.ranges); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - }; +}).call(WorkerClient.prototype); - this.$onMultiSelect = function(e) { - if (this.inMultiSelectMode) - return; - this.inMultiSelectMode = true; - this.setStyle("ace_multiselect"); - this.keyBinding.addKeyboardHandler(commands.keyboardHandler); - this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - }; + var messageBuffer = []; + var workerClient = new WorkerClient({ + messageBuffer: messageBuffer, + terminate: function() {}, + postMessage: function(e) { + messageBuffer.push(e); + if (!main) return; + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }); - this.$onSingleSelect = function(e) { - if (this.session.multiSelect.inVirtualMode) - return; - this.inMultiSelectMode = false; + workerClient.setEmitSync = function(val) { emitSync = val; }; - this.unsetStyle("ace_multiselect"); - this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + var processNext = function() { + var msg = messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; - this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); - this._emit("changeSelection"); + sender.postMessage = function(msg) { + workerClient.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); }; - this.$onMultiSelectExec = function(e) { - var command = e.command; - var editor = e.editor; - if (!editor.multiSelect) + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (messageBuffer.length) + processNext(); + }); + + return workerClient; +}; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; +exports.createWorker = createWorker; + + +}); + +define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module){"use strict"; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); +var PlaceHolder = /** @class */ (function () { + function PlaceHolder(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate, true); + this.$others = others; + this.$onCursorChange = function () { + setTimeout(function () { + _self.onCursorChange(); + }); + }; + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager()["$undostack"] || { length: -1 }; + this.$undoStackDepth = undoStack.length; + this.setup(); + session.selection.on("changeCursor", this.$onCursorChange); + } + PlaceHolder.prototype.setup = function () { + var _self = this; + var doc = this.doc; + var session = this.session; + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function (other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + PlaceHolder.prototype.showOtherMarkers = function () { + if (this.othersActive) return; - if (!command.multiSelectAction) { - var result = command.exec(editor, e.args || {}); - editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); - editor.multiSelect.mergeOverlappingRanges(); - } else if (command.multiSelectAction == "forEach") { - result = editor.forEachSelection(command, e.args); - } else if (command.multiSelectAction == "forEachLine") { - result = editor.forEachSelection(command, e.args, true); - } else if (command.multiSelectAction == "single") { - editor.exitMultiSelectMode(); - result = command.exec(editor, e.args || {}); - } else { - result = command.multiSelectAction(editor, e.args || {}); + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function (anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column + _self.length), _self.othersClass, null, false); + }); + }; + PlaceHolder.prototype.hideOtherMarkers = function () { + if (!this.othersActive) + return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); } - return result; - }; - this.forEachSelection = function(cmd, args, options) { - if (this.inVirtualSelectionMode) + }; + PlaceHolder.prototype.onUpdate = function (delta) { + if (this.$updating) + return this.updateAnchors(delta); + var range = delta; + if (range.start.row !== range.end.row) return; - var keepOrder = options && options.keepOrder; - var $byLines = options == true || options && options.$byLines; - var session = this.session; - var selection = this.selection; - var rangeList = selection.rangeList; - var ranges = (keepOrder ? selection : rangeList).ranges; - var result; - - if (!ranges.length) - return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); - - var reg = selection._eventRegistry; - selection._eventRegistry = {}; - - var tmpSel = new Selection(session); - this.inVirtualSelectionMode = true; - for (var i = ranges.length; i--;) { - if ($byLines) { - while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) - i--; + if (range.start.row !== this.pos.row) + return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + this.updateAnchors(delta); + if (inMainRange) + this.length += lengthDiff; + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.insertMergedLines(newPos, delta.lines); + } + } + else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = { row: otherPos.row, column: otherPos.column + distanceFromStart }; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } } - tmpSel.fromOrientedRange(ranges[i]); - tmpSel.index = i; - this.selection = session.selection = tmpSel; - var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); - if (!result && cmdResult !== undefined) - result = cmdResult; - tmpSel.toOrientedRange(ranges[i]); } - tmpSel.detach(); - - this.selection = session.selection = selection; - this.inVirtualSelectionMode = false; - selection._eventRegistry = reg; - selection.mergeOverlappingRanges(); - if (selection.ranges[0]) - selection.fromOrientedRange(selection.ranges[0]); - - var anim = this.renderer.$scrollAnimation; - this.onCursorChange(); - this.onSelectionChange(); - if (anim && anim.from == anim.to) - this.renderer.animateScrolling(anim.from); - - return result; + this.$updating = false; + this.updateMarkers(); + }; + PlaceHolder.prototype.updateAnchors = function (delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + PlaceHolder.prototype.updateMarkers = function () { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function (pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + _self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); }; - this.exitMultiSelectMode = function() { - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + PlaceHolder.prototype.onCursorChange = function (event) { + if (this.$updating || !this.session) return; - this.multiSelect.toSingleRange(); - }; - - this.getSelectedText = function() { - var text = ""; - if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { - var ranges = this.multiSelect.rangeList.ranges; - var buf = []; - for (var i = 0; i < ranges.length; i++) { - buf.push(this.session.getTextRange(ranges[i])); - } - var nl = this.session.getDocument().getNewLineCharacter(); - text = buf.join(nl); - if (text.length == (buf.length - 1) * nl.length) - text = ""; - } else if (!this.selection.isEmpty()) { - text = this.session.getTextRange(this.getSelectionRange()); + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } + else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); } - return text; }; - - this.$checkMultiselectChange = function(e, anchor) { - if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { - var range = this.multiSelect.ranges[0]; - if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) - return; - var pos = anchor == this.multiSelect.anchor - ? range.cursor == range.start ? range.end : range.start - : range.cursor; - if (pos.row != anchor.row - || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) - this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); - else - this.multiSelect.mergeOverlappingRanges(); + PlaceHolder.prototype.detach = function () { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.off("change", this.$onUpdate); + this.session.selection.off("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + PlaceHolder.prototype.cancel = function () { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager["$undostack"]).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(this.session, true); } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); }; - this.findAll = function(needle, options, additive) { - options = options || {}; - options.needle = needle || options.needle; - if (options.needle == undefined) { - var range = this.selection.isEmpty() - ? this.selection.getWordRange() - : this.selection.getRange(); - options.needle = this.session.getTextRange(range); - } - this.$search.set(options); - - var ranges = this.$search.findAll(this.session); - if (!ranges.length) - return 0; - - var selection = this.multiSelect; + return PlaceHolder; +}()); +oop.implement(PlaceHolder.prototype, EventEmitter); +exports.PlaceHolder = PlaceHolder; - if (!additive) - selection.toSingleRange(ranges[0]); +}); - for (var i = ranges.length; i--; ) - selection.addRange(ranges[i], true); - if (range && selection.rangeList.rangeAtPoint(range.start)) - selection.addRange(range, true); - - return ranges.length; +define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module){var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + if (ctrl && useragent.isMac) + button = ev.button; + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + if (button !== 0) + return; + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function (e) { + mouseX = e.clientX; + mouseY = e.clientY; }; - this.selectMoreLines = function(dir, skip) { - var range = this.selection.toOrientedRange(); - var isBackwards = range.cursor == range.end; - - var screenLead = this.session.documentToScreenPosition(range.cursor); - if (this.selection.$desiredColumn) - screenLead.column = this.selection.$desiredColumn; - - var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); - - if (!range.isEmpty()) { - var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); - var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); - } else { - var anchor = lead; + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } + else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; } - - if (isBackwards) { - var newRange = Range.fromPoints(lead, anchor); - newRange.cursor = newRange.start; - } else { - var newRange = Range.fromPoints(anchor, lead); - newRange.cursor = newRange.end; + else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; } - - newRange.desiredColumn = screenLead.column; - if (!this.selection.inMultiSelectMode) { - this.selection.addRange(range); - } else { - if (skip) - var toRemove = range.cursor; + } + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + var oldRange = selection.rangeList.rangeAtPoint(pos); + editor.inVirtualSelectionMode = true; + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function () { + var tmpSel = selection.toOrientedRange(); + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } + else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.inVirtualSelectionMode = false; + }); + } + else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function () { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX); + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + }; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } + else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); } + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + screenCursor = { row: -1, column: -1 }; + var onMouseSelectionEnd = function (e) { + blockSelect(); + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + }; + var onSelectionInterval = blockSelect; + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function () { onSelectionInterval(); }, 20); + return e.preventDefault(); + } +} +exports.onMouseDown = onMouseDown; - this.selection.addRange(newRange); - if (toRemove) - this.selection.substractPoint(toRemove); - }; - this.transposeSelections = function(dir) { - var session = this.session; - var sel = session.multiSelect; - var all = sel.ranges; +}); + +define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module){/** + * commands to enter multiselect mode + * @type {import("../../ace-internal").Ace.Command[]} + */ +exports.defaultCommands = [{ + name: "addCursorAbove", + description: "Add cursor above", + exec: function (editor) { editor.selectMoreLines(-1); }, + bindKey: { win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelow", + description: "Add cursor below", + exec: function (editor) { editor.selectMoreLines(1); }, + bindKey: { win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorAboveSkipCurrent", + description: "Add cursor above (skip current)", + exec: function (editor) { editor.selectMoreLines(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "addCursorBelowSkipCurrent", + description: "Add cursor below (skip current)", + exec: function (editor) { editor.selectMoreLines(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreBefore", + description: "Select more before", + exec: function (editor) { editor.selectMore(-1); }, + bindKey: { win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectMoreAfter", + description: "Select more after", + exec: function (editor) { editor.selectMore(1); }, + bindKey: { win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextBefore", + description: "Select next before", + exec: function (editor) { editor.selectMore(-1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectNextAfter", + description: "Select next after", + exec: function (editor) { editor.selectMore(1, true); }, + bindKey: { win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right" }, + scrollIntoView: "cursor", + readOnly: true + }, { + name: "toggleSplitSelectionIntoLines", + description: "Split selection into lines", + exec: function (editor) { + if (editor.multiSelect.rangeCount > 1) + editor.multiSelect.joinSelections(); + else + editor.multiSelect.splitIntoLines(); + }, + bindKey: { win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L" }, + readOnly: true + }, { + name: "splitSelectionIntoLines", + description: "Split into lines", + exec: function (editor) { editor.multiSelect.splitIntoLines(); }, + readOnly: true + }, { + name: "alignCursors", + description: "Align cursors", + exec: function (editor) { editor.alignCursors(); }, + bindKey: { win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A" }, + scrollIntoView: "cursor" + }, { + name: "findAll", + description: "Find all", + exec: function (editor) { editor.findAll(); }, + bindKey: { win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G" }, + scrollIntoView: "cursor", + readOnly: true + }]; +exports.multiSelectCommands = [{ + name: "singleSelection", + description: "Single selection", + bindKey: "esc", + exec: function (editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function (editor) { return editor && editor.inMultiSelectMode; } + }]; +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); - for (var i = all.length; i--; ) { - var range = all[i]; - if (range.isEmpty()) { - var tmp = session.getWordRange(range.start.row, range.start.column); - range.start.row = tmp.start.row; - range.start.column = tmp.start.column; - range.end.row = tmp.end.row; - range.end.column = tmp.end.column; +}); + +define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module){/** + * @typedef {import("./anchor").Anchor} Anchor + * @typedef {import("../ace-internal").Ace.Point} Point + * @typedef {import("../ace-internal").Ace.ScreenCoordinates} ScreenCoordinates + */ +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function () { + this.getSelectionMarkers = function () { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function () { + this.ranges = null; + this.rangeList = null; + this.addRange = function (range, $blockChangeEvents) { + if (!range) + return; + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); } - sel.mergeOverlappingRanges(); - - var words = []; - for (var i = all.length; i--; ) { - var range = all[i]; - words.unshift(session.getTextRange(range)); + if (!range.cursor) + range.cursor = range.end; + var removed = this.rangeList.add(range); + this.$onAddRange(range); + if (removed.length) + this.$onRemoveRange(removed); + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); } - - if (dir < 0) - words.unshift(words.pop()); - else - words.push(words.shift()); - - for (var i = all.length; i--; ) { - var range = all[i]; - var tmp = range.clone(); - session.replace(range, words[i]); - range.start.row = tmp.start.row; - range.start.column = tmp.start.column; + return $blockChangeEvents || this.fromOrientedRange(range); + }; + this.toSingleRange = function (range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + range && this.fromOrientedRange(range); + }; + this.substractPoint = function (pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; } - sel.fromOrientedRange(sel.ranges[0]); }; - this.selectMore = function(dir, skip, stopAtFirst) { - var session = this.session; - var sel = session.multiSelect; - - var range = sel.toOrientedRange(); - if (range.isEmpty()) { - range = session.getWordRange(range.start.row, range.start.column); - range.cursor = dir == -1 ? range.start : range.end; - this.multiSelect.addRange(range); - if (stopAtFirst) - return; + this.mergeOverlappingRanges = function () { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + }; + this.$onAddRange = function (range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", { range: range }); + }; + this.$onRemoveRange = function (removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; } - var needle = session.getTextRange(range); - - var newRange = find(session, needle, dir); - if (newRange) { - newRange.cursor = dir == -1 ? newRange.start : newRange.end; - this.session.unfold(newRange); - this.multiSelect.addRange(newRange); - this.renderer.scrollCursorIntoView(null, 0.5); + for (var i = removed.length; i--;) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); } - if (skip) - this.multiSelect.substractPoint(range.cursor); + this._signal("removeRange", { ranges: removed }); + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); }; - this.alignCursors = function() { - var session = this.session; - var sel = session.multiSelect; - var ranges = sel.ranges; - var row = -1; - var sameRowRanges = ranges.filter(function(r) { - if (r.cursor.row == row) - return true; - row = r.cursor.row; - }); - - if (!ranges.length || sameRowRanges.length == ranges.length - 1) { - var range = this.selection.getRange(); - var fr = range.start.row, lr = range.end.row; - var guessRange = fr == lr; - if (guessRange) { - var max = this.session.getLength(); - var line; - do { - line = this.session.getLine(lr); - } while (/[=:]/.test(line) && ++lr < max); - do { - line = this.session.getLine(fr); - } while (/[=:]/.test(line) && --fr > 0); - - if (fr < 0) fr = 0; - if (lr >= max) lr = max - 1; + this.$initRangeList = function () { + if (this.rangeList) + return; + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function () { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + this.splitIntoLines = function () { + var ranges = this.ranges.length ? this.ranges : [this.getRange()]; + var newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var row = range.start.row; + var endRow = range.end.row; + if (row === endRow) { + newRanges.push(range.clone()); } - var lines = this.session.removeFullLines(fr, lr); - lines = this.$reAlignText(lines, guessRange); - this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); - if (!guessRange) { - range.start.column = 0; - range.end.column = lines[lines.length - 1].length; + else { + newRanges.push(new Range(row, range.start.column, row, this.session.getLine(row).length)); + while (++row < endRow) + newRanges.push(this.getLineRange(row, true)); + newRanges.push(new Range(endRow, 0, endRow, range.end.column)); } - this.selection.setRange(range); - } else { - sameRowRanges.forEach(function(r) { - sel.substractPoint(r.cursor); - }); - - var maxCol = 0; - var minSpace = Infinity; - var spaceOffsets = ranges.map(function(r) { - var p = r.cursor; - var line = session.getLine(p.row); - var spaceOffset = line.substr(p.column).search(/\S/g); - if (spaceOffset == -1) - spaceOffset = 0; - - if (p.column > maxCol) - maxCol = p.column; - if (spaceOffset < minSpace) - minSpace = spaceOffset; - return spaceOffset; - }); - ranges.forEach(function(r, i) { - var p = r.cursor; - var l = maxCol - p.column; - var d = spaceOffsets[i] - minSpace; - if (l > d) - session.insert(p, lang.stringRepeat(" ", l - d)); - else - session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); - - r.start.column = r.end.column = maxCol; - r.start.row = r.end.row = p.row; - r.cursor = r.end; - }); - sel.fromOrientedRange(ranges[0]); - this.renderer.updateCursor(); - this.renderer.updateBackMarkers(); + if (i == 0 && !this.isBackwards()) + newRanges = newRanges.reverse(); } + this.toSingleRange(); + for (var i = newRanges.length; i--;) + this.addRange(newRanges[i]); }; - - this.$reAlignText = function(lines, forceLeft) { - var isLeftAligned = true, isRightAligned = true; - var startW, textW, endW; - - return lines.map(function(line) { - var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); - if (!m) - return [line]; - - if (startW == null) { - startW = m[1].length; - textW = m[2].length; - endW = m[3].length; - return m; - } - - if (startW + textW + endW != m[1].length + m[2].length + m[3].length) - isRightAligned = false; - if (startW != m[1].length) - isLeftAligned = false; - - if (startW > m[1].length) - startW = m[1].length; - if (textW < m[2].length) - textW = m[2].length; - if (endW > m[3].length) - endW = m[3].length; - - return m; - }).map(forceLeft ? alignLeft : - isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); - - function spaces(n) { - return lang.stringRepeat(" ", n); + this.joinSelections = function () { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); } - - function alignLeft(m) { - return !m[2] ? m[0] : spaces(startW) + m[2] - + spaces(textW - m[2].length + endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + else { + var cursor = this.session.documentToScreenPosition(this.cursor); + var anchor = this.session.documentToScreenPosition(this.anchor); + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); } - function alignRight(m) { - return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] - + spaces(endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + }; + this.rectangularRangeBlock = function (screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + var startOffsetX = screenCursor.offsetX; + var endOffsetX = screenAnchor.offsetX; } - function unAlign(m) { - return !m[2] ? m[0] : spaces(startW) + m[2] - + spaces(endW) - + m[4].replace(/^([=:])\s+/, "$1 "); + else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + var startOffsetX = screenAnchor.offsetX; + var endOffsetX = screenCursor.offsetX; } - }; -}).call(Editor.prototype); - - -function isSamePoint(p1, p2) { - return p1.row == p2.row && p1.column == p2.column; -} -exports.onSessionChange = function(e) { - var session = e.session; - if (session && !session.multiSelect) { - session.$selectionMarkers = []; - session.selection.$initRangeList(); - session.multiSelect = session.selection; - } - this.multiSelect = session && session.multiSelect; - - var oldSession = e.oldSession; - if (oldSession) { - oldSession.multiSelect.off("addRange", this.$onAddRange); - oldSession.multiSelect.off("removeRange", this.$onRemoveRange); - oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); - oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); - oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); - oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); - } - - if (session) { - session.multiSelect.on("addRange", this.$onAddRange); - session.multiSelect.on("removeRange", this.$onRemoveRange); - session.multiSelect.on("multiSelect", this.$onMultiSelect); - session.multiSelect.on("singleSelect", this.$onSingleSelect); - session.multiSelect.lead.on("change", this.$checkMultiselectChange); - session.multiSelect.anchor.on("change", this.$checkMultiselectChange); - } - - if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { - if (session.selection.inMultiSelectMode) - this.$onMultiSelect(); - else - this.$onSingleSelect(); - } -}; -function MultiSelect(editor) { - if (editor.$multiselectOnSessionChange) - return; - editor.$onAddRange = editor.$onAddRange.bind(editor); - editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); - editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); - editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); - editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); - editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); - - editor.$multiselectOnSessionChange(editor); - editor.on("changeSession", editor.$multiselectOnSessionChange); - - editor.on("mousedown", onMouseDown); - editor.commands.addCommands(commands.defaultCommands); - - addAltCursorListeners(editor); -} - -function addAltCursorListeners(editor){ - if (!editor.textInput) return; - var el = editor.textInput.getElement(); - var altCursor = false; - event.addListener(el, "keydown", function(e) { - var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); - if (editor.$blockSelectEnabled && altDown) { - if (!altCursor) { - editor.renderer.setMouseCursor("crosshair"); - altCursor = true; - } - } else if (altCursor) { - reset(); + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; } - }, editor); - - event.addListener(el, "keyup", reset, editor); - event.addListener(el, "blur", reset, editor); - function reset(e) { - if (altCursor) { - editor.renderer.setMouseCursor(""); - altCursor = false; + else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; } - } -} - -exports.MultiSelect = MultiSelect; - - -require("./config").defineOptions(Editor.prototype, "editor", { - enableMultiselect: { - set: function(val) { - MultiSelect(this); - if (val) { - this.on("changeSession", this.$multiselectOnSessionChange); - this.on("mousedown", onMouseDown); - } else { - this.off("changeSession", this.$multiselectOnSessionChange); - this.off("mousedown", onMouseDown); + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + if (startRow == endRow) + includeEmptyLines = true; + var docEnd; + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints(this.session.screenToDocumentPosition(row, startColumn, startOffsetX), this.session.screenToDocumentPosition(row, endColumn, endOffsetX)); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + docEnd = range.end; } - }, - value: true - }, - enableBlockSelect: { - set: function(val) { - this.$blockSelectEnabled = val; - }, - value: true - } -}); - - - -}); - -define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { -"use strict"; - -var Range = require("../../range").Range; - -var FoldMode = exports.FoldMode = function() {}; - -(function() { - - this.foldingStartMarker = null; - this.foldingStopMarker = null; - this.getFoldWidget = function(session, foldStyle, row) { - var line = session.getLine(row); - if (this.foldingStartMarker.test(line)) - return "start"; - if (foldStyle == "markbeginend" - && this.foldingStopMarker - && this.foldingStopMarker.test(line)) - return "end"; - return ""; + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + if (yBackwards) + rectSel.reverse(); + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + return rectSel; }; - - this.getFoldWidgetRange = function(session, foldStyle, row) { - return null; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function () { + this.updateSelectionMarkers = function () { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); }; - - this.indentationBlock = function(session, row, column) { - var re = /\S/; - var line = session.getLine(row); - var startLevel = line.search(re); - if (startLevel == -1) + this.addSelectionMarker = function (orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function (range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + this.removeSelectionMarkers = function (ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + this.$onAddRange = function (e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onRemoveRange = function (e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onMultiSelect = function (e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.$onSingleSelect = function (e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + this.$onMultiSelectExec = function (e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) return; - - var startColumn = column || line.length; - var maxRow = session.getLength(); - var startRow = row; - var endRow = row; - - while (++row < maxRow) { - var level = session.getLine(row).search(re); - - if (level == -1) - continue; - - if (level <= startLevel) { - var token = session.getTokenAt(row, 0); - if (!token || token.type !== "string") - break; - } - - endRow = row; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); } - - if (endRow > startRow) { - var endColumn = session.getLine(endRow).length; - return new Range(startRow, startColumn, endRow, endColumn); + else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } + else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } + else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); } + else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; }; - - this.openingBracketBlock = function(session, bracket, row, column, typeRe) { - var start = {row: row, column: column + 1}; - var end = session.$findClosingBracket(bracket, start, typeRe); - if (!end) + this.forEachSelection = function (cmd, args, options) { + if (this.inVirtualSelectionMode) return; - - var fw = session.foldWidgets[end.row]; - if (fw == null) - fw = session.getFoldWidget(end.row); - - if (fw == "start" && end.row > start.row) { - end.row --; - end.column = session.getLine(end.row).length; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines; + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); } - return Range.fromPoints(start, end); + tmpSel.detach(); + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + if (selection.ranges[0]) + selection.fromOrientedRange(selection.ranges[0]); + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + return result; }; - - this.closingBracketBlock = function(session, bracket, row, column, typeRe) { - var end = {row: row, column: column}; - var start = session.$findOpeningBracket(bracket, end); - - if (!start) + this.exitMultiSelectMode = function () { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) return; - - start.column++; - end.column--; - - return Range.fromPoints(start, end); + this.multiSelect.toSingleRange(); }; -}).call(FoldMode.prototype); - -}); - -define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - -exports.isDark = false; -exports.cssClass = "ace-tm"; -exports.cssText = ".ace-tm .ace_gutter {\ -background: #f0f0f0;\ -color: #333;\ -}\ -.ace-tm .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-tm .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-tm {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-tm .ace_cursor {\ -color: black;\ -}\ -.ace-tm .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-tm .ace_storage,\ -.ace-tm .ace_keyword {\ -color: blue;\ -}\ -.ace-tm .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-tm .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-tm .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-tm .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-tm .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-tm .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_support.ace_type,\ -.ace-tm .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-tm .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-tm .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-tm .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-tm .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-tm .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-tm .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-tm .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-tm .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-tm .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-tm .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-tm .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-tm .ace_meta.ace_tag {\ -color:rgb(0, 22, 142);\ -}\ -.ace-tm .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-tm .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-tm.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-tm .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-tm .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-tm .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-tm .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-tm .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-tm .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-tm .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; -exports.$id = "ace/theme/textmate"; - -var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass, false); -}); - -define("ace/line_widgets",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - -var dom = require("./lib/dom"); - -function LineWidgets(session) { - this.session = session; - this.session.widgetManager = this; - this.session.getRowLength = this.getRowLength; - this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; - this.updateOnChange = this.updateOnChange.bind(this); - this.renderWidgets = this.renderWidgets.bind(this); - this.measureWidgets = this.measureWidgets.bind(this); - this.session._changedWidgets = []; - this.$onChangeEditor = this.$onChangeEditor.bind(this); - - this.session.on("change", this.updateOnChange); - this.session.on("changeFold", this.updateOnFold); - this.session.on("changeEditor", this.$onChangeEditor); -} - -(function() { - this.getRowLength = function(row) { - var h; - if (this.lineWidgets) - h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; - else - h = 0; - if (!this.$useWrapMode || !this.$wrapData[row]) { - return 1 + h; - } else { - return this.$wrapData[row].length + 1 + h; + this.getSelectedText = function () { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } + else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); } + return text; }; - - this.$getWidgetScreenLength = function() { - var screenRows = 0; - this.lineWidgets.forEach(function(w){ - if (w && w.rowCount && !w.hidden) - screenRows += w.rowCount; - }); - return screenRows; - }; - - this.$onChangeEditor = function(e) { - this.attach(e.editor); + this.$checkMultiselectChange = function (e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + else + this.multiSelect.mergeOverlappingRanges(); + } }; - - this.attach = function(editor) { - if (editor && editor.widgetManager && editor.widgetManager != this) - editor.widgetManager.detach(); - - if (this.editor == editor) - return; - - this.detach(); - this.editor = editor; - - if (editor) { - editor.widgetManager = this; - editor.renderer.on("beforeRender", this.measureWidgets); - editor.renderer.on("afterRender", this.renderWidgets); + this.findAll = function (needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + var selection = this.multiSelect; + if (!additive) + selection.toSingleRange(ranges[0]); + for (var i = ranges.length; i--;) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + return ranges.length; + }; + this.selectMoreLines = function (dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } + else { + var anchor = lead; + } + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } + else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); } + else { + if (skip) + var toRemove = range.cursor; + } + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); }; - this.detach = function(e) { - var editor = this.editor; - if (!editor) - return; - - this.editor = null; - editor.widgetManager = null; - - editor.renderer.off("beforeRender", this.measureWidgets); - editor.renderer.off("afterRender", this.renderWidgets); - var lineWidgets = this.session.lineWidgets; - lineWidgets && lineWidgets.forEach(function(w) { - if (w && w.el && w.el.parentNode) { - w._inDocument = false; - w.el.parentNode.removeChild(w.el); + this.transposeSelections = function (dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + for (var i = all.length; i--;) { + var range = all[i]; + if (range.isEmpty()) { + var tmp_1 = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp_1.start.row; + range.start.column = tmp_1.start.column; + range.end.row = tmp_1.end.row; + range.end.column = tmp_1.end.column; } - }); + } + sel.mergeOverlappingRanges(); + var words = []; + for (var i = all.length; i--;) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + for (var i = all.length; i--;) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + sel.fromOrientedRange(sel.ranges[0]); }; - - this.updateOnFold = function(e, session) { - var lineWidgets = session.lineWidgets; - if (!lineWidgets || !e.action) - return; - var fold = e.data; - var start = fold.start.row; - var end = fold.end.row; - var hide = e.action == "add"; - for (var i = start + 1; i < end; i++) { - if (lineWidgets[i]) - lineWidgets[i].hidden = hide; + this.selectMore = function (dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; } - if (lineWidgets[end]) { - if (hide) { - if (!lineWidgets[start]) - lineWidgets[start] = lineWidgets[end]; - else - lineWidgets[end].hidden = hide; - } else { - if (lineWidgets[start] == lineWidgets[end]) - lineWidgets[start] = undefined; - lineWidgets[end].hidden = hide; - } + var needle = session.getTextRange(range); + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.renderer.scrollCursorIntoView(null, 0.5); } + if (skip) + this.multiSelect.substractPoint(range.cursor); }; - - this.updateOnChange = function(delta) { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - - var startRow = delta.start.row; - var len = delta.end.row - startRow; - - if (len === 0) { - } else if (delta.action == "remove") { - var removed = lineWidgets.splice(startRow + 1, len); - if (!lineWidgets[startRow] && removed[removed.length - 1]) { - lineWidgets[startRow] = removed.pop(); + this.alignCursors = function () { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function (r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + if (fr < 0) + fr = 0; + if (lr >= max) + lr = max - 1; } - removed.forEach(function(w) { - w && this.removeLineWidget(w); - }, this); - this.$updateRows(); - } else { - var args = new Array(len); - if (lineWidgets[startRow] && lineWidgets[startRow].column != null) { - if (delta.start.column > lineWidgets[startRow].column) - startRow++; + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({ row: fr, column: 0 }, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; } - args.unshift(startRow, 0); - lineWidgets.splice.apply(lineWidgets, args); - this.$updateRows(); + this.selection.setRange(range); + } + else { + sameRowRanges.forEach(function (r) { + sel.substractPoint(r.cursor); + }); + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function (r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function (r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); } }; - - this.$updateRows = function() { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - var noWidgets = true; - lineWidgets.forEach(function(w, i) { - if (w) { - noWidgets = false; - w.row = i; - while (w.$oldWidget) { - w.$oldWidget.row = i; - w = w.$oldWidget; - } - } - }); - if (noWidgets) - this.session.lineWidgets = null; - }; - - this.$registerLineWidget = function(w) { - if (!this.session.lineWidgets) - this.session.lineWidgets = new Array(this.session.getLength()); - - var old = this.session.lineWidgets[w.row]; - if (old) { - w.$oldWidget = old; - if (old.el && old.el.parentNode) { - old.el.parentNode.removeChild(old.el); - old._inDocument = false; + this.$reAlignText = function (lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + return lines.map(function (line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; } + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + function spaces(n) { + return lang.stringRepeat(" ", n); } - - this.session.lineWidgets[w.row] = w; - return w; - }; - - this.addLineWidget = function(w) { - this.$registerLineWidget(w); - w.session = this.session; - - if (!this.editor) return w; - - var renderer = this.editor.renderer; - if (w.html && !w.el) { - w.el = dom.createElement("div"); - w.el.innerHTML = w.html; + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); } - if (w.el) { - dom.addCssClass(w.el, "ace_lineWidgetContainer"); - w.el.style.position = "absolute"; - w.el.style.zIndex = 5; - renderer.container.appendChild(w.el); - w._inDocument = true; - - if (!w.coverGutter) { - w.el.style.zIndex = 3; - } - if (w.pixelHeight == null) { - w.pixelHeight = w.el.offsetHeight; + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function (e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + addAltCursorListeners(editor); +} +function addAltCursorListeners(editor) { + if (!editor.textInput) + return; + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function (e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; } } - if (w.rowCount == null) { - w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + else if (altCursor) { + reset(); } - - var fold = this.session.getFoldAt(w.row, 0); - w.$fold = fold; - if (fold) { - var lineWidgets = this.session.lineWidgets; - if (w.row == fold.end.row && !lineWidgets[fold.start.row]) - lineWidgets[fold.start.row] = w; - else - w.hidden = true; + }, editor); + event.addListener(el, "keyup", reset, editor); + event.addListener(el, "blur", reset, editor); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; } - - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - - this.$updateRows(); - this.renderWidgets(null, renderer); - this.onWidgetChanged(w); - return w; - }; - - this.removeLineWidget = function(w) { - w._inDocument = false; - w.session = null; - if (w.el && w.el.parentNode) - w.el.parentNode.removeChild(w.el); - if (w.editor && w.editor.destroy) try { - w.editor.destroy(); - } catch(e){} - if (this.session.lineWidgets) { - var w1 = this.session.lineWidgets[w.row]; - if (w1 == w) { - this.session.lineWidgets[w.row] = w.$oldWidget; - if (w.$oldWidget) - this.onWidgetChanged(w.$oldWidget); - } else { - while (w1) { - if (w1.$oldWidget == w) { - w1.$oldWidget = w.$oldWidget; - break; - } - w1 = w1.$oldWidget; - } + } +} +exports.MultiSelect = MultiSelect; +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function (val) { + MultiSelect(this); + if (val) { + this.on("mousedown", onMouseDown); } - } - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - this.$updateRows(); - }; - - this.getWidgetsAtRow = function(row) { - var lineWidgets = this.session.lineWidgets; - var w = lineWidgets && lineWidgets[row]; - var list = []; - while (w) { - list.push(w); - w = w.$oldWidget; - } - return list; + else { + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function (val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + +}); + +define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module){"use strict"; +var Range = require("../../range").Range; +var FoldMode = exports.FoldMode = function () { }; +(function () { + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function (session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; }; - - this.onWidgetChanged = function(w) { - this.session._changedWidgets.push(w); - this.editor && this.editor.renderer.updateFull(); + this.getFoldWidgetRange = function (session, foldStyle, row) { + return null; }; - - this.measureWidgets = function(e, renderer) { - var changedWidgets = this.session._changedWidgets; - var config = renderer.layerConfig; - - if (!changedWidgets || !changedWidgets.length) return; - var min = Infinity; - for (var i = 0; i < changedWidgets.length; i++) { - var w = changedWidgets[i]; - if (!w || !w.el) continue; - if (w.session != this.session) continue; - if (!w._inDocument) { - if (this.session.lineWidgets[w.row] != w) - continue; - w._inDocument = true; - renderer.container.appendChild(w.el); - } - - w.h = w.el.offsetHeight; - - if (!w.fixedWidth) { - w.w = w.el.offsetWidth; - w.screenWidth = Math.ceil(w.w / config.characterWidth); - } - - var rowCount = w.h / config.lineHeight; - if (w.coverLine) { - rowCount -= this.session.getRowLineCount(w.row); - if (rowCount < 0) - rowCount = 0; - } - if (w.rowCount != rowCount) { - w.rowCount = rowCount; - if (w.row < min) - min = w.row; + this.indentationBlock = function (session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + while (++row < maxRow) { + var level = session.getLine(row).search(re); + if (level == -1) + continue; + if (level <= startLevel) { + var token = session.getTokenAt(row, 0); + if (!token || token.type !== "string") + break; } + endRow = row; } - if (min != Infinity) { - this.session._emit("changeFold", {data:{start:{row: min}}}); - this.session.lineWidgetWidth = null; + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); } - this.session._changedWidgets = []; }; - - this.renderWidgets = function(e, renderer) { - var config = renderer.layerConfig; - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) + this.openingBracketBlock = function (session, bracket, row, column, typeRe) { + var start = { row: row, column: column + 1 }; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) return; - var first = Math.min(this.firstRow, config.firstRow); - var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); - - while (first > 0 && !lineWidgets[first]) - first--; - - this.firstRow = config.firstRow; - this.lastRow = config.lastRow; - - renderer.$cursorLayer.config = config; - for (var i = first; i <= last; i++) { - var w = lineWidgets[i]; - if (!w || !w.el) continue; - if (w.hidden) { - w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; - continue; - } - if (!w._inDocument) { - w._inDocument = true; - renderer.container.appendChild(w.el); - } - var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; - if (!w.coverLine) - top += config.lineHeight * this.session.getRowLineCount(w.row); - w.el.style.top = top - config.offset + "px"; - - var left = w.coverGutter ? 0 : renderer.gutterWidth; - if (!w.fixedWidth) - left -= renderer.scrollLeft; - w.el.style.left = left + "px"; - - if (w.fullWidth && w.screenWidth) { - w.el.style.minWidth = config.width + 2 * config.padding + "px"; - } - - if (w.fixedWidth) { - w.el.style.right = renderer.scrollBar.getWidth() + "px"; - } else { - w.el.style.right = ""; - } + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + if (fw == "start" && end.row > start.row) { + end.row--; + end.column = session.getLine(end.row).length; } + return Range.fromPoints(start, end); }; - -}).call(LineWidgets.prototype); - - -exports.LineWidgets = LineWidgets; + this.closingBracketBlock = function (session, bracket, row, column, typeRe) { + var end = { row: row, column: column }; + var start = session.$findOpeningBracket(bracket, end); + if (!start) + return; + start.column++; + end.column--; + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); }); -define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +define("ace/ext/error_marker",["require","exports","module","ace/lib/dom","ace/range","ace/config"], function(require, exports, module){/** + * ## Error Marker extension + * + * Provides inline error display functionality for Ace editor. Creates visual error markers that appear as tooltips + * below editor lines containing annotations (errors, warnings, info). Enables navigation between error locations with + * keyboard shortcuts and displays context-sensitive messages with proper styling based on annotation severity. + * + * @module + */ "use strict"; -var LineWidgets = require("../line_widgets").LineWidgets; var dom = require("../lib/dom"); var Range = require("../range").Range; - +var nls = require("../config").nls; function binarySearch(array, needle, comparator) { var first = 0; var last = array.length - 1; - while (first <= last) { var mid = (first + last) >> 1; var c = comparator(needle, array[mid]); @@ -21315,25 +21837,20 @@ function binarySearch(array, needle, comparator) { } return -(first + 1); } - function findAnnotations(session, row, dir) { var annotations = session.getAnnotations().sort(Range.comparePoints); if (!annotations.length) return; - - var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints); + var i = binarySearch(annotations, { row: row, column: -1 }, Range.comparePoints); if (i < 0) i = -i - 1; - if (i >= annotations.length) i = dir > 0 ? 0 : annotations.length - 1; else if (i === 0 && dir < 0) i = annotations.length - 1; - var annotation = annotations[i]; if (!annotation || !dir) return; - if (annotation.row === row) { do { annotation = annotations[i += dir]; @@ -21341,8 +21858,6 @@ function findAnnotations(session, row, dir) { if (!annotation) return annotations.slice(); } - - var matched = []; row = annotation.row; do { @@ -21351,22 +21866,17 @@ function findAnnotations(session, row, dir) { } while (annotation && annotation.row == row); return matched.length && matched; } - -exports.showErrorMarker = function(editor, dir) { +exports.showErrorMarker = function (editor, dir) { var session = editor.session; - if (!session.widgetManager) { - session.widgetManager = new LineWidgets(session); - session.widgetManager.attach(editor); - } - var pos = editor.getCursorPosition(); var row = pos.row; - var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function (w) { return w.type == "errorMarker"; })[0]; if (oldWidget) { oldWidget.destroy(); - } else { + } + else { row -= dir; } var annotations = findAnnotations(session, row, dir); @@ -21378,19 +21888,20 @@ exports.showErrorMarker = function(editor, dir) { : annotation.column) || 0; pos.row = annotation.row; gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; - } else if (oldWidget) { + } + else if (oldWidget) { return; - } else { + } + else { gutterAnno = { - text: ["Looks good!"], + displayText: [nls("error-marker.good-state", "Looks good!")], className: "ace_ok" }; } editor.session.unfold(pos.row); editor.selection.moveToPosition(pos); - var w = { - row: pos.row, + row: pos.row, fixedWidth: true, coverGutter: true, el: dom.createElement("div"), @@ -21399,25 +21910,25 @@ exports.showErrorMarker = function(editor, dir) { var el = w.el.appendChild(dom.createElement("div")); var arrow = w.el.appendChild(dom.createElement("div")); arrow.className = "error_widget_arrow " + gutterAnno.className; - var left = editor.renderer.$cursorLayer .getPixelPosition(pos).left; arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; - w.el.className = "error_widget_wrapper"; el.className = "error_widget " + gutterAnno.className; - el.innerHTML = gutterAnno.text.join("
"); - + gutterAnno.displayText.forEach(function (annoTextLine, i) { + el.appendChild(dom.createTextNode(annoTextLine)); + if (i < gutterAnno.displayText.length - 1) { + el.appendChild(dom.createElement("br")); + } + }); el.appendChild(dom.createElement("div")); - - var kb = function(_, hashId, keyString) { + var kb = function (_, hashId, keyString) { if (hashId === 0 && (keyString === "esc" || keyString === "return")) { w.destroy(); - return {command: "null"}; + return { command: "null" }; } }; - - w.destroy = function() { + w.destroy = function () { if (editor.$mouseHandler.isMousePressed) return; editor.keyBinding.removeKeyboardHandler(kb); @@ -21427,66 +21938,27 @@ exports.showErrorMarker = function(editor, dir) { editor.off("mouseup", w.destroy); editor.off("change", w.destroy); }; - editor.keyBinding.addKeyboardHandler(kb); editor.on("changeSelection", w.destroy); editor.on("changeSession", w.destroy); editor.on("mouseup", w.destroy); editor.on("change", w.destroy); - editor.session.widgetManager.addLineWidget(w); - w.el.onmousedown = editor.focus.bind(editor); - - editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight}); + editor.renderer.scrollCursorIntoView(null, 0.5, { bottom: w.el.offsetHeight }); }; - - -dom.importCssString("\ - .error_widget_wrapper {\ - background: inherit;\ - color: inherit;\ - border:none\ - }\ - .error_widget {\ - border-top: solid 2px;\ - border-bottom: solid 2px;\ - margin: 5px 0;\ - padding: 10px 40px;\ - white-space: pre-wrap;\ - }\ - .error_widget.ace_error, .error_widget_arrow.ace_error{\ - border-color: #ff5a5a\ - }\ - .error_widget.ace_warning, .error_widget_arrow.ace_warning{\ - border-color: #F1D817\ - }\ - .error_widget.ace_info, .error_widget_arrow.ace_info{\ - border-color: #5a5a5a\ - }\ - .error_widget.ace_ok, .error_widget_arrow.ace_ok{\ - border-color: #5aaa5a\ - }\ - .error_widget_arrow {\ - position: absolute;\ - border: solid 5px;\ - border-top-color: transparent!important;\ - border-right-color: transparent!important;\ - border-left-color: transparent!important;\ - top: -5px;\ - }\ -", "error_marker.css", false); +dom.importCssString("\n .error_widget_wrapper {\n background: inherit;\n color: inherit;\n border:none\n }\n .error_widget {\n border-top: solid 2px;\n border-bottom: solid 2px;\n margin: 5px 0;\n padding: 10px 40px;\n white-space: pre-wrap;\n }\n .error_widget.ace_error, .error_widget_arrow.ace_error{\n border-color: #ff5a5a\n }\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\n border-color: #F1D817\n }\n .error_widget.ace_info, .error_widget_arrow.ace_info{\n border-color: #5a5a5a\n }\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\n border-color: #5aaa5a\n }\n .error_widget_arrow {\n position: absolute;\n border: solid 5px;\n border-top-color: transparent!important;\n border-right-color: transparent!important;\n border-left-color: transparent!important;\n top: -5px;\n }\n", "error_marker.css", false); }); -define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +define("ace/ace",["require","exports","module","ace/lib/dom","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config","ace/loader_build"], function(require, exports, module){/** + * The main class required to set up an Ace instance in the browser. + * + * @namespace Ace + **/ "use strict"; - -require("./lib/fixoldbrowsers"); - +require("./loader_build")(exports) var dom = require("./lib/dom"); -var event = require("./lib/event"); - var Range = require("./range").Range; var Editor = require("./editor").Editor; var EditSession = require("./edit_session").EditSession; @@ -21499,53 +21971,43 @@ require("./multi_select"); require("./mode/folding/fold_mode"); require("./theme/textmate"); require("./ext/error_marker"); - exports.config = require("./config"); -exports.require = require; - -if (typeof define === "function") - exports.define = define; -exports.edit = function(el, options) { +exports.edit = function (el, options) { if (typeof el == "string") { var _id = el; el = document.getElementById(_id); if (!el) throw new Error("ace.edit can't find div #" + _id); } - if (el && el.env && el.env.editor instanceof Editor) return el.env.editor; - var value = ""; if (el && /input|textarea/i.test(el.tagName)) { var oldNode = el; value = oldNode.value; el = dom.createElement("pre"); oldNode.parentNode.replaceChild(el, oldNode); - } else if (el) { + } + else if (el) { value = el.textContent; el.innerHTML = ""; } - var doc = exports.createEditSession(value); - var editor = new Editor(new Renderer(el), doc, options); - var env = { document: doc, editor: editor, onResize: editor.resize.bind(editor, null) }; - if (oldNode) env.textarea = oldNode; - event.addListener(window, "resize", env.onResize); - editor.on("destroy", function() { - event.removeListener(window, "resize", env.onResize); + if (oldNode) + env.textarea = oldNode; + editor.on("destroy", function () { env.editor.container.env = null; // prevent memory leak on old ie }); editor.container.env = editor.env = env; return editor; }; -exports.createEditSession = function(text, mode) { +exports.createEditSession = function (text, mode) { var doc = new EditSession(text, mode); doc.setUndoManager(new UndoManager()); return doc; @@ -21555,20 +22017,28 @@ exports.Editor = Editor; exports.EditSession = EditSession; exports.UndoManager = UndoManager; exports.VirtualRenderer = Renderer; -exports.version = exports.config.version; +var version = exports.config.version; +exports.version = version; + }); (function() { window.require(["ace/ace"], function(a) { if (a) { a.config.init(true); a.define = window.define; } - if (!window.ace) - window.ace = a; + var global = (function () { + return this; + })(); + if (!global && typeof window != "undefined") global = window; // can happen in strict mode + if (!global && typeof self != "undefined") global = self; // can happen in webworker + + if (!global.ace) + global.ace = a; for (var key in a) if (a.hasOwnProperty(key)) - window.ace[key] = a[key]; - window.ace["default"] = window.ace; + global.ace[key] = a[key]; + global.ace["default"] = global.ace; if (typeof module == "object" && typeof exports == "object" && module) { - module.exports = window.ace; + module.exports = global.ace; } }); })(); diff --git a/app/Resources/ui/js/ace/ext-beautify.js b/app/Resources/ui/js/ace/ext-beautify.js index 6c8826f..b17ea0b 100644 --- a/app/Resources/ui/js/ace/ext-beautify.js +++ b/app/Resources/ui/js/ace/ext-beautify.js @@ -1,18 +1,28 @@ -define("ace/ext/beautify",["require","exports","module","ace/token_iterator"], function(require, exports, module) { +define("ace/ext/beautify",["require","exports","module","ace/token_iterator"], function(require, exports, module){/** + * ## Code beautification and formatting extension. + * + * **This extension is considered outdated.** For better formatting support with modern language servers + * and advanced formatting capabilities, consider using [ace-linters](https://github.com/mkslanc/ace-linters) + * which provides comprehensive language support including formatting, linting, and IntelliSense features. + * + * This legacy extension provides basic formatting for HTML, CSS, JavaScript, and PHP code with support for + * proper indentation, whitespace management, line breaks, and bracket alignment. It handles various language + * constructs including HTML tags, CSS selectors, JavaScript operators, control structures, and maintains + * consistent code style throughout the document. + * + * @module + */ "use strict"; var TokenIterator = require("../token_iterator").TokenIterator; - function is(token, type) { return token.type.lastIndexOf(type + ".xml") > -1; } exports.singletonTags = ["area", "base", "br", "col", "command", "embed", "hr", "html", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; exports.blockTags = ["article", "aside", "blockquote", "body", "div", "dl", "fieldset", "footer", "form", "head", "header", "html", "nav", "ol", "p", "script", "section", "style", "table", "tbody", "tfoot", "thead", "ul"]; - exports.formatOptions = { lineBreaksAfterCommasInCurlyBlock: true }; - -exports.beautify = function(session) { +exports.beautify = function (session) { var iterator = new TokenIterator(session, 0, 0); var token = iterator.getCurrentToken(); var tabString = session.getTabString(); @@ -43,40 +53,32 @@ exports.beautify = function(session) { var inTag = false; var inCSS = false; var inBlock = false; - var levels = {0: 0}; + var levels = { 0: 0 }; var parents = []; var caseBody = false; - - var trimNext = function() { + var trimNext = function () { if (nextToken && nextToken.value && nextToken.type !== 'string.regexp') nextToken.value = nextToken.value.replace(/^\s*/, ""); }; - - var trimLine = function() { + var trimLine = function () { var end = code.length - 1; - while (true) { if (end == 0) break; if (code[end] !== " ") break; - end = end - 1; } - code = code.slice(0, end + 1); }; - - var trimCode = function() { + var trimCode = function () { code = code.trimRight(); breakBefore = false; }; - while (token !== null) { curRow = iterator.getCurrentTokenRow(); rowTokens = iterator.$rowTokens; nextToken = iterator.stepForward(); - if (typeof token !== "undefined") { value = token.value; unindent = 0; @@ -88,18 +90,19 @@ exports.beautify = function(session) { if (value === " 0; rowsToAdd--) code += "\n"; - breakBefore = true; if (!is(token, "comment") && !token.type.match(/^(comment|string)$/)) - value = value.trimLeft(); + value = value.trimLeft(); } - if (value) { if (token.type === "keyword" && value.match(/^(if|else|elseif|for|foreach|while|switch)$/)) { parents[depth] = value; - trimNext(); spaceAfter = true; if (value.match(/^(else|elseif)$/)) { @@ -134,13 +132,13 @@ exports.beautify = function(session) { spaceBefore = true; } } - } else if (token.type === "paren.lparen") { + } + else if (token.type === "paren.lparen") { trimNext(); if (value.substr(-1) === "{") { spaceAfter = true; indentNextLine = false; - - if(!inTag) + if (!inTag) rowsToAdd = 1; } if (value.substr(0, 1) === "{") { @@ -148,25 +146,27 @@ exports.beautify = function(session) { if (code.substr(-1) !== '[' && code.trimRight().substr(-1) === '[') { trimCode(); spaceBefore = false; - } else if (code.trimRight().substr(-1) === ')') { + } + else if (code.trimRight().substr(-1) === ')') { trimCode(); - } else { + } + else { trimLine(); } } - } else if (token.type === "paren.rparen") { + } + else if (token.type === "paren.rparen") { unindent = 1; if (value.substr(0, 1) === "}") { - if (parents[depth-1] === 'case') + if (parents[depth - 1] === 'case') unindent++; - if (code.trimRight().substr(-1) === '{') { trimCode(); - } else { + } + else { spaceBefore = true; - if (inCSS) - rowsToAdd+=2; + rowsToAdd += 2; } } if (value.substr(0, 1) === "]") { @@ -183,80 +183,81 @@ exports.beautify = function(session) { trimCode(); } } - trimLine(); - } else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) { + } + else if ((token.type === "keyword.operator" || token.type === "keyword") && value.match(/^(=|==|===|!=|!==|&&|\|\||and|or|xor|\+=|.=|>|>=|<|<=|=>)$/)) { trimCode(); trimNext(); spaceBefore = true; spaceAfter = true; - } else if (token.type === "punctuation.operator" && value === ';') { + } + else if (token.type === "punctuation.operator" && value === ';') { trimCode(); trimNext(); spaceAfter = true; - if (inCSS) rowsToAdd++; - } else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) { + } + else if (token.type === "punctuation.operator" && value.match(/^(:|,)$/)) { trimCode(); trimNext(); - if (value.match(/^(,)$/) && curlyDepth>0 && roundDepth===0 && formatOptions.lineBreaksAfterCommasInCurlyBlock) { + if (value.match(/^(,)$/) && curlyDepth > 0 && roundDepth === 0 && formatOptions.lineBreaksAfterCommasInCurlyBlock) { rowsToAdd++; - } else { + } + else { spaceAfter = true; breakBefore = false; } - } else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) { + } + else if (token.type === "support.php_tag" && value === "?>" && !breakBefore) { trimCode(); spaceBefore = true; - } else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) { + } + else if (is(token, "attribute-name") && code.substr(-1).match(/^\s$/)) { spaceBefore = true; - } else if (is(token, "attribute-equals")) { + } + else if (is(token, "attribute-equals")) { trimLine(); trimNext(); - } else if (is(token, "tag-close")) { + } + else if (is(token, "tag-close")) { trimLine(); - if(value === "/>") + if (value === "/>") spaceBefore = true; - } else if (token.type === "keyword" && value.match(/^(case|default)$/)) { + } + else if (token.type === "keyword" && value.match(/^(case|default)$/)) { if (caseBody) unindent = 1; } if (breakBefore && !(token.type.match(/^(comment)$/) && !value.substr(0, 1).match(/^[/#]$/)) && !(token.type.match(/^(string)$/) && !value.substr(0, 1).match(/^['"@]$/))) { - indent = lastIndent; - - if(depth > lastDepth) { + if (depth > lastDepth) { indent++; - - for (i=depth; i > lastDepth; i--) + for (i = depth; i > lastDepth; i--) levels[i] = indent; - } else if(depth < lastDepth) + } + else if (depth < lastDepth) indent = levels[depth]; - lastDepth = depth; lastIndent = indent; - - if(unindent) + if (unindent) indent -= unindent; - if (indentNextLine && !roundDepth) { indent++; indentNextLine = false; } - for (i = 0; i < indent; i++) code += tabString; } - if (token.type === "keyword" && value.match(/^(case|default)$/)) { if (caseBody === false) { parents[depth] = value; depth++; caseBody = true; } - } else if (token.type === "keyword" && value.match(/^(break)$/)) { - if(parents[depth-1] && parents[depth-1].match(/^(case|default)$/)) { + } + else if (token.type === "keyword" && value.match(/^(break)$/)) { + if (parents[depth - 1] && parents[depth - 1].match(/^(case|default)$/)) { depth--; caseBody = false; } @@ -266,25 +267,22 @@ exports.beautify = function(session) { curlyDepth += (value.match(/\{/g) || []).length; depth += value.length; } - if (token.type === "keyword" && value.match(/^(if|else|elseif|for|while)$/)) { indentNextLine = true; roundDepth = 0; - } else if (!roundDepth && value.trim() && token.type !== "comment") + } + else if (!roundDepth && value.trim() && token.type !== "comment") indentNextLine = false; - if (token.type === "paren.rparen") { roundDepth -= (value.match(/\)/g) || []).length; curlyDepth -= (value.match(/\}/g) || []).length; - for (i = 0; i < value.length; i++) { depth--; - if(value.substr(i, 1)==='}' && parents[depth]==='case') { + if (value.substr(i, 1) === '}' && parents[depth] === 'case') { depth--; } } } - if (token.type == "text") value = value.replace(/\s+$/, " "); if (spaceBefore && !breakBefore) { @@ -292,12 +290,9 @@ exports.beautify = function(session) { if (code.substr(-1) !== "\n") code += " "; } - code += value; - if (spaceAfter) code += " "; - breakBefore = false; spaceBefore = false; spaceAfter = false; @@ -310,36 +305,33 @@ exports.beautify = function(session) { if (nextToken && singletonTags.indexOf(nextToken.value) === -1) { if (is(token, "tag-open") && value === ""){ + } + else if (is(token, "tag-close") && value === "/>") { depth--; } } - if (is(token, "tag-name")) { tagName = value; } - row = curRow; } } - token = nextToken; } - code = code.trim(); session.doc.setValue(code); }; - exports.commands = [{ - name: "beautify", - description: "Format selection (Beautify)", - exec: function(editor) { - exports.beautify(editor.session); - }, - bindKey: "Ctrl-Shift-B" -}]; + name: "beautify", + description: "Format selection (Beautify)", + exec: function (editor) { + exports.beautify(editor.session); + }, + bindKey: "Ctrl-Shift-B" + }]; }); (function() { window.require(["ace/ext/beautify"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-code_lens.js b/app/Resources/ui/js/ace/ext-code_lens.js index 19a4c20..a8d5aa5 100644 --- a/app/Resources/ui/js/ace/ext-code_lens.js +++ b/app/Resources/ui/js/ace/ext-code_lens.js @@ -1,18 +1,21 @@ -define("ace/ext/code_lens",["require","exports","module","ace/line_widgets","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/code_lens",["require","exports","module","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/editor","ace/config"], function(require, exports, module){/** + * ## Code Lens extension. + * + * Displaying contextual information and clickable commands above code lines. Supports registering custom providers, + * rendering lens widgets with proper positioning and styling, and handling user interactions with lens commands. + * @module + */ "use strict"; -var LineWidgets = require("../line_widgets").LineWidgets; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - function clearLensElements(renderer) { var textLayer = renderer.$textLayer; var lensElements = textLayer.$lenses; if (lensElements) - lensElements.forEach(function(el) {el.remove(); }); + lensElements.forEach(function (el) { el.remove(); }); textLayer.$lenses = null; } - function renderWidgets(changes, renderer) { var changed = changes & renderer.CHANGE_LINES || changes & renderer.CHANGE_FULL @@ -20,7 +23,6 @@ function renderWidgets(changes, renderer) { || changes & renderer.CHANGE_TEXT; if (!changed) return; - var session = renderer.session; var lineWidgets = renderer.session.lineWidgets; var textLayer = renderer.$textLayer; @@ -30,49 +32,42 @@ function renderWidgets(changes, renderer) { clearLensElements(renderer); return; } - var textCells = renderer.$textLayer.$lines.cells; var config = renderer.layerConfig; var padding = renderer.$padding; - if (!lensElements) lensElements = textLayer.$lenses = []; - - var index = 0; for (var i = 0; i < textCells.length; i++) { var row = textCells[i].row; var widget = lineWidgets[row]; var lenses = widget && widget.lenses; - - if (!lenses || !lenses.length) continue; - + if (!lenses || !lenses.length) + continue; var lensContainer = lensElements[index]; if (!lensContainer) { lensContainer = lensElements[index] - = dom.buildDom(["div", {class: "ace_codeLens"}], renderer.container); + = dom.buildDom(["div", { class: "ace_codeLens" }], renderer.container); } lensContainer.style.height = config.lineHeight + "px"; index++; - for (var j = 0; j < lenses.length; j++) { var el = lensContainer.childNodes[2 * j]; if (!el) { - if (j != 0) lensContainer.appendChild(dom.createTextNode("\xa0|\xa0")); + if (j != 0) + lensContainer.appendChild(dom.createTextNode("\xa0|\xa0")); el = dom.buildDom(["a"], lensContainer); } el.textContent = lenses[j].title; - el.lensCommand = lenses[j]; + (el).lensCommand = lenses[j]; } while (lensContainer.childNodes.length > 2 * j - 1) lensContainer.lastChild.remove(); - var top = renderer.$cursorLayer.getPixelPosition({ row: row, column: 0 }, true).top - config.lineHeight * widget.rowsAbove - config.offset; lensContainer.style.top = top + "px"; - var left = renderer.gutterWidth; var indent = session.getLine(row).search(/\S|$/); if (indent == -1) @@ -83,21 +78,19 @@ function renderWidgets(changes, renderer) { while (index < lensElements.length) lensElements.pop().remove(); } - function clearCodeLensWidgets(session) { - if (!session.lineWidgets) return; + if (!session.lineWidgets) + return; var widgetManager = session.widgetManager; - session.lineWidgets.forEach(function(widget) { + session.lineWidgets.forEach(function (widget) { if (widget && widget.lenses) widgetManager.removeLineWidget(widget); }); } - -exports.setLenses = function(session, lenses) { +exports.setLenses = function (session, lenses) { var firstRow = Number.MAX_VALUE; - clearCodeLensWidgets(session); - lenses && lenses.forEach(function(lens) { + lenses && lenses.forEach(function (lens) { var row = lens.start.row; var column = lens.start.column; var widget = session.lineWidgets && session.lineWidgets[row]; @@ -114,37 +107,33 @@ exports.setLenses = function(session, lenses) { if (row < firstRow) firstRow = row; }); - session._emit("changeFold", {data: {start: {row: firstRow}}}); + session._emit("changeFold", { data: { start: { row: firstRow } } }); return firstRow; }; - function attachToEditor(editor) { editor.codeLensProviders = []; editor.renderer.on("afterRender", renderWidgets); if (!editor.$codeLensClickHandler) { - editor.$codeLensClickHandler = function(e) { + editor.$codeLensClickHandler = function (e) { var command = e.target.lensCommand; - if (!command) return; + if (!command) + return; editor.execCommand(command.id, command.arguments); editor._emit("codeLensClick", e); }; event.addListener(editor.container, "click", editor.$codeLensClickHandler, editor); } - editor.$updateLenses = function() { + editor.$updateLenses = function () { var session = editor.session; - if (!session) return; - - if (!session.widgetManager) { - session.widgetManager = new LineWidgets(session); - session.widgetManager.attach(editor); - } - + if (!session) + return; var providersToWaitNum = editor.codeLensProviders.length; var lenses = []; - editor.codeLensProviders.forEach(function(provider) { - provider.provideCodeLenses(session, function(err, payload) { - if (err) return; - payload.forEach(function(lens) { + editor.codeLensProviders.forEach(function (provider) { + provider.provideCodeLenses(session, function (err, payload) { + if (err) + return; + payload.forEach(function (lens) { lenses.push(lens); }); providersToWaitNum--; @@ -153,85 +142,57 @@ function attachToEditor(editor) { } }); }); - function applyLenses() { var cursor = session.selection.cursor; var oldRow = session.documentToScreenRow(cursor); var scrollTop = session.getScrollTop(); var firstRow = exports.setLenses(session, lenses); - var lastDelta = session.$undoManager && session.$undoManager.$lastDelta; if (lastDelta && lastDelta.action == "remove" && lastDelta.lines.length > 1) return; var row = session.documentToScreenRow(cursor); var lineHeight = editor.renderer.layerConfig.lineHeight; var top = session.getScrollTop() + (row - oldRow) * lineHeight; - if (firstRow == 0 && scrollTop < lineHeight /4 && scrollTop > -lineHeight/4) { + if (firstRow == 0 && scrollTop < lineHeight / 4 && scrollTop > -lineHeight / 4) { top = -lineHeight; } session.setScrollTop(top); } }; var updateLenses = lang.delayedCall(editor.$updateLenses); - editor.$updateLensesOnInput = function() { + editor.$updateLensesOnInput = function () { updateLenses.delay(250); }; editor.on("input", editor.$updateLensesOnInput); } - function detachFromEditor(editor) { editor.off("input", editor.$updateLensesOnInput); editor.renderer.off("afterRender", renderWidgets); if (editor.$codeLensClickHandler) editor.container.removeEventListener("click", editor.$codeLensClickHandler); } - -exports.registerCodeLensProvider = function(editor, codeLensProvider) { +exports.registerCodeLensProvider = function (editor, codeLensProvider) { editor.setOption("enableCodeLens", true); editor.codeLensProviders.push(codeLensProvider); editor.$updateLensesOnInput(); }; - -exports.clear = function(session) { +exports.clear = function (session) { exports.setLenses(session, null); }; - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableCodeLens: { - set: function(val) { + set: function (val) { if (val) { attachToEditor(this); - } else { + } + else { detachFromEditor(this); } } } }); - -dom.importCssString("\ -.ace_codeLens {\ - position: absolute;\ - color: #aaa;\ - font-size: 88%;\ - background: inherit;\ - width: 100%;\ - display: flex;\ - align-items: flex-end;\ - pointer-events: none;\ -}\ -.ace_codeLens > a {\ - cursor: pointer;\ - pointer-events: auto;\ -}\ -.ace_codeLens > a:hover {\ - color: #0000ff;\ - text-decoration: underline;\ -}\ -.ace_dark > .ace_codeLens > a:hover {\ - color: #4e94ce;\ -}\ -", "codelense.css", false); +dom.importCssString("\n.ace_codeLens {\n position: absolute;\n color: #aaa;\n font-size: 88%;\n background: inherit;\n width: 100%;\n display: flex;\n align-items: flex-end;\n pointer-events: none;\n}\n.ace_codeLens > a {\n cursor: pointer;\n pointer-events: auto;\n}\n.ace_codeLens > a:hover {\n color: #0000ff;\n text-decoration: underline;\n}\n.ace_dark > .ace_codeLens > a:hover {\n color: #4e94ce;\n}\n", "codelense.css", false); }); (function() { window.require(["ace/ext/code_lens"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js index 855666a..54d7587 100644 --- a/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js +++ b/app/Resources/ui/js/ace/ext-elastic_tabstops_lite.js @@ -1,44 +1,48 @@ -define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Elastic Tabstops Lite extension. + * + * Automatically adjusts tab spacing to align content in tabular format by calculating optimal column widths + * and maintaining consistent vertical alignment across multiple lines. Tracks content changes and dynamically + * reprocesses affected rows to ensure proper formatting without manual intervention. + * + * **Enable:** `editor.setOption("useElasticTabstops", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - -var ElasticTabstopsLite = function(editor) { - this.$editor = editor; - var self = this; - var changedRows = []; - var recordChanges = false; - this.onAfterExec = function() { - recordChanges = false; - self.processRows(changedRows); - changedRows = []; - }; - this.onExec = function() { - recordChanges = true; - }; - this.onChange = function(delta) { - if (recordChanges) { - if (changedRows.indexOf(delta.start.row) == -1) - changedRows.push(delta.start.row); - if (delta.end.row != delta.start.row) - changedRows.push(delta.end.row); - } - }; -}; - -(function() { - this.processRows = function(rows) { +var ElasticTabstopsLite = /** @class */ (function () { + function ElasticTabstopsLite(editor) { + this.$editor = editor; + var self = this; + var changedRows = []; + var recordChanges = false; + this.onAfterExec = function () { + recordChanges = false; + self.processRows(changedRows); + changedRows = []; + }; + this.onExec = function () { + recordChanges = true; + }; + this.onChange = function (delta) { + if (recordChanges) { + if (changedRows.indexOf(delta.start.row) == -1) + changedRows.push(delta.start.row); + if (delta.end.row != delta.start.row) + changedRows.push(delta.end.row); + } + }; + } + ElasticTabstopsLite.prototype.processRows = function (rows) { this.$inChange = true; var checkedRows = []; - for (var r = 0, rowCount = rows.length; r < rowCount; r++) { var row = rows[r]; - if (checkedRows.indexOf(row) > -1) continue; - var cellWidthObj = this.$findCellWidthsForBlock(row); var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); var rowIndex = cellWidthObj.firstRow; - for (var w = 0, l = cellWidths.length; w < l; w++) { var widths = cellWidths[w]; checkedRows.push(rowIndex); @@ -48,68 +52,53 @@ var ElasticTabstopsLite = function(editor) { } this.$inChange = false; }; - - this.$findCellWidthsForBlock = function(row) { + ElasticTabstopsLite.prototype.$findCellWidthsForBlock = function (row) { var cellWidths = [], widths; var rowIter = row; while (rowIter >= 0) { widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; - cellWidths.unshift(widths); rowIter--; } var firstRow = rowIter + 1; rowIter = row; var numRows = this.$editor.session.getLength(); - while (rowIter < numRows - 1) { rowIter++; - widths = this.$cellWidthsForRow(rowIter); if (widths.length == 0) break; - cellWidths.push(widths); } - return { cellWidths: cellWidths, firstRow: firstRow }; }; - - this.$cellWidthsForRow = function(row) { + ElasticTabstopsLite.prototype.$cellWidthsForRow = function (row) { var selectionColumns = this.$selectionColumnsForRow(row); - var tabs = [-1].concat(this.$tabsForRow(row)); - var widths = tabs.map(function(el) { return 0; } ).slice(1); + var widths = tabs.map(function (el) { return 0; }).slice(1); var line = this.$editor.session.getLine(row); - for (var i = 0, len = tabs.length - 1; i < len; i++) { - var leftEdge = tabs[i]+1; - var rightEdge = tabs[i+1]; - + var leftEdge = tabs[i] + 1; + var rightEdge = tabs[i + 1]; var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge); var cell = line.substring(leftEdge, rightEdge); - widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge); + widths[i] = Math.max(cell.replace(/\s+$/g, '').length, rightmostSelection - leftEdge); } - return widths; }; - - this.$selectionColumnsForRow = function(row) { + ElasticTabstopsLite.prototype.$selectionColumnsForRow = function (row) { var selections = [], cursor = this.$editor.getCursorPosition(); if (this.$editor.session.getSelection().isEmpty()) { if (row == cursor.row) selections.push(cursor.column); } - return selections; }; - - this.$setBlockCellWidthsToMax = function(cellWidths) { + ElasticTabstopsLite.prototype.$setBlockCellWidthsToMax = function (cellWidths) { var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth; var columnInfo = this.$izip_longest(cellWidths); - for (var c = 0, l = columnInfo.length; c < l; c++) { var column = columnInfo[c]; if (!column.push) { @@ -117,7 +106,6 @@ var ElasticTabstopsLite = function(editor) { continue; } column.push(NaN); - for (var r = 0, s = column.length; r < s; r++) { var width = column[r]; if (startingNewBlock) { @@ -127,23 +115,18 @@ var ElasticTabstopsLite = function(editor) { } if (isNaN(width)) { blockEndRow = r; - for (var j = blockStartRow; j < blockEndRow; j++) { cellWidths[j][c] = maxWidth; } startingNewBlock = true; } - maxWidth = Math.max(maxWidth, width); } } - return cellWidths; }; - - this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) { + ElasticTabstopsLite.prototype.$rightmostSelectionInCell = function (selectionColumns, cellRightEdge) { var rightmost = 0; - if (selectionColumns.length) { var lengths = []; for (var s = 0, length = selectionColumns.length; s < length; s++) { @@ -154,70 +137,53 @@ var ElasticTabstopsLite = function(editor) { } rightmost = Math.max.apply(Math, lengths); } - return rightmost; }; - - this.$tabsForRow = function(row) { - var rowTabs = [], line = this.$editor.session.getLine(row), - re = /\t/g, match; - + ElasticTabstopsLite.prototype.$tabsForRow = function (row) { + var rowTabs = [], line = this.$editor.session.getLine(row), re = /\t/g, match; while ((match = re.exec(line)) != null) { rowTabs.push(match.index); } - return rowTabs; }; - - this.$adjustRow = function(row, widths) { + ElasticTabstopsLite.prototype.$adjustRow = function (row, widths) { var rowTabs = this.$tabsForRow(row); - if (rowTabs.length == 0) return; - var bias = 0, location = -1; var expandedSet = this.$izip(widths, rowTabs); - for (var i = 0, l = expandedSet.length; i < l; i++) { var w = expandedSet[i][0], it = expandedSet[i][1]; location += 1 + w; it += bias; var difference = location - it; - if (difference == 0) continue; - - var partialLine = this.$editor.session.getLine(row).substr(0, it ); + var partialLine = this.$editor.session.getLine(row).substr(0, it); var strippedPartialLine = partialLine.replace(/\s*$/g, ""); var ispaces = partialLine.length - strippedPartialLine.length; - if (difference > 0) { - this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t"); + this.$editor.session.getDocument().insertInLine({ row: row, column: it + 1 }, Array(difference + 1).join(" ") + "\t"); this.$editor.session.getDocument().removeInLine(row, it, it + 1); - bias += difference; } - if (difference < 0 && ispaces >= -difference) { this.$editor.session.getDocument().removeInLine(row, it + difference, it); bias += difference; } } }; - this.$izip_longest = function(iterables) { + ElasticTabstopsLite.prototype.$izip_longest = function (iterables) { if (!iterables[0]) return []; var longest = iterables[0].length; var iterablesLength = iterables.length; - for (var i = 1; i < iterablesLength; i++) { var iLength = iterables[i].length; if (iLength > longest) longest = iLength; } - var expandedSet = []; - for (var l = 0; l < longest; l++) { var set = []; for (var i = 0; i < iterablesLength; i++) { @@ -226,39 +192,34 @@ var ElasticTabstopsLite = function(editor) { else set.push(iterables[i][l]); } - expandedSet.push(set); } - - return expandedSet; }; - this.$izip = function(widths, tabs) { + ElasticTabstopsLite.prototype.$izip = function (widths, tabs) { var size = widths.length >= tabs.length ? tabs.length : widths.length; - var expandedSet = []; for (var i = 0; i < size; i++) { - var set = [ widths[i], tabs[i] ]; + var set = [widths[i], tabs[i]]; expandedSet.push(set); } return expandedSet; }; - -}).call(ElasticTabstopsLite.prototype); - + return ElasticTabstopsLite; +}()); exports.ElasticTabstopsLite = ElasticTabstopsLite; - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { useElasticTabstops: { - set: function(val) { + set: function (val) { if (val) { if (!this.elasticTabstops) this.elasticTabstops = new ElasticTabstopsLite(this); this.commands.on("afterExec", this.elasticTabstops.onAfterExec); this.commands.on("exec", this.elasticTabstops.onExec); this.on("change", this.elasticTabstops.onChange); - } else if (this.elasticTabstops) { + } + else if (this.elasticTabstops) { this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec); this.commands.removeListener("exec", this.elasticTabstops.onExec); this.removeListener("change", this.elasticTabstops.onChange); diff --git a/app/Resources/ui/js/ace/ext-emmet.js b/app/Resources/ui/js/ace/ext-emmet.js index 68fc0ff..6650ffe 100644 --- a/app/Resources/ui/js/ace/ext-emmet.js +++ b/app/Resources/ui/js/ace/ext-emmet.js @@ -1,5 +1,4 @@ -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -9,107 +8,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); }; - - this.createTokenizer = function() { + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -118,118 +110,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -238,21 +227,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -265,12 +253,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -279,16 +270,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -306,34 +295,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -344,142 +336,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -495,11 +380,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -509,26 +392,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -538,20 +418,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -560,7 +434,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -568,21 +441,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -592,14 +459,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -608,7 +475,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -617,48 +483,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -669,9 +527,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -679,12 +537,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -692,21 +553,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -714,59 +577,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -779,16 +755,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -800,11 +776,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -820,20 +796,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -842,10 +820,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -854,17 +832,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -874,13 +851,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -896,7 +873,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -910,36 +888,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -948,65 +941,58 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","ace/config","resources","resources","tabStops","resources","utils","actions"], function(require, exports, module) { +define("ace/ext/emmet",["require","exports","module","ace/keyboard/hash_handler","ace/editor","ace/snippets","ace/range","ace/config","resources","resources","tabStops","resources","utils","actions"], function(require, exports, module){/** + * ## Emmet extension + * + * Providing HTML/CSS abbreviation expansion, code navigation, and text editing utilities with configurable options and + * keyboard shortcuts for rapid web development workflow. + * + * **Enable:** `editor.setOption("enableEmmet", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; var Editor = require("../editor").Editor; @@ -1014,76 +1000,73 @@ var snippetManager = require("../snippets").snippetManager; var Range = require("../range").Range; var config = require("../config"); var emmet, emmetPath; -function AceEmmetEditor() {} - -AceEmmetEditor.prototype = { - setupContext: function(editor) { +var AceEmmetEditor = /** @class */ (function () { + function AceEmmetEditor() { + } + AceEmmetEditor.prototype.setupContext = function (editor) { this.ace = editor; this.indentation = editor.session.getTabString(); if (!emmet) - emmet = window.emmet; + emmet = window["emmet"]; var resources = emmet.resources || emmet.require("resources"); resources.setVariable("indentation", this.indentation); this.$syntax = null; this.$syntax = this.getSyntax(); - }, - getSelectionRange: function() { + }; + AceEmmetEditor.prototype.getSelectionRange = function () { var range = this.ace.getSelectionRange(); var doc = this.ace.session.doc; return { start: doc.positionToIndex(range.start), end: doc.positionToIndex(range.end) }; - }, - createSelection: function(start, end) { + }; + AceEmmetEditor.prototype.createSelection = function (start, end) { var doc = this.ace.session.doc; this.ace.selection.setRange({ start: doc.indexToPosition(start), end: doc.indexToPosition(end) }); - }, - getCurrentLineRange: function() { + }; + AceEmmetEditor.prototype.getCurrentLineRange = function () { var ace = this.ace; var row = ace.getCursorPosition().row; var lineLength = ace.session.getLine(row).length; - var index = ace.session.doc.positionToIndex({row: row, column: 0}); + var index = ace.session.doc.positionToIndex({ row: row, column: 0 }); return { start: index, end: index + lineLength }; - }, - getCaretPos: function(){ + }; + AceEmmetEditor.prototype.getCaretPos = function () { var pos = this.ace.getCursorPosition(); return this.ace.session.doc.positionToIndex(pos); - }, - setCaretPos: function(index){ + }; + AceEmmetEditor.prototype.setCaretPos = function (index) { var pos = this.ace.session.doc.indexToPosition(index); this.ace.selection.moveToPosition(pos); - }, - getCurrentLine: function() { + }; + AceEmmetEditor.prototype.getCurrentLine = function () { var row = this.ace.getCursorPosition().row; return this.ace.session.getLine(row); - }, - replaceContent: function(value, start, end, noIndent) { + }; + AceEmmetEditor.prototype.replaceContent = function (value, start, end, noIndent) { if (end == null) end = start == null ? this.getContent().length : start; if (start == null) - start = 0; - + start = 0; var editor = this.ace; var doc = editor.session.doc; var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end)); editor.session.remove(range); - range.end = range.start; - value = this.$updateTabstops(value); snippetManager.insertSnippet(editor, value); - }, - getContent: function(){ + }; + AceEmmetEditor.prototype.getContent = function () { return this.ace.getValue(); - }, - getSyntax: function() { + }; + AceEmmetEditor.prototype.getSyntax = function () { if (this.$syntax) return this.$syntax; var syntax = this.ace.session.$modeId.split("/").pop(); @@ -1101,34 +1084,34 @@ AceEmmetEditor.prototype = { } } return syntax; - }, - getProfileName: function() { + }; + AceEmmetEditor.prototype.getProfileName = function () { var resources = emmet.resources || emmet.require("resources"); switch (this.getSyntax()) { - case "css": return "css"; - case "xml": - case "xsl": - return "xml"; - case "html": - var profile = resources.getVariable("profile"); - if (!profile) - profile = this.ace.session.getLines(0,2).join("").search(/]+XHTML/i) != -1 ? "xhtml": "html"; - return profile; - default: - var mode = this.ace.session.$mode; - return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; + case "css": return "css"; + case "xml": + case "xsl": + return "xml"; + case "html": + var profile = resources.getVariable("profile"); + if (!profile) + profile = this.ace.session.getLines(0, 2).join("").search(/]+XHTML/i) != -1 ? "xhtml" : "html"; + return profile; + default: + var mode = this.ace.session.$mode; + return mode.emmetConfig && mode.emmetConfig.profile || "xhtml"; } - }, - prompt: function(title) { + }; + AceEmmetEditor.prototype.prompt = function (title) { return prompt(title); // eslint-disable-line no-alert - }, - getSelection: function() { + }; + AceEmmetEditor.prototype.getSelection = function () { return this.ace.session.getTextRange(); - }, - getFilePath: function() { + }; + AceEmmetEditor.prototype.getFilePath = function () { return ""; - }, - $updateTabstops: function(value) { + }; + AceEmmetEditor.prototype.$updateTabstops = function (value) { var base = 1000; var zeroBase = 0; var lastZero = null; @@ -1136,74 +1119,67 @@ AceEmmetEditor.prototype = { var resources = emmet.resources || emmet.require("resources"); var settings = resources.getVocabulary("user"); var tabstopOptions = { - tabstop: function(data) { + tabstop: function (data) { var group = parseInt(data.group, 10); var isZero = group === 0; if (isZero) group = ++zeroBase; else group += base; - var placeholder = data.placeholder; if (placeholder) { placeholder = ts.processText(placeholder, tabstopOptions); } - var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}'; - if (isZero) { lastZero = [data.start, result]; } - return result; }, - escape: function(ch) { - if (ch == '$') return '\\$'; - if (ch == '\\') return '\\\\'; + escape: function (ch) { + if (ch == '$') + return '\\$'; + if (ch == '\\') + return '\\\\'; return ch; } }; - value = ts.processText(value, tabstopOptions); - if (settings.variables['insert_final_tabstop'] && !/\$\{0\}$/.test(value)) { value += '${0}'; - } else if (lastZero) { + } + else if (lastZero) { var common = emmet.utils ? emmet.utils.common : emmet.require('utils'); value = common.replaceSubstring(value, '${0}', lastZero[0], lastZero[1]); } - return value; - } -}; - - + }; + return AceEmmetEditor; +}()); var keymap = { - expand_abbreviation: {"mac": "ctrl+alt+e", "win": "alt+e"}, - match_pair_outward: {"mac": "ctrl+d", "win": "ctrl+,"}, - match_pair_inward: {"mac": "ctrl+j", "win": "ctrl+shift+0"}, - matching_pair: {"mac": "ctrl+alt+j", "win": "alt+j"}, + expand_abbreviation: { "mac": "ctrl+alt+e", "win": "alt+e" }, + match_pair_outward: { "mac": "ctrl+d", "win": "ctrl+," }, + match_pair_inward: { "mac": "ctrl+j", "win": "ctrl+shift+0" }, + matching_pair: { "mac": "ctrl+alt+j", "win": "alt+j" }, next_edit_point: "alt+right", prev_edit_point: "alt+left", - toggle_comment: {"mac": "command+/", "win": "ctrl+/"}, - split_join_tag: {"mac": "shift+command+'", "win": "shift+ctrl+`"}, - remove_tag: {"mac": "command+'", "win": "shift+ctrl+;"}, - evaluate_math_expression: {"mac": "shift+command+y", "win": "shift+ctrl+y"}, + toggle_comment: { "mac": "command+/", "win": "ctrl+/" }, + split_join_tag: { "mac": "shift+command+'", "win": "shift+ctrl+`" }, + remove_tag: { "mac": "command+'", "win": "shift+ctrl+;" }, + evaluate_math_expression: { "mac": "shift+command+y", "win": "shift+ctrl+y" }, increment_number_by_1: "ctrl+up", decrement_number_by_1: "ctrl+down", increment_number_by_01: "alt+up", decrement_number_by_01: "alt+down", - increment_number_by_10: {"mac": "alt+command+up", "win": "shift+alt+up"}, - decrement_number_by_10: {"mac": "alt+command+down", "win": "shift+alt+down"}, - select_next_item: {"mac": "shift+command+.", "win": "shift+ctrl+."}, - select_previous_item: {"mac": "shift+command+,", "win": "shift+ctrl+,"}, - reflect_css_value: {"mac": "shift+command+r", "win": "shift+ctrl+r"}, - - encode_decode_data_url: {"mac": "shift+ctrl+d", "win": "ctrl+'"}, + increment_number_by_10: { "mac": "alt+command+up", "win": "shift+alt+up" }, + decrement_number_by_10: { "mac": "alt+command+down", "win": "shift+alt+down" }, + select_next_item: { "mac": "shift+command+.", "win": "shift+ctrl+." }, + select_previous_item: { "mac": "shift+command+,", "win": "shift+ctrl+," }, + reflect_css_value: { "mac": "shift+command+r", "win": "shift+ctrl+r" }, + encode_decode_data_url: { "mac": "shift+ctrl+d", "win": "ctrl+'" }, expand_abbreviation_with_tab: "Tab", - wrap_with_abbreviation: {"mac": "shift+ctrl+a", "win": "shift+ctrl+a"} + wrap_with_abbreviation: { "mac": "shift+ctrl+a", "win": "shift+ctrl+a" } }; - var editorProxy = new AceEmmetEditor(); exports.commands = new HashHandler(); exports.runEmmetCommand = function runEmmetCommand(editor) { @@ -1218,15 +1194,14 @@ exports.runEmmetCommand = function runEmmetCommand(editor) { try { editorProxy.setupContext(editor); var actions = emmet.actions || emmet.require("actions"); - if (this.action == "wrap_with_abbreviation") { - return setTimeout(function() { + return setTimeout(function () { actions.run("wrap_with_abbreviation", editorProxy); }, 0); } - var result = actions.run(this.action, editorProxy); - } catch(e) { + } + catch (e) { if (!emmet) { var loading = exports.load(runEmmetCommand.bind(this, editor)); if (this.action == "expand_abbreviation_with_tab") @@ -1239,7 +1214,6 @@ exports.runEmmetCommand = function runEmmetCommand(editor) { } return result; }; - for (var command in keymap) { exports.commands.addCommand({ name: "emmet:" + command, @@ -1249,23 +1223,23 @@ for (var command in keymap) { multiSelectAction: "forEach" }); } - -exports.updateCommands = function(editor, enabled) { +exports.updateCommands = function (editor, enabled) { if (enabled) { editor.keyBinding.addKeyboardHandler(exports.commands); - } else { + } + else { editor.keyBinding.removeKeyboardHandler(exports.commands); } }; - -exports.isSupportedMode = function(mode) { - if (!mode) return false; - if (mode.emmetConfig) return true; +exports.isSupportedMode = function (mode) { + if (!mode) + return false; + if (mode.emmetConfig) + return true; var id = mode.$id || mode; return /css|less|scss|sass|stylus|html|php|twig|ejs|handlebars/.test(id); }; - -exports.isAvailable = function(editor, command) { +exports.isAvailable = function (editor, command) { if (/(evaluate_math_expression|expand_abbreviation)$/.test(command)) return true; var mode = editor.session.$mode; @@ -1275,12 +1249,12 @@ exports.isAvailable = function(editor, command) { editorProxy.setupContext(editor); if (/js|php/.test(editorProxy.getSyntax())) isSupported = false; - } catch(e) {} + } + catch (e) { } } return isSupported; }; - -var onChangeMode = function(e, target) { +var onChangeMode = function (e, target) { var editor = target; if (!editor) return; @@ -1291,36 +1265,34 @@ var onChangeMode = function(e, target) { exports.load(); exports.updateCommands(editor, enabled); }; - -exports.load = function(cb) { +exports.load = function (cb) { if (typeof emmetPath !== "string") { config.warn("script for emmet-core is not loaded"); return false; } - config.loadModule(emmetPath, function() { + config.loadModule(emmetPath, function () { emmetPath = null; cb && cb(); }); return true; }; - exports.AceEmmetEditor = AceEmmetEditor; config.defineOptions(Editor.prototype, "editor", { enableEmmet: { - set: function(val) { + set: function (val) { this[val ? "on" : "removeListener"]("changeMode", onChangeMode); - onChangeMode({enableEmmet: !!val}, this); + onChangeMode({ enableEmmet: !!val }, this); }, value: true } }); - -exports.setCore = function(e) { +exports.setCore = function (e) { if (typeof e == "string") - emmetPath = e; + emmetPath = e; else - emmet = e; + emmet = e; }; + }); (function() { window.require(["ace/ext/emmet"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-hardwrap.js b/app/Resources/ui/js/ace/ext-hardwrap.js index a2037b9..3a744d3 100644 --- a/app/Resources/ui/js/ace/ext-hardwrap.js +++ b/app/Resources/ui/js/ace/ext-hardwrap.js @@ -1,47 +1,52 @@ -define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module){/** + * ## Text hard wrapping extension for automatic line breaking and text formatting. + * + * Provides intelligent line wrapping functionality that breaks long lines at configurable column limits while + * preserving indentation and optionally merging short adjacent lines. Supports both automatic wrapping during text + * input and manual formatting of selected text ranges. + * + * **Enable:** `editor.setOption("hardWrap", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - var Range = require("../range").Range; - function hardWrap(editor, options) { var max = options.column || editor.getOption("printMarginColumn"); var allowMerge = options.allowMerge != false; - var row = Math.min(options.startRow, options.endRow); var endRow = Math.max(options.startRow, options.endRow); - var session = editor.session; - while (row <= endRow) { var line = session.getLine(row); if (line.length > max) { var space = findSpace(line, max, 5); if (space) { var indentation = /^\s*/.exec(line)[0]; - session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + session.replace(new Range(row, space.start, row, space.end), "\n" + indentation); } endRow++; - } else if (allowMerge && /\S/.test(line) && row != endRow) { + } + else if (allowMerge && /\S/.test(line) && row != endRow) { var nextLine = session.getLine(row + 1); if (nextLine && /\S/.test(nextLine)) { var trimmedLine = line.replace(/\s+$/, ""); var trimmedNextLine = nextLine.replace(/^\s+/, ""); var mergedLine = trimmedLine + " " + trimmedNextLine; - var space = findSpace(mergedLine, max, 5); if (space && space.start > trimmedLine.length || mergedLine.length < max) { - var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length); session.replace(replaceRange, " "); row--; endRow--; - } else if (trimmedLine.length < line.length) { + } + else if (trimmedLine.length < line.length) { session.remove(new Range(row, trimmedLine.length, row, line.length)); } } } row++; } - function findSpace(line, max, min) { if (line.length < max) return; @@ -73,46 +78,43 @@ function hardWrap(editor, options) { }; } if (spaceAfter && spaceAfter[2]) { - start = max + spaceAfter[2].length; + start = max + spaceAfter[2].length; return { start: start, end: start + spaceAfter[3].length }; } } - } - function wrapAfterInput(e) { if (e.command.name == "insertstring" && /\S/.test(e.args)) { var editor = e.editor; var cursor = editor.selection.cursor; - if (cursor.column <= editor.renderer.$printMarginColumn) return; + if (cursor.column <= editor.renderer.$printMarginColumn) + return; var lastDelta = editor.session.$undoManager.$lastDelta; - hardWrap(editor, { startRow: cursor.row, endRow: cursor.row, allowMerge: false }); - if (lastDelta != editor.session.$undoManager.$lastDelta) + if (lastDelta != editor.session.$undoManager.$lastDelta) editor.session.markUndoGroup(); } } - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { hardWrap: { - set: function(val) { + set: function (val) { if (val) { this.commands.on("afterExec", wrapAfterInput); - } else { + } + else { this.commands.off("afterExec", wrapAfterInput); } }, value: false } }); - exports.hardWrap = hardWrap; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-keybinding_menu.js b/app/Resources/ui/js/ace/ext-keybinding_menu.js index b9ad46e..b17ba74 100644 --- a/app/Resources/ui/js/ace/ext-keybinding_menu.js +++ b/app/Resources/ui/js/ace/ext-keybinding_menu.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,29 +78,49 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { -"use strict"; -var keys = require("../../lib/keys"); -module.exports.getEditorKeybordShortcuts = function(editor) { +define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/ext/menu_tools/get_editor_keyboard_shortcuts","ace/lib/keys"], function(require, exports, module){/** + * ## Editor Keyboard Shortcuts Utility + * + * Provides functionality to extract and format keyboard shortcuts from an Ace editor instance. Analyzes all registered + * command handlers and their key bindings to generate a list of available keyboard shortcuts for the + * current platform. Returns formatted key combinations with proper modifier key representations and handles multiple + * bindings per command with pipe-separated notation. + * + * **Usage:** + * ```javascript + * var getKbShortcuts = require('ace/ext/menu_tools/get_editor_keyboard_shortcuts'); + * var shortcuts = getKbShortcuts.getEditorKeybordShortcuts(editor); + * console.log(shortcuts); + * // [ + * // {'command': 'selectall', 'key': 'Ctrl-A'}, + * // {'command': 'copy', 'key': 'Ctrl-C|Ctrl-Insert'} + * // ] + * ``` + * + * @module + */ +"use strict"; var keys = require("../../lib/keys"); +module.exports.getEditorKeybordShortcuts = function (editor) { var KEY_MODS = keys.KEY_MODS; var keybindings = []; var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var ckb = handler.commandKeyBinding; + editor.keyBinding.$handlers.forEach(function (handler) { + var ckb = handler["commandKeyBinding"]; for (var i in ckb) { - var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); + var key = i.replace(/(^|-)\w/g, function (x) { return x.toUpperCase(); }); var commands = ckb[i]; if (!Array.isArray(commands)) commands = [commands]; - commands.forEach(function(command) { + commands.forEach(function (command) { if (typeof command != "string") - command = command.name; + command = command.name; if (commandMap[command]) { commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command}; + } + else { + commandMap[command] = { key: key, command: command }; keybindings.push(commandMap[command]); - } + } }); } }); @@ -150,38 +129,51 @@ module.exports.getEditorKeybordShortcuts = function(editor) { }); -define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) { - "use strict"; - var Editor = require("../editor").Editor; - function showKeyboardShortcuts (editor) { - if(!document.getElementById('kbshortcutmenu')) { - var overlayPage = require('./menu_tools/overlay_page').overlayPage; - var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; - var kb = getEditorKeybordShortcuts(editor); - var el = document.createElement('div'); - var commands = kb.reduce(function(previous, current) { - return previous + '
' - + current.command + ' : ' - + '' + current.key + '
'; - }, ''); - - el.id = 'kbshortcutmenu'; - el.innerHTML = '

Keyboard Shortcuts

' + commands + ''; - overlayPage(editor, el); - } +define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module){/** + * ## Show Keyboard Shortcuts extension + * + * Provides a keyboard shortcuts display overlay for the Ace editor. Creates an interactive menu that shows all available + * keyboard shortcuts with their corresponding commands, organized in a searchable and navigable format. The menu + * appears as an overlay page and can be triggered via keyboard shortcut (Ctrl-Alt-H/Cmd-Alt-H) or programmatically. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ +"use strict"; +var Editor = require("../editor").Editor; +function showKeyboardShortcuts(editor) { + if (!document.getElementById('kbshortcutmenu')) { + var overlayPage = require('./menu_tools/overlay_page').overlayPage; + var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts; + var kb = getEditorKeybordShortcuts(editor); + var el = document.createElement('div'); + var commands = kb.reduce(function (previous, current) { + return previous + '
' + + current.command + ' : ' + + '' + current.key + '
'; + }, ''); + el.id = 'kbshortcutmenu'; + el.innerHTML = '

Keyboard Shortcuts

' + commands + ''; + overlayPage(editor, el); } - module.exports.init = function(editor) { - Editor.prototype.showKeyboardShortcuts = function() { - showKeyboardShortcuts(this); - }; - editor.commands.addCommands([{ +} +module.exports.init = function (editor) { + Editor.prototype.showKeyboardShortcuts = function () { + showKeyboardShortcuts(this); + }; + editor.commands.addCommands([{ name: "showKeyboardShortcuts", - bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"}, - exec: function(editor, line) { + bindKey: { + win: "Ctrl-Alt-h", + mac: "Command-Alt-h" + }, + exec: + function (editor, line) { editor.showKeyboardShortcuts(); } }]); - }; +}; }); (function() { window.require(["ace/ext/keybinding_menu"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-language_tools.js b/app/Resources/ui/js/ace/ext-language_tools.js index e0316dc..2a2d27d 100644 --- a/app/Resources/ui/js/ace/ext-language_tools.js +++ b/app/Resources/ui/js/ace/ext-language_tools.js @@ -1,5 +1,4 @@ -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -9,107 +8,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); - }; - - this.createTokenizer = function() { +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); + }; + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -118,118 +110,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -238,21 +227,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -265,12 +253,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -279,16 +270,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -306,34 +295,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -344,142 +336,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -495,11 +380,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -509,26 +392,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -538,20 +418,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -560,7 +434,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -568,21 +441,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -592,14 +459,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -608,7 +475,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -617,48 +483,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -669,9 +527,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -679,12 +537,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -692,21 +553,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -714,59 +577,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -779,16 +755,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -800,11 +776,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -820,20 +796,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -842,10 +820,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -854,17 +832,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -874,13 +851,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -896,7 +873,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -910,36 +888,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -948,428 +941,546 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/config","ace/lib/useragent"], function(require, exports, module){"use strict"; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - -var $singleLineEditor = function(el) { +var nls = require("../config").nls; +var userAgent = require("./../lib/useragent"); +var getAriaId = function (index) { + return "suggest-aria-id:".concat(index); +}; +var popupAriaRole = userAgent.isSafari ? "menu" : "listbox"; +var optionAriaRole = userAgent.isSafari ? "menuitem" : "option"; +var ariaActiveState = userAgent.isSafari ? "aria-current" : "aria-selected"; +var $singleLineEditor = function (el) { var renderer = new Renderer(el); - renderer.$maxLines = 4; - var editor = new Editor(renderer); - editor.setHighlightActiveLine(false); editor.setShowPrintMargin(false); editor.renderer.setShowGutter(false); editor.renderer.setHighlightGutterLine(false); - editor.$mouseHandler.$focusTimeout = 0; editor.$highlightTagPending = true; - return editor; }; +var AcePopup = /** @class */ (function () { + function AcePopup(parentNode) { + var el = dom.createElement("div"); + var popup = $singleLineEditor(el); + if (parentNode) { + parentNode.appendChild(el); + } + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + popup.renderer.$textLayer.element.setAttribute("role", popupAriaRole); + popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("autocomplete.popup.aria-roledescription", "Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-label", nls("autocomplete.popup.aria-label", "Autocomplete suggestions")); + popup.renderer.textarea.setAttribute("aria-hidden", "true"); + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + var noop = function () { }; + popup.focus = noop; + popup.$isFocused = true; + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = "0"; + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + popup.on("mousedown", function (e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + var lastMouseEvent; + var hoverMarker = new Range(-1, 0, -1, Infinity); + var selectionMarker = new Range(-1, 0, -1, Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function (val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } + else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function (e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } + lastMouseEvent = e; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + popup.isMouseOver = true; + var row = lastMouseEvent.getDocumentPosition().row; + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function () { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function () { + var t = popup.renderer.$textLayer; + for (var row = t.config.firstRow, l = t.config.lastRow; row <= l; row++) { + var popupRowElement = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + popupRowElement.setAttribute("role", optionAriaRole); + popupRowElement.setAttribute("aria-roledescription", nls("autocomplete.popup.item.aria-roledescription", "item")); + popupRowElement.setAttribute("aria-setsize", popup.data.length); + popupRowElement.setAttribute("aria-describedby", "doc-tooltip"); + popupRowElement.setAttribute("aria-posinset", row + 1); + var rowData = popup.getData(row); + if (rowData) { + var ariaLabel = "".concat(rowData.caption || rowData.value).concat(rowData.meta ? ", ".concat(rowData.meta) : ''); + popupRowElement.setAttribute("aria-label", ariaLabel); + } + var highlightedSpans = popupRowElement.querySelectorAll(".ace_completion-highlight"); + highlightedSpans.forEach(function (span) { + span.setAttribute("role", "mark"); + }); + } + }); + popup.renderer.on("afterRender", function () { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + var el = document.activeElement; // Active element is textarea of main editor + if (selected !== popup.selectedNode && popup.selectedNode) { + dom.removeCssClass(popup.selectedNode, "ace_selected"); + popup.selectedNode.removeAttribute(ariaActiveState); + popup.selectedNode.removeAttribute("id"); + } + el.removeAttribute("aria-activedescendant"); + popup.selectedNode = selected; + if (selected) { + var ariaId = getAriaId(row); + dom.addCssClass(selected, "ace_selected"); + selected.id = ariaId; + t.element.setAttribute("aria-activedescendant", ariaId); + el.setAttribute("aria-activedescendant", ariaId); + selected.setAttribute(ariaActiveState, "true"); + } + }); + var hideHoverMarker = function () { setHoverMarker(-1); }; + var setHoverMarker = function (row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function () { + return hoverMarker.start.row; + }; + event.addListener(popup.container, "mouseout", function () { + popup.isMouseOver = false; + hideHoverMarker(); + }); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + popup.session.doc.getLength = function () { + return popup.data.length; + }; + popup.session.doc.getLine = function (i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function (row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = { value: data }; + var caption = data.caption || data.value || data.name; + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) + continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + tokens.push({ type: "completion-spacer", value: " " }); + if (data.meta) + tokens.push({ type: "completion-meta", value: data.meta }); + if (data.message) + tokens.push({ type: "completion-message", value: data.message }); + return tokens; + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + popup.session.$computeWidth = function () { + return this.screenWidth = 0; + }; + popup.isOpen = false; + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + popup.isMouseOver = false; + popup.data = []; + popup.setData = function (list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function (row) { + return popup.data[row]; + }; + popup.getRow = function () { + return selectionMarker.start.row; + }; + popup.setRow = function (line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length - 1, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + popup.on("changeSelection", function () { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); + }); + popup.hide = function () { + this.container.style.display = "none"; + popup.anchorPos = null; + popup.anchor = null; + if (popup.isOpen) { + popup.isOpen = false; + this._signal("hide"); + } + }; + popup.tryShow = function (pos, lineHeight, anchor, forceShow) { + if (!forceShow && popup.isOpen && popup.anchorPos && popup.anchor && + popup.anchorPos.top === pos.top && popup.anchorPos.left === pos.left && + popup.anchor === anchor) { + return true; + } + var el = this.container; + var scrollBarSize = this.renderer.scrollBar.width || 10; + var screenHeight = window.innerHeight - scrollBarSize; + var screenWidth = window.innerWidth - scrollBarSize; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var dims = { top: 0, bottom: 0, left: 0 }; + var spaceBelow = screenHeight - pos.top - 3 * this.$borderSize - lineHeight; + var spaceAbove = pos.top - 3 * this.$borderSize; + if (!anchor) { + if (spaceAbove <= spaceBelow || spaceBelow >= maxH) { + anchor = "bottom"; + } + else { + anchor = "top"; + } + } + if (anchor === "top") { + dims.bottom = pos.top - this.$borderSize; + dims.top = dims.bottom - maxH; + } + else if (anchor === "bottom") { + dims.top = pos.top + lineHeight + this.$borderSize; + dims.bottom = dims.top + maxH; + } + var fitsX = dims.top >= 0 && dims.bottom <= screenHeight; + if (!forceShow && !fitsX) { + return false; + } + if (!fitsX) { + if (anchor === "top") { + renderer.$maxPixelHeight = spaceAbove; + } + else { + renderer.$maxPixelHeight = spaceBelow; + } + } + else { + renderer.$maxPixelHeight = null; + } + if (anchor === "top") { + el.style.top = ""; + el.style.bottom = (screenHeight + scrollBarSize - dims.bottom) + "px"; + popup.isTopdown = false; + } + else { + el.style.top = dims.top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + el.style.display = ""; + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + el.style.left = left + "px"; + el.style.right = ""; + dom.$fixPositionBug(el); + if (!popup.isOpen) { + popup.isOpen = true; + this._signal("show"); + lastMouseEvent = null; + } + popup.anchorPos = pos; + popup.anchor = anchor; + return true; + }; + popup.show = function (pos, lineHeight, topdownOnly) { + this.tryShow(pos, lineHeight, topdownOnly ? "bottom" : undefined, true); + }; + popup.goTo = function (where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + switch (where) { + case "up": + row = row <= 0 ? max : row - 1; + break; + case "down": + row = row >= max ? -1 : row + 1; + break; + case "start": + row = 0; + break; + case "end": + row = max; + break; + } + this.setRow(row); + }; + popup.getTextLeftOffset = function () { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + popup.$imageSize = 0; + popup.$borderSize = 1; + return popup; + } + return AcePopup; +}()); +dom.importCssString("\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #CAD6FA;\n z-index: 1;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #3a674e;\n}\n.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid #abbffe;\n margin-top: -1px;\n background: rgba(233,233,253,0.4);\n position: absolute;\n z-index: 2;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid rgba(109, 150, 13, 0.8);\n background: rgba(58, 103, 78, 0.62);\n}\n.ace_completion-meta {\n opacity: 0.5;\n margin-left: 0.9em;\n}\n.ace_completion-message {\n margin-left: 0.9em;\n color: blue;\n}\n.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #2d69c7;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #93ca12;\n}\n.ace_editor.ace_autocomplete {\n width: 300px;\n z-index: 200000;\n border: 1px lightgray solid;\n position: fixed;\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n line-height: 1.4;\n background: #fefefe;\n color: #111;\n}\n.ace_dark.ace_editor.ace_autocomplete {\n border: 1px #484747 solid;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\n line-height: 1.4;\n background: #25282c;\n color: #c1c1c1;\n}\n.ace_autocomplete .ace_text-layer {\n width: calc(100% - 8px);\n}\n.ace_autocomplete .ace_line {\n display: flex;\n align-items: center;\n}\n.ace_autocomplete .ace_line > * {\n min-width: 0;\n flex: 0 0 auto;\n}\n.ace_autocomplete .ace_line .ace_ {\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ace_autocomplete .ace_completion-spacer {\n flex: 1;\n}\n.ace_autocomplete.ace_loading:after {\n content: \"\";\n position: absolute;\n top: 0px;\n height: 2px;\n width: 8%;\n background: blue;\n z-index: 100;\n animation: ace_progress 3s infinite linear;\n animation-delay: 300ms;\n transform: translateX(-100%) scaleX(1);\n}\n@keyframes ace_progress {\n 0% { transform: translateX(-100%) scaleX(1) }\n 50% { transform: translateX(625%) scaleX(2) } \n 100% { transform: translateX(1500%) scaleX(3) } \n}\n@media (prefers-reduced-motion) {\n .ace_autocomplete.ace_loading:after {\n transform: translateX(625%) scaleX(2);\n animation: none;\n }\n}\n", "autocompletion.css", false); +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +exports.getAriaId = getAriaId; -var AcePopup = function(parentNode) { - var el = dom.createElement("div"); - var popup = new $singleLineEditor(el); - - if (parentNode) - parentNode.appendChild(el); - el.style.display = "none"; - popup.renderer.content.style.cursor = "default"; - popup.renderer.setStyle("ace_autocomplete"); - - popup.setOption("displayIndentGuides", false); - popup.setOption("dragDelay", 150); - - var noop = function(){}; - - popup.focus = noop; - popup.$isFocused = true; - - popup.renderer.$cursorLayer.restartTimer = noop; - popup.renderer.$cursorLayer.element.style.opacity = 0; - - popup.renderer.$maxLines = 8; - popup.renderer.$keepTextAreaAtCursor = false; +}); - popup.setHighlightActiveLine(false); - popup.session.highlight(""); - popup.session.$searchHighlight.clazz = "ace_highlight-marker"; +define("ace/autocomplete/inline_screenreader",["require","exports","module"], function(require, exports, module){"use strict"; +var AceInlineScreenReader = /** @class */ (function () { + function AceInlineScreenReader(editor) { + this.editor = editor; + this.screenReaderDiv = document.createElement("div"); + this.screenReaderDiv.classList.add("ace_screenreader-only"); + this.editor.container.appendChild(this.screenReaderDiv); + } + AceInlineScreenReader.prototype.setScreenReaderContent = function (content) { + if (!this.popup && this.editor.completer && /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup) { + this.popup = /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup; + this.popup.renderer.on("afterRender", function () { + var row = this.popup.getRow(); + var t = this.popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected) { + var idString = "doc-tooltip "; + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + idString += "ace-inline-screenreader-line-".concat(lineIndex, " "); + } + selected.setAttribute("aria-describedby", idString); + } + }.bind(this)); + } + while (this.screenReaderDiv.firstChild) { + this.screenReaderDiv.removeChild(this.screenReaderDiv.firstChild); + } + this._lines = content.split(/\r\n|\r|\n/); + var codeElement = this.createCodeBlock(); + this.screenReaderDiv.appendChild(codeElement); + }; + AceInlineScreenReader.prototype.destroy = function () { + this.screenReaderDiv.remove(); + }; + AceInlineScreenReader.prototype.createCodeBlock = function () { + var container = document.createElement("pre"); + container.setAttribute("id", "ace-inline-screenreader"); + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + var codeElement = document.createElement("code"); + codeElement.setAttribute("id", "ace-inline-screenreader-line-".concat(lineIndex)); + var line = document.createTextNode(this._lines[lineIndex]); + codeElement.appendChild(line); + container.appendChild(codeElement); + } + return container; + }; + return AceInlineScreenReader; +}()); +exports.AceInlineScreenReader = AceInlineScreenReader; - popup.on("mousedown", function(e) { - var pos = e.getDocumentPosition(); - popup.selection.moveToPosition(pos); - selectionMarker.start.row = selectionMarker.end.row = pos.row; - e.stop(); - }); +}); - var lastMouseEvent; - var hoverMarker = new Range(-1,0,-1,Infinity); - var selectionMarker = new Range(-1,0,-1,Infinity); - selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); - popup.setSelectOnHover = function(val) { - if (!val) { - hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); - } else if (hoverMarker.id) { - popup.session.removeMarker(hoverMarker.id); - hoverMarker.id = null; - } - }; - popup.setSelectOnHover(false); - popup.on("mousemove", function(e) { - if (!lastMouseEvent) { - lastMouseEvent = e; - return; +define("ace/autocomplete/inline",["require","exports","module","ace/snippets","ace/autocomplete/inline_screenreader"], function(require, exports, module){"use strict"; +var snippetManager = require("../snippets").snippetManager; +var AceInlineScreenReader = require("./inline_screenreader").AceInlineScreenReader; +var AceInline = /** @class */ (function () { + function AceInline() { + this.editor = null; + } + AceInline.prototype.show = function (editor, completion, prefix) { + prefix = prefix || ""; + if (editor && this.editor && this.editor !== editor) { + this.hide(); + this.editor = null; + this.inlineScreenReader = null; } - if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { - return; + if (!editor || !completion) { + return false; } - lastMouseEvent = e; - lastMouseEvent.scrollTop = popup.renderer.scrollTop; - var row = lastMouseEvent.getDocumentPosition().row; - if (hoverMarker.start.row != row) { - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row); + if (!this.inlineScreenReader) { + this.inlineScreenReader = new AceInlineScreenReader(editor); } - }); - popup.renderer.on("beforeRender", function() { - if (lastMouseEvent && hoverMarker.start.row != -1) { - lastMouseEvent.$pos = null; - var row = lastMouseEvent.getDocumentPosition().row; - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row, true); + var displayText = completion.snippet ? snippetManager.getDisplayTextForSnippet(editor, completion.snippet) : completion.value; + if (completion.hideInlinePreview || !displayText || !displayText.startsWith(prefix)) { + return false; } - }); - popup.renderer.on("afterRender", function() { - var row = popup.getRow(); - var t = popup.renderer.$textLayer; - var selected = t.element.childNodes[row - t.config.firstRow]; - if (selected !== t.selectedNode && t.selectedNode) - dom.removeCssClass(t.selectedNode, "ace_selected"); - t.selectedNode = selected; - if (selected) - dom.addCssClass(selected, "ace_selected"); - }); - var hideHoverMarker = function() { setHoverMarker(-1); }; - var setHoverMarker = function(row, suppressRedraw) { - if (row !== hoverMarker.start.row) { - hoverMarker.start.row = hoverMarker.end.row = row; - if (!suppressRedraw) - popup.session._emit("changeBackMarker"); - popup._emit("changeHoverMarker"); + this.editor = editor; + this.inlineScreenReader.setScreenReaderContent(displayText); + displayText = displayText.slice(prefix.length); + if (displayText === "") { + editor.removeGhostText(); + } + else { + editor.setGhostText(displayText); } + return true; }; - popup.getHoveredRow = function() { - return hoverMarker.start.row; + AceInline.prototype.isOpen = function () { + if (!this.editor) { + return false; + } + return !!this.editor.renderer.$ghostText; }; - - event.addListener(popup.container, "mouseout", hideHoverMarker); - popup.on("hide", hideHoverMarker); - popup.on("changeSelection", hideHoverMarker); - - popup.session.doc.getLength = function() { - return popup.data.length; - }; - popup.session.doc.getLine = function(i) { - var data = popup.data[i]; - if (typeof data == "string") - return data; - return (data && data.value) || ""; - }; - - var bgTokenizer = popup.session.bgTokenizer; - bgTokenizer.$tokenizeRow = function(row) { - var data = popup.data[row]; - var tokens = []; - if (!data) - return tokens; - if (typeof data == "string") - data = {value: data}; - var caption = data.caption || data.value || data.name; - - function addToken(value, className) { - value && tokens.push({ - type: (data.className || "") + (className || ""), - value: value - }); - } - - var lower = caption.toLowerCase(); - var filterText = (popup.filterText || "").toLowerCase(); - var lastIndex = 0; - var lastI = 0; - for (var i = 0; i <= filterText.length; i++) { - if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { - var sub = filterText.slice(lastI, i); - lastI = i; - var index = lower.indexOf(sub, lastIndex); - if (index == -1) continue; - addToken(caption.slice(lastIndex, index), ""); - lastIndex = index + sub.length; - addToken(caption.slice(index, lastIndex), "completion-highlight"); - } - } - addToken(caption.slice(lastIndex, caption.length), ""); - - if (data.meta) - tokens.push({type: "completion-meta", value: data.meta}); - if (data.message) - tokens.push({type: "completion-message", value: data.message}); - - return tokens; - }; - bgTokenizer.$updateOnChange = noop; - bgTokenizer.start = noop; - - popup.session.$computeWidth = function() { - return this.screenWidth = 0; - }; - popup.isOpen = false; - popup.isTopdown = false; - popup.autoSelect = true; - popup.filterText = ""; - - popup.data = []; - popup.setData = function(list, filterText) { - popup.filterText = filterText || ""; - popup.setValue(lang.stringRepeat("\n", list.length), -1); - popup.data = list || []; - popup.setRow(0); - }; - popup.getData = function(row) { - return popup.data[row]; - }; - - popup.getRow = function() { - return selectionMarker.start.row; - }; - popup.setRow = function(line) { - line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); - if (selectionMarker.start.row != line) { - popup.selection.clearSelection(); - selectionMarker.start.row = selectionMarker.end.row = line || 0; - popup.session._emit("changeBackMarker"); - popup.moveCursorTo(line || 0, 0); - if (popup.isOpen) - popup._signal("select"); - } - }; - - popup.on("changeSelection", function() { - if (popup.isOpen) - popup.setRow(popup.selection.lead.row); - popup.renderer.scrollCursorIntoView(); - }); - - popup.hide = function() { - this.container.style.display = "none"; - this._signal("hide"); - popup.isOpen = false; - }; - popup.show = function(pos, lineHeight, topdownOnly) { - var el = this.container; - var screenHeight = window.innerHeight; - var screenWidth = window.innerWidth; - var renderer = this.renderer; - var maxH = renderer.$maxLines * lineHeight * 1.4; - var top = pos.top + this.$borderSize; - var allowTopdown = top > screenHeight / 2 && !topdownOnly; - if (allowTopdown && top + lineHeight + maxH > screenHeight) { - renderer.$maxPixelHeight = top - 2 * this.$borderSize; - el.style.top = ""; - el.style.bottom = screenHeight - top + "px"; - popup.isTopdown = false; - } else { - top += lineHeight; - renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; - el.style.top = top + "px"; - el.style.bottom = ""; - popup.isTopdown = true; + AceInline.prototype.hide = function () { + if (!this.editor) { + return false; } - - el.style.display = ""; - - var left = pos.left; - if (left + el.offsetWidth > screenWidth) - left = screenWidth - el.offsetWidth; - - el.style.left = left + "px"; - - this._signal("show"); - lastMouseEvent = null; - popup.isOpen = true; + this.editor.removeGhostText(); + return true; }; - - popup.goTo = function(where) { - var row = this.getRow(); - var max = this.session.getLength() - 1; - - switch(where) { - case "up": row = row <= 0 ? max : row - 1; break; - case "down": row = row >= max ? -1 : row + 1; break; - case "start": row = 0; break; - case "end": row = max; break; + AceInline.prototype.destroy = function () { + this.hide(); + this.editor = null; + if (this.inlineScreenReader) { + this.inlineScreenReader.destroy(); + this.inlineScreenReader = null; } - - this.setRow(row); - }; - - - popup.getTextLeftOffset = function() { - return this.$borderSize + this.renderer.$padding + this.$imageSize; }; + return AceInline; +}()); +exports.AceInline = AceInline; - popup.$imageSize = 0; - popup.$borderSize = 1; - - return popup; -}; - -dom.importCssString("\ -.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #CAD6FA;\ - z-index: 1;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #3a674e;\ -}\ -.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid #abbffe;\ - margin-top: -1px;\ - background: rgba(233,233,253,0.4);\ - position: absolute;\ - z-index: 2;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid rgba(109, 150, 13, 0.8);\ - background: rgba(58, 103, 78, 0.62);\ -}\ -.ace_completion-meta {\ - opacity: 0.5;\ - margin: 0.9em;\ -}\ -.ace_completion-message {\ - color: blue;\ -}\ -.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #2d69c7;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #93ca12;\ -}\ -.ace_editor.ace_autocomplete {\ - width: 300px;\ - z-index: 200000;\ - border: 1px lightgray solid;\ - position: fixed;\ - box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ - line-height: 1.4;\ - background: #fefefe;\ - color: #111;\ -}\ -.ace_dark.ace_editor.ace_autocomplete {\ - border: 1px #484747 solid;\ - box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ - line-height: 1.4;\ - background: #25282c;\ - color: #c1c1c1;\ -}", "autocompletion.css", false); - -exports.AcePopup = AcePopup; -exports.$singleLineEditor = $singleLineEditor; }); -define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.parForEach = function(array, fn, callback) { +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module){"use strict"; +exports.parForEach = function (array, fn, callback) { var completed = 0; var arLength = array.length; if (arLength === 0) callback(); for (var i = 0; i < arLength; i++) { - fn(array[i], function(result, err) { + fn(array[i], function (result, err) { completed++; if (completed === arLength) callback(result, err); }); } }; - var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; - -exports.retrievePrecedingIdentifier = function(text, pos, regex) { +exports.retrievePrecedingIdentifier = function (text, pos, regex) { regex = regex || ID_REGEX; var buf = []; - for (var i = pos-1; i >= 0; i--) { + for (var i = pos - 1; i >= 0; i--) { if (regex.test(text[i])) buf.push(text[i]); else @@ -1377,8 +1488,7 @@ exports.retrievePrecedingIdentifier = function(text, pos, regex) { } return buf.reverse().join(""); }; - -exports.retrieveFollowingIdentifier = function(text, pos, regex) { +exports.retrieveFollowingIdentifier = function (text, pos, regex) { regex = regex || ID_REGEX; var buf = []; for (var i = pos; i < text.length; i++) { @@ -1389,14 +1499,13 @@ exports.retrieveFollowingIdentifier = function(text, pos, regex) { } return buf; }; - exports.getCompletionPrefix = function (editor) { var pos = editor.getCursorPosition(); var line = editor.session.getLine(pos.row); var prefix; - editor.completers.forEach(function(completer) { + editor.completers.forEach(function (completer) { if (completer.identifierRegexps) { - completer.identifierRegexps.forEach(function(identifierRegex) { + completer.identifierRegexps.forEach(function (identifierRegex) { if (!prefix && identifierRegex) prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); }.bind(this)); @@ -1404,112 +1513,292 @@ exports.getCompletionPrefix = function (editor) { }.bind(this)); return prefix || this.retrievePrecedingIdentifier(line, pos.column); }; +exports.triggerAutocomplete = function (editor, previousChar) { + var previousChar = previousChar == null + ? editor.session.getPrecedingCharacter() + : previousChar; + return editor.completers.some(function (completer) { + if (completer.triggerCharacters && Array.isArray(completer.triggerCharacters)) { + return completer.triggerCharacters.includes(previousChar); + } + }); +}; }); -define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/inline","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config","ace/lib/event","ace/lib/scroll"], function(require, exports, module){"use strict"; var HashHandler = require("./keyboard/hash_handler").HashHandler; var AcePopup = require("./autocomplete/popup").AcePopup; +var AceInline = require("./autocomplete/inline").AceInline; +var getAriaId = require("./autocomplete/popup").getAriaId; var util = require("./autocomplete/util"); var lang = require("./lib/lang"); var dom = require("./lib/dom"); var snippetManager = require("./snippets").snippetManager; var config = require("./config"); - -var Autocomplete = function() { - this.autoInsert = false; - this.autoSelect = true; - this.exactMatch = false; - this.gatherCompletionsId = 0; - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys(this.commands); - - this.blurListener = this.blurListener.bind(this); - this.changeListener = this.changeListener.bind(this); - this.mousedownListener = this.mousedownListener.bind(this); - this.mousewheelListener = this.mousewheelListener.bind(this); - - this.changeTimer = lang.delayedCall(function() { - this.updateCompletions(true); - }.bind(this)); - - this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +var event = require("./lib/event"); +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var destroyCompleter = function (e, editor) { + editor.completer && editor.completer.destroy(); }; - -(function() { - - this.$init = function() { - this.popup = new AcePopup(document.body || document.documentElement); - this.popup.on("click", function(e) { +var Autocomplete = /** @class */ (function () { + function Autocomplete() { + this.autoInsert = false; + this.autoSelect = true; + this.autoShown = false; + this.exactMatch = false; + this.inlineEnabled = false; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + this.parentNode = null; + this.setSelectOnHover = false; + this.hasSeen = new Set(); + this.showLoadingState = false; + this.stickySelectionDelay = 500; + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + this.onLayoutChange = this.onLayoutChange.bind(this); + this.changeTimer = lang.delayedCall(function () { + this.updateCompletions(true); + }.bind(this)); + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); + this.popupTimer = lang.delayedCall(this.$updatePopupPosition.bind(this), 50); + this.stickySelectionTimer = lang.delayedCall(function () { + this.stickySelection = true; + }.bind(this), this.stickySelectionDelay); + this.$firstOpenTimer = lang.delayedCall(/**@this{Autocomplete}*/ function () { + var initialPosition = this.completionProvider && this.completionProvider.initialPosition; + if (this.autoShown || (this.popup && this.popup.isOpen) || !initialPosition || this.editor.completers.length === 0) + return; + this.completions = new FilteredList(Autocomplete.completionsForLoading); + this.openPopup(this.editor, initialPosition.prefix, false); + this.popup.renderer.setStyle("ace_loading", true); + }.bind(this), this.stickySelectionDelay); + } + Object.defineProperty(Autocomplete, "completionsForLoading", { + get: function () { + return [{ + caption: config.nls("autocomplete.loading", "Loading..."), + value: "" + }]; + }, + enumerable: false, + configurable: true + }); + Autocomplete.prototype.$init = function () { + this.popup = new AcePopup(this.parentNode || document.body || document.documentElement); + this.popup.on("click", function (e) { this.insertMatch(); e.stop(); }.bind(this)); this.popup.focus = this.editor.focus.bind(this.editor); - this.popup.on("show", this.tooltipTimer.bind(null, null)); - this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("show", this.$onPopupShow.bind(this)); + this.popup.on("hide", this.$onHidePopup.bind(this)); + this.popup.on("select", this.$onPopupChange.bind(this)); + event.addListener(this.popup.container, "mouseout", this.mouseOutListener.bind(this)); this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + this.popup.renderer.on("afterRender", this.$onPopupRender.bind(this)); return this.popup; }; - - this.getPopup = function() { + Autocomplete.prototype.$initInline = function () { + if (!this.inlineEnabled || this.inlineRenderer) + return; + this.inlineRenderer = new AceInline(); + return this.inlineRenderer; + }; + Autocomplete.prototype.getPopup = function () { return this.popup || this.$init(); }; - - this.openPopup = function(editor, prefix, keepPopupPosition) { + Autocomplete.prototype.$onHidePopup = function () { + if (this.inlineRenderer) { + this.inlineRenderer.hide(); + } + this.hideDocTooltip(); + this.stickySelectionTimer.cancel(); + this.popupTimer.cancel(); + this.stickySelection = false; + }; + Autocomplete.prototype.$seen = function (completion) { + if (!this.hasSeen.has(completion) && completion && completion.completer && completion.completer.onSeen && typeof completion.completer.onSeen === "function") { + completion.completer.onSeen(this.editor, completion); + this.hasSeen.add(completion); + } + }; + Autocomplete.prototype.$onPopupChange = function (hide) { + if (this.inlineRenderer && this.inlineEnabled) { + var completion = hide ? null : this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + if (this.popup.isMouseOver && this.setSelectOnHover) { + this.tooltipTimer.call(null, null); + return; + } + this.popupTimer.schedule(); + this.tooltipTimer.schedule(); + } + else { + this.popupTimer.call(null, null); + this.tooltipTimer.call(null, null); + } + }; + Autocomplete.prototype.$updateGhostText = function (completion) { + var row = this.base.row; + var column = this.base.column; + var cursorColumn = this.editor.getCursorPosition().column; + var prefix = this.editor.session.getLine(row).slice(column, cursorColumn); + if (!this.inlineRenderer.show(this.editor, completion, prefix)) { + this.inlineRenderer.hide(); + } + else { + this.$seen(completion); + } + }; + Autocomplete.prototype.$onPopupRender = function () { + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (this.completions && this.completions.filtered && this.completions.filtered.length > 0) { + for (var i = this.popup.getFirstVisibleRow(); i <= this.popup.getLastVisibleRow(); i++) { + var completion = this.popup.getData(i); + if (completion && (!inlineEnabled || completion.hideInlinePreview)) { + this.$seen(completion); + } + } + } + }; + Autocomplete.prototype.$onPopupShow = function (hide) { + this.$onPopupChange(hide); + this.stickySelection = false; + if (this.stickySelectionDelay >= 0) + this.stickySelectionTimer.schedule(this.stickySelectionDelay); + }; + Autocomplete.prototype.observeLayoutChanges = function () { + if (this.$elements || !this.editor) + return; + window.addEventListener("resize", this.onLayoutChange, { passive: true }); + window.addEventListener("wheel", this.mousewheelListener); + var el = this.editor.container.parentNode; + var elements = []; + while (el) { + elements.push(el); + el.addEventListener("scroll", this.onLayoutChange, { passive: true }); + el = el.parentNode; + } + this.$elements = elements; + }; + Autocomplete.prototype.unObserveLayoutChanges = function () { + var _this = this; + window.removeEventListener("resize", this.onLayoutChange, { passive: true }); + window.removeEventListener("wheel", this.mousewheelListener); + this.$elements && this.$elements.forEach(function (el) { + el.removeEventListener("scroll", _this.onLayoutChange, { passive: true }); + }); + this.$elements = null; + }; + Autocomplete.prototype.onLayoutChange = function () { + if (!this.popup.isOpen) + return this.unObserveLayoutChanges(); + this.$updatePopupPosition(); + this.updateDocTooltip(); + }; + Autocomplete.prototype.$updatePopupPosition = function () { + var editor = this.editor; + var renderer = editor.renderer; + var lineHeight = renderer.layerConfig.lineHeight; + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + var posGhostText = { + top: pos.top, + left: pos.left + }; + if (renderer.$ghostText && renderer.$ghostTextWidget) { + if (this.base.row === renderer.$ghostText.position.row) { + posGhostText.top += renderer.$ghostTextWidget.el.offsetHeight; + } + } + var editorContainerBottom = editor.container.getBoundingClientRect().bottom - lineHeight; + var lowestPosition = editorContainerBottom < posGhostText.top ? + { top: editorContainerBottom, left: posGhostText.left } : + posGhostText; + if (this.popup.tryShow(lowestPosition, lineHeight, "bottom")) { + return; + } + if (this.popup.tryShow(pos, lineHeight, "top")) { + return; + } + this.popup.show(pos, lineHeight); + }; + Autocomplete.prototype.openPopup = function (editor, prefix, keepPopupPosition) { + this.$firstOpenTimer.cancel(); if (!this.popup) this.$init(); - + if (this.inlineEnabled && !this.inlineRenderer) + this.$initInline(); this.popup.autoSelect = this.autoSelect; - + this.popup.setSelectOnHover(this.setSelectOnHover); + var oldRow = this.popup.getRow(); + var previousSelectedItem = this.popup.data[oldRow]; this.popup.setData(this.completions.filtered, this.completions.filterText); - + if (this.editor.textInput.setAriaOptions) { + this.editor.textInput.setAriaOptions({ + activeDescendant: getAriaId(this.popup.getRow()), + inline: this.inlineEnabled + }); + } editor.keyBinding.addKeyboardHandler(this.keyboardHandler); - - var renderer = editor.renderer; - this.popup.setRow(this.autoSelect ? 0 : -1); + var newRow; + if (this.stickySelection) + newRow = this.popup.data.indexOf(previousSelectedItem); + if (!newRow || newRow === -1) + newRow = 0; + this.popup.setRow(this.autoSelect ? newRow : -1); + if (newRow === oldRow && previousSelectedItem !== this.completions.filtered[newRow]) + this.$onPopupChange(); + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (newRow === oldRow && inlineEnabled) { + var completion = this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + } if (!keepPopupPosition) { this.popup.setTheme(editor.getTheme()); this.popup.setFontSize(editor.getFontSize()); - - var lineHeight = renderer.layerConfig.lineHeight; - - var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); - pos.left -= this.popup.getTextLeftOffset(); - - var rect = editor.container.getBoundingClientRect(); - pos.top += rect.top - renderer.layerConfig.offset; - pos.left += rect.left - editor.renderer.scrollLeft; - pos.left += renderer.gutterWidth; - - this.popup.show(pos, lineHeight); - } else if (keepPopupPosition && !prefix) { - this.detach(); + this.$updatePopupPosition(); + if (this.tooltipNode) { + this.updateDocTooltip(); + } } this.changeTimer.cancel(); - }; - - this.detach = function() { - this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); - this.editor.off("changeSelection", this.changeListener); - this.editor.off("blur", this.blurListener); - this.editor.off("mousedown", this.mousedownListener); - this.editor.off("mousewheel", this.mousewheelListener); + this.observeLayoutChanges(); + }; + Autocomplete.prototype.detach = function () { + if (this.editor) { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + } + this.$firstOpenTimer.cancel(); this.changeTimer.cancel(); this.hideDocTooltip(); - - this.gatherCompletionsId += 1; + if (this.completionProvider) { + this.completionProvider.detach(); + } if (this.popup && this.popup.isOpen) this.popup.hide(); - + if (this.popup && this.popup.renderer) { + this.popup.renderer.off("afterRender", this.$onPopupRender); + } if (this.base) this.base.detach(); this.activated = false; - this.completions = this.base = null; + this.completionProvider = this.completions = this.base = null; + this.unObserveLayoutChanges(); }; - - this.changeListener = function(e) { + Autocomplete.prototype.changeListener = function (e) { var cursor = this.editor.selection.lead; if (cursor.row != this.base.row || cursor.column < this.base.column) { this.detach(); @@ -1519,284 +1808,248 @@ var Autocomplete = function() { else this.detach(); }; - - this.blurListener = function(e) { + Autocomplete.prototype.blurListener = function (e) { var el = document.activeElement; var text = this.editor.textInput.getElement(); var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); var container = this.popup && this.popup.container; if (el != text && el.parentNode != container && !fromTooltip - && el != this.tooltipNode && e.relatedTarget != text - ) { + && el != this.tooltipNode && e.relatedTarget != text) { this.detach(); } }; - - this.mousedownListener = function(e) { + Autocomplete.prototype.mousedownListener = function (e) { this.detach(); }; - - this.mousewheelListener = function(e) { - this.detach(); + Autocomplete.prototype.mousewheelListener = function (e) { + if (this.popup && !this.popup.isMouseOver) + this.detach(); }; - - this.goTo = function(where) { + Autocomplete.prototype.mouseOutListener = function (e) { + if (this.popup.isOpen) + this.$updatePopupPosition(); + }; + Autocomplete.prototype.goTo = function (where) { this.popup.goTo(where); }; - - this.insertMatch = function(data, options) { + Autocomplete.prototype.insertMatch = function (data, options) { if (!data) data = this.popup.getData(this.popup.getRow()); if (!data) return false; - + if (data.value === "") // Explicitly given nothing to insert, e.g. "No suggestion state" + return this.detach(); var completions = this.completions; - this.editor.startOperation({command: {name: "insertMatch"}}); - if (data.completer && data.completer.insertMatch) { - data.completer.insertMatch(this.editor, data); - } else { - if (!completions) - return false; - if (completions.filterText) { - var ranges = this.editor.selection.getAllRanges(); - for (var i = 0, range; range = ranges[i]; i++) { - range.start.column -= completions.filterText.length; - this.editor.session.remove(range); - } - } - if (data.snippet) - snippetManager.insertSnippet(this.editor, data.snippet); - else - this.editor.execCommand("insertstring", data.value || data); - } + var result = this.getCompletionProvider().insertMatch(this.editor, data, completions.filterText, options); if (this.completions == completions) this.detach(); - this.editor.endOperation(); - }; - - - this.commands = { - "Up": function(editor) { editor.completer.goTo("up"); }, - "Down": function(editor) { editor.completer.goTo("down"); }, - "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, - "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, - - "Esc": function(editor) { editor.completer.detach(); }, - "Return": function(editor) { return editor.completer.insertMatch(); }, - "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, - "Tab": function(editor) { - var result = editor.completer.insertMatch(); - if (!result && !editor.tabstopManager) - editor.completer.goTo("down"); - else - return result; - }, - - "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, - "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } - }; - - this.gatherCompletions = function(editor, callback) { - var session = editor.getSession(); - var pos = editor.getCursorPosition(); - - var prefix = util.getCompletionPrefix(editor); - - this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); - this.base.$insertRight = true; - - var matches = []; - var total = editor.completers.length; - editor.completers.forEach(function(completer, i) { - completer.getCompletions(editor, session, pos, prefix, function(err, results) { - if (!err && results) - matches = matches.concat(results); - callback(null, { - prefix: util.getCompletionPrefix(editor), - matches: matches, - finished: (--total === 0) - }); - }); - }); - return true; + return result; }; - - this.showPopup = function(editor, options) { + Autocomplete.prototype.showPopup = function (editor, options) { if (this.editor) this.detach(); - this.activated = true; - this.editor = editor; if (editor.completer != this) { if (editor.completer) editor.completer.detach(); editor.completer = this; } - editor.on("changeSelection", this.changeListener); editor.on("blur", this.blurListener); editor.on("mousedown", this.mousedownListener); editor.on("mousewheel", this.mousewheelListener); - this.updateCompletions(false, options); }; - - this.updateCompletions = function(keepPopupPosition, options) { + Autocomplete.prototype.getCompletionProvider = function (initialPosition) { + if (!this.completionProvider) + this.completionProvider = new CompletionProvider(initialPosition); + return this.completionProvider; + }; + Autocomplete.prototype.gatherCompletions = function (editor, callback) { + return this.getCompletionProvider().gatherCompletions(editor, callback); + }; + Autocomplete.prototype.updateCompletions = function (keepPopupPosition, options) { if (keepPopupPosition && this.base && this.completions) { var pos = this.editor.getCursorPosition(); - var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + var prefix = this.editor.session.getTextRange({ start: this.base, end: pos }); if (prefix == this.completions.filterText) return; this.completions.setFilter(prefix); if (!this.completions.filtered.length) return this.detach(); if (this.completions.filtered.length == 1 - && this.completions.filtered[0].value == prefix - && !this.completions.filtered[0].snippet) + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) return this.detach(); this.openPopup(this.editor, prefix, keepPopupPosition); return; } - if (options && options.matches) { var pos = this.editor.getSelectionRange().start; this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); this.base.$insertRight = true; this.completions = new FilteredList(options.matches); + this.getCompletionProvider().completions = this.completions; return this.openPopup(this.editor, "", keepPopupPosition); } - var _id = this.gatherCompletionsId; - var detachIfFinished = function(results) { - if (!results.finished) return; - return this.detach(); - }.bind(this); - - var processResults = function(results) { - var prefix = results.prefix; - var matches = results.matches; - - this.completions = new FilteredList(matches); - - if (this.exactMatch) - this.completions.exactMatch = true; - - this.completions.setFilter(prefix); - var filtered = this.completions.filtered; - if (!filtered.length) - return detachIfFinished(results); - if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) - return detachIfFinished(results); - if (this.autoInsert && filtered.length == 1 && results.finished) - return this.insertMatch(filtered[0]); - - this.openPopup(this.editor, prefix, keepPopupPosition); - }.bind(this); - - var isImmediate = true; - var immediateResults = null; - this.gatherCompletions(this.editor, function(err, results) { - var prefix = results.prefix; - var matches = results && results.matches; - - if (!matches || !matches.length) - return detachIfFinished(results); - if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) - return; - if (isImmediate) { - immediateResults = results; - return; + var session = this.editor.getSession(); + var pos = this.editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(this.editor); + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + var completionOptions = { + exactMatch: this.exactMatch, + ignoreCaption: this.ignoreCaption + }; + this.getCompletionProvider({ + prefix: prefix, + pos: pos + }).provideCompletions(this.editor, completionOptions, + function (err, completions, finished) { + var filtered = completions.filtered; + var prefix = util.getCompletionPrefix(this.editor); + this.$firstOpenTimer.cancel(); + if (finished) { + if (!filtered.length) { + var emptyMessage = !this.autoShown && this.emptyMessage; + if (typeof emptyMessage == "function") + emptyMessage = this.emptyMessage(prefix); + if (emptyMessage) { + var completionsForEmpty = [{ + caption: emptyMessage, + value: "" + } + ]; + this.completions = new FilteredList(completionsForEmpty); + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_loading", false); + this.popup.renderer.setStyle("ace_empty-message", true); + return; + } + return this.detach(); + } + if (filtered.length == 1 && filtered[0].value == prefix + && !filtered[0].snippet) + return this.detach(); + if (this.autoInsert && !this.autoShown && filtered.length == 1) + return this.insertMatch(filtered[0]); } - - processResults(results); + this.completions = !finished && this.showLoadingState ? + new FilteredList(Autocomplete.completionsForLoading.concat(filtered), completions.filterText) : + completions; + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_empty-message", false); + this.popup.renderer.setStyle("ace_loading", !finished); }.bind(this)); - - isImmediate = false; - if (immediateResults) { - var results = immediateResults; - immediateResults = null; - processResults(results); + if (this.showLoadingState && !this.autoShown && !(this.popup && this.popup.isOpen)) { + this.$firstOpenTimer.delay(this.stickySelectionDelay / 2); } }; - - this.cancelContextMenu = function() { + Autocomplete.prototype.cancelContextMenu = function () { this.editor.$mouseHandler.cancelContextMenu(); }; - - this.updateDocTooltip = function() { + Autocomplete.prototype.updateDocTooltip = function () { var popup = this.popup; - var all = popup.data; + var all = this.completions && this.completions.filtered; var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); var doc = null; if (!selected || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); - this.editor.completers.some(function(completer) { - if (completer.getDocTooltip) + var completersLength = this.editor.completers.length; + for (var i = 0; i < completersLength; i++) { + var completer = this.editor.completers[i]; + if (completer.getDocTooltip && selected.completerId === completer.id) { doc = completer.getDocTooltip(selected); - return doc; - }); + break; + } + } if (!doc && typeof selected != "string") doc = selected; - if (typeof doc == "string") - doc = {docText: doc}; + doc = { docText: doc }; if (!doc || !(doc.docHTML || doc.docText)) return this.hideDocTooltip(); this.showDocTooltip(doc); }; - - this.showDocTooltip = function(item) { + Autocomplete.prototype.showDocTooltip = function (item) { if (!this.tooltipNode) { this.tooltipNode = dom.createElement("div"); - this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; - this.tooltipNode.style.margin = 0; + this.tooltipNode.style.margin = "0"; this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.style.overscrollBehavior = "contain"; this.tooltipNode.tabIndex = -1; this.tooltipNode.onblur = this.blurListener.bind(this); this.tooltipNode.onclick = this.onTooltipClick.bind(this); + this.tooltipNode.id = "doc-tooltip"; + this.tooltipNode.setAttribute("role", "tooltip"); + this.tooltipNode.addEventListener("wheel", preventParentScroll); } - + var theme = this.editor.renderer.theme; + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip " + + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); var tooltipNode = this.tooltipNode; if (item.docHTML) { tooltipNode.innerHTML = item.docHTML; - } else if (item.docText) { + } + else if (item.docText) { tooltipNode.textContent = item.docText; } - if (!tooltipNode.parentNode) - document.body.appendChild(tooltipNode); + this.popup.container.appendChild(this.tooltipNode); var popup = this.popup; var rect = popup.container.getBoundingClientRect(); - tooltipNode.style.top = popup.container.style.top; - tooltipNode.style.bottom = popup.container.style.bottom; - - tooltipNode.style.display = "block"; - if (window.innerWidth - rect.right < 320) { - if (rect.left < 320) { - if(popup.isTopdown) { - tooltipNode.style.top = rect.bottom + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } else { - tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } - } else { - tooltipNode.style.right = window.innerWidth - rect.left + "px"; - tooltipNode.style.left = ""; + var targetWidth = 400; + var targetHeight = 300; + var scrollBarSize = popup.renderer.scrollBar.width || 10; + var leftSize = rect.left; + var rightSize = window.innerWidth - rect.right - scrollBarSize; + var topSize = popup.isTopdown ? window.innerHeight - scrollBarSize - rect.bottom : rect.top; + var scores = [ + Math.min(rightSize / targetWidth, 1), + Math.min(leftSize / targetWidth, 1), + Math.min(topSize / targetHeight, 1) * 0.9, + ]; + var max = Math.max.apply(Math, scores); + var tooltipStyle = tooltipNode.style; + tooltipStyle.display = "block"; + if (max == scores[0] || scores[0] >= 1) { + tooltipStyle.left = (rect.right + 1) + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[1] || scores[1] >= 1) { + tooltipStyle.right = window.innerWidth - rect.left + "px"; + tooltipStyle.left = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[2]) { + tooltipStyle.left = rect.left + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = Math.min(targetWidth, window.innerWidth - rect.left) + "px"; + if (popup.isTopdown) { + tooltipStyle.top = rect.bottom + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.bottom, targetHeight) + "px"; + } + else { + tooltipStyle.top = ""; + tooltipStyle.bottom = (window.innerHeight - rect.top) + "px"; + tooltipStyle.maxHeight = Math.min(rect.top, targetHeight) + "px"; } - } else { - tooltipNode.style.left = (rect.right + 1) + "px"; - tooltipNode.style.right = ""; } + dom.$fixPositionBug(tooltipNode); }; - - this.hideDocTooltip = function() { + Autocomplete.prototype.hideDocTooltip = function () { this.tooltipTimer.cancel(); - if (!this.tooltipNode) return; + if (!this.tooltipNode) + return; var el = this.tooltipNode; if (!this.editor.isFocused() && document.activeElement == el) this.editor.focus(); @@ -1804,8 +2057,7 @@ var Autocomplete = function() { if (el.parentNode) el.parentNode.removeChild(el); }; - - this.onTooltipClick = function(e) { + Autocomplete.prototype.onTooltipClick = function (e) { var a = e.target; while (a && a != this.tooltipNode) { if (a.nodeName == "A" && a.href) { @@ -1816,8 +2068,7 @@ var Autocomplete = function() { a = a.parentNode; } }; - - this.destroy = function() { + Autocomplete.prototype.destroy = function () { this.detach(); if (this.popup) { this.popup.destroy(); @@ -1825,92 +2076,260 @@ var Autocomplete = function() { if (el && el.parentNode) el.parentNode.removeChild(el); } - if (this.editor && this.editor.completer == this) - this.editor.completer == null; - this.popup = null; + if (this.editor && this.editor.completer == this) { + this.editor.off("destroy", destroyCompleter); + this.editor.completer = null; + } + this.inlineRenderer = this.popup = this.editor = null; }; - -}).call(Autocomplete.prototype); - - -Autocomplete.for = function(editor) { - if (editor.completer) { - return editor.completer; - } - if (config.get("sharedPopups")) { - if (!Autocomplete.$shared) - Autocomplete.$sharedInstance = new Autocomplete(); - editor.completer = Autocomplete.$sharedInstance; - } else { - editor.completer = new Autocomplete(); - editor.once("destroy", function(e, editor) { + Autocomplete.for = function (editor) { + if (editor.completer instanceof Autocomplete) { + return editor.completer; + } + if (editor.completer) { editor.completer.destroy(); - }); - } - return editor.completer; + editor.completer = null; + } + if (config.get("sharedPopups")) { + if (!Autocomplete["$sharedInstance"]) + Autocomplete["$sharedInstance"] = new Autocomplete(); + editor.completer = Autocomplete["$sharedInstance"]; + } + else { + editor.completer = new Autocomplete(); + editor.once("destroy", destroyCompleter); + } + return editor.completer; + }; + return Autocomplete; +}()); +Autocomplete.prototype.commands = { + "Up": function (editor) { editor.completer.goTo("up"); }, + "Down": function (editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function (editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function (editor) { editor.completer.goTo("end"); }, + "Esc": function (editor) { editor.completer.detach(); }, + "Return": function (editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function (editor) { editor.completer.insertMatch(null, { deleteSuffix: true }); }, + "Tab": function (editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + "Backspace": function (editor) { + editor.execCommand("backspace"); + var prefix = util.getCompletionPrefix(editor); + if (!prefix && editor.completer) + editor.completer.detach(); + }, + "PageUp": function (editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function (editor) { editor.completer.popup.gotoPageDown(); } }; - Autocomplete.startCommand = { name: "startAutocomplete", - exec: function(editor, options) { + exec: function (editor, options) { var completer = Autocomplete.for(editor); completer.autoInsert = false; completer.autoSelect = true; + completer.autoShown = false; completer.showPopup(editor, options); completer.cancelContextMenu(); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; - -var FilteredList = function(array, filterText) { - this.all = array; - this.filtered = array; - this.filterText = filterText || ""; - this.exactMatch = false; -}; -(function(){ - this.setFilter = function(str) { +var CompletionProvider = /** @class */ (function () { + function CompletionProvider(initialPosition) { + this.initialPosition = initialPosition; + this.active = true; + } + CompletionProvider.prototype.insertByIndex = function (editor, index, options) { + if (!this.completions || !this.completions.filtered) { + return false; + } + return this.insertMatch(editor, this.completions.filtered[index], options); + }; + CompletionProvider.prototype.insertMatch = function (editor, data, options) { + if (!data) + return false; + editor.startOperation({ command: { name: "insertMatch" } }); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(editor, data); + } + else { + if (!this.completions) + return false; + var replaceBefore = this.completions.filterText.length; + var replaceAfter = 0; + if (data.range && data.range.start.row === data.range.end.row) { + replaceBefore -= this.initialPosition.prefix.length; + replaceBefore += this.initialPosition.pos.column - data.range.start.column; + replaceAfter += data.range.end.column - this.initialPosition.pos.column; + } + if (replaceBefore || replaceAfter) { + var ranges; + if (editor.selection.getAllRanges) { + ranges = editor.selection.getAllRanges(); + } + else { + ranges = [editor.getSelectionRange()]; + } + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= replaceBefore; + range.end.column += replaceAfter; + editor.session.remove(range); + } + } + if (data.snippet) { + snippetManager.insertSnippet(editor, data.snippet); + } + else { + this.$insertString(editor, data); + } + if (data.completer && data.completer.onInsert && typeof data.completer.onInsert == "function") { + data.completer.onInsert(editor, data); + } + if (data.command && data.command === "startAutocomplete") { + editor.execCommand(data.command); + } + } + editor.endOperation(); + return true; + }; + CompletionProvider.prototype.$insertString = function (editor, data) { + var text = data.value || data; + editor.execCommand("insertstring", text); + }; + CompletionProvider.prototype.gatherCompletions = function (editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(editor); + var matches = []; + this.completers = editor.completers; + var total = editor.completers.length; + editor.completers.forEach(function (completer, i) { + completer.getCompletions(editor, session, pos, prefix, function (err, results) { + if (completer.hideInlinePreview) + results = results.map(function (result) { + return Object.assign(result, { hideInlinePreview: completer.hideInlinePreview }); + }); + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + CompletionProvider.prototype.provideCompletions = function (editor, options, callback) { + var processResults = function (results) { + var prefix = results.prefix; + var matches = results.matches; + this.completions = new FilteredList(matches); + if (options.exactMatch) + this.completions.exactMatch = true; + if (options.ignoreCaption) + this.completions.ignoreCaption = true; + this.completions.setFilter(prefix); + if (results.finished || this.completions.filtered.length) + callback(null, this.completions, results.finished); + }.bind(this); + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(editor, function (err, results) { + if (!this.active) { + return; + } + if (err) { + callback(err, [], true); + this.detach(); + } + var prefix = results.prefix; + if (prefix.indexOf(results.prefix) !== 0) + return; + if (isImmediate) { + immediateResults = results; + return; + } + processResults(results); + }.bind(this)); + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + CompletionProvider.prototype.detach = function () { + this.active = false; + this.completers && this.completers.forEach(function (completer) { + if (typeof completer.cancel === "function") { + completer.cancel(); + } + }); + }; + return CompletionProvider; +}()); +var FilteredList = /** @class */ (function () { + function FilteredList(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; + this.ignoreCaption = false; + } + FilteredList.prototype.setFilter = function (str) { if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) var matches = this.filtered; else var matches = this.all; - this.filterText = str; matches = this.filterCompletions(matches, this.filterText); - matches = matches.sort(function(a, b) { - return b.exactMatch - a.exactMatch || b.$score - a.$score + matches = matches.sort(function (a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score || (a.caption || a.value).localeCompare(b.caption || b.value); }); var prev = null; - matches = matches.filter(function(item){ + matches = matches.filter(function (item) { var caption = item.snippet || item.caption || item.value; - if (caption === prev) return false; + if (caption === prev) + return false; prev = caption; return true; }); - this.filtered = matches; }; - this.filterCompletions = function(items, needle) { + FilteredList.prototype.filterCompletions = function (items, needle) { var results = []; var upper = needle.toUpperCase(); var lower = needle.toLowerCase(); loop: for (var i = 0, item; item = items[i]; i++) { - var caption = item.caption || item.value || item.snippet; - if (!caption) continue; + if (item.skipFilter) { + item.$score = item.score; + results.push(item); + continue; + } + var caption = (!this.ignoreCaption && item.caption) || item.value || item.snippet; + if (!caption) + continue; var lastIndex = -1; var matchMask = 0; var penalty = 0; var index, distance; - if (this.exactMatch) { if (needle !== caption.substr(0, needle.length)) continue loop; - } else { + } + else { var fullMatchIndex = caption.toLowerCase().indexOf(lower); if (fullMatchIndex > -1) { penalty = fullMatchIndex; - } else { + } + else { for (var j = 0; j < needle.length; j++) { var i1 = caption.indexOf(lower[j], lastIndex + 1); var i2 = caption.indexOf(upper[j], lastIndex + 1); @@ -1933,113 +2352,205 @@ var FilteredList = function(array, filterText) { item.$score = (item.score || 0) - penalty; results.push(item); } - var keywords = []; - for (var i=0, j=results.length; i=0;){ - if (!results[i]) continue - if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ - results.splice(i,1) - } - } - return results; }; -}).call(FilteredList.prototype); - + return FilteredList; +}()); exports.Autocomplete = Autocomplete; +exports.CompletionProvider = CompletionProvider; exports.FilteredList = FilteredList; }); -define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module) { - var Range = require("../range").Range; - - var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; - - function getWordIndex(doc, pos) { - var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos)); - return textBefore.split(splitRegex).length - 1; +define("ace/marker_group",["require","exports","module"], function(require, exports, module){"use strict"; +var MarkerGroup = /** @class */ (function () { + function MarkerGroup(session, options) { + if (options) + this.markerType = options.markerType; + this.markers = []; + this.session = session; + session.addDynamicMarker(this); } - function wordDistance(doc, pos) { - var prefixPos = getWordIndex(doc, pos); - var words = doc.getValue().split(splitRegex); - var wordScores = Object.create(null); - - var currentWord = words[prefixPos]; + MarkerGroup.prototype.getMarkerAtPosition = function (pos) { + return this.markers.find(function (marker) { + return marker.range.contains(pos.row, pos.column); + }); + }; + MarkerGroup.prototype.markersComparator = function (a, b) { + return a.range.start.row - b.range.start.row; + }; + MarkerGroup.prototype.setMarkers = function (markers) { + this.markers = markers.sort(this.markersComparator).slice(0, this.MAX_MARKERS); + this.session._signal("changeBackMarker"); + }; + MarkerGroup.prototype.update = function (html, markerLayer, session, config) { + if (!this.markers || !this.markers.length) + return; + var visibleRangeStartRow = config.firstRow, visibleRangeEndRow = config.lastRow; + var foldLine; + var markersOnOneLine = 0; + var lastRow = 0; + for (var i = 0; i < this.markers.length; i++) { + var marker = this.markers[i]; + if (marker.range.end.row < visibleRangeStartRow) + continue; + if (marker.range.start.row > visibleRangeEndRow) + continue; + if (marker.range.start.row === lastRow) { + markersOnOneLine++; + } + else { + lastRow = marker.range.start.row; + markersOnOneLine = 0; + } + if (markersOnOneLine > 200) { + continue; + } + var markerVisibleRange = marker.range.clipRows(visibleRangeStartRow, visibleRangeEndRow); + if (markerVisibleRange.start.row === markerVisibleRange.end.row + && markerVisibleRange.start.column === markerVisibleRange.end.column) { + continue; // visible range is empty + } + var screenRange = markerVisibleRange.toScreenRange(session); + if (screenRange.isEmpty()) { + foldLine = session.getNextFoldLine(markerVisibleRange.end.row, foldLine); + if (foldLine && foldLine.end.row > markerVisibleRange.end.row) { + visibleRangeStartRow = foldLine.end.row; + } + continue; + } + if (this.markerType === "fullLine") { + markerLayer.drawFullLineMarker(html, screenRange, marker.className, config); + } + else if (screenRange.isMultiLine()) { + if (this.markerType === "line") + markerLayer.drawMultiLineMarker(html, screenRange, marker.className, config); + else + markerLayer.drawTextMarker(html, screenRange, marker.className, config); + } + else { + markerLayer.drawSingleLineMarker(html, screenRange, marker.className + " ace_br15", config); + } + } + }; + return MarkerGroup; +}()); +MarkerGroup.prototype.MAX_MARKERS = 10000; +exports.MarkerGroup = MarkerGroup; - words.forEach(function(word, idx) { - if (!word || word === currentWord) return; +}); - var distance = Math.abs(prefixPos - idx); - var score = words.length - distance; - if (wordScores[word]) { - wordScores[word] = Math.max(score, wordScores[word]); - } else { - wordScores[word] = score; - } - }); - return wordScores; - } +define("ace/autocomplete/text_completer",["require","exports","module","ace/range"], function(require, exports, module){var Range = require("../range").Range; +var splitRegex = /[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/; +function getWordIndex(doc, pos) { + var textBefore = doc.getTextRange(Range.fromPoints({ + row: 0, + column: 0 + }, pos)); + return textBefore.split(splitRegex).length - 1; +} +function wordDistance(doc, pos) { + var prefixPos = getWordIndex(doc, pos); + var words = doc.getValue().split(splitRegex); + var wordScores = Object.create(null); + var currentWord = words[prefixPos]; + words.forEach(function (word, idx) { + if (!word || word === currentWord) + return; + var distance = Math.abs(prefixPos - idx); + var score = words.length - distance; + if (wordScores[word]) { + wordScores[word] = Math.max(score, wordScores[word]); + } + else { + wordScores[word] = score; + } + }); + return wordScores; +} +exports.id = "textCompleter"; +exports.getCompletions = function (editor, session, pos, prefix, callback) { + var wordScore = wordDistance(session, pos); + var wordList = Object.keys(wordScore); + callback(null, wordList.map(function (word) { + return { + caption: word, + value: word, + score: wordScore[word], + meta: "local" + }; + })); +}; - exports.getCompletions = function(editor, session, pos, prefix, callback) { - var wordScore = wordDistance(session, pos); - var wordList = Object.keys(wordScore); - callback(null, wordList.map(function(word) { - return { - caption: word, - value: word, - score: wordScore[word], - meta: "local" - }; - })); - }; }); -define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/marker_group","ace/autocomplete/text_completer","ace/editor","ace/config"], function(require, exports, module){/** + * ## Language Tools extension for Ace Editor + * + * Provides autocompletion, snippets, and language intelligence features for the Ace code editor. + * This extension integrates multiple completion providers including keyword completion, snippet expansion, + * and text-based completion to enhance the coding experience with contextual suggestions and automated code generation. + * + * **Configuration Options:** + * - `enableBasicAutocompletion`: Enable/disable basic completion functionality + * - `enableLiveAutocompletion`: Enable/disable real-time completion suggestions + * - `enableSnippets`: Enable/disable snippet expansion with Tab key + * - `liveAutocompletionDelay`: Delay before showing live completion popup + * - `liveAutocompletionThreshold`: Minimum prefix length to trigger completion + * + * **Usage:** + * ```javascript + * editor.setOptions({ + * enableBasicAutocompletion: true, + * enableLiveAutocompletion: true, + * enableSnippets: true + * }); + * ``` + * + * @module + */ "use strict"; - var snippetManager = require("../snippets").snippetManager; var Autocomplete = require("../autocomplete").Autocomplete; var config = require("../config"); var lang = require("../lib/lang"); var util = require("../autocomplete/util"); - +var MarkerGroup = require("../marker_group").MarkerGroup; var textCompleter = require("../autocomplete/text_completer"); var keyWordCompleter = { - getCompletions: function(editor, session, pos, prefix, callback) { + getCompletions: function (editor, session, pos, prefix, callback) { if (session.$mode.completer) { return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback); } var state = editor.session.getState(pos.row); var completions = session.$mode.getCompletions(state, session, pos, prefix); + completions = completions.map(function (el) { + el.completerId = keyWordCompleter.id; + return el; + }); callback(null, completions); - } + }, + id: "keywordCompleter" }; - -var transformSnippetTooltip = function(str) { +var transformSnippetTooltip = function (str) { var record = {}; - return str.replace(/\${(\d+)(:(.*?))?}/g, function(_, p1, p2, p3) { + return str.replace(/\${(\d+)(:(.*?))?}/g, function (_, p1, p2, p3) { return (record[p1] = p3 || ''); }).replace(/\$(\d+?)/g, function (_, p1) { return record[p1]; }); }; - var snippetCompleter = { - getCompletions: function(editor, session, pos, prefix, callback) { + getCompletions: function (editor, session, pos, prefix, callback) { var scopes = []; var token = session.getTokenAt(pos.row, pos.column); if (token && token.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/)) scopes.push('html-tag'); else scopes = snippetManager.getActiveScopes(editor); - var snippetMap = snippetManager.snippetMap; var completions = []; - scopes.forEach(function(scope) { + scopes.forEach(function (scope) { var snippets = snippetMap[scope] || []; for (var i = snippets.length; i--;) { var s = snippets[i]; @@ -2050,128 +2561,150 @@ var snippetCompleter = { caption: caption, snippet: s.content, meta: s.tabTrigger && !s.name ? s.tabTrigger + "\u21E5 " : "snippet", - type: "snippet" + completerId: snippetCompleter.id }); } }, this); callback(null, completions); }, - getDocTooltip: function(item) { - if (item.type == "snippet" && !item.docHTML) { + getDocTooltip: function (item) { + if (item.snippet && !item.docHTML) { item.docHTML = [ "", lang.escapeHTML(item.caption), "", "
", lang.escapeHTML(transformSnippetTooltip(item.snippet)) ].join(""); } - } + }, + id: "snippetCompleter" }; - var completers = [snippetCompleter, textCompleter, keyWordCompleter]; -exports.setCompleters = function(val) { +exports.setCompleters = function (val) { completers.length = 0; - if (val) completers.push.apply(completers, val); + if (val) + completers.push.apply(completers, val); }; -exports.addCompleter = function(completer) { +exports.addCompleter = function (completer) { completers.push(completer); }; exports.textCompleter = textCompleter; exports.keyWordCompleter = keyWordCompleter; exports.snippetCompleter = snippetCompleter; - var expandSnippet = { name: "expandSnippet", - exec: function(editor) { + exec: function (editor) { return snippetManager.expandWithTab(editor); }, bindKey: "Tab" }; - -var onChangeMode = function(e, editor) { +var onChangeMode = function (e, editor) { loadSnippetsForMode(editor.session.$mode); }; - -var loadSnippetsForMode = function(mode) { +var loadSnippetsForMode = function (mode) { if (typeof mode == "string") mode = config.$modes[mode]; if (!mode) return; if (!snippetManager.files) snippetManager.files = {}; - loadSnippetFile(mode.$id, mode.snippetFileId); if (mode.modes) mode.modes.forEach(loadSnippetsForMode); }; - -var loadSnippetFile = function(id, snippetFilePath) { +var loadSnippetFile = function (id, snippetFilePath) { if (!snippetFilePath || !id || snippetManager.files[id]) return; snippetManager.files[id] = {}; - config.loadModule(snippetFilePath, function(m) { - if (!m) return; + config.loadModule(snippetFilePath, function (m) { + if (!m) + return; snippetManager.files[id] = m; if (!m.snippets && m.snippetText) m.snippets = snippetManager.parseSnippetFile(m.snippetText); snippetManager.register(m.snippets || [], m.scope); if (m.includeScopes) { snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes; - m.includeScopes.forEach(function(x) { + m.includeScopes.forEach(function (x) { loadSnippetsForMode("ace/mode/" + x); }); } }); }; - -var doLiveAutocomplete = function(e) { +var doLiveAutocomplete = function (e) { var editor = e.editor; var hasCompleter = editor.completer && editor.completer.activated; if (e.command.name === "backspace") { if (hasCompleter && !util.getCompletionPrefix(editor)) editor.completer.detach(); } - else if (e.command.name === "insertstring") { - var prefix = util.getCompletionPrefix(editor); - if (prefix && !hasCompleter) { - var completer = Autocomplete.for(editor); - completer.autoInsert = false; - completer.showPopup(editor); + else if (e.command.name === "insertstring" && !hasCompleter) { + lastExecEvent = e; + var delay = e.editor.$liveAutocompletionDelay; + if (delay) { + liveAutocompleteTimer.delay(delay); + } + else { + showLiveAutocomplete(e); } } }; - +var lastExecEvent; +var liveAutocompleteTimer = lang.delayedCall(function () { + showLiveAutocomplete(lastExecEvent); +}, 0); +var showLiveAutocomplete = function (e) { + var editor = e.editor; + var prefix = util.getCompletionPrefix(editor); + var previousChar = e.args; + var triggerAutocomplete = util.triggerAutocomplete(editor, previousChar); + if (prefix && prefix.length >= editor.$liveAutocompletionThreshold || triggerAutocomplete) { + var completer = Autocomplete.for(editor); + completer.autoShown = true; + completer.showPopup(editor); + } +}; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { enableBasicAutocompletion: { - set: function(val) { + set: function (val) { if (val) { + Autocomplete.for(this); if (!this.completers) - this.completers = Array.isArray(val)? val: completers; + this.completers = Array.isArray(val) ? val : completers; this.commands.addCommand(Autocomplete.startCommand); - } else { + } + else { this.commands.removeCommand(Autocomplete.startCommand); } }, value: false }, enableLiveAutocompletion: { - set: function(val) { + set: function (val) { if (val) { if (!this.completers) - this.completers = Array.isArray(val)? val: completers; + this.completers = Array.isArray(val) ? val : completers; this.commands.on('afterExec', doLiveAutocomplete); - } else { - this.commands.removeListener('afterExec', doLiveAutocomplete); + } + else { + this.commands.off('afterExec', doLiveAutocomplete); } }, value: false }, + liveAutocompletionDelay: { + initialValue: 0 + }, + liveAutocompletionThreshold: { + initialValue: 0 + }, enableSnippets: { - set: function(val) { + set: function (val) { if (val) { this.commands.addCommand(expandSnippet); this.on("changeMode", onChangeMode); onChangeMode(null, this); - } else { + } + else { this.commands.removeCommand(expandSnippet); this.off("changeMode", onChangeMode); } @@ -2179,6 +2712,8 @@ require("../config").defineOptions(Editor.prototype, "editor", { value: false } }); +exports.MarkerGroup = MarkerGroup; + }); (function() { window.require(["ace/ext/language_tools"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-linking.js b/app/Resources/ui/js/ace/ext-linking.js index 147efe9..4afb848 100644 --- a/app/Resources/ui/js/ace/ext-linking.js +++ b/app/Resources/ui/js/ace/ext-linking.js @@ -1,14 +1,22 @@ -define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { - +define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Interactive Linking Extension + * + * Enables clickable links and hover interactions in the editor when the Control key is pressed. Provides + * keyboard-accelerated navigation by detecting tokens under the cursor and emitting custom events that can be handled + * by external code to implement go-to-definition, symbol navigation, or other link-based functionality. + * + * **Enable:** `editor.setOption("enableLinking", true)` + * @module + */ var Editor = require("../editor").Editor; - require("../config").defineOptions(Editor.prototype, "editor", { enableLinking: { - set: function(val) { + set: function (val) { if (val) { this.on("click", onClick); this.on("mousemove", onMouseMove); - } else { + } + else { this.off("click", onClick); this.off("mousemove", onMouseMove); } @@ -16,41 +24,35 @@ require("../config").defineOptions(Editor.prototype, "editor", { value: false } }); - exports.previousLinkingHover = false; - function onMouseMove(e) { var editor = e.editor; var ctrl = e.getAccelKey(); - if (ctrl) { var editor = e.editor; var docPos = e.getDocumentPosition(); var session = editor.session; var token = session.getTokenAt(docPos.row, docPos.column); - if (exports.previousLinkingHover && exports.previousLinkingHover != token) { editor._emit("linkHoverOut"); } - editor._emit("linkHover", {position: docPos, token: token}); + editor._emit("linkHover", { position: docPos, token: token }); exports.previousLinkingHover = token; - } else if (exports.previousLinkingHover) { + } + else if (exports.previousLinkingHover) { editor._emit("linkHoverOut"); exports.previousLinkingHover = false; } } - function onClick(e) { var ctrl = e.getAccelKey(); var button = e.getButton(); - if (button == 0 && ctrl) { var editor = e.editor; var docPos = e.getDocumentPosition(); var session = editor.session; var token = session.getTokenAt(docPos.row, docPos.column); - - editor._emit("linkClick", {position: docPos, token: token}); + editor._emit("linkClick", { position: docPos, token: token }); } } diff --git a/app/Resources/ui/js/ace/ext-modelist.js b/app/Resources/ui/js/ace/ext-modelist.js index 20a8fa7..de5fc01 100644 --- a/app/Resources/ui/js/ace/ext-modelist.js +++ b/app/Resources/ui/js/ace/ext-modelist.js @@ -1,6 +1,14 @@ -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -13,203 +21,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -226,7 +256,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -236,12 +265,9 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); (function() { window.require(["ace/ext/modelist"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-options.js b/app/Resources/ui/js/ace/ext-options.js index be4b96d..5547085 100644 --- a/app/Resources/ui/js/ace/ext-options.js +++ b/app/Resources/ui/js/ace/ext-options.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,9 +78,58 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module){/** + * ## Interactive Settings Menu Extension + * + * Provides settings interface for the Ace editor that displays dynamically generated configuration options based on + * the current editor state. The menu appears as an overlay panel allowing users to modify editor options, themes, + * modes, and other settings through an intuitive graphical interface. + * + * **Usage:** + * ```javascript + * editor.showSettingsMenu(); + * ``` + * + * The extension automatically registers the `showSettingsMenu` command and method + * on the editor instance when initialized. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * + * @module + */ "use strict"; +var OptionPanel = require("./options").OptionPanel; +var overlayPage = require('./menu_tools/overlay_page').overlayPage; +function showSettingsMenu(editor) { + if (!document.getElementById('ace_settingsmenu')) { + var options = new OptionPanel(editor); + options.render(); + options.container.id = "ace_settingsmenu"; + overlayPage(editor, options.container); + options.container.querySelector("select,input,button,checkbox").focus(); + } +} +module.exports.init = function () { + var Editor = require("../editor").Editor; + Editor.prototype.showSettingsMenu = function () { + showSettingsMenu(this); + }; +}; + +}); +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ +"use strict"; var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -134,203 +142,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -347,7 +377,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -357,63 +386,73 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], @@ -427,30 +466,39 @@ exports.themes = themeData.map(function(data) { }); -define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +define("ace/ext/options",["require","exports","module","ace/ext/settings_menu","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module){/** + * ## Settings Menu extension + * + * Provides a settings panel for configuring editor options through an interactive UI. + * Creates a tabular interface with grouped configuration options including themes, modes, keybindings, + * font settings, display preferences, and advanced editor behaviors. Supports dynamic option rendering + * with various input types (dropdowns, checkboxes, number inputs, button bars) and real-time updates. + * + * **Usage:** + * ```javascript + * var OptionPanel = require("ace/ext/settings_menu").OptionPanel; + * var panel = new OptionPanel(editor); + * panel.render(); + * ``` + * + * @module + */ "use strict"; - require("./menu_tools/overlay_page"); - var dom = require("../lib/dom"); var oop = require("../lib/oop"); var config = require("../config"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var buildDom = dom.buildDom; - var modelist = require("./modelist"); var themelist = require("./themelist"); - var themes = { Bright: [], Dark: [] }; -themelist.themes.forEach(function(x) { +themelist.themes.forEach(function (x) { themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); }); - -var modes = modelist.modes.map(function(x){ - return { caption: x.caption, value: x.mode }; +var modes = modelist.modes.map(function (x) { + return { caption: x.caption, value: x.mode }; }); - - var optionGroups = { Main: { Mode: { @@ -467,11 +515,11 @@ var optionGroups = { type: "buttonBar", path: "keyboardHandler", items: [ - { caption : "Ace", value : null }, - { caption : "Vim", value : "ace/keyboard/vim" }, - { caption : "Emacs", value : "ace/keyboard/emacs" }, - { caption : "Sublime", value : "ace/keyboard/sublime" }, - { caption : "VSCode", value : "ace/keyboard/vscode" } + { caption: "Ace", value: null }, + { caption: "Vim", value: "ace/keyboard/vim" }, + { caption: "Emacs", value: "ace/keyboard/emacs" }, + { caption: "Sublime", value: "ace/keyboard/sublime" }, + { caption: "VSCode", value: "ace/keyboard/vscode" } ] }, "Font Size": { @@ -479,53 +527,53 @@ var optionGroups = { type: "number", defaultValue: 12, defaults: [ - {caption: "12px", value: 12}, - {caption: "24px", value: 24} + { caption: "12px", value: 12 }, + { caption: "24px", value: 24 } ] }, "Soft Wrap": { type: "buttonBar", path: "wrap", items: [ - { caption : "Off", value : "off" }, - { caption : "View", value : "free" }, - { caption : "margin", value : "printMargin" }, - { caption : "40", value : "40" } + { caption: "Off", value: "off" }, + { caption: "View", value: "free" }, + { caption: "margin", value: "printMargin" }, + { caption: "40", value: "40" } ] }, "Cursor Style": { path: "cursorStyle", items: [ - { caption : "Ace", value : "ace" }, - { caption : "Slim", value : "slim" }, - { caption : "Smooth", value : "smooth" }, - { caption : "Smooth And Slim", value : "smooth slim" }, - { caption : "Wide", value : "wide" } + { caption: "Ace", value: "ace" }, + { caption: "Slim", value: "slim" }, + { caption: "Smooth", value: "smooth" }, + { caption: "Smooth And Slim", value: "smooth slim" }, + { caption: "Wide", value: "wide" } ] }, "Folding": { path: "foldStyle", items: [ - { caption : "Manual", value : "manual" }, - { caption : "Mark begin", value : "markbegin" }, - { caption : "Mark begin and end", value : "markbeginend" } + { caption: "Manual", value: "manual" }, + { caption: "Mark begin", value: "markbegin" }, + { caption: "Mark begin and end", value: "markbeginend" } ] }, "Soft Tabs": [{ - path: "useSoftTabs" - }, { - ariaLabel: "Tab Size", - path: "tabSize", - type: "number", - values: [2, 3, 4, 8, 16] - }], + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], "Overscroll": { type: "buttonBar", path: "scrollPastEnd", items: [ - { caption : "None", value : 0 }, - { caption : "Half", value : 0.5 }, - { caption : "Full", value : 1 } + { caption: "None", value: 0 }, + { caption: "Half", value: 0.5 }, + { caption: "Full", value: 1 } ] } }, @@ -556,6 +604,9 @@ var optionGroups = { "Show Indent Guides": { path: "displayIndentGuides" }, + "Highlight Indent Guides": { + path: "highlightIndentGuides" + }, "Persistent HScrollbar": { path: "hScrollBarAlwaysVisible" }, @@ -578,12 +629,12 @@ var optionGroups = { path: "fixedWidthGutter" }, "Show Print Margin": [{ - path: "showPrintMargin" - }, { - ariaLabel: "Print Margin", - type: "number", - path: "printMarginColumn" - }], + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], "Indented Soft Wrap": { path: "indentedSoftWrap" }, @@ -599,9 +650,9 @@ var optionGroups = { "Merge Undo Deltas": { path: "mergeUndoDeltas", items: [ - { caption : "Always", value : "always" }, - { caption : "Never", value : "false" }, - { caption : "Timed", value : "true" } + { caption: "Always", value: "always" }, + { caption: "Never", value: "false" }, + { caption: "Timed", value: "true" } ] }, "Elastic Tabstops": { @@ -618,144 +669,148 @@ var optionGroups = { }, "Live Autocompletion": { path: "enableLiveAutocompletion" + }, + "Custom scrollbar": { + path: "customScrollbar" + }, + "Use SVG gutter icons": { + path: "useSvgGutterIcons" + }, + "Annotations for folded lines": { + path: "showFoldedAnnotations" + }, + "Keyboard Accessibility Mode": { + path: "enableKeyboardAccessibility" } } }; - - -var OptionPanel = function(editor, element) { - this.editor = editor; - this.container = element || document.createElement("div"); - this.groups = []; - this.options = {}; -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.add = function(config) { +var OptionPanel = /** @class */ (function () { + function OptionPanel(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; + } + OptionPanel.prototype.add = function (config) { if (config.Main) oop.mixin(optionGroups.Main, config.Main); if (config.More) oop.mixin(optionGroups.More, config.More); }; - - this.render = function() { + OptionPanel.prototype.render = function () { this.container.innerHTML = ""; - buildDom(["table", {role: "presentation", id: "controls"}, + buildDom(["table", { role: "presentation", id: "controls" }, this.renderOptionGroup(optionGroups.Main), - ["tr", null, ["td", {colspan: 2}, - ["table", {role: "presentation", id: "more-controls"}, - this.renderOptionGroup(optionGroups.More) - ] - ]], - ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ["tr", null, ["td", { colspan: 2 }, + ["table", { role: "presentation", id: "more-controls" }, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", { colspan: 2 }, "version " + config.version]] ], this.container); }; - - this.renderOptionGroup = function(group) { - return Object.keys(group).map(function(key, i) { + OptionPanel.prototype.renderOptionGroup = function (group) { + return Object.keys(group).map(function (key, i) { var item = group[key]; if (!item.position) item.position = i / 10000; if (!item.label) item.label = key; return item; - }).sort(function(a, b) { + }).sort(function (a, b) { return a.position - b.position; - }).map(function(item) { + }).map(function (item) { return this.renderOption(item.label, item); }, this); }; - - this.renderOptionControl = function(key, option) { + OptionPanel.prototype.renderOptionControl = function (key, option) { var self = this; if (Array.isArray(option)) { - return option.map(function(x) { + return option.map(function (x) { return self.renderOptionControl(key, x); }); } var control; - var value = self.getOption(option); - if (option.values && option.type != "checkbox") { if (typeof option.values == "string") option.values = option.values.split("|"); - option.items = option.values.map(function(v) { + option.items = option.values.map(function (v) { return { value: v, name: v }; }); } - if (option.type == "buttonBar") { - control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { - return ["button", { - value: item.value, - ace_selected_button: value == item.value, - 'aria-pressed': value == item.value, - onclick: function() { - self.setOption(option, item.value); - var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); - for (var i = 0; i < nodes.length; i++) { - nodes[i].removeAttribute("ace_selected_button"); - nodes[i].setAttribute("aria-pressed", false); - } - this.setAttribute("ace_selected_button", true); - this.setAttribute("aria-pressed", true); - } - }, item.desc || item.caption || item.name]; - })]; - } else if (option.type == "number") { - control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { - self.setOption(option, parseInt(this.value)); - }}]; + control = ["div", { role: "group", "aria-labelledby": option.path + "-label" }, option.items.map(function (item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function () { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } + else if (option.type == "number") { + control = ["input", { type: "number", value: value || option.defaultValue, style: "width:3em", oninput: function () { + self.setOption(option, parseInt(this.value)); + } }]; if (option.ariaLabel) { control[1]["aria-label"] = option.ariaLabel; - } else { + } + else { control[1].id = key; } if (option.defaults) { - control = [control, option.defaults.map(function(item) { - return ["button", {onclick: function() { - var input = this.parentNode.firstChild; - input.value = item.value; - input.oninput(); - }}, item.caption]; - })]; + control = [control, option.defaults.map(function (item) { + return ["button", { onclick: function () { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + } }, item.caption]; + })]; } - } else if (option.items) { - var buildItems = function(items) { - return items.map(function(item) { + } + else if (option.items) { + var buildItems = function (items) { + return items.map(function (item) { return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; }); }; - - var items = Array.isArray(option.items) + var items = Array.isArray(option.items) ? buildItems(option.items) - : Object.keys(option.items).map(function(key) { - return ["optgroup", {"label": key}, buildItems(option.items[key])]; + : Object.keys(option.items).map(function (key) { + return ["optgroup", { "label": key }, buildItems(option.items[key])]; }); - control = ["select", { id: key, value: value, onchange: function() { - self.setOption(option, this.value); - } }, items]; - } else { + control = ["select", { id: key, value: value, onchange: function () { + self.setOption(option, this.value); + } }, items]; + } + else { if (typeof option.values == "string") option.values = option.values.split("|"); - if (option.values) value = value == option.values[1]; - control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { - var value = this.checked; - if (option.values) value = option.values[value ? 1 : 0]; - self.setOption(option, value); - }}]; + if (option.values) + value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function () { + var value = this.checked; + if (option.values) + value = option.values[value ? 1 : 0]; + self.setOption(option, value); + } }]; if (option.type == "checkedNumber") { control = [control, []]; } } return control; }; - - this.renderOption = function(key, option) { + OptionPanel.prototype.renderOption = function (key, option) { if (option.path && !option.onchange && !this.editor.$options[option.path]) return; var path = Array.isArray(option) ? option[0].path : option.path; @@ -763,36 +818,39 @@ var OptionPanel = function(editor, element) { var safeKey = "-" + path; var safeId = path + "-label"; var control = this.renderOptionControl(safeKey, option); - return ["tr", {class: "ace_optionsMenuEntry"}, ["td", - ["label", {for: safeKey, id: safeId}, key] - ], ["td", control]]; + return ["tr", { class: "ace_optionsMenuEntry" }, ["td", + ["label", { for: safeKey, id: safeId }, key] + ], ["td", control]]; }; - - this.setOption = function(option, value) { + OptionPanel.prototype.setOption = function (option, value) { if (typeof option == "string") option = this.options[option]; - if (value == "false") value = false; - if (value == "true") value = true; - if (value == "null") value = null; - if (value == "undefined") value = undefined; + if (value == "false") + value = false; + if (value == "true") + value = true; + if (value == "null") + value = null; + if (value == "undefined") + value = undefined; if (typeof value == "string" && parseFloat(value).toString() == value) value = parseFloat(value); if (option.onchange) option.onchange(value); else if (option.path) this.editor.setOption(option.path, value); - this._signal("setOption", {name: option.path, value: value}); + this._signal("setOption", { name: option.path, value: value }); }; - - this.getOption = function(option) { + OptionPanel.prototype.getOption = function (option) { if (option.getValue) return option.getValue(); return this.editor.getOption(option.path); }; - -}).call(OptionPanel.prototype); - + return OptionPanel; +}()); +oop.implement(OptionPanel.prototype, EventEmitter); exports.OptionPanel = OptionPanel; +exports.optionGroups = optionGroups; }); (function() { window.require(["ace/ext/options"], function(m) { diff --git a/app/Resources/ui/js/ace/ext-prompt.js b/app/Resources/ui/js/ace/ext-prompt.js index 247c16a..5489f39 100644 --- a/app/Resources/ui/js/ace/ext-prompt.js +++ b/app/Resources/ui/js/ace/ext-prompt.js @@ -1,437 +1,369 @@ -define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) { -"use strict"; -var keys = require("../../lib/keys"); -module.exports.getEditorKeybordShortcuts = function(editor) { - var KEY_MODS = keys.KEY_MODS; - var keybindings = []; - var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var ckb = handler.commandKeyBinding; - for (var i in ckb) { - var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); }); - var commands = ckb[i]; - if (!Array.isArray(commands)) - commands = [commands]; - commands.forEach(function(command) { - if (typeof command != "string") - command = command.name; - if (commandMap[command]) { - commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command}; - keybindings.push(commandMap[command]); - } - }); - } - }); - return keybindings; -}; - -}); - -define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom","ace/config","ace/lib/useragent"], function(require, exports, module){"use strict"; var Renderer = require("../virtual_renderer").VirtualRenderer; var Editor = require("../editor").Editor; var Range = require("../range").Range; var event = require("../lib/event"); var lang = require("../lib/lang"); var dom = require("../lib/dom"); - -var $singleLineEditor = function(el) { +var nls = require("../config").nls; +var userAgent = require("./../lib/useragent"); +var getAriaId = function (index) { + return "suggest-aria-id:".concat(index); +}; +var popupAriaRole = userAgent.isSafari ? "menu" : "listbox"; +var optionAriaRole = userAgent.isSafari ? "menuitem" : "option"; +var ariaActiveState = userAgent.isSafari ? "aria-current" : "aria-selected"; +var $singleLineEditor = function (el) { var renderer = new Renderer(el); - renderer.$maxLines = 4; - var editor = new Editor(renderer); - editor.setHighlightActiveLine(false); editor.setShowPrintMargin(false); editor.renderer.setShowGutter(false); editor.renderer.setHighlightGutterLine(false); - editor.$mouseHandler.$focusTimeout = 0; editor.$highlightTagPending = true; - return editor; }; - -var AcePopup = function(parentNode) { - var el = dom.createElement("div"); - var popup = new $singleLineEditor(el); - - if (parentNode) - parentNode.appendChild(el); - el.style.display = "none"; - popup.renderer.content.style.cursor = "default"; - popup.renderer.setStyle("ace_autocomplete"); - - popup.setOption("displayIndentGuides", false); - popup.setOption("dragDelay", 150); - - var noop = function(){}; - - popup.focus = noop; - popup.$isFocused = true; - - popup.renderer.$cursorLayer.restartTimer = noop; - popup.renderer.$cursorLayer.element.style.opacity = 0; - - popup.renderer.$maxLines = 8; - popup.renderer.$keepTextAreaAtCursor = false; - - popup.setHighlightActiveLine(false); - popup.session.highlight(""); - popup.session.$searchHighlight.clazz = "ace_highlight-marker"; - - popup.on("mousedown", function(e) { - var pos = e.getDocumentPosition(); - popup.selection.moveToPosition(pos); - selectionMarker.start.row = selectionMarker.end.row = pos.row; - e.stop(); - }); - - var lastMouseEvent; - var hoverMarker = new Range(-1,0,-1,Infinity); - var selectionMarker = new Range(-1,0,-1,Infinity); - selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); - popup.setSelectOnHover = function(val) { - if (!val) { - hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); - } else if (hoverMarker.id) { - popup.session.removeMarker(hoverMarker.id); - hoverMarker.id = null; - } - }; - popup.setSelectOnHover(false); - popup.on("mousemove", function(e) { - if (!lastMouseEvent) { +var AcePopup = /** @class */ (function () { + function AcePopup(parentNode) { + var el = dom.createElement("div"); + var popup = $singleLineEditor(el); + if (parentNode) { + parentNode.appendChild(el); + } + el.style.display = "none"; + popup.renderer.content.style.cursor = "default"; + popup.renderer.setStyle("ace_autocomplete"); + popup.renderer.$textLayer.element.setAttribute("role", popupAriaRole); + popup.renderer.$textLayer.element.setAttribute("aria-roledescription", nls("autocomplete.popup.aria-roledescription", "Autocomplete suggestions")); + popup.renderer.$textLayer.element.setAttribute("aria-label", nls("autocomplete.popup.aria-label", "Autocomplete suggestions")); + popup.renderer.textarea.setAttribute("aria-hidden", "true"); + popup.setOption("displayIndentGuides", false); + popup.setOption("dragDelay", 150); + var noop = function () { }; + popup.focus = noop; + popup.$isFocused = true; + popup.renderer.$cursorLayer.restartTimer = noop; + popup.renderer.$cursorLayer.element.style.opacity = "0"; + popup.renderer.$maxLines = 8; + popup.renderer.$keepTextAreaAtCursor = false; + popup.setHighlightActiveLine(false); + popup.session.highlight(""); + popup.session.$searchHighlight.clazz = "ace_highlight-marker"; + popup.on("mousedown", function (e) { + var pos = e.getDocumentPosition(); + popup.selection.moveToPosition(pos); + selectionMarker.start.row = selectionMarker.end.row = pos.row; + e.stop(); + }); + var lastMouseEvent; + var hoverMarker = new Range(-1, 0, -1, Infinity); + var selectionMarker = new Range(-1, 0, -1, Infinity); + selectionMarker.id = popup.session.addMarker(selectionMarker, "ace_active-line", "fullLine"); + popup.setSelectOnHover = function (val) { + if (!val) { + hoverMarker.id = popup.session.addMarker(hoverMarker, "ace_line-hover", "fullLine"); + } + else if (hoverMarker.id) { + popup.session.removeMarker(hoverMarker.id); + hoverMarker.id = null; + } + }; + popup.setSelectOnHover(false); + popup.on("mousemove", function (e) { + if (!lastMouseEvent) { + lastMouseEvent = e; + return; + } + if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { + return; + } lastMouseEvent = e; - return; - } - if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) { - return; - } - lastMouseEvent = e; - lastMouseEvent.scrollTop = popup.renderer.scrollTop; - var row = lastMouseEvent.getDocumentPosition().row; - if (hoverMarker.start.row != row) { - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row); - } - }); - popup.renderer.on("beforeRender", function() { - if (lastMouseEvent && hoverMarker.start.row != -1) { - lastMouseEvent.$pos = null; + lastMouseEvent.scrollTop = popup.renderer.scrollTop; + popup.isMouseOver = true; var row = lastMouseEvent.getDocumentPosition().row; - if (!hoverMarker.id) - popup.setRow(row); - setHoverMarker(row, true); - } - }); - popup.renderer.on("afterRender", function() { - var row = popup.getRow(); - var t = popup.renderer.$textLayer; - var selected = t.element.childNodes[row - t.config.firstRow]; - if (selected !== t.selectedNode && t.selectedNode) - dom.removeCssClass(t.selectedNode, "ace_selected"); - t.selectedNode = selected; - if (selected) - dom.addCssClass(selected, "ace_selected"); - }); - var hideHoverMarker = function() { setHoverMarker(-1); }; - var setHoverMarker = function(row, suppressRedraw) { - if (row !== hoverMarker.start.row) { - hoverMarker.start.row = hoverMarker.end.row = row; - if (!suppressRedraw) - popup.session._emit("changeBackMarker"); - popup._emit("changeHoverMarker"); - } - }; - popup.getHoveredRow = function() { - return hoverMarker.start.row; - }; - - event.addListener(popup.container, "mouseout", hideHoverMarker); - popup.on("hide", hideHoverMarker); - popup.on("changeSelection", hideHoverMarker); - - popup.session.doc.getLength = function() { - return popup.data.length; - }; - popup.session.doc.getLine = function(i) { - var data = popup.data[i]; - if (typeof data == "string") - return data; - return (data && data.value) || ""; - }; - - var bgTokenizer = popup.session.bgTokenizer; - bgTokenizer.$tokenizeRow = function(row) { - var data = popup.data[row]; - var tokens = []; - if (!data) + if (hoverMarker.start.row != row) { + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row); + } + }); + popup.renderer.on("beforeRender", function () { + if (lastMouseEvent && hoverMarker.start.row != -1) { + lastMouseEvent.$pos = null; + var row = lastMouseEvent.getDocumentPosition().row; + if (!hoverMarker.id) + popup.setRow(row); + setHoverMarker(row, true); + } + }); + popup.renderer.on("afterRender", function () { + var t = popup.renderer.$textLayer; + for (var row = t.config.firstRow, l = t.config.lastRow; row <= l; row++) { + var popupRowElement = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + popupRowElement.setAttribute("role", optionAriaRole); + popupRowElement.setAttribute("aria-roledescription", nls("autocomplete.popup.item.aria-roledescription", "item")); + popupRowElement.setAttribute("aria-setsize", popup.data.length); + popupRowElement.setAttribute("aria-describedby", "doc-tooltip"); + popupRowElement.setAttribute("aria-posinset", row + 1); + var rowData = popup.getData(row); + if (rowData) { + var ariaLabel = "".concat(rowData.caption || rowData.value).concat(rowData.meta ? ", ".concat(rowData.meta) : ''); + popupRowElement.setAttribute("aria-label", ariaLabel); + } + var highlightedSpans = popupRowElement.querySelectorAll(".ace_completion-highlight"); + highlightedSpans.forEach(function (span) { + span.setAttribute("role", "mark"); + }); + } + }); + popup.renderer.on("afterRender", function () { + var row = popup.getRow(); + var t = popup.renderer.$textLayer; + var selected = /** @type {HTMLElement|null} */ (t.element.childNodes[row - t.config.firstRow]); + var el = document.activeElement; // Active element is textarea of main editor + if (selected !== popup.selectedNode && popup.selectedNode) { + dom.removeCssClass(popup.selectedNode, "ace_selected"); + popup.selectedNode.removeAttribute(ariaActiveState); + popup.selectedNode.removeAttribute("id"); + } + el.removeAttribute("aria-activedescendant"); + popup.selectedNode = selected; + if (selected) { + var ariaId = getAriaId(row); + dom.addCssClass(selected, "ace_selected"); + selected.id = ariaId; + t.element.setAttribute("aria-activedescendant", ariaId); + el.setAttribute("aria-activedescendant", ariaId); + selected.setAttribute(ariaActiveState, "true"); + } + }); + var hideHoverMarker = function () { setHoverMarker(-1); }; + var setHoverMarker = function (row, suppressRedraw) { + if (row !== hoverMarker.start.row) { + hoverMarker.start.row = hoverMarker.end.row = row; + if (!suppressRedraw) + popup.session._emit("changeBackMarker"); + popup._emit("changeHoverMarker"); + } + }; + popup.getHoveredRow = function () { + return hoverMarker.start.row; + }; + event.addListener(popup.container, "mouseout", function () { + popup.isMouseOver = false; + hideHoverMarker(); + }); + popup.on("hide", hideHoverMarker); + popup.on("changeSelection", hideHoverMarker); + popup.session.doc.getLength = function () { + return popup.data.length; + }; + popup.session.doc.getLine = function (i) { + var data = popup.data[i]; + if (typeof data == "string") + return data; + return (data && data.value) || ""; + }; + var bgTokenizer = popup.session.bgTokenizer; + bgTokenizer.$tokenizeRow = function (row) { + var data = popup.data[row]; + var tokens = []; + if (!data) + return tokens; + if (typeof data == "string") + data = { value: data }; + var caption = data.caption || data.value || data.name; + function addToken(value, className) { + value && tokens.push({ + type: (data.className || "") + (className || ""), + value: value + }); + } + var lower = caption.toLowerCase(); + var filterText = (popup.filterText || "").toLowerCase(); + var lastIndex = 0; + var lastI = 0; + for (var i = 0; i <= filterText.length; i++) { + if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { + var sub = filterText.slice(lastI, i); + lastI = i; + var index = lower.indexOf(sub, lastIndex); + if (index == -1) + continue; + addToken(caption.slice(lastIndex, index), ""); + lastIndex = index + sub.length; + addToken(caption.slice(index, lastIndex), "completion-highlight"); + } + } + addToken(caption.slice(lastIndex, caption.length), ""); + tokens.push({ type: "completion-spacer", value: " " }); + if (data.meta) + tokens.push({ type: "completion-meta", value: data.meta }); + if (data.message) + tokens.push({ type: "completion-message", value: data.message }); return tokens; - if (typeof data == "string") - data = {value: data}; - var caption = data.caption || data.value || data.name; - - function addToken(value, className) { - value && tokens.push({ - type: (data.className || "") + (className || ""), - value: value - }); - } - - var lower = caption.toLowerCase(); - var filterText = (popup.filterText || "").toLowerCase(); - var lastIndex = 0; - var lastI = 0; - for (var i = 0; i <= filterText.length; i++) { - if (i != lastI && (data.matchMask & (1 << i) || i == filterText.length)) { - var sub = filterText.slice(lastI, i); - lastI = i; - var index = lower.indexOf(sub, lastIndex); - if (index == -1) continue; - addToken(caption.slice(lastIndex, index), ""); - lastIndex = index + sub.length; - addToken(caption.slice(index, lastIndex), "completion-highlight"); - } - } - addToken(caption.slice(lastIndex, caption.length), ""); - - if (data.meta) - tokens.push({type: "completion-meta", value: data.meta}); - if (data.message) - tokens.push({type: "completion-message", value: data.message}); - - return tokens; - }; - bgTokenizer.$updateOnChange = noop; - bgTokenizer.start = noop; - - popup.session.$computeWidth = function() { - return this.screenWidth = 0; - }; - popup.isOpen = false; - popup.isTopdown = false; - popup.autoSelect = true; - popup.filterText = ""; - - popup.data = []; - popup.setData = function(list, filterText) { - popup.filterText = filterText || ""; - popup.setValue(lang.stringRepeat("\n", list.length), -1); - popup.data = list || []; - popup.setRow(0); - }; - popup.getData = function(row) { - return popup.data[row]; - }; - - popup.getRow = function() { - return selectionMarker.start.row; - }; - popup.setRow = function(line) { - line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length, line)); - if (selectionMarker.start.row != line) { - popup.selection.clearSelection(); - selectionMarker.start.row = selectionMarker.end.row = line || 0; - popup.session._emit("changeBackMarker"); - popup.moveCursorTo(line || 0, 0); - if (popup.isOpen) - popup._signal("select"); - } - }; - - popup.on("changeSelection", function() { - if (popup.isOpen) - popup.setRow(popup.selection.lead.row); - popup.renderer.scrollCursorIntoView(); - }); - - popup.hide = function() { - this.container.style.display = "none"; - this._signal("hide"); + }; + bgTokenizer.$updateOnChange = noop; + bgTokenizer.start = noop; + popup.session.$computeWidth = function () { + return this.screenWidth = 0; + }; popup.isOpen = false; - }; - popup.show = function(pos, lineHeight, topdownOnly) { - var el = this.container; - var screenHeight = window.innerHeight; - var screenWidth = window.innerWidth; - var renderer = this.renderer; - var maxH = renderer.$maxLines * lineHeight * 1.4; - var top = pos.top + this.$borderSize; - var allowTopdown = top > screenHeight / 2 && !topdownOnly; - if (allowTopdown && top + lineHeight + maxH > screenHeight) { - renderer.$maxPixelHeight = top - 2 * this.$borderSize; - el.style.top = ""; - el.style.bottom = screenHeight - top + "px"; - popup.isTopdown = false; - } else { - top += lineHeight; - renderer.$maxPixelHeight = screenHeight - top - 0.2 * lineHeight; - el.style.top = top + "px"; - el.style.bottom = ""; - popup.isTopdown = true; - } - - el.style.display = ""; - - var left = pos.left; - if (left + el.offsetWidth > screenWidth) - left = screenWidth - el.offsetWidth; - - el.style.left = left + "px"; - - this._signal("show"); - lastMouseEvent = null; - popup.isOpen = true; - }; - - popup.goTo = function(where) { - var row = this.getRow(); - var max = this.session.getLength() - 1; - - switch(where) { - case "up": row = row <= 0 ? max : row - 1; break; - case "down": row = row >= max ? -1 : row + 1; break; - case "start": row = 0; break; - case "end": row = max; break; - } - - this.setRow(row); - }; - - - popup.getTextLeftOffset = function() { - return this.$borderSize + this.renderer.$padding + this.$imageSize; - }; - - popup.$imageSize = 0; - popup.$borderSize = 1; - - return popup; -}; - -dom.importCssString("\ -.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #CAD6FA;\ - z-index: 1;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\ - background-color: #3a674e;\ -}\ -.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid #abbffe;\ - margin-top: -1px;\ - background: rgba(233,233,253,0.4);\ - position: absolute;\ - z-index: 2;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\ - border: 1px solid rgba(109, 150, 13, 0.8);\ - background: rgba(58, 103, 78, 0.62);\ -}\ -.ace_completion-meta {\ - opacity: 0.5;\ - margin: 0.9em;\ -}\ -.ace_completion-message {\ - color: blue;\ -}\ -.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #2d69c7;\ -}\ -.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\ - color: #93ca12;\ -}\ -.ace_editor.ace_autocomplete {\ - width: 300px;\ - z-index: 200000;\ - border: 1px lightgray solid;\ - position: fixed;\ - box-shadow: 2px 3px 5px rgba(0,0,0,.2);\ - line-height: 1.4;\ - background: #fefefe;\ - color: #111;\ -}\ -.ace_dark.ace_editor.ace_autocomplete {\ - border: 1px #484747 solid;\ - box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\ - line-height: 1.4;\ - background: #25282c;\ - color: #c1c1c1;\ -}", "autocompletion.css", false); - -exports.AcePopup = AcePopup; -exports.$singleLineEditor = $singleLineEditor; -}); - -define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module) { -"use strict"; - -exports.parForEach = function(array, fn, callback) { - var completed = 0; - var arLength = array.length; - if (arLength === 0) - callback(); - for (var i = 0; i < arLength; i++) { - fn(array[i], function(result, err) { - completed++; - if (completed === arLength) - callback(result, err); + popup.isTopdown = false; + popup.autoSelect = true; + popup.filterText = ""; + popup.isMouseOver = false; + popup.data = []; + popup.setData = function (list, filterText) { + popup.filterText = filterText || ""; + popup.setValue(lang.stringRepeat("\n", list.length), -1); + popup.data = list || []; + popup.setRow(0); + }; + popup.getData = function (row) { + return popup.data[row]; + }; + popup.getRow = function () { + return selectionMarker.start.row; + }; + popup.setRow = function (line) { + line = Math.max(this.autoSelect ? 0 : -1, Math.min(this.data.length - 1, line)); + if (selectionMarker.start.row != line) { + popup.selection.clearSelection(); + selectionMarker.start.row = selectionMarker.end.row = line || 0; + popup.session._emit("changeBackMarker"); + popup.moveCursorTo(line || 0, 0); + if (popup.isOpen) + popup._signal("select"); + } + }; + popup.on("changeSelection", function () { + if (popup.isOpen) + popup.setRow(popup.selection.lead.row); + popup.renderer.scrollCursorIntoView(); }); + popup.hide = function () { + this.container.style.display = "none"; + popup.anchorPos = null; + popup.anchor = null; + if (popup.isOpen) { + popup.isOpen = false; + this._signal("hide"); + } + }; + popup.tryShow = function (pos, lineHeight, anchor, forceShow) { + if (!forceShow && popup.isOpen && popup.anchorPos && popup.anchor && + popup.anchorPos.top === pos.top && popup.anchorPos.left === pos.left && + popup.anchor === anchor) { + return true; + } + var el = this.container; + var scrollBarSize = this.renderer.scrollBar.width || 10; + var screenHeight = window.innerHeight - scrollBarSize; + var screenWidth = window.innerWidth - scrollBarSize; + var renderer = this.renderer; + var maxH = renderer.$maxLines * lineHeight * 1.4; + var dims = { top: 0, bottom: 0, left: 0 }; + var spaceBelow = screenHeight - pos.top - 3 * this.$borderSize - lineHeight; + var spaceAbove = pos.top - 3 * this.$borderSize; + if (!anchor) { + if (spaceAbove <= spaceBelow || spaceBelow >= maxH) { + anchor = "bottom"; + } + else { + anchor = "top"; + } + } + if (anchor === "top") { + dims.bottom = pos.top - this.$borderSize; + dims.top = dims.bottom - maxH; + } + else if (anchor === "bottom") { + dims.top = pos.top + lineHeight + this.$borderSize; + dims.bottom = dims.top + maxH; + } + var fitsX = dims.top >= 0 && dims.bottom <= screenHeight; + if (!forceShow && !fitsX) { + return false; + } + if (!fitsX) { + if (anchor === "top") { + renderer.$maxPixelHeight = spaceAbove; + } + else { + renderer.$maxPixelHeight = spaceBelow; + } + } + else { + renderer.$maxPixelHeight = null; + } + if (anchor === "top") { + el.style.top = ""; + el.style.bottom = (screenHeight + scrollBarSize - dims.bottom) + "px"; + popup.isTopdown = false; + } + else { + el.style.top = dims.top + "px"; + el.style.bottom = ""; + popup.isTopdown = true; + } + el.style.display = ""; + var left = pos.left; + if (left + el.offsetWidth > screenWidth) + left = screenWidth - el.offsetWidth; + el.style.left = left + "px"; + el.style.right = ""; + dom.$fixPositionBug(el); + if (!popup.isOpen) { + popup.isOpen = true; + this._signal("show"); + lastMouseEvent = null; + } + popup.anchorPos = pos; + popup.anchor = anchor; + return true; + }; + popup.show = function (pos, lineHeight, topdownOnly) { + this.tryShow(pos, lineHeight, topdownOnly ? "bottom" : undefined, true); + }; + popup.goTo = function (where) { + var row = this.getRow(); + var max = this.session.getLength() - 1; + switch (where) { + case "up": + row = row <= 0 ? max : row - 1; + break; + case "down": + row = row >= max ? -1 : row + 1; + break; + case "start": + row = 0; + break; + case "end": + row = max; + break; + } + this.setRow(row); + }; + popup.getTextLeftOffset = function () { + return this.$borderSize + this.renderer.$padding + this.$imageSize; + }; + popup.$imageSize = 0; + popup.$borderSize = 1; + return popup; } -}; - -var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; - -exports.retrievePrecedingIdentifier = function(text, pos, regex) { - regex = regex || ID_REGEX; - var buf = []; - for (var i = pos-1; i >= 0; i--) { - if (regex.test(text[i])) - buf.push(text[i]); - else - break; - } - return buf.reverse().join(""); -}; - -exports.retrieveFollowingIdentifier = function(text, pos, regex) { - regex = regex || ID_REGEX; - var buf = []; - for (var i = pos; i < text.length; i++) { - if (regex.test(text[i])) - buf.push(text[i]); - else - break; - } - return buf; -}; - -exports.getCompletionPrefix = function (editor) { - var pos = editor.getCursorPosition(); - var line = editor.session.getLine(pos.row); - var prefix; - editor.completers.forEach(function(completer) { - if (completer.identifierRegexps) { - completer.identifierRegexps.forEach(function(identifierRegex) { - if (!prefix && identifierRegex) - prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); - }.bind(this)); - } - }.bind(this)); - return prefix || this.retrievePrecedingIdentifier(line, pos.column); -}; + return AcePopup; +}()); +dom.importCssString("\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #CAD6FA;\n z-index: 1;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\n background-color: #3a674e;\n}\n.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid #abbffe;\n margin-top: -1px;\n background: rgba(233,233,253,0.4);\n position: absolute;\n z-index: 2;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_line-hover {\n border: 1px solid rgba(109, 150, 13, 0.8);\n background: rgba(58, 103, 78, 0.62);\n}\n.ace_completion-meta {\n opacity: 0.5;\n margin-left: 0.9em;\n}\n.ace_completion-message {\n margin-left: 0.9em;\n color: blue;\n}\n.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #2d69c7;\n}\n.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{\n color: #93ca12;\n}\n.ace_editor.ace_autocomplete {\n width: 300px;\n z-index: 200000;\n border: 1px lightgray solid;\n position: fixed;\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n line-height: 1.4;\n background: #fefefe;\n color: #111;\n}\n.ace_dark.ace_editor.ace_autocomplete {\n border: 1px #484747 solid;\n box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51);\n line-height: 1.4;\n background: #25282c;\n color: #c1c1c1;\n}\n.ace_autocomplete .ace_text-layer {\n width: calc(100% - 8px);\n}\n.ace_autocomplete .ace_line {\n display: flex;\n align-items: center;\n}\n.ace_autocomplete .ace_line > * {\n min-width: 0;\n flex: 0 0 auto;\n}\n.ace_autocomplete .ace_line .ace_ {\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.ace_autocomplete .ace_completion-spacer {\n flex: 1;\n}\n.ace_autocomplete.ace_loading:after {\n content: \"\";\n position: absolute;\n top: 0px;\n height: 2px;\n width: 8%;\n background: blue;\n z-index: 100;\n animation: ace_progress 3s infinite linear;\n animation-delay: 300ms;\n transform: translateX(-100%) scaleX(1);\n}\n@keyframes ace_progress {\n 0% { transform: translateX(-100%) scaleX(1) }\n 50% { transform: translateX(625%) scaleX(2) } \n 100% { transform: translateX(1500%) scaleX(3) } \n}\n@media (prefers-reduced-motion) {\n .ace_autocomplete.ace_loading:after {\n transform: translateX(625%) scaleX(2);\n animation: none;\n }\n}\n", "autocompletion.css", false); +exports.AcePopup = AcePopup; +exports.$singleLineEditor = $singleLineEditor; +exports.getAriaId = getAriaId; }); -define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module) { -"use strict"; +define("ace/snippets",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/editor"], function(require, exports, module){"use strict"; var dom = require("./lib/dom"); var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; @@ -441,107 +373,100 @@ var RangeList = require("./range_list").RangeList; var HashHandler = require("./keyboard/hash_handler").HashHandler; var Tokenizer = require("./tokenizer").Tokenizer; var clipboard = require("./clipboard"); - var VARIABLES = { - CURRENT_WORD: function(editor) { + CURRENT_WORD: function (editor) { return editor.session.getTextRange(editor.session.getWordRange()); }, - SELECTION: function(editor, name, indentation) { + SELECTION: function (editor, name, indentation) { var text = editor.session.getTextRange(); if (indentation) return text.replace(/\n\r?([ \t]*\S)/g, "\n" + indentation + "$1"); return text; }, - CURRENT_LINE: function(editor) { + CURRENT_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row); }, - PREV_LINE: function(editor) { + PREV_LINE: function (editor) { return editor.session.getLine(editor.getCursorPosition().row - 1); }, - LINE_INDEX: function(editor) { + LINE_INDEX: function (editor) { return editor.getCursorPosition().row; }, - LINE_NUMBER: function(editor) { + LINE_NUMBER: function (editor) { return editor.getCursorPosition().row + 1; }, - SOFT_TABS: function(editor) { + SOFT_TABS: function (editor) { return editor.session.getUseSoftTabs() ? "YES" : "NO"; }, - TAB_SIZE: function(editor) { + TAB_SIZE: function (editor) { return editor.session.getTabSize(); }, - CLIPBOARD: function(editor) { + CLIPBOARD: function (editor) { return clipboard.getText && clipboard.getText(); }, - FILENAME: function(editor) { + FILENAME: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0]; }, - FILENAME_BASE: function(editor) { + FILENAME_BASE: function (editor) { return /[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/, ""); }, - DIRECTORY: function(editor) { + DIRECTORY: function (editor) { return this.FILEPATH(editor).replace(/[^/\\]*$/, ""); }, - FILEPATH: function(editor) { return "/not implemented.txt"; }, - WORKSPACE_NAME: function() { return "Unknown"; }, - FULLNAME: function() { return "Unknown"; }, - BLOCK_COMMENT_START: function(editor) { + FILEPATH: function (editor) { return "/not implemented.txt"; }, + WORKSPACE_NAME: function () { return "Unknown"; }, + FULLNAME: function () { return "Unknown"; }, + BLOCK_COMMENT_START: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.start || ""; }, - BLOCK_COMMENT_END: function(editor) { + BLOCK_COMMENT_END: function (editor) { var mode = editor.session.$mode || {}; return mode.blockComment && mode.blockComment.end || ""; }, - LINE_COMMENT: function(editor) { + LINE_COMMENT: function (editor) { var mode = editor.session.$mode || {}; return mode.lineCommentStart || ""; }, - CURRENT_YEAR: date.bind(null, {year: "numeric"}), - CURRENT_YEAR_SHORT: date.bind(null, {year: "2-digit"}), - CURRENT_MONTH: date.bind(null, {month: "numeric"}), - CURRENT_MONTH_NAME: date.bind(null, {month: "long"}), - CURRENT_MONTH_NAME_SHORT: date.bind(null, {month: "short"}), - CURRENT_DATE: date.bind(null, {day: "2-digit"}), - CURRENT_DAY_NAME: date.bind(null, {weekday: "long"}), - CURRENT_DAY_NAME_SHORT: date.bind(null, {weekday: "short"}), - CURRENT_HOUR: date.bind(null, {hour: "2-digit", hour12: false}), - CURRENT_MINUTE: date.bind(null, {minute: "2-digit"}), - CURRENT_SECOND: date.bind(null, {second: "2-digit"}) + CURRENT_YEAR: date.bind(null, { year: "numeric" }), + CURRENT_YEAR_SHORT: date.bind(null, { year: "2-digit" }), + CURRENT_MONTH: date.bind(null, { month: "numeric" }), + CURRENT_MONTH_NAME: date.bind(null, { month: "long" }), + CURRENT_MONTH_NAME_SHORT: date.bind(null, { month: "short" }), + CURRENT_DATE: date.bind(null, { day: "2-digit" }), + CURRENT_DAY_NAME: date.bind(null, { weekday: "long" }), + CURRENT_DAY_NAME_SHORT: date.bind(null, { weekday: "short" }), + CURRENT_HOUR: date.bind(null, { hour: "2-digit", hour12: false }), + CURRENT_MINUTE: date.bind(null, { minute: "2-digit" }), + CURRENT_SECOND: date.bind(null, { second: "2-digit" }) }; - VARIABLES.SELECTED_TEXT = VARIABLES.SELECTION; - function date(dateFormat) { var str = new Date().toLocaleString("en-us", dateFormat); return str.length == 1 ? "0" + str : str; } - -var SnippetManager = function() { - this.snippetMap = {}; - this.snippetNameMap = {}; -}; - -(function() { - oop.implement(this, EventEmitter); - - this.getTokenizer = function() { - return SnippetManager.$tokenizer || this.createTokenizer(); - }; - - this.createTokenizer = function() { +var SnippetManager = /** @class */ (function () { + function SnippetManager() { + this.snippetMap = {}; + this.snippetNameMap = {}; + this.variables = VARIABLES; + } + SnippetManager.prototype.getTokenizer = function () { + return SnippetManager["$tokenizer"] || this.createTokenizer(); + }; + SnippetManager.prototype.createTokenizer = function () { function TabstopToken(str) { str = str.substr(1); if (/^\d+$/.test(str)) - return [{tabstopId: parseInt(str, 10)}]; - return [{text: str}]; + return [{ tabstopId: parseInt(str, 10) }]; + return [{ text: str }]; } function escape(ch) { return "(?:[^\\\\" + ch + "]|\\\\.)"; } var formatMatcher = { - regex: "/(" + escape("/") + "+)/", - onMatch: function(val, state, stack) { + regex: "/(" + escape("/") + "+)/", + onMatch: function (val, state, stack) { var ts = stack[0]; ts.fmtString = true; ts.guard = val.slice(1, -1); @@ -550,118 +475,115 @@ var SnippetManager = function() { }, next: "formatString" }; - - SnippetManager.$tokenizer = new Tokenizer({ + SnippetManager["$tokenizer"] = new Tokenizer({ start: [ - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) { - val = ch; - } else if ("`$\\".indexOf(ch) != -1) { - val = ch; - } - return [val]; - }}, - {regex: /}/, onMatch: function(val, state, stack) { - return [stack.length ? stack.shift() : val]; - }}, - {regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken}, - {regex: /\$\{[\dA-Z_a-z]+/, onMatch: function(str, state, stack) { - var t = TabstopToken(str.substr(1)); - stack.unshift(t[0]); - return t; - }, next: "snippetVar"}, - {regex: /\n/, token: "newline", merge: false} + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) { + val = ch; + } + else if ("`$\\".indexOf(ch) != -1) { + val = ch; + } + return [val]; + } }, + { regex: /}/, onMatch: function (val, state, stack) { + return [stack.length ? stack.shift() : val]; + } }, + { regex: /\$(?:\d+|\w+)/, onMatch: TabstopToken }, + { regex: /\$\{[\dA-Z_a-z]+/, onMatch: function (str, state, stack) { + var t = TabstopToken(str.substr(1)); + stack.unshift(t[0]); + return t; + }, next: "snippetVar" }, + { regex: /\n/, token: "newline", merge: false } ], snippetVar: [ - {regex: "\\|" + escape("\\|") + "*\\|", onMatch: function(val, state, stack) { - var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function(operator) { - return operator.length == 2 ? operator[1] : "\x00"; - }).split("\x00").map(function(value){ - return {value: value}; - }); - stack[0].choices = choices; - return [choices[0]]; - }, next: "start"}, + { regex: "\\|" + escape("\\|") + "*\\|", onMatch: function (val, state, stack) { + var choices = val.slice(1, -1).replace(/\\[,|\\]|,/g, function (operator) { + return operator.length == 2 ? operator[1] : "\x00"; + }).split("\x00").map(function (value) { + return { value: value }; + }); + stack[0].choices = choices; + return [choices[0]]; + }, next: "start" }, formatMatcher, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start"} + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "start" } ], formatString: [ - {regex: /:/, onMatch: function(val, state, stack) { - if (stack.length && stack[0].expectElse) { - stack[0].expectElse = false; - stack[0].ifEnd = {elseEnd: stack[0]}; - return [stack[0].ifEnd]; - } - return ":"; - }}, - {regex: /\\./, onMatch: function(val, state, stack) { - var ch = val[1]; - if (ch == "}" && stack.length) - val = ch; - else if ("`$\\".indexOf(ch) != -1) - val = ch; - else if (ch == "n") - val = "\n"; - else if (ch == "t") - val = "\t"; - else if ("ulULE".indexOf(ch) != -1) - val = {changeCase: ch, local: ch > "a"}; - return [val]; - }}, - {regex: "/\\w*}", onMatch: function(val, state, stack) { - var next = stack.shift(); - if (next) - next.flag = val.slice(1, -1); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"}, - {regex: /\$(?:\d+|\w+)/, onMatch: function(val, state, stack) { - return [{text: val.slice(1)}]; - }}, - {regex: /\${\w+/, onMatch: function(val, state, stack) { - var token = {text: val.slice(2)}; - stack.unshift(token); - return [token]; - }, next: "formatStringVar"}, - {regex: /\n/, token: "newline", merge: false}, - {regex: /}/, onMatch: function(val, state, stack) { - var next = stack.shift(); - this.next = next && next.tabstopId ? "start" : ""; - return [next || val]; - }, next: "start"} + { regex: /:/, onMatch: function (val, state, stack) { + if (stack.length && stack[0].expectElse) { + stack[0].expectElse = false; + stack[0].ifEnd = { elseEnd: stack[0] }; + return [stack[0].ifEnd]; + } + return ":"; + } }, + { regex: /\\./, onMatch: function (val, state, stack) { + var ch = val[1]; + if (ch == "}" && stack.length) + val = ch; + else if ("`$\\".indexOf(ch) != -1) + val = ch; + else if (ch == "n") + val = "\n"; + else if (ch == "t") + val = "\t"; + else if ("ulULE".indexOf(ch) != -1) + val = { changeCase: ch, local: ch > "a" }; + return [val]; + } }, + { regex: "/\\w*}", onMatch: function (val, state, stack) { + var next = stack.shift(); + if (next) + next.flag = val.slice(1, -1); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" }, + { regex: /\$(?:\d+|\w+)/, onMatch: function (val, state, stack) { + return [{ text: val.slice(1) }]; + } }, + { regex: /\${\w+/, onMatch: function (val, state, stack) { + var token = { text: val.slice(2) }; + stack.unshift(token); + return [token]; + }, next: "formatStringVar" }, + { regex: /\n/, token: "newline", merge: false }, + { regex: /}/, onMatch: function (val, state, stack) { + var next = stack.shift(); + this.next = next && next.tabstopId ? "start" : ""; + return [next || val]; + }, next: "start" } ], formatStringVar: [ - {regex: /:\/\w+}/, onMatch: function(val, state, stack) { - var ts = stack[0]; - ts.formatFunction = val.slice(2, -1); - return [stack.shift()]; - }, next: "formatString"}, + { regex: /:\/\w+}/, onMatch: function (val, state, stack) { + var ts = stack[0]; + ts.formatFunction = val.slice(2, -1); + return [stack.shift()]; + }, next: "formatString" }, formatMatcher, - {regex: /:[\?\-+]?/, onMatch: function(val, state, stack) { - if (val[1] == "+") - stack[0].ifEnd = stack[0]; - if (val[1] == "?") - stack[0].expectElse = true; - }, next: "formatString"}, - {regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString"} + { regex: /:[\?\-+]?/, onMatch: function (val, state, stack) { + if (val[1] == "+") + stack[0].ifEnd = stack[0]; + if (val[1] == "?") + stack[0].expectElse = true; + }, next: "formatString" }, + { regex: "([^:}\\\\]|\\\\.)*:?", token: "", next: "formatString" } ] }); - return SnippetManager.$tokenizer; + return SnippetManager["$tokenizer"]; }; - - this.tokenizeTmSnippet = function(str, startState) { - return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) { + SnippetManager.prototype.tokenizeTmSnippet = function (str, startState) { + return this.getTokenizer().getLineTokens(str, startState).tokens.map(function (x) { return x.value || x; }); }; - - this.getVariableValue = function(editor, name, indentation) { + SnippetManager.prototype.getVariableValue = function (editor, name, indentation) { if (/^\d+$/.test(name)) return (this.variables.__ || {})[name] || ""; if (/^[A-Z]\d+$/.test(name)) return (this.variables[name[0] + "__"] || {})[name.substr(1)] || ""; - name = name.replace(/^TM_/, ""); if (!this.variables.hasOwnProperty(name)) return ""; @@ -670,21 +592,20 @@ var SnippetManager = function() { value = this.variables[name](editor, name, indentation); return value == null ? "" : value; }; - - this.variables = VARIABLES; - this.tmStrFormat = function(str, ch, editor) { - if (!ch.fmt) return str; + SnippetManager.prototype.tmStrFormat = function (str, ch, editor) { + if (!ch.fmt) + return str; var flag = ch.flag || ""; var re = ch.guard; re = new RegExp(re, flag.replace(/[^gim]/g, "")); var fmtTokens = typeof ch.fmt == "string" ? this.tokenizeTmSnippet(ch.fmt, "formatString") : ch.fmt; var _self = this; - var formatted = str.replace(re, function() { + var formatted = str.replace(re, function () { var oldArgs = _self.variables.__; _self.variables.__ = [].slice.call(arguments); var fmtParts = _self.resolveVariables(fmtTokens, editor); var gChangeCase = "E"; - for (var i = 0; i < fmtParts.length; i++) { + for (var i = 0; i < fmtParts.length; i++) { var ch = fmtParts[i]; if (typeof ch == "object") { fmtParts[i] = ""; @@ -697,12 +618,15 @@ var SnippetManager = function() { fmtParts[i] = next[0].toLowerCase(); fmtParts[i + 1] = next.substr(1); } - } else if (ch.changeCase) { + } + else if (ch.changeCase) { gChangeCase = ch.changeCase; } - } else if (gChangeCase == "U") { + } + else if (gChangeCase == "U") { fmtParts[i] = ch.toUpperCase(); - } else if (gChangeCase == "L") { + } + else if (gChangeCase == "L") { fmtParts[i] = ch.toLowerCase(); } } @@ -711,16 +635,14 @@ var SnippetManager = function() { }); return formatted; }; - - this.tmFormatFunction = function(str, ch, editor) { + SnippetManager.prototype.tmFormatFunction = function (str, ch, editor) { if (ch.formatFunction == "upcase") return str.toUpperCase(); if (ch.formatFunction == "downcase") return str.toLowerCase(); return str; }; - - this.resolveVariables = function(snippet, editor) { + SnippetManager.prototype.resolveVariables = function (snippet, editor) { var result = []; var indentation = ""; var afterNewLine = true; @@ -738,34 +660,37 @@ var SnippetManager = function() { } continue; } - if (!ch) continue; + if (!ch) + continue; afterNewLine = false; - if (ch.fmtString) { var j = snippet.indexOf(ch, i + 1); - if (j == -1) j = snippet.length; + if (j == -1) + j = snippet.length; ch.fmt = snippet.slice(i + 1, j); i = j; } - if (ch.text) { var value = this.getVariableValue(editor, ch.text, indentation) + ""; if (ch.fmtString) value = this.tmStrFormat(value, ch, editor); if (ch.formatFunction) value = this.tmFormatFunction(value, ch, editor); - if (value && !ch.ifEnd) { result.push(value); gotoNext(ch); - } else if (!value && ch.ifEnd) { + } + else if (!value && ch.ifEnd) { gotoNext(ch.ifEnd); } - } else if (ch.elseEnd) { + } + else if (ch.elseEnd) { gotoNext(ch.elseEnd); - } else if (ch.tabstopId != null) { + } + else if (ch.tabstopId != null) { result.push(ch); - } else if (ch.changeCase != null) { + } + else if (ch.changeCase != null) { result.push(ch); } } @@ -776,142 +701,35 @@ var SnippetManager = function() { } return result; }; - - this.insertSnippetForSelection = function(editor, snippetText) { - var cursor = editor.getCursorPosition(); - var line = editor.session.getLine(cursor.row); - var tabString = editor.session.getTabString(); - var indentString = line.match(/^\s*/)[0]; - - if (cursor.column < indentString.length) - indentString = indentString.slice(0, cursor.column); - - snippetText = snippetText.replace(/\r/g, ""); - var tokens = this.tokenizeTmSnippet(snippetText); - tokens = this.resolveVariables(tokens, editor); - tokens = tokens.map(function(x) { - if (x == "\n") - return x + indentString; - if (typeof x == "string") - return x.replace(/\t/g, tabString); - return x; - }); - var tabstops = []; - tokens.forEach(function(p, i) { - if (typeof p != "object") - return; - var id = p.tabstopId; - var ts = tabstops[id]; - if (!ts) { - ts = tabstops[id] = []; - ts.index = id; - ts.value = ""; - ts.parents = {}; - } - if (ts.indexOf(p) !== -1) - return; - if (p.choices && !ts.choices) - ts.choices = p.choices; - ts.push(p); - var i1 = tokens.indexOf(p, i + 1); - if (i1 === -1) - return; - - var value = tokens.slice(i + 1, i1); - var isNested = value.some(function(t) {return typeof t === "object";}); - if (isNested && !ts.value) { - ts.value = value; - } else if (value.length && (!ts.value || typeof ts.value !== "string")) { - ts.value = value.join(""); - } - }); - tabstops.forEach(function(ts) {ts.length = 0;}); - var expanding = {}; - function copyValue(val) { - var copy = []; - for (var i = 0; i < val.length; i++) { - var p = val[i]; - if (typeof p == "object") { - if (expanding[p.tabstopId]) - continue; - var j = val.lastIndexOf(p, i - 1); - p = copy[j] || {tabstopId: p.tabstopId}; - } - copy[i] = p; - } - return copy; - } - for (var i = 0; i < tokens.length; i++) { - var p = tokens[i]; - if (typeof p != "object") - continue; - var id = p.tabstopId; - var ts = tabstops[id]; - var i1 = tokens.indexOf(p, i + 1); - if (expanding[id]) { - if (expanding[id] === p) { - delete expanding[id]; - Object.keys(expanding).forEach(function(parentId) { - ts.parents[parentId] = true; - }); - } - continue; - } - expanding[id] = p; - var value = ts.value; - if (typeof value !== "string") - value = copyValue(value); - else if (p.fmt) - value = this.tmStrFormat(value, p, editor); - tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); - - if (ts.indexOf(p) === -1) - ts.push(p); - } - var row = 0, column = 0; - var text = ""; - tokens.forEach(function(t) { - if (typeof t === "string") { - var lines = t.split("\n"); - if (lines.length > 1){ - column = lines[lines.length - 1].length; - row += lines.length - 1; - } else - column += t.length; - text += t; - } else if (t) { - if (!t.start) - t.start = {row: row, column: column}; - else - t.end = {row: row, column: column}; - } - }); + SnippetManager.prototype.getDisplayTextForSnippet = function (editor, snippetText) { + var processedSnippet = processSnippetText.call(this, editor, snippetText); + return processedSnippet.text; + }; + SnippetManager.prototype.insertSnippetForSelection = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var processedSnippet = processSnippetText.call(this, editor, snippetText, options); var range = editor.getSelectionRange(); - var end = editor.session.replace(range, text); - + var end = editor.session.replace(range, processedSnippet.text); var tabstopManager = new TabstopManager(editor); var selectionId = editor.inVirtualSelectionMode && editor.selection.index; - tabstopManager.addTabstops(tabstops, range.start, end, selectionId); + tabstopManager.addTabstops(processedSnippet.tabstops, range.start, end, selectionId); }; - - this.insertSnippet = function(editor, snippetText) { + SnippetManager.prototype.insertSnippet = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } var self = this; if (editor.inVirtualSelectionMode) - return self.insertSnippetForSelection(editor, snippetText); - - editor.forEachSelection(function() { - self.insertSnippetForSelection(editor, snippetText); - }, null, {keepOrder: true}); - + return self.insertSnippetForSelection(editor, snippetText, options); + editor.forEachSelection(function () { + self.insertSnippetForSelection(editor, snippetText, options); + }, null, { keepOrder: true }); if (editor.tabstopManager) editor.tabstopManager.tabNext(); }; - - this.$getScope = function(editor) { + SnippetManager.prototype.$getScope = function (editor) { var scope = editor.session.$mode.$id || ""; scope = scope.split("/").pop(); if (scope === "html" || scope === "php") { - if (scope === "php" && !editor.session.$mode.inlinePhp) + if (scope === "php" && !editor.session.$mode.inlinePhp) scope = "html"; var c = editor.getCursorPosition(); var state = editor.session.getState(c.row); @@ -927,11 +745,9 @@ var SnippetManager = function() { scope = "php"; } } - return scope; }; - - this.getActiveScopes = function(editor) { + SnippetManager.prototype.getActiveScopes = function (editor) { var scope = this.$getScope(editor); var scopes = [scope]; var snippetMap = this.snippetMap; @@ -941,26 +757,23 @@ var SnippetManager = function() { scopes.push("_"); return scopes; }; - - this.expandWithTab = function(editor, options) { + SnippetManager.prototype.expandWithTab = function (editor, options) { var self = this; - var result = editor.forEachSelection(function() { + var result = editor.forEachSelection(function () { return self.expandSnippetForSelection(editor, options); - }, null, {keepOrder: true}); + }, null, { keepOrder: true }); if (result && editor.tabstopManager) editor.tabstopManager.tabNext(); return result; }; - - this.expandSnippetForSelection = function(editor, options) { + SnippetManager.prototype.expandSnippetForSelection = function (editor, options) { var cursor = editor.getCursorPosition(); var line = editor.session.getLine(cursor.row); var before = line.substring(0, cursor.column); var after = line.substr(cursor.column); - var snippetMap = this.snippetMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = this.findMatchingSnippet(snippets, before, after); @@ -970,20 +783,14 @@ var SnippetManager = function() { return false; if (options && options.dryRun) return true; - editor.session.doc.removeInLine(cursor.row, - cursor.column - snippet.replaceBefore.length, - cursor.column + snippet.replaceAfter.length - ); - + editor.session.doc.removeInLine(cursor.row, cursor.column - snippet.replaceBefore.length, cursor.column + snippet.replaceAfter.length); this.variables.M__ = snippet.matchBefore; this.variables.T__ = snippet.matchAfter; this.insertSnippetForSelection(editor, snippet.content); - this.variables.M__ = this.variables.T__ = null; return true; }; - - this.findMatchingSnippet = function(snippetList, before, after) { + SnippetManager.prototype.findMatchingSnippet = function (snippetList, before, after) { for (var i = snippetList.length; i--;) { var s = snippetList[i]; if (s.startRe && !s.startRe.test(before)) @@ -992,7 +799,6 @@ var SnippetManager = function() { continue; if (!s.startRe && !s.endRe) continue; - s.matchBefore = s.startRe ? s.startRe.exec(before) : [""]; s.matchAfter = s.endRe ? s.endRe.exec(after) : [""]; s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : ""; @@ -1000,21 +806,15 @@ var SnippetManager = function() { return s; } }; - - this.snippetMap = {}; - this.snippetNameMap = {}; - this.register = function(snippets, scope) { + SnippetManager.prototype.register = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; var self = this; - - if (!snippets) + if (!snippets) snippets = []; - function wrapRegexp(src) { if (src && !/^\^?\(.*\)\$?$|^\\b$/.test(src)) src = "(?:" + src + ")"; - return src || ""; } function guardedRegexp(re, guard, opening) { @@ -1024,14 +824,14 @@ var SnippetManager = function() { re = guard + re; if (re && re[re.length - 1] != "$") re = re + "$"; - } else { + } + else { re = re + guard; if (re && re[0] != "^") re = "^" + re; } return new RegExp(re); } - function addSnippet(s) { if (!s.scope) s.scope = scope || "_"; @@ -1040,7 +840,6 @@ var SnippetManager = function() { snippetMap[scope] = []; snippetNameMap[scope] = {}; } - var map = snippetNameMap[scope]; if (s.name) { var old = map[s.name]; @@ -1049,48 +848,40 @@ var SnippetManager = function() { map[s.name] = s; } snippetMap[scope].push(s); - if (s.prefix) s.tabTrigger = s.prefix; - if (!s.content && s.body) s.content = Array.isArray(s.body) ? s.body.join("\n") : s.body; - if (s.tabTrigger && !s.trigger) { if (!s.guard && /^\w/.test(s.tabTrigger)) s.guard = "\\b"; s.trigger = lang.escapeRegExp(s.tabTrigger); } - if (!s.trigger && !s.guard && !s.endTrigger && !s.endGuard) return; - s.startRe = guardedRegexp(s.trigger, s.guard, true); s.triggerRe = new RegExp(s.trigger); - s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true); s.endTriggerRe = new RegExp(s.endTrigger); } - if (Array.isArray(snippets)) { snippets.forEach(addSnippet); - } else { - Object.keys(snippets).forEach(function(key) { + } + else { + Object.keys(snippets).forEach(function (key) { addSnippet(snippets[key]); }); } - - this._signal("registerSnippets", {scope: scope}); + this._signal("registerSnippets", { scope: scope }); }; - this.unregister = function(snippets, scope) { + SnippetManager.prototype.unregister = function (snippets, scope) { var snippetMap = this.snippetMap; var snippetNameMap = this.snippetNameMap; - function removeSnippet(s) { - var nameMap = snippetNameMap[s.scope||scope]; + var nameMap = snippetNameMap[s.scope || scope]; if (nameMap && nameMap[s.name]) { delete nameMap[s.name]; - var map = snippetMap[s.scope||scope]; + var map = snippetMap[s.scope || scope]; var i = map && map.indexOf(s); if (i >= 0) map.splice(i, 1); @@ -1101,9 +892,9 @@ var SnippetManager = function() { else if (Array.isArray(snippets)) snippets.forEach(removeSnippet); }; - this.parseSnippetFile = function(str) { + SnippetManager.prototype.parseSnippetFile = function (str) { str = str.replace(/\r/g, ""); - var list = [], snippet = {}; + var list = [], /**@type{Snippet}*/ snippet = {}; var re = /^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm; var m; while (m = re.exec(str)) { @@ -1111,12 +902,15 @@ var SnippetManager = function() { try { snippet = JSON.parse(m[1]); list.push(snippet); - } catch (e) {} - } if (m[4]) { + } + catch (e) { } + } + if (m[4]) { snippet.content = m[4].replace(/^\t/gm, ""); list.push(snippet); snippet = {}; - } else { + } + else { var key = m[2], val = m[3]; if (key == "regex") { var guardRe = /\/((?:[^\/\\]|\\.)*)|$/g; @@ -1124,21 +918,23 @@ var SnippetManager = function() { snippet.trigger = guardRe.exec(val)[1]; snippet.endTrigger = guardRe.exec(val)[1]; snippet.endGuard = guardRe.exec(val)[1]; - } else if (key == "snippet") { + } + else if (key == "snippet") { snippet.tabTrigger = val.match(/^\S*/)[0]; if (!snippet.name) snippet.name = val; - } else if (key) { + } + else if (key) { snippet[key] = val; } } } return list; }; - this.getSnippetByName = function(name, editor) { + SnippetManager.prototype.getSnippetByName = function (name, editor) { var snippetMap = this.snippetNameMap; var snippet; - this.getActiveScopes(editor).some(function(scope) { + this.getActiveScopes(editor).some(function (scope) { var snippets = snippetMap[scope]; if (snippets) snippet = snippets[name]; @@ -1146,59 +942,172 @@ var SnippetManager = function() { }, this); return snippet; }; - -}).call(SnippetManager.prototype); - - -var TabstopManager = function(editor) { - if (editor.tabstopManager) - return editor.tabstopManager; - editor.tabstopManager = this; - this.$onChange = this.onChange.bind(this); - this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; - this.$onChangeSession = this.onChangeSession.bind(this); - this.$onAfterExec = this.onAfterExec.bind(this); - this.attach(editor); + return SnippetManager; +}()); +oop.implement(SnippetManager.prototype, EventEmitter); +var processSnippetText = function (editor, snippetText, options) { + if (options === void 0) { options = {}; } + var cursor = editor.getCursorPosition(); + var line = editor.session.getLine(cursor.row); + var tabString = editor.session.getTabString(); + var indentString = line.match(/^\s*/)[0]; + if (cursor.column < indentString.length) + indentString = indentString.slice(0, cursor.column); + snippetText = snippetText.replace(/\r/g, ""); + var tokens = this.tokenizeTmSnippet(snippetText); + tokens = this.resolveVariables(tokens, editor); + tokens = tokens.map(function (x) { + if (x == "\n" && !options.excludeExtraIndent) + return x + indentString; + if (typeof x == "string") + return x.replace(/\t/g, tabString); + return x; + }); + var tabstops = []; + tokens.forEach(function (p, i) { + if (typeof p != "object") + return; + var id = p.tabstopId; + var ts = tabstops[id]; + if (!ts) { + ts = tabstops[id] = []; + ts.index = id; + ts.value = ""; + ts.parents = {}; + } + if (ts.indexOf(p) !== -1) + return; + if (p.choices && !ts.choices) + ts.choices = p.choices; + ts.push(p); + var i1 = tokens.indexOf(p, i + 1); + if (i1 === -1) + return; + var value = tokens.slice(i + 1, i1); + var isNested = value.some(function (t) { return typeof t === "object"; }); + if (isNested && !ts.value) { + ts.value = value; + } + else if (value.length && (!ts.value || typeof ts.value !== "string")) { + ts.value = value.join(""); + } + }); + tabstops.forEach(function (ts) { ts.length = 0; }); + var expanding = {}; + function copyValue(val) { + var copy = []; + for (var i = 0; i < val.length; i++) { + var p = val[i]; + if (typeof p == "object") { + if (expanding[p.tabstopId]) + continue; + var j = val.lastIndexOf(p, i - 1); + p = copy[j] || { tabstopId: p.tabstopId }; + } + copy[i] = p; + } + return copy; + } + for (var i = 0; i < tokens.length; i++) { + var p = tokens[i]; + if (typeof p != "object") + continue; + var id = p.tabstopId; + var ts = tabstops[id]; + var i1 = tokens.indexOf(p, i + 1); + if (expanding[id]) { + if (expanding[id] === p) { + delete expanding[id]; + Object.keys(expanding).forEach(function (parentId) { + ts.parents[parentId] = true; + }); + } + continue; + } + expanding[id] = p; + var value = ts.value; + if (typeof value !== "string") + value = copyValue(value); + else if (p.fmt) + value = this.tmStrFormat(value, p, editor); + tokens.splice.apply(tokens, [i + 1, Math.max(0, i1 - i)].concat(value, p)); + if (ts.indexOf(p) === -1) + ts.push(p); + } + var row = 0, column = 0; + var text = ""; + tokens.forEach(function (t) { + if (typeof t === "string") { + var lines = t.split("\n"); + if (lines.length > 1) { + column = lines[lines.length - 1].length; + row += lines.length - 1; + } + else + column += t.length; + text += t; + } + else if (t) { + if (!t.start) + t.start = { row: row, column: column }; + else + t.end = { row: row, column: column }; + } + }); + return { + text: text, + tabstops: tabstops, + tokens: tokens + }; }; -(function() { - this.attach = function(editor) { +var TabstopManager = /** @class */ (function () { + function TabstopManager(editor) { this.index = 0; this.ranges = []; this.tabstops = []; + if (editor.tabstopManager) + return editor.tabstopManager; + editor.tabstopManager = this; + this.$onChange = this.onChange.bind(this); + this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule; + this.$onChangeSession = this.onChangeSession.bind(this); + this.$onAfterExec = this.onAfterExec.bind(this); + this.attach(editor); + } + TabstopManager.prototype.attach = function (editor) { this.$openTabstops = null; this.selectedTabstop = null; - this.editor = editor; + this.session = editor.session; this.editor.on("change", this.$onChange); this.editor.on("changeSelection", this.$onChangeSelection); this.editor.on("changeSession", this.$onChangeSession); this.editor.commands.on("afterExec", this.$onAfterExec); this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); }; - this.detach = function() { + TabstopManager.prototype.detach = function () { this.tabstops.forEach(this.removeTabstopMarkers, this); - this.ranges = null; - this.tabstops = null; + this.ranges.length = 0; + this.tabstops.length = 0; this.selectedTabstop = null; - this.editor.removeListener("change", this.$onChange); - this.editor.removeListener("changeSelection", this.$onChangeSelection); - this.editor.removeListener("changeSession", this.$onChangeSession); - this.editor.commands.removeListener("afterExec", this.$onAfterExec); + this.editor.off("change", this.$onChange); + this.editor.off("changeSelection", this.$onChangeSelection); + this.editor.off("changeSession", this.$onChangeSession); + this.editor.commands.off("afterExec", this.$onAfterExec); this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); this.editor.tabstopManager = null; + this.session = null; this.editor = null; }; - - this.onChange = function(delta) { + TabstopManager.prototype.onChange = function (delta) { var isRemove = delta.action[0] == "r"; var selectedTabstop = this.selectedTabstop || {}; var parents = selectedTabstop.parents || {}; - var tabstops = (this.tabstops || []).slice(); + var tabstops = this.tabstops.slice(); for (var i = 0; i < tabstops.length; i++) { var ts = tabstops[i]; var active = ts == selectedTabstop || parents[ts.index]; ts.rangeList.$bias = active ? 0 : 1; - if (delta.action == "remove" && ts !== selectedTabstop) { var parentActive = ts.parents && ts.parents[selectedTabstop.index]; var startIndex = ts.rangeList.pointIndex(delta.start, parentActive); @@ -1211,16 +1120,16 @@ var TabstopManager = function(editor) { } ts.rangeList.$onChange(delta); } - var session = this.editor.session; + var session = this.session; if (!this.$inChange && isRemove && session.getLength() == 1 && !session.getValue()) this.detach(); }; - this.updateLinkedFields = function() { + TabstopManager.prototype.updateLinkedFields = function () { var ts = this.selectedTabstop; if (!ts || !ts.hasLinkedRanges || !ts.firstNonLinked) return; this.$inChange = true; - var session = this.editor.session; + var session = this.session; var text = session.getTextRange(ts.firstNonLinked); for (var i = 0; i < ts.length; i++) { var range = ts[i]; @@ -1232,11 +1141,11 @@ var TabstopManager = function(editor) { } this.$inChange = false; }; - this.onAfterExec = function(e) { + TabstopManager.prototype.onAfterExec = function (e) { if (e.command && !e.command.readOnly) this.updateLinkedFields(); }; - this.onChangeSelection = function() { + TabstopManager.prototype.onChangeSelection = function () { if (!this.editor) return; var lead = this.editor.selection.lead; @@ -1252,20 +1161,22 @@ var TabstopManager = function(editor) { } this.detach(); }; - this.onChangeSession = function() { + TabstopManager.prototype.onChangeSession = function () { this.detach(); }; - this.tabNext = function(dir) { + TabstopManager.prototype.tabNext = function (dir) { var max = this.tabstops.length; var index = this.index + (dir || 1); index = Math.min(Math.max(index, 1), max); if (index == max) index = 0; this.selectTabstop(index); - if (index === 0) + this.updateTabstopMarkers(); + if (index === 0) { this.detach(); + } }; - this.selectTabstop = function(index) { + TabstopManager.prototype.selectTabstop = function (index) { this.$openTabstops = null; var ts = this.tabstops[this.index]; if (ts) @@ -1274,10 +1185,10 @@ var TabstopManager = function(editor) { ts = this.tabstops[this.index]; if (!ts || !ts.length) return; - this.selectedTabstop = ts; var range = ts.firstNonLinked || ts; - if (ts.choices) range.cursor = range.start; + if (ts.choices) + range.cursor = range.start; if (!this.editor.inVirtualSelectionMode) { var sel = this.editor.multiSelect; sel.toSingleRange(range); @@ -1286,17 +1197,16 @@ var TabstopManager = function(editor) { continue; sel.addRange(ts[i].clone(), true); } - } else { + } + else { this.editor.selection.fromOrientedRange(range); } - this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler); if (this.selectedTabstop && this.selectedTabstop.choices) - this.editor.execCommand("startAutocomplete", {matches: this.selectedTabstop.choices}); + this.editor.execCommand("startAutocomplete", { matches: this.selectedTabstop.choices }); }; - this.addTabstops = function(tabstops, start, end) { + TabstopManager.prototype.addTabstops = function (tabstops, start, end) { var useLink = this.useLink || !this.editor.getOption("enableMultiselect"); - if (!this.$openTabstops) this.$openTabstops = []; if (!tabstops[0]) { @@ -1306,13 +1216,13 @@ var TabstopManager = function(editor) { tabstops[0] = [p]; tabstops[0].index = 0; } - var i = this.index; var arg = [i + 1, 0]; var ranges = this.ranges; - tabstops.forEach(function(ts, index) { + var snippetId = this.snippetId = (this.snippetId || 0) + 1; + tabstops.forEach(function (ts, index) { var dest = this.$openTabstops[index] || ts; - + dest.snippetId = snippetId; for (var i = 0; i < ts.length; i++) { var p = ts[i]; var range = Range.fromPoints(p.start, p.end || p.start); @@ -1328,7 +1238,8 @@ var TabstopManager = function(editor) { if (p.fmtString || (dest.firstNonLinked && useLink)) { range.linked = true; dest.hasLinkedRanges = true; - } else if (!dest.firstNonLinked) + } + else if (!dest.firstNonLinked) dest.firstNonLinked = range; } if (!dest.firstNonLinked) @@ -1342,36 +1253,51 @@ var TabstopManager = function(editor) { dest.rangeList.$bias = 0; dest.rangeList.addList(dest); }, this); - if (arg.length > 2) { if (this.tabstops.length) arg.push(arg.splice(2, 1)[0]); this.tabstops.splice.apply(this.tabstops, arg); } }; - - this.addTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { - if (!range.markerId) + TabstopManager.prototype.addTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { + if (!range.markerId) range.markerId = session.addMarker(range, "ace_snippet-marker", "text"); }); }; - this.removeTabstopMarkers = function(ts) { - var session = this.editor.session; - ts.forEach(function(range) { + TabstopManager.prototype.removeTabstopMarkers = function (ts) { + var session = this.session; + ts.forEach(function (range) { session.removeMarker(range.markerId); range.markerId = null; }); }; - this.removeRange = function(range) { + TabstopManager.prototype.updateTabstopMarkers = function () { + if (!this.selectedTabstop) + return; + var currentSnippetId = this.selectedTabstop.snippetId; + if (this.selectedTabstop.index === 0) { + currentSnippetId--; + } + this.tabstops.forEach(function (ts) { + if (ts.snippetId === currentSnippetId) + this.addTabstopMarkers(ts); + else + this.removeTabstopMarkers(ts); + }, this); + }; + TabstopManager.prototype.removeRange = function (range) { var i = range.tabstop.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); + if (i != -1) + range.tabstop.splice(i, 1); i = this.ranges.indexOf(range); - if (i != -1) this.ranges.splice(i, 1); + if (i != -1) + this.ranges.splice(i, 1); i = range.tabstop.rangeList.ranges.indexOf(range); - if (i != -1) range.tabstop.splice(i, 1); - this.editor.session.removeMarker(range.markerId); + if (i != -1) + range.tabstop.splice(i, 1); + this.session.removeMarker(range.markerId); if (!range.tabstop.length) { i = this.tabstops.indexOf(range.tabstop); if (i != -1) @@ -1380,167 +1306,499 @@ var TabstopManager = function(editor) { this.detach(); } }; - - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys({ - "Tab": function(editor) { - if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) - return; - editor.tabstopManager.tabNext(1); - editor.renderer.scrollCursorIntoView(); - }, - "Shift-Tab": function(editor) { - editor.tabstopManager.tabNext(-1); - editor.renderer.scrollCursorIntoView(); - }, - "Esc": function(editor) { - editor.tabstopManager.detach(); - } - }); -}).call(TabstopManager.prototype); - - - -var movePoint = function(point, diff) { + return TabstopManager; +}()); +TabstopManager.prototype.keyboardHandler = new HashHandler(); +TabstopManager.prototype.keyboardHandler.bindKeys({ + "Tab": function (editor) { + if (exports.snippetManager && exports.snippetManager.expandWithTab(editor)) + return; + editor.tabstopManager.tabNext(1); + editor.renderer.scrollCursorIntoView(); + }, + "Shift-Tab": function (editor) { + editor.tabstopManager.tabNext(-1); + editor.renderer.scrollCursorIntoView(); + }, + "Esc": function (editor) { + editor.tabstopManager.detach(); + } +}); +var movePoint = function (point, diff) { if (point.row == 0) point.column += diff.column; point.row += diff.row; }; - -var moveRelative = function(point, start) { +var moveRelative = function (point, start) { if (point.row == start.row) point.column -= start.column; point.row -= start.row; }; - - -dom.importCssString("\ -.ace_snippet-marker {\ - -moz-box-sizing: border-box;\ - box-sizing: border-box;\ - background: rgba(194, 193, 208, 0.09);\ - border: 1px dotted rgba(211, 208, 235, 0.62);\ - position: absolute;\ -}", "snippets.css", false); - +dom.importCssString("\n.ace_snippet-marker {\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n background: rgba(194, 193, 208, 0.09);\n border: 1px dotted rgba(211, 208, 235, 0.62);\n position: absolute;\n}", "snippets.css", false); exports.snippetManager = new SnippetManager(); - - var Editor = require("./editor").Editor; -(function() { - this.insertSnippet = function(content, options) { +(function () { + this.insertSnippet = function (content, options) { return exports.snippetManager.insertSnippet(this, content, options); }; - this.expandSnippet = function(options) { + this.expandSnippet = function (options) { return exports.snippetManager.expandWithTab(this, options); }; }).call(Editor.prototype); }); -define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"], function(require, exports, module) { -"use strict"; +define("ace/autocomplete/inline_screenreader",["require","exports","module"], function(require, exports, module){"use strict"; +var AceInlineScreenReader = /** @class */ (function () { + function AceInlineScreenReader(editor) { + this.editor = editor; + this.screenReaderDiv = document.createElement("div"); + this.screenReaderDiv.classList.add("ace_screenreader-only"); + this.editor.container.appendChild(this.screenReaderDiv); + } + AceInlineScreenReader.prototype.setScreenReaderContent = function (content) { + if (!this.popup && this.editor.completer && /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup) { + this.popup = /**@type{import("../autocomplete").Autocomplete}*/ (this.editor.completer).popup; + this.popup.renderer.on("afterRender", function () { + var row = this.popup.getRow(); + var t = this.popup.renderer.$textLayer; + var selected = t.element.childNodes[row - t.config.firstRow]; + if (selected) { + var idString = "doc-tooltip "; + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + idString += "ace-inline-screenreader-line-".concat(lineIndex, " "); + } + selected.setAttribute("aria-describedby", idString); + } + }.bind(this)); + } + while (this.screenReaderDiv.firstChild) { + this.screenReaderDiv.removeChild(this.screenReaderDiv.firstChild); + } + this._lines = content.split(/\r\n|\r|\n/); + var codeElement = this.createCodeBlock(); + this.screenReaderDiv.appendChild(codeElement); + }; + AceInlineScreenReader.prototype.destroy = function () { + this.screenReaderDiv.remove(); + }; + AceInlineScreenReader.prototype.createCodeBlock = function () { + var container = document.createElement("pre"); + container.setAttribute("id", "ace-inline-screenreader"); + for (var lineIndex = 0; lineIndex < this._lines.length; lineIndex++) { + var codeElement = document.createElement("code"); + codeElement.setAttribute("id", "ace-inline-screenreader-line-".concat(lineIndex)); + var line = document.createTextNode(this._lines[lineIndex]); + codeElement.appendChild(line); + container.appendChild(codeElement); + } + return container; + }; + return AceInlineScreenReader; +}()); +exports.AceInlineScreenReader = AceInlineScreenReader; + +}); + +define("ace/autocomplete/inline",["require","exports","module","ace/snippets","ace/autocomplete/inline_screenreader"], function(require, exports, module){"use strict"; +var snippetManager = require("../snippets").snippetManager; +var AceInlineScreenReader = require("./inline_screenreader").AceInlineScreenReader; +var AceInline = /** @class */ (function () { + function AceInline() { + this.editor = null; + } + AceInline.prototype.show = function (editor, completion, prefix) { + prefix = prefix || ""; + if (editor && this.editor && this.editor !== editor) { + this.hide(); + this.editor = null; + this.inlineScreenReader = null; + } + if (!editor || !completion) { + return false; + } + if (!this.inlineScreenReader) { + this.inlineScreenReader = new AceInlineScreenReader(editor); + } + var displayText = completion.snippet ? snippetManager.getDisplayTextForSnippet(editor, completion.snippet) : completion.value; + if (completion.hideInlinePreview || !displayText || !displayText.startsWith(prefix)) { + return false; + } + this.editor = editor; + this.inlineScreenReader.setScreenReaderContent(displayText); + displayText = displayText.slice(prefix.length); + if (displayText === "") { + editor.removeGhostText(); + } + else { + editor.setGhostText(displayText); + } + return true; + }; + AceInline.prototype.isOpen = function () { + if (!this.editor) { + return false; + } + return !!this.editor.renderer.$ghostText; + }; + AceInline.prototype.hide = function () { + if (!this.editor) { + return false; + } + this.editor.removeGhostText(); + return true; + }; + AceInline.prototype.destroy = function () { + this.hide(); + this.editor = null; + if (this.inlineScreenReader) { + this.inlineScreenReader.destroy(); + this.inlineScreenReader = null; + } + }; + return AceInline; +}()); +exports.AceInline = AceInline; + +}); + +define("ace/autocomplete/util",["require","exports","module"], function(require, exports, module){"use strict"; +exports.parForEach = function (array, fn, callback) { + var completed = 0; + var arLength = array.length; + if (arLength === 0) + callback(); + for (var i = 0; i < arLength; i++) { + fn(array[i], function (result, err) { + completed++; + if (completed === arLength) + callback(result, err); + }); + } +}; +var ID_REGEX = /[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/; +exports.retrievePrecedingIdentifier = function (text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos - 1; i >= 0; i--) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf.reverse().join(""); +}; +exports.retrieveFollowingIdentifier = function (text, pos, regex) { + regex = regex || ID_REGEX; + var buf = []; + for (var i = pos; i < text.length; i++) { + if (regex.test(text[i])) + buf.push(text[i]); + else + break; + } + return buf; +}; +exports.getCompletionPrefix = function (editor) { + var pos = editor.getCursorPosition(); + var line = editor.session.getLine(pos.row); + var prefix; + editor.completers.forEach(function (completer) { + if (completer.identifierRegexps) { + completer.identifierRegexps.forEach(function (identifierRegex) { + if (!prefix && identifierRegex) + prefix = this.retrievePrecedingIdentifier(line, pos.column, identifierRegex); + }.bind(this)); + } + }.bind(this)); + return prefix || this.retrievePrecedingIdentifier(line, pos.column); +}; +exports.triggerAutocomplete = function (editor, previousChar) { + var previousChar = previousChar == null + ? editor.session.getPrecedingCharacter() + : previousChar; + return editor.completers.some(function (completer) { + if (completer.triggerCharacters && Array.isArray(completer.triggerCharacters)) { + return completer.triggerCharacters.includes(previousChar); + } + }); +}; + +}); +define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/inline","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config","ace/lib/event","ace/lib/scroll"], function(require, exports, module){"use strict"; var HashHandler = require("./keyboard/hash_handler").HashHandler; var AcePopup = require("./autocomplete/popup").AcePopup; +var AceInline = require("./autocomplete/inline").AceInline; +var getAriaId = require("./autocomplete/popup").getAriaId; var util = require("./autocomplete/util"); var lang = require("./lib/lang"); var dom = require("./lib/dom"); var snippetManager = require("./snippets").snippetManager; var config = require("./config"); - -var Autocomplete = function() { - this.autoInsert = false; - this.autoSelect = true; - this.exactMatch = false; - this.gatherCompletionsId = 0; - this.keyboardHandler = new HashHandler(); - this.keyboardHandler.bindKeys(this.commands); - - this.blurListener = this.blurListener.bind(this); - this.changeListener = this.changeListener.bind(this); - this.mousedownListener = this.mousedownListener.bind(this); - this.mousewheelListener = this.mousewheelListener.bind(this); - - this.changeTimer = lang.delayedCall(function() { - this.updateCompletions(true); - }.bind(this)); - - this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); +var event = require("./lib/event"); +var preventParentScroll = require("./lib/scroll").preventParentScroll; +var destroyCompleter = function (e, editor) { + editor.completer && editor.completer.destroy(); }; - -(function() { - - this.$init = function() { - this.popup = new AcePopup(document.body || document.documentElement); - this.popup.on("click", function(e) { +var Autocomplete = /** @class */ (function () { + function Autocomplete() { + this.autoInsert = false; + this.autoSelect = true; + this.autoShown = false; + this.exactMatch = false; + this.inlineEnabled = false; + this.keyboardHandler = new HashHandler(); + this.keyboardHandler.bindKeys(this.commands); + this.parentNode = null; + this.setSelectOnHover = false; + this.hasSeen = new Set(); + this.showLoadingState = false; + this.stickySelectionDelay = 500; + this.blurListener = this.blurListener.bind(this); + this.changeListener = this.changeListener.bind(this); + this.mousedownListener = this.mousedownListener.bind(this); + this.mousewheelListener = this.mousewheelListener.bind(this); + this.onLayoutChange = this.onLayoutChange.bind(this); + this.changeTimer = lang.delayedCall(function () { + this.updateCompletions(true); + }.bind(this)); + this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50); + this.popupTimer = lang.delayedCall(this.$updatePopupPosition.bind(this), 50); + this.stickySelectionTimer = lang.delayedCall(function () { + this.stickySelection = true; + }.bind(this), this.stickySelectionDelay); + this.$firstOpenTimer = lang.delayedCall(/**@this{Autocomplete}*/ function () { + var initialPosition = this.completionProvider && this.completionProvider.initialPosition; + if (this.autoShown || (this.popup && this.popup.isOpen) || !initialPosition || this.editor.completers.length === 0) + return; + this.completions = new FilteredList(Autocomplete.completionsForLoading); + this.openPopup(this.editor, initialPosition.prefix, false); + this.popup.renderer.setStyle("ace_loading", true); + }.bind(this), this.stickySelectionDelay); + } + Object.defineProperty(Autocomplete, "completionsForLoading", { + get: function () { + return [{ + caption: config.nls("autocomplete.loading", "Loading..."), + value: "" + }]; + }, + enumerable: false, + configurable: true + }); + Autocomplete.prototype.$init = function () { + this.popup = new AcePopup(this.parentNode || document.body || document.documentElement); + this.popup.on("click", function (e) { this.insertMatch(); e.stop(); }.bind(this)); this.popup.focus = this.editor.focus.bind(this.editor); - this.popup.on("show", this.tooltipTimer.bind(null, null)); - this.popup.on("select", this.tooltipTimer.bind(null, null)); + this.popup.on("show", this.$onPopupShow.bind(this)); + this.popup.on("hide", this.$onHidePopup.bind(this)); + this.popup.on("select", this.$onPopupChange.bind(this)); + event.addListener(this.popup.container, "mouseout", this.mouseOutListener.bind(this)); this.popup.on("changeHoverMarker", this.tooltipTimer.bind(null, null)); + this.popup.renderer.on("afterRender", this.$onPopupRender.bind(this)); return this.popup; }; - - this.getPopup = function() { + Autocomplete.prototype.$initInline = function () { + if (!this.inlineEnabled || this.inlineRenderer) + return; + this.inlineRenderer = new AceInline(); + return this.inlineRenderer; + }; + Autocomplete.prototype.getPopup = function () { return this.popup || this.$init(); }; - - this.openPopup = function(editor, prefix, keepPopupPosition) { + Autocomplete.prototype.$onHidePopup = function () { + if (this.inlineRenderer) { + this.inlineRenderer.hide(); + } + this.hideDocTooltip(); + this.stickySelectionTimer.cancel(); + this.popupTimer.cancel(); + this.stickySelection = false; + }; + Autocomplete.prototype.$seen = function (completion) { + if (!this.hasSeen.has(completion) && completion && completion.completer && completion.completer.onSeen && typeof completion.completer.onSeen === "function") { + completion.completer.onSeen(this.editor, completion); + this.hasSeen.add(completion); + } + }; + Autocomplete.prototype.$onPopupChange = function (hide) { + if (this.inlineRenderer && this.inlineEnabled) { + var completion = hide ? null : this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + if (this.popup.isMouseOver && this.setSelectOnHover) { + this.tooltipTimer.call(null, null); + return; + } + this.popupTimer.schedule(); + this.tooltipTimer.schedule(); + } + else { + this.popupTimer.call(null, null); + this.tooltipTimer.call(null, null); + } + }; + Autocomplete.prototype.$updateGhostText = function (completion) { + var row = this.base.row; + var column = this.base.column; + var cursorColumn = this.editor.getCursorPosition().column; + var prefix = this.editor.session.getLine(row).slice(column, cursorColumn); + if (!this.inlineRenderer.show(this.editor, completion, prefix)) { + this.inlineRenderer.hide(); + } + else { + this.$seen(completion); + } + }; + Autocomplete.prototype.$onPopupRender = function () { + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (this.completions && this.completions.filtered && this.completions.filtered.length > 0) { + for (var i = this.popup.getFirstVisibleRow(); i <= this.popup.getLastVisibleRow(); i++) { + var completion = this.popup.getData(i); + if (completion && (!inlineEnabled || completion.hideInlinePreview)) { + this.$seen(completion); + } + } + } + }; + Autocomplete.prototype.$onPopupShow = function (hide) { + this.$onPopupChange(hide); + this.stickySelection = false; + if (this.stickySelectionDelay >= 0) + this.stickySelectionTimer.schedule(this.stickySelectionDelay); + }; + Autocomplete.prototype.observeLayoutChanges = function () { + if (this.$elements || !this.editor) + return; + window.addEventListener("resize", this.onLayoutChange, { passive: true }); + window.addEventListener("wheel", this.mousewheelListener); + var el = this.editor.container.parentNode; + var elements = []; + while (el) { + elements.push(el); + el.addEventListener("scroll", this.onLayoutChange, { passive: true }); + el = el.parentNode; + } + this.$elements = elements; + }; + Autocomplete.prototype.unObserveLayoutChanges = function () { + var _this = this; + window.removeEventListener("resize", this.onLayoutChange, { passive: true }); + window.removeEventListener("wheel", this.mousewheelListener); + this.$elements && this.$elements.forEach(function (el) { + el.removeEventListener("scroll", _this.onLayoutChange, { passive: true }); + }); + this.$elements = null; + }; + Autocomplete.prototype.onLayoutChange = function () { + if (!this.popup.isOpen) + return this.unObserveLayoutChanges(); + this.$updatePopupPosition(); + this.updateDocTooltip(); + }; + Autocomplete.prototype.$updatePopupPosition = function () { + var editor = this.editor; + var renderer = editor.renderer; + var lineHeight = renderer.layerConfig.lineHeight; + var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); + pos.left -= this.popup.getTextLeftOffset(); + var rect = editor.container.getBoundingClientRect(); + pos.top += rect.top - renderer.layerConfig.offset; + pos.left += rect.left - editor.renderer.scrollLeft; + pos.left += renderer.gutterWidth; + var posGhostText = { + top: pos.top, + left: pos.left + }; + if (renderer.$ghostText && renderer.$ghostTextWidget) { + if (this.base.row === renderer.$ghostText.position.row) { + posGhostText.top += renderer.$ghostTextWidget.el.offsetHeight; + } + } + var editorContainerBottom = editor.container.getBoundingClientRect().bottom - lineHeight; + var lowestPosition = editorContainerBottom < posGhostText.top ? + { top: editorContainerBottom, left: posGhostText.left } : + posGhostText; + if (this.popup.tryShow(lowestPosition, lineHeight, "bottom")) { + return; + } + if (this.popup.tryShow(pos, lineHeight, "top")) { + return; + } + this.popup.show(pos, lineHeight); + }; + Autocomplete.prototype.openPopup = function (editor, prefix, keepPopupPosition) { + this.$firstOpenTimer.cancel(); if (!this.popup) this.$init(); - + if (this.inlineEnabled && !this.inlineRenderer) + this.$initInline(); this.popup.autoSelect = this.autoSelect; - + this.popup.setSelectOnHover(this.setSelectOnHover); + var oldRow = this.popup.getRow(); + var previousSelectedItem = this.popup.data[oldRow]; this.popup.setData(this.completions.filtered, this.completions.filterText); - + if (this.editor.textInput.setAriaOptions) { + this.editor.textInput.setAriaOptions({ + activeDescendant: getAriaId(this.popup.getRow()), + inline: this.inlineEnabled + }); + } editor.keyBinding.addKeyboardHandler(this.keyboardHandler); - - var renderer = editor.renderer; - this.popup.setRow(this.autoSelect ? 0 : -1); + var newRow; + if (this.stickySelection) + newRow = this.popup.data.indexOf(previousSelectedItem); + if (!newRow || newRow === -1) + newRow = 0; + this.popup.setRow(this.autoSelect ? newRow : -1); + if (newRow === oldRow && previousSelectedItem !== this.completions.filtered[newRow]) + this.$onPopupChange(); + var inlineEnabled = this.inlineRenderer && this.inlineEnabled; + if (newRow === oldRow && inlineEnabled) { + var completion = this.popup.getData(this.popup.getRow()); + this.$updateGhostText(completion); + } if (!keepPopupPosition) { this.popup.setTheme(editor.getTheme()); this.popup.setFontSize(editor.getFontSize()); - - var lineHeight = renderer.layerConfig.lineHeight; - - var pos = renderer.$cursorLayer.getPixelPosition(this.base, true); - pos.left -= this.popup.getTextLeftOffset(); - - var rect = editor.container.getBoundingClientRect(); - pos.top += rect.top - renderer.layerConfig.offset; - pos.left += rect.left - editor.renderer.scrollLeft; - pos.left += renderer.gutterWidth; - - this.popup.show(pos, lineHeight); - } else if (keepPopupPosition && !prefix) { - this.detach(); + this.$updatePopupPosition(); + if (this.tooltipNode) { + this.updateDocTooltip(); + } } this.changeTimer.cancel(); + this.observeLayoutChanges(); }; - - this.detach = function() { - this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); - this.editor.off("changeSelection", this.changeListener); - this.editor.off("blur", this.blurListener); - this.editor.off("mousedown", this.mousedownListener); - this.editor.off("mousewheel", this.mousewheelListener); + Autocomplete.prototype.detach = function () { + if (this.editor) { + this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler); + this.editor.off("changeSelection", this.changeListener); + this.editor.off("blur", this.blurListener); + this.editor.off("mousedown", this.mousedownListener); + this.editor.off("mousewheel", this.mousewheelListener); + } + this.$firstOpenTimer.cancel(); this.changeTimer.cancel(); this.hideDocTooltip(); - - this.gatherCompletionsId += 1; + if (this.completionProvider) { + this.completionProvider.detach(); + } if (this.popup && this.popup.isOpen) this.popup.hide(); - + if (this.popup && this.popup.renderer) { + this.popup.renderer.off("afterRender", this.$onPopupRender); + } if (this.base) this.base.detach(); this.activated = false; - this.completions = this.base = null; + this.completionProvider = this.completions = this.base = null; + this.unObserveLayoutChanges(); }; - - this.changeListener = function(e) { + Autocomplete.prototype.changeListener = function (e) { var cursor = this.editor.selection.lead; if (cursor.row != this.base.row || cursor.column < this.base.column) { this.detach(); @@ -1550,284 +1808,248 @@ var Autocomplete = function() { else this.detach(); }; - - this.blurListener = function(e) { + Autocomplete.prototype.blurListener = function (e) { var el = document.activeElement; - var text = this.editor.textInput.getElement(); - var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); - var container = this.popup && this.popup.container; - if (el != text && el.parentNode != container && !fromTooltip - && el != this.tooltipNode && e.relatedTarget != text - ) { - this.detach(); - } - }; - - this.mousedownListener = function(e) { - this.detach(); - }; - - this.mousewheelListener = function(e) { - this.detach(); - }; - - this.goTo = function(where) { - this.popup.goTo(where); - }; - - this.insertMatch = function(data, options) { - if (!data) - data = this.popup.getData(this.popup.getRow()); - if (!data) - return false; - - var completions = this.completions; - this.editor.startOperation({command: {name: "insertMatch"}}); - if (data.completer && data.completer.insertMatch) { - data.completer.insertMatch(this.editor, data); - } else { - if (!completions) - return false; - if (completions.filterText) { - var ranges = this.editor.selection.getAllRanges(); - for (var i = 0, range; range = ranges[i]; i++) { - range.start.column -= completions.filterText.length; - this.editor.session.remove(range); - } - } - if (data.snippet) - snippetManager.insertSnippet(this.editor, data.snippet); - else - this.editor.execCommand("insertstring", data.value || data); - } - if (this.completions == completions) - this.detach(); - this.editor.endOperation(); - }; - - - this.commands = { - "Up": function(editor) { editor.completer.goTo("up"); }, - "Down": function(editor) { editor.completer.goTo("down"); }, - "Ctrl-Up|Ctrl-Home": function(editor) { editor.completer.goTo("start"); }, - "Ctrl-Down|Ctrl-End": function(editor) { editor.completer.goTo("end"); }, - - "Esc": function(editor) { editor.completer.detach(); }, - "Return": function(editor) { return editor.completer.insertMatch(); }, - "Shift-Return": function(editor) { editor.completer.insertMatch(null, {deleteSuffix: true}); }, - "Tab": function(editor) { - var result = editor.completer.insertMatch(); - if (!result && !editor.tabstopManager) - editor.completer.goTo("down"); - else - return result; - }, - - "PageUp": function(editor) { editor.completer.popup.gotoPageUp(); }, - "PageDown": function(editor) { editor.completer.popup.gotoPageDown(); } - }; - - this.gatherCompletions = function(editor, callback) { - var session = editor.getSession(); - var pos = editor.getCursorPosition(); - - var prefix = util.getCompletionPrefix(editor); - - this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); - this.base.$insertRight = true; - - var matches = []; - var total = editor.completers.length; - editor.completers.forEach(function(completer, i) { - completer.getCompletions(editor, session, pos, prefix, function(err, results) { - if (!err && results) - matches = matches.concat(results); - callback(null, { - prefix: util.getCompletionPrefix(editor), - matches: matches, - finished: (--total === 0) - }); - }); - }); - return true; + var text = this.editor.textInput.getElement(); + var fromTooltip = e.relatedTarget && this.tooltipNode && this.tooltipNode.contains(e.relatedTarget); + var container = this.popup && this.popup.container; + if (el != text && el.parentNode != container && !fromTooltip + && el != this.tooltipNode && e.relatedTarget != text) { + this.detach(); + } }; - - this.showPopup = function(editor, options) { + Autocomplete.prototype.mousedownListener = function (e) { + this.detach(); + }; + Autocomplete.prototype.mousewheelListener = function (e) { + if (this.popup && !this.popup.isMouseOver) + this.detach(); + }; + Autocomplete.prototype.mouseOutListener = function (e) { + if (this.popup.isOpen) + this.$updatePopupPosition(); + }; + Autocomplete.prototype.goTo = function (where) { + this.popup.goTo(where); + }; + Autocomplete.prototype.insertMatch = function (data, options) { + if (!data) + data = this.popup.getData(this.popup.getRow()); + if (!data) + return false; + if (data.value === "") // Explicitly given nothing to insert, e.g. "No suggestion state" + return this.detach(); + var completions = this.completions; + var result = this.getCompletionProvider().insertMatch(this.editor, data, completions.filterText, options); + if (this.completions == completions) + this.detach(); + return result; + }; + Autocomplete.prototype.showPopup = function (editor, options) { if (this.editor) this.detach(); - this.activated = true; - this.editor = editor; if (editor.completer != this) { if (editor.completer) editor.completer.detach(); editor.completer = this; } - editor.on("changeSelection", this.changeListener); editor.on("blur", this.blurListener); editor.on("mousedown", this.mousedownListener); editor.on("mousewheel", this.mousewheelListener); - this.updateCompletions(false, options); }; - - this.updateCompletions = function(keepPopupPosition, options) { + Autocomplete.prototype.getCompletionProvider = function (initialPosition) { + if (!this.completionProvider) + this.completionProvider = new CompletionProvider(initialPosition); + return this.completionProvider; + }; + Autocomplete.prototype.gatherCompletions = function (editor, callback) { + return this.getCompletionProvider().gatherCompletions(editor, callback); + }; + Autocomplete.prototype.updateCompletions = function (keepPopupPosition, options) { if (keepPopupPosition && this.base && this.completions) { var pos = this.editor.getCursorPosition(); - var prefix = this.editor.session.getTextRange({start: this.base, end: pos}); + var prefix = this.editor.session.getTextRange({ start: this.base, end: pos }); if (prefix == this.completions.filterText) return; this.completions.setFilter(prefix); if (!this.completions.filtered.length) return this.detach(); if (this.completions.filtered.length == 1 - && this.completions.filtered[0].value == prefix - && !this.completions.filtered[0].snippet) + && this.completions.filtered[0].value == prefix + && !this.completions.filtered[0].snippet) return this.detach(); this.openPopup(this.editor, prefix, keepPopupPosition); return; } - if (options && options.matches) { var pos = this.editor.getSelectionRange().start; this.base = this.editor.session.doc.createAnchor(pos.row, pos.column); this.base.$insertRight = true; this.completions = new FilteredList(options.matches); + this.getCompletionProvider().completions = this.completions; return this.openPopup(this.editor, "", keepPopupPosition); } - var _id = this.gatherCompletionsId; - var detachIfFinished = function(results) { - if (!results.finished) return; - return this.detach(); - }.bind(this); - - var processResults = function(results) { - var prefix = results.prefix; - var matches = results.matches; - - this.completions = new FilteredList(matches); - - if (this.exactMatch) - this.completions.exactMatch = true; - - this.completions.setFilter(prefix); - var filtered = this.completions.filtered; - if (!filtered.length) - return detachIfFinished(results); - if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet) - return detachIfFinished(results); - if (this.autoInsert && filtered.length == 1 && results.finished) - return this.insertMatch(filtered[0]); - - this.openPopup(this.editor, prefix, keepPopupPosition); - }.bind(this); - - var isImmediate = true; - var immediateResults = null; - this.gatherCompletions(this.editor, function(err, results) { - var prefix = results.prefix; - var matches = results && results.matches; - - if (!matches || !matches.length) - return detachIfFinished(results); - if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId) - return; - if (isImmediate) { - immediateResults = results; - return; + var session = this.editor.getSession(); + var pos = this.editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(this.editor); + this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length); + this.base.$insertRight = true; + var completionOptions = { + exactMatch: this.exactMatch, + ignoreCaption: this.ignoreCaption + }; + this.getCompletionProvider({ + prefix: prefix, + pos: pos + }).provideCompletions(this.editor, completionOptions, + function (err, completions, finished) { + var filtered = completions.filtered; + var prefix = util.getCompletionPrefix(this.editor); + this.$firstOpenTimer.cancel(); + if (finished) { + if (!filtered.length) { + var emptyMessage = !this.autoShown && this.emptyMessage; + if (typeof emptyMessage == "function") + emptyMessage = this.emptyMessage(prefix); + if (emptyMessage) { + var completionsForEmpty = [{ + caption: emptyMessage, + value: "" + } + ]; + this.completions = new FilteredList(completionsForEmpty); + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_loading", false); + this.popup.renderer.setStyle("ace_empty-message", true); + return; + } + return this.detach(); + } + if (filtered.length == 1 && filtered[0].value == prefix + && !filtered[0].snippet) + return this.detach(); + if (this.autoInsert && !this.autoShown && filtered.length == 1) + return this.insertMatch(filtered[0]); } - - processResults(results); + this.completions = !finished && this.showLoadingState ? + new FilteredList(Autocomplete.completionsForLoading.concat(filtered), completions.filterText) : + completions; + this.openPopup(this.editor, prefix, keepPopupPosition); + this.popup.renderer.setStyle("ace_empty-message", false); + this.popup.renderer.setStyle("ace_loading", !finished); }.bind(this)); - - isImmediate = false; - if (immediateResults) { - var results = immediateResults; - immediateResults = null; - processResults(results); + if (this.showLoadingState && !this.autoShown && !(this.popup && this.popup.isOpen)) { + this.$firstOpenTimer.delay(this.stickySelectionDelay / 2); } }; - - this.cancelContextMenu = function() { + Autocomplete.prototype.cancelContextMenu = function () { this.editor.$mouseHandler.cancelContextMenu(); }; - - this.updateDocTooltip = function() { + Autocomplete.prototype.updateDocTooltip = function () { var popup = this.popup; - var all = popup.data; + var all = this.completions && this.completions.filtered; var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]); var doc = null; if (!selected || !this.editor || !this.popup.isOpen) return this.hideDocTooltip(); - this.editor.completers.some(function(completer) { - if (completer.getDocTooltip) + var completersLength = this.editor.completers.length; + for (var i = 0; i < completersLength; i++) { + var completer = this.editor.completers[i]; + if (completer.getDocTooltip && selected.completerId === completer.id) { doc = completer.getDocTooltip(selected); - return doc; - }); + break; + } + } if (!doc && typeof selected != "string") doc = selected; - if (typeof doc == "string") - doc = {docText: doc}; + doc = { docText: doc }; if (!doc || !(doc.docHTML || doc.docText)) return this.hideDocTooltip(); this.showDocTooltip(doc); }; - - this.showDocTooltip = function(item) { + Autocomplete.prototype.showDocTooltip = function (item) { if (!this.tooltipNode) { this.tooltipNode = dom.createElement("div"); - this.tooltipNode.className = "ace_tooltip ace_doc-tooltip"; - this.tooltipNode.style.margin = 0; + this.tooltipNode.style.margin = "0"; this.tooltipNode.style.pointerEvents = "auto"; + this.tooltipNode.style.overscrollBehavior = "contain"; this.tooltipNode.tabIndex = -1; this.tooltipNode.onblur = this.blurListener.bind(this); this.tooltipNode.onclick = this.onTooltipClick.bind(this); + this.tooltipNode.id = "doc-tooltip"; + this.tooltipNode.setAttribute("role", "tooltip"); + this.tooltipNode.addEventListener("wheel", preventParentScroll); } - + var theme = this.editor.renderer.theme; + this.tooltipNode.className = "ace_tooltip ace_doc-tooltip " + + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); var tooltipNode = this.tooltipNode; if (item.docHTML) { tooltipNode.innerHTML = item.docHTML; - } else if (item.docText) { + } + else if (item.docText) { tooltipNode.textContent = item.docText; } - if (!tooltipNode.parentNode) - document.body.appendChild(tooltipNode); + this.popup.container.appendChild(this.tooltipNode); var popup = this.popup; var rect = popup.container.getBoundingClientRect(); - tooltipNode.style.top = popup.container.style.top; - tooltipNode.style.bottom = popup.container.style.bottom; - - tooltipNode.style.display = "block"; - if (window.innerWidth - rect.right < 320) { - if (rect.left < 320) { - if(popup.isTopdown) { - tooltipNode.style.top = rect.bottom + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } else { - tooltipNode.style.top = popup.container.offsetTop - tooltipNode.offsetHeight + "px"; - tooltipNode.style.left = rect.left + "px"; - tooltipNode.style.right = ""; - tooltipNode.style.bottom = ""; - } - } else { - tooltipNode.style.right = window.innerWidth - rect.left + "px"; - tooltipNode.style.left = ""; + var targetWidth = 400; + var targetHeight = 300; + var scrollBarSize = popup.renderer.scrollBar.width || 10; + var leftSize = rect.left; + var rightSize = window.innerWidth - rect.right - scrollBarSize; + var topSize = popup.isTopdown ? window.innerHeight - scrollBarSize - rect.bottom : rect.top; + var scores = [ + Math.min(rightSize / targetWidth, 1), + Math.min(leftSize / targetWidth, 1), + Math.min(topSize / targetHeight, 1) * 0.9, + ]; + var max = Math.max.apply(Math, scores); + var tooltipStyle = tooltipNode.style; + tooltipStyle.display = "block"; + if (max == scores[0] || scores[0] >= 1) { + tooltipStyle.left = (rect.right + 1) + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[1] || scores[1] >= 1) { + tooltipStyle.right = window.innerWidth - rect.left + "px"; + tooltipStyle.left = ""; + tooltipStyle.maxWidth = targetWidth * max + "px"; + tooltipStyle.top = rect.top + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.top, targetHeight) + "px"; + } + else if (max == scores[2]) { + tooltipStyle.left = rect.left + "px"; + tooltipStyle.right = ""; + tooltipStyle.maxWidth = Math.min(targetWidth, window.innerWidth - rect.left) + "px"; + if (popup.isTopdown) { + tooltipStyle.top = rect.bottom + "px"; + tooltipStyle.bottom = ""; + tooltipStyle.maxHeight = Math.min(window.innerHeight - scrollBarSize - rect.bottom, targetHeight) + "px"; + } + else { + tooltipStyle.top = ""; + tooltipStyle.bottom = (window.innerHeight - rect.top) + "px"; + tooltipStyle.maxHeight = Math.min(rect.top, targetHeight) + "px"; } - } else { - tooltipNode.style.left = (rect.right + 1) + "px"; - tooltipNode.style.right = ""; } + dom.$fixPositionBug(tooltipNode); }; - - this.hideDocTooltip = function() { + Autocomplete.prototype.hideDocTooltip = function () { this.tooltipTimer.cancel(); - if (!this.tooltipNode) return; + if (!this.tooltipNode) + return; var el = this.tooltipNode; if (!this.editor.isFocused() && document.activeElement == el) this.editor.focus(); @@ -1835,8 +2057,7 @@ var Autocomplete = function() { if (el.parentNode) el.parentNode.removeChild(el); }; - - this.onTooltipClick = function(e) { + Autocomplete.prototype.onTooltipClick = function (e) { var a = e.target; while (a && a != this.tooltipNode) { if (a.nodeName == "A" && a.href) { @@ -1847,8 +2068,7 @@ var Autocomplete = function() { a = a.parentNode; } }; - - this.destroy = function() { + Autocomplete.prototype.destroy = function () { this.detach(); if (this.popup) { this.popup.destroy(); @@ -1856,92 +2076,260 @@ var Autocomplete = function() { if (el && el.parentNode) el.parentNode.removeChild(el); } - if (this.editor && this.editor.completer == this) - this.editor.completer == null; - this.popup = null; + if (this.editor && this.editor.completer == this) { + this.editor.off("destroy", destroyCompleter); + this.editor.completer = null; + } + this.inlineRenderer = this.popup = this.editor = null; }; - -}).call(Autocomplete.prototype); - - -Autocomplete.for = function(editor) { - if (editor.completer) { - return editor.completer; - } - if (config.get("sharedPopups")) { - if (!Autocomplete.$shared) - Autocomplete.$sharedInstance = new Autocomplete(); - editor.completer = Autocomplete.$sharedInstance; - } else { - editor.completer = new Autocomplete(); - editor.once("destroy", function(e, editor) { + Autocomplete.for = function (editor) { + if (editor.completer instanceof Autocomplete) { + return editor.completer; + } + if (editor.completer) { editor.completer.destroy(); - }); - } - return editor.completer; + editor.completer = null; + } + if (config.get("sharedPopups")) { + if (!Autocomplete["$sharedInstance"]) + Autocomplete["$sharedInstance"] = new Autocomplete(); + editor.completer = Autocomplete["$sharedInstance"]; + } + else { + editor.completer = new Autocomplete(); + editor.once("destroy", destroyCompleter); + } + return editor.completer; + }; + return Autocomplete; +}()); +Autocomplete.prototype.commands = { + "Up": function (editor) { editor.completer.goTo("up"); }, + "Down": function (editor) { editor.completer.goTo("down"); }, + "Ctrl-Up|Ctrl-Home": function (editor) { editor.completer.goTo("start"); }, + "Ctrl-Down|Ctrl-End": function (editor) { editor.completer.goTo("end"); }, + "Esc": function (editor) { editor.completer.detach(); }, + "Return": function (editor) { return editor.completer.insertMatch(); }, + "Shift-Return": function (editor) { editor.completer.insertMatch(null, { deleteSuffix: true }); }, + "Tab": function (editor) { + var result = editor.completer.insertMatch(); + if (!result && !editor.tabstopManager) + editor.completer.goTo("down"); + else + return result; + }, + "Backspace": function (editor) { + editor.execCommand("backspace"); + var prefix = util.getCompletionPrefix(editor); + if (!prefix && editor.completer) + editor.completer.detach(); + }, + "PageUp": function (editor) { editor.completer.popup.gotoPageUp(); }, + "PageDown": function (editor) { editor.completer.popup.gotoPageDown(); } }; - Autocomplete.startCommand = { name: "startAutocomplete", - exec: function(editor, options) { + exec: function (editor, options) { var completer = Autocomplete.for(editor); completer.autoInsert = false; completer.autoSelect = true; + completer.autoShown = false; completer.showPopup(editor, options); completer.cancelContextMenu(); }, bindKey: "Ctrl-Space|Ctrl-Shift-Space|Alt-Space" }; - -var FilteredList = function(array, filterText) { - this.all = array; - this.filtered = array; - this.filterText = filterText || ""; - this.exactMatch = false; -}; -(function(){ - this.setFilter = function(str) { +var CompletionProvider = /** @class */ (function () { + function CompletionProvider(initialPosition) { + this.initialPosition = initialPosition; + this.active = true; + } + CompletionProvider.prototype.insertByIndex = function (editor, index, options) { + if (!this.completions || !this.completions.filtered) { + return false; + } + return this.insertMatch(editor, this.completions.filtered[index], options); + }; + CompletionProvider.prototype.insertMatch = function (editor, data, options) { + if (!data) + return false; + editor.startOperation({ command: { name: "insertMatch" } }); + if (data.completer && data.completer.insertMatch) { + data.completer.insertMatch(editor, data); + } + else { + if (!this.completions) + return false; + var replaceBefore = this.completions.filterText.length; + var replaceAfter = 0; + if (data.range && data.range.start.row === data.range.end.row) { + replaceBefore -= this.initialPosition.prefix.length; + replaceBefore += this.initialPosition.pos.column - data.range.start.column; + replaceAfter += data.range.end.column - this.initialPosition.pos.column; + } + if (replaceBefore || replaceAfter) { + var ranges; + if (editor.selection.getAllRanges) { + ranges = editor.selection.getAllRanges(); + } + else { + ranges = [editor.getSelectionRange()]; + } + for (var i = 0, range; range = ranges[i]; i++) { + range.start.column -= replaceBefore; + range.end.column += replaceAfter; + editor.session.remove(range); + } + } + if (data.snippet) { + snippetManager.insertSnippet(editor, data.snippet); + } + else { + this.$insertString(editor, data); + } + if (data.completer && data.completer.onInsert && typeof data.completer.onInsert == "function") { + data.completer.onInsert(editor, data); + } + if (data.command && data.command === "startAutocomplete") { + editor.execCommand(data.command); + } + } + editor.endOperation(); + return true; + }; + CompletionProvider.prototype.$insertString = function (editor, data) { + var text = data.value || data; + editor.execCommand("insertstring", text); + }; + CompletionProvider.prototype.gatherCompletions = function (editor, callback) { + var session = editor.getSession(); + var pos = editor.getCursorPosition(); + var prefix = util.getCompletionPrefix(editor); + var matches = []; + this.completers = editor.completers; + var total = editor.completers.length; + editor.completers.forEach(function (completer, i) { + completer.getCompletions(editor, session, pos, prefix, function (err, results) { + if (completer.hideInlinePreview) + results = results.map(function (result) { + return Object.assign(result, { hideInlinePreview: completer.hideInlinePreview }); + }); + if (!err && results) + matches = matches.concat(results); + callback(null, { + prefix: util.getCompletionPrefix(editor), + matches: matches, + finished: (--total === 0) + }); + }); + }); + return true; + }; + CompletionProvider.prototype.provideCompletions = function (editor, options, callback) { + var processResults = function (results) { + var prefix = results.prefix; + var matches = results.matches; + this.completions = new FilteredList(matches); + if (options.exactMatch) + this.completions.exactMatch = true; + if (options.ignoreCaption) + this.completions.ignoreCaption = true; + this.completions.setFilter(prefix); + if (results.finished || this.completions.filtered.length) + callback(null, this.completions, results.finished); + }.bind(this); + var isImmediate = true; + var immediateResults = null; + this.gatherCompletions(editor, function (err, results) { + if (!this.active) { + return; + } + if (err) { + callback(err, [], true); + this.detach(); + } + var prefix = results.prefix; + if (prefix.indexOf(results.prefix) !== 0) + return; + if (isImmediate) { + immediateResults = results; + return; + } + processResults(results); + }.bind(this)); + isImmediate = false; + if (immediateResults) { + var results = immediateResults; + immediateResults = null; + processResults(results); + } + }; + CompletionProvider.prototype.detach = function () { + this.active = false; + this.completers && this.completers.forEach(function (completer) { + if (typeof completer.cancel === "function") { + completer.cancel(); + } + }); + }; + return CompletionProvider; +}()); +var FilteredList = /** @class */ (function () { + function FilteredList(array, filterText) { + this.all = array; + this.filtered = array; + this.filterText = filterText || ""; + this.exactMatch = false; + this.ignoreCaption = false; + } + FilteredList.prototype.setFilter = function (str) { if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0) var matches = this.filtered; else var matches = this.all; - this.filterText = str; matches = this.filterCompletions(matches, this.filterText); - matches = matches.sort(function(a, b) { - return b.exactMatch - a.exactMatch || b.$score - a.$score + matches = matches.sort(function (a, b) { + return b.exactMatch - a.exactMatch || b.$score - a.$score || (a.caption || a.value).localeCompare(b.caption || b.value); }); var prev = null; - matches = matches.filter(function(item){ + matches = matches.filter(function (item) { var caption = item.snippet || item.caption || item.value; - if (caption === prev) return false; + if (caption === prev) + return false; prev = caption; return true; }); - this.filtered = matches; }; - this.filterCompletions = function(items, needle) { + FilteredList.prototype.filterCompletions = function (items, needle) { var results = []; var upper = needle.toUpperCase(); var lower = needle.toLowerCase(); loop: for (var i = 0, item; item = items[i]; i++) { - var caption = item.caption || item.value || item.snippet; - if (!caption) continue; + if (item.skipFilter) { + item.$score = item.score; + results.push(item); + continue; + } + var caption = (!this.ignoreCaption && item.caption) || item.value || item.snippet; + if (!caption) + continue; var lastIndex = -1; var matchMask = 0; var penalty = 0; var index, distance; - if (this.exactMatch) { if (needle !== caption.substr(0, needle.length)) continue loop; - } else { + } + else { var fullMatchIndex = caption.toLowerCase().indexOf(lower); if (fullMatchIndex > -1) { penalty = fullMatchIndex; - } else { + } + else { for (var j = 0; j < needle.length; j++) { var i1 = caption.indexOf(lower[j], lastIndex + 1); var i2 = caption.indexOf(upper[j], lastIndex + 1); @@ -1964,104 +2352,55 @@ var FilteredList = function(array, filterText) { item.$score = (item.score || 0) - penalty; results.push(item); } - var keywords = []; - for (var i=0, j=results.length; i=0;){ - if (!results[i]) continue - if (results[i].meta=='local' && keywords.indexOf(results[i].caption)!=-1){ - results.splice(i,1) - } - } - return results; }; -}).call(FilteredList.prototype); - + return FilteredList; +}()); exports.Autocomplete = Autocomplete; +exports.CompletionProvider = CompletionProvider; exports.FilteredList = FilteredList; }); -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -2077,22 +2416,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -2106,9 +2442,17 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -2121,203 +2465,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -2334,7 +2700,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -2344,22 +2709,45 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/prompt",["require","exports","module","ace/range","ace/lib/dom","ace/ext/menu_tools/get_editor_keyboard_shortcuts","ace/autocomplete","ace/autocomplete/popup","ace/autocomplete/popup","ace/undomanager","ace/tokenizer","ace/ext/menu_tools/overlay_page","ace/ext/modelist"], function(require, exports, module) { +define("ace/ext/prompt",["require","exports","module","ace/config","ace/range","ace/lib/dom","ace/autocomplete","ace/autocomplete/popup","ace/autocomplete/popup","ace/undomanager","ace/tokenizer","ace/ext/menu_tools/overlay_page","ace/ext/modelist"], function(require, exports, module){/** + * ## User Input Prompt extension + * + * Provides customizable modal prompts for gathering user input with support for autocompletion, validation, and + * specialized input types. Includes built-in prompt types for navigation (goto line), command palette, and mode + * selection, with extensible architecture for custom prompt implementations. + * + * **Built-in Prompt Types:** + * - `gotoLine`: Navigate to specific line numbers with selection support + * - `commands`: Command palette with searchable editor commands and shortcuts + * - `modes`: Language mode selector with filtering capabilities + * + * **Usage:** + * ```javascript + * // Basic prompt + * prompt(editor, "Default value", { + * placeholder: "Enter text...", + * onAccept: (data) => console.log(data.value) + * }); + * + * // Built-in prompts + * prompt.gotoLine(editor); + * prompt.commands(editor); + * prompt.modes(editor); + * ``` + * + * @module + */ "use strict"; - +var nls = require("../config").nls; var Range = require("../range").Range; var dom = require("../lib/dom"); -var shortcuts = require("../ext/menu_tools/get_editor_keyboard_shortcuts"); -var FilteredList= require("../autocomplete").FilteredList; +var FilteredList = require("../autocomplete").FilteredList; var AcePopup = require('../autocomplete/popup').AcePopup; var $singleLineEditor = require('../autocomplete/popup').$singleLineEditor; var UndoManager = require("../undomanager").UndoManager; @@ -2367,7 +2755,6 @@ var Tokenizer = require("../tokenizer").Tokenizer; var overlayPage = require("./menu_tools/overlay_page").overlayPage; var modelist = require("./modelist"); var openPrompt; - function prompt(editor, message, options, callback) { if (typeof message == "object") { return prompt(editor, "", message, options); @@ -2380,15 +2767,12 @@ function prompt(editor, message, options, callback) { return; } if (options.$type) - return prompt[options.$type](editor, callback); - + return prompt[options.$type](editor, callback); var cmdLine = $singleLineEditor(); cmdLine.session.setUndoManager(new UndoManager()); - - var el = dom.buildDom(["div", {class: "ace_prompt_container" + (options.hasDescription ? " input-box-with-description" : "")}]); + var el = dom.buildDom(["div", { class: "ace_prompt_container" + (options.hasDescription ? " input-box-with-description" : "") }]); var overlay = overlayPage(editor, el, done); el.appendChild(cmdLine.container); - if (editor) { editor.cmdLine = cmdLine; cmdLine.setOption("fontSize", editor.getOption("fontSize")); @@ -2402,7 +2786,6 @@ function prompt(editor, message, options, callback) { end: cmdLine.session.doc.indexToPosition(options.selection[1]) }); } - if (options.getCompletions) { var popup = new AcePopup(); popup.renderer.setStyle("ace_autocomplete_inline"); @@ -2414,10 +2797,10 @@ function prompt(editor, message, options, callback) { popup.autoSelect = false; popup.renderer.$maxLines = 15; popup.setRow(-1); - popup.on("click", function(e) { + popup.on("click", function (e) { var data = popup.getData(popup.getRow()); - if (!data.error) { - cmdLine.setValue(data.value || data.name || data); + if (!data["error"]) { + cmdLine.setValue(data.value || data["name"] || data); accept(); e.stop(); } @@ -2425,33 +2808,29 @@ function prompt(editor, message, options, callback) { el.appendChild(popup.container); updateCompletions(); } - if (options.$rules) { var tokenizer = new Tokenizer(options.$rules); cmdLine.session.bgTokenizer.setTokenizer(tokenizer); } - if (options.placeholder) { cmdLine.setOption("placeholder", options.placeholder); } - if (options.hasDescription) { - var promptTextContainer = dom.buildDom(["div", {class: "ace_prompt_text_container"}]); + var promptTextContainer = dom.buildDom(["div", { class: "ace_prompt_text_container" }]); dom.buildDom(options.prompt || "Press 'Enter' to confirm or 'Escape' to cancel", promptTextContainer); el.appendChild(promptTextContainer); } - overlay.setIgnoreFocusOut(options.ignoreFocusOut); - function accept() { var val; if (popup && popup.getCursorPosition().row > 0) { val = valueFromRecentList(); - } else { + } + else { val = cmdLine.getValue(); } var curData = popup ? popup.getData(popup.getRow()) : val; - if (curData && !curData.error) { + if (curData && !curData["error"]) { done(); options.onAccept && options.onAccept({ value: val, @@ -2459,116 +2838,105 @@ function prompt(editor, message, options, callback) { }, cmdLine); } } - var keys = { "Enter": accept, - "Esc|Shift-Esc": function() { + "Esc|Shift-Esc": function () { options.onCancel && options.onCancel(cmdLine.getValue(), cmdLine); done(); } }; - if (popup) { Object.assign(keys, { - "Up": function(editor) { popup.goTo("up"); valueFromRecentList();}, - "Down": function(editor) { popup.goTo("down"); valueFromRecentList();}, - "Ctrl-Up|Ctrl-Home": function(editor) { popup.goTo("start"); valueFromRecentList();}, - "Ctrl-Down|Ctrl-End": function(editor) { popup.goTo("end"); valueFromRecentList();}, - "Tab": function(editor) { - popup.goTo("down"); valueFromRecentList(); + "Up": function (editor) { popup.goTo("up"); valueFromRecentList(); }, + "Down": function (editor) { popup.goTo("down"); valueFromRecentList(); }, + "Ctrl-Up|Ctrl-Home": function (editor) { popup.goTo("start"); valueFromRecentList(); }, + "Ctrl-Down|Ctrl-End": function (editor) { popup.goTo("end"); valueFromRecentList(); }, + "Tab": function (editor) { + popup.goTo("down"); + valueFromRecentList(); }, - "PageUp": function(editor) { popup.gotoPageUp(); valueFromRecentList();}, - "PageDown": function(editor) { popup.gotoPageDown(); valueFromRecentList();} + "PageUp": function (editor) { popup.gotoPageUp(); valueFromRecentList(); }, + "PageDown": function (editor) { popup.gotoPageDown(); valueFromRecentList(); } }); } - cmdLine.commands.bindKeys(keys); - function done() { overlay.close(); callback && callback(); openPrompt = null; } - - cmdLine.on("input", function() { + cmdLine.on("input", function () { options.onInput && options.onInput(); updateCompletions(); }); - function updateCompletions() { if (options.getCompletions) { var prefix; if (options.getPrefix) { prefix = options.getPrefix(cmdLine); } - var completions = options.getCompletions(cmdLine); popup.setData(completions, prefix); popup.resize(true); } } - function valueFromRecentList() { var current = popup.getData(popup.getRow()); - if (current && !current.error) + if (current && !current["error"]) return current.value || current.caption || current; } - cmdLine.resize(true); if (popup) { popup.resize(true); } cmdLine.focus(); - openPrompt = { close: done, name: options.name, editor: editor }; } - -prompt.gotoLine = function(editor, callback) { +prompt.gotoLine = function (editor, callback) { function stringifySelection(selection) { if (!Array.isArray(selection)) selection = [selection]; - return selection.map(function(r) { - var cursor = r.isBackwards ? r.start: r.end; - var anchor = r.isBackwards ? r.end: r.start; + return selection.map(function (r) { + var cursor = r.isBackwards ? r.start : r.end; + var anchor = r.isBackwards ? r.end : r.start; var row = anchor.row; var s = (row + 1) + ":" + anchor.column; - if (anchor.row == cursor.row) { if (anchor.column != cursor.column) s += ">" + ":" + cursor.column; - } else { + } + else { s += ">" + (cursor.row + 1) + ":" + cursor.column; } return s; }).reverse().join(", "); } - prompt(editor, ":" + stringifySelection(editor.selection.toJSON()), { name: "gotoLine", selection: [1, Number.MAX_VALUE], - onAccept: function(data) { + onAccept: function (data) { var value = data.value; - var _history = prompt.gotoLine._history; + var _history = prompt.gotoLine["_history"]; if (!_history) - prompt.gotoLine._history = _history = []; + prompt.gotoLine["_history"] = _history = []; if (_history.indexOf(value) != -1) _history.splice(_history.indexOf(value), 1); _history.unshift(value); - if (_history.length > 20) _history.length = 20; - - + if (_history.length > 20) + _history.length = 20; var pos = editor.getCursorPosition(); var ranges = []; - value.replace(/^:/, "").split(/,/).map(function(str) { + value.replace(/^:/, "").split(/,/).map(function (str) { var parts = str.split(/([<>:+-]|c?\d+)|[^c\d<>:+-]+/).filter(Boolean); var i = 0; function readPosition() { var c = parts[i++]; - if (!c) return; + if (!c) + return; if (c[0] == "c") { var index = parseInt(c.slice(1)) || 0; return editor.session.doc.indexToPosition(index); @@ -2585,7 +2953,7 @@ prompt.gotoLine = function(editor, callback) { column = parseInt(c) || 0; } } - return {row: row, column: column}; + return { row: row, column: column }; } pos = readPosition(); var range = Range.fromPoints(pos, pos); @@ -2601,21 +2969,15 @@ prompt.gotoLine = function(editor, callback) { }); editor.selection.fromJSON(ranges); var scrollTop = editor.renderer.scrollTop; - editor.renderer.scrollSelectionIntoView( - editor.selection.anchor, - editor.selection.cursor, - 0.5 - ); + editor.renderer.scrollSelectionIntoView(editor.selection.anchor, editor.selection.cursor, 0.5); editor.renderer.animateScrolling(scrollTop); }, - history: function() { - var undoManager = editor.session.getUndoManager(); - if (!prompt.gotoLine._history) + history: function () { + if (!prompt.gotoLine["_history"]) return []; - return prompt.gotoLine._history; - + return prompt.gotoLine["_history"]; }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { var value = cmdLine.getValue(); var m = value.replace(/^:/, "").split(":"); var row = Math.min(parseInt(m[0]) || 1, editor.session.getLength()) - 1; @@ -2625,30 +2987,29 @@ prompt.gotoLine = function(editor, callback) { }, $rules: { start: [{ - regex: /\d+/, - token: "string" - }, { - regex: /[:,><+\-c]/, - token: "keyword" - }] + regex: /\d+/, + token: "string" + }, { + regex: /[:,><+\-c]/, + token: "keyword" + }] } }); }; - -prompt.commands = function(editor, callback) { +prompt.commands = function (editor, callback) { function normalizeName(name) { - return (name || "").replace(/^./, function(x) { + return (name || "").replace(/^./, function (x) { return x.toUpperCase(x); - }).replace(/[a-z][A-Z]/g, function(x) { + }).replace(/[a-z][A-Z]/g, function (x) { return x[0] + " " + x[1].toLowerCase(x); }); } function getEditorCommandsByName(excludeCommands) { var commandsByName = []; var commandMap = {}; - editor.keyBinding.$handlers.forEach(function(handler) { - var platform = handler.platform; - var cbn = handler.byName; + editor.keyBinding.$handlers.forEach(function (handler) { + var platform = handler["platform"]; + var cbn = handler["byName"]; for (var i in cbn) { var key = cbn[i].bindKey; if (typeof key !== "string") { @@ -2658,17 +3019,18 @@ prompt.commands = function(editor, callback) { var description = commands.description || normalizeName(commands.name); if (!Array.isArray(commands)) commands = [commands]; - commands.forEach(function(command) { + commands.forEach(function (command) { if (typeof command != "string") command = command.name; - var needle = excludeCommands.find(function(el) { + var needle = excludeCommands.find(function (el) { return el === command; }); if (!needle) { if (commandMap[command]) { commandMap[command].key += "|" + key; - } else { - commandMap[command] = {key: key, command: command, description: description}; + } + else { + commandMap[command] = { key: key, command: command, description: description }; commandsByName.push(commandMap[command]); } } @@ -2679,27 +3041,26 @@ prompt.commands = function(editor, callback) { } var excludeCommandsList = ["insertstring", "inserttext", "setIndentation", "paste"]; var shortcutsArray = getEditorCommandsByName(excludeCommandsList); - shortcutsArray = shortcutsArray.map(function(item) { - return {value: item.description, meta: item.key, command: item.command}; + shortcutsArray = shortcutsArray.map(function (item) { + return { value: item.description, meta: item.key, command: item.command }; }); - prompt(editor, "", { + prompt(editor, "", { name: "commands", selection: [0, Number.MAX_VALUE], maxHistoryCount: 5, - onAccept: function(data) { + onAccept: function (data) { if (data.item) { var commandName = data.item.command; this.addToHistory(data.item); - editor.execCommand(commandName); } }, - addToHistory: function(item) { + addToHistory: function (item) { var history = this.history(); history.unshift(item); delete item.message; for (var i = 1; i < history.length; i++) { - if (history[i]["command"] == item.command ) { + if (history[i]["command"] == item.command) { history.splice(i, 1); break; } @@ -2707,112 +3068,90 @@ prompt.commands = function(editor, callback) { if (this.maxHistoryCount > 0 && history.length > this.maxHistoryCount) { history.splice(history.length - 1, 1); } - prompt.commands.history = history; + prompt.commands["history"] = history; }, - history: function() { - return prompt.commands.history || []; + history: function () { + return prompt.commands["history"] || []; }, - getPrefix: function(cmdLine) { + getPrefix: function (cmdLine) { var currentPos = cmdLine.getCursorPosition(); var filterValue = cmdLine.getValue(); return filterValue.substring(0, currentPos.column); }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { function getFilteredCompletions(commands, prefix) { var resultCommands = JSON.parse(JSON.stringify(commands)); - var filtered = new FilteredList(resultCommands); return filtered.filterCompletions(resultCommands, prefix); } - function getUniqueCommandList(commands, usedCommands) { if (!usedCommands || !usedCommands.length) { return commands; } var excludeCommands = []; - usedCommands.forEach(function(item) { + usedCommands.forEach(function (item) { excludeCommands.push(item.command); }); - var resultCommands = []; - - commands.forEach(function(item) { + commands.forEach(function (item) { if (excludeCommands.indexOf(item.command) === -1) { resultCommands.push(item); } }); - return resultCommands; } - var prefix = this.getPrefix(cmdLine); var recentlyUsedCommands = getFilteredCompletions(this.history(), prefix); var otherCommands = getUniqueCommandList(shortcutsArray, recentlyUsedCommands); otherCommands = getFilteredCompletions(otherCommands, prefix); - if (recentlyUsedCommands.length && otherCommands.length) { - recentlyUsedCommands[0]["message"] = " Recently used"; - otherCommands[0]["message"] = " Other commands"; + recentlyUsedCommands[0].message = nls("prompt.recently-used", "Recently used"); + otherCommands[0].message = nls("prompt.other-commands", "Other commands"); } - var completions = recentlyUsedCommands.concat(otherCommands); return completions.length > 0 ? completions : [{ - value: "No matching commands", - error: 1 - }]; + value: nls("prompt.no-matching-commands", "No matching commands"), + error: 1 + }]; } }); }; - -prompt.modes = function(editor, callback) { +prompt.modes = function (editor, callback) { var modesArray = modelist.modes; - modesArray = modesArray.map(function(item) { - return {value: item.caption, mode: item.name}; + modesArray = modesArray.map(function (item) { + return { value: item.caption, mode: item.name }; }); - prompt(editor, "", { + prompt(editor, "", { name: "modes", selection: [0, Number.MAX_VALUE], - onAccept: function(data) { + onAccept: function (data) { if (data.item) { var modeName = "ace/mode/" + data.item.mode; editor.session.setMode(modeName); } }, - getPrefix: function(cmdLine) { + getPrefix: function (cmdLine) { var currentPos = cmdLine.getCursorPosition(); var filterValue = cmdLine.getValue(); return filterValue.substring(0, currentPos.column); }, - getCompletions: function(cmdLine) { + getCompletions: function (cmdLine) { function getFilteredCompletions(modes, prefix) { var resultCommands = JSON.parse(JSON.stringify(modes)); - var filtered = new FilteredList(resultCommands); return filtered.filterCompletions(resultCommands, prefix); } - var prefix = this.getPrefix(cmdLine); var completions = getFilteredCompletions(modesArray, prefix); return completions.length > 0 ? completions : [{ - "caption": "No mode matching", - "value": "No mode matching", - "error": 1 - }]; + "caption": "No mode matching", + "value": "No mode matching", + "error": 1 + }]; } }); }; - -dom.importCssString(".ace_prompt_container {\ - max-width: 600px;\ - width: 100%;\ - margin: 20px auto;\ - padding: 3px;\ - background: white;\ - border-radius: 2px;\ - box-shadow: 0px 2px 3px 0px #555;\ -}", "promtp.css", false); - - +dom.importCssString(".ace_prompt_container {\n max-width: 603px;\n width: 100%;\n margin: 20px auto;\n padding: 3px;\n background: white;\n border-radius: 2px;\n box-shadow: 0px 2px 3px 0px #555;\n}", "promtp.css", false); exports.prompt = prompt; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-rtl.js b/app/Resources/ui/js/ace/ext-rtl.js index 39ebfd9..d5f8567 100644 --- a/app/Resources/ui/js/ace/ext-rtl.js +++ b/app/Resources/ui/js/ace/ext-rtl.js @@ -1,33 +1,57 @@ -define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/rtl",["require","exports","module","ace/editor","ace/config"], function(require, exports, module){/** + * ## Right-to-Left (RTL) text support extension + * + * Provides bidirectional text support enabling proper rendering and editing of RTL languages such as Arabic, Hebrew, + * and Persian. Handles text direction detection, cursor positioning, and ensures correct visual behavior for mixed + * LTR/RTL content. Includes keyboard shortcuts for manual text direction control and automatic + * RLE (Right-to-Left Embedding) marker management. + * + * **Configuration Options:** + * - `rtlText`: Enable automatic RTL text detection and handling + * - `rtl`: Force RTL direction for the entire editor + * + * **Keyboard Shortcuts:** + * - `Ctrl-Alt-Shift-L` (Win) / `Cmd-Alt-Shift-L` (Mac): Force left-to-right direction + * - `Ctrl-Alt-Shift-R` (Win) / `Cmd-Alt-Shift-R` (Mac): Force right-to-left direction + * + * **Usage:** + * ```javascript + * editor.setOptions({ + * rtlText: true, // Enable automatic RTL detection + * rtl: false // Or force RTL direction + * }); + * ``` + * + * @module + */ "use strict"; - var commands = [{ - name: "leftToRight", - bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" }, - exec: function(editor) { - editor.session.$bidiHandler.setRtlDirection(editor, false); - }, - readOnly: true -}, { - name: "rightToLeft", - bindKey: { win: "Ctrl-Alt-Shift-R", mac: "Command-Alt-Shift-R" }, - exec: function(editor) { - editor.session.$bidiHandler.setRtlDirection(editor, true); - }, - readOnly: true -}]; - + name: "leftToRight", + bindKey: { win: "Ctrl-Alt-Shift-L", mac: "Command-Alt-Shift-L" }, + exec: function (editor) { + editor.session.$bidiHandler.setRtlDirection(editor, false); + }, + readOnly: true + }, { + name: "rightToLeft", + bindKey: { win: "Ctrl-Alt-Shift-R", mac: "Command-Alt-Shift-R" }, + exec: function (editor) { + editor.session.$bidiHandler.setRtlDirection(editor, true); + }, + readOnly: true + }]; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { rtlText: { - set: function(val) { + set: function (val) { if (val) { this.on("change", onChange); this.on("changeSelection", onChangeSelection); this.renderer.on("afterRender", updateLineDirection); this.commands.on("exec", onCommandEmitted); this.commands.addCommands(commands); - } else { + } + else { this.off("change", onChange); this.off("changeSelection", onChangeSelection); this.renderer.off("afterRender", updateLineDirection); @@ -39,13 +63,14 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }, rtl: { - set: function(val) { + set: function (val) { this.session.$bidiHandler.$isRtl = val; if (val) { this.setOption("rtlText", false); this.renderer.on("afterRender", updateLineDirection); this.session.$bidiHandler.seenBidi = true; - } else { + } + else { this.renderer.off("afterRender", updateLineDirection); clearTextLayer(this.renderer); } @@ -59,7 +84,8 @@ function onChangeSelection(e, editor) { if (lead.column === 0) { if (editor.session.$bidiHandler.isMoveLeftOperation && lead.row > 0) { editor.getSelection().moveCursorTo(lead.row - 1, editor.session.getLine(lead.row - 1).length); - } else { + } + else { if (editor.getSelection().isEmpty()) lead.column += 1; else @@ -68,7 +94,6 @@ function onChangeSelection(e, editor) { } } } - function onCommandEmitted(commadEvent) { commadEvent.editor.session.$bidiHandler.isMoveLeftOperation = /gotoleft|selectleft|backspace|removewordleft/.test(commadEvent.command.name); } @@ -82,26 +107,25 @@ function onChange(delta, editor) { } } } - function updateLineDirection(e, renderer) { var session = renderer.session; var $bidiHandler = session.$bidiHandler; var cells = renderer.$textLayer.$lines.cells; var width = renderer.layerConfig.width - renderer.layerConfig.padding + "px"; - cells.forEach(function(cell) { + cells.forEach(function (cell) { var style = cell.element.style; if ($bidiHandler && $bidiHandler.isRtlLine(cell.row)) { style.direction = "rtl"; style.textAlign = "right"; style.width = width; - } else { + } + else { style.direction = ""; style.textAlign = ""; style.width = ""; } }); } - function clearTextLayer(renderer) { var lines = renderer.$textLayer.$lines; lines.cells.forEach(clear); diff --git a/app/Resources/ui/js/ace/ext-searchbox.js b/app/Resources/ui/js/ace/ext-searchbox.js index 8be7e8c..8bdfd1e 100644 --- a/app/Resources/ui/js/ace/ext-searchbox.js +++ b/app/Resources/ui/js/ace/ext-searchbox.js @@ -1,214 +1,89 @@ -define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { -"use strict"; +define("ace/ext/searchbox-css",["require","exports","module"], function(require, exports, module){module.exports = "\n\n/* ------------------------------------------------------------------------------------------\n * Editor Search Form\n * --------------------------------------------------------------------------------------- */\n.ace_search {\n background-color: #ddd;\n color: #666;\n border: 1px solid #cbcbcb;\n border-top: 0 none;\n overflow: hidden;\n margin: 0;\n padding: 4px 6px 0 4px;\n position: absolute;\n top: 0;\n z-index: 99;\n white-space: normal;\n}\n.ace_search.left {\n border-left: 0 none;\n border-radius: 0px 0px 5px 0px;\n left: 0;\n}\n.ace_search.right {\n border-radius: 0px 0px 0px 5px;\n border-right: 0 none;\n right: 0;\n}\n\n.ace_search_form, .ace_replace_form {\n margin: 0 20px 4px 0;\n overflow: hidden;\n line-height: 1.9;\n}\n.ace_replace_form {\n margin-right: 0;\n}\n.ace_search_form.ace_nomatch {\n outline: 1px solid red;\n}\n\n.ace_search_field {\n border-radius: 3px 0 0 3px;\n background-color: white;\n color: black;\n border: 1px solid #cbcbcb;\n border-right: 0 none;\n outline: 0;\n padding: 0;\n font-size: inherit;\n margin: 0;\n line-height: inherit;\n padding: 0 6px;\n min-width: 17em;\n vertical-align: top;\n min-height: 1.8em;\n box-sizing: content-box;\n}\n.ace_searchbtn {\n border: 1px solid #cbcbcb;\n line-height: inherit;\n display: inline-block;\n padding: 0 6px;\n background: #fff;\n border-right: 0 none;\n border-left: 1px solid #dcdcdc;\n cursor: pointer;\n margin: 0;\n position: relative;\n color: #666;\n}\n.ace_searchbtn:last-child {\n border-radius: 0 3px 3px 0;\n border-right: 1px solid #cbcbcb;\n}\n.ace_searchbtn:disabled {\n background: none;\n cursor: default;\n}\n.ace_searchbtn:hover {\n background-color: #eef1f6;\n}\n.ace_searchbtn.prev, .ace_searchbtn.next {\n padding: 0px 0.7em\n}\n.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\n content: \"\";\n border: solid 2px #888;\n width: 0.5em;\n height: 0.5em;\n border-width: 2px 0 0 2px;\n display:inline-block;\n transform: rotate(-45deg);\n}\n.ace_searchbtn.next:after {\n border-width: 0 2px 2px 0 ;\n}\n.ace_searchbtn_close {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\n border-radius: 50%;\n border: 0 none;\n color: #656565;\n cursor: pointer;\n font: 16px/16px Arial;\n padding: 0;\n height: 14px;\n width: 14px;\n top: 9px;\n right: 7px;\n position: absolute;\n}\n.ace_searchbtn_close:hover {\n background-color: #656565;\n background-position: 50% 100%;\n color: white;\n}\n\n.ace_button {\n margin-left: 2px;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n -ms-user-select: none;\n user-select: none;\n overflow: hidden;\n opacity: 0.7;\n border: 1px solid rgba(100,100,100,0.23);\n padding: 1px;\n box-sizing: border-box!important;\n color: black;\n}\n\n.ace_button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_button:active {\n background-color: #ddd;\n}\n\n.ace_button.checked {\n border-color: #3399ff;\n opacity:1;\n}\n\n.ace_search_options{\n margin-bottom: 3px;\n text-align: right;\n -webkit-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n -ms-user-select: none;\n user-select: none;\n clear: both;\n}\n\n.ace_search_counter {\n float: left;\n font-family: arial;\n padding: 0 8px;\n}"; + +}); +define("ace/ext/searchbox",["require","exports","module","ace/ext/searchbox","ace/ext/searchbox","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/ext/searchbox-css","ace/keyboard/hash_handler","ace/lib/keys","ace/config"], function(require, exports, module){/** + * ## Interactive search and replace UI extension for text editing + * + * Provides a floating search box interface with find/replace functionality including live search results, regex + * support, case sensitivity options, whole word matching, and scoped selection searching. Features keyboard shortcuts + * for quick access and navigation, with visual feedback for search matches and a counter showing current position + * in results. + * + * **Key Features:** + * - Real-time search with highlighted matches + * - Find and replace with individual or bulk operations + * - Advanced options: regex, case sensitivity, whole words, search in selection + * - Keyboard navigation and shortcuts + * - Visual match counter and no-match indicators + * + * **Usage:** + * ```javascript + * // Show search box + * require("ace/ext/searchbox").Search(editor); + * + * // Show with replace functionality + * require("ace/ext/searchbox").Search(editor, true); + * ``` + * + * @module + */ +"use strict"; var dom = require("../lib/dom"); var lang = require("../lib/lang"); var event = require("../lib/event"); -var searchboxCss = "\ -.ace_search {\ -background-color: #ddd;\ -color: #666;\ -border: 1px solid #cbcbcb;\ -border-top: 0 none;\ -overflow: hidden;\ -margin: 0;\ -padding: 4px 6px 0 4px;\ -position: absolute;\ -top: 0;\ -z-index: 99;\ -white-space: normal;\ -}\ -.ace_search.left {\ -border-left: 0 none;\ -border-radius: 0px 0px 5px 0px;\ -left: 0;\ -}\ -.ace_search.right {\ -border-radius: 0px 0px 0px 5px;\ -border-right: 0 none;\ -right: 0;\ -}\ -.ace_search_form, .ace_replace_form {\ -margin: 0 20px 4px 0;\ -overflow: hidden;\ -line-height: 1.9;\ -}\ -.ace_replace_form {\ -margin-right: 0;\ -}\ -.ace_search_form.ace_nomatch {\ -outline: 1px solid red;\ -}\ -.ace_search_field {\ -border-radius: 3px 0 0 3px;\ -background-color: white;\ -color: black;\ -border: 1px solid #cbcbcb;\ -border-right: 0 none;\ -outline: 0;\ -padding: 0;\ -font-size: inherit;\ -margin: 0;\ -line-height: inherit;\ -padding: 0 6px;\ -min-width: 17em;\ -vertical-align: top;\ -min-height: 1.8em;\ -box-sizing: content-box;\ -}\ -.ace_searchbtn {\ -border: 1px solid #cbcbcb;\ -line-height: inherit;\ -display: inline-block;\ -padding: 0 6px;\ -background: #fff;\ -border-right: 0 none;\ -border-left: 1px solid #dcdcdc;\ -cursor: pointer;\ -margin: 0;\ -position: relative;\ -color: #666;\ -}\ -.ace_searchbtn:last-child {\ -border-radius: 0 3px 3px 0;\ -border-right: 1px solid #cbcbcb;\ -}\ -.ace_searchbtn:disabled {\ -background: none;\ -cursor: default;\ -}\ -.ace_searchbtn:hover {\ -background-color: #eef1f6;\ -}\ -.ace_searchbtn.prev, .ace_searchbtn.next {\ -padding: 0px 0.7em\ -}\ -.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\ -content: \"\";\ -border: solid 2px #888;\ -width: 0.5em;\ -height: 0.5em;\ -border-width: 2px 0 0 2px;\ -display:inline-block;\ -transform: rotate(-45deg);\ -}\ -.ace_searchbtn.next:after {\ -border-width: 0 2px 2px 0 ;\ -}\ -.ace_searchbtn_close {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\ -border-radius: 50%;\ -border: 0 none;\ -color: #656565;\ -cursor: pointer;\ -font: 16px/16px Arial;\ -padding: 0;\ -height: 14px;\ -width: 14px;\ -top: 9px;\ -right: 7px;\ -position: absolute;\ -}\ -.ace_searchbtn_close:hover {\ -background-color: #656565;\ -background-position: 50% 100%;\ -color: white;\ -}\ -.ace_button {\ -margin-left: 2px;\ -cursor: pointer;\ --webkit-user-select: none;\ --moz-user-select: none;\ --o-user-select: none;\ --ms-user-select: none;\ -user-select: none;\ -overflow: hidden;\ -opacity: 0.7;\ -border: 1px solid rgba(100,100,100,0.23);\ -padding: 1px;\ -box-sizing: border-box!important;\ -color: black;\ -}\ -.ace_button:hover {\ -background-color: #eee;\ -opacity:1;\ -}\ -.ace_button:active {\ -background-color: #ddd;\ -}\ -.ace_button.checked {\ -border-color: #3399ff;\ -opacity:1;\ -}\ -.ace_search_options{\ -margin-bottom: 3px;\ -text-align: right;\ --webkit-user-select: none;\ --moz-user-select: none;\ --o-user-select: none;\ --ms-user-select: none;\ -user-select: none;\ -clear: both;\ -}\ -.ace_search_counter {\ -float: left;\ -font-family: arial;\ -padding: 0 8px;\ -}"; +var searchboxCss = require("./searchbox-css"); var HashHandler = require("../keyboard/hash_handler").HashHandler; var keyUtil = require("../lib/keys"); - +var nls = require("../config").nls; var MAX_COUNT = 999; - dom.importCssString(searchboxCss, "ace_searchbox", false); - -var SearchBox = function(editor, range, showReplaceForm) { - var div = dom.createElement("div"); - dom.buildDom(["div", {class:"ace_search right"}, - ["span", {action: "hide", class: "ace_searchbtn_close"}], - ["div", {class: "ace_search_form"}, - ["input", {class: "ace_search_field", placeholder: "Search for", spellcheck: "false"}], - ["span", {action: "findPrev", class: "ace_searchbtn prev"}, "\u200b"], - ["span", {action: "findNext", class: "ace_searchbtn next"}, "\u200b"], - ["span", {action: "findAll", class: "ace_searchbtn", title: "Alt-Enter"}, "All"] - ], - ["div", {class: "ace_replace_form"}, - ["input", {class: "ace_search_field", placeholder: "Replace with", spellcheck: "false"}], - ["span", {action: "replaceAndFindNext", class: "ace_searchbtn"}, "Replace"], - ["span", {action: "replaceAll", class: "ace_searchbtn"}, "All"] - ], - ["div", {class: "ace_search_options"}, - ["span", {action: "toggleReplace", class: "ace_button", title: "Toggle Replace mode", - style: "float:left;margin-top:-2px;padding:0 5px;"}, "+"], - ["span", {class: "ace_search_counter"}], - ["span", {action: "toggleRegexpMode", class: "ace_button", title: "RegExp Search"}, ".*"], - ["span", {action: "toggleCaseSensitive", class: "ace_button", title: "CaseSensitive Search"}, "Aa"], - ["span", {action: "toggleWholeWords", class: "ace_button", title: "Whole Word Search"}, "\\b"], - ["span", {action: "searchInSelection", class: "ace_button", title: "Search In Selection"}, "S"] - ] - ], div); - this.element = div.firstChild; - - this.setSession = this.setSession.bind(this); - - this.$init(); - this.setEditor(editor); - dom.importCssString(searchboxCss, "ace_searchbox", editor.container); -}; - -(function() { - this.setEditor = function(editor) { +var SearchBox = /** @class */ (function () { + function SearchBox(editor, range, showReplaceForm) { + this.activeInput; + this.element = dom.buildDom(["div", { class: "ace_search right" }, + ["span", { action: "hide", class: "ace_searchbtn_close" }], + ["div", { class: "ace_search_form" }, + ["input", { class: "ace_search_field", placeholder: nls("search-box.find.placeholder", "Search for"), spellcheck: "false" }], + ["span", { action: "findPrev", class: "ace_searchbtn prev" }, "\u200b"], + ["span", { action: "findNext", class: "ace_searchbtn next" }, "\u200b"], + ["span", { action: "findAll", class: "ace_searchbtn", title: "Alt-Enter" }, nls("search-box.find-all.text", "All")] + ], + ["div", { class: "ace_replace_form" }, + ["input", { class: "ace_search_field", placeholder: nls("search-box.replace.placeholder", "Replace with"), spellcheck: "false" }], + ["span", { action: "replaceAndFindNext", class: "ace_searchbtn" }, nls("search-box.replace-next.text", "Replace")], + ["span", { action: "replaceAll", class: "ace_searchbtn" }, nls("search-box.replace-all.text", "All")] + ], + ["div", { class: "ace_search_options" }, + ["span", { action: "toggleReplace", class: "ace_button", title: nls("search-box.toggle-replace.title", "Toggle Replace mode"), + style: "float:left;margin-top:-2px;padding:0 5px;" }, "+"], + ["span", { class: "ace_search_counter" }], + ["span", { action: "toggleRegexpMode", class: "ace_button", title: nls("search-box.toggle-regexp.title", "RegExp Search") }, ".*"], + ["span", { action: "toggleCaseSensitive", class: "ace_button", title: nls("search-box.toggle-case.title", "CaseSensitive Search") }, "Aa"], + ["span", { action: "toggleWholeWords", class: "ace_button", title: nls("search-box.toggle-whole-word.title", "Whole Word Search") }, "\\b"], + ["span", { action: "searchInSelection", class: "ace_button", title: nls("search-box.toggle-in-selection.title", "Search In Selection") }, "S"] + ] + ]); + this.setSession = this.setSession.bind(this); + this.$onEditorInput = this.onEditorInput.bind(this); + this.$init(); + this.setEditor(editor); + dom.importCssString(searchboxCss, "ace_searchbox", editor.container); + event.addListener(this.element, "touchstart", function (e) { e.stopPropagation(); }, editor); + } + SearchBox.prototype.setEditor = function (editor) { editor.searchBox = this; editor.renderer.scroller.appendChild(this.element); this.editor = editor; }; - - this.setSession = function(e) { + SearchBox.prototype.setSession = function (e) { this.searchRange = null; this.$syncOptions(true); }; - - this.$initElements = function(sb) { + SearchBox.prototype.onEditorInput = function () { + this.find(false, false, true); + }; + SearchBox.prototype.$initElements = function (sb) { this.searchBox = sb.querySelector(".ace_search_form"); this.replaceBox = sb.querySelector(".ace_replace_form"); this.searchOption = sb.querySelector("[action=searchInSelection]"); @@ -220,20 +95,17 @@ var SearchBox = function(editor, range, showReplaceForm) { this.replaceInput = this.replaceBox.querySelector(".ace_search_field"); this.searchCounter = sb.querySelector(".ace_search_counter"); }; - - this.$init = function() { + SearchBox.prototype.$init = function () { var sb = this.element; - this.$initElements(sb); - var _this = this; - event.addListener(sb, "mousedown", function(e) { - setTimeout(function(){ + event.addListener(sb, "mousedown", function (e) { + setTimeout(function () { _this.activeInput.focus(); }, 0); event.stopPropagation(e); }); - event.addListener(sb, "click", function(e) { + event.addListener(sb, "click", function (e) { var t = e.target || e.srcElement; var action = t.getAttribute("action"); if (action && _this[action]) @@ -242,8 +114,7 @@ var SearchBox = function(editor, range, showReplaceForm) { _this.$searchBarKb.commands[action].exec(_this); event.stopPropagation(e); }); - - event.addCommandKeyListener(sb, function(e, hashId, keyCode) { + event.addCommandKeyListener(sb, function (e, hashId, keyCode) { var keyString = keyUtil.keyCodeToString(keyCode); var command = _this.$searchBarKb.findKeyCommand(hashId, keyString); if (command && command.exec) { @@ -251,122 +122,32 @@ var SearchBox = function(editor, range, showReplaceForm) { event.stopEvent(e); } }); - - this.$onChange = lang.delayedCall(function() { + this.$onChange = lang.delayedCall(function () { _this.find(false, false); }); - - event.addListener(this.searchInput, "input", function() { + event.addListener(this.searchInput, "input", function () { _this.$onChange.schedule(20); }); - event.addListener(this.searchInput, "focus", function() { + event.addListener(this.searchInput, "focus", function () { _this.activeInput = _this.searchInput; _this.searchInput.value && _this.highlight(); }); - event.addListener(this.replaceInput, "focus", function() { + event.addListener(this.replaceInput, "focus", function () { _this.activeInput = _this.replaceInput; _this.searchInput.value && _this.highlight(); }); }; - this.$closeSearchBarKb = new HashHandler([{ - bindKey: "Esc", - name: "closeSearchBar", - exec: function(editor) { - editor.searchBox.hide(); - } - }]); - this.$searchBarKb = new HashHandler(); - this.$searchBarKb.bindKeys({ - "Ctrl-f|Command-f": function(sb) { - var isReplace = sb.isReplace = !sb.isReplace; - sb.replaceBox.style.display = isReplace ? "" : "none"; - sb.replaceOption.checked = false; - sb.$syncOptions(); - sb.searchInput.focus(); - }, - "Ctrl-H|Command-Option-F": function(sb) { - if (sb.editor.getReadOnly()) - return; - sb.replaceOption.checked = true; - sb.$syncOptions(); - sb.replaceInput.focus(); - }, - "Ctrl-G|Command-G": function(sb) { - sb.findNext(); - }, - "Ctrl-Shift-G|Command-Shift-G": function(sb) { - sb.findPrev(); - }, - "esc": function(sb) { - setTimeout(function() { sb.hide();}); - }, - "Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replace(); - sb.findNext(); - }, - "Shift-Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replace(); - sb.findPrev(); - }, - "Alt-Return": function(sb) { - if (sb.activeInput == sb.replaceInput) - sb.replaceAll(); - sb.findAll(); - }, - "Tab": function(sb) { - (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); - } - }); - - this.$searchBarKb.addCommands([{ - name: "toggleRegexpMode", - bindKey: {win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/"}, - exec: function(sb) { - sb.regExpOption.checked = !sb.regExpOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleCaseSensitive", - bindKey: {win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I"}, - exec: function(sb) { - sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleWholeWords", - bindKey: {win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W"}, - exec: function(sb) { - sb.wholeWordOption.checked = !sb.wholeWordOption.checked; - sb.$syncOptions(); - } - }, { - name: "toggleReplace", - exec: function(sb) { - sb.replaceOption.checked = !sb.replaceOption.checked; - sb.$syncOptions(); - } - }, { - name: "searchInSelection", - exec: function(sb) { - sb.searchOption.checked = !sb.searchRange; - sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); - sb.$syncOptions(); - } - }]); - - this.setSearchRange = function(range) { + SearchBox.prototype.setSearchRange = function (range) { this.searchRange = range; if (range) { this.searchRangeMarker = this.editor.session.addMarker(range, "ace_active-line"); - } else if (this.searchRangeMarker) { + } + else if (this.searchRangeMarker) { this.editor.session.removeMarker(this.searchRangeMarker); this.searchRangeMarker = null; } }; - - this.$syncOptions = function(preventScroll) { + SearchBox.prototype.$syncOptions = function (preventScroll) { dom.setCssClass(this.replaceOption, "checked", this.searchRange); dom.setCssClass(this.searchOption, "checked", this.searchOption.checked); this.replaceOption.textContent = this.replaceOption.checked ? "-" : "+"; @@ -378,12 +159,13 @@ var SearchBox = function(editor, range, showReplaceForm) { this.replaceBox.style.display = this.replaceOption.checked && !readOnly ? "" : "none"; this.find(false, false, preventScroll); }; - - this.highlight = function(re) { + SearchBox.prototype.highlight = function (re) { this.editor.session.highlight(re || this.editor.$search.$options.re); this.editor.renderer.updateBackMarkers(); }; - this.find = function(skipCurrent, backwards, preventScroll) { + SearchBox.prototype.find = function (skipCurrent, backwards, preventScroll) { + if (!this.editor.session) + return; var range = this.editor.find(this.searchInput.value, { skipCurrent: skipCurrent, backwards: backwards, @@ -400,20 +182,23 @@ var SearchBox = function(editor, range, showReplaceForm) { this.highlight(); this.updateCounter(); }; - this.updateCounter = function() { + SearchBox.prototype.updateCounter = function () { var editor = this.editor; var regex = editor.$search.$options.re; + var supportsUnicodeFlag = regex.unicode; var all = 0; var before = 0; if (regex) { var value = this.searchRange ? editor.session.getTextRange(this.searchRange) : editor.getValue(); - + if (editor.$search.$isMultilineSearch(editor.getLastSearchOptions())) { + value = value.replace(/\r\n|\r|\n/g, "\n"); + editor.session.doc.$autoNewLine = "\n"; + } var offset = editor.session.doc.positionToIndex(editor.selection.anchor); if (this.searchRange) offset -= editor.session.doc.positionToIndex(this.searchRange.start); - var last = regex.lastIndex = 0; var m; while ((m = regex.exec(value))) { @@ -424,22 +209,22 @@ var SearchBox = function(editor, range, showReplaceForm) { if (all > MAX_COUNT) break; if (!m[0]) { - regex.lastIndex = last += 1; + regex.lastIndex = last += lang.skipEmptyMatch(value, last, supportsUnicodeFlag); if (last >= value.length) break; } } } - this.searchCounter.textContent = before + " of " + (all > MAX_COUNT ? MAX_COUNT + "+" : all); + this.searchCounter.textContent = nls("search-box.search-counter", "$0 of $1", [before, (all > MAX_COUNT ? MAX_COUNT + "+" : all)]); }; - this.findNext = function() { + SearchBox.prototype.findNext = function () { this.find(true, false); }; - this.findPrev = function() { + SearchBox.prototype.findPrev = function () { this.find(true, true); }; - this.findAll = function(){ - var range = this.editor.findAll(this.searchInput.value, { + SearchBox.prototype.findAll = function () { + var range = this.editor.findAll(this.searchInput.value, { regExp: this.regExpOption.checked, caseSensitive: this.caseSensitiveOption.checked, wholeWord: this.wholeWordOption.checked @@ -450,58 +235,144 @@ var SearchBox = function(editor, range, showReplaceForm) { this.highlight(); this.hide(); }; - this.replace = function() { + SearchBox.prototype.replace = function () { if (!this.editor.getReadOnly()) this.editor.replace(this.replaceInput.value); - }; - this.replaceAndFindNext = function() { + }; + SearchBox.prototype.replaceAndFindNext = function () { if (!this.editor.getReadOnly()) { this.editor.replace(this.replaceInput.value); this.findNext(); } }; - this.replaceAll = function() { + SearchBox.prototype.replaceAll = function () { if (!this.editor.getReadOnly()) this.editor.replaceAll(this.replaceInput.value); }; - - this.hide = function() { + SearchBox.prototype.hide = function () { this.active = false; this.setSearchRange(null); this.editor.off("changeSession", this.setSession); - + this.editor.off("input", this.$onEditorInput); this.element.style.display = "none"; this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb); this.editor.focus(); }; - this.show = function(value, isReplace) { + SearchBox.prototype.show = function (value, isReplace) { this.active = true; this.editor.on("changeSession", this.setSession); + this.editor.on("input", this.$onEditorInput); this.element.style.display = ""; this.replaceOption.checked = isReplace; - - if (value) + if (this.editor.$search.$options.regExp) + value = lang.escapeRegExp(value); + if (value != undefined) this.searchInput.value = value; - this.searchInput.focus(); this.searchInput.select(); - this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb); - this.$syncOptions(true); }; - - this.isFocused = function() { + SearchBox.prototype.isFocused = function () { var el = document.activeElement; return el == this.searchInput || el == this.replaceInput; }; -}).call(SearchBox.prototype); - + return SearchBox; +}()); +var $searchBarKb = new HashHandler(); +$searchBarKb.bindKeys({ + "Ctrl-f|Command-f": function (sb) { + var isReplace = sb.isReplace = !sb.isReplace; + sb.replaceBox.style.display = isReplace ? "" : "none"; + sb.replaceOption.checked = false; + sb.$syncOptions(); + sb.searchInput.focus(); + }, + "Ctrl-H|Command-Option-F": function (sb) { + if (sb.editor.getReadOnly()) + return; + sb.replaceOption.checked = true; + sb.$syncOptions(); + sb.replaceInput.focus(); + }, + "Ctrl-G|Command-G": function (sb) { + sb.findNext(); + }, + "Ctrl-Shift-G|Command-Shift-G": function (sb) { + sb.findPrev(); + }, + "esc": function (sb) { + setTimeout(function () { sb.hide(); }); + }, + "Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findNext(); + }, + "Shift-Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replace(); + sb.findPrev(); + }, + "Alt-Return": function (sb) { + if (sb.activeInput == sb.replaceInput) + sb.replaceAll(); + sb.findAll(); + }, + "Tab|Shift-Tab": function (sb) { + (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus(); + } +}); +$searchBarKb.addCommands([{ + name: "toggleRegexpMode", + bindKey: { win: "Alt-R|Alt-/", mac: "Ctrl-Alt-R|Ctrl-Alt-/" }, + exec: function (sb) { + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleCaseSensitive", + bindKey: { win: "Alt-C|Alt-I", mac: "Ctrl-Alt-R|Ctrl-Alt-I" }, + exec: function (sb) { + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleWholeWords", + bindKey: { win: "Alt-B|Alt-W", mac: "Ctrl-Alt-B|Ctrl-Alt-W" }, + exec: function (sb) { + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + } + }, { + name: "toggleReplace", + exec: function (sb) { + sb.replaceOption.checked = !sb.replaceOption.checked; + sb.$syncOptions(); + } + }, { + name: "searchInSelection", + exec: function (sb) { + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + } + }]); +var $closeSearchBarKb = new HashHandler([{ + bindKey: "Esc", + name: "closeSearchBar", + exec: function (editor) { + editor.searchBox.hide(); + } + }]); +SearchBox.prototype.$searchBarKb = $searchBarKb; +SearchBox.prototype.$closeSearchBarKb = $closeSearchBarKb; exports.SearchBox = SearchBox; - -exports.Search = function(editor, isReplace) { +exports.Search = function (editor, isReplace) { var sb = editor.searchBox || new SearchBox(editor); - sb.show(editor.session.getTextRange(), isReplace); + var range = editor.session.selection.getRange(); + var value = range.isMultiLine() ? "" : editor.session.getTextRange(range); + sb.show(value, isReplace); }; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-settings_menu.js b/app/Resources/ui/js/ace/ext-settings_menu.js index e31c886..c447919 100644 --- a/app/Resources/ui/js/ace/ext-settings_menu.js +++ b/app/Resources/ui/js/ace/ext-settings_menu.js @@ -1,80 +1,42 @@ -define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/ext/menu_tools/settings_menu.css",["require","exports","module"], function(require, exports, module){module.exports = "#ace_settingsmenu, #kbshortcutmenu {\n background-color: #F7F7F7;\n color: black;\n box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\n padding: 1em 0.5em 2em 1em;\n overflow: auto;\n position: absolute;\n margin: 0;\n bottom: 0;\n right: 0;\n top: 0;\n z-index: 9991;\n cursor: default;\n}\n\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\n box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\n background-color: rgba(255, 255, 255, 0.6);\n color: black;\n}\n\n.ace_optionsMenuEntry:hover {\n background-color: rgba(100, 100, 100, 0.1);\n transition: all 0.3s\n}\n\n.ace_closeButton {\n background: rgba(245, 146, 146, 0.5);\n border: 1px solid #F48A8A;\n border-radius: 50%;\n padding: 7px;\n position: absolute;\n right: -8px;\n top: -8px;\n z-index: 100000;\n}\n.ace_closeButton{\n background: rgba(245, 146, 146, 0.9);\n}\n.ace_optionsMenuKey {\n color: darkslateblue;\n font-weight: bold;\n}\n.ace_optionsMenuCommand {\n color: darkcyan;\n font-weight: normal;\n}\n.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\n vertical-align: middle;\n}\n\n.ace_optionsMenuEntry button[ace_selected_button=true] {\n background: #e7e7e7;\n box-shadow: 1px 0px 2px 0px #adadad inset;\n border-color: #adadad;\n}\n.ace_optionsMenuEntry button {\n background: white;\n border: 1px solid lightgray;\n margin: 0px;\n}\n.ace_optionsMenuEntry button:hover{\n background: #f0f0f0;\n}"; + +}); + +define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/ext/menu_tools/settings_menu.css"], function(require, exports, module){/** + * ## Overlay Page utility + * + * Provides modal overlay functionality for displaying editor extension interfaces. Creates a full-screen overlay with + * configurable backdrop behavior, keyboard navigation (ESC to close), and focus management. Used by various extensions + * to display menus, settings panels, and other interactive content over the editor interface. + * + * **Usage:** + * ```javascript + * var overlayPage = require('./overlay_page').overlayPage; + * var contentElement = document.createElement('div'); + * contentElement.innerHTML = '

Settings

'; + * + * var overlay = overlayPage(editor, contentElement, function() { + * console.log('Overlay closed'); + * }); + * ``` + * + * @module + */ 'use strict'; var dom = require("../../lib/dom"); -var cssText = "#ace_settingsmenu, #kbshortcutmenu {\ -background-color: #F7F7F7;\ -color: black;\ -box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\ -padding: 1em 0.5em 2em 1em;\ -overflow: auto;\ -position: absolute;\ -margin: 0;\ -bottom: 0;\ -right: 0;\ -top: 0;\ -z-index: 9991;\ -cursor: default;\ -}\ -.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\ -box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\ -background-color: rgba(255, 255, 255, 0.6);\ -color: black;\ -}\ -.ace_optionsMenuEntry:hover {\ -background-color: rgba(100, 100, 100, 0.1);\ -transition: all 0.3s\ -}\ -.ace_closeButton {\ -background: rgba(245, 146, 146, 0.5);\ -border: 1px solid #F48A8A;\ -border-radius: 50%;\ -padding: 7px;\ -position: absolute;\ -right: -8px;\ -top: -8px;\ -z-index: 100000;\ -}\ -.ace_closeButton{\ -background: rgba(245, 146, 146, 0.9);\ -}\ -.ace_optionsMenuKey {\ -color: darkslateblue;\ -font-weight: bold;\ -}\ -.ace_optionsMenuCommand {\ -color: darkcyan;\ -font-weight: normal;\ -}\ -.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\ -vertical-align: middle;\ -}\ -.ace_optionsMenuEntry button[ace_selected_button=true] {\ -background: #e7e7e7;\ -box-shadow: 1px 0px 2px 0px #adadad inset;\ -border-color: #adadad;\ -}\ -.ace_optionsMenuEntry button {\ -background: white;\ -border: 1px solid lightgray;\ -margin: 0px;\ -}\ -.ace_optionsMenuEntry button:hover{\ -background: #f0f0f0;\ -}"; +var cssText = require("./settings_menu.css"); dom.importCssString(cssText, "settings_menu.css", false); - module.exports.overlayPage = function overlayPage(editor, contentElement, callback) { var closer = document.createElement('div'); var ignoreFocusOut = false; - function documentEscListener(e) { if (e.keyCode === 27) { close(); } } - function close() { - if (!closer) return; + if (!closer) + return; document.removeEventListener('keydown', documentEscListener); closer.parentNode.removeChild(closer); if (editor) { @@ -90,22 +52,19 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba contentElement.style.pointerEvents = "auto"; } } - closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : ''); - closer.addEventListener('click', function(e) { + closer.addEventListener('click', function (e) { if (!ignoreFocusOut) { close(); } }); document.addEventListener('keydown', documentEscListener); - contentElement.addEventListener('click', function (e) { e.stopPropagation(); }); - closer.appendChild(contentElement); document.body.appendChild(closer); if (editor) { @@ -119,9 +78,17 @@ module.exports.overlayPage = function overlayPage(editor, contentElement, callba }); -define("ace/ext/modelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/modelist",["require","exports","module"], function(require, exports, module){/** + * ## File mode detection utility + * + * Provides automatic detection of editor syntax modes based on file paths and extensions. Maps file extensions to + * appropriate Ace Editor syntax highlighting modes for over 100 programming languages and file formats including + * JavaScript, TypeScript, HTML, CSS, Python, Java, C++, and many others. Supports complex extension patterns and + * provides fallback mechanisms for unknown file types. + * + * @module + */ "use strict"; - var modes = []; function getModeForPath(path) { var mode = modesByName.text; @@ -134,203 +101,225 @@ function getModeForPath(path) { } return mode; } - -var Mode = function(name, caption, extensions) { - this.name = name; - this.caption = caption; - this.mode = "ace/mode/" + name; - this.extensions = extensions; - var re; - if (/\^/.test(extensions)) { - re = extensions.replace(/\|(\^)?/g, function(a, b){ - return "$|" + (b ? "^" : "^.*\\."); - }) + "$"; - } else { - re = "^.*\\.(" + extensions + ")$"; +var Mode = /** @class */ (function () { + function Mode(name, caption, extensions) { + this.name = name; + this.caption = caption; + this.mode = "ace/mode/" + name; + this.extensions = extensions; + var re; + if (/\^/.test(extensions)) { + re = extensions.replace(/\|(\^)?/g, function (a, b) { + return "$|" + (b ? "^" : "^.*\\."); + }) + "$"; + } + else { + re = "\\.(" + extensions + ")$"; + } + this.extRe = new RegExp(re, "gi"); } - - this.extRe = new RegExp(re, "gi"); -}; - -Mode.prototype.supportsFile = function(filename) { - return filename.match(this.extRe); -}; + Mode.prototype.supportsFile = function (filename) { + return filename.match(this.extRe); + }; + return Mode; +}()); var supportedModes = { - ABAP: ["abap"], - ABC: ["abc"], - ActionScript:["as"], - ADA: ["ada|adb"], - Alda: ["alda"], + ABAP: ["abap"], + ABC: ["abc"], + ActionScript: ["as"], + ADA: ["ada|adb"], + Alda: ["alda"], Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], - Apex: ["apex|cls|trigger|tgr"], - AQL: ["aql"], - AsciiDoc: ["asciidoc|adoc"], - ASL: ["dsl|asl|asl.json"], - Assembly_x86:["asm|a"], - AutoHotKey: ["ahk"], - BatchFile: ["bat|cmd"], - C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], - C9Search: ["c9search_results"], - Cirru: ["cirru|cr"], - Clojure: ["clj|cljs"], - Cobol: ["CBL|COB"], - coffee: ["coffee|cf|cson|^Cakefile"], - ColdFusion: ["cfm"], - Crystal: ["cr"], - CSharp: ["cs"], + Apex: ["apex|cls|trigger|tgr"], + AQL: ["aql"], + AsciiDoc: ["asciidoc|adoc"], + ASL: ["dsl|asl|asl.json"], + Assembly_ARM32: ["s"], + Assembly_x86: ["asm|a"], + Astro: ["astro"], + AutoHotKey: ["ahk"], + Basic: ["bas|bak"], + BatchFile: ["bat|cmd"], + BibTeX: ["bib"], + C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], + C9Search: ["c9search_results"], + Cedar: ["cedar"], + CedarSchema: ["cedarschema"], + Cirru: ["cirru|cr"], + Clojure: ["clj|cljs"], + Clue: ["clue"], + Cobol: ["CBL|COB"], + coffee: ["coffee|cf|cson|^Cakefile"], + ColdFusion: ["cfm|cfc"], + Crystal: ["cr"], + CSharp: ["cs"], Csound_Document: ["csd"], Csound_Orchestra: ["orc"], Csound_Score: ["sco"], - CSS: ["css"], - Curly: ["curly"], - D: ["d|di"], - Dart: ["dart"], - Diff: ["diff|patch"], - Dockerfile: ["^Dockerfile"], - Dot: ["dot"], - Drools: ["drl"], - Edifact: ["edi"], - Eiffel: ["e|ge"], - EJS: ["ejs"], - Elixir: ["ex|exs"], - Elm: ["elm"], - Erlang: ["erl|hrl"], - Forth: ["frt|fs|ldr|fth|4th"], - Fortran: ["f|f90"], - FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], - FSL: ["fsl"], - FTL: ["ftl"], - Gcode: ["gcode"], - Gherkin: ["feature"], - Gitignore: ["^.gitignore"], - Glsl: ["glsl|frag|vert"], - Gobstones: ["gbs"], - golang: ["go"], + CSS: ["css"], + CSV: ["csv"], + Curly: ["curly"], + Cuttlefish: ["conf"], + D: ["d|di"], + Dart: ["dart"], + Diff: ["diff|patch"], + Django: ["djt|html.djt|dj.html|djhtml"], + Dockerfile: ["^Dockerfile"], + Dot: ["dot"], + Drools: ["drl"], + Edifact: ["edi"], + Eiffel: ["e|ge"], + EJS: ["ejs"], + Elixir: ["ex|exs"], + Elm: ["elm"], + Erlang: ["erl|hrl"], + Flix: ["flix"], + Forth: ["frt|fs|ldr|fth|4th"], + Fortran: ["f|f90"], + FSharp: ["fsi|fs|ml|mli|fsx|fsscript"], + FSL: ["fsl"], + FTL: ["ftl"], + Gcode: ["gcode"], + Gherkin: ["feature"], + Gitignore: ["^.gitignore"], + Glsl: ["glsl|frag|vert"], + Gobstones: ["gbs"], + golang: ["go"], GraphQLSchema: ["gql"], - Groovy: ["groovy"], - HAML: ["haml"], - Handlebars: ["hbs|handlebars|tpl|mustache"], - Haskell: ["hs"], + GROQ: ["groq"], + Groovy: ["groovy"], + HAML: ["haml"], + Handlebars: ["hbs|handlebars|tpl|mustache"], + Haskell: ["hs"], Haskell_Cabal: ["cabal"], - haXe: ["hx"], - Hjson: ["hjson"], - HTML: ["html|htm|xhtml|vue|we|wpy"], + haXe: ["hx"], + Hjson: ["hjson"], + HTML: ["html|htm|xhtml|we|wpy"], HTML_Elixir: ["eex|html.eex"], - HTML_Ruby: ["erb|rhtml|html.erb"], - INI: ["ini|conf|cfg|prefs"], - Io: ["io"], - Ion: ["ion"], - Jack: ["jack"], - Jade: ["jade|pug"], - Java: ["java"], - JavaScript: ["js|jsm|jsx|cjs|mjs"], - JSON: ["json"], - JSON5: ["json5"], - JSONiq: ["jq"], - JSP: ["jsp"], - JSSM: ["jssm|jssm_state"], - JSX: ["jsx"], - Julia: ["jl"], - Kotlin: ["kt|kts"], - LaTeX: ["tex|latex|ltx|bib"], - Latte: ["latte"], - LESS: ["less"], - Liquid: ["liquid"], - Lisp: ["lisp"], - LiveScript: ["ls"], - Log: ["log"], - LogiQL: ["logic|lql"], - LSL: ["lsl"], - Lua: ["lua"], - LuaPage: ["lp"], - Lucene: ["lucene"], - Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], - Markdown: ["md|markdown"], - Mask: ["mask"], - MATLAB: ["matlab"], - Maze: ["mz"], - MediaWiki: ["wiki|mediawiki"], - MEL: ["mel"], - MIPS: ["s|asm"], - MIXAL: ["mixal"], - MUSHCode: ["mc|mush"], - MySQL: ["mysql"], - Nginx: ["nginx|conf"], - Nim: ["nim"], - Nix: ["nix"], - NSIS: ["nsi|nsh"], - Nunjucks: ["nunjucks|nunjs|nj|njk"], - ObjectiveC: ["m|mm"], - OCaml: ["ml|mli"], - PartiQL: ["partiql|pql"], - Pascal: ["pas|p"], - Perl: ["pl|pm"], - pgSQL: ["pgsql"], + HTML_Ruby: ["erb|rhtml|html.erb"], + INI: ["ini|conf|cfg|prefs"], + Io: ["io"], + Ion: ["ion"], + Jack: ["jack"], + Jade: ["jade|pug"], + Java: ["java"], + JavaScript: ["js|jsm|cjs|mjs"], + JEXL: ["jexl"], + JSON: ["json"], + JSON5: ["json5"], + JSONiq: ["jq"], + JSP: ["jsp"], + JSSM: ["jssm|jssm_state"], + JSX: ["jsx"], + Julia: ["jl"], + Kotlin: ["kt|kts"], + LaTeX: ["tex|latex|ltx|bib"], + Latte: ["latte"], + LESS: ["less"], + Liquid: ["liquid"], + Lisp: ["lisp"], + LiveScript: ["ls"], + LogiQL: ["logic|lql"], + Logtalk: ["lgt"], + LSL: ["lsl"], + Lua: ["lua"], + LuaPage: ["lp"], + Lucene: ["lucene"], + Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], + Markdown: ["md|markdown"], + Mask: ["mask"], + MATLAB: ["matlab"], + Maze: ["mz"], + MediaWiki: ["wiki|mediawiki"], + MEL: ["mel"], + MIPS: ["s|asm"], + MIXAL: ["mixal"], + MUSHCode: ["mc|mush"], + MySQL: ["mysql"], + Mariadb: ["mariadb"], + Nasal: ["nas"], + Nginx: ["nginx|conf"], + Nim: ["nim"], + Nix: ["nix"], + NSIS: ["nsi|nsh"], + Nunjucks: ["nunjucks|nunjs|nj|njk"], + ObjectiveC: ["m|mm"], + OCaml: ["ml|mli"], + Odin: ["odin"], + PartiQL: ["partiql|pql"], + Pascal: ["pas|p"], + Perl: ["pl|pm"], + pgSQL: ["pgsql"], + PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], PHP_Laravel_blade: ["blade.php"], - PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], - Pig: ["pig"], - Powershell: ["ps1"], - Praat: ["praat|praatscript|psc|proc"], - Prisma: ["prisma"], - Prolog: ["plg|prolog"], - Properties: ["properties"], - Protobuf: ["proto"], - Puppet: ["epp|pp"], - Python: ["py"], - QML: ["qml"], - R: ["r"], - Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], - Razor: ["cshtml|asp"], - RDoc: ["Rd"], - Red: ["red|reds"], - RHTML: ["Rhtml"], - Robot: ["robot|resource"], - RST: ["rst"], - Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], - Rust: ["rs"], - SaC: ["sac"], - SASS: ["sass"], - SCAD: ["scad"], - Scala: ["scala|sbt"], - Scheme: ["scm|sm|rkt|oak|scheme"], - Scrypt: ["scrypt"], - SCSS: ["scss"], - SH: ["sh|bash|^.bashrc"], - SJS: ["sjs"], - Slim: ["slim|skim"], - Smarty: ["smarty|tpl"], - Smithy: ["smithy"], - snippets: ["snippets"], - Soy_Template:["soy"], - Space: ["space"], - SQL: ["sql"], - SQLServer: ["sqlserver"], - Stylus: ["styl|stylus"], - SVG: ["svg"], - Swift: ["swift"], - Tcl: ["tcl"], - Terraform: ["tf", "tfvars", "terragrunt"], - Tex: ["tex"], - Text: ["txt"], - Textile: ["textile"], - Toml: ["toml"], - TSX: ["tsx"], - Twig: ["twig|swig"], - Typescript: ["ts|typescript|str"], - Vala: ["vala"], - VBScript: ["vbs|vb"], - Velocity: ["vm"], - Verilog: ["v|vh|sv|svh"], - VHDL: ["vhd|vhdl"], + Pig: ["pig"], + PLSQL: ["plsql"], + Powershell: ["ps1"], + Praat: ["praat|praatscript|psc|proc"], + Prisma: ["prisma"], + Prolog: ["plg|prolog"], + Properties: ["properties"], + Protobuf: ["proto"], + PRQL: ["prql"], + Puppet: ["epp|pp"], + Python: ["py"], + QML: ["qml"], + R: ["r"], + Raku: ["raku|rakumod|rakutest|p6|pl6|pm6"], + Razor: ["cshtml|asp"], + RDoc: ["Rd"], + Red: ["red|reds"], + RHTML: ["Rhtml"], + Robot: ["robot|resource"], + RST: ["rst"], + Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], + Rust: ["rs"], + SaC: ["sac"], + SASS: ["sass"], + SCAD: ["scad"], + Scala: ["scala|sbt"], + Scheme: ["scm|sm|rkt|oak|scheme"], + Scrypt: ["scrypt"], + SCSS: ["scss"], + SH: ["sh|bash|^.bashrc"], + SJS: ["sjs"], + Slim: ["slim|skim"], + Smarty: ["smarty|tpl"], + Smithy: ["smithy"], + snippets: ["snippets"], + Soy_Template: ["soy"], + Space: ["space"], + SPARQL: ["rq"], + SQL: ["sql"], + SQLServer: ["sqlserver"], + Stylus: ["styl|stylus"], + SVG: ["svg"], + Swift: ["swift"], + Tcl: ["tcl"], + Terraform: ["tf", "tfvars", "terragrunt"], + Tex: ["tex"], + Text: ["txt"], + Textile: ["textile"], + Toml: ["toml"], + TSV: ["tsv"], + TSX: ["tsx"], + Turtle: ["ttl"], + Twig: ["twig|swig"], + Typescript: ["ts|mts|cts|typescript|str"], + Vala: ["vala"], + VBScript: ["vbs|vb"], + Velocity: ["vm"], + Verilog: ["v|vh|sv|svh"], + VHDL: ["vhd|vhdl"], Visualforce: ["vfp|component|page"], - Wollok: ["wlk|wpgm|wtest"], - XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], - XQuery: ["xq"], - YAML: ["yaml|yml"], - Zeek: ["zeek|bro"], - Django: ["html"] + Vue: ["vue"], + Wollok: ["wlk|wpgm|wtest"], + XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], + XQuery: ["xq"], + YAML: ["yaml|yml"], + Zeek: ["zeek|bro"], + Zig: ["zig"] }; - var nameOverrides = { ObjectiveC: "Objective-C", CSharp: "C#", @@ -347,7 +336,6 @@ var nameOverrides = { Perl6: "Perl 6", AutoHotKey: "AutoHotkey / AutoIt" }; - var modesByName = {}; for (var name in supportedModes) { var data = supportedModes[name]; @@ -357,63 +345,73 @@ for (var name in supportedModes) { modesByName[filename] = mode; modes.push(mode); } - -module.exports = { - getModeForPath: getModeForPath, - modes: modes, - modesByName: modesByName -}; +exports.getModeForPath = getModeForPath; +exports.modes = modes; +exports.modesByName = modesByName; }); -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], @@ -427,30 +425,39 @@ exports.themes = themeData.map(function(data) { }); -define("ace/ext/options",["require","exports","module","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module) { +define("ace/ext/options",["require","exports","module","ace/ext/settings_menu","ace/ext/menu_tools/overlay_page","ace/lib/dom","ace/lib/oop","ace/config","ace/lib/event_emitter","ace/ext/modelist","ace/ext/themelist"], function(require, exports, module){/** + * ## Settings Menu extension + * + * Provides a settings panel for configuring editor options through an interactive UI. + * Creates a tabular interface with grouped configuration options including themes, modes, keybindings, + * font settings, display preferences, and advanced editor behaviors. Supports dynamic option rendering + * with various input types (dropdowns, checkboxes, number inputs, button bars) and real-time updates. + * + * **Usage:** + * ```javascript + * var OptionPanel = require("ace/ext/settings_menu").OptionPanel; + * var panel = new OptionPanel(editor); + * panel.render(); + * ``` + * + * @module + */ "use strict"; - require("./menu_tools/overlay_page"); - var dom = require("../lib/dom"); var oop = require("../lib/oop"); var config = require("../config"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var buildDom = dom.buildDom; - var modelist = require("./modelist"); var themelist = require("./themelist"); - var themes = { Bright: [], Dark: [] }; -themelist.themes.forEach(function(x) { +themelist.themes.forEach(function (x) { themes[x.isDark ? "Dark" : "Bright"].push({ caption: x.caption, value: x.theme }); }); - -var modes = modelist.modes.map(function(x){ - return { caption: x.caption, value: x.mode }; +var modes = modelist.modes.map(function (x) { + return { caption: x.caption, value: x.mode }; }); - - var optionGroups = { Main: { Mode: { @@ -467,11 +474,11 @@ var optionGroups = { type: "buttonBar", path: "keyboardHandler", items: [ - { caption : "Ace", value : null }, - { caption : "Vim", value : "ace/keyboard/vim" }, - { caption : "Emacs", value : "ace/keyboard/emacs" }, - { caption : "Sublime", value : "ace/keyboard/sublime" }, - { caption : "VSCode", value : "ace/keyboard/vscode" } + { caption: "Ace", value: null }, + { caption: "Vim", value: "ace/keyboard/vim" }, + { caption: "Emacs", value: "ace/keyboard/emacs" }, + { caption: "Sublime", value: "ace/keyboard/sublime" }, + { caption: "VSCode", value: "ace/keyboard/vscode" } ] }, "Font Size": { @@ -479,53 +486,53 @@ var optionGroups = { type: "number", defaultValue: 12, defaults: [ - {caption: "12px", value: 12}, - {caption: "24px", value: 24} + { caption: "12px", value: 12 }, + { caption: "24px", value: 24 } ] }, "Soft Wrap": { type: "buttonBar", path: "wrap", items: [ - { caption : "Off", value : "off" }, - { caption : "View", value : "free" }, - { caption : "margin", value : "printMargin" }, - { caption : "40", value : "40" } + { caption: "Off", value: "off" }, + { caption: "View", value: "free" }, + { caption: "margin", value: "printMargin" }, + { caption: "40", value: "40" } ] }, "Cursor Style": { path: "cursorStyle", items: [ - { caption : "Ace", value : "ace" }, - { caption : "Slim", value : "slim" }, - { caption : "Smooth", value : "smooth" }, - { caption : "Smooth And Slim", value : "smooth slim" }, - { caption : "Wide", value : "wide" } + { caption: "Ace", value: "ace" }, + { caption: "Slim", value: "slim" }, + { caption: "Smooth", value: "smooth" }, + { caption: "Smooth And Slim", value: "smooth slim" }, + { caption: "Wide", value: "wide" } ] }, "Folding": { path: "foldStyle", items: [ - { caption : "Manual", value : "manual" }, - { caption : "Mark begin", value : "markbegin" }, - { caption : "Mark begin and end", value : "markbeginend" } + { caption: "Manual", value: "manual" }, + { caption: "Mark begin", value: "markbegin" }, + { caption: "Mark begin and end", value: "markbeginend" } ] }, "Soft Tabs": [{ - path: "useSoftTabs" - }, { - ariaLabel: "Tab Size", - path: "tabSize", - type: "number", - values: [2, 3, 4, 8, 16] - }], + path: "useSoftTabs" + }, { + ariaLabel: "Tab Size", + path: "tabSize", + type: "number", + values: [2, 3, 4, 8, 16] + }], "Overscroll": { type: "buttonBar", path: "scrollPastEnd", items: [ - { caption : "None", value : 0 }, - { caption : "Half", value : 0.5 }, - { caption : "Full", value : 1 } + { caption: "None", value: 0 }, + { caption: "Half", value: 0.5 }, + { caption: "Full", value: 1 } ] } }, @@ -556,6 +563,9 @@ var optionGroups = { "Show Indent Guides": { path: "displayIndentGuides" }, + "Highlight Indent Guides": { + path: "highlightIndentGuides" + }, "Persistent HScrollbar": { path: "hScrollBarAlwaysVisible" }, @@ -578,12 +588,12 @@ var optionGroups = { path: "fixedWidthGutter" }, "Show Print Margin": [{ - path: "showPrintMargin" - }, { - ariaLabel: "Print Margin", - type: "number", - path: "printMarginColumn" - }], + path: "showPrintMargin" + }, { + ariaLabel: "Print Margin", + type: "number", + path: "printMarginColumn" + }], "Indented Soft Wrap": { path: "indentedSoftWrap" }, @@ -599,9 +609,9 @@ var optionGroups = { "Merge Undo Deltas": { path: "mergeUndoDeltas", items: [ - { caption : "Always", value : "always" }, - { caption : "Never", value : "false" }, - { caption : "Timed", value : "true" } + { caption: "Always", value: "always" }, + { caption: "Never", value: "false" }, + { caption: "Timed", value: "true" } ] }, "Elastic Tabstops": { @@ -618,144 +628,148 @@ var optionGroups = { }, "Live Autocompletion": { path: "enableLiveAutocompletion" + }, + "Custom scrollbar": { + path: "customScrollbar" + }, + "Use SVG gutter icons": { + path: "useSvgGutterIcons" + }, + "Annotations for folded lines": { + path: "showFoldedAnnotations" + }, + "Keyboard Accessibility Mode": { + path: "enableKeyboardAccessibility" } } }; - - -var OptionPanel = function(editor, element) { - this.editor = editor; - this.container = element || document.createElement("div"); - this.groups = []; - this.options = {}; -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.add = function(config) { +var OptionPanel = /** @class */ (function () { + function OptionPanel(editor, element) { + this.editor = editor; + this.container = element || document.createElement("div"); + this.groups = []; + this.options = {}; + } + OptionPanel.prototype.add = function (config) { if (config.Main) oop.mixin(optionGroups.Main, config.Main); if (config.More) oop.mixin(optionGroups.More, config.More); }; - - this.render = function() { + OptionPanel.prototype.render = function () { this.container.innerHTML = ""; - buildDom(["table", {role: "presentation", id: "controls"}, + buildDom(["table", { role: "presentation", id: "controls" }, this.renderOptionGroup(optionGroups.Main), - ["tr", null, ["td", {colspan: 2}, - ["table", {role: "presentation", id: "more-controls"}, - this.renderOptionGroup(optionGroups.More) - ] - ]], - ["tr", null, ["td", {colspan: 2}, "version " + config.version]] + ["tr", null, ["td", { colspan: 2 }, + ["table", { role: "presentation", id: "more-controls" }, + this.renderOptionGroup(optionGroups.More) + ] + ]], + ["tr", null, ["td", { colspan: 2 }, "version " + config.version]] ], this.container); }; - - this.renderOptionGroup = function(group) { - return Object.keys(group).map(function(key, i) { + OptionPanel.prototype.renderOptionGroup = function (group) { + return Object.keys(group).map(function (key, i) { var item = group[key]; if (!item.position) item.position = i / 10000; if (!item.label) item.label = key; return item; - }).sort(function(a, b) { + }).sort(function (a, b) { return a.position - b.position; - }).map(function(item) { + }).map(function (item) { return this.renderOption(item.label, item); }, this); }; - - this.renderOptionControl = function(key, option) { + OptionPanel.prototype.renderOptionControl = function (key, option) { var self = this; if (Array.isArray(option)) { - return option.map(function(x) { + return option.map(function (x) { return self.renderOptionControl(key, x); }); } var control; - var value = self.getOption(option); - if (option.values && option.type != "checkbox") { if (typeof option.values == "string") option.values = option.values.split("|"); - option.items = option.values.map(function(v) { + option.items = option.values.map(function (v) { return { value: v, name: v }; }); } - if (option.type == "buttonBar") { - control = ["div", {role: "group", "aria-labelledby": option.path + "-label"}, option.items.map(function(item) { - return ["button", { - value: item.value, - ace_selected_button: value == item.value, - 'aria-pressed': value == item.value, - onclick: function() { - self.setOption(option, item.value); - var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); - for (var i = 0; i < nodes.length; i++) { - nodes[i].removeAttribute("ace_selected_button"); - nodes[i].setAttribute("aria-pressed", false); - } - this.setAttribute("ace_selected_button", true); - this.setAttribute("aria-pressed", true); - } - }, item.desc || item.caption || item.name]; - })]; - } else if (option.type == "number") { - control = ["input", {type: "number", value: value || option.defaultValue, style:"width:3em", oninput: function() { - self.setOption(option, parseInt(this.value)); - }}]; + control = ["div", { role: "group", "aria-labelledby": option.path + "-label" }, option.items.map(function (item) { + return ["button", { + value: item.value, + ace_selected_button: value == item.value, + 'aria-pressed': value == item.value, + onclick: function () { + self.setOption(option, item.value); + var nodes = this.parentNode.querySelectorAll("[ace_selected_button]"); + for (var i = 0; i < nodes.length; i++) { + nodes[i].removeAttribute("ace_selected_button"); + nodes[i].setAttribute("aria-pressed", false); + } + this.setAttribute("ace_selected_button", true); + this.setAttribute("aria-pressed", true); + } + }, item.desc || item.caption || item.name]; + })]; + } + else if (option.type == "number") { + control = ["input", { type: "number", value: value || option.defaultValue, style: "width:3em", oninput: function () { + self.setOption(option, parseInt(this.value)); + } }]; if (option.ariaLabel) { control[1]["aria-label"] = option.ariaLabel; - } else { + } + else { control[1].id = key; } if (option.defaults) { - control = [control, option.defaults.map(function(item) { - return ["button", {onclick: function() { - var input = this.parentNode.firstChild; - input.value = item.value; - input.oninput(); - }}, item.caption]; - })]; + control = [control, option.defaults.map(function (item) { + return ["button", { onclick: function () { + var input = this.parentNode.firstChild; + input.value = item.value; + input.oninput(); + } }, item.caption]; + })]; } - } else if (option.items) { - var buildItems = function(items) { - return items.map(function(item) { + } + else if (option.items) { + var buildItems = function (items) { + return items.map(function (item) { return ["option", { value: item.value || item.name }, item.desc || item.caption || item.name]; }); }; - - var items = Array.isArray(option.items) + var items = Array.isArray(option.items) ? buildItems(option.items) - : Object.keys(option.items).map(function(key) { - return ["optgroup", {"label": key}, buildItems(option.items[key])]; + : Object.keys(option.items).map(function (key) { + return ["optgroup", { "label": key }, buildItems(option.items[key])]; }); - control = ["select", { id: key, value: value, onchange: function() { - self.setOption(option, this.value); - } }, items]; - } else { + control = ["select", { id: key, value: value, onchange: function () { + self.setOption(option, this.value); + } }, items]; + } + else { if (typeof option.values == "string") option.values = option.values.split("|"); - if (option.values) value = value == option.values[1]; - control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function() { - var value = this.checked; - if (option.values) value = option.values[value ? 1 : 0]; - self.setOption(option, value); - }}]; + if (option.values) + value = value == option.values[1]; + control = ["input", { type: "checkbox", id: key, checked: value || null, onchange: function () { + var value = this.checked; + if (option.values) + value = option.values[value ? 1 : 0]; + self.setOption(option, value); + } }]; if (option.type == "checkedNumber") { control = [control, []]; } } return control; }; - - this.renderOption = function(key, option) { + OptionPanel.prototype.renderOption = function (key, option) { if (option.path && !option.onchange && !this.editor.$options[option.path]) return; var path = Array.isArray(option) ? option[0].path : option.path; @@ -763,40 +777,62 @@ var OptionPanel = function(editor, element) { var safeKey = "-" + path; var safeId = path + "-label"; var control = this.renderOptionControl(safeKey, option); - return ["tr", {class: "ace_optionsMenuEntry"}, ["td", - ["label", {for: safeKey, id: safeId}, key] - ], ["td", control]]; + return ["tr", { class: "ace_optionsMenuEntry" }, ["td", + ["label", { for: safeKey, id: safeId }, key] + ], ["td", control]]; }; - - this.setOption = function(option, value) { + OptionPanel.prototype.setOption = function (option, value) { if (typeof option == "string") option = this.options[option]; - if (value == "false") value = false; - if (value == "true") value = true; - if (value == "null") value = null; - if (value == "undefined") value = undefined; + if (value == "false") + value = false; + if (value == "true") + value = true; + if (value == "null") + value = null; + if (value == "undefined") + value = undefined; if (typeof value == "string" && parseFloat(value).toString() == value) value = parseFloat(value); if (option.onchange) option.onchange(value); else if (option.path) this.editor.setOption(option.path, value); - this._signal("setOption", {name: option.path, value: value}); + this._signal("setOption", { name: option.path, value: value }); }; - - this.getOption = function(option) { + OptionPanel.prototype.getOption = function (option) { if (option.getValue) return option.getValue(); return this.editor.getOption(option.path); }; - -}).call(OptionPanel.prototype); - + return OptionPanel; +}()); +oop.implement(OptionPanel.prototype, EventEmitter); exports.OptionPanel = OptionPanel; +exports.optionGroups = optionGroups; }); -define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module) { +define("ace/ext/settings_menu",["require","exports","module","ace/ext/options","ace/ext/menu_tools/overlay_page","ace/editor"], function(require, exports, module){/** + * ## Interactive Settings Menu Extension + * + * Provides settings interface for the Ace editor that displays dynamically generated configuration options based on + * the current editor state. The menu appears as an overlay panel allowing users to modify editor options, themes, + * modes, and other settings through an intuitive graphical interface. + * + * **Usage:** + * ```javascript + * editor.showSettingsMenu(); + * ``` + * + * The extension automatically registers the `showSettingsMenu` command and method + * on the editor instance when initialized. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * + * @module + */ "use strict"; var OptionPanel = require("./options").OptionPanel; var overlayPage = require('./menu_tools/overlay_page').overlayPage; @@ -809,12 +845,13 @@ function showSettingsMenu(editor) { options.container.querySelector("select,input,button,checkbox").focus(); } } -module.exports.init = function() { +module.exports.init = function () { var Editor = require("../editor").Editor; - Editor.prototype.showSettingsMenu = function() { + Editor.prototype.showSettingsMenu = function () { showSettingsMenu(this); }; }; + }); (function() { window.require(["ace/ext/settings_menu"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-spellcheck.js b/app/Resources/ui/js/ace/ext-spellcheck.js index 10d3901..28fb250 100644 --- a/app/Resources/ui/js/ace/ext-spellcheck.js +++ b/app/Resources/ui/js/ace/ext-spellcheck.js @@ -1,8 +1,18 @@ -define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/spellcheck",["require","exports","module","ace/lib/event","ace/editor","ace/config"], function(require, exports, module){/** + * ## Browser spellcheck integration extension for native spelling correction + * + * Provides seamless integration with browser's native spellcheck functionality through context menu interactions. + * Enables right-click spelling suggestions on misspelled words while preserving editor functionality and text input + * handling. The extension bridges browser spellcheck capabilities with the editor's text manipulation system. + * + * **Enable:** `editor.setOption("spellcheck", true)` (enabled by default) + * or configure it during editor initialization in the options object. + * + * @module + */ "use strict"; var event = require("../lib/event"); - -exports.contextMenuHandler = function(e){ +exports.contextMenuHandler = function (e) { var host = e.target; var text = host.textInput.getElement(); if (!host.selection.isEmpty()) @@ -10,7 +20,6 @@ exports.contextMenuHandler = function(e){ var c = host.getCursorPosition(); var r = host.session.getWordRange(c.row, c.column); var w = host.session.getTextRange(r); - host.session.tokenRe.lastIndex = 0; if (!host.session.tokenRe.test(w)) return; @@ -20,14 +29,12 @@ exports.contextMenuHandler = function(e){ text.setSelectionRange(w.length, w.length + 1); text.setSelectionRange(0, 0); text.setSelectionRange(0, w.length); - var afterKeydown = false; event.addListener(text, "keydown", function onKeydown() { event.removeListener(text, "keydown", onKeydown); afterKeydown = true; }); - - host.textInput.setInputHandler(function(newVal) { + host.textInput.setInputHandler(function (newVal) { if (newVal == value) return ''; if (newVal.lastIndexOf(value, 0) === 0) @@ -44,14 +51,13 @@ exports.contextMenuHandler = function(e){ return ""; } } - return newVal; }); }; var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { spellcheck: { - set: function(val) { + set: function (val) { var text = this.textInput.getElement(); text.spellcheck = !!val; if (!val) diff --git a/app/Resources/ui/js/ace/ext-split.js b/app/Resources/ui/js/ace/ext-split.js index ca286bc..501b655 100644 --- a/app/Resources/ui/js/ace/ext-split.js +++ b/app/Resources/ui/js/ace/ext-split.js @@ -1,124 +1,107 @@ -define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module) { -"use strict"; - +define("ace/split",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/editor","ace/virtual_renderer","ace/edit_session"], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var lang = require("./lib/lang"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - var Editor = require("./editor").Editor; var Renderer = require("./virtual_renderer").VirtualRenderer; var EditSession = require("./edit_session").EditSession; - - -var Split = function(container, theme, splits) { +var Split; +Split = function (container, theme, splits) { this.BELOW = 1; this.BESIDE = 0; - this.$container = container; this.$theme = theme; this.$splits = 0; this.$editorCSS = ""; this.$editors = []; this.$orientation = this.BESIDE; - this.setSplits(splits || 1); this.$cEditor = this.$editors[0]; - - - this.on("focus", function(editor) { + this.on("focus", function (editor) { this.$cEditor = editor; }.bind(this)); }; - -(function(){ - +(function () { oop.implement(this, EventEmitter); - - this.$createEditor = function() { + this.$createEditor = function () { var el = document.createElement("div"); el.className = this.$editorCSS; el.style.cssText = "position: absolute; top:0px; bottom:0px"; this.$container.appendChild(el); var editor = new Editor(new Renderer(el, this.$theme)); - - editor.on("focus", function() { + editor.on("focus", function () { this._emit("focus", editor); }.bind(this)); - this.$editors.push(editor); editor.setFontSize(this.$fontSize); return editor; }; - - this.setSplits = function(splits) { + this.setSplits = function (splits) { var editor; if (splits < 1) { throw "The number of splits have to be > 0!"; } - if (splits == this.$splits) { return; - } else if (splits > this.$splits) { + } + else if (splits > this.$splits) { while (this.$splits < this.$editors.length && this.$splits < splits) { editor = this.$editors[this.$splits]; this.$container.appendChild(editor.container); editor.setFontSize(this.$fontSize); - this.$splits ++; + this.$splits++; } while (this.$splits < splits) { this.$createEditor(); - this.$splits ++; + this.$splits++; } - } else { + } + else { while (this.$splits > splits) { editor = this.$editors[this.$splits - 1]; this.$container.removeChild(editor.container); - this.$splits --; + this.$splits--; } } this.resize(); }; - this.getSplits = function() { + this.getSplits = function () { return this.$splits; }; - this.getEditor = function(idx) { + this.getEditor = function (idx) { return this.$editors[idx]; }; - this.getCurrentEditor = function() { + this.getCurrentEditor = function () { return this.$cEditor; }; - this.focus = function() { + this.focus = function () { this.$cEditor.focus(); }; - this.blur = function() { + this.blur = function () { this.$cEditor.blur(); }; - this.setTheme = function(theme) { - this.$editors.forEach(function(editor) { + this.setTheme = function (theme) { + this.$editors.forEach(function (editor) { editor.setTheme(theme); }); }; - this.setKeyboardHandler = function(keybinding) { - this.$editors.forEach(function(editor) { + this.setKeyboardHandler = function (keybinding) { + this.$editors.forEach(function (editor) { editor.setKeyboardHandler(keybinding); }); }; - this.forEach = function(callback, scope) { + this.forEach = function (callback, scope) { this.$editors.forEach(callback, scope); }; - - this.$fontSize = ""; - this.setFontSize = function(size) { + this.setFontSize = function (size) { this.$fontSize = size; - this.forEach(function(editor) { - editor.setFontSize(size); + this.forEach(function (editor) { + editor.setFontSize(size); }); }; - - this.$cloneSession = function(session) { + this.$cloneSession = function (session) { var s = new EditSession(session.getDocument(), session.getMode()); - var undoManager = session.getUndoManager(); s.setUndoManager(undoManager); s.setTabSize(session.getTabSize()); @@ -127,44 +110,41 @@ var Split = function(container, theme, splits) { s.setBreakpoints(session.getBreakpoints()); s.setUseWrapMode(session.getUseWrapMode()); s.setUseWorker(session.getUseWorker()); - s.setWrapLimitRange(session.$wrapLimitRange.min, - session.$wrapLimitRange.max); + s.setWrapLimitRange(session.$wrapLimitRange.min, session.$wrapLimitRange.max); s.$foldData = session.$cloneFoldData(); - return s; }; - this.setSession = function(session, idx) { + this.setSession = function (session, idx) { var editor; if (idx == null) { editor = this.$cEditor; - } else { + } + else { editor = this.$editors[idx]; } - var isUsed = this.$editors.some(function(editor) { - return editor.session === session; + var isUsed = this.$editors.some(function (editor) { + return editor.session === session; }); - if (isUsed) { session = this.$cloneSession(session); } editor.setSession(session); return session; }; - this.getOrientation = function() { + this.getOrientation = function () { return this.$orientation; }; - this.setOrientation = function(orientation) { + this.setOrientation = function (orientation) { if (this.$orientation == orientation) { return; } this.$orientation = orientation; this.resize(); }; - this.resize = function() { + this.resize = function () { var width = this.$container.clientWidth; var height = this.$container.clientHeight; var editor; - if (this.$orientation == this.BESIDE) { var editorWidth = width / this.$splits; for (var i = 0; i < this.$splits; i++) { @@ -175,7 +155,8 @@ var Split = function(container, theme, splits) { editor.container.style.height = height + "px"; editor.resize(); } - } else { + } + else { var editorHeight = height / this.$splits; for (var i = 0; i < this.$splits; i++) { editor = this.$editors[i]; @@ -187,13 +168,28 @@ var Split = function(container, theme, splits) { } } }; - }).call(Split.prototype); - exports.Split = Split; + }); -define("ace/ext/split",["require","exports","module","ace/split"], function(require, exports, module) { +define("ace/ext/split",["require","exports","module","ace/ext/split","ace/split"], function(require, exports, module){/** + * ## Split editor container extension for multiple editor instances + * + * Provides functionality to create and manage multiple editor instances within a single container, + * arranged either horizontally (beside) or vertically (below). Enables synchronized editing sessions + * with shared configurations while maintaining independent cursor positions and selections. + * + * **Usage:** + * ```javascript + * var Split = require("ace/ext/split").Split; + * var split = new Split(container, theme, numberOfSplits); + * split.setOrientation(split.BESIDE); // or split.BELOW + * ``` + * + * @experimental + * @module + */ "use strict"; module.exports = require("../split"); diff --git a/app/Resources/ui/js/ace/ext-static_highlight.js b/app/Resources/ui/js/ace/ext-static_highlight.js index 93b0840..fe52be5 100644 --- a/app/Resources/ui/js/ace/ext-static_highlight.js +++ b/app/Resources/ui/js/ace/ext-static_highlight.js @@ -1,112 +1,84 @@ -define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/config","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { -"use strict"; +define("ace/ext/static-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace_static_highlight {\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'Source Code Pro', 'source-code-pro', 'Droid Sans Mono', monospace;\n font-size: 12px;\n white-space: pre-wrap\n}\n\n.ace_static_highlight .ace_gutter {\n width: 2em;\n text-align: right;\n padding: 0 3px 0 0;\n margin-right: 3px;\n contain: none;\n}\n\n.ace_static_highlight.ace_show_gutter .ace_line {\n padding-left: 2.6em;\n}\n\n.ace_static_highlight .ace_line { position: relative; }\n\n.ace_static_highlight .ace_gutter-cell {\n -moz-user-select: -moz-none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n top: 0;\n bottom: 0;\n left: 0;\n position: absolute;\n}\n\n\n.ace_static_highlight .ace_gutter-cell:before {\n content: counter(ace_line, decimal);\n counter-increment: ace_line;\n}\n.ace_static_highlight {\n counter-reset: ace_line;\n}\n"; + +}); +define("ace/ext/static_highlight",["require","exports","module","ace/edit_session","ace/layer/text","ace/ext/static-css","ace/config","ace/lib/dom","ace/lib/lang"], function(require, exports, module){/** + * ## Static syntax highlighting extension for code-to-HTML conversion + * + * Transforms code snippets into syntax-highlighted HTML with CSS styling without requiring a live editor instance. + * Uses a simplified DOM implementation to generate standalone HTML output suitable for static content generation, + * documentation, code export, and embedding highlighted code in web pages. Supports automatic language detection + * from CSS classes and custom modes/themes. + * + * @module + */ +"use strict"; var EditSession = require("../edit_session").EditSession; var TextLayer = require("../layer/text").Text; -var baseStyles = ".ace_static_highlight {\ -font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\ -font-size: 12px;\ -white-space: pre-wrap\ -}\ -.ace_static_highlight .ace_gutter {\ -width: 2em;\ -text-align: right;\ -padding: 0 3px 0 0;\ -margin-right: 3px;\ -contain: none;\ -}\ -.ace_static_highlight.ace_show_gutter .ace_line {\ -padding-left: 2.6em;\ -}\ -.ace_static_highlight .ace_line { position: relative; }\ -.ace_static_highlight .ace_gutter-cell {\ --moz-user-select: -moz-none;\ --khtml-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -top: 0;\ -bottom: 0;\ -left: 0;\ -position: absolute;\ -}\ -.ace_static_highlight .ace_gutter-cell:before {\ -content: counter(ace_line, decimal);\ -counter-increment: ace_line;\ -}\ -.ace_static_highlight {\ -counter-reset: ace_line;\ -}\ -"; +var baseStyles = require("./static-css"); var config = require("../config"); var dom = require("../lib/dom"); var escapeHTML = require("../lib/lang").escapeHTML; - -function Element(type) { - this.type = type; - this.style = {}; - this.textContent = ""; -} -Element.prototype.cloneNode = function() { - return this; -}; -Element.prototype.appendChild = function(child) { - this.textContent += child.toString(); -}; -Element.prototype.toString = function() { - var stringBuilder = []; - if (this.type != "fragment") { - stringBuilder.push("<", this.type); - if (this.className) - stringBuilder.push(" class='", this.className, "'"); - var styleStr = []; - for (var key in this.style) { - styleStr.push(key, ":", this.style[key]); - } - if (styleStr.length) - stringBuilder.push(" style='", styleStr.join(""), "'"); - stringBuilder.push(">"); - } - - if (this.textContent) { - stringBuilder.push(this.textContent); +var Element = /** @class */ (function () { + function Element(type) { this.className; + this.type = type; + this.style = {}; + this.textContent = ""; } - - if (this.type != "fragment") { - stringBuilder.push(""); - } - - return stringBuilder.join(""); -}; - - + Element.prototype.cloneNode = function () { + return this; + }; + Element.prototype.appendChild = function (child) { + this.textContent += child.toString(); + }; + Element.prototype.toString = function () { + var stringBuilder = []; + if (this.type != "fragment") { + stringBuilder.push("<", this.type); + if (this.className) + stringBuilder.push(" class='", this.className, "'"); + var styleStr = []; + for (var key in this.style) { + styleStr.push(key, ":", this.style[key]); + } + if (styleStr.length) + stringBuilder.push(" style='", styleStr.join(""), "'"); + stringBuilder.push(">"); + } + if (this.textContent) { + stringBuilder.push(this.textContent); + } + if (this.type != "fragment") { + stringBuilder.push(""); + } + return stringBuilder.join(""); + }; + return Element; +}()); var simpleDom = { - createTextNode: function(textContent, element) { + createTextNode: function (/** @type {string} */ textContent, /** @type {any} */ element) { return escapeHTML(textContent); }, - createElement: function(type) { + createElement: function (/** @type {string} */ type) { return new Element(type); }, - createFragment: function() { + createFragment: function () { return new Element("fragment"); } }; - -var SimpleTextLayer = function() { +var SimpleTextLayer = function () { this.config = {}; this.dom = simpleDom; }; SimpleTextLayer.prototype = TextLayer.prototype; - -var highlight = function(el, opts, callback) { +var highlight = function (el, opts, callback) { var m = el.className.match(/lang-(\w+)/); var mode = opts.mode || m && ("ace/mode/" + m[1]); if (!mode) return false; var theme = opts.theme || "ace/theme/textmate"; - var data = ""; var nodes = []; - if (el.firstElementChild) { var textLen = 0; for (var i = 0; i < el.childNodes.length; i++) { @@ -114,18 +86,19 @@ var highlight = function(el, opts, callback) { if (ch.nodeType == 3) { textLen += ch.data.length; data += ch.data; - } else { + } + else { nodes.push(textLen, ch); } } - } else { + } + else { data = el.textContent; if (opts.trim) data = data.trim(); } - highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) { - dom.importCssString(highlighted.css, "ace_highlight"); + dom.importCssString(highlighted.css, "ace_highlight", true); el.innerHTML = highlighted.html; var container = el.firstChild.firstChild; for (var i = 0; i < nodes.length; i += 2) { @@ -137,12 +110,12 @@ var highlight = function(el, opts, callback) { callback && callback(); }); }; -highlight.render = function(input, mode, theme, lineStart, disableGutter, callback) { +highlight.render = function (input, mode, theme, lineStart, disableGutter, callback) { var waiting = 1; var modeCache = EditSession.prototype.$modes; if (typeof theme == "string") { waiting++; - config.loadModule(['theme', theme], function(m) { + config.loadModule(['theme', theme], function (m) { theme = m; --waiting || done(); }); @@ -154,53 +127,46 @@ highlight.render = function(input, mode, theme, lineStart, disableGutter, callba } if (typeof mode == "string") { waiting++; - config.loadModule(['mode', mode], function(m) { - if (!modeCache[mode] || modeOptions) - modeCache[mode] = new m.Mode(modeOptions); - mode = modeCache[mode]; + config.loadModule(['mode', mode], function (m) { + if (!modeCache[ /**@type{string}*/(mode)] || modeOptions) + modeCache[ /**@type{string}*/(mode)] = new m.Mode(modeOptions); + mode = modeCache[ /**@type{string}*/(mode)]; --waiting || done(); }); } function done() { - var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter); + var result = highlight.renderSync(input, mode, /**@type{Theme}*/ (theme), lineStart, disableGutter); return callback ? callback(result) : result; } return --waiting || done(); }; -highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { +highlight.renderSync = function (input, mode, theme, lineStart, disableGutter) { lineStart = parseInt(lineStart || 1, 10); - var session = new EditSession(""); session.setUseWorker(false); session.setMode(mode); - var textLayer = new SimpleTextLayer(); textLayer.setSession(session); - Object.keys(textLayer.$tabStrings).forEach(function(k) { + Object.keys(textLayer.$tabStrings).forEach(function (k) { if (typeof textLayer.$tabStrings[k] == "string") { var el = simpleDom.createFragment(); el.textContent = textLayer.$tabStrings[k]; textLayer.$tabStrings[k] = el; } }); - session.setValue(input); - var length = session.getLength(); - + var length = session.getLength(); var outerEl = simpleDom.createElement("div"); outerEl.className = theme.cssClass; - var innerEl = simpleDom.createElement("div"); innerEl.className = "ace_static_highlight" + (disableGutter ? "" : " ace_show_gutter"); innerEl.style["counter-reset"] = "ace_line " + (lineStart - 1); - for (var ix = 0; ix < length; ix++) { var lineEl = simpleDom.createElement("div"); lineEl.className = "ace_line"; - if (!disableGutter) { var gutterEl = simpleDom.createElement("span"); - gutterEl.className ="ace_gutter ace_gutter-cell"; + gutterEl.className = "ace_gutter ace_gutter-cell"; gutterEl.textContent = ""; lineEl.appendChild(gutterEl); } @@ -209,16 +175,15 @@ highlight.renderSync = function(input, mode, theme, lineStart, disableGutter) { innerEl.appendChild(lineEl); } outerEl.appendChild(innerEl); - return { css: baseStyles + theme.cssText, html: outerEl.toString(), session: session }; }; - module.exports = highlight; module.exports.highlight = highlight; + }); (function() { window.require(["ace/ext/static_highlight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/ext-statusbar.js b/app/Resources/ui/js/ace/ext-statusbar.js index 936cc4f..f890792 100644 --- a/app/Resources/ui/js/ace/ext-statusbar.js +++ b/app/Resources/ui/js/ace/ext-statusbar.js @@ -1,49 +1,56 @@ -define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"], function(require, exports, module) { +define("ace/ext/statusbar",["require","exports","module","ace/ext/statusbar","ace/lib/dom","ace/lib/lang"], function(require, exports, module){/** + * ## Status bar extension for displaying editor state information + * + * Provides a lightweight status indicator that displays real-time information about the editor state including + * cursor position, selection details, recording status, and keyboard binding information. The status bar + * automatically updates on editor events and renders as an inline element that can be embedded in any parent container. + * + * **Usage:** + * ```javascript + * var StatusBar = require("ace/ext/statusbar").StatusBar; + * var statusBar = new StatusBar(editor, parentElement); + * ``` + * + * @module + */ "use strict"; var dom = require("../lib/dom"); var lang = require("../lib/lang"); - -var StatusBar = function(editor, parentNode) { - this.element = dom.createElement("div"); - this.element.className = "ace_status-indicator"; - this.element.style.cssText = "display: inline-block;"; - parentNode.appendChild(this.element); - - var statusUpdate = lang.delayedCall(function(){ - this.updateStatus(editor); - }.bind(this)).schedule.bind(null, 100); - - editor.on("changeStatus", statusUpdate); - editor.on("changeSelection", statusUpdate); - editor.on("keyboardActivity", statusUpdate); -}; - -(function(){ - this.updateStatus = function(editor) { +var StatusBar = /** @class */ (function () { + function StatusBar(editor, parentNode) { + this.element = dom.createElement("div"); + this.element.className = "ace_status-indicator"; + this.element.style.cssText = "display: inline-block;"; + parentNode.appendChild(this.element); + var statusUpdate = lang.delayedCall(function () { + this.updateStatus(editor); + }.bind(this)).schedule.bind(null, 100); + editor.on("changeStatus", statusUpdate); + editor.on("changeSelection", statusUpdate); + editor.on("keyboardActivity", statusUpdate); + } + StatusBar.prototype.updateStatus = function (editor) { var status = []; function add(str, separator) { str && status.push(str, separator || "|"); } - add(editor.keyBinding.getStatusText(editor)); if (editor.commands.recording) add("REC"); - var sel = editor.selection; var c = sel.lead; - if (!sel.isEmpty()) { var r = editor.getSelectionRange(); - add("(" + (r.end.row - r.start.row) + ":" +(r.end.column - r.start.column) + ")", " "); + add("(" + (r.end.row - r.start.row) + ":" + (r.end.column - r.start.column) + ")", " "); } - add(c.row + ":" + c.column, " "); + add(c.row + ":" + c.column, " "); if (sel.rangeCount) add("[" + sel.rangeCount + "]", " "); status.pop(); this.element.textContent = status.join(""); }; -}).call(StatusBar.prototype); - + return StatusBar; +}()); exports.StatusBar = StatusBar; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-textarea.js b/app/Resources/ui/js/ace/ext-textarea.js index c4bc96b..0a541c4 100644 --- a/app/Resources/ui/js/ace/ext-textarea.js +++ b/app/Resources/ui/js/ace/ext-textarea.js @@ -1,55 +1,67 @@ -define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace"], function(require, exports, module) { +define("ace/ext/textarea",["require","exports","module","ace/ext/textarea","ace/lib/event","ace/lib/useragent","ace/ace"], function(require, exports, module){/** + * ## Textarea transformation extension + * + * Transforms HTML textarea elements into fully-featured Ace editor instances while maintaining form compatibility + * and providing an interactive settings panel. Handles automatic resizing, form submission integration, and + * preserves the original textarea's styling properties. Includes a visual settings interface for configuring + * editor options like themes, modes, keybindings, and display preferences through an overlay panel. + * + * **Usage:** + * ```javascript + * var ace = require("ace/ext/textarea"); + * var editor = ace.transformTextarea(textareaElement, { + * mode: "javascript", + * theme: "monokai", + * wrap: true + * }); + * ``` + * + * @module + */ "use strict"; - var event = require("../lib/event"); var UA = require("../lib/useragent"); -var net = require("../lib/net"); var ace = require("../ace"); - module.exports = exports = ace; -var getCSSProperty = function(element, container, property) { +var getCSSProperty = function (element, container, property) { var ret = element.style[property]; - if (!ret) { if (window.getComputedStyle) { ret = window.getComputedStyle(element, '').getPropertyValue(property); - } else { + } + else { ret = element.currentStyle[property]; } } - if (!ret || ret == 'auto' || ret == 'intrinsic') { ret = container.style[property]; } return ret; }; - function applyStyles(elm, styles) { for (var style in styles) { elm.style[style] = styles[style]; } } - function setupContainer(element, getValue) { if (element.type != 'textarea') { throw new Error("Textarea required!"); } - var parentNode = element.parentNode; var container = document.createElement('div'); - var resizeEvent = function() { + var resizeEvent = function () { var style = 'position:relative;'; [ 'margin-top', 'margin-left', 'margin-right', 'margin-bottom' - ].forEach(function(item) { + ].forEach(function (item) { style += item + ':' + - getCSSProperty(element, container, item) + ';'; + getCSSProperty(element, container, item) + ';'; }); var width = getCSSProperty(element, container, 'width') || (element.clientWidth + "px"); - var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); + var height = getCSSProperty(element, container, 'height') || (element.clientHeight + "px"); style += 'height:' + height + ';width:' + width + ';'; style += 'display:inline-block;'; - container.setAttribute('style', style); + container.style.cssText = style; }; event.addListener(window, 'resize', resizeEvent); resizeEvent(); @@ -57,7 +69,7 @@ function setupContainer(element, getValue) { while (parentNode !== document) { if (parentNode.tagName.toUpperCase() === 'FORM') { var oldSumit = parentNode.onsubmit; - parentNode.onsubmit = function(evt) { + parentNode.onsubmit = function (evt) { element.value = getValue(); if (oldSumit) { oldSumit.call(this, evt); @@ -69,11 +81,10 @@ function setupContainer(element, getValue) { } return container; } - -exports.transformTextarea = function(element, options) { +exports.transformTextarea = function (element, options) { var isFocused = element.autofocus || document.activeElement == element; var session; - var container = setupContainer(element, function() { + var container = setupContainer(element, function () { return session.getValue(); }); element.style.display = 'none'; @@ -88,7 +99,6 @@ exports.transformTextarea = function(element, options) { position: "absolute" }); container.appendChild(editorDiv); - var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", @@ -99,7 +109,6 @@ exports.transformTextarea = function(element, options) { borderColor: "lightblue gray gray #ceade6", zIndex: 101 }); - var settingDiv = document.createElement("div"); var settingDivStyles = { top: "0px", @@ -117,72 +126,57 @@ exports.transformTextarea = function(element, options) { }; if (!UA.isOldIE) { settingDivStyles.backgroundColor = "rgba(0, 0, 0, 0.6)"; - } else { + } + else { settingDivStyles.backgroundColor = "#333"; } - applyStyles(settingDiv, settingDivStyles); container.appendChild(settingDiv); - options = options || exports.defaultOptions; var editor = ace.edit(editorDiv); session = editor.getSession(); - session.setValue(element.value || element.innerHTML); if (isFocused) editor.focus(); container.appendChild(settingOpener); setupApi(editor, editorDiv, settingDiv, ace, options); setupSettingPanel(settingDiv, settingOpener, editor); - var state = ""; - event.addListener(settingOpener, "mousemove", function(e) { + event.addListener(settingOpener, "mousemove", function (e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left, y = e.clientY - rect.top; - if (x + y < (rect.width + rect.height)/2) { + if (x + y < (rect.width + rect.height) / 2) { this.style.cursor = "pointer"; state = "toggle"; - } else { + } + else { state = "resize"; this.style.cursor = "nw-resize"; } }); - - event.addListener(settingOpener, "mousedown", function(e) { + event.addListener(settingOpener, "mousedown", function (e) { e.preventDefault(); if (state == "toggle") { editor.setDisplaySettings(); return; } - container.style.zIndex = 100000; + container.style.zIndex = "100000"; var rect = container.getBoundingClientRect(); - var startX = rect.width + rect.left - e.clientX; - var startY = rect.height + rect.top - e.clientY; - event.capture(settingOpener, function(e) { + var startX = rect.width + rect.left - e.clientX; + var startY = rect.height + rect.top - e.clientY; + event.capture(settingOpener, function (e) { container.style.width = e.clientX - rect.left + startX + "px"; container.style.height = e.clientY - rect.top + startY + "px"; editor.resize(); - }, function() {}); + }, function () { }); }); - return editor; }; - -function load(url, module, callback) { - net.loadScript(url, function() { - require([module], callback); - }); -} - function setupApi(editor, editorDiv, settingDiv, ace, options) { - var session = editor.getSession(); - var renderer = editor.renderer; - function toBool(value) { return value === "true" || value == true; } - - editor.setDisplaySettings = function(display) { + editor.setDisplaySettings = function (display) { if (display == null) display = settingDiv.style.display == "none"; if (display) { @@ -192,21 +186,21 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { editor.removeListener("focus", onFocus); settingDiv.style.display = "none"; }); - } else { + } + else { editor.focus(); } }; - editor.$setOption = editor.setOption; editor.$getOption = editor.getOption; - editor.setOption = function(key, value) { + editor.setOption = function (key, value) { switch (key) { case "mode": editor.$setOption("mode", "ace/mode/" + value); - break; + break; case "theme": editor.$setOption("theme", "ace/theme/" + value); - break; + break; case "keybindings": switch (value) { case "vim": @@ -218,28 +212,23 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { default: editor.setKeyboardHandler(null); } - break; - + break; case "wrap": case "fontSize": editor.$setOption(key, value); - break; - + break; default: editor.$setOption(key, toBool(value)); } }; - - editor.getOption = function(key) { + editor.getOption = function (key) { switch (key) { case "mode": return editor.$getOption("mode").substr("ace/mode/".length); - break; - + break; case "theme": return editor.$getOption("theme").substr("ace/theme/".length); - break; - + break; case "keybindings": var value = editor.getKeyboardHandler(); switch (value && value.$id) { @@ -250,78 +239,73 @@ function setupApi(editor, editorDiv, settingDiv, ace, options) { default: return "ace"; } - break; - + break; default: return editor.$getOption(key); } }; - editor.setOptions(options); return editor; } - function setupSettingPanel(settingDiv, settingOpener, editor) { var BOOL = null; - var desc = { - mode: "Mode:", - wrap: "Soft Wrap:", - theme: "Theme:", - fontSize: "Font Size:", - showGutter: "Display Gutter:", - keybindings: "Keyboard", + mode: "Mode:", + wrap: "Soft Wrap:", + theme: "Theme:", + fontSize: "Font Size:", + showGutter: "Display Gutter:", + keybindings: "Keyboard", showPrintMargin: "Show Print Margin:", - useSoftTabs: "Use Soft Tabs:", - showInvisibles: "Show Invisibles" + useSoftTabs: "Use Soft Tabs:", + showInvisibles: "Show Invisibles" }; - var optionValues = { mode: { - text: "Plain", + text: "Plain", javascript: "JavaScript", - xml: "XML", - html: "HTML", - css: "CSS", - scss: "SCSS", - python: "Python", - php: "PHP", - java: "Java", - ruby: "Ruby", - c_cpp: "C/C++", - coffee: "CoffeeScript", - json: "json", - perl: "Perl", - clojure: "Clojure", - ocaml: "OCaml", - csharp: "C#", - haxe: "haXe", - svg: "SVG", - textile: "Textile", - groovy: "Groovy", - liquid: "Liquid", - Scala: "Scala" + xml: "XML", + html: "HTML", + css: "CSS", + scss: "SCSS", + python: "Python", + php: "PHP", + java: "Java", + ruby: "Ruby", + c_cpp: "C/C++", + coffee: "CoffeeScript", + json: "json", + perl: "Perl", + clojure: "Clojure", + ocaml: "OCaml", + csharp: "C#", + haxe: "haXe", + svg: "SVG", + textile: "Textile", + groovy: "Groovy", + liquid: "Liquid", + Scala: "Scala" }, theme: { - clouds: "Clouds", - clouds_midnight: "Clouds Midnight", - cobalt: "Cobalt", - crimson_editor: "Crimson Editor", - dawn: "Dawn", - gob: "Green on Black", - eclipse: "Eclipse", - idle_fingers: "Idle Fingers", - kr_theme: "Kr Theme", - merbivore: "Merbivore", - merbivore_soft: "Merbivore Soft", - mono_industrial: "Mono Industrial", - monokai: "Monokai", - pastel_on_dark: "Pastel On Dark", - solarized_dark: "Solarized Dark", - solarized_light: "Solarized Light", - textmate: "Textmate", - twilight: "Twilight", - vibrant_ink: "Vibrant Ink" + clouds: "Clouds", + clouds_midnight: "Clouds Midnight", + cobalt: "Cobalt", + crimson_editor: "Crimson Editor", + dawn: "Dawn", + gob: "Green on Black", + eclipse: "Eclipse", + idle_fingers: "Idle Fingers", + kr_theme: "Kr Theme", + merbivore: "Merbivore", + merbivore_soft: "Merbivore Soft", + mono_industrial: "Mono Industrial", + monokai: "Monokai", + pastel_on_dark: "Pastel On Dark", + solarized_dark: "Solarized Dark", + solarized_light: "Solarized Light", + textmate: "Textmate", + twilight: "Twilight", + vibrant_ink: "Vibrant Ink" }, showGutter: BOOL, fontSize: { @@ -332,48 +316,37 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { "16px": "16px" }, wrap: { - off: "Off", - 40: "40", - 80: "80", - free: "Free" + off: "Off", + 40: "40", + 80: "80", + free: "Free" }, keybindings: { ace: "ace", vim: "vim", emacs: "emacs" }, - showPrintMargin: BOOL, - useSoftTabs: BOOL, - showInvisibles: BOOL + showPrintMargin: BOOL, + useSoftTabs: BOOL, + showInvisibles: BOOL }; - var table = []; table.push(""); - function renderOption(builder, option, obj, cValue) { if (!obj) { - builder.push( - "" - ); + builder.push(""); return; } builder.push(""); } - for (var option in exports.defaultOptions) { table.push(""); table.push("
SettingValue
", desc[option], ""); @@ -382,12 +355,11 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { } table.push("
"); settingDiv.innerHTML = table.join(""); - - var onChange = function(e) { + var onChange = function (e) { var select = e.currentTarget; editor.setOption(select.title, select.value); }; - var onClick = function(e) { + var onClick = function (e) { var cb = e.currentTarget; editor.setOption(cb.title, cb.checked); }; @@ -397,27 +369,25 @@ function setupSettingPanel(settingDiv, settingOpener, editor) { var cbs = settingDiv.getElementsByTagName("input"); for (var i = 0; i < cbs.length; i++) cbs[i].onclick = onClick; - - var button = document.createElement("input"); button.type = "button"; button.value = "Hide"; - event.addListener(button, "click", function() { + event.addListener(button, "click", function () { editor.setDisplaySettings(false); }); settingDiv.appendChild(button); settingDiv.hideButton = button; } exports.defaultOptions = { - mode: "javascript", - theme: "textmate", - wrap: "off", - fontSize: "12px", - showGutter: "false", - keybindings: "ace", - showPrintMargin: "false", - useSoftTabs: "true", - showInvisibles: "false" + mode: "javascript", + theme: "textmate", + wrap: "off", + fontSize: "12px", + showGutter: "false", + keybindings: "ace", + showPrintMargin: "false", + useSoftTabs: "true", + showInvisibles: "false" }; }); (function() { diff --git a/app/Resources/ui/js/ace/ext-themelist.js b/app/Resources/ui/js/ace/ext-themelist.js index 6412884..87fb0bf 100644 --- a/app/Resources/ui/js/ace/ext-themelist.js +++ b/app/Resources/ui/js/ace/ext-themelist.js @@ -1,51 +1,64 @@ -define("ace/ext/themelist",["require","exports","module"], function(require, exports, module) { +define("ace/ext/themelist",["require","exports","module"], function(require, exports, module){/** + * ## Theme enumeration utility + * + * Provides theme management for the Ace Editor by generating and organizing available themes into + * categorized collections. Automatically maps theme data into structured objects containing theme metadata including + * display captions, theme paths, brightness classification (dark/light), and normalized names. Exports both an + * indexed theme collection and a complete themes array for easy integration with theme selection components + * and configuration systems. + * + * @author + * Matthew Christopher Kastor-Inare III
+ * @module + */ "use strict"; - var themeData = [ - ["Chrome" ], - ["Clouds" ], - ["Crimson Editor" ], - ["Dawn" ], - ["Dreamweaver" ], - ["Eclipse" ], - ["GitHub" ], - ["IPlastic" ], + ["Chrome"], + ["Clouds"], + ["Crimson Editor"], + ["Dawn"], + ["Dreamweaver"], + ["Eclipse"], + ["GitHub Light Default"], + ["GitHub (Legacy)", "github", "light"], + ["IPlastic"], ["Solarized Light"], - ["TextMate" ], - ["Tomorrow" ], - ["XCode" ], + ["TextMate"], + ["Tomorrow"], + ["XCode"], ["Kuroir"], ["KatzenMilch"], - ["SQL Server" ,"sqlserver" , "light"], - ["Ambiance" ,"ambiance" , "dark"], - ["Chaos" ,"chaos" , "dark"], - ["Clouds Midnight" ,"clouds_midnight" , "dark"], - ["Dracula" ,"" , "dark"], - ["Cobalt" ,"cobalt" , "dark"], - ["Gruvbox" ,"gruvbox" , "dark"], - ["Green on Black" ,"gob" , "dark"], - ["idle Fingers" ,"idle_fingers" , "dark"], - ["krTheme" ,"kr_theme" , "dark"], - ["Merbivore" ,"merbivore" , "dark"], - ["Merbivore Soft" ,"merbivore_soft" , "dark"], - ["Mono Industrial" ,"mono_industrial" , "dark"], - ["Monokai" ,"monokai" , "dark"], - ["Nord Dark" ,"nord_dark" , "dark"], - ["One Dark" ,"one_dark" , "dark"], - ["Pastel on dark" ,"pastel_on_dark" , "dark"], - ["Solarized Dark" ,"solarized_dark" , "dark"], - ["Terminal" ,"terminal" , "dark"], - ["Tomorrow Night" ,"tomorrow_night" , "dark"], - ["Tomorrow Night Blue" ,"tomorrow_night_blue" , "dark"], - ["Tomorrow Night Bright","tomorrow_night_bright" , "dark"], - ["Tomorrow Night 80s" ,"tomorrow_night_eighties" , "dark"], - ["Twilight" ,"twilight" , "dark"], - ["Vibrant Ink" ,"vibrant_ink" , "dark"] + ["SQL Server", "sqlserver", "light"], + ["CloudEditor", "cloud_editor", "light"], + ["Ambiance", "ambiance", "dark"], + ["Chaos", "chaos", "dark"], + ["Clouds Midnight", "clouds_midnight", "dark"], + ["Dracula", "", "dark"], + ["Cobalt", "cobalt", "dark"], + ["Gruvbox", "gruvbox", "dark"], + ["Green on Black", "gob", "dark"], + ["idle Fingers", "idle_fingers", "dark"], + ["krTheme", "kr_theme", "dark"], + ["Merbivore", "merbivore", "dark"], + ["Merbivore Soft", "merbivore_soft", "dark"], + ["Mono Industrial", "mono_industrial", "dark"], + ["Monokai", "monokai", "dark"], + ["Nord Dark", "nord_dark", "dark"], + ["One Dark", "one_dark", "dark"], + ["Pastel on dark", "pastel_on_dark", "dark"], + ["Solarized Dark", "solarized_dark", "dark"], + ["Terminal", "terminal", "dark"], + ["Tomorrow Night", "tomorrow_night", "dark"], + ["Tomorrow Night Blue", "tomorrow_night_blue", "dark"], + ["Tomorrow Night Bright", "tomorrow_night_bright", "dark"], + ["Tomorrow Night 80s", "tomorrow_night_eighties", "dark"], + ["Twilight", "twilight", "dark"], + ["Vibrant Ink", "vibrant_ink", "dark"], + ["GitHub Dark", "github_dark", "dark"], + ["CloudEditor Dark", "cloud_editor_dark", "dark"] ]; - - exports.themesByName = {}; -exports.themes = themeData.map(function(data) { +exports.themes = themeData.map(function (data) { var name = data[1] || data[0].replace(/ /g, "_").toLowerCase(); var theme = { caption: data[0], diff --git a/app/Resources/ui/js/ace/ext-whitespace.js b/app/Resources/ui/js/ace/ext-whitespace.js index f6d4593..c04738d 100644 --- a/app/Resources/ui/js/ace/ext-whitespace.js +++ b/app/Resources/ui/js/ace/ext-whitespace.js @@ -1,8 +1,15 @@ -define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +define("ace/ext/whitespace",["require","exports","module","ace/lib/lang"], function(require, exports, module){/** + * ## Whitespace management and indentation utilities extension + * + * Provides whitespace handling capabilities including automatic indentation detection, trailing whitespace trimming, + * and indentation format conversion. Analyzes code patterns to determine optimal tab settings and offers commands for + * maintaining consistent code formatting across different indentation styles (spaces vs. tabs) and sizes. + * + * @module + */ "use strict"; - var lang = require("../lib/lang"); -exports.$detectIndentation = function(lines, fallback) { +exports.$detectIndentation = function (lines, fallback) { var stats = []; var changes = []; var tabIndents = 0; @@ -12,17 +19,16 @@ exports.$detectIndentation = function(lines, fallback) { var line = lines[i]; if (!/^\s*[^*+\-\s]/.test(line)) continue; - if (line[0] == "\t") { tabIndents++; prevSpaces = -Number.MAX_VALUE; - } else { + } + else { var spaces = line.match(/^ */)[0].length; if (spaces && line[spaces] != "\t") { var diff = spaces - prevSpaces; - if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff)) + if (diff > 0 && !(prevSpaces % diff) && !(spaces % diff)) changes[diff] = (changes[diff] || 0) + 1; - stats[spaces] = (stats[spaces] || 0) + 1; } prevSpaces = spaces; @@ -30,17 +36,14 @@ exports.$detectIndentation = function(lines, fallback) { while (i < max && line[line.length - 1] == "\\") line = lines[i++]; } - function getScore(indent) { var score = 0; for (var i = indent; i < stats.length; i += indent) score += stats[i] || 0; return score; } - - var changesTotal = changes.reduce(function(a,b){return a+b;}, 0); - - var first = {score: 0, length: 0}; + var changesTotal = changes.reduce(function (a, b) { return a + b; }, 0); + var first = { score: 0, length: 0 }; var spaceIndents = 0; for (var i = 1; i < 12; i++) { var score = getScore(i); @@ -49,110 +52,97 @@ exports.$detectIndentation = function(lines, fallback) { score = stats[1] ? 0.9 : 0.8; if (!stats.length) score = 0; - } else + } + else score /= spaceIndents; - if (changes[i]) score += changes[i] / changesTotal; - if (score > first.score) - first = {score: score, length: i}; + first = { score: score, length: i }; } - if (first.score && first.score > 1.4) var tabLength = first.length; - if (tabIndents > spaceIndents + 1) { if (tabLength == 1 || spaceIndents < tabIndents / 4 || first.score < 1.8) tabLength = undefined; - return {ch: "\t", length: tabLength}; + return { ch: "\t", length: tabLength }; } if (spaceIndents > tabIndents + 1) - return {ch: " ", length: tabLength}; + return { ch: " ", length: tabLength }; }; - -exports.detectIndentation = function(session) { +exports.detectIndentation = function (session) { var lines = session.getLines(0, 1000); var indent = exports.$detectIndentation(lines) || {}; - if (indent.ch) session.setUseSoftTabs(indent.ch == " "); - if (indent.length) session.setTabSize(indent.length); return indent; }; -exports.trimTrailingSpace = function(session, options) { +exports.trimTrailingSpace = function (session, options) { var doc = session.getDocument(); var lines = doc.getAllLines(); - var min = options && options.trimEmpty ? -1 : 0; var cursors = [], ci = -1; if (options && options.keepCursorPosition) { if (session.selection.rangeCount) { - session.selection.rangeList.ranges.forEach(function(x, i, ranges) { - var next = ranges[i + 1]; - if (next && next.cursor.row == x.cursor.row) - return; - cursors.push(x.cursor); + session.selection.rangeList.ranges.forEach(function (x, i, ranges) { + var next = ranges[i + 1]; + if (next && next.cursor.row == x.cursor.row) + return; + cursors.push(x.cursor); }); - } else { + } + else { cursors.push(session.selection.getCursor()); } ci = 0; } var cursorRow = cursors[ci] && cursors[ci].row; - - for (var i = 0, l=lines.length; i < l; i++) { + for (var i = 0, l = lines.length; i < l; i++) { var line = lines[i]; var index = line.search(/\s+$/); - if (i == cursorRow) { if (index < cursors[ci].column && index > min) - index = cursors[ci].column; + index = cursors[ci].column; ci++; cursorRow = cursors[ci] ? cursors[ci].row : -1; } - if (index > min) doc.removeInLine(i, index, line.length); } }; - -exports.convertIndentation = function(session, ch, len) { +exports.convertIndentation = function (session, ch, len) { var oldCh = session.getTabString()[0]; var oldLen = session.getTabSize(); - if (!len) len = oldLen; - if (!ch) ch = oldCh; - - var tab = ch == "\t" ? ch: lang.stringRepeat(ch, len); - + if (!len) + len = oldLen; + if (!ch) + ch = oldCh; + var tab = ch == "\t" ? ch : lang.stringRepeat(ch, len); var doc = session.doc; var lines = doc.getAllLines(); - var cache = {}; var spaceCache = {}; - for (var i = 0, l=lines.length; i < l; i++) { + for (var i = 0, l = lines.length; i < l; i++) { var line = lines[i]; var match = line.match(/^\s*/)[0]; if (match) { var w = session.$getStringScreenWidth(match)[0]; - var tabCount = Math.floor(w/oldLen); - var reminder = w%oldLen; + var tabCount = Math.floor(w / oldLen); + var reminder = w % oldLen; var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount)); toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(" ", reminder)); - if (toInsert != match) { doc.removeInLine(i, 0, match.length); - doc.insertInLine({row: i, column: 0}, toInsert); + doc.insertInLine({ row: i, column: 0 }, toInsert); } } } session.setTabSize(len); session.setUseSoftTabs(ch == " "); }; - -exports.$parseStringArg = function(text) { +exports.$parseStringArg = function (text) { var indent = {}; if (/t/.test(text)) indent.ch = "\t"; @@ -163,8 +153,7 @@ exports.$parseStringArg = function(text) { indent.length = parseInt(m[0], 10); return indent; }; - -exports.$parseArg = function(arg) { +exports.$parseArg = function (arg) { if (!arg) return {}; if (typeof arg == "string") @@ -173,35 +162,34 @@ exports.$parseArg = function(arg) { return exports.$parseStringArg(arg.text); return arg; }; - exports.commands = [{ - name: "detectIndentation", - description: "Detect indentation from content", - exec: function(editor) { - exports.detectIndentation(editor.session); - } -}, { - name: "trimTrailingSpace", - description: "Trim trailing whitespace", - exec: function(editor, args) { - exports.trimTrailingSpace(editor.session, args); - } -}, { - name: "convertIndentation", - description: "Convert indentation to ...", - exec: function(editor, arg) { - var indent = exports.$parseArg(arg); - exports.convertIndentation(editor.session, indent.ch, indent.length); - } -}, { - name: "setIndentation", - description: "Set indentation", - exec: function(editor, arg) { - var indent = exports.$parseArg(arg); - indent.length && editor.session.setTabSize(indent.length); - indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); - } -}]; + name: "detectIndentation", + description: "Detect indentation from content", + exec: function (editor) { + exports.detectIndentation(editor.session); + } + }, { + name: "trimTrailingSpace", + description: "Trim trailing whitespace", + exec: function (editor, args) { + exports.trimTrailingSpace(editor.session, args); + } + }, { + name: "convertIndentation", + description: "Convert indentation to ...", + exec: function (editor, arg) { + var indent = exports.$parseArg(arg); + exports.convertIndentation(editor.session, indent.ch, indent.length); + } + }, { + name: "setIndentation", + description: "Set indentation", + exec: function (editor, arg) { + var indent = exports.$parseArg(arg); + indent.length && editor.session.setTabSize(indent.length); + indent.ch && editor.session.setUseSoftTabs(indent.ch == " "); + } + }]; }); (function() { window.require(["ace/ext/whitespace"], function(m) { diff --git a/app/Resources/ui/js/ace/keybinding-emacs.js b/app/Resources/ui/js/ace/keybinding-emacs.js index 07ffa85..17228e2 100644 --- a/app/Resources/ui/js/ace/keybinding-emacs.js +++ b/app/Resources/ui/js/ace/keybinding-emacs.js @@ -1,25 +1,38 @@ -define("ace/occur",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/occur",["require","exports","module","ace/lib/oop","ace/search","ace/edit_session","ace/search_highlight","ace/lib/dom"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var oop = require("./lib/oop"); -var Range = require("./range").Range; var Search = require("./search").Search; var EditSession = require("./edit_session").EditSession; var SearchHighlight = require("./search_highlight").SearchHighlight; -function Occur() {} - -oop.inherits(Occur, Search); - -(function() { - this.enter = function(editor, options) { - if (!options.needle) return false; +var Occur = /** @class */ (function (_super) { + __extends(Occur, _super); + function Occur() { + return _super !== null && _super.apply(this, arguments) || this; + } + Occur.prototype.enter = function (editor, options) { + if (!options.needle) + return false; var pos = editor.getCursorPosition(); this.displayOccurContent(editor, options); var translatedPos = this.originalToOccurPosition(editor.session, pos); editor.moveCursorToPosition(translatedPos); return true; }; - this.exit = function(editor, options) { + Occur.prototype.exit = function (editor, options) { var pos = options.translatePosition && editor.getCursorPosition(); var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos); this.displayOriginalContent(editor); @@ -27,18 +40,15 @@ oop.inherits(Occur, Search); editor.moveCursorToPosition(translatedPos); return true; }; - - this.highlight = function(sess, regexp) { - var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker( - new SearchHighlight(null, "ace_occur-highlight", "text")); + Occur.prototype.highlight = function (sess, regexp) { + var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker(new SearchHighlight(null, "ace_occur-highlight", "text")); hl.setRegexp(regexp); sess._emit("changeBackMarker"); // force highlight layer redraw }; - - this.displayOccurContent = function(editor, options) { + Occur.prototype.displayOccurContent = function (editor, options) { this.$originalSession = editor.session; var found = this.matchingLines(editor.session, options); - var lines = found.map(function(foundLine) { return foundLine.content; }); + var lines = found.map(function (foundLine) { return foundLine.content; }); var occurSession = new EditSession(lines.join('\n')); occurSession.$occur = this; occurSession.$occurMatchingLines = found; @@ -48,44 +58,43 @@ oop.inherits(Occur, Search); this.highlight(occurSession, options.re); occurSession._emit('changeBackMarker'); }; - - this.displayOriginalContent = function(editor) { + Occur.prototype.displayOriginalContent = function (editor) { editor.setSession(this.$originalSession); this.$originalSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart; }; - this.originalToOccurPosition = function(session, pos) { + Occur.prototype.originalToOccurPosition = function (session, pos) { var lines = session.$occurMatchingLines; - var nullPos = {row: 0, column: 0}; - if (!lines) return nullPos; + var nullPos = { row: 0, column: 0 }; + if (!lines) + return nullPos; for (var i = 0; i < lines.length; i++) { if (lines[i].row === pos.row) - return {row: i, column: pos.column}; + return { row: i, column: pos.column }; } return nullPos; }; - this.occurToOriginalPosition = function(session, pos) { + Occur.prototype.occurToOriginalPosition = function (session, pos) { var lines = session.$occurMatchingLines; if (!lines || !lines[pos.row]) return pos; - return {row: lines[pos.row].row, column: pos.column}; + return { row: lines[pos.row].row, column: pos.column }; }; - - this.matchingLines = function(session, options) { + Occur.prototype.matchingLines = function (session, options) { options = oop.mixin({}, options); - if (!session || !options.needle) return []; + if (!session || !options.needle) + return []; var search = new Search(); search.set(options); - return search.findAll(session).reduce(function(lines, range) { + return search.findAll(session).reduce(function (lines, range) { var row = range.start.row; - var last = lines[lines.length-1]; + var last = lines[lines.length - 1]; return last && last.row === row ? lines : - lines.concat({row: row, content: session.getLine(row)}); + lines.concat({ row: row, content: session.getLine(row) }); }, []); }; - -}).call(Occur.prototype); - + return Occur; +}(Search)); var dom = require('./lib/dom'); dom.importCssString(".ace_occur-highlight {\n\ border-radius: 4px;\n\ @@ -99,18 +108,14 @@ dom.importCssString(".ace_occur-highlight {\n\ background-color: rgb(80, 140, 85);\n\ box-shadow: 0 0 4px rgb(60, 120, 70);\n\ }\n", "incremental-occur-highlighting", false); - exports.Occur = Occur; }); -define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module) { - -var config = require("../config"), - Occur = require("../occur").Occur; +define("ace/commands/occur_commands",["require","exports","module","ace/config","ace/occur","ace/keyboard/hash_handler","ace/lib/oop"], function(require, exports, module){var config = require("../config"), Occur = require("../occur").Occur; var occurStartCommand = { name: "occur", - exec: function(editor, options) { + exec: function (editor, options) { var alreadyInOccur = !!editor.session.$occur; var occurSessionActive = new Occur().enter(editor, options); if (occurSessionActive && !alreadyInOccur) @@ -118,214 +123,195 @@ var occurStartCommand = { }, readOnly: true }; - var occurCommands = [{ - name: "occurexit", - bindKey: 'esc|Ctrl-G', - exec: function(editor) { - var occur = editor.session.$occur; - if (!occur) return; - occur.exit(editor, {}); - if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); - }, - readOnly: true -}, { - name: "occuraccept", - bindKey: 'enter', - exec: function(editor) { - var occur = editor.session.$occur; - if (!occur) return; - occur.exit(editor, {translatePosition: true}); - if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor); - }, - readOnly: true -}]; - + name: "occurexit", + bindKey: 'esc|Ctrl-G', + exec: function (editor) { + var occur = editor.session.$occur; + if (!occur) + return; + occur.exit(editor, {}); + if (!editor.session.$occur) + OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true + }, { + name: "occuraccept", + bindKey: 'enter', + exec: function (editor) { + var occur = editor.session.$occur; + if (!occur) + return; + occur.exit(editor, { translatePosition: true }); + if (!editor.session.$occur) + OccurKeyboardHandler.uninstallFrom(editor); + }, + readOnly: true + }]; var HashHandler = require("../keyboard/hash_handler").HashHandler; var oop = require("../lib/oop"); - - -function OccurKeyboardHandler() {} - +function OccurKeyboardHandler() { } oop.inherits(OccurKeyboardHandler, HashHandler); - -(function() { - +(function () { this.isOccurHandler = true; - - this.attach = function(editor) { + this.attach = function (editor) { HashHandler.call(this, occurCommands, editor.commands.platform); this.$editor = editor; }; - var handleKeyboard$super = this.handleKeyboard; - this.handleKeyboard = function(data, hashId, key, keyCode) { + this.handleKeyboard = function (data, hashId, key, keyCode) { var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); return (cmd && cmd.command) ? cmd : undefined; }; - }).call(OccurKeyboardHandler.prototype); - -OccurKeyboardHandler.installIn = function(editor) { +OccurKeyboardHandler.installIn = function (editor) { var handler = new this(); editor.keyBinding.addKeyboardHandler(handler); editor.commands.addCommands(occurCommands); }; - -OccurKeyboardHandler.uninstallFrom = function(editor) { +OccurKeyboardHandler.uninstallFrom = function (editor) { editor.commands.removeCommands(occurCommands); var handler = editor.getKeyboardHandler(); if (handler.isOccurHandler) editor.keyBinding.removeKeyboardHandler(handler); }; - exports.occurStartCommand = occurStartCommand; }); -define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module) { - -var config = require("../config"); +define("ace/commands/incremental_search_commands",["require","exports","module","ace/config","ace/lib/oop","ace/keyboard/hash_handler","ace/commands/occur_commands"], function(require, exports, module){var config = require("../config"); var oop = require("../lib/oop"); var HashHandler = require("../keyboard/hash_handler").HashHandler; var occurStartCommand = require("./occur_commands").occurStartCommand; exports.iSearchStartCommands = [{ - name: "iSearch", - bindKey: {win: "Ctrl-F", mac: "Command-F"}, - exec: function(editor, options) { - config.loadModule(["core", "ace/incremental_search"], function(e) { - var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); - iSearch.activate(editor, options.backwards); - if (options.jumpToFirstMatch) iSearch.next(options); - }); - }, - readOnly: true -}, { - name: "iSearchBackwards", - exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); }, - readOnly: true -}, { - name: "iSearchAndGo", - bindKey: {win: "Ctrl-K", mac: "Command-G"}, - exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); }, - readOnly: true -}, { - name: "iSearchBackwardsAndGo", - bindKey: {win: "Ctrl-Shift-K", mac: "Command-Shift-G"}, - exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); }, - readOnly: true -}]; + name: "iSearch", + bindKey: { win: "Ctrl-F", mac: "Command-F" }, + exec: function (editor, options) { + config.loadModule(["core", "ace/incremental_search"], function (e) { + var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch(); + iSearch.activate(editor, options.backwards); + if (options.jumpToFirstMatch) + iSearch.next(options); + }); + }, + readOnly: true + }, { + name: "iSearchBackwards", + exec: function (editor, jumpToNext) { editor.execCommand('iSearch', { backwards: true }); }, + readOnly: true + }, { + name: "iSearchAndGo", + bindKey: { win: "Ctrl-K", mac: "Command-G" }, + exec: function (editor, jumpToNext) { editor.execCommand('iSearch', { jumpToFirstMatch: true, useCurrentOrPrevSearch: true }); }, + readOnly: true + }, { + name: "iSearchBackwardsAndGo", + bindKey: { win: "Ctrl-Shift-K", mac: "Command-Shift-G" }, + exec: function (editor) { editor.execCommand('iSearch', { jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true }); }, + readOnly: true + }]; exports.iSearchCommands = [{ - name: "restartSearch", - bindKey: {win: "Ctrl-F", mac: "Command-F"}, - exec: function(iSearch) { - iSearch.cancelSearch(true); - } -}, { - name: "searchForward", - bindKey: {win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G"}, - exec: function(iSearch, options) { - options.useCurrentOrPrevSearch = true; - iSearch.next(options); - } -}, { - name: "searchBackward", - bindKey: {win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G"}, - exec: function(iSearch, options) { - options.useCurrentOrPrevSearch = true; - options.backwards = true; - iSearch.next(options); - } -}, { - name: "extendSearchTerm", - exec: function(iSearch, string) { - iSearch.addString(string); - } -}, { - name: "extendSearchTermSpace", - bindKey: "space", - exec: function(iSearch) { iSearch.addString(' '); } -}, { - name: "shrinkSearchTerm", - bindKey: "backspace", - exec: function(iSearch) { - iSearch.removeChar(); - } -}, { - name: 'confirmSearch', - bindKey: 'return', - exec: function(iSearch) { iSearch.deactivate(); } -}, { - name: 'cancelSearch', - bindKey: 'esc|Ctrl-G', - exec: function(iSearch) { iSearch.deactivate(true); } -}, { - name: 'occurisearch', - bindKey: 'Ctrl-O', - exec: function(iSearch) { - var options = oop.mixin({}, iSearch.$options); - iSearch.deactivate(); - occurStartCommand.exec(iSearch.$editor, options); - } -}, { - name: "yankNextWord", - bindKey: "Ctrl-w", - exec: function(iSearch) { - var ed = iSearch.$editor, - range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }), - string = ed.session.getTextRange(range); - iSearch.addString(string); - } -}, { - name: "yankNextChar", - bindKey: "Ctrl-Alt-y", - exec: function(iSearch) { - var ed = iSearch.$editor, - range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }), - string = ed.session.getTextRange(range); - iSearch.addString(string); - } -}, { - name: 'recenterTopBottom', - bindKey: 'Ctrl-l', - exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } -}, { - name: 'selectAllMatches', - bindKey: 'Ctrl-space', - exec: function(iSearch) { - var ed = iSearch.$editor, - hl = ed.session.$isearchHighlight, - ranges = hl && hl.cache ? hl.cache - .reduce(function(ranges, ea) { - return ranges.concat(ea ? ea : []); }, []) : []; - iSearch.deactivate(false); - ranges.forEach(ed.selection.addRange.bind(ed.selection)); - } -}, { - name: 'searchAsRegExp', - bindKey: 'Alt-r', - exec: function(iSearch) { - iSearch.convertNeedleToRegExp(); - } -}].map(function(cmd) { + name: "restartSearch", + bindKey: { win: "Ctrl-F", mac: "Command-F" }, + exec: function (iSearch) { + iSearch.cancelSearch(true); + } + }, { + name: "searchForward", + bindKey: { win: "Ctrl-S|Ctrl-K", mac: "Ctrl-S|Command-G" }, + exec: function (iSearch, options) { + options.useCurrentOrPrevSearch = true; + iSearch.next(options); + } + }, { + name: "searchBackward", + bindKey: { win: "Ctrl-R|Ctrl-Shift-K", mac: "Ctrl-R|Command-Shift-G" }, + exec: function (iSearch, options) { + options.useCurrentOrPrevSearch = true; + options.backwards = true; + iSearch.next(options); + } + }, { + name: "extendSearchTerm", + exec: function (iSearch, string) { + iSearch.addString(string); + } + }, { + name: "extendSearchTermSpace", + bindKey: "space", + exec: function (iSearch) { iSearch.addString(' '); } + }, { + name: "shrinkSearchTerm", + bindKey: "backspace", + exec: function (iSearch) { + iSearch.removeChar(); + } + }, { + name: 'confirmSearch', + bindKey: 'return', + exec: function (iSearch) { iSearch.deactivate(); } + }, { + name: 'cancelSearch', + bindKey: 'esc|Ctrl-G', + exec: function (iSearch) { iSearch.deactivate(true); } + }, { + name: 'occurisearch', + bindKey: 'Ctrl-O', + exec: function (iSearch) { + var options = oop.mixin({}, iSearch.$options); + iSearch.deactivate(); + occurStartCommand.exec(iSearch.$editor, options); + } + }, { + name: "yankNextWord", + bindKey: "Ctrl-w", + exec: function (iSearch) { + var ed = iSearch.$editor, range = ed.selection.getRangeOfMovements(function (sel) { sel.moveCursorWordRight(); }), string = ed.session.getTextRange(range); + iSearch.addString(string); + } + }, { + name: "yankNextChar", + bindKey: "Ctrl-Alt-y", + exec: function (iSearch) { + var ed = iSearch.$editor, range = ed.selection.getRangeOfMovements(function (sel) { sel.moveCursorRight(); }), string = ed.session.getTextRange(range); + iSearch.addString(string); + } + }, { + name: 'recenterTopBottom', + bindKey: 'Ctrl-l', + exec: function (iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); } + }, { + name: 'selectAllMatches', + bindKey: 'Ctrl-space', + exec: function (iSearch) { + var ed = iSearch.$editor, hl = ed.session.$isearchHighlight, ranges = hl && hl.cache ? hl.cache + .reduce(function (ranges, ea) { + return ranges.concat(ea ? ea : []); + }, []) : []; + iSearch.deactivate(false); + ranges.forEach(ed.selection.addRange.bind(ed.selection)); + } + }, { + name: 'searchAsRegExp', + bindKey: 'Alt-r', + exec: function (iSearch) { + iSearch.convertNeedleToRegExp(); + } + }].map(function (cmd) { cmd.readOnly = true; cmd.isIncrementalSearchCommand = true; cmd.scrollIntoView = "animate-cursor"; return cmd; }); - function IncrementalSearchKeyboardHandler(iSearch) { this.$iSearch = iSearch; } - oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); - -(function() { - - this.attach = function(editor) { +(function () { + this.attach = function (editor) { var iSearch = this.$iSearch; HashHandler.call(this, exports.iSearchCommands, editor.commands.platform); - this.$commandExecHandler = editor.commands.on('exec', function(e) { + this.$commandExecHandler = editor.commands.on('exec', function (e) { if (!e.command.isIncrementalSearchCommand) return iSearch.deactivate(); e.stopPropagation(); @@ -337,89 +323,97 @@ oop.inherits(IncrementalSearchKeyboardHandler, HashHandler); return result; }); }; - - this.detach = function(editor) { - if (!this.$commandExecHandler) return; + this.detach = function (editor) { + if (!this.$commandExecHandler) + return; editor.commands.off('exec', this.$commandExecHandler); delete this.$commandExecHandler; }; - var handleKeyboard$super = this.handleKeyboard; - this.handleKeyboard = function(data, hashId, key, keyCode) { - if (((hashId === 1/*ctrl*/ || hashId === 8/*command*/) && key === 'v') - || (hashId === 1/*ctrl*/ && key === 'y')) return null; + this.handleKeyboard = function (data, hashId, key, keyCode) { + if (((hashId === 1 /*ctrl*/ || hashId === 8 /*command*/) && key === 'v') + || (hashId === 1 /*ctrl*/ && key === 'y')) + return null; var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode); - if (cmd && cmd.command) { return cmd; } + if (cmd && cmd.command) { + return cmd; + } if (hashId == -1) { var extendCmd = this.commands.extendSearchTerm; - if (extendCmd) { return {command: extendCmd, args: key}; } + if (extendCmd) { + return { command: extendCmd, args: key }; + } } return false; }; - }).call(IncrementalSearchKeyboardHandler.prototype); - - exports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler; }); -define("ace/incremental_search",["require","exports","module","ace/lib/oop","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module) { -"use strict"; - -var oop = require("./lib/oop"); +define("ace/incremental_search",["require","exports","module","ace/range","ace/search","ace/search_highlight","ace/commands/incremental_search_commands","ace/lib/dom","ace/commands/command_manager","ace/editor","ace/config"], function(require, exports, module){"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); var Range = require("./range").Range; var Search = require("./search").Search; var SearchHighlight = require("./search_highlight").SearchHighlight; var iSearchCommandModule = require("./commands/incremental_search_commands"); var ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler; -function IncrementalSearch() { - this.$options = {wrap: false, skipCurrent: false}; - this.$keyboardHandler = new ISearchKbd(this); -} - -oop.inherits(IncrementalSearch, Search); - function isRegExp(obj) { return obj instanceof RegExp; } - function regExpToObject(re) { - var string = String(re), - start = string.indexOf('/'), - flagStart = string.lastIndexOf('/'); + var string = String(re), start = string.indexOf('/'), flagStart = string.lastIndexOf('/'); return { - expression: string.slice(start+1, flagStart), - flags: string.slice(flagStart+1) + expression: string.slice(start + 1, flagStart), + flags: string.slice(flagStart + 1) }; } - function stringToRegExp(string, flags) { try { return new RegExp(string, flags); - } catch (e) { return string; } + } + catch (e) { + return string; + } } - function objectToRegExp(obj) { return stringToRegExp(obj.expression, obj.flags); } - -(function() { - - this.activate = function(editor, backwards) { +var IncrementalSearch = /** @class */ (function (_super) { + __extends(IncrementalSearch, _super); + function IncrementalSearch() { + var _this = _super.call(this) || this; + _this.$options = { wrap: false, skipCurrent: false }; + _this.$keyboardHandler = new ISearchKbd(_this); + return _this; + } + IncrementalSearch.prototype.activate = function (editor, backwards) { this.$editor = editor; this.$startPos = this.$currentPos = editor.getCursorPosition(); this.$options.needle = ''; this.$options.backwards = backwards; editor.keyBinding.addKeyboardHandler(this.$keyboardHandler); - this.$originalEditorOnPaste = editor.onPaste; + this.$originalEditorOnPaste = editor.onPaste; editor.onPaste = this.onPaste.bind(this); this.$mousedownHandler = editor.on('mousedown', this.onMouseDown.bind(this)); this.selectionFix(editor); this.statusMessage(true); }; - - this.deactivate = function(reset) { + IncrementalSearch.prototype.deactivate = function (reset) { this.cancelSearch(reset); var editor = this.$editor; editor.keyBinding.removeKeyboardHandler(this.$keyboardHandler); @@ -430,37 +424,33 @@ function objectToRegExp(obj) { editor.onPaste = this.$originalEditorOnPaste; this.message(''); }; - - this.selectionFix = function(editor) { + IncrementalSearch.prototype.selectionFix = function (editor) { if (editor.selection.isEmpty() && !editor.session.$emacsMark) { editor.clearSelection(); } }; - - this.highlight = function(regexp) { - var sess = this.$editor.session, - hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker( - new SearchHighlight(null, "ace_isearch-result", "text")); + IncrementalSearch.prototype.highlight = function (regexp) { + var sess = this.$editor.session, hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker(new SearchHighlight(null, "ace_isearch-result", "text")); hl.setRegexp(regexp); sess._emit("changeBackMarker"); // force highlight layer redraw }; - - this.cancelSearch = function(reset) { + IncrementalSearch.prototype.cancelSearch = function (reset) { var e = this.$editor; this.$prevNeedle = this.$options.needle; this.$options.needle = ''; if (reset) { e.moveCursorToPosition(this.$startPos); this.$currentPos = this.$startPos; - } else { + } + else { e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false); } this.highlight(null); return Range.fromPoints(this.$currentPos, this.$currentPos); }; - - this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) { - if (!this.$editor) return null; + IncrementalSearch.prototype.highlightAndFindWithNeedle = function (moveToNext, needleUpdateFunc) { + if (!this.$editor) + return null; var options = this.$options; if (needleUpdateFunc) { options.needle = needleUpdateFunc.call(this, options.needle || '') || ''; @@ -470,113 +460,86 @@ function objectToRegExp(obj) { return this.cancelSearch(true); } options.start = this.$currentPos; - var session = this.$editor.session, - found = this.find(session), - shouldSelect = this.$editor.emacsMark ? - !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); + var session = this.$editor.session, found = this.find(session), shouldSelect = this.$editor.emacsMark ? + !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty(); if (found) { - if (options.backwards) found = Range.fromPoints(found.end, found.start); + if (options.backwards) + found = Range.fromPoints(found.end, found.start); this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end)); - if (moveToNext) this.$currentPos = found.end; + if (moveToNext) + this.$currentPos = found.end; this.highlight(options.re); } - this.statusMessage(found); - return found; }; - - this.addString = function(s) { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.addString = function (s) { + return this.highlightAndFindWithNeedle(false, function (needle) { if (!isRegExp(needle)) - return needle + s; + return needle + s; var reObj = regExpToObject(needle); reObj.expression += s; return objectToRegExp(reObj); }); }; - - this.removeChar = function(c) { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.removeChar = function (c) { + return this.highlightAndFindWithNeedle(false, function (needle) { if (!isRegExp(needle)) - return needle.substring(0, needle.length-1); + return needle.substring(0, needle.length - 1); var reObj = regExpToObject(needle); - reObj.expression = reObj.expression.substring(0, reObj.expression.length-1); + reObj.expression = reObj.expression.substring(0, reObj.expression.length - 1); return objectToRegExp(reObj); }); }; - - this.next = function(options) { + IncrementalSearch.prototype.next = function (options) { options = options || {}; this.$options.backwards = !!options.backwards; this.$currentPos = this.$editor.getCursorPosition(); - return this.highlightAndFindWithNeedle(true, function(needle) { + return this.highlightAndFindWithNeedle(true, function (needle) { return options.useCurrentOrPrevSearch && needle.length === 0 ? this.$prevNeedle || '' : needle; }); }; - - this.onMouseDown = function(evt) { + IncrementalSearch.prototype.onMouseDown = function (evt) { this.deactivate(); return true; }; - - this.onPaste = function(text) { + IncrementalSearch.prototype.onPaste = function (text) { this.addString(text); }; - - this.convertNeedleToRegExp = function() { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.convertNeedleToRegExp = function () { + return this.highlightAndFindWithNeedle(false, function (needle) { return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig'); }); }; - - this.convertNeedleToString = function() { - return this.highlightAndFindWithNeedle(false, function(needle) { + IncrementalSearch.prototype.convertNeedleToString = function () { + return this.highlightAndFindWithNeedle(false, function (needle) { return isRegExp(needle) ? regExpToObject(needle).expression : needle; }); }; - - this.statusMessage = function(found) { + IncrementalSearch.prototype.statusMessage = function (found) { var options = this.$options, msg = ''; msg += options.backwards ? 'reverse-' : ''; msg += 'isearch: ' + options.needle; msg += found ? '' : ' (not found)'; this.message(msg); }; - - this.message = function(msg) { + IncrementalSearch.prototype.message = function (msg) { if (this.$editor.showCommandLine) { this.$editor.showCommandLine(msg); this.$editor.focus(); } }; - -}).call(IncrementalSearch.prototype); - - + return IncrementalSearch; +}(Search)); exports.IncrementalSearch = IncrementalSearch; - var dom = require('./lib/dom'); -dom.importCssString("\ -.ace_marker-layer .ace_isearch-result {\ - position: absolute;\ - z-index: 6;\ - box-sizing: border-box;\ -}\ -div.ace_isearch-result {\ - border-radius: 4px;\ - background-color: rgba(255, 200, 0, 0.5);\ - box-shadow: 0 0 4px rgb(255, 200, 0);\ -}\ -.ace_dark div.ace_isearch-result {\ - background-color: rgb(100, 110, 160);\ - box-shadow: 0 0 4px rgb(80, 90, 140);\ -}", "incremental-search-highlighting", false); +dom.importCssString("\n.ace_marker-layer .ace_isearch-result {\n position: absolute;\n z-index: 6;\n box-sizing: border-box;\n}\ndiv.ace_isearch-result {\n border-radius: 4px;\n background-color: rgba(255, 200, 0, 0.5);\n box-shadow: 0 0 4px rgb(255, 200, 0);\n}\n.ace_dark div.ace_isearch-result {\n background-color: rgb(100, 110, 160);\n box-shadow: 0 0 4px rgb(80, 90, 140);\n}", "incremental-search-highlighting", false); var commands = require("./commands/command_manager"); -(function() { - this.setupIncrementalSearch = function(editor, val) { - if (this.usesIncrementalSearch == val) return; +(function () { + this.setupIncrementalSearch = function (editor, val) { + if (this.usesIncrementalSearch == val) + return; this.usesIncrementalSearch = val; var iSearchCommands = iSearchCommandModule.iSearchStartCommands; var method = val ? 'addCommands' : 'removeCommands'; @@ -586,114 +549,72 @@ var commands = require("./commands/command_manager"); var Editor = require("./editor").Editor; require("./config").defineOptions(Editor.prototype, "editor", { useIncrementalSearch: { - set: function(val) { - this.keyBinding.$handlers.forEach(function(handler) { + set: function (val) { + this.keyBinding.$handlers.forEach(function (handler) { if (handler.setupIncrementalSearch) { handler.setupIncrementalSearch(this, val); } }); - this._emit('incrementalSearchSettingChanged', {isEnabled: val}); + this._emit('incrementalSearchSettingChanged', { isEnabled: val }); } } }); }); -define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/emacs",["require","exports","module","ace/lib/dom","ace/incremental_search","ace/commands/incremental_search_commands","ace/keyboard/hash_handler","ace/lib/keys"], function(require, exports, module){"use strict"; var dom = require("../lib/dom"); require("../incremental_search"); var iSearchCommandModule = require("../commands/incremental_search_commands"); - - var HashHandler = require("./hash_handler").HashHandler; exports.handler = new HashHandler(); - exports.handler.isEmacs = true; exports.handler.$id = "ace/keyboard/emacs"; - -var initialized = false; +dom.importCssString("\n.emacs-mode .ace_cursor{\n border: 1px rgba(50,250,50,0.8) solid!important;\n box-sizing: border-box!important;\n background-color: rgba(0,250,0,0.9);\n opacity: 0.5;\n}\n.emacs-mode .ace_hidden-cursors .ace_cursor{\n opacity: 1;\n background-color: transparent;\n}\n.emacs-mode .ace_overwrite-cursors .ace_cursor {\n opacity: 1;\n background-color: transparent;\n border-width: 0 0 2px 2px !important;\n}\n.emacs-mode .ace_text-layer {\n z-index: 4\n}\n.emacs-mode .ace_cursor-layer {\n z-index: 2\n}", 'emacsMode', false); var $formerLongWords; var $formerLineStart; - -exports.handler.attach = function(editor) { - if (!initialized) { - initialized = true; - dom.importCssString('\ - .emacs-mode .ace_cursor{\ - border: 1px rgba(50,250,50,0.8) solid!important;\ - box-sizing: border-box!important;\ - background-color: rgba(0,250,0,0.9);\ - opacity: 0.5;\ - }\ - .emacs-mode .ace_hidden-cursors .ace_cursor{\ - opacity: 1;\ - background-color: transparent;\ - }\ - .emacs-mode .ace_overwrite-cursors .ace_cursor {\ - opacity: 1;\ - background-color: transparent;\ - border-width: 0 0 2px 2px !important;\ - }\ - .emacs-mode .ace_text-layer {\ - z-index: 4\ - }\ - .emacs-mode .ace_cursor-layer {\ - z-index: 2\ - }', 'emacsMode' - ); - } +exports.handler.attach = function (editor) { $formerLongWords = editor.session.$selectLongWords; editor.session.$selectLongWords = true; $formerLineStart = editor.session.$useEmacsStyleLineStart; editor.session.$useEmacsStyleLineStart = true; - editor.session.$emacsMark = null; // the active mark editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || []; - - editor.emacsMark = function() { + editor.emacsMark = function () { return this.session.$emacsMark; }; - - editor.setEmacsMark = function(p) { + editor.setEmacsMark = function (p) { this.session.$emacsMark = p; }; - - editor.pushEmacsMark = function(p, activate) { + editor.pushEmacsMark = function (p, activate) { var prevMark = this.session.$emacsMark; if (prevMark) - this.session.$emacsMarkRing.push(prevMark); - if (!p || activate) this.setEmacsMark(p); - else this.session.$emacsMarkRing.push(p); + pushUnique(this.session.$emacsMarkRing, prevMark); + if (!p || activate) + this.setEmacsMark(p); + else + pushUnique(this.session.$emacsMarkRing, p); }; - - editor.popEmacsMark = function() { + editor.popEmacsMark = function () { var mark = this.emacsMark(); - if (mark) { this.setEmacsMark(null); return mark; } + if (mark) { + this.setEmacsMark(null); + return mark; + } return this.session.$emacsMarkRing.pop(); }; - - editor.getLastEmacsMark = function(p) { + editor.getLastEmacsMark = function (p) { return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0]; }; - - editor.emacsMarkForSelection = function(replacement) { - var sel = this.selection, - multiRangeLength = this.multiSelect ? - this.multiSelect.getAllRanges().length : 1, - selIndex = sel.index || 0, - markRing = this.session.$emacsMarkRing, - markIndex = markRing.length - (multiRangeLength - selIndex), - lastMark = markRing[markIndex] || sel.anchor; + editor.emacsMarkForSelection = function (replacement) { + var sel = this.selection, multiRangeLength = this.multiSelect ? + this.multiSelect.getAllRanges().length : 1, selIndex = sel.index || 0, markRing = this.session.$emacsMarkRing, markIndex = markRing.length - (multiRangeLength - selIndex), lastMark = markRing[markIndex] || sel.anchor; if (replacement) { - markRing.splice(markIndex, 1, - "row" in replacement && "column" in replacement ? - replacement : undefined); + markRing.splice(markIndex, 1, "row" in replacement && "column" in replacement ? + replacement : undefined); } return lastMark; }; - editor.on("click", $resetMarkMode); editor.on("changeSession", $kbSessionChange); editor.renderer.$blockCursor = true; @@ -704,8 +625,14 @@ exports.handler.attach = function(editor) { editor.on('copy', this.onCopy); editor.on('paste', this.onPaste); }; - -exports.handler.detach = function(editor) { +function pushUnique(ring, mark) { + var last = ring[ring.length - 1]; + if (last && last.row === mark.row && last.column === mark.column) { + return; + } + ring.push(mark); +} +exports.handler.detach = function (editor) { editor.renderer.$blockCursor = false; editor.session.$selectLongWords = $formerLongWords; editor.session.$useEmacsStyleLineStart = $formerLineStart; @@ -717,85 +644,76 @@ exports.handler.detach = function(editor) { editor.off('paste', this.onPaste); editor.$emacsModeHandler = null; }; - -var $kbSessionChange = function(e) { +var $kbSessionChange = function (e) { if (e.oldSession) { e.oldSession.$selectLongWords = $formerLongWords; e.oldSession.$useEmacsStyleLineStart = $formerLineStart; } - $formerLongWords = e.session.$selectLongWords; e.session.$selectLongWords = true; $formerLineStart = e.session.$useEmacsStyleLineStart; e.session.$useEmacsStyleLineStart = true; - if (!e.session.hasOwnProperty('$emacsMark')) e.session.$emacsMark = null; if (!e.session.hasOwnProperty('$emacsMarkRing')) e.session.$emacsMarkRing = []; }; - -var $resetMarkMode = function(e) { +var $resetMarkMode = function (e) { e.editor.session.$emacsMark = null; }; - var keys = require("../lib/keys").KEY_MODS; -var eMods = {C: "ctrl", S: "shift", M: "alt", CMD: "command"}; +var eMods = { C: "ctrl", S: "shift", M: "alt", CMD: "command" }; var combinations = ["C-S-M-CMD", - "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", - "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", - "CMD", "M", "S", "C"]; -combinations.forEach(function(c) { + "S-M-CMD", "C-M-CMD", "C-S-CMD", "C-S-M", + "M-CMD", "S-CMD", "S-M", "C-CMD", "C-M", "C-S", + "CMD", "M", "S", "C"]; +combinations.forEach(function (c) { var hashId = 0; - c.split("-").forEach(function(c) { + c.split("-").forEach(function (c) { hashId = hashId | keys[eMods[c]]; }); eMods[hashId] = c.toLowerCase() + "-"; }); - -exports.handler.onCopy = function(e, editor) { - if (editor.$handlesEmacsOnCopy) return; +exports.handler.onCopy = function (e, editor) { + if (editor.$handlesEmacsOnCopy) + return; editor.$handlesEmacsOnCopy = true; exports.handler.commands.killRingSave.exec(editor); editor.$handlesEmacsOnCopy = false; }; - -exports.handler.onPaste = function(e, editor) { +exports.handler.onPaste = function (e, editor) { editor.pushEmacsMark(editor.getCursorPosition()); }; - -exports.handler.bindKey = function(key, command) { +exports.handler.bindKey = function (key, command) { if (typeof key == "object") key = key[this.platform]; if (!key) return; - var ckb = this.commandKeyBinding; - key.split("|").forEach(function(keyPart) { + key.split("|").forEach(function (keyPart) { keyPart = keyPart.toLowerCase(); ckb[keyPart] = command; - var keyParts = keyPart.split(" ").slice(0,-1); - keyParts.reduce(function(keyMapKeys, keyPart, i) { - var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : ''; + var keyParts = keyPart.split(" ").slice(0, -1); + keyParts.reduce(function (keyMapKeys, keyPart, i) { + var prefix = keyMapKeys[i - 1] ? keyMapKeys[i - 1] + ' ' : ''; return keyMapKeys.concat([prefix + keyPart]); - }, []).forEach(function(keyPart) { - if (!ckb[keyPart]) ckb[keyPart] = "null"; + }, []).forEach(function (keyPart) { + if (!ckb[keyPart]) + ckb[keyPart] = "null"; }); }, this); }; - -exports.handler.getStatusText = function(editor, data) { - var str = ""; - if (data.count) - str += data.count; - if (data.keyChain) - str += " " + data.keyChain; - return str; +exports.handler.getStatusText = function (editor, data) { + var str = ""; + if (data.count) + str += data.count; + if (data.keyChain) + str += " " + data.keyChain; + return str; }; - -exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { - if (keyCode === -1) return undefined; - +exports.handler.handleKeyboard = function (data, hashId, key, keyCode) { + if (keyCode === -1) + return undefined; var editor = data.editor; editor._signal("changeStatus"); if (hashId == -1) { @@ -803,40 +721,42 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { if (data.count) { var str = new Array(data.count + 1).join(key); data.count = null; - return {command: "insertstring", args: str}; + return { command: "insertstring", args: str }; } } - var modifier = eMods[hashId]; if (modifier == "c-" || data.count) { var count = parseInt(key[key.length - 1]); if (typeof count === 'number' && !isNaN(count)) { data.count = Math.max(data.count, 0) || 0; data.count = 10 * data.count + count; - return {command: "null"}; + return { command: "null" }; } } - if (modifier) key = modifier + key; - if (data.keyChain) key = data.keyChain += " " + key; + if (modifier) + key = modifier + key; + if (data.keyChain) + key = data.keyChain += " " + key; var command = this.commandKeyBinding[key]; data.keyChain = command == "null" ? key : ""; - if (!command) return undefined; - if (command === "null") return {command: "null"}; - + if (!command) + return undefined; + if (command === "null") + return { command: "null" }; if (command === "universalArgument") { data.count = -4; - return {command: "null"}; + return { command: "null" }; } var args; if (typeof command !== "string") { args = command.args; - if (command.command) command = command.command; + if (command.command) + command = command.command; if (command === "goorselect") { command = editor.emacsMark() ? args[1] : args[0]; args = null; } } - if (typeof command === "string") { if (command === "insertstring" || command === "splitline" || @@ -844,15 +764,13 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { editor.pushEmacsMark(); } command = this.commands[command] || editor.commands.commands[command]; - if (!command) return undefined; + if (!command) + return undefined; } - if (!command.readOnly && !command.isYank) data.lastCommand = null; - if (!command.readOnly && editor.emacsMark()) editor.setEmacsMark(null); - if (data.count) { var count = data.count; data.count = 0; @@ -860,147 +778,134 @@ exports.handler.handleKeyboard = function(data, hashId, key, keyCode) { return { args: args, command: { - exec: function(editor, args) { + exec: function (editor, args) { for (var i = 0; i < count; i++) command.exec(editor, args); }, multiSelectAction: command.multiSelectAction } }; - } else { - if (!args) args = {}; - if (typeof args === 'object') args.count = count; + } + else { + if (!args) + args = {}; + if (typeof args === 'object') + args.count = count; } } - - return {command: command, args: args}; + return { command: command, args: args }; }; - exports.emacsKeys = { - "Up|C-p" : {command: "goorselect", args: ["golineup","selectup"]}, - "Down|C-n" : {command: "goorselect", args: ["golinedown","selectdown"]}, - "Left|C-b" : {command: "goorselect", args: ["gotoleft","selectleft"]}, - "Right|C-f" : {command: "goorselect", args: ["gotoright","selectright"]}, - "C-Left|M-b" : {command: "goorselect", args: ["gotowordleft","selectwordleft"]}, - "C-Right|M-f" : {command: "goorselect", args: ["gotowordright","selectwordright"]}, - "Home|C-a" : {command: "goorselect", args: ["gotolinestart","selecttolinestart"]}, - "End|C-e" : {command: "goorselect", args: ["gotolineend","selecttolineend"]}, - "C-Home|S-M-,": {command: "goorselect", args: ["gotostart","selecttostart"]}, - "C-End|S-M-." : {command: "goorselect", args: ["gotoend","selecttoend"]}, - "S-Up|S-C-p" : "selectup", - "S-Down|S-C-n" : "selectdown", - "S-Left|S-C-b" : "selectleft", - "S-Right|S-C-f" : "selectright", - "S-C-Left|S-M-b" : "selectwordleft", - "S-C-Right|S-M-f" : "selectwordright", - "S-Home|S-C-a" : "selecttolinestart", - "S-End|S-C-e" : "selecttolineend", - "S-C-Home" : "selecttostart", - "S-C-End" : "selecttoend", - - "C-l" : "recenterTopBottom", - "M-s" : "centerselection", + "Up|C-p": { command: "goorselect", args: ["golineup", "selectup"] }, + "Down|C-n": { command: "goorselect", args: ["golinedown", "selectdown"] }, + "Left|C-b": { command: "goorselect", args: ["gotoleft", "selectleft"] }, + "Right|C-f": { command: "goorselect", args: ["gotoright", "selectright"] }, + "C-Left|M-b": { command: "goorselect", args: ["gotowordleft", "selectwordleft"] }, + "C-Right|M-f": { command: "goorselect", args: ["gotowordright", "selectwordright"] }, + "Home|C-a": { command: "goorselect", args: ["gotolinestart", "selecttolinestart"] }, + "End|C-e": { command: "goorselect", args: ["gotolineend", "selecttolineend"] }, + "C-Home|S-M-,": { command: "goorselect", args: ["gotostart", "selecttostart"] }, + "C-End|S-M-.": { command: "goorselect", args: ["gotoend", "selecttoend"] }, + "S-Up|S-C-p": "selectup", + "S-Down|S-C-n": "selectdown", + "S-Left|S-C-b": "selectleft", + "S-Right|S-C-f": "selectright", + "S-C-Left|S-M-b": "selectwordleft", + "S-C-Right|S-M-f": "selectwordright", + "S-Home|S-C-a": "selecttolinestart", + "S-End|S-C-e": "selecttolineend", + "S-C-Home": "selecttostart", + "S-C-End": "selecttoend", + "C-l": "recenterTopBottom", + "M-s": "centerselection", "M-g": "gotoline", "C-x C-p": "selectall", - "C-Down": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, - "C-Up": {command: "goorselect", args: ["gotopageup","selectpageup"]}, - "PageDown|C-v": {command: "goorselect", args: ["gotopagedown","selectpagedown"]}, - "PageUp|M-v": {command: "goorselect", args: ["gotopageup","selectpageup"]}, + "C-Down": { command: "goorselect", args: ["gotopagedown", "selectpagedown"] }, + "C-Up": { command: "goorselect", args: ["gotopageup", "selectpageup"] }, + "PageDown|C-v": { command: "goorselect", args: ["gotopagedown", "selectpagedown"] }, + "PageUp|M-v": { command: "goorselect", args: ["gotopageup", "selectpageup"] }, "S-C-Down": "selectpagedown", "S-C-Up": "selectpageup", - "C-s": "iSearch", "C-r": "iSearchBackwards", - "M-C-s": "findnext", "M-C-r": "findprevious", "S-M-5": "replace", "Backspace": "backspace", "Delete|C-d": "del", - "Return|C-m": {command: "insertstring", args: "\n"}, // "newline" + "Return|C-m": { command: "insertstring", args: "\n" }, // "newline" "C-o": "splitline", - - "M-d|C-Delete": {command: "killWord", args: "right"}, - "C-Backspace|M-Backspace|M-Delete": {command: "killWord", args: "left"}, + "M-d|C-Delete": { command: "killWord", args: "right" }, + "C-Backspace|M-Backspace|M-Delete": { command: "killWord", args: "left" }, "C-k": "killLine", - "C-y|S-Delete": "yank", "M-y": "yankRotate", "C-g": "keyboardQuit", - "C-w|C-S-W": "killRegion", "M-w": "killRingSave", "C-Space": "setMark", "C-x C-x": "exchangePointAndMark", - "C-t": "transposeletters", - "M-u": "touppercase", // Doesn't work + "M-u": "touppercase", // Doesn't work "M-l": "tolowercase", - "M-/": "autocomplete", // Doesn't work + "M-/": "autocomplete", // Doesn't work "C-u": "universalArgument", - "M-;": "togglecomment", - "C-/|C-x u|S-C--|C-z": "undo", "S-C-/|S-C-x u|C--|S-C-z": "redo", // infinite undo? - "C-x r": "selectRectangularRegion", - "M-x": {command: "focusCommandLine", args: "M-x "} + "C-x r": "selectRectangularRegion", + "M-x": { command: "focusCommandLine", args: "M-x " } }; - - exports.handler.bindKeys(exports.emacsKeys); - exports.handler.addCommands({ - recenterTopBottom: function(editor) { + recenterTopBottom: function (editor) { var renderer = editor.renderer; var pos = renderer.$cursorLayer.getPixelPosition(); var h = renderer.$size.scrollerHeight - renderer.lineHeight; var scrollTop = renderer.scrollTop; if (Math.abs(pos.top - scrollTop) < 2) { scrollTop = pos.top - h; - } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { + } + else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) { scrollTop = pos.top; - } else { + } + else { scrollTop = pos.top - h * 0.5; } editor.session.setScrollTop(scrollTop); }, - selectRectangularRegion: function(editor) { + selectRectangularRegion: function (editor) { editor.multiSelect.toggleBlockSelection(); }, - setMark: { - exec: function(editor, args) { - + setMark: { + exec: function (editor, args) { if (args && args.count) { - if (editor.inMultiSelectMode) editor.forEachSelection(moveToMark); - else moveToMark(); + if (editor.inMultiSelectMode) + editor.forEachSelection(moveToMark); + else + moveToMark(); moveToMark(); return; } - - var mark = editor.emacsMark(), - ranges = editor.selection.getAllRanges(), - rangePositions = ranges.map(function(r) { return {row: r.start.row, column: r.start.column}; }), - transientMarkModeActive = true, - hasNoSelection = ranges.every(function(range) { return range.isEmpty(); }); + var mark = editor.emacsMark(), ranges = editor.selection.getAllRanges(), rangePositions = ranges.map(function (r) { return { row: r.start.row, column: r.start.column }; }), transientMarkModeActive = true, hasNoSelection = ranges.every(function (range) { return range.isEmpty(); }); if (transientMarkModeActive && (mark || !hasNoSelection)) { - if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)}); - else editor.clearSelection(); - if (mark) editor.pushEmacsMark(null); + if (editor.inMultiSelectMode) + editor.forEachSelection({ exec: editor.clearSelection.bind(editor) }); + else + editor.clearSelection(); + if (mark) + editor.pushEmacsMark(null); return; } - if (!mark) { - rangePositions.forEach(function(pos) { editor.pushEmacsMark(pos); }); - editor.setEmacsMark(rangePositions[rangePositions.length-1]); + rangePositions.forEach(function (pos) { editor.pushEmacsMark(pos); }); + editor.setEmacsMark(rangePositions[rangePositions.length - 1]); return; } - function moveToMark() { var mark = editor.popEmacsMark(); mark && editor.moveCursorToPosition(mark); } - }, readOnly: true, handlesCount: true @@ -1012,12 +917,12 @@ exports.handler.addCommands({ sel.setSelectionRange(sel.getRange(), !sel.isBackwards()); return; } - if (args.count) { // replace mark and point - var pos = {row: sel.lead.row, column: sel.lead.column}; + var pos = { row: sel.lead.row, column: sel.lead.column }; sel.clearSelection(); sel.moveCursorToPosition(editor.emacsMarkForSelection(pos)); - } else { // create selection to last mark + } + else { // create selection to last mark sel.selectToPosition(editor.emacsMarkForSelection()); } }, @@ -1026,30 +931,27 @@ exports.handler.addCommands({ multiSelectAction: "forEach" }, killWord: { - exec: function(editor, dir) { + exec: function (editor, dir) { editor.clearSelection(); if (dir == "left") editor.selection.selectWordLeft(); else editor.selection.selectWordRight(); - var range = editor.getSelectionRange(); var text = editor.session.getTextRange(range); exports.killRing.add(text); - editor.session.remove(range); editor.clearSelection(); }, multiSelectAction: "forEach" }, - killLine: function(editor) { + killLine: function (editor) { editor.pushEmacsMark(null); editor.clearSelection(); var range = editor.getSelectionRange(); var line = editor.session.getLine(range.start.row); range.end.column = line.length; line = line.substr(range.start.column); - var foldLine = editor.session.getFoldLine(range.start.row); if (foldLine && range.end.row != foldLine.end.row) { range.end.row = foldLine.end.row; @@ -1065,15 +967,14 @@ exports.handler.addCommands({ exports.killRing.append(text); else exports.killRing.add(text); - editor.session.remove(range); editor.clearSelection(); }, - yank: function(editor) { + yank: function (editor) { editor.onPaste(exports.killRing.get() || ''); editor.keyBinding.$data.lastCommand = "yank"; }, - yankRotate: function(editor) { + yankRotate: function (editor) { if (editor.keyBinding.$data.lastCommand != "yank") return; editor.undo(); @@ -1082,7 +983,7 @@ exports.handler.addCommands({ editor.keyBinding.$data.lastCommand = "yank"; }, killRegion: { - exec: function(editor) { + exec: function (editor) { exports.killRing.add(editor.getCopyText()); editor.commands.byName.cut.exec(editor); editor.setEmacsMark(null); @@ -1091,69 +992,66 @@ exports.handler.addCommands({ multiSelectAction: "forEach" }, killRingSave: { - exec: function(editor) { - + exec: function (editor) { editor.$handlesEmacsOnCopy = true; - var marks = editor.session.$emacsMarkRing.slice(), - deselectedMarks = []; + var marks = editor.session.$emacsMarkRing.slice(), deselectedMarks = []; exports.killRing.add(editor.getCopyText()); - - setTimeout(function() { + setTimeout(function () { function deselect() { - var sel = editor.selection, range = sel.getRange(), - pos = sel.isBackwards() ? range.end : range.start; - deselectedMarks.push({row: pos.row, column: pos.column}); + var sel = editor.selection, range = sel.getRange(), pos = sel.isBackwards() ? range.end : range.start; + deselectedMarks.push({ row: pos.row, column: pos.column }); sel.clearSelection(); } editor.$handlesEmacsOnCopy = false; - if (editor.inMultiSelectMode) editor.forEachSelection({exec: deselect}); - else deselect(); + if (editor.inMultiSelectMode) + editor.forEachSelection({ exec: deselect }); + else + deselect(); editor.setEmacsMark(null); editor.session.$emacsMarkRing = marks.concat(deselectedMarks.reverse()); }, 0); }, readOnly: true }, - keyboardQuit: function(editor) { + keyboardQuit: function (editor) { editor.selection.clearSelection(); editor.setEmacsMark(null); editor.keyBinding.$data.count = null; }, - focusCommandLine: function(editor, arg) { + focusCommandLine: function (editor, arg) { if (editor.showCommandLine) editor.showCommandLine(arg); } }); - exports.handler.addCommands(iSearchCommandModule.iSearchStartCommands); - var commands = exports.handler.commands; commands.yank.isYank = true; commands.yankRotate.isYank = true; - exports.killRing = { $data: [], - add: function(str) { + add: function (str) { str && this.$data.push(str); if (this.$data.length > 30) this.$data.shift(); }, - append: function(str) { + append: function (str) { var idx = this.$data.length - 1; var text = this.$data[idx] || ""; - if (str) text += str; - if (text) this.$data[idx] = text; + if (str) + text += str; + if (text) + this.$data[idx] = text; }, - get: function(n) { + get: function (n) { n = n || 1; - return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\n'); + return this.$data.slice(this.$data.length - n, this.$data.length).reverse().join('\n'); }, - pop: function() { + pop: function () { if (this.$data.length > 1) this.$data.pop(); return this.get(); }, - rotate: function() { + rotate: function () { this.$data.unshift(this.$data.pop()); return this.get(); } diff --git a/app/Resources/ui/js/ace/keybinding-sublime.js b/app/Resources/ui/js/ace/keybinding-sublime.js index 21fcb38..be4430e 100644 --- a/app/Resources/ui/js/ace/keybinding-sublime.js +++ b/app/Resources/ui/js/ace/keybinding-sublime.js @@ -1,20 +1,17 @@ -define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/sublime",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module){"use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; - function moveBySubWords(editor, direction, extend) { var selection = editor.selection; var row = selection.lead.row; var column = selection.lead.column; - var line = editor.session.getLine(row); if (!line[column + direction]) { var method = (extend ? "selectWord" : "moveCursorShortWord") + (direction == 1 ? "Right" : "Left"); return editor.selection[method](); } - if (direction == -1) column--; + if (direction == -1) + column--; while (line[column]) { var type = getType(line[column]) + getType(line[column + direction]); column += direction; @@ -27,7 +24,8 @@ function moveBySubWords(editor, direction, extend) { if (getType(line[column - 1]) == "W") { column -= 1; break; - } else { + } + else { continue; } } @@ -37,375 +35,364 @@ function moveBySubWords(editor, direction, extend) { if (/w[s_oW]|_[sWo]|o[s_wW]|s[W]|W[so]/.test(type)) break; } - if (direction == -1) column++; + if (direction == -1) + column++; if (extend) editor.selection.moveCursorTo(row, column); else editor.selection.moveTo(row, column); - function getType(x) { - if (!x) return "-"; - if (/\s/.test(x)) return "s"; - if (x == "_") return "_"; - if (x.toUpperCase() == x && x.toLowerCase() != x) return "W"; - if (x.toUpperCase() != x && x.toLowerCase() == x) return "w"; + if (!x) + return "-"; + if (/\s/.test(x)) + return "s"; + if (x == "_") + return "_"; + if (x.toUpperCase() == x && x.toLowerCase() != x) + return "W"; + if (x.toUpperCase() != x && x.toLowerCase() == x) + return "w"; return "o"; } } - exports.handler = new HashHandler(); - exports.handler.addCommands([{ - name: "find_all_under", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findAll(); + name: "find_all_under", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findAll(); + }, + readOnly: true + }, { + name: "find_under", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findNext(); + }, + readOnly: true + }, { + name: "find_under_prev", + exec: function (editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + editor.findPrevious(); + }, + readOnly: true + }, { + name: "find_under_expand", + exec: function (editor) { + editor.selectMore(1, false, true); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "find_under_expand_skip", + exec: function (editor) { + editor.selectMore(1, true, true); + }, + scrollIntoView: "animate", + readOnly: true + }, { + name: "delete_to_hard_bol", + exec: function (editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: { row: pos.row, column: 0 }, + end: pos + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "delete_to_hard_eol", + exec: function (editor) { + var pos = editor.selection.getCursor(); + editor.session.remove({ + start: pos, + end: { row: pos.row, column: Infinity } + }); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "moveToWordStartLeft", + exec: function (editor) { + editor.selection.moveCursorLongWordLeft(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "moveToWordEndRight", + exec: function (editor) { + editor.selection.moveCursorLongWordRight(); + editor.clearSelection(); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectToWordStartLeft", + exec: function (editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordLeft); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectToWordEndRight", + exec: function (editor) { + var sel = editor.selection; + sel.$moveSelection(sel.moveCursorLongWordRight); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" + }, { + name: "selectSubWordRight", + exec: function (editor) { + moveBySubWords(editor, 1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "selectSubWordLeft", + exec: function (editor) { + moveBySubWords(editor, -1, true); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "moveSubWordRight", + exec: function (editor) { + moveBySubWords(editor, 1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }, { + name: "moveSubWordLeft", + exec: function (editor) { + moveBySubWords(editor, -1); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true + }]); +[{ + bindKey: { mac: "cmd-k cmd-backspace|cmd-backspace", win: "ctrl-shift-backspace|ctrl-k ctrl-backspace" }, + name: "removetolinestarthard" + }, { + bindKey: { mac: "cmd-k cmd-k|cmd-delete|ctrl-k", win: "ctrl-shift-delete|ctrl-k ctrl-k" }, + name: "removetolineendhard" + }, { + bindKey: { mac: "cmd-shift-d", win: "ctrl-shift-d" }, + name: "duplicateSelection" + }, { + bindKey: { mac: "cmd-l", win: "ctrl-l" }, + name: "expandtoline" }, - readOnly: true -}, { - name: "find_under", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findNext(); + { + bindKey: { mac: "cmd-shift-a", win: "ctrl-shift-a" }, + name: "expandSelection", + args: { to: "tag" } + }, { + bindKey: { mac: "cmd-shift-j", win: "ctrl-shift-j" }, + name: "expandSelection", + args: { to: "indentation" } + }, { + bindKey: { mac: "ctrl-shift-m", win: "ctrl-shift-m" }, + name: "expandSelection", + args: { to: "brackets" } + }, { + bindKey: { mac: "cmd-shift-space", win: "ctrl-shift-space" }, + name: "expandSelection", + args: { to: "scope" } }, - readOnly: true -}, { - name: "find_under_prev", - exec: function(editor) { - if (editor.selection.isEmpty()) - editor.selection.selectWord(); - editor.findPrevious(); + { + bindKey: { mac: "ctrl-cmd-g", win: "alt-f3" }, + name: "find_all_under" + }, { + bindKey: { mac: "alt-cmd-g", win: "ctrl-f3" }, + name: "find_under" + }, { + bindKey: { mac: "shift-alt-cmd-g", win: "ctrl-shift-f3" }, + name: "find_under_prev" + }, { + bindKey: { mac: "cmd-g", win: "f3" }, + name: "findnext" + }, { + bindKey: { mac: "shift-cmd-g", win: "shift-f3" }, + name: "findprevious" + }, { + bindKey: { mac: "cmd-d", win: "ctrl-d" }, + name: "find_under_expand" + }, { + bindKey: { mac: "cmd-k cmd-d", win: "ctrl-k ctrl-d" }, + name: "find_under_expand_skip" }, - readOnly: true -}, { - name: "find_under_expand", - exec: function(editor) { - editor.selectMore(1, false, true); + { + bindKey: { mac: "cmd-alt-[", win: "ctrl-shift-[" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "cmd-alt-]", win: "ctrl-shift-]" }, + name: "unfold" + }, { + bindKey: { mac: "cmd-k cmd-0|cmd-k cmd-j", win: "ctrl-k ctrl-0|ctrl-k ctrl-j" }, + name: "unfoldall" + }, { + bindKey: { mac: "cmd-k cmd-1", win: "ctrl-k ctrl-1" }, + name: "foldOther", + args: { level: 1 } }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "find_under_expand_skip", - exec: function(editor) { - editor.selectMore(1, true, true); + { + bindKey: { win: "ctrl-left", mac: "alt-left" }, + name: "moveToWordStartLeft" + }, { + bindKey: { win: "ctrl-right", mac: "alt-right" }, + name: "moveToWordEndRight" + }, { + bindKey: { win: "ctrl-shift-left", mac: "alt-shift-left" }, + name: "selectToWordStartLeft" + }, { + bindKey: { win: "ctrl-shift-right", mac: "alt-shift-right" }, + name: "selectToWordEndRight" }, - scrollIntoView: "animate", - readOnly: true -}, { - name: "delete_to_hard_bol", - exec: function(editor) { - var pos = editor.selection.getCursor(); - editor.session.remove({ - start: { row: pos.row, column: 0 }, - end: pos - }); + { + bindKey: { mac: "ctrl-alt-shift-right|ctrl-shift-right", win: "alt-shift-right" }, + name: "selectSubWordRight" + }, { + bindKey: { mac: "ctrl-alt-shift-left|ctrl-shift-left", win: "alt-shift-left" }, + name: "selectSubWordLeft" + }, { + bindKey: { mac: "ctrl-alt-right|ctrl-right", win: "alt-right" }, + name: "moveSubWordRight" + }, { + bindKey: { mac: "ctrl-alt-left|ctrl-left", win: "alt-left" }, + name: "moveSubWordLeft" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "delete_to_hard_eol", - exec: function(editor) { - var pos = editor.selection.getCursor(); - editor.session.remove({ - start: pos, - end: { row: pos.row, column: Infinity } - }); + { + bindKey: { mac: "ctrl-m", win: "ctrl-m" }, + name: "jumptomatching", + args: { to: "brackets" } }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "moveToWordStartLeft", - exec: function(editor) { - editor.selection.moveCursorLongWordLeft(); - editor.clearSelection(); + { + bindKey: { mac: "ctrl-f6", win: "ctrl-f6" }, + name: "goToNextError" + }, { + bindKey: { mac: "ctrl-shift-f6", win: "ctrl-shift-f6" }, + name: "goToPreviousError" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "moveToWordEndRight", - exec: function(editor) { - editor.selection.moveCursorLongWordRight(); - editor.clearSelection(); + { + bindKey: { mac: "ctrl-o" }, + name: "splitline" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectToWordStartLeft", - exec: function(editor) { - var sel = editor.selection; - sel.$moveSelection(sel.moveCursorLongWordLeft); + { + bindKey: { mac: "ctrl-shift-w", win: "alt-shift-w" }, + name: "surrowndWithTag" + }, { + bindKey: { mac: "cmd-alt-.", win: "alt-." }, + name: "close_tag" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectToWordEndRight", - exec: function(editor) { - var sel = editor.selection; - sel.$moveSelection(sel.moveCursorLongWordRight); + { + bindKey: { mac: "cmd-j", win: "ctrl-j" }, + name: "joinlines" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor" -}, { - name: "selectSubWordRight", - exec: function(editor) { - moveBySubWords(editor, 1, true); + { + bindKey: { mac: "ctrl--", win: "alt--" }, + name: "jumpBack" + }, { + bindKey: { mac: "ctrl-shift--", win: "alt-shift--" }, + name: "jumpForward" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "selectSubWordLeft", - exec: function(editor) { - moveBySubWords(editor, -1, true); + { + bindKey: { mac: "cmd-k cmd-l", win: "ctrl-k ctrl-l" }, + name: "tolowercase" + }, { + bindKey: { mac: "cmd-k cmd-u", win: "ctrl-k ctrl-u" }, + name: "touppercase" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "moveSubWordRight", - exec: function(editor) { - moveBySubWords(editor, 1); + { + bindKey: { mac: "cmd-shift-v", win: "ctrl-shift-v" }, + name: "paste_and_indent" + }, { + bindKey: { mac: "cmd-k cmd-v|cmd-alt-v", win: "ctrl-k ctrl-v" }, + name: "paste_from_history" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}, { - name: "moveSubWordLeft", - exec: function(editor) { - moveBySubWords(editor, -1); + { + bindKey: { mac: "cmd-shift-enter", win: "ctrl-shift-enter" }, + name: "addLineBefore" + }, { + bindKey: { mac: "cmd-enter", win: "ctrl-enter" }, + name: "addLineAfter" + }, { + bindKey: { mac: "ctrl-shift-k", win: "ctrl-shift-k" }, + name: "removeline" + }, { + bindKey: { mac: "ctrl-alt-up", win: "ctrl-up" }, + name: "scrollup" + }, { + bindKey: { mac: "ctrl-alt-down", win: "ctrl-down" }, + name: "scrolldown" + }, { + bindKey: { mac: "cmd-a", win: "ctrl-a" }, + name: "selectall" + }, { + bindKey: { linux: "alt-shift-down", mac: "ctrl-shift-down", win: "ctrl-alt-down" }, + name: "addCursorBelow" + }, { + bindKey: { linux: "alt-shift-up", mac: "ctrl-shift-up", win: "ctrl-alt-up" }, + name: "addCursorAbove" }, - multiSelectAction: "forEach", - scrollIntoView: "cursor", - readOnly: true -}]); - - -[{ - bindKey: { mac: "cmd-k cmd-backspace|cmd-backspace", win: "ctrl-shift-backspace|ctrl-k ctrl-backspace" }, - name: "removetolinestarthard" -}, { - bindKey: { mac: "cmd-k cmd-k|cmd-delete|ctrl-k", win: "ctrl-shift-delete|ctrl-k ctrl-k" }, - name: "removetolineendhard" -}, { - bindKey: { mac: "cmd-shift-d", win: "ctrl-shift-d" }, - name: "duplicateSelection" -}, { - bindKey: { mac: "cmd-l", win: "ctrl-l" }, - name: "expandtoline" -}, -{ - bindKey: {mac: "cmd-shift-a", win: "ctrl-shift-a"}, - name: "expandSelection", - args: {to: "tag"} -}, { - bindKey: {mac: "cmd-shift-j", win: "ctrl-shift-j"}, - name: "expandSelection", - args: {to: "indentation"} -}, { - bindKey: {mac: "ctrl-shift-m", win: "ctrl-shift-m"}, - name: "expandSelection", - args: {to: "brackets"} -}, { - bindKey: {mac: "cmd-shift-space", win: "ctrl-shift-space"}, - name: "expandSelection", - args: {to: "scope"} -}, -{ - bindKey: { mac: "ctrl-cmd-g", win: "alt-f3" }, - name: "find_all_under" -}, { - bindKey: { mac: "alt-cmd-g", win: "ctrl-f3" }, - name: "find_under" -}, { - bindKey: { mac: "shift-alt-cmd-g", win: "ctrl-shift-f3" }, - name: "find_under_prev" -}, { - bindKey: { mac: "cmd-g", win: "f3" }, - name: "findnext" -}, { - bindKey: { mac: "shift-cmd-g", win: "shift-f3" }, - name: "findprevious" -}, { - bindKey: { mac: "cmd-d", win: "ctrl-d" }, - name: "find_under_expand" -}, { - bindKey: { mac: "cmd-k cmd-d", win: "ctrl-k ctrl-d" }, - name: "find_under_expand_skip" -}, -{ - bindKey: { mac: "cmd-alt-[", win: "ctrl-shift-[" }, - name: "toggleFoldWidget" -}, { - bindKey: { mac: "cmd-alt-]", win: "ctrl-shift-]" }, - name: "unfold" -}, { - bindKey: { mac: "cmd-k cmd-0|cmd-k cmd-j", win: "ctrl-k ctrl-0|ctrl-k ctrl-j" }, - name: "unfoldall" -}, { - bindKey: { mac: "cmd-k cmd-1", win: "ctrl-k ctrl-1" }, - name: "foldOther", - args: { level: 1 } -}, -{ - bindKey: { win: "ctrl-left", mac: "alt-left" }, - name: "moveToWordStartLeft" -}, { - bindKey: { win: "ctrl-right", mac: "alt-right" }, - name: "moveToWordEndRight" -}, { - bindKey: { win: "ctrl-shift-left", mac: "alt-shift-left" }, - name: "selectToWordStartLeft" -}, { - bindKey: { win: "ctrl-shift-right", mac: "alt-shift-right" }, - name: "selectToWordEndRight" -}, -{ - bindKey: {mac: "ctrl-alt-shift-right|ctrl-shift-right", win: "alt-shift-right"}, - name: "selectSubWordRight" -}, { - bindKey: {mac: "ctrl-alt-shift-left|ctrl-shift-left", win: "alt-shift-left"}, - name: "selectSubWordLeft" -}, { - bindKey: {mac: "ctrl-alt-right|ctrl-right", win: "alt-right"}, - name: "moveSubWordRight" -}, { - bindKey: {mac: "ctrl-alt-left|ctrl-left", win: "alt-left"}, - name: "moveSubWordLeft" -}, -{ - bindKey: { mac: "ctrl-m", win: "ctrl-m" }, - name: "jumptomatching", - args: { to: "brackets" } -}, -{ - bindKey: { mac: "ctrl-f6", win: "ctrl-f6" }, - name: "goToNextError" -}, { - bindKey: { mac: "ctrl-shift-f6", win: "ctrl-shift-f6" }, - name: "goToPreviousError" -}, - -{ - bindKey: { mac: "ctrl-o" }, - name: "splitline" -}, -{ - bindKey: {mac: "ctrl-shift-w", win: "alt-shift-w"}, - name: "surrowndWithTag" -},{ - bindKey: {mac: "cmd-alt-.", win: "alt-."}, - name: "close_tag" -}, -{ - bindKey: { mac: "cmd-j", win: "ctrl-j" }, - name: "joinlines" -}, - -{ - bindKey: {mac: "ctrl--", win: "alt--"}, - name: "jumpBack" -}, { - bindKey: {mac: "ctrl-shift--", win: "alt-shift--"}, - name: "jumpForward" -}, - -{ - bindKey: { mac: "cmd-k cmd-l", win: "ctrl-k ctrl-l" }, - name: "tolowercase" -}, { - bindKey: { mac: "cmd-k cmd-u", win: "ctrl-k ctrl-u" }, - name: "touppercase" -}, - -{ - bindKey: {mac: "cmd-shift-v", win: "ctrl-shift-v"}, - name: "paste_and_indent" -}, { - bindKey: {mac: "cmd-k cmd-v|cmd-alt-v", win: "ctrl-k ctrl-v"}, - name: "paste_from_history" -}, - -{ - bindKey: { mac: "cmd-shift-enter", win: "ctrl-shift-enter" }, - name: "addLineBefore" -}, { - bindKey: { mac: "cmd-enter", win: "ctrl-enter" }, - name: "addLineAfter" -}, { - bindKey: { mac: "ctrl-shift-k", win: "ctrl-shift-k" }, - name: "removeline" -}, { - bindKey: { mac: "ctrl-alt-up", win: "ctrl-up" }, - name: "scrollup" -}, { - bindKey: { mac: "ctrl-alt-down", win: "ctrl-down" }, - name: "scrolldown" -}, { - bindKey: { mac: "cmd-a", win: "ctrl-a" }, - name: "selectall" -}, { - bindKey: { linux: "alt-shift-down", mac: "ctrl-shift-down", win: "ctrl-alt-down" }, - name: "addCursorBelow" -}, { - bindKey: { linux: "alt-shift-up", mac: "ctrl-shift-up", win: "ctrl-alt-up" }, - name: "addCursorAbove" -}, - - -{ - bindKey: { mac: "cmd-k cmd-c|ctrl-l", win: "ctrl-k ctrl-c" }, - name: "centerselection" -}, - -{ - bindKey: { mac: "f5", win: "f9" }, - name: "sortlines" -}, -{ - bindKey: {mac: "ctrl-f5", win: "ctrl-f9"}, - name: "sortlines", - args: {caseSensitive: true} -}, -{ - bindKey: { mac: "cmd-shift-l", win: "ctrl-shift-l" }, - name: "splitSelectionIntoLines" -}, { - bindKey: { mac: "ctrl-cmd-down", win: "ctrl-shift-down" }, - name: "movelinesdown" -}, { - bindKey: { mac: "ctrl-cmd-up", win: "ctrl-shift-up" }, - name: "movelinesup" -}, { - bindKey: { mac: "alt-down", win: "alt-down" }, - name: "modifyNumberDown" -}, { - bindKey: { mac: "alt-up", win: "alt-up" }, - name: "modifyNumberUp" -}, { - bindKey: { mac: "cmd-/", win: "ctrl-/" }, - name: "togglecomment" -}, { - bindKey: { mac: "cmd-alt-/", win: "ctrl-shift-/" }, - name: "toggleBlockComment" -}, - - -{ - bindKey: { linux: "ctrl-alt-q", mac: "ctrl-q", win: "ctrl-q" }, - name: "togglerecording" -}, { - bindKey: { linux: "ctrl-alt-shift-q", mac: "ctrl-shift-q", win: "ctrl-shift-q" }, - name: "replaymacro" -}, - -{ - bindKey: { mac: "ctrl-t", win: "ctrl-t" }, - name: "transpose" -} - -].forEach(function(binding) { + { + bindKey: { mac: "cmd-k cmd-c|ctrl-l", win: "ctrl-k ctrl-c" }, + name: "centerselection" + }, + { + bindKey: { mac: "f5", win: "f9" }, + name: "sortlines" + }, + { + bindKey: { mac: "ctrl-f5", win: "ctrl-f9" }, + name: "sortlines", + args: { caseSensitive: true } + }, + { + bindKey: { mac: "cmd-shift-l", win: "ctrl-shift-l" }, + name: "splitSelectionIntoLines" + }, { + bindKey: { mac: "ctrl-cmd-down", win: "ctrl-shift-down" }, + name: "movelinesdown" + }, { + bindKey: { mac: "ctrl-cmd-up", win: "ctrl-shift-up" }, + name: "movelinesup" + }, { + bindKey: { mac: "alt-down", win: "alt-down" }, + name: "modifyNumberDown" + }, { + bindKey: { mac: "alt-up", win: "alt-up" }, + name: "modifyNumberUp" + }, { + bindKey: { mac: "cmd-/", win: "ctrl-/" }, + name: "togglecomment" + }, { + bindKey: { mac: "cmd-alt-/", win: "ctrl-shift-/" }, + name: "toggleBlockComment" + }, + { + bindKey: { linux: "ctrl-alt-q", mac: "ctrl-q", win: "ctrl-q" }, + name: "togglerecording" + }, { + bindKey: { linux: "ctrl-alt-shift-q", mac: "ctrl-shift-q", win: "ctrl-shift-q" }, + name: "replaymacro" + }, + { + bindKey: { mac: "ctrl-t", win: "ctrl-t" }, + name: "transpose" + } +].forEach(function (binding) { var command = exports.handler.commands[binding.name]; if (command) command.bindKey = binding.bindKey; diff --git a/app/Resources/ui/js/ace/keybinding-vim.js b/app/Resources/ui/js/ace/keybinding-vim.js index bfb7e0b..d0cded1 100644 --- a/app/Resources/ui/js/ace/keybinding-vim.js +++ b/app/Resources/ui/js/ace/keybinding-vim.js @@ -1,47 +1,52 @@ -define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module) { +define("ace/ext/hardwrap",["require","exports","module","ace/range","ace/editor","ace/config"], function(require, exports, module){/** + * ## Text hard wrapping extension for automatic line breaking and text formatting. + * + * Provides intelligent line wrapping functionality that breaks long lines at configurable column limits while + * preserving indentation and optionally merging short adjacent lines. Supports both automatic wrapping during text + * input and manual formatting of selected text ranges. + * + * **Enable:** `editor.setOption("hardWrap", true)` + * or configure it during editor initialization in the options object. + * @module + */ "use strict"; - var Range = require("../range").Range; - function hardWrap(editor, options) { var max = options.column || editor.getOption("printMarginColumn"); var allowMerge = options.allowMerge != false; - var row = Math.min(options.startRow, options.endRow); var endRow = Math.max(options.startRow, options.endRow); - var session = editor.session; - while (row <= endRow) { var line = session.getLine(row); if (line.length > max) { var space = findSpace(line, max, 5); if (space) { var indentation = /^\s*/.exec(line)[0]; - session.replace(new Range(row,space.start,row,space.end), "\n" + indentation); + session.replace(new Range(row, space.start, row, space.end), "\n" + indentation); } endRow++; - } else if (allowMerge && /\S/.test(line) && row != endRow) { + } + else if (allowMerge && /\S/.test(line) && row != endRow) { var nextLine = session.getLine(row + 1); if (nextLine && /\S/.test(nextLine)) { var trimmedLine = line.replace(/\s+$/, ""); var trimmedNextLine = nextLine.replace(/^\s+/, ""); var mergedLine = trimmedLine + " " + trimmedNextLine; - var space = findSpace(mergedLine, max, 5); if (space && space.start > trimmedLine.length || mergedLine.length < max) { - var replaceRange = new Range(row,trimmedLine.length,row + 1,nextLine.length - trimmedNextLine.length); + var replaceRange = new Range(row, trimmedLine.length, row + 1, nextLine.length - trimmedNextLine.length); session.replace(replaceRange, " "); row--; endRow--; - } else if (trimmedLine.length < line.length) { + } + else if (trimmedLine.length < line.length) { session.remove(new Range(row, trimmedLine.length, row, line.length)); } } } row++; } - function findSpace(line, max, min) { if (line.length < max) return; @@ -73,92 +78,87 @@ function hardWrap(editor, options) { }; } if (spaceAfter && spaceAfter[2]) { - start = max + spaceAfter[2].length; + start = max + spaceAfter[2].length; return { start: start, end: start + spaceAfter[3].length }; } } - } - function wrapAfterInput(e) { if (e.command.name == "insertstring" && /\S/.test(e.args)) { var editor = e.editor; var cursor = editor.selection.cursor; - if (cursor.column <= editor.renderer.$printMarginColumn) return; + if (cursor.column <= editor.renderer.$printMarginColumn) + return; var lastDelta = editor.session.$undoManager.$lastDelta; - hardWrap(editor, { startRow: cursor.row, endRow: cursor.row, allowMerge: false }); - if (lastDelta != editor.session.$undoManager.$lastDelta) + if (lastDelta != editor.session.$undoManager.$lastDelta) editor.session.markUndoGroup(); } } - var Editor = require("../editor").Editor; require("../config").defineOptions(Editor.prototype, "editor", { hardWrap: { - set: function(val) { + set: function (val) { if (val) { this.commands.on("afterExec", wrapAfterInput); - } else { + } + else { this.commands.off("afterExec", wrapAfterInput); } }, value: false } }); - exports.hardWrap = hardWrap; }); -define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/ext/hardwrap","ace/multi_select"], function(require, exports, module) { - 'use strict'; - - function log() { +define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/dom","ace/lib/oop","ace/lib/keys","ace/lib/event","ace/search","ace/lib/useragent","ace/search_highlight","ace/commands/multi_select_commands","ace/mode/text","ace/ext/hardwrap","ace/multi_select"], function(require, exports, module){// CodeMirror, copyright (c) by Marijn Haverbeke and others +'use strict'; +function log() { var d = ""; function format(p) { - if (typeof p != "object") - return p + ""; - if ("line" in p) { - return p.line + ":" + p.ch; - } - if ("anchor" in p) { - return format(p.anchor) + "->" + format(p.head); - } - if (Array.isArray(p)) - return "[" + p.map(function(x) { - return format(x); - }) + "]"; - return JSON.stringify(p); + if (typeof p != "object") + return p + ""; + if ("line" in p) { + return p.line + ":" + p.ch; + } + if ("anchor" in p) { + return format(p.anchor) + "->" + format(p.head); + } + if (Array.isArray(p)) + return "[" + p.map(function (x) { + return format(x); + }) + "]"; + return JSON.stringify(p); } for (var i = 0; i < arguments.length; i++) { - var p = arguments[i]; - var f = format(p); - d += f + " "; + var p = arguments[i]; + var f = format(p); + d += f + " "; } console.log(d); - } - var Range = require("../range").Range; - var EventEmitter = require("../lib/event_emitter").EventEmitter; - var dom = require("../lib/dom"); - var oop = require("../lib/oop"); - var KEYS = require("../lib/keys"); - var event = require("../lib/event"); - var Search = require("../search").Search; - var useragent = require("../lib/useragent"); - var SearchHighlight = require("../search_highlight").SearchHighlight; - var multiSelectCommands = require("../commands/multi_select_commands"); - var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; - var hardWrap = require("../ext/hardwrap").hardWrap; - require("../multi_select"); - - var CodeMirror = function(ace) { +} +var Range = require("../range").Range; +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var domLib = require("../lib/dom"); +var oop = require("../lib/oop"); +var KEYS = require("../lib/keys"); +var event = require("../lib/event"); +var Search = require("../search").Search; +var useragent = require("../lib/useragent"); +var SearchHighlight = require("../search_highlight").SearchHighlight; +var multiSelectCommands = require("../commands/multi_select_commands"); +var TextModeTokenRe = require("../mode/text").Mode.prototype.tokenRe; +var hardWrap = require("../ext/hardwrap").hardWrap; +require("../multi_select"); +var CodeMirror = function (ace) { this.ace = ace; this.state = {}; this.marks = {}; @@ -170,836 +170,882 @@ define("ace/keyboard/vim",["require","exports","module","ace/range","ace/lib/eve this.ace.on('change', this.onChange); this.ace.on('changeSelection', this.onSelectionChange); this.ace.on('beforeEndOperation', this.onBeforeEndOperation); - }; - CodeMirror.Pos = function(line, ch) { - if (!(this instanceof Pos)) return new Pos(line, ch); - this.line = line; this.ch = ch; - }; - CodeMirror.defineOption = function(name, val, setter) {}; - CodeMirror.commands = { - redo: function(cm) { cm.ace.redo(); }, - undo: function(cm) { cm.ace.undo(); }, - newlineAndIndent: function(cm) { cm.ace.insert("\n"); }, - goLineLeft: function(cm) { cm.ace.selection.moveCursorLineStart(); }, - goLineRight: function(cm) { cm.ace.selection.moveCursorLineEnd(); } - }; - CodeMirror.keyMap = {}; - CodeMirror.addClass = CodeMirror.rmClass = function() {}; - CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent; - CodeMirror.keyName = function(e) { +}; +CodeMirror.Pos = function (line, ch) { + if (!(this instanceof Pos)) + return new Pos(line, ch); + this.line = line; + this.ch = ch; +}; +CodeMirror.defineOption = function (name, val, setter) { }; +CodeMirror.commands = { + redo: function (cm) { cm.ace.redo(); }, + undo: function (cm) { cm.ace.undo(); }, + newlineAndIndent: function (cm) { cm.ace.insert("\n"); }, + goLineLeft: function (cm) { cm.ace.selection.moveCursorLineStart(); }, + goLineRight: function (cm) { cm.ace.selection.moveCursorLineEnd(); } +}; +CodeMirror.keyMap = {}; +CodeMirror.addClass = CodeMirror.rmClass = function () { }; +CodeMirror.e_stop = CodeMirror.e_preventDefault = event.stopEvent; +CodeMirror.keyName = function (e) { var key = (KEYS[e.keyCode] || e.key || ""); - if (key.length == 1) key = key.toUpperCase(); - key = event.getModifierString(e).replace(/(^|-)\w/g, function(m) { - return m.toUpperCase(); + if (key.length == 1) + key = key.toUpperCase(); + key = event.getModifierString(e).replace(/(^|-)\w/g, function (m) { + return m.toUpperCase(); }) + key; return key; - }; - CodeMirror.keyMap['default'] = function(key) { - return function(cm) { - var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; - return cmd && cm.ace.execCommand(cmd) !== false; +}; +CodeMirror.keyMap['default'] = function (key) { + return function (cm) { + var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()]; + return cmd && cm.ace.execCommand(cmd) !== false; }; - }; - CodeMirror.lookupKey = function lookupKey(key, map, handle) { - if (!map) map = "default"; +}; +CodeMirror.lookupKey = function lookupKey(key, map, handle) { + if (!map) + map = "default"; if (typeof map == "string") - map = CodeMirror.keyMap[map]; + map = CodeMirror.keyMap[map] || CodeMirror.keyMap['default']; var found = typeof map == "function" ? map(key) : map[key]; - if (found === false) return "nothing"; - if (found === "...") return "multi"; - if (found != null && handle(found)) return "handled"; - + if (found === false) + return "nothing"; + if (found === "...") + return "multi"; + if (found != null && handle(found)) + return "handled"; if (map.fallthrough) { - if (!Array.isArray(map.fallthrough)) - return lookupKey(key, map.fallthrough, handle); - for (var i = 0; i < map.fallthrough.length; i++) { - var result = lookupKey(key, map.fallthrough[i], handle); - if (result) return result; - } - } - }; - - - CodeMirror.findMatchingTag = function(cm, head) { - - }; - - CodeMirror.signal = function(o, name, e) { return o._signal(name, e) }; - CodeMirror.on = event.addListener; - CodeMirror.off = event.removeListener; - CodeMirror.isWordChar = function(ch) { - if (ch < "\x7f") return /^\w$/.test(ch); + if (!Array.isArray(map.fallthrough)) + return lookupKey(key, map.fallthrough, handle); + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle); + if (result) + return result; + } + } +}; +CodeMirror.findMatchingTag = function (cm, head) { + return cm.findMatchingTag(head); +}; +CodeMirror.findEnclosingTag = function (cm, head) { +}; +CodeMirror.signal = function (o, name, e) { return o._signal(name, e); }; +CodeMirror.on = event.addListener; +CodeMirror.off = event.removeListener; +CodeMirror.isWordChar = function (ch) { + if (ch < "\x7f") + return /^\w$/.test(ch); TextModeTokenRe.lastIndex = 0; return TextModeTokenRe.test(ch); - }; - -(function() { - oop.implement(CodeMirror.prototype, EventEmitter); - - this.destroy = function() { - this.ace.off('change', this.onChange); - this.ace.off('changeSelection', this.onSelectionChange); - this.ace.off('beforeEndOperation', this.onBeforeEndOperation); - this.removeOverlay(); - }; - this.virtualSelectionMode = function() { - return this.ace.inVirtualSelectionMode && this.ace.selection.index; - }; - this.onChange = function(delta) { - var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; - var curOp = this.curOp = this.curOp || {}; - if (!curOp.changeHandlers) - curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); - if (!curOp.lastChange) { - curOp.lastChange = curOp.change = change; - } else { - curOp.lastChange.next = curOp.lastChange = change; - } - this.$updateMarkers(delta); - }; - this.onSelectionChange = function() { - var curOp = this.curOp = this.curOp || {}; - if (!curOp.cursorActivityHandlers) - curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); - this.curOp.cursorActivity = true; - if (this.ace.inMultiSelectMode) { - this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); - } - }; - this.operation = function(fn, force) { - if (!force && this.curOp || force && this.curOp && this.curOp.force) { - return fn(); - } - if (force || !this.ace.curOp) { - if (this.curOp) - this.onBeforeEndOperation(); - } - if (!this.ace.curOp) { - var prevOp = this.ace.prevOp; - this.ace.startOperation({ - command: { name: "vim", scrollIntoView: "cursor" } - }); - } - var curOp = this.curOp = this.curOp || {}; - this.curOp.force = force; - var result = fn(); - if (this.ace.curOp && this.ace.curOp.command.name == "vim") { - if (this.state.dialog) - this.ace.curOp.command.scrollIntoView = false; - this.ace.endOperation(); - if (!curOp.cursorActivity && !curOp.lastChange && prevOp) - this.ace.prevOp = prevOp; - } - if (force || !this.ace.curOp) { - if (this.curOp) - this.onBeforeEndOperation(); - } - return result; - }; - this.onBeforeEndOperation = function() { - var op = this.curOp; - if (op) { - if (op.change) { this.signal("change", op.change, op); } - if (op && op.cursorActivity) { this.signal("cursorActivity", null, op); } - this.curOp = null; - } - }; - - this.signal = function(eventName, e, handlers) { - var listeners = handlers ? handlers[eventName + "Handlers"] - : (this._eventRegistry || {})[eventName]; - if (!listeners) - return; - listeners = listeners.slice(); - for (var i=0; i 0) { - point.row += rowShift; - point.column += point.row == end.row ? colShift : 0; - continue; - } - if (!isInsert && cmp2 <= 0) { - point.row = start.row; - point.column = start.column; - if (cmp2 === 0) - point.bias = 1; - } - } - }; - var Marker = function(cm, id, row, column) { - this.cm = cm; - this.id = id; - this.row = row; - this.column = column; - cm.marks[this.id] = this; - }; - Marker.prototype.clear = function() { delete this.cm.marks[this.id] }; - Marker.prototype.find = function() { return toCmPos(this) }; - this.setBookmark = function(cursor, options) { - var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); - if (!options || !options.insertLeft) - bm.$insertRight = true; - this.marks[bm.id] = bm; - return bm; - }; - this.moveH = function(increment, unit) { - if (unit == 'char') { - var sel = this.ace.selection; - sel.clearSelection(); - sel.moveCursorBy(0, increment); - } - }; - this.findPosV = function(start, amount, unit, goalColumn) { - if (unit == 'page') { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - amount = amount * Math.floor(config.height / config.lineHeight); - unit = 'line'; - } - if (unit == 'line') { - var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); - if (goalColumn != null) - screenPos.column = goalColumn; - screenPos.row += amount; - screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); - var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); - return toCmPos(pos); - } else { - debugger; - } - }; - this.charCoords = function(pos, mode) { - if (mode == 'div' || !mode) { - var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); - return {left: sc.column, top: sc.row}; - }if (mode == 'local') { - var renderer = this.ace.renderer; - var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); - var lh = renderer.layerConfig.lineHeight; - var cw = renderer.layerConfig.characterWidth; - var top = lh * sc.row; - return {left: sc.column * cw, top: top, bottom: top + lh}; - } - }; - this.coordsChar = function(pos, mode) { - var renderer = this.ace.renderer; - if (mode == 'local') { - var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); - var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); - var ch = renderer.session.screenToDocumentPosition(row, col); - return toCmPos(ch); - } else if (mode == 'div') { - throw "not implemented"; - } - }; - this.getSearchCursor = function(query, pos, caseFold) { - var caseSensitive = false; - var isRegexp = false; - if (query instanceof RegExp && !query.global) { - caseSensitive = !query.ignoreCase; - query = query.source; - isRegexp = true; - } - if (query == "\\n") { query = "\n"; isRegexp = false; } - var search = new Search(); - if (pos.ch == undefined) pos.ch = Number.MAX_VALUE; - var acePos = {row: pos.line, column: pos.ch}; - var cm = this; - var last = null; - return { - findNext: function() { return this.find(false) }, - findPrevious: function() {return this.find(true) }, - find: function(back) { - search.setOptions({ - needle: query, - caseSensitive: caseSensitive, - wrap: false, - backwards: back, - regExp: isRegexp, - start: last || acePos +}; +(function () { + oop.implement(CodeMirror.prototype, EventEmitter); + this.destroy = function () { + this.ace.off('change', this.onChange); + this.ace.off('changeSelection', this.onSelectionChange); + this.ace.off('beforeEndOperation', this.onBeforeEndOperation); + this.removeOverlay(); + }; + this.virtualSelectionMode = function () { + return this.ace.inVirtualSelectionMode && this.ace.selection.index; + }; + this.onChange = function (delta) { + if (this.$lineHandleChanges) { + this.$lineHandleChanges.push(delta); + } + var change = { text: delta.action[0] == 'i' ? delta.lines : [] }; + var curOp = this.curOp = this.curOp || {}; + if (!curOp.changeHandlers) + curOp.changeHandlers = this._eventRegistry["change"] && this._eventRegistry["change"].slice(); + if (!curOp.lastChange) { + curOp.lastChange = curOp.change = change; + } + else { + curOp.lastChange.next = curOp.lastChange = change; + } + this.$updateMarkers(delta); + }; + this.onSelectionChange = function () { + var curOp = this.curOp = this.curOp || {}; + if (!curOp.cursorActivityHandlers) + curOp.cursorActivityHandlers = this._eventRegistry["cursorActivity"] && this._eventRegistry["cursorActivity"].slice(); + this.curOp.cursorActivity = true; + if (this.ace.inMultiSelectMode) { + this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler); + } + }; + this.operation = function (fn, force) { + if (!force && this.curOp || force && this.curOp && this.curOp.force) { + return fn(); + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + if (!this.ace.curOp) { + var prevOp = this.ace.prevOp; + this.ace.startOperation({ + command: { name: "vim", scrollIntoView: "cursor" } + }); + } + var curOp = this.curOp = this.curOp || {}; + this.curOp.force = force; + var result = fn(); + if (this.ace.curOp && this.ace.curOp.command.name == "vim") { + if (this.state.dialog) + this.ace.curOp.command.scrollIntoView = this.ace.curOp.vimDialogScroll; + this.ace.endOperation(); + if (!curOp.cursorActivity && !curOp.lastChange && prevOp) + this.ace.prevOp = prevOp; + } + if (force || !this.ace.curOp) { + if (this.curOp) + this.onBeforeEndOperation(); + } + return result; + }; + this.onBeforeEndOperation = function () { + var op = this.curOp; + if (op) { + if (op.change) { + this.signal("change", op.change, op); + } + if (op && op.cursorActivity) { + this.signal("cursorActivity", null, op); + } + this.curOp = null; + } + }; + this.signal = function (eventName, e, handlers) { + var listeners = handlers ? handlers[eventName + "Handlers"] + : (this._eventRegistry || {})[eventName]; + if (!listeners) + return; + listeners = listeners.slice(); + for (var i = 0; i < listeners.length; i++) + listeners[i](this, e); + }; + this.firstLine = function () { return 0; }; + this.lastLine = function () { return this.ace.session.getLength() - 1; }; + this.lineCount = function () { return this.ace.session.getLength(); }; + this.setCursor = function (line, ch) { + if (typeof line === 'object') { + ch = line.ch; + line = line.line; + } + var shouldScroll = !this.curOp && !this.ace.inVirtualSelectionMode; + if (!this.ace.inVirtualSelectionMode) + this.ace.exitMultiSelectMode(); + this.ace.session.unfold({ row: line, column: ch }); + this.ace.selection.moveTo(line, ch); + if (shouldScroll) { + this.ace.renderer.scrollCursorIntoView(); + this.ace.endOperation(); + } + }; + this.getCursor = function (p) { + var sel = this.ace.selection; + var pos = p == 'anchor' ? (sel.isEmpty() ? sel.lead : sel.anchor) : + p == 'head' || !p ? sel.lead : sel.getRange()[p]; + return toCmPos(pos); + }; + this.listSelections = function (p) { + var ranges = this.ace.multiSelect.rangeList.ranges; + if (!ranges.length || this.ace.inVirtualSelectionMode) + return [{ anchor: this.getCursor('anchor'), head: this.getCursor('head') }]; + return ranges.map(function (r) { + return { + anchor: this.clipPos(toCmPos(r.cursor == r.end ? r.start : r.end)), + head: this.clipPos(toCmPos(r.cursor)) + }; + }, this); + }; + this.setSelections = function (p, primIndex) { + var sel = this.ace.multiSelect; + var ranges = p.map(function (x) { + var anchor = toAcePos(x.anchor); + var head = toAcePos(x.head); + var r = Range.comparePoints(anchor, head) < 0 + ? new Range.fromPoints(anchor, head) + : new Range.fromPoints(head, anchor); + r.cursor = Range.comparePoints(r.start, head) ? r.end : r.start; + return r; }); - var range = search.find(cm.ace.session); - last = range; - return last && [!last.isEmpty()]; - }, - from: function() { return last && toCmPos(last.start) }, - to: function() { return last && toCmPos(last.end) }, - replace: function(text) { - if (last) { - last.end = cm.ace.session.doc.replace(last, text); - } - } + if (this.ace.inVirtualSelectionMode) { + this.ace.selection.fromOrientedRange(ranges[0]); + return; + } + if (!primIndex) { + ranges = ranges.reverse(); + } + else if (ranges[primIndex]) { + ranges.push(ranges.splice(primIndex, 1)[0]); + } + sel.toSingleRange(ranges[0].clone()); + var session = this.ace.session; + for (var i = 0; i < ranges.length; i++) { + var range = session.$clipRangeToDocument(ranges[i]); // todo why ace doesn't do this? + sel.addRange(range); + } }; - }; - this.scrollTo = function(x, y) { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - var maxHeight = config.maxHeight; - maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; - if (y != null) this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); - if (x != null) this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); - }; - this.scrollInfo = function() { return 0; }; - this.scrollIntoView = function(pos, margin) { - if (pos) { - var renderer = this.ace.renderer; - var viewMargin = { "top": 0, "bottom": margin }; - renderer.scrollCursorIntoView(toAcePos(pos), - (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); - } - }; - this.getLine = function(row) { return this.ace.session.getLine(row) }; - this.getRange = function(s, e) { - return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); - }; - this.replaceRange = function(text, s, e) { - if (!e) e = s; - var range = new Range(s.line, s.ch, e.line, e.ch); - this.ace.session.$clipRangeToDocument(range); - return this.ace.session.replace(range, text); - }; - this.replaceSelection = - this.replaceSelections = function(p) { - var sel = this.ace.selection; - if (this.ace.inVirtualSelectionMode) { - this.ace.session.replace(sel.getRange(), p[0] || ""); - return; - } - sel.inVirtualSelectionMode = true; - var ranges = sel.rangeList.ranges; - if (!ranges.length) ranges = [this.ace.multiSelect.getRange()]; - for (var i = ranges.length; i--;) - this.ace.session.replace(ranges[i], p[i] || ""); - sel.inVirtualSelectionMode = false; - }; - this.getSelection = function() { - return this.ace.getSelectedText(); - }; - this.getSelections = function() { - return this.listSelections().map(function(x) { - return this.getRange(x.anchor, x.head); - }, this); - }; - this.getInputField = function() { - return this.ace.textInput.getElement(); - }; - this.getWrapperElement = function() { - return this.ace.container; - }; - var optMap = { - indentWithTabs: "useSoftTabs", - indentUnit: "tabSize", - tabSize: "tabSize", - firstLineNumber: "firstLineNumber", - readOnly: "readOnly" - }; - this.setOption = function(name, val) { - this.state[name] = val; - switch (name) { - case 'indentWithTabs': - name = optMap[name]; - val = !val; - break; - case 'keyMap': - this.state.$keyMap = val; - return; - break; - default: - name = optMap[name]; - } - if (name) - this.ace.setOption(name, val); - }; - this.getOption = function(name) { - var val; - var aceOpt = optMap[name]; - if (aceOpt) - val = this.ace.getOption(aceOpt); - switch (name) { - case 'indentWithTabs': - name = optMap[name]; - return !val; - case 'keyMap': - return this.state.$keyMap || 'vim'; - } - return aceOpt ? val : this.state[name]; - }; - this.toggleOverwrite = function(on) { - this.state.overwrite = on; - return this.ace.setOverwrite(on); - }; - this.addOverlay = function(o) { - if (!this.$searchHighlight || !this.$searchHighlight.session) { - var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); - var marker = this.ace.session.addDynamicMarker(highlight); - highlight.id = marker.id; - highlight.session = this.ace.session; - highlight.destroy = function(o) { - highlight.session.off("change", highlight.updateOnChange); - highlight.session.off("changeEditor", highlight.destroy); - highlight.session.removeMarker(highlight.id); - highlight.session = null; - }; - highlight.updateOnChange = function(delta) { - var row = delta.start.row; - if (row == delta.end.row) highlight.cache[row] = undefined; - else highlight.cache.splice(row, highlight.cache.length); - }; - highlight.session.on("changeEditor", highlight.destroy); - highlight.session.on("change", highlight.updateOnChange); - } - var re = new RegExp(o.query.source, "gmi"); - this.$searchHighlight = o.highlight = highlight; - this.$searchHighlight.setRegexp(re); - this.ace.renderer.updateBackMarkers(); - }; - this.removeOverlay = function(o) { - if (this.$searchHighlight && this.$searchHighlight.session) { - this.$searchHighlight.destroy(); - } - }; - this.getScrollInfo = function() { - var renderer = this.ace.renderer; - var config = renderer.layerConfig; - return { - left: renderer.scrollLeft, - top: renderer.scrollTop, - height: config.maxHeight, - width: config.width, - clientHeight: config.height, - clientWidth: config.width + this.setSelection = function (a, h, options) { + var sel = this.ace.selection; + sel.moveTo(a.line, a.ch); + sel.selectTo(h.line, h.ch); + if (options && options.origin == '*mouse') { + this.onBeforeEndOperation(); + } + }; + this.somethingSelected = function (p) { + return !this.ace.selection.isEmpty(); + }; + this.clipPos = function (p) { + var pos = this.ace.session.$clipPositionToDocument(p.line, p.ch); + return toCmPos(pos); + }; + this.foldCode = function (pos) { + this.ace.session.$toggleFoldWidget(pos.line, {}); + }; + this.markText = function (cursor) { + return { clear: function () { }, find: function () { } }; + }; + this.$updateMarkers = function (delta) { + var isInsert = delta.action == "insert"; + var start = delta.start; + var end = delta.end; + var rowShift = (end.row - start.row) * (isInsert ? 1 : -1); + var colShift = (end.column - start.column) * (isInsert ? 1 : -1); + if (isInsert) + end = start; + for (var i in this.marks) { + var point = this.marks[i]; + var cmp = Range.comparePoints(point, start); + if (cmp < 0) { + continue; // delta starts after the range + } + if (cmp === 0) { + if (isInsert) { + if (!point.$insertRight) { + cmp = 1; + } + else if (point.bias == 1) { + cmp = 1; + } + else { + point.bias = -1; + continue; + } + } + } + var cmp2 = isInsert ? cmp : Range.comparePoints(point, end); + if (cmp2 > 0) { + point.row += rowShift; + point.column += point.row == end.row ? colShift : 0; + continue; + } + if (!isInsert && cmp2 <= 0) { + point.row = start.row; + point.column = start.column; + if (cmp2 === 0) + point.bias = 1; + } + } + }; + var Marker = function (cm, id, row, column) { + this.cm = cm; + this.id = id; + this.row = row; + this.column = column; + cm.marks[this.id] = this; + }; + Marker.prototype.clear = function () { delete this.cm.marks[this.id]; }; + Marker.prototype.find = function () { return toCmPos(this); }; + this.setBookmark = function (cursor, options) { + var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch); + if (!options || !options.insertLeft) + bm.$insertRight = true; + this.marks[bm.id] = bm; + return bm; + }; + this.moveH = function (increment, unit) { + if (unit == 'char') { + var sel = this.ace.selection; + sel.clearSelection(); + sel.moveCursorBy(0, increment); + } + }; + this.findPosV = function (start, amount, unit, goalColumn) { + if (unit == 'page') { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + amount = amount * Math.floor(config.height / config.lineHeight); + unit = 'line'; + } + if (unit == 'line') { + var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch); + if (goalColumn != null) + screenPos.column = goalColumn; + screenPos.row += amount; + screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1); + var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column); + return toCmPos(pos); + } + else { + debugger; + } + }; + this.charCoords = function (pos, mode) { + if (mode == 'div' || !mode) { + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + return { left: sc.column, top: sc.row }; + } + if (mode == 'local') { + var renderer = this.ace.renderer; + var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch); + var lh = renderer.layerConfig.lineHeight; + var cw = renderer.layerConfig.characterWidth; + var top = lh * sc.row; + return { left: sc.column * cw, top: top, bottom: top + lh }; + } + }; + this.coordsChar = function (pos, mode) { + var renderer = this.ace.renderer; + if (mode == 'local') { + var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight)); + var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth)); + var ch = renderer.session.screenToDocumentPosition(row, col); + return toCmPos(ch); + } + else if (mode == 'div') { + throw "not implemented"; + } + }; + this.getSearchCursor = function (query, pos, caseFold) { + var caseSensitive = false; + var isRegexp = false; + if (query instanceof RegExp && !query.global) { + caseSensitive = !query.ignoreCase; + query = query.source; + isRegexp = true; + } + if (query == "\\n") { + query = "\n"; + isRegexp = false; + } + var search = new Search(); + if (pos.ch == undefined) + pos.ch = Number.MAX_VALUE; + var acePos = { row: pos.line, column: pos.ch }; + var cm = this; + var last = null; + return { + findNext: function () { return this.find(false); }, + findPrevious: function () { return this.find(true); }, + find: function (back) { + search.setOptions({ + needle: query, + caseSensitive: caseSensitive, + wrap: false, + backwards: back, + regExp: isRegexp, + start: last || acePos + }); + var range = search.find(cm.ace.session); + last = range; + return last && [!last.isEmpty()]; + }, + from: function () { return last && toCmPos(last.start); }, + to: function () { return last && toCmPos(last.end); }, + replace: function (text) { + if (last) { + last.end = cm.ace.session.doc.replace(last, text); + } + } + }; + }; + this.scrollTo = function (x, y) { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + var maxHeight = config.maxHeight; + maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd; + if (y != null) + this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight))); + if (x != null) + this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width))); + }; + this.scrollInfo = function () { return 0; }; + this.scrollIntoView = function (pos, margin) { + if (pos) { + var renderer = this.ace.renderer; + var viewMargin = { "top": 0, "bottom": margin }; + renderer.scrollCursorIntoView(toAcePos(pos), (renderer.lineHeight * 2) / renderer.$size.scrollerHeight, viewMargin); + } + }; + this.getLine = function (row) { return this.ace.session.getLine(row); }; + this.getRange = function (s, e) { + return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch)); + }; + this.replaceRange = function (text, s, e) { + if (!e) + e = s; + var range = new Range(s.line, s.ch, e.line, e.ch); + this.ace.session.$clipRangeToDocument(range); + return this.ace.session.replace(range, text); + }; + this.replaceSelection = + this.replaceSelections = function (p) { + var strings = Array.isArray(p) && p; + var sel = this.ace.selection; + if (this.ace.inVirtualSelectionMode) { + this.ace.session.replace(sel.getRange(), strings ? p[0] || "" : p); + return; + } + sel.inVirtualSelectionMode = true; + var ranges = sel.rangeList.ranges; + if (!ranges.length) + ranges = [this.ace.multiSelect.getRange()]; + for (var i = ranges.length; i--;) + this.ace.session.replace(ranges[i], strings ? p[i] || "" : p); + sel.inVirtualSelectionMode = false; + }; + this.getSelection = function () { + return this.ace.getSelectedText(); + }; + this.getSelections = function () { + return this.listSelections().map(function (x) { + return this.getRange(x.anchor, x.head); + }, this); + }; + this.getInputField = function () { + return this.ace.textInput.getElement(); + }; + this.getWrapperElement = function () { + return this.ace.container; + }; + var optMap = { + indentWithTabs: "useSoftTabs", + indentUnit: "tabSize", + tabSize: "tabSize", + firstLineNumber: "firstLineNumber", + readOnly: "readOnly" + }; + this.setOption = function (name, val) { + this.state[name] = val; + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + val = !val; + break; + case 'keyMap': + this.state.$keyMap = val; + return; + break; + default: + name = optMap[name]; + } + if (name) + this.ace.setOption(name, val); + }; + this.getOption = function (name) { + var val; + var aceOpt = optMap[name]; + if (aceOpt) + val = this.ace.getOption(aceOpt); + switch (name) { + case 'indentWithTabs': + name = optMap[name]; + return !val; + case 'keyMap': + return this.state.$keyMap || 'vim'; + } + return aceOpt ? val : this.state[name]; + }; + this.toggleOverwrite = function (on) { + this.state.overwrite = on; + return this.ace.setOverwrite(on); + }; + this.addOverlay = function (o) { + if (!this.$searchHighlight || !this.$searchHighlight.session) { + var highlight = new SearchHighlight(null, "ace_highlight-marker", "text"); + var marker = this.ace.session.addDynamicMarker(highlight); + highlight.id = marker.id; + highlight.session = this.ace.session; + highlight.destroy = function (o) { + highlight.session.off("change", highlight.updateOnChange); + highlight.session.off("changeEditor", highlight.destroy); + highlight.session.removeMarker(highlight.id); + highlight.session = null; + }; + highlight.updateOnChange = function (delta) { + var row = delta.start.row; + if (row == delta.end.row) + highlight.cache[row] = undefined; + else + highlight.cache.splice(row, highlight.cache.length); + }; + highlight.session.on("changeEditor", highlight.destroy); + highlight.session.on("change", highlight.updateOnChange); + } + var re = new RegExp(o.query.source, "gmi"); + this.$searchHighlight = o.highlight = highlight; + this.$searchHighlight.setRegexp(re); + this.ace.renderer.updateBackMarkers(); + }; + this.removeOverlay = function (o) { + if (this.$searchHighlight && this.$searchHighlight.session) { + this.$searchHighlight.destroy(); + } + }; + this.getScrollInfo = function () { + var renderer = this.ace.renderer; + var config = renderer.layerConfig; + return { + left: renderer.scrollLeft, + top: renderer.scrollTop, + height: config.maxHeight, + width: config.width, + clientHeight: config.height, + clientWidth: config.width + }; + }; + this.getValue = function () { + return this.ace.getValue(); + }; + this.setValue = function (v) { + return this.ace.setValue(v, -1); + }; + this.getTokenTypeAt = function (pos) { + var token = this.ace.session.getTokenAt(pos.line, pos.ch); + return token && /comment|string/.test(token.type) ? "string" : ""; + }; + this.findMatchingBracket = function (pos) { + var m = this.ace.session.findMatchingBracket(toAcePos(pos)); + return { to: m && toCmPos(m) }; + }; + this.findMatchingTag = function (pos) { + var m = this.ace.session.getMatchingTags(toAcePos(pos)); + if (!m) + return; + return { + open: { + from: toCmPos(m.openTag.start), + to: toCmPos(m.openTag.end) + }, + close: { + from: toCmPos(m.closeTag.start), + to: toCmPos(m.closeTag.end) + } + }; + }; + this.indentLine = function (line, method) { + if (method === true) + this.ace.session.indentRows(line, line, "\t"); + else if (method === false) + this.ace.session.outdentRows(new Range(line, 0, line, 0)); + }; + this.indexFromPos = function (pos) { + return this.ace.session.doc.positionToIndex(toAcePos(pos)); + }; + this.posFromIndex = function (index) { + return toCmPos(this.ace.session.doc.indexToPosition(index)); + }; + this.focus = function (index) { + return this.ace.textInput.focus(); + }; + this.blur = function (index) { + return this.ace.blur(); + }; + this.defaultTextHeight = function (index) { + return this.ace.renderer.layerConfig.lineHeight; + }; + this.scanForBracket = function (pos, dir, _, options) { + var re = options.bracketRegex.source; + var tokenRe = /paren|text|operator|tag/; + if (dir == 1) { + var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe); + } + else { + var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), { row: pos.line, column: pos.ch + 1 }, tokenRe); + if (!m && options.bracketRegex && options.bracketRegex.test(this.getLine(pos.line)[pos.ch - 1])) { + m = { row: pos.line, column: pos.ch - 1 }; + } + } + return m && { pos: toCmPos(m) }; + }; + this.refresh = function () { + return this.ace.resize(true); + }; + this.getMode = function () { + return { name: this.getOption("mode") }; + }; + this.execCommand = function (name) { + if (CodeMirror.commands.hasOwnProperty(name)) + return CodeMirror.commands[name](this); + if (name == "indentAuto") + return this.ace.execCommand("autoindent"); + console.log(name + " is not implemented"); + }; + this.getLineNumber = function (handle) { + var deltas = this.$lineHandleChanges; + if (!deltas) + return null; + var row = handle.row; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.start.row != delta.end.row) { + if (delta.action[0] == "i") { + if (delta.start.row < row) + row += delta.end.row - delta.start.row; + } + else { + if (delta.start.row < row) { + if (row < delta.end.row || row == delta.end.row && delta.start.column > 0) { + return null; + } + row -= delta.end.row - delta.start.row; + } + } + } + } + return row; + }; + this.getLineHandle = function (row) { + if (!this.$lineHandleChanges) + this.$lineHandleChanges = []; + return { text: this.ace.session.getLine(row), row: row }; + }; + this.releaseLineHandles = function () { + this.$lineHandleChanges = undefined; + }; + this.getLastEditEnd = function () { + var undoManager = this.ace.session.$undoManager; + if (undoManager && undoManager.$lastDelta) + return toCmPos(undoManager.$lastDelta.end); }; - }; - this.getValue = function() { - return this.ace.getValue(); - }; - this.setValue = function(v) { - return this.ace.setValue(v, -1); - }; - this.getTokenTypeAt = function(pos) { - var token = this.ace.session.getTokenAt(pos.line, pos.ch); - return token && /comment|string/.test(token.type) ? "string" : ""; - }; - this.findMatchingBracket = function(pos) { - var m = this.ace.session.findMatchingBracket(toAcePos(pos)); - return {to: m && toCmPos(m)}; - }; - this.indentLine = function(line, method) { - if (method === true) - this.ace.session.indentRows(line, line, "\t"); - else if (method === false) - this.ace.session.outdentRows(new Range(line, 0, line, 0)); - }; - this.indexFromPos = function(pos) { - return this.ace.session.doc.positionToIndex(toAcePos(pos)); - }; - this.posFromIndex = function(index) { - return toCmPos(this.ace.session.doc.indexToPosition(index)); - }; - this.focus = function(index) { - return this.ace.textInput.focus(); - }; - this.blur = function(index) { - return this.ace.blur(); - }; - this.defaultTextHeight = function(index) { - return this.ace.renderer.layerConfig.lineHeight; - }; - this.scanForBracket = function(pos, dir, _, options) { - var re = options.bracketRegex.source; - var tokenRe = /paren|text|operator|tag/; - if (dir == 1) { - var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), tokenRe); - } else { - var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, tokenRe); - } - return m && {pos: toCmPos(m)}; - }; - this.refresh = function() { - return this.ace.resize(true); - }; - this.getMode = function() { - return { name : this.getOption("mode") }; - }; - this.execCommand = function(name) { - if (CodeMirror.commands.hasOwnProperty(name)) return CodeMirror.commands[name](this); - if (name == "indentAuto") return this.ace.execCommand("autoindent"); - console.log(name + " is not implemented"); - }; - this.getLineNumber = function(handle) { - return handle.row; - } - this.getLineHandle = function(row) { - return {text: this.ace.session.getLine(row), row: row}; - } }).call(CodeMirror.prototype); - function toAcePos(cmPos) { - return {row: cmPos.line, column: cmPos.ch}; - } - function toCmPos(acePos) { +function toAcePos(cmPos) { + return { row: cmPos.line, column: cmPos.ch }; +} +function toCmPos(acePos) { return new Pos(acePos.row, acePos.column); - } - - var StringStream = CodeMirror.StringStream = function(string, tabSize) { +} +var StringStream = CodeMirror.StringStream = function (string, tabSize) { this.pos = this.start = 0; this.string = string; this.tabSize = tabSize || 8; this.lastColumnPos = this.lastColumnValue = 0; this.lineStart = 0; - }; - - StringStream.prototype = { - eol: function() {return this.pos >= this.string.length;}, - sol: function() {return this.pos == this.lineStart;}, - peek: function() {return this.string.charAt(this.pos) || undefined;}, - next: function() { - if (this.pos < this.string.length) - return this.string.charAt(this.pos++); - }, - eat: function(match) { - var ch = this.string.charAt(this.pos); - if (typeof match == "string") var ok = ch == match; - else var ok = ch && (match.test ? match.test(ch) : match(ch)); - if (ok) {++this.pos; return ch;} - }, - eatWhile: function(match) { - var start = this.pos; - while (this.eat(match)){} - return this.pos > start; - }, - eatSpace: function() { - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; - return this.pos > start; - }, - skipToEnd: function() {this.pos = this.string.length;}, - skipTo: function(ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) {this.pos = found; return true;} - }, - backUp: function(n) {this.pos -= n;}, - column: function() { - throw "not implemented"; - }, - indentation: function() { - throw "not implemented"; - }, - match: function(pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) this.pos += pattern.length; - return true; - } - } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) return null; - if (match && consume !== false) this.pos += match[0].length; - return match; - } +}; +StringStream.prototype = { + eol: function () { return this.pos >= this.string.length; }, + sol: function () { return this.pos == this.lineStart; }, + peek: function () { return this.string.charAt(this.pos) || undefined; }, + next: function () { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function (match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") + var ok = ch == match; + else + var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) { + ++this.pos; + return ch; + } + }, + eatWhile: function (match) { + var start = this.pos; + while (this.eat(match)) { } + return this.pos > start; + }, + eatSpace: function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) + ++this.pos; + return this.pos > start; + }, + skipToEnd: function () { this.pos = this.string.length; }, + skipTo: function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) { + this.pos = found; + return true; + } + }, + backUp: function (n) { this.pos -= n; }, + column: function () { + throw "not implemented"; + }, + indentation: function () { + throw "not implemented"; + }, + match: function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) + this.pos += pattern.length; + return true; + } + } + else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) + return null; + if (match && consume !== false) + this.pos += match[0].length; + return match; + } }, - current: function(){return this.string.slice(this.start, this.pos);}, - hideFirstChars: function(n, inner) { - this.lineStart += n; - try { return inner(); } - finally { this.lineStart -= n; } + current: function () { return this.string.slice(this.start, this.pos); }, + hideFirstChars: function (n, inner) { + this.lineStart += n; + try { + return inner(); + } + finally { + this.lineStart -= n; + } } - }; -CodeMirror.defineExtension = function(name, fn) { - CodeMirror.prototype[name] = fn; }; -dom.importCssString(".normal-mode .ace_cursor{\ - border: none;\ - background-color: rgba(255,0,0,0.5);\ -}\ -.normal-mode .ace_hidden-cursors .ace_cursor{\ - background-color: transparent;\ - border: 1px solid red;\ - opacity: 0.7\ -}\ -.ace_dialog {\ - position: absolute;\ - left: 0; right: 0;\ - background: inherit;\ - z-index: 15;\ - padding: .1em .8em;\ - overflow: hidden;\ - color: inherit;\ -}\ -.ace_dialog-top {\ - border-bottom: 1px solid #444;\ - top: 0;\ -}\ -.ace_dialog-bottom {\ - border-top: 1px solid #444;\ - bottom: 0;\ -}\ -.ace_dialog input {\ - border: none;\ - outline: none;\ - background: transparent;\ - width: 20em;\ - color: inherit;\ - font-family: monospace;\ -}", "vimMode", false); -(function() { - function dialogDiv(cm, template, bottom) { - var wrap = cm.ace.container; - var dialog; - dialog = wrap.appendChild(document.createElement("div")); - if (bottom) - dialog.className = "ace_dialog ace_dialog-bottom"; - else - dialog.className = "ace_dialog ace_dialog-top"; - - if (typeof template == "string") { - dialog.innerHTML = template; - } else { // Assuming it's a detached DOM element. - dialog.appendChild(template); - } - return dialog; - } - - function closeNotification(cm, newVal) { - if (cm.state.currentNotificationClose) - cm.state.currentNotificationClose(); - cm.state.currentNotificationClose = newVal; - } - - CodeMirror.defineExtension("openDialog", function(template, callback, options) { - if (this.virtualSelectionMode()) return; - if (!options) options = {}; - - closeNotification(this, null); - - var dialog = dialogDiv(this, template, options.bottom); - var closed = false, me = this; - this.state.dialog = dialog; - function close(newVal) { - if (typeof newVal == 'string') { - inp.value = newVal; - } else { - if (closed) return; - - if (newVal && newVal.type == "blur") { - if (document.activeElement === inp) +CodeMirror.defineExtension = function (name, fn) { + CodeMirror.prototype[name] = fn; +}; +domLib.importCssString(".normal-mode .ace_cursor{\n border: none;\n background-color: rgba(255,0,0,0.5);\n}\n.normal-mode .ace_hidden-cursors .ace_cursor{\n background-color: transparent;\n border: 1px solid red;\n opacity: 0.7\n}\n.ace_dialog {\n position: absolute;\n left: 0; right: 0;\n background: inherit;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: inherit;\n}\n.ace_dialog-top {\n border-bottom: 1px solid #444;\n top: 0;\n}\n.ace_dialog-bottom {\n border-top: 1px solid #444;\n bottom: 0;\n}\n.ace_dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}", "vimMode", false); +(function () { + function dialogDiv(cm, template, bottom) { + var wrap = cm.ace.container; + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "ace_dialog ace_dialog-bottom"; + else + dialog.className = "ace_dialog ace_dialog-top"; + if (typeof template == "string") { + dialog.innerHTML = template; + } + else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + return dialog; + } + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + CodeMirror.defineExtension("openDialog", function (template, callback, options) { + if (this.virtualSelectionMode()) return; + if (!options) + options = {}; + closeNotification(this, null); + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + this.state.dialog = dialog; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } + else { + if (closed) + return; + if (newVal && newVal.type == "blur") { + if (document.activeElement === inp) + return; + } + if (me.state.dialog == dialog) { + me.state.dialog = null; + me.focus(); + } + closed = true; + dialog.remove(); + if (options.onClose) + options.onClose(dialog); + var cm = me; + if (cm.state.vim) { + cm.state.vim.status = null; + cm.ace._signal("changeStatus"); + cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR); + } + } } - - if (me.state.dialog == dialog) { - me.state.dialog = null; - me.focus(); + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) + inp.select(); + } + if (options.onInput) + CodeMirror.on(inp, "input", function (e) { options.onInput(e, inp.value, close); }); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function (e) { options.onKeyUp(e, inp.value, close); }); + CodeMirror.on(inp, "keydown", function (e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { + return; + } + if (e.keyCode == 13) + callback(inp.value); + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + CodeMirror.e_stop(e); + close(); + } + }); + if (options.closeOnBlur !== false) + CodeMirror.on(inp, "blur", close); + inp.focus(); + } + else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function () { + close(); + me.focus(); + }); + if (options.closeOnBlur !== false) + CodeMirror.on(button, "blur", close); + button.focus(); } - closed = true; - dialog.remove(); - - if (options.onClose) options.onClose(dialog); - var cm = me; - if (cm.state.vim) { - cm.state.vim.status = null; - cm.ace._signal("changeStatus"); - cm.ace.renderer.$loop.schedule(cm.ace.renderer.CHANGE_CURSOR); + return close; + }); + CodeMirror.defineExtension("openNotification", function (template, options) { + if (this.virtualSelectionMode()) + return; + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + function close() { + if (closed) + return; + closed = true; + clearTimeout(doneTimer); + dialog.remove(); } - } - } - - var inp = dialog.getElementsByTagName("input")[0], button; - if (inp) { - if (options.value) { - inp.value = options.value; - if (options.selectValueOnOpen !== false) inp.select(); - } - - if (options.onInput) - CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); - if (options.onKeyUp) - CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); - - CodeMirror.on(inp, "keydown", function(e) { - if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } - if (e.keyCode == 13) callback(inp.value); - if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { - CodeMirror.e_stop(e); - close(); - } - }); - - if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); - - inp.focus(); - } else if (button = dialog.getElementsByTagName("button")[0]) { - CodeMirror.on(button, "click", function() { - close(); - me.focus(); - }); - - if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); - - button.focus(); - } - return close; - }); - - CodeMirror.defineExtension("openNotification", function(template, options) { - if (this.virtualSelectionMode()) return; - closeNotification(this, close); - var dialog = dialogDiv(this, template, options && options.bottom); - var closed = false, doneTimer; - var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; - - function close() { - if (closed) return; - closed = true; - clearTimeout(doneTimer); - dialog.remove(); - } - - CodeMirror.on(dialog, 'click', function(e) { - CodeMirror.e_preventDefault(e); - close(); + CodeMirror.on(dialog, 'click', function (e) { + CodeMirror.e_preventDefault(e); + close(); + }); + if (duration) + doneTimer = setTimeout(close, duration); + return close; }); - - if (duration) - doneTimer = setTimeout(close, duration); - - return close; - }); })(); - - - var Pos = CodeMirror.Pos; - - function transformCursor(cm, range) { - var vim = cm.state.vim; - if (!vim || vim.insertMode) return range.head; - var head = vim.sel.head; - if (!head) return range.head; - - if (vim.visualBlock) { - if (range.head.line != head.line) { - return; - } - } - if (range.from() == range.anchor && !range.empty()) { - if (range.head.line == head.line && range.head.ch != head.ch) - return new Pos(range.head.line, range.head.ch - 1); +var Pos = CodeMirror.Pos; +function updateSelectionForSurrogateCharacters(cm, curStart, curEnd) { + if (curStart.line === curEnd.line && curStart.ch >= curEnd.ch - 1) { + var text = cm.getLine(curStart.line); + var charCode = text.charCodeAt(curStart.ch); + if (0xD800 <= charCode && charCode <= 0xD8FF) { + curEnd.ch += 1; + } } - - return range.head; - } - - var defaultKeymap = [ + return { start: curStart, end: curEnd }; +} +var defaultKeymap = [ { keys: '', type: 'keyToKey', toKeys: 'h' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, @@ -1007,22 +1053,22 @@ dom.importCssString(".normal-mode .ace_cursor{\ { keys: 'g', type: 'keyToKey', toKeys: 'gk' }, { keys: 'g', type: 'keyToKey', toKeys: 'gj' }, { keys: '', type: 'keyToKey', toKeys: 'l' }, - { keys: '', type: 'keyToKey', toKeys: 'h', context: 'normal'}, - { keys: '', type: 'keyToKey', toKeys: 'x', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'h' }, + { keys: '', type: 'keyToKey', toKeys: 'x' }, { keys: '', type: 'keyToKey', toKeys: 'W' }, - { keys: '', type: 'keyToKey', toKeys: 'B', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'B' }, { keys: '', type: 'keyToKey', toKeys: 'w' }, - { keys: '', type: 'keyToKey', toKeys: 'b', context: 'normal' }, + { keys: '', type: 'keyToKey', toKeys: 'b' }, { keys: '', type: 'keyToKey', toKeys: 'j' }, { keys: '', type: 'keyToKey', toKeys: 'k' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, - { keys: '', type: 'keyToKey', toKeys: '' }, // ace_patch ipad keyboard sends C-Esc instead of C-[ + { keys: '', type: 'keyToKey', toKeys: '' }, // ipad keyboard sends C-Esc instead of C-[ { keys: '', type: 'keyToKey', toKeys: '', context: 'insert' }, { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' }, - { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual'}, + { keys: 's', type: 'keyToKey', toKeys: 'c', context: 'visual' }, { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' }, { keys: 'S', type: 'keyToKey', toKeys: 'VdO', context: 'visual' }, { keys: '', type: 'keyToKey', toKeys: '0' }, @@ -1030,152 +1076,168 @@ dom.importCssString(".normal-mode .ace_cursor{\ { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: '' }, { keys: '', type: 'keyToKey', toKeys: 'j^', context: 'normal' }, - { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal'}, + { keys: '', type: 'keyToKey', toKeys: 'i', context: 'normal' }, { keys: '', type: 'action', action: 'toggleOverwrite', context: 'insert' }, - { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }}, - { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }}, - { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }}, - { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }}, - { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }}, - { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }}, - { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }}, - { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }}, - { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }}, - { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }}, - { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }}, - { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }}, - { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }}, - { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }}, - { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }}, - { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }}, - { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false }}, - { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }}, - { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }}, - { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }}, - { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }}, - { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }}, - {keys: "g$", type: "motion", motion: "moveToEndOfDisplayLine"}, - {keys: "g^", type: "motion", motion: "moveToStartOfDisplayLine"}, - {keys: "g0", type: "motion", motion: "moveToStartOfDisplayLine"}, + { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true } }, + { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false } }, + { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true } }, + { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true } }, + { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true } }, + { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true } }, + { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false } }, + { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false } }, + { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true } }, + { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true } }, + { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true } }, + { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false } }, + { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true } }, + { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true } }, + { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true } }, + { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true } }, + { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true } }, + { keys: '(', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: false } }, + { keys: ')', type: 'motion', motion: 'moveBySentence', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true } }, + { keys: '', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true } }, + { keys: '', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true } }, + { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true } }, + { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true } }, + { keys: "g$", type: "motion", motion: "moveToEndOfDisplayLine" }, + { keys: "g^", type: "motion", motion: "moveToStartOfDisplayLine" }, + { keys: "g0", type: "motion", motion: "moveToStartOfDisplayLine" }, { keys: '0', type: 'motion', motion: 'moveToStartOfLine' }, { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }}, - { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }}, - { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }}, - { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }}, - { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }}, - { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }}, - { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }}, - { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }}, - { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }}, - { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }}, - { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }}, - { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}}, - { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}}, + { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true } }, + { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar: true } }, + { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar: true, repeatOffset: -1 } }, + { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true } }, + { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true } }, + { keys: 'f', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'F', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false } }, + { keys: 't', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true } }, + { keys: 'T', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false } }, + { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true } }, + { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false } }, + { keys: '\'', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true, linewise: true } }, + { keys: '`', type: 'motion', motion: 'goToMark', motionArgs: { toJumplist: true } }, { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } }, { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } }, { keys: ']\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } }, { keys: '[\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } }, - { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}}, - { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}}, - { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}}, - { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}}, - { keys: '|', type: 'motion', motion: 'moveToColumn'}, - { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'}, - { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'}, + { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true } }, + { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true } }, + { keys: ']', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true } }, + { keys: '[', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true } }, + { keys: '|', type: 'motion', motion: 'moveToColumn' }, + { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context: 'visual' }, + { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { sameLine: true }, context: 'visual' }, { keys: 'd', type: 'operator', operator: 'delete' }, { keys: 'y', type: 'operator', operator: 'yank' }, { keys: 'c', type: 'operator', operator: 'change' }, { keys: '=', type: 'operator', operator: 'indentAuto' }, - { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }}, - { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }}, + { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true } }, + { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false } }, { keys: 'g~', type: 'operator', operator: 'changeCase' }, - { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true }, - { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true }, - { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }}, - { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }}, - { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true }}, - { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }}, - { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }}, - { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }}, - { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal'}, - { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'}, - { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'}, - { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'}, - { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'}, + { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, isEdit: true }, + { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, isEdit: true }, + { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true } }, + { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true } }, + { keys: 'gn', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: true } }, + { keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false } }, + { keys: 'gq', type: 'operator', operator: 'hardWrap' }, + { keys: 'gw', type: 'operator', operator: 'hardWrap', operatorArgs: { keepCursor: true } }, + { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false } }, + { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true } }, + { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' }, + { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'expandToLine', motionArgs: { linewise: true }, context: 'normal' }, + { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal' }, + { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual' }, + { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal' }, + { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual' }, + { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveToStartOfLine', context: 'insert' }, { keys: '', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' }, { keys: '', type: 'idle', context: 'normal' }, - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }}, - { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }}, - { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }}, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true } }, + { keys: '', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true } }, + { keys: '', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true } }, { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' }, { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' }, { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' }, { keys: 'gi', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'lastEdit' }, context: 'normal' }, - { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' }, - { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol'}, context: 'normal' }, + { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank' }, context: 'normal' }, + { keys: 'gI', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'bol' }, context: 'normal' }, { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' }, { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' }, { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' }, { keys: 'v', type: 'action', action: 'toggleVisualMode' }, - { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, - { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }}, + { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, + { keys: '', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true } }, { keys: 'gv', type: 'action', action: 'reselectLastSelection' }, { keys: 'J', type: 'action', action: 'joinLines', isEdit: true }, { keys: 'gJ', type: 'action', action: 'joinLines', actionArgs: { keepSpaces: true }, isEdit: true }, - { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }}, - { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }}, + { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true } }, + { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true } }, { keys: 'r', type: 'action', action: 'replace', isEdit: true }, - { keys: '@', type: 'action', action: 'replayMacro' }, - { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, - { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal'}, - { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true}, + { keys: '@', type: 'action', action: 'replayMacro' }, + { keys: 'q', type: 'action', action: 'enterMacroRecordMode' }, + { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }, context: 'normal' }, + { keys: 'R', type: 'operator', operator: 'change', operatorArgs: { linewise: true, fullLine: true }, context: 'visual', exitVisualBlock: true }, { keys: 'u', type: 'action', action: 'undo', context: 'normal' }, - { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true }, - { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true }, + { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: true }, context: 'visual', isEdit: true }, + { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: { toLower: false }, context: 'visual', isEdit: true }, { keys: '', type: 'action', action: 'redo' }, - { keys: 'm', type: 'action', action: 'setMark' }, - { keys: '"', type: 'action', action: 'setRegister' }, - { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }}, + { keys: 'm', type: 'action', action: 'setMark' }, + { keys: '"', type: 'action', action: 'setRegister' }, + { keys: '', type: 'action', action: 'insertRegister', context: 'insert', isEdit: true }, + { keys: '', type: 'action', action: 'oneNormalCommand', context: 'insert' }, + { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' } }, { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }}, + { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' } }, { keys: 'z', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, - { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }}, - { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, + { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' } }, + { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' }, { keys: '.', type: 'action', action: 'repeatLastEdit' }, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}}, - { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}}, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: true, backtrack: false } }, + { keys: '', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: { increase: false, backtrack: false } }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: true }, context: 'insert' }, { keys: '', type: 'action', action: 'indent', actionArgs: { indentRight: false }, context: 'insert' }, - { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, - { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }}, - { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }}, - { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }}, - { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }}, - { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }}, - { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }}, + { keys: 'a', type: 'motion', motion: 'textObjectManipulation' }, + { keys: 'i', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true } }, + { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true } }, + { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true } }, + { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } }, + { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true } }, + { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true } }, + { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true } }, { keys: ':', type: 'ex' } - ]; - var defaultKeymapLength = defaultKeymap.length; - var defaultExCommandMap = [ +]; +var defaultKeymapLength = defaultKeymap.length; +var defaultExCommandMap = [ { name: 'colorscheme', shortName: 'colo' }, { name: 'map' }, { name: 'imap', shortName: 'im' }, { name: 'nmap', shortName: 'nm' }, { name: 'vmap', shortName: 'vm' }, + { name: 'omap', shortName: 'om' }, + { name: 'noremap', shortName: 'no' }, + { name: 'nnoremap', shortName: 'nn' }, + { name: 'vnoremap', shortName: 'vn' }, + { name: 'inoremap', shortName: 'ino' }, + { name: 'onoremap', shortName: 'ono' }, { name: 'unmap' }, + { name: 'mapclear', shortName: 'mapc' }, + { name: 'nmapclear', shortName: 'nmapc' }, + { name: 'vmapclear', shortName: 'vmapc' }, + { name: 'imapclear', shortName: 'imapc' }, + { name: 'omapclear', shortName: 'omapc' }, { name: 'write', shortName: 'w' }, { name: 'undo', shortName: 'u' }, { name: 'redo', shortName: 'red' }, @@ -1184,932 +1246,1115 @@ dom.importCssString(".normal-mode .ace_cursor{\ { name: 'setglobal', shortName: 'setg' }, { name: 'sort', shortName: 'sor' }, { name: 'substitute', shortName: 's', possiblyAsync: true }, + { name: 'startinsert', shortName: 'start' }, { name: 'nohlsearch', shortName: 'noh' }, { name: 'yank', shortName: 'y' }, { name: 'delmarks', shortName: 'delm' }, { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }, { name: 'vglobal', shortName: 'v' }, + { name: 'delete', shortName: 'd' }, + { name: 'join', shortName: 'j' }, + { name: 'normal', shortName: 'norm' }, { name: 'global', shortName: 'g' } - ]; - - var Vim = function() { return vimApi; } //{ - function enterVimMode(cm) { - cm.setOption('disableInput', true); - cm.setOption('showCursorWhenSelecting', false); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - cm.on('cursorActivity', onCursorActivity); - maybeInitVimState(cm); - CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); - } - - function leaveVimMode(cm) { - cm.setOption('disableInput', false); - cm.off('cursorActivity', onCursorActivity); - CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); - cm.state.vim = null; - } - - function detachVimMap(cm, next) { - if (this == CodeMirror.keyMap.vim) { - cm.options.$customCursor = null; - CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); - } - - if (!next || next.attach != attachVimMap) - leaveVimMode(cm); - } - function attachVimMap(cm, prev) { - if (this == CodeMirror.keyMap.vim) { - if (cm.curOp) cm.curOp.selectionChanged = true; - cm.options.$customCursor = transformCursor; - CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); - } - - if (!prev || prev.attach != attachVimMap) - enterVimMode(cm); - } - CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { - if (val && cm.getOption("keyMap") != "vim") - cm.setOption("keyMap", "vim"); - else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) - cm.setOption("keyMap", "default"); - }); - - function cmKey(key, cm) { - if (!cm) { return undefined; } - if (this[key]) { return this[key]; } - var vimKey = cmKeyToVimKey(key); - if (!vimKey) { - return false; - } - var cmd = vimApi.findKey(cm, vimKey); - if (typeof cmd == 'function') { - CodeMirror.signal(cm, 'vim-keypress', vimKey); - } - return cmd; - } - - var modifiers = {Shift:'S',Ctrl:'C',Alt:'A',Cmd:'D',Mod:'A',CapsLock:''}; - var specialKeys = {Enter:'CR',Backspace:'BS',Delete:'Del',Insert:'Ins'}; - function cmKeyToVimKey(key) { - if (key.charAt(0) == '\'') { - return key.charAt(1); - } - var pieces = key.split(/-(?!$)/); - var lastPiece = pieces[pieces.length - 1]; - if (pieces.length == 1 && pieces[0].length == 1) { - return false; - } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { - return false; - } - var hasCharacter = false; - for (var i = 0; i < pieces.length; i++) { - var piece = pieces[i]; - if (piece in modifiers) { pieces[i] = modifiers[piece]; } - else { hasCharacter = true; } - if (piece in specialKeys) { pieces[i] = specialKeys[piece]; } - } - if (!hasCharacter) { - return false; - } - if (isUpperCase(lastPiece)) { - pieces[pieces.length - 1] = lastPiece.toLowerCase(); - } - return '<' + pieces.join('-') + '>'; - } - - function getOnPasteFn(cm) { - var vim = cm.state.vim; - if (!vim.onPasteFn) { - vim.onPasteFn = function() { - if (!vim.insertMode) { - cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); - actions.enterInsertMode(cm, {}, vim); - } +]; +var langmap = parseLangmap(''); +function enterVimMode(cm) { + cm.setOption('disableInput', true); + cm.setOption('showCursorWhenSelecting', false); + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); + cm.on('cursorActivity', onCursorActivity); + maybeInitVimState(cm); + CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); +} +function leaveVimMode(cm) { + cm.setOption('disableInput', false); + cm.off('cursorActivity', onCursorActivity); + CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); + cm.state.vim = null; + if (highlightTimeout) + clearTimeout(highlightTimeout); +} +function getOnPasteFn(cm) { + var vim = cm.state.vim; + if (!vim.onPasteFn) { + vim.onPasteFn = function () { + if (!vim.insertMode) { + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); + actions.enterInsertMode(cm, {}, vim); + } }; - } - return vim.onPasteFn; } - - var numberRegex = /[\d]/; - var wordCharTest = [CodeMirror.isWordChar, function(ch) { - return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); - }], bigWordCharTest = [function(ch) { - return /\S/.test(ch); + return vim.onPasteFn; +} +var numberRegex = /[\d]/; +var wordCharTest = [CodeMirror.isWordChar, function (ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); + }], bigWordCharTest = [function (ch) { + return /\S/.test(ch); }]; - function makeKeyRange(start, size) { - var keys = []; - for (var i = start; i < start + size; i++) { - keys.push(String.fromCharCode(i)); - } - return keys; - } - var upperCaseAlphabet = makeKeyRange(65, 26); - var lowerCaseAlphabet = makeKeyRange(97, 26); - var numbers = makeKeyRange(48, 10); - var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); - var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '_', '/']); - var upperCaseChars; - try { upperCaseChars = new RegExp("^[\\p{Lu}]$", "u"); } - catch (_) { upperCaseChars = /^[A-Z]$/; } - - function isLine(cm, line) { - return line >= cm.firstLine() && line <= cm.lastLine(); - } - function isLowerCase(k) { - return (/^[a-z]$/).test(k); - } - function isMatchableSymbol(k) { - return '()[]{}'.indexOf(k) != -1; - } - function isNumber(k) { - return numberRegex.test(k); - } - function isUpperCase(k) { - return upperCaseChars.test(k); - } - function isWhiteSpaceString(k) { - return (/^\s*$/).test(k); - } - function isEndOfSentenceSymbol(k) { - return '.?!'.indexOf(k) != -1; - } - function inArray(val, arr) { - for (var i = 0; i < arr.length; i++) { +var validMarks = ['<', '>']; +var validRegisters = ['-', '"', '.', ':', '_', '/', '+']; +var latinCharRegex = /^\w$/; +var upperCaseChars; +try { + upperCaseChars = new RegExp("^[\\p{Lu}]$", "u"); +} +catch (_) { + upperCaseChars = /^[A-Z]$/; +} +function isLine(cm, line) { + return line >= cm.firstLine() && line <= cm.lastLine(); +} +function isLowerCase(k) { + return (/^[a-z]$/).test(k); +} +function isMatchableSymbol(k) { + return '()[]{}'.indexOf(k) != -1; +} +function isNumber(k) { + return numberRegex.test(k); +} +function isUpperCase(k) { + return upperCaseChars.test(k); +} +function isWhiteSpaceString(k) { + return (/^\s*$/).test(k); +} +function isEndOfSentenceSymbol(k) { + return '.?!'.indexOf(k) != -1; +} +function inArray(val, arr) { + for (var i = 0; i < arr.length; i++) { if (arr[i] == val) { - return true; + return true; } - } - return false; } - - var options = {}; - function defineOption(name, defaultValue, type, aliases, callback) { - if (defaultValue === undefined && !callback) { + return false; +} +var options = {}; +function defineOption(name, defaultValue, type, aliases, callback) { + if (defaultValue === undefined && !callback) { throw Error('defaultValue is required unless callback is provided'); - } - if (!type) { type = 'string'; } - options[name] = { + } + if (!type) { + type = 'string'; + } + options[name] = { type: type, defaultValue: defaultValue, callback: callback - }; - if (aliases) { + }; + if (aliases) { for (var i = 0; i < aliases.length; i++) { - options[aliases[i]] = options[name]; + options[aliases[i]] = options[name]; } - } - if (defaultValue) { + } + if (defaultValue) { setOption(name, defaultValue); - } } - - function setOption(name, value, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; - if (!option) { +} +function setOption(name, value, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { return new Error('Unknown option: ' + name); - } - if (option.type == 'boolean') { + } + if (option.type == 'boolean') { if (value && value !== true) { - return new Error('Invalid argument: ' + name + '=' + value); - } else if (value !== false) { - value = true; + return new Error('Invalid argument: ' + name + '=' + value); + } + else if (value !== false) { + value = true; } - } - if (option.callback) { + } + if (option.callback) { if (scope !== 'local') { - option.callback(value, undefined); + option.callback(value, undefined); } if (scope !== 'global' && cm) { - option.callback(value, cm); + option.callback(value, cm); } - } else { + } + else { if (scope !== 'local') { - option.value = option.type == 'boolean' ? !!value : value; + option.value = option.type == 'boolean' ? !!value : value; } if (scope !== 'global' && cm) { - cm.state.vim.options[name] = {value: value}; + cm.state.vim.options[name] = { value: value }; } - } } - - function getOption(name, cm, cfg) { - var option = options[name]; - cfg = cfg || {}; - var scope = cfg.scope; - if (!option) { +} +function getOption(name, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { return new Error('Unknown option: ' + name); - } - if (option.callback) { + } + if (option.callback) { var local = cm && option.callback(undefined, cm); if (scope !== 'global' && local !== undefined) { - return local; + return local; } if (scope !== 'local') { - return option.callback(); + return option.callback(); } return; - } else { + } + else { var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); return (local || (scope !== 'local') && option || {}).value; - } } - - defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { - if (cm === undefined) { +} +defineOption('filetype', undefined, 'string', ['ft'], function (name, cm) { + if (cm === undefined) { return; - } - if (name === undefined) { + } + if (name === undefined) { var mode = cm.getOption('mode'); return mode == 'null' ? '' : mode; - } else { + } + else { var mode = name == '' ? 'null' : name; cm.setOption('mode', mode); - } - }); - - var createCircularJumpList = function() { - var size = 100; - var pointer = -1; - var head = 0; - var tail = 0; - var buffer = new Array(size); - function add(cm, oldCur, newCur) { + } +}); +defineOption('textwidth', 80, 'number', ['tw'], function (width, cm) { + if (cm === undefined) { + return; + } + if (width === undefined) { + var value = cm.getOption('textwidth'); + return value; + } + else { + var column = Math.round(width); + if (column > 1) { + cm.setOption('textwidth', column); + } + } +}); +var createCircularJumpList = function () { + var size = 100; + var pointer = -1; + var head = 0; + var tail = 0; + var buffer = new Array(size); + function add(cm, oldCur, newCur) { var current = pointer % size; var curMark = buffer[current]; function useNextSlot(cursor) { - var next = ++pointer % size; - var trashMark = buffer[next]; - if (trashMark) { - trashMark.clear(); - } - buffer[next] = cm.setBookmark(cursor); + var next = ++pointer % size; + var trashMark = buffer[next]; + if (trashMark) { + trashMark.clear(); + } + buffer[next] = cm.setBookmark(cursor); } if (curMark) { - var markPos = curMark.find(); - if (markPos && !cursorEqual(markPos, oldCur)) { + var markPos = curMark.find(); + if (markPos && !cursorEqual(markPos, oldCur)) { + useNextSlot(oldCur); + } + } + else { useNextSlot(oldCur); - } - } else { - useNextSlot(oldCur); } useNextSlot(newCur); head = pointer; tail = pointer - size + 1; if (tail < 0) { - tail = 0; + tail = 0; } - } - function move(cm, offset) { + } + function move(cm, offset) { pointer += offset; if (pointer > head) { - pointer = head; - } else if (pointer < tail) { - pointer = tail; + pointer = head; + } + else if (pointer < tail) { + pointer = tail; } var mark = buffer[(size + pointer) % size]; if (mark && !mark.find()) { - var inc = offset > 0 ? 1 : -1; - var newCur; - var oldCur = cm.getCursor(); - do { - pointer += inc; - mark = buffer[(size + pointer) % size]; - if (mark && - (newCur = mark.find()) && - !cursorEqual(oldCur, newCur)) { - break; - } - } while (pointer < head && pointer > tail); + var inc = offset > 0 ? 1 : -1; + var newCur; + var oldCur = cm.getCursor(); + do { + pointer += inc; + mark = buffer[(size + pointer) % size]; + if (mark && + (newCur = mark.find()) && + !cursorEqual(oldCur, newCur)) { + break; + } + } while (pointer < head && pointer > tail); } return mark; - } - function find(cm, offset) { + } + function find(cm, offset) { var oldPointer = pointer; var mark = move(cm, offset); pointer = oldPointer; return mark && mark.find(); - } - return { + } + return { cachedCursor: undefined, //used for # and * jumps add: add, find: find, move: move - }; }; - var createInsertModeChanges = function(c) { - if (c) { +}; +var createInsertModeChanges = function (c) { + if (c) { return { - changes: c.changes, - expectCursorActivityForChange: c.expectCursorActivityForChange + changes: c.changes, + expectCursorActivityForChange: c.expectCursorActivityForChange }; - } - return { + } + return { changes: [], expectCursorActivityForChange: false - }; }; - - function MacroModeState() { - this.latestRegister = undefined; - this.isPlaying = false; - this.isRecording = false; - this.replaySearchQueries = []; - this.onRecordingDone = undefined; - this.lastInsertModeChanges = createInsertModeChanges(); - } - MacroModeState.prototype = { - exitMacroRecordMode: function() { +}; +function MacroModeState() { + this.latestRegister = undefined; + this.isPlaying = false; + this.isRecording = false; + this.replaySearchQueries = []; + this.onRecordingDone = undefined; + this.lastInsertModeChanges = createInsertModeChanges(); +} +MacroModeState.prototype = { + exitMacroRecordMode: function () { var macroModeState = vimGlobalState.macroModeState; if (macroModeState.onRecordingDone) { - macroModeState.onRecordingDone(); // close dialog + macroModeState.onRecordingDone(); // close dialog } macroModeState.onRecordingDone = undefined; macroModeState.isRecording = false; - }, - enterMacroRecordMode: function(cm, registerName) { - var register = - vimGlobalState.registerController.getRegister(registerName); + }, + enterMacroRecordMode: function (cm, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); if (register) { - register.clear(); - this.latestRegister = registerName; - if (cm.openDialog) { - this.onRecordingDone = cm.openDialog( - document.createTextNode('(recording)['+registerName+']'), null, {bottom:true}); - } - this.isRecording = true; - } - } - }; - - function maybeInitVimState(cm) { - if (!cm.state.vim) { + register.clear(); + this.latestRegister = registerName; + if (cm.openDialog) { + var template = dom('span', { class: 'cm-vim-message' }, 'recording @' + registerName); + this.onRecordingDone = cm.openDialog(template, null, { bottom: true }); + } + this.isRecording = true; + } + } +}; +function maybeInitVimState(cm) { + if (!cm.state.vim) { cm.state.vim = { - inputState: new InputState(), - lastEditInputState: undefined, - lastEditActionCommand: undefined, - lastHPos: -1, - lastHSPos: -1, - lastMotion: null, - marks: {}, - insertMode: false, - insertModeRepeat: undefined, - visualMode: false, - visualLine: false, - visualBlock: false, - lastSelection: null, - lastPastedText: null, - sel: {}, - options: {} + inputState: new InputState(), + lastEditInputState: undefined, + lastEditActionCommand: undefined, + lastHPos: -1, + lastHSPos: -1, + lastMotion: null, + marks: {}, + insertMode: false, + insertModeReturn: false, + insertModeRepeat: undefined, + visualMode: false, + visualLine: false, + visualBlock: false, + lastSelection: null, + lastPastedText: null, + sel: {}, + options: {}, + expectLiteralNext: false }; - } - return cm.state.vim; } - var vimGlobalState; - function resetVimGlobalState() { - vimGlobalState = { + return cm.state.vim; +} +var vimGlobalState; +function resetVimGlobalState() { + vimGlobalState = { searchQuery: null, searchIsReversed: false, lastSubstituteReplacePart: undefined, jumpList: createCircularJumpList(), macroModeState: new MacroModeState, - lastCharacterSearch: {increment:0, forward:true, selectedCharacter:''}, + lastCharacterSearch: { increment: 0, forward: true, selectedCharacter: '' }, registerController: new RegisterController({}), searchHistoryController: new HistoryController(), - exCommandHistoryController : new HistoryController() - }; - for (var optionName in options) { + exCommandHistoryController: new HistoryController() + }; + for (var optionName in options) { var option = options[optionName]; option.value = option.defaultValue; - } } - - var lastInsertModeKeyTimer; - var vimApi= { - buildKeyMap: function() { - }, - getRegisterController: function() { +} +var lastInsertModeKeyTimer; +var vimApi = { + enterVimMode: enterVimMode, + leaveVimMode: leaveVimMode, + buildKeyMap: function () { + }, + getRegisterController: function () { return vimGlobalState.registerController; - }, - resetVimGlobalState_: resetVimGlobalState, - getVimGlobalState_: function() { + }, + resetVimGlobalState_: resetVimGlobalState, + getVimGlobalState_: function () { return vimGlobalState; - }, - maybeInitVimState_: maybeInitVimState, - - suppressErrorLogging: false, - - InsertModeKey: InsertModeKey, - map: function(lhs, rhs, ctx) { + }, + maybeInitVimState_: maybeInitVimState, + suppressErrorLogging: false, + InsertModeKey: InsertModeKey, + map: function (lhs, rhs, ctx) { exCommandDispatcher.map(lhs, rhs, ctx); - }, - unmap: function(lhs, ctx) { + }, + unmap: function (lhs, ctx) { return exCommandDispatcher.unmap(lhs, ctx); - }, - noremap: function(lhs, rhs, ctx) { - function toCtxArray(ctx) { - return ctx ? [ctx] : ['normal', 'insert', 'visual']; - } - var ctxsToMap = toCtxArray(ctx); + }, + noremap: function (lhs, rhs, ctx) { + exCommandDispatcher.map(lhs, rhs, ctx, true); + }, + mapclear: function (ctx) { var actualLength = defaultKeymap.length, origLength = defaultKeymapLength; - for (var i = actualLength - origLength; - i < actualLength && ctxsToMap.length; - i++) { - var mapping = defaultKeymap[i]; - if (mapping.keys == rhs && - (!ctx || !mapping.context || mapping.context === ctx) && - mapping.type.substr(0, 2) !== 'ex' && - mapping.type.substr(0, 3) !== 'key') { - var newMapping = {}; - for (var key in mapping) { - newMapping[key] = mapping[key]; - } - newMapping.keys = lhs; - if (ctx && !newMapping.context) { - newMapping.context = ctx; - } - this._mapCommand(newMapping); - var mappedCtxs = toCtxArray(mapping.context); - ctxsToMap = ctxsToMap.filter(function(el) { return mappedCtxs.indexOf(el) === -1; }); - } - } - }, - mapclear: function(ctx) { - var actualLength = defaultKeymap.length, - origLength = defaultKeymapLength; var userKeymap = defaultKeymap.slice(0, actualLength - origLength); defaultKeymap = defaultKeymap.slice(actualLength - origLength); if (ctx) { - for (var i = userKeymap.length - 1; i >= 0; i--) { - var mapping = userKeymap[i]; - if (ctx !== mapping.context) { - if (mapping.context) { - this._mapCommand(mapping); - } else { - var contexts = ['normal', 'insert', 'visual']; - for (var j in contexts) { - if (contexts[j] !== ctx) { - var newMapping = {}; - for (var key in mapping) { - newMapping[key] = mapping[key]; + for (var i = userKeymap.length - 1; i >= 0; i--) { + var mapping = userKeymap[i]; + if (ctx !== mapping.context) { + if (mapping.context) { + this._mapCommand(mapping); + } + else { + var contexts = ['normal', 'insert', 'visual']; + for (var j in contexts) { + if (contexts[j] !== ctx) { + var newMapping = {}; + for (var key in mapping) { + newMapping[key] = mapping[key]; + } + newMapping.context = contexts[j]; + this._mapCommand(newMapping); + } + } } - newMapping.context = contexts[j]; - this._mapCommand(newMapping); - } } - } } - } } - }, - setOption: setOption, - getOption: getOption, - defineOption: defineOption, - defineEx: function(name, prefix, func){ + }, + langmap: updateLangmap, + vimKeyFromEvent: vimKeyFromEvent, + setOption: setOption, + getOption: getOption, + defineOption: defineOption, + defineEx: function (name, prefix, func) { if (!prefix) { - prefix = name; - } else if (name.indexOf(prefix) !== 0) { - throw new Error('(Vim.defineEx) "'+prefix+'" is not a prefix of "'+name+'", command not registered'); - } - exCommands[name]=func; - exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'}; - }, - handleKey: function (cm, key, origin) { + prefix = name; + } + else if (name.indexOf(prefix) !== 0) { + throw new Error('(Vim.defineEx) "' + prefix + '" is not a prefix of "' + name + '", command not registered'); + } + exCommands[name] = func; + exCommandDispatcher.commandMap_[prefix] = { name: name, shortName: prefix, type: 'api' }; + }, + handleKey: function (cm, key, origin) { var command = this.findKey(cm, key, origin); if (typeof command === 'function') { - return command(); + return command(); } - }, - findKey: function(cm, key, origin) { + }, + multiSelectHandleKey: multiSelectHandleKey, + findKey: function (cm, key, origin) { var vim = maybeInitVimState(cm); function handleMacroRecording() { - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isRecording) { - if (key == 'q') { - macroModeState.exitMacroRecordMode(); - clearInputState(cm); - return true; - } - if (origin != 'mapping') { - logKey(macroModeState, key); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + if (key == 'q') { + macroModeState.exitMacroRecordMode(); + clearInputState(cm); + return true; + } + if (origin != 'mapping') { + logKey(macroModeState, key); + } } - } } function handleEsc() { - if (key == '') { - clearInputState(cm); - if (vim.visualMode) { - exitVisualMode(cm); - } else if (vim.insertMode) { - exitInsertMode(cm); + if (key == '') { + if (vim.visualMode) { + exitVisualMode(cm); + } + else if (vim.insertMode) { + exitInsertMode(cm); + } + else { + return; + } + clearInputState(cm); + return true; } - return true; - } } - function doKeyToKey(keys) { - var match; - while (keys) { - match = (/<\w+-.+?>|<\w+>|./).exec(keys); - key = match[0]; - keys = keys.substring(match.index + key.length); - vimApi.handleKey(cm, key, 'mapping'); - } - } - function handleKeyInsertMode() { - if (handleEsc()) { return true; } - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - var keysAreChars = key.length == 1; - var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); - while (keys.length > 1 && match.type != 'full') { - var keys = vim.inputState.keyBuffer = keys.slice(1); - var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); - if (thisMatch.type != 'none') { match = thisMatch; } - } - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } - lastInsertModeKeyTimer = window.setTimeout( - function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } }, - getOption('insertModeEscKeysTimeout')); - return !keysAreChars; - } - - if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); } - if (keysAreChars) { - var selections = cm.listSelections(); - for (var i = 0; i < selections.length; i++) { - var here = selections[i].head; - cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + if (handleEsc()) { + return true; } - vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); - } - clearInputState(cm); - return match.command; + vim.inputState.keyBuffer.push(key); + var keys = vim.inputState.keyBuffer.join(""); + var keysAreChars = key.length == 1; + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + var changeQueue = vim.inputState.changeQueue; + if (match.type == 'none') { + clearInputState(cm); + return false; + } + else if (match.type == 'partial') { + if (match.expectLiteralNext) + vim.expectLiteralNext = true; + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + lastInsertModeKeyTimer = keysAreChars && window.setTimeout(function () { if (vim.insertMode && vim.inputState.keyBuffer.length) { + clearInputState(cm); + } }, getOption('insertModeEscKeysTimeout')); + if (keysAreChars) { + var selections = cm.listSelections(); + if (!changeQueue || changeQueue.removed.length != selections.length) + changeQueue = vim.inputState.changeQueue = new ChangeQueue; + changeQueue.inserted += key; + for (var i = 0; i < selections.length; i++) { + var from = cursorMin(selections[i].anchor, selections[i].head); + var to = cursorMax(selections[i].anchor, selections[i].head); + var text = cm.getRange(from, cm.state.overwrite ? offsetCursor(to, 0, 1) : to); + changeQueue.removed[i] = (changeQueue.removed[i] || "") + text; + } + } + return !keysAreChars; + } + vim.expectLiteralNext = false; + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + if (match.command && changeQueue) { + var selections = cm.listSelections(); + for (var i = 0; i < selections.length; i++) { + var here = selections[i].head; + cm.replaceRange(changeQueue.removed[i] || "", offsetCursor(here, 0, -changeQueue.inserted.length), here, '+input'); + } + vimGlobalState.macroModeState.lastInsertModeChanges.changes.pop(); + } + if (!match.command) + clearInputState(cm); + return match.command; } - function handleKeyNonInsertMode() { - if (handleMacroRecording() || handleEsc()) { return true; } - - var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; - if (/^[1-9]\d*$/.test(keys)) { return true; } - - var keysMatcher = /^(\d*)(.*)$/.exec(keys); - if (!keysMatcher) { clearInputState(cm); return false; } - var context = vim.visualMode ? 'visual' : - 'normal'; - var mainKey = keysMatcher[2] || keysMatcher[1]; - if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) { - mainKey = vim.inputState.operatorShortcut; - } - var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context); - if (match.type == 'none') { clearInputState(cm); return false; } - else if (match.type == 'partial') { return true; } - else if (match.type == 'clear') { clearInputState(cm); return true; } // ace_patch - - vim.inputState.keyBuffer = ''; - var keysMatcher = /^(\d*)(.*)$/.exec(keys); - if (keysMatcher[1] && keysMatcher[1] != '0') { - vim.inputState.pushRepeatDigit(keysMatcher[1]); - } - return match.command; + if (handleMacroRecording() || handleEsc()) { + return true; + } + vim.inputState.keyBuffer.push(key); + var keys = vim.inputState.keyBuffer.join(""); + if (/^[1-9]\d*$/.test(keys)) { + return true; + } + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (!keysMatcher) { + clearInputState(cm); + return false; + } + var context = vim.visualMode ? 'visual' : + 'normal'; + var mainKey = keysMatcher[2] || keysMatcher[1]; + if (vim.inputState.operatorShortcut && vim.inputState.operatorShortcut.slice(-1) == mainKey) { + mainKey = vim.inputState.operatorShortcut; + } + var match = commandDispatcher.matchCommand(mainKey, defaultKeymap, vim.inputState, context); + if (match.type == 'none') { + clearInputState(cm); + return false; + } + else if (match.type == 'partial') { + if (match.expectLiteralNext) + vim.expectLiteralNext = true; + return true; + } + else if (match.type == 'clear') { + clearInputState(cm); + return true; + } + vim.expectLiteralNext = false; + vim.inputState.keyBuffer.length = 0; + keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (keysMatcher[1] && keysMatcher[1] != '0') { + vim.inputState.pushRepeatDigit(keysMatcher[1]); + } + return match.command; } - var command; - if (vim.insertMode) { command = handleKeyInsertMode(); } - else { command = handleKeyNonInsertMode(); } + if (vim.insertMode) { + command = handleKeyInsertMode(); + } + else { + command = handleKeyNonInsertMode(); + } if (command === false) { - return undefined; //ace_patch - } else if (command === true) { - return function() { return true; }; - } else { - return function() { - if ((command.operator || command.isEdit) && cm.getOption('readOnly')) - return; // ace_patch - return cm.operation(function() { - cm.curOp.isVimOp = true; - try { - if (command.type == 'keyToKey') { - doKeyToKey(command.toKeys); - } else { - commandDispatcher.processCommand(cm, vim, command); - } - } catch (e) { - cm.state.vim = undefined; - maybeInitVimState(cm); - if (!vimApi.suppressErrorLogging) { - console['log'](e); - } - throw e; - } - return true; - }); - }; + return !vim.insertMode && key.length === 1 ? function () { return true; } : undefined; + } + else if (command === true) { + return function () { return true; }; + } + else { + return function () { + if ((command.operator || command.isEdit) && cm.getOption('readOnly')) + return; // ace_patch + return cm.operation(function () { + cm.curOp.isVimOp = true; + try { + if (command.type == 'keyToKey') { + doKeyToKey(cm, command.toKeys, command); + } + else { + commandDispatcher.processCommand(cm, vim, command); + } + } + catch (e) { + cm.state.vim = undefined; + maybeInitVimState(cm); + if (!vimApi.suppressErrorLogging) { + console['log'](e); + } + throw e; + } + return true; + }); + }; } - }, - handleEx: function(cm, input) { + }, + handleEx: function (cm, input) { exCommandDispatcher.processCommand(cm, input); - }, - - defineMotion: defineMotion, - defineAction: defineAction, - defineOperator: defineOperator, - mapCommand: mapCommand, - _mapCommand: _mapCommand, - - defineRegister: defineRegister, - - exitVisualMode: exitVisualMode, - exitInsertMode: exitInsertMode - }; - function InputState() { - this.prefixRepeat = []; - this.motionRepeat = []; - - this.operator = null; - this.operatorArgs = null; - this.motion = null; - this.motionArgs = null; - this.keyBuffer = []; // For matching multi-key commands. - this.registerName = null; // Defaults to the unnamed register. - } - InputState.prototype.pushRepeatDigit = function(n) { - if (!this.operator) { + }, + defineMotion: defineMotion, + defineAction: defineAction, + defineOperator: defineOperator, + mapCommand: mapCommand, + _mapCommand: _mapCommand, + defineRegister: defineRegister, + exitVisualMode: exitVisualMode, + exitInsertMode: exitInsertMode +}; +var keyToKeyStack = []; +var noremap = false; +var virtualPrompt; +function sendKeyToPrompt(key) { + if (key[0] == "<") { + var lowerKey = key.toLowerCase().slice(1, -1); + var parts = lowerKey.split('-'); + lowerKey = parts.pop() || ''; + if (lowerKey == 'lt') + key = '<'; + else if (lowerKey == 'space') + key = ' '; + else if (lowerKey == 'cr') + key = '\n'; + else if (vimToCmKeyMap[lowerKey]) { + var value = virtualPrompt.value; + var event = { + key: vimToCmKeyMap[lowerKey], + target: { + value: value, + selectionEnd: value.length, + selectionStart: value.length + } + }; + if (virtualPrompt.onKeyDown) { + virtualPrompt.onKeyDown(event, virtualPrompt.value, close); + } + if (virtualPrompt && virtualPrompt.onKeyUp) { + virtualPrompt.onKeyUp(event, virtualPrompt.value, close); + } + return; + } + } + if (key == '\n') { + var prompt = virtualPrompt; + virtualPrompt = null; + prompt.onClose && prompt.onClose(prompt.value); + } + else { + virtualPrompt.value = (virtualPrompt.value || '') + key; + } + function close(value) { + if (typeof value == 'string') { + virtualPrompt.value = value; + } + else { + virtualPrompt = null; + } + } +} +function doKeyToKey(cm, keys, fromKey) { + var noremapBefore = noremap; + if (fromKey) { + if (keyToKeyStack.indexOf(fromKey) != -1) + return; + keyToKeyStack.push(fromKey); + noremap = fromKey.noremap != false; + } + try { + var vim = maybeInitVimState(cm); + var keyRe = /<(?:[CSMA]-)*\w+>|./gi; + var match; + while ((match = keyRe.exec(keys))) { + var key = match[0]; + var wasInsert = vim.insertMode; + if (virtualPrompt) { + sendKeyToPrompt(key); + continue; + } + var result = vimApi.handleKey(cm, key, 'mapping'); + if (!result && wasInsert && vim.insertMode) { + if (key[0] == "<") { + var lowerKey = key.toLowerCase().slice(1, -1); + var parts = lowerKey.split('-'); + lowerKey = parts.pop() || ''; + if (lowerKey == 'lt') + key = '<'; + else if (lowerKey == 'space') + key = ' '; + else if (lowerKey == 'cr') + key = '\n'; + else if (vimToCmKeyMap.hasOwnProperty(lowerKey)) { + key = vimToCmKeyMap[lowerKey]; + sendCmKey(cm, key); + continue; + } + else { + key = key[0]; + keyRe.lastIndex = match.index + 1; + } + } + cm.replaceSelection(key); + } + } + } + finally { + keyToKeyStack.pop(); + noremap = keyToKeyStack.length ? noremapBefore : false; + if (!keyToKeyStack.length && virtualPrompt) { + var promptOptions = virtualPrompt; + virtualPrompt = null; + showPrompt(cm, promptOptions); + } + } +} +var specialKey = { + Return: 'CR', Backspace: 'BS', 'Delete': 'Del', Escape: 'Esc', Insert: 'Ins', + ArrowLeft: 'Left', ArrowRight: 'Right', ArrowUp: 'Up', ArrowDown: 'Down', + Enter: 'CR', ' ': 'Space' +}; +var ignoredKeys = { Shift: 1, Alt: 1, Command: 1, Control: 1, + CapsLock: 1, AltGraph: 1, Dead: 1, Unidentified: 1 }; +var vimToCmKeyMap = {}; +'Left|Right|Up|Down|End|Home'.split('|').concat(Object.keys(specialKey)).forEach(function (x) { + vimToCmKeyMap[(specialKey[x] || '').toLowerCase()] + = vimToCmKeyMap[x.toLowerCase()] = x; +}); +function vimKeyFromEvent(e, vim) { + var key = e.key; + if (ignoredKeys[key]) + return; + if (key.length > 1 && key[0] == "n") { + key = key.replace("Numpad", ""); + } + key = specialKey[key] || key; + var name = ''; + if (e.ctrlKey) { + name += 'C-'; + } + if (e.altKey) { + name += 'A-'; + } + if (e.metaKey) { + name += 'M-'; + } + if (CodeMirror.isMac && e.altKey && !e.metaKey && !e.ctrlKey) { + name = name.slice(2); + } + if ((name || key.length > 1) && e.shiftKey) { + name += 'S-'; + } + if (vim && !vim.expectLiteralNext && key.length == 1) { + if (langmap.keymap && key in langmap.keymap) { + if (langmap.remapCtrl != false || !name) + key = langmap.keymap[key]; + } + else if (key.charCodeAt(0) > 255) { + var code = e.code && e.code.slice(-1) || ""; + if (!e.shiftKey) + code = code.toLowerCase(); + if (code) + key = code; + } + } + name += key; + if (name.length > 1) { + name = '<' + name + '>'; + } + return name; +} +; +function updateLangmap(langmapString, remapCtrl) { + if (langmap.string !== langmapString) { + langmap = parseLangmap(langmapString); + } + langmap.remapCtrl = remapCtrl; +} +function parseLangmap(langmapString) { + var keymap = {}; + if (!langmapString) + return { keymap: keymap, string: '' }; + function getEscaped(list) { + return list.split(/\\?(.)/).filter(Boolean); + } + langmapString.split(/((?:[^\\,]|\\.)+),/).map(function (part) { + if (!part) + return; + var semicolon = part.split(/((?:[^\\;]|\\.)+);/); + if (semicolon.length == 3) { + var from = getEscaped(semicolon[1]); + var to = getEscaped(semicolon[2]); + if (from.length !== to.length) + return; // skip over malformed part + for (var i = 0; i < from.length; ++i) + keymap[from[i]] = to[i]; + } + else if (semicolon.length == 1) { + var pairs = getEscaped(part); + if (pairs.length % 2 !== 0) + return; // skip over malformed part + for (var i = 0; i < pairs.length; i += 2) + keymap[pairs[i]] = pairs[i + 1]; + } + }); + return { keymap: keymap, string: langmapString }; +} +defineOption('langmap', undefined, 'string', ['lmap'], function (name, cm) { + if (name === undefined) { + return langmap.string; + } + else { + updateLangmap(name); + } +}); +function InputState() { + this.prefixRepeat = []; + this.motionRepeat = []; + this.operator = null; + this.operatorArgs = null; + this.motion = null; + this.motionArgs = null; + this.keyBuffer = []; // For matching multi-key commands. + this.registerName = null; // Defaults to the unnamed register. + this.changeQueue = null; // For restoring text used by insert mode keybindings +} +InputState.prototype.pushRepeatDigit = function (n) { + if (!this.operator) { this.prefixRepeat = this.prefixRepeat.concat(n); - } else { + } + else { this.motionRepeat = this.motionRepeat.concat(n); - } - }; - InputState.prototype.getRepeat = function() { - var repeat = 0; - if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { + } +}; +InputState.prototype.getRepeat = function () { + var repeat = 0; + if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { repeat = 1; if (this.prefixRepeat.length > 0) { - repeat *= parseInt(this.prefixRepeat.join(''), 10); + repeat *= parseInt(this.prefixRepeat.join(''), 10); } if (this.motionRepeat.length > 0) { - repeat *= parseInt(this.motionRepeat.join(''), 10); + repeat *= parseInt(this.motionRepeat.join(''), 10); } - } - return repeat; - }; - - function clearInputState(cm, reason) { - cm.state.vim.inputState = new InputState(); - CodeMirror.signal(cm, 'vim-command-done', reason); - } - function Register(text, linewise, blockwise) { - this.clear(); - this.keyBuffer = [text || '']; - this.insertModeChanges = []; - this.searchQueries = []; - this.linewise = !!linewise; - this.blockwise = !!blockwise; - } - Register.prototype = { - setText: function(text, linewise, blockwise) { + } + return repeat; +}; +function clearInputState(cm, reason) { + cm.state.vim.inputState = new InputState(); + cm.state.vim.expectLiteralNext = false; + CodeMirror.signal(cm, 'vim-command-done', reason); +} +function ChangeQueue() { + this.removed = []; + this.inserted = ""; +} +function Register(text, linewise, blockwise) { + this.clear(); + this.keyBuffer = [text || '']; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = !!linewise; + this.blockwise = !!blockwise; +} +Register.prototype = { + setText: function (text, linewise, blockwise) { this.keyBuffer = [text || '']; this.linewise = !!linewise; this.blockwise = !!blockwise; - }, - pushText: function(text, linewise) { + }, + pushText: function (text, linewise) { if (linewise) { - if (!this.linewise) { - this.keyBuffer.push('\n'); - } - this.linewise = true; + if (!this.linewise) { + this.keyBuffer.push('\n'); + } + this.linewise = true; } this.keyBuffer.push(text); - }, - pushInsertModeChanges: function(changes) { + }, + pushInsertModeChanges: function (changes) { this.insertModeChanges.push(createInsertModeChanges(changes)); - }, - pushSearchQuery: function(query) { + }, + pushSearchQuery: function (query) { this.searchQueries.push(query); - }, - clear: function() { + }, + clear: function () { this.keyBuffer = []; this.insertModeChanges = []; this.searchQueries = []; this.linewise = false; - }, - toString: function() { + }, + toString: function () { return this.keyBuffer.join(''); - } - }; - function defineRegister(name, register) { - var registers = vimGlobalState.registerController.registers; - if (!name || name.length != 1) { + } +}; +function defineRegister(name, register) { + var registers = vimGlobalState.registerController.registers; + if (!name || name.length != 1) { throw Error('Register name must be 1 character'); - } - registers[name] = register; - validRegisters.push(name); - } - function RegisterController(registers) { - this.registers = registers; - this.unnamedRegister = registers['"'] = new Register(); - registers['.'] = new Register(); - registers[':'] = new Register(); - registers['/'] = new Register(); - } - RegisterController.prototype = { - pushText: function(registerName, operator, text, linewise, blockwise) { - if (registerName === '_') return; - if (linewise && text.charAt(text.length - 1) !== '\n'){ - text += '\n'; + } + registers[name] = register; + validRegisters.push(name); +} +function RegisterController(registers) { + this.registers = registers; + this.unnamedRegister = registers['"'] = new Register(); + registers['.'] = new Register(); + registers[':'] = new Register(); + registers['/'] = new Register(); + registers['+'] = new Register(); +} +RegisterController.prototype = { + pushText: function (registerName, operator, text, linewise, blockwise) { + if (registerName === '_') + return; + if (linewise && text.charAt(text.length - 1) !== '\n') { + text += '\n'; } var register = this.isValidRegister(registerName) ? this.getRegister(registerName) : null; if (!register) { - switch (operator) { - case 'yank': - this.registers['0'] = new Register(text, linewise, blockwise); - break; - case 'delete': - case 'change': - if (text.indexOf('\n') == -1) { - this.registers['-'] = new Register(text, linewise); - } else { - this.shiftNumericRegisters_(); - this.registers['1'] = new Register(text, linewise); - } - break; - } - this.unnamedRegister.setText(text, linewise, blockwise); - return; + switch (operator) { + case 'yank': + this.registers['0'] = new Register(text, linewise, blockwise); + break; + case 'delete': + case 'change': + if (text.indexOf('\n') == -1) { + this.registers['-'] = new Register(text, linewise); + } + else { + this.shiftNumericRegisters_(); + this.registers['1'] = new Register(text, linewise); + } + break; + } + this.unnamedRegister.setText(text, linewise, blockwise); + return; } var append = isUpperCase(registerName); if (append) { - register.pushText(text, linewise); - } else { - register.setText(text, linewise, blockwise); + register.pushText(text, linewise); + } + else { + register.setText(text, linewise, blockwise); + } + if (registerName === '+' && typeof navigator !== 'undefined' && + typeof navigator.clipboard !== 'undefined' && + typeof navigator.clipboard.readText === 'function') { + navigator.clipboard.writeText(text); } this.unnamedRegister.setText(register.toString(), linewise); - }, - getRegister: function(name) { + }, + getRegister: function (name) { if (!this.isValidRegister(name)) { - return this.unnamedRegister; + return this.unnamedRegister; } name = name.toLowerCase(); if (!this.registers[name]) { - this.registers[name] = new Register(); + this.registers[name] = new Register(); } return this.registers[name]; - }, - isValidRegister: function(name) { - return name && inArray(name, validRegisters); - }, - shiftNumericRegisters_: function() { + }, + isValidRegister: function (name) { + return name && (inArray(name, validRegisters) || latinCharRegex.test(name)); + }, + shiftNumericRegisters_: function () { for (var i = 9; i >= 2; i--) { - this.registers[i] = this.getRegister('' + (i - 1)); + this.registers[i] = this.getRegister('' + (i - 1)); } - } - }; - function HistoryController() { - this.historyBuffer = []; - this.iterator = 0; - this.initialPrefix = null; } - HistoryController.prototype = { - nextMatch: function (input, up) { +}; +function HistoryController() { + this.historyBuffer = []; + this.iterator = 0; + this.initialPrefix = null; +} +HistoryController.prototype = { + nextMatch: function (input, up) { var historyBuffer = this.historyBuffer; var dir = up ? -1 : 1; - if (this.initialPrefix === null) this.initialPrefix = input; - for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) { - var element = historyBuffer[i]; - for (var j = 0; j <= element.length; j++) { - if (this.initialPrefix == element.substring(0, j)) { - this.iterator = i; - return element; + if (this.initialPrefix === null) + this.initialPrefix = input; + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) { + var element = historyBuffer[i]; + for (var j = 0; j <= element.length; j++) { + if (this.initialPrefix == element.substring(0, j)) { + this.iterator = i; + return element; + } } - } } if (i >= historyBuffer.length) { - this.iterator = historyBuffer.length; - return this.initialPrefix; + this.iterator = historyBuffer.length; + return this.initialPrefix; } - if (i < 0 ) return input; - }, - pushInput: function(input) { + if (i < 0) + return input; + }, + pushInput: function (input) { var index = this.historyBuffer.indexOf(input); - if (index > -1) this.historyBuffer.splice(index, 1); - if (input.length) this.historyBuffer.push(input); - }, - reset: function() { + if (index > -1) + this.historyBuffer.splice(index, 1); + if (input.length) + this.historyBuffer.push(input); + }, + reset: function () { this.initialPrefix = null; this.iterator = this.historyBuffer.length; - } - }; - var commandDispatcher = { - matchCommand: function(keys, keyMap, inputState, context) { + } +}; +var commandDispatcher = { + matchCommand: function (keys, keyMap, inputState, context) { var matches = commandMatches(keys, keyMap, context, inputState); if (!matches.full && !matches.partial) { - return {type: 'none'}; - } else if (!matches.full && matches.partial) { - return {type: 'partial'}; + return { type: 'none' }; + } + else if (!matches.full && matches.partial) { + return { + type: 'partial', + expectLiteralNext: matches.partial.length == 1 && matches.partial[0].keys.slice(-11) == '' // langmap literal logic + }; } - var bestMatch; for (var i = 0; i < matches.full.length; i++) { - var match = matches.full[i]; - if (!bestMatch) { - bestMatch = match; - } - } - if (bestMatch.keys.slice(-11) == '') { - var character = lastChar(keys); - if (!character || character.length > 1) return {type: 'clear'}; //ace_patch - inputState.selectedCharacter = character; - } - return {type: 'full', command: bestMatch}; - }, - processCommand: function(cm, vim, command) { + var match = matches.full[i]; + if (!bestMatch) { + bestMatch = match; + } + } + if (bestMatch.keys.slice(-11) == '' || bestMatch.keys.slice(-10) == '') { + var character = lastChar(keys); + if (!character || character.length > 1) + return { type: 'clear' }; + inputState.selectedCharacter = character; + } + return { type: 'full', command: bestMatch }; + }, + processCommand: function (cm, vim, command) { vim.inputState.repeatOverride = command.repeatOverride; switch (command.type) { - case 'motion': - this.processMotion(cm, vim, command); - break; - case 'operator': - this.processOperator(cm, vim, command); - break; - case 'operatorMotion': - this.processOperatorMotion(cm, vim, command); - break; - case 'action': - this.processAction(cm, vim, command); - break; - case 'search': - this.processSearch(cm, vim, command); - break; - case 'ex': - case 'keyToEx': - this.processEx(cm, vim, command); - break; - default: - break; + case 'motion': + this.processMotion(cm, vim, command); + break; + case 'operator': + this.processOperator(cm, vim, command); + break; + case 'operatorMotion': + this.processOperatorMotion(cm, vim, command); + break; + case 'action': + this.processAction(cm, vim, command); + break; + case 'search': + this.processSearch(cm, vim, command); + break; + case 'ex': + case 'keyToEx': + this.processEx(cm, vim, command); + break; + default: + break; } - }, - processMotion: function(cm, vim, command) { + }, + processMotion: function (cm, vim, command) { vim.inputState.motion = command.motion; vim.inputState.motionArgs = copyArgs(command.motionArgs); this.evalInput(cm, vim); - }, - processOperator: function(cm, vim, command) { + }, + processOperator: function (cm, vim, command) { var inputState = vim.inputState; if (inputState.operator) { - if (inputState.operator == command.operator) { - inputState.motion = 'expandToLine'; - inputState.motionArgs = { linewise: true }; - this.evalInput(cm, vim); - return; - } else { - clearInputState(cm); - } + if (inputState.operator == command.operator) { + inputState.motion = 'expandToLine'; + inputState.motionArgs = { linewise: true }; + this.evalInput(cm, vim); + return; + } + else { + clearInputState(cm); + } } inputState.operator = command.operator; inputState.operatorArgs = copyArgs(command.operatorArgs); if (command.keys.length > 1) { - inputState.operatorShortcut = command.keys; + inputState.operatorShortcut = command.keys; } if (command.exitVisualBlock) { vim.visualBlock = false; updateCmSelection(cm); } if (vim.visualMode) { - this.evalInput(cm, vim); + this.evalInput(cm, vim); } - }, - processOperatorMotion: function(cm, vim, command) { + }, + processOperatorMotion: function (cm, vim, command) { var visualMode = vim.visualMode; var operatorMotionArgs = copyArgs(command.operatorMotionArgs); if (operatorMotionArgs) { - if (visualMode && operatorMotionArgs.visualLine) { - vim.visualLine = true; - } + if (visualMode && operatorMotionArgs.visualLine) { + vim.visualLine = true; + } } this.processOperator(cm, vim, command); if (!visualMode) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command); } - }, - processAction: function(cm, vim, command) { + }, + processAction: function (cm, vim, command) { var inputState = vim.inputState; var repeat = inputState.getRepeat(); var repeatIsExplicit = !!repeat; var actionArgs = copyArgs(command.actionArgs) || {}; if (inputState.selectedCharacter) { - actionArgs.selectedCharacter = inputState.selectedCharacter; + actionArgs.selectedCharacter = inputState.selectedCharacter; } if (command.operator) { - this.processOperator(cm, vim, command); + this.processOperator(cm, vim, command); } if (command.motion) { - this.processMotion(cm, vim, command); + this.processMotion(cm, vim, command); } if (command.motion || command.operator) { - this.evalInput(cm, vim); + this.evalInput(cm, vim); } actionArgs.repeat = repeat || 1; actionArgs.repeatIsExplicit = repeatIsExplicit; @@ -2117,13 +2362,13 @@ dom.importCssString(".normal-mode .ace_cursor{\ clearInputState(cm); vim.lastMotion = null; if (command.isEdit) { - this.recordLastEdit(vim, inputState, command); + this.recordLastEdit(vim, inputState, command); } actions[command.action](cm, actionArgs, vim); - }, - processSearch: function(cm, vim, command) { + }, + processSearch: function (cm, vim, command) { if (!cm.getSearchCursor) { - return; + return; } var forward = command.searchArgs.forward; var wholeWordOnly = command.searchArgs.wholeWordOnly; @@ -2132,162 +2377,171 @@ dom.importCssString(".normal-mode .ace_cursor{\ var originalQuery = getSearchState(cm).getQuery(); var originalScrollPos = cm.getScrollInfo(); function handleQuery(query, ignoreCase, smartCase) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); - try { - updateSearchQuery(cm, query, ignoreCase, smartCase); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + query); - clearInputState(cm); - return; - } - commandDispatcher.processMotion(cm, vim, { - type: 'motion', - motion: 'findNext', - motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } - }); + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + try { + updateSearchQuery(cm, query, ignoreCase, smartCase); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + query); + clearInputState(cm); + return; + } + commandDispatcher.processMotion(cm, vim, { + type: 'motion', + motion: 'findNext', + motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist } + }); } function onPromptClose(query) { - handleQuery(query, true /** ignoreCase */, true /** smartCase */); - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isRecording) { - logSearchQuery(macroModeState, query); - } + handleQuery(query, true /** ignoreCase */, true /** smartCase */); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + logSearchQuery(macroModeState, query); + } } function onPromptKeyUp(e, query, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Up' || keyName == 'Down') { - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; - close(query); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); - } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.searchHistoryController.reset(); - } - var parsedQuery; - try { - parsedQuery = updateSearchQuery(cm, query, - true /** ignoreCase */, true /** smartCase */); - } catch (e) { - } - if (parsedQuery) { - cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); - } else { - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - } + var keyName = vimKeyFromEvent(e), up, offset; + if (keyName == '' || keyName == '') { + up = keyName == '' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; + close(query); + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } + else if (keyName && keyName != '' && keyName != '') { + vimGlobalState.searchHistoryController.reset(); + } + var parsedQuery; + try { + parsedQuery = updateSearchQuery(cm, query, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + } + if (parsedQuery) { + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + } + else { + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + } } function onPromptKeyDown(e, query, close) { - var keyName = CodeMirror.keyName(e); - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && query == '')) { - vimGlobalState.searchHistoryController.pushInput(query); - vimGlobalState.searchHistoryController.reset(); - updateSearchQuery(cm, originalQuery); - clearSearchHighlight(cm); - cm.scrollTo(originalScrollPos.left, originalScrollPos.top); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } else if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - } else if (keyName == 'Ctrl-U') { - CodeMirror.e_stop(e); - close(''); - } + var keyName = vimKeyFromEvent(e); + if (keyName == '' || keyName == '' || keyName == '' || + (keyName == '' && query == '')) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + updateSearchQuery(cm, originalQuery); + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + else if (keyName == '' || keyName == '') { + CodeMirror.e_stop(e); + } + else if (keyName == '') { + CodeMirror.e_stop(e); + close(''); + } } switch (command.searchArgs.querySrc) { - case 'prompt': - var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { - var query = macroModeState.replaySearchQueries.shift(); - handleQuery(query, true /** ignoreCase */, false /** smartCase */); - } else { - showPrompt(cm, { - onClose: onPromptClose, - prefix: promptPrefix, - desc: '(JavaScript regexp)', - onKeyUp: onPromptKeyUp, - onKeyDown: onPromptKeyDown - }); - } - break; - case 'wordUnderCursor': - var word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - true /** noSymbol */); - var isKeyword = true; - if (!word) { - word = expandWordUnderCursor(cm, false /** inclusive */, - true /** forward */, false /** bigWord */, - false /** noSymbol */); - isKeyword = false; - } - if (!word) { - return; - } - var query = cm.getLine(word.start.line).substring(word.start.ch, - word.end.ch); - if (isKeyword && wholeWordOnly) { - query = '\\b' + query + '\\b'; - } else { - query = escapeRegex(query); - } - vimGlobalState.jumpList.cachedCursor = cm.getCursor(); - cm.setCursor(word.start); - - handleQuery(query, true /** ignoreCase */, false /** smartCase */); - break; + case 'prompt': + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + var query = macroModeState.replaySearchQueries.shift(); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + } + else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: promptPrefix, + desc: '(JavaScript regexp)', + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown + }); + } + break; + case 'wordUnderCursor': + var word = expandWordUnderCursor(cm, { noSymbol: true }); + var isKeyword = true; + if (!word) { + word = expandWordUnderCursor(cm, { noSymbol: false }); + isKeyword = false; + } + if (!word) { + showConfirm(cm, 'No word under cursor'); + clearInputState(cm); + return; + } + var query = cm.getLine(word.start.line).substring(word.start.ch, word.end.ch); + if (isKeyword && wholeWordOnly) { + query = '\\b' + query + '\\b'; + } + else { + query = escapeRegex(query); + } + vimGlobalState.jumpList.cachedCursor = cm.getCursor(); + cm.setCursor(word.start); + handleQuery(query, true /** ignoreCase */, false /** smartCase */); + break; } - }, - processEx: function(cm, vim, command) { + }, + processEx: function (cm, vim, command) { function onPromptClose(input) { - vimGlobalState.exCommandHistoryController.pushInput(input); - vimGlobalState.exCommandHistoryController.reset(); - exCommandDispatcher.processCommand(cm, input); - } - function onPromptKeyDown(e, input, close) { - var keyName = CodeMirror.keyName(e), up, offset; - if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || - (keyName == 'Backspace' && input == '')) { vimGlobalState.exCommandHistoryController.pushInput(input); vimGlobalState.exCommandHistoryController.reset(); - CodeMirror.e_stop(e); - clearInputState(cm); - close(); - cm.focus(); - } - if (keyName == 'Up' || keyName == 'Down') { - CodeMirror.e_stop(e); - up = keyName == 'Up' ? true : false; - offset = e.target ? e.target.selectionEnd : 0; - input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; - close(input); - if (offset && e.target) e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); - } else if (keyName == 'Ctrl-U') { - CodeMirror.e_stop(e); - close(''); - } else { - if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') - vimGlobalState.exCommandHistoryController.reset(); - } + exCommandDispatcher.processCommand(cm, input); + if (cm.state.vim) + clearInputState(cm); + } + function onPromptKeyDown(e, input, close) { + var keyName = vimKeyFromEvent(e), up, offset; + if (keyName == '' || keyName == '' || keyName == '' || + (keyName == '' && input == '')) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + if (keyName == '' || keyName == '') { + CodeMirror.e_stop(e); + up = keyName == '' ? true : false; + offset = e.target ? e.target.selectionEnd : 0; + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; + close(input); + if (offset && e.target) + e.target.selectionEnd = e.target.selectionStart = Math.min(offset, e.target.value.length); + } + else if (keyName == '') { + CodeMirror.e_stop(e); + close(''); + } + else if (keyName && keyName != '' && keyName != '') { + vimGlobalState.exCommandHistoryController.reset(); + } } if (command.type == 'keyToEx') { - exCommandDispatcher.processCommand(cm, command.exArgs.input); - } else { - if (vim.visualMode) { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', - onKeyDown: onPromptKeyDown, selectValueOnOpen: false}); - } else { - showPrompt(cm, { onClose: onPromptClose, prefix: ':', - onKeyDown: onPromptKeyDown}); - } - } - }, - evalInput: function(cm, vim) { + exCommandDispatcher.processCommand(cm, command.exArgs.input); + } + else { + if (vim.visualMode) { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\'<,\'>', + onKeyDown: onPromptKeyDown, selectValueOnOpen: false }); + } + else { + showPrompt(cm, { onClose: onPromptClose, prefix: ':', + onKeyDown: onPromptKeyDown }); + } + } + }, + evalInput: function (cm, vim) { var inputState = vim.inputState; var motion = inputState.motion; var motionArgs = inputState.motionArgs || {}; @@ -2295,552 +2549,598 @@ dom.importCssString(".normal-mode .ace_cursor{\ var operatorArgs = inputState.operatorArgs || {}; var registerName = inputState.registerName; var sel = vim.sel; - var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head): cm.getCursor('head')); + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head) : cm.getCursor('head')); var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); var oldHead = copyCursor(origHead); var oldAnchor = copyCursor(origAnchor); var newHead, newAnchor; var repeat; if (operator) { - this.recordLastEdit(vim, inputState); + this.recordLastEdit(vim, inputState); } if (inputState.repeatOverride !== undefined) { - repeat = inputState.repeatOverride; - } else { - repeat = inputState.getRepeat(); + repeat = inputState.repeatOverride; + } + else { + repeat = inputState.getRepeat(); } if (repeat > 0 && motionArgs.explicitRepeat) { - motionArgs.repeatIsExplicit = true; - } else if (motionArgs.noRepeat || + motionArgs.repeatIsExplicit = true; + } + else if (motionArgs.noRepeat || (!motionArgs.explicitRepeat && repeat === 0)) { - repeat = 1; - motionArgs.repeatIsExplicit = false; + repeat = 1; + motionArgs.repeatIsExplicit = false; } if (inputState.selectedCharacter) { - motionArgs.selectedCharacter = operatorArgs.selectedCharacter = - inputState.selectedCharacter; + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = + inputState.selectedCharacter; } motionArgs.repeat = repeat; clearInputState(cm); if (motion) { - var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState); - vim.lastMotion = motions[motion]; - if (!motionResult) { - return; - } - if (motionArgs.toJumplist) { - if (!operator && cm.ace.curOp != null) - cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch - var jumpList = vimGlobalState.jumpList; - var cachedCursor = jumpList.cachedCursor; - if (cachedCursor) { - recordJumpPosition(cm, cachedCursor, motionResult); - delete jumpList.cachedCursor; - } else { - recordJumpPosition(cm, origHead, motionResult); - } - } - if (motionResult instanceof Array) { - newAnchor = motionResult[0]; - newHead = motionResult[1]; - } else { - newHead = motionResult; - } - if (!newHead) { - newHead = copyCursor(origHead); - } - if (vim.visualMode) { - if (!(vim.visualBlock && newHead.ch === Infinity)) { - newHead = clipCursorToContent(cm, newHead); - } - if (newAnchor) { - newAnchor = clipCursorToContent(cm, newAnchor); - } - newAnchor = newAnchor || oldAnchor; - sel.anchor = newAnchor; - sel.head = newHead; - updateCmSelection(cm); - updateMark(cm, vim, '<', - cursorIsBefore(newAnchor, newHead) ? newAnchor + var motionResult = motions[motion](cm, origHead, motionArgs, vim, inputState); + vim.lastMotion = motions[motion]; + if (!motionResult) { + return; + } + if (motionArgs.toJumplist) { + if (!operator && cm.ace.curOp != null) + cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch + var jumpList = vimGlobalState.jumpList; + var cachedCursor = jumpList.cachedCursor; + if (cachedCursor) { + recordJumpPosition(cm, cachedCursor, motionResult); + delete jumpList.cachedCursor; + } + else { + recordJumpPosition(cm, origHead, motionResult); + } + } + if (motionResult instanceof Array) { + newAnchor = motionResult[0]; + newHead = motionResult[1]; + } + else { + newHead = motionResult; + } + if (!newHead) { + newHead = copyCursor(origHead); + } + if (vim.visualMode) { + if (!(vim.visualBlock && newHead.ch === Infinity)) { + newHead = clipCursorToContent(cm, newHead, oldHead); + } + if (newAnchor) { + newAnchor = clipCursorToContent(cm, newAnchor); + } + newAnchor = newAnchor || oldAnchor; + sel.anchor = newAnchor; + sel.head = newHead; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorIsBefore(newAnchor, newHead) ? newAnchor : newHead); - updateMark(cm, vim, '>', - cursorIsBefore(newAnchor, newHead) ? newHead + updateMark(cm, vim, '>', cursorIsBefore(newAnchor, newHead) ? newHead : newAnchor); - } else if (!operator) { - newHead = clipCursorToContent(cm, newHead); - cm.setCursor(newHead.line, newHead.ch); - } + } + else if (!operator) { + if (cm.ace.curOp) + cm.ace.curOp.vimDialogScroll = "center-animate"; // ace_patch + newHead = clipCursorToContent(cm, newHead, oldHead); + cm.setCursor(newHead.line, newHead.ch); + } } if (operator) { - if (operatorArgs.lastSel) { - newAnchor = oldAnchor; - var lastSel = operatorArgs.lastSel; - var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); - var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); - if (lastSel.visualLine) { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); - } else if (lastSel.visualBlock) { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); - } else if (lastSel.head.line == lastSel.anchor.line) { - newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset); - } else { - newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + if (operatorArgs.lastSel) { + newAnchor = oldAnchor; + var lastSel = operatorArgs.lastSel; + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + if (lastSel.visualLine) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + else if (lastSel.visualBlock) { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); + } + else if (lastSel.head.line == lastSel.anchor.line) { + newHead = new Pos(oldAnchor.line, oldAnchor.ch + chOffset); + } + else { + newHead = new Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + vim.visualMode = true; + vim.visualLine = lastSel.visualLine; + vim.visualBlock = lastSel.visualBlock; + sel = vim.sel = { + anchor: newAnchor, + head: newHead + }; + updateCmSelection(cm); } - vim.visualMode = true; - vim.visualLine = lastSel.visualLine; - vim.visualBlock = lastSel.visualBlock; - sel = vim.sel = { - anchor: newAnchor, - head: newHead - }; - updateCmSelection(cm); - } else if (vim.visualMode) { - operatorArgs.lastSel = { - anchor: copyCursor(sel.anchor), - head: copyCursor(sel.head), - visualBlock: vim.visualBlock, - visualLine: vim.visualLine - }; - } - var curStart, curEnd, linewise, mode; - var cmSel; - if (vim.visualMode) { - curStart = cursorMin(sel.head, sel.anchor); - curEnd = cursorMax(sel.head, sel.anchor); - linewise = vim.visualLine || operatorArgs.linewise; - mode = vim.visualBlock ? 'block' : - linewise ? 'line' : - 'char'; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode); - if (linewise) { - var ranges = cmSel.ranges; - if (mode == 'block') { - for (var i = 0; i < ranges.length; i++) { - ranges[i].head.ch = lineLength(cm, ranges[i].head.line); - } - } else if (mode == 'line') { - ranges[0].head = new Pos(ranges[0].head.line + 1, 0); - } - } - } else { - curStart = copyCursor(newAnchor || oldAnchor); - curEnd = copyCursor(newHead || oldHead); - if (cursorIsBefore(curEnd, curStart)) { - var tmp = curStart; - curStart = curEnd; - curEnd = tmp; + else if (vim.visualMode) { + operatorArgs.lastSel = { + anchor: copyCursor(sel.anchor), + head: copyCursor(sel.head), + visualBlock: vim.visualBlock, + visualLine: vim.visualLine + }; } - linewise = motionArgs.linewise || operatorArgs.linewise; - if (linewise) { - expandSelectionToLine(cm, curStart, curEnd); - } else if (motionArgs.forward) { - clipToLine(cm, curStart, curEnd); - } - mode = 'char'; - var exclusive = !motionArgs.inclusive || linewise; - cmSel = makeCmSelection(cm, { - anchor: curStart, - head: curEnd - }, mode, exclusive); - } - cm.setSelections(cmSel.ranges, cmSel.primary); - vim.lastMotion = null; - operatorArgs.repeat = repeat; // For indent in visual mode. - operatorArgs.registerName = registerName; - operatorArgs.linewise = linewise; - var operatorMoveTo = operators[operator]( - cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); - if (vim.visualMode) { - exitVisualMode(cm, operatorMoveTo != null); - } - if (operatorMoveTo) { - cm.setCursor(operatorMoveTo); - } - } - }, - recordLastEdit: function(vim, inputState, actionCommand) { + var curStart, curEnd, linewise, mode; + var cmSel; + if (vim.visualMode) { + curStart = cursorMin(sel.head, sel.anchor); + curEnd = cursorMax(sel.head, sel.anchor); + linewise = vim.visualLine || operatorArgs.linewise; + mode = vim.visualBlock ? 'block' : + linewise ? 'line' : + 'char'; + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + cmSel = makeCmSelection(cm, { + anchor: newPositions.start, + head: newPositions.end + }, mode); + if (linewise) { + var ranges = cmSel.ranges; + if (mode == 'block') { + for (var i = 0; i < ranges.length; i++) { + ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + } + } + else if (mode == 'line') { + ranges[0].head = new Pos(ranges[0].head.line + 1, 0); + } + } + } + else { + curStart = copyCursor(newAnchor || oldAnchor); + curEnd = copyCursor(newHead || oldHead); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curStart; + curStart = curEnd; + curEnd = tmp; + } + linewise = motionArgs.linewise || operatorArgs.linewise; + if (linewise) { + expandSelectionToLine(cm, curStart, curEnd); + } + else if (motionArgs.forward) { + clipToLine(cm, curStart, curEnd); + } + mode = 'char'; + var exclusive = !motionArgs.inclusive || linewise; + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + cmSel = makeCmSelection(cm, { + anchor: newPositions.start, + head: newPositions.end + }, mode, exclusive); + } + cm.setSelections(cmSel.ranges, cmSel.primary); + vim.lastMotion = null; + operatorArgs.repeat = repeat; // For indent in visual mode. + operatorArgs.registerName = registerName; + operatorArgs.linewise = linewise; + var operatorMoveTo = operators[operator](cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + if (vim.visualMode) { + exitVisualMode(cm, operatorMoveTo != null); + } + if (operatorMoveTo) { + cm.setCursor(operatorMoveTo); + } + } + }, + recordLastEdit: function (vim, inputState, actionCommand) { var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } + if (macroModeState.isPlaying) { + return; + } vim.lastEditInputState = inputState; vim.lastEditActionCommand = actionCommand; macroModeState.lastInsertModeChanges.changes = []; macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; macroModeState.lastInsertModeChanges.visualBlock = vim.visualBlock ? vim.sel.head.line - vim.sel.anchor.line : 0; - } - }; - var motions = { - moveToTopLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).top + motionArgs.repeat -1; + } +}; +var motions = { + moveToTopLine: function (cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).top + motionArgs.repeat - 1; return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - moveToMiddleLine: function(cm) { + }, + moveToMiddleLine: function (cm) { var range = getUserVisibleLines(cm); var line = Math.floor((range.top + range.bottom) * 0.5); return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - moveToBottomLine: function(cm, _head, motionArgs) { - var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1; + }, + moveToBottomLine: function (cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat + 1; return new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); - }, - expandToLine: function(_cm, head, motionArgs) { + }, + expandToLine: function (_cm, head, motionArgs) { var cur = head; return new Pos(cur.line + motionArgs.repeat - 1, Infinity); - }, - findNext: function(cm, _head, motionArgs) { + }, + findNext: function (cm, _head, motionArgs) { var state = getSearchState(cm); var query = state.getQuery(); if (!query) { - return; + return; } var prev = !motionArgs.forward; prev = (state.isReversed()) ? !prev : prev; highlightSearchMatches(cm, query); - return findNext(cm, prev/** prev */, query, motionArgs.repeat); - }, - findAndSelectNextInclusive: function(cm, _head, motionArgs, vim, prevInputState) { + return findNext(cm, prev /** prev */, query, motionArgs.repeat); + }, + findAndSelectNextInclusive: function (cm, _head, motionArgs, vim, prevInputState) { var state = getSearchState(cm); var query = state.getQuery(); - if (!query) { - return; + return; } - var prev = !motionArgs.forward; prev = (state.isReversed()) ? !prev : prev; var next = findNextFromAndToInclusive(cm, prev, query, motionArgs.repeat, vim); if (!next) { - return; + return; } if (prevInputState.operator) { - return next; + return next; } - var from = next[0]; var to = new Pos(next[1].line, next[1].ch - 1); - if (vim.visualMode) { - if (vim.visualLine || vim.visualBlock) { + if (vim.visualLine || vim.visualBlock) { + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: "" }); + } + var anchor = vim.sel.anchor; + if (anchor) { + if (state.isReversed()) { + if (motionArgs.forward) { + return [anchor, from]; + } + return [anchor, to]; + } + else { + if (motionArgs.forward) { + return [anchor, to]; + } + return [anchor, from]; + } + } + } + else { + vim.visualMode = true; vim.visualLine = false; vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); - } - var anchor = vim.sel.anchor; - if (anchor) { - if (state.isReversed()) { - if (motionArgs.forward) { - return [anchor, from]; - } - - return [anchor, to]; - } else { - if (motionArgs.forward) { - return [anchor, to]; - } - - return [anchor, from]; - } - } - } else { - vim.visualMode = true; - vim.visualLine = false; - vim.visualBlock = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: ""}); + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: "" }); } - return prev ? [to, from] : [from, to]; - }, - goToMark: function(cm, _head, motionArgs, vim) { + }, + goToMark: function (cm, _head, motionArgs, vim) { var pos = getMarkPos(cm, vim, motionArgs.selectedCharacter); if (pos) { - return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; + return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos; } return null; - }, - moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { + }, + moveToOtherHighlightedEnd: function (cm, _head, motionArgs, vim) { if (vim.visualBlock && motionArgs.sameLine) { - var sel = vim.sel; - return [ - clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)), - clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch)) - ]; - } else { - return ([vim.sel.head, vim.sel.anchor]); - } - }, - jumpToMark: function(cm, head, motionArgs, vim) { + var sel = vim.sel; + return [ + clipCursorToContent(cm, new Pos(sel.anchor.line, sel.head.ch)), + clipCursorToContent(cm, new Pos(sel.head.line, sel.anchor.ch)) + ]; + } + else { + return ([vim.sel.head, vim.sel.anchor]); + } + }, + jumpToMark: function (cm, head, motionArgs, vim) { var best = head; for (var i = 0; i < motionArgs.repeat; i++) { - var cursor = best; - for (var key in vim.marks) { - if (!isLowerCase(key)) { - continue; - } - var mark = vim.marks[key].find(); - var isWrongDirection = (motionArgs.forward) ? - cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); - - if (isWrongDirection) { - continue; - } - if (motionArgs.linewise && (mark.line == cursor.line)) { - continue; - } - - var equal = cursorEqual(cursor, best); - var between = (motionArgs.forward) ? - cursorIsBetween(cursor, mark, best) : - cursorIsBetween(best, mark, cursor); - - if (equal || between) { - best = mark; + var cursor = best; + for (var key in vim.marks) { + if (!isLowerCase(key)) { + continue; + } + var mark = vim.marks[key].find(); + var isWrongDirection = (motionArgs.forward) ? + cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + if (isWrongDirection) { + continue; + } + if (motionArgs.linewise && (mark.line == cursor.line)) { + continue; + } + var equal = cursorEqual(cursor, best); + var between = (motionArgs.forward) ? + cursorIsBetween(cursor, mark, best) : + cursorIsBetween(best, mark, cursor); + if (equal || between) { + best = mark; + } } - } } - if (motionArgs.linewise) { - best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); + best = new Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); } return best; - }, - moveByCharacters: function(_cm, head, motionArgs) { + }, + moveByCharacters: function (_cm, head, motionArgs) { var cur = head; var repeat = motionArgs.repeat; var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; return new Pos(cur.line, ch); - }, - moveByLines: function(cm, head, motionArgs, vim) { + }, + moveByLines: function (cm, head, motionArgs, vim) { var cur = head; var endCh = cur.ch; switch (vim.lastMotion) { - case this.moveByLines: - case this.moveByDisplayLines: - case this.moveByScroll: - case this.moveToColumn: - case this.moveToEol: - endCh = vim.lastHPos; - break; - default: - vim.lastHPos = endCh; - } - var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0); + case this.moveByLines: + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveToColumn: + case this.moveToEol: + endCh = vim.lastHPos; + break; + default: + vim.lastHPos = endCh; + } + var repeat = motionArgs.repeat + (motionArgs.repeatOffset || 0); var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; var first = cm.firstLine(); var last = cm.lastLine(); - if (line < first && cur.line == first){ - return this.moveToStartOfLine(cm, head, motionArgs, vim); - } else if (line > last && cur.line == last){ + if (line < first && cur.line == first) { + return this.moveToStartOfLine(cm, head, motionArgs, vim); + } + else if (line > last && cur.line == last) { return moveToEol(cm, head, motionArgs, vim, true); } var fold = cm.ace.session.getFoldLine(line); if (fold) { - if (motionArgs.forward) { - if (line > fold.start.row) - line = fold.end.row + 1; - } else { - line = fold.start.row; - } - } - if (motionArgs.toFirstChar){ - endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line)); - vim.lastHPos = endCh; - } - vim.lastHSPos = cm.charCoords(new Pos(line, endCh),'div').left; + if (motionArgs.forward) { + if (line > fold.start.row) + line = fold.end.row + 1; + } + else { + line = fold.start.row; + } + } + if (motionArgs.toFirstChar) { + endCh = findFirstNonWhiteSpaceCharacter(cm.getLine(line)); + vim.lastHPos = endCh; + } + vim.lastHSPos = cm.charCoords(new Pos(line, endCh), 'div').left; return new Pos(line, endCh); - }, - moveByDisplayLines: function(cm, head, motionArgs, vim) { + }, + moveByDisplayLines: function (cm, head, motionArgs, vim) { var cur = head; switch (vim.lastMotion) { - case this.moveByDisplayLines: - case this.moveByScroll: - case this.moveByLines: - case this.moveToColumn: - case this.moveToEol: - break; - default: - vim.lastHSPos = cm.charCoords(cur,'div').left; + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveByLines: + case this.moveToColumn: + case this.moveToEol: + break; + default: + vim.lastHSPos = cm.charCoords(cur, 'div').left; } var repeat = motionArgs.repeat; - var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos); + var res = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos); if (res.hitSide) { - if (motionArgs.forward) { - var lastCharCoords = cm.charCoords(res, 'div'); - var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; - var res = cm.coordsChar(goalCoords, 'div'); - } else { - var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div'); - resCoords.left = vim.lastHSPos; - res = cm.coordsChar(resCoords, 'div'); - } + if (motionArgs.forward) { + var lastCharCoords = cm.charCoords(res, 'div'); + var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos }; + var res = cm.coordsChar(goalCoords, 'div'); + } + else { + var resCoords = cm.charCoords(new Pos(cm.firstLine(), 0), 'div'); + resCoords.left = vim.lastHSPos; + res = cm.coordsChar(resCoords, 'div'); + } } vim.lastHPos = res.ch; return res; - }, - moveByPage: function(cm, head, motionArgs) { + }, + moveByPage: function (cm, head, motionArgs) { var curStart = head; var repeat = motionArgs.repeat; return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); - }, - moveByParagraph: function(cm, head, motionArgs) { + }, + moveByParagraph: function (cm, head, motionArgs) { var dir = motionArgs.forward ? 1 : -1; return findParagraph(cm, head, motionArgs.repeat, dir); - }, - moveBySentence: function(cm, head, motionArgs) { + }, + moveBySentence: function (cm, head, motionArgs) { var dir = motionArgs.forward ? 1 : -1; return findSentence(cm, head, motionArgs.repeat, dir); - }, - moveByScroll: function(cm, head, motionArgs, vim) { + }, + moveByScroll: function (cm, head, motionArgs, vim) { var scrollbox = cm.getScrollInfo(); var curEnd = null; var repeat = motionArgs.repeat; if (!repeat) { - repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); + repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); } var orig = cm.charCoords(head, 'local'); motionArgs.repeat = repeat; - var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); if (!curEnd) { - return null; + return null; } var dest = cm.charCoords(curEnd, 'local'); cm.scrollTo(null, scrollbox.top + dest.top - orig.top); return curEnd; - }, - moveByWords: function(cm, head, motionArgs) { - return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, - !!motionArgs.wordEnd, !!motionArgs.bigWord); - }, - moveTillCharacter: function(cm, _head, motionArgs) { + }, + moveByWords: function (cm, head, motionArgs) { + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord); + }, + moveTillCharacter: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; - var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter); + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter, head); var increment = motionArgs.forward ? -1 : 1; recordLastCharacterSearch(increment, motionArgs); - if (!curEnd) return null; + if (!curEnd) + return null; curEnd.ch += increment; return curEnd; - }, - moveToCharacter: function(cm, head, motionArgs) { + }, + moveToCharacter: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; recordLastCharacterSearch(0, motionArgs); - return moveToCharacter(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; - }, - moveToSymbol: function(cm, head, motionArgs) { + return moveToCharacter(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter, head) || head; + }, + moveToSymbol: function (cm, head, motionArgs) { var repeat = motionArgs.repeat; - return findSymbol(cm, repeat, motionArgs.forward, - motionArgs.selectedCharacter) || head; - }, - moveToColumn: function(cm, head, motionArgs, vim) { + return findSymbol(cm, repeat, motionArgs.forward, motionArgs.selectedCharacter) || head; + }, + moveToColumn: function (cm, head, motionArgs, vim) { var repeat = motionArgs.repeat; vim.lastHPos = repeat - 1; - vim.lastHSPos = cm.charCoords(head,'div').left; + vim.lastHSPos = cm.charCoords(head, 'div').left; return moveToColumn(cm, repeat); - }, - moveToEol: function(cm, head, motionArgs, vim) { + }, + moveToEol: function (cm, head, motionArgs, vim) { return moveToEol(cm, head, motionArgs, vim, false); - }, - moveToFirstNonWhiteSpaceCharacter: function(cm, head) { + }, + moveToFirstNonWhiteSpaceCharacter: function (cm, head) { var cursor = head; - return new Pos(cursor.line, - findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); - }, - moveToMatchedSymbol: function(cm, head) { + return new Pos(cursor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); + }, + moveToMatchedSymbol: function (cm, head) { var cursor = head; var line = cursor.line; var ch = cursor.ch; var lineText = cm.getLine(line); var symbol; for (; ch < lineText.length; ch++) { - symbol = lineText.charAt(ch); - if (symbol && isMatchableSymbol(symbol)) { - var style = cm.getTokenTypeAt(new Pos(line, ch + 1)); - if (style !== "string" && style !== "comment") { - break; + symbol = lineText.charAt(ch); + if (symbol && isMatchableSymbol(symbol)) { + var style = cm.getTokenTypeAt(new Pos(line, ch + 1)); + if (style !== "string" && style !== "comment") { + break; + } } - } } if (ch < lineText.length) { - var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch? - var matched = cm.findMatchingBracket(new Pos(line, ch+1), {bracketRegex: re}); - return matched.to; - } else { - return cursor; - } - }, - moveToStartOfLine: function(_cm, head) { + var re = /[<>]/.test(lineText[ch]) ? /[(){}[\]<>]/ : /[(){}[\]]/; //ace_patch? + var matched = cm.findMatchingBracket(new Pos(line, ch + 1), { bracketRegex: re }); + return matched.to; + } + else { + return cursor; + } + }, + moveToStartOfLine: function (_cm, head) { return new Pos(head.line, 0); - }, - moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { + }, + moveToLineOrEdgeOfDocument: function (cm, _head, motionArgs) { var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); if (motionArgs.repeatIsExplicit) { - lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); } - return new Pos(lineNum, - findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); - }, - moveToStartOfDisplayLine: function(cm) { + return new Pos(lineNum, findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); + }, + moveToStartOfDisplayLine: function (cm) { cm.execCommand("goLineLeft"); return cm.getCursor(); - }, - moveToEndOfDisplayLine: function(cm) { + }, + moveToEndOfDisplayLine: function (cm) { cm.execCommand("goLineRight"); var head = cm.getCursor(); - if (head.sticky == "before") head.ch--; + if (head.sticky == "before") + head.ch--; return head; - }, - textObjectManipulation: function(cm, head, motionArgs, vim) { - var mirroredPairs = {'(': ')', ')': '(', - '{': '}', '}': '{', - '[': ']', ']': '[', - '<': '>', '>': '<'}; - var selfPaired = {'\'': true, '"': true, '`': true}; - + }, + textObjectManipulation: function (cm, head, motionArgs, vim) { + var mirroredPairs = { '(': ')', ')': '(', + '{': '}', '}': '{', + '[': ']', ']': '[', + '<': '>', '>': '<' }; + var selfPaired = { '\'': true, '"': true, '`': true }; var character = motionArgs.selectedCharacter; if (character == 'b') { - character = '('; - } else if (character == 'B') { - character = '{'; + character = '('; + } + else if (character == 'B') { + character = '{'; } var inclusive = !motionArgs.textObjectInner; - - var tmp; + var tmp, move; if (mirroredPairs[character]) { - tmp = selectCompanionObject(cm, head, character, inclusive); - } else if (selfPaired[character]) { - tmp = findBeginningAndEnd(cm, head, character, inclusive); - } else if (character === 'W') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - true /** bigWord */); - } else if (character === 'w') { - tmp = expandWordUnderCursor(cm, inclusive, true /** forward */, - false /** bigWord */); - } else if (character === 'p') { - tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); - motionArgs.linewise = true; - if (vim.visualMode) { - if (!vim.visualLine) { vim.visualLine = true; } - } else { - var operatorArgs = vim.inputState.operatorArgs; - if (operatorArgs) { operatorArgs.linewise = true; } - tmp.end.line--; - } - } else if (character === 't') { - tmp = expandTagUnderCursor(cm, head, inclusive); - } else { - return null; + move = true; + tmp = selectCompanionObject(cm, head, character, inclusive); + if (!tmp) { + var sc = cm.getSearchCursor(new RegExp("\\" + character, "g"), head); + if (sc.find()) { + tmp = selectCompanionObject(cm, sc.from(), character, inclusive); + } + } + } + else if (selfPaired[character]) { + move = true; + tmp = findBeginningAndEnd(cm, head, character, inclusive); + } + else if (character === 'W' || character === 'w') { + var repeat = motionArgs.repeat || 1; + while (repeat-- > 0) { + var repeated = expandWordUnderCursor(cm, { + inclusive: inclusive, + innerWord: !inclusive, + bigWord: character === 'W', + noSymbol: character === 'W', + multiline: true + }, tmp && tmp.end); + if (repeated) { + if (!tmp) + tmp = repeated; + tmp.end = repeated.end; + } + } + } + else if (character === 'p') { + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); + motionArgs.linewise = true; + if (vim.visualMode) { + if (!vim.visualLine) { + vim.visualLine = true; + } + } + else { + var operatorArgs = vim.inputState.operatorArgs; + if (operatorArgs) { + operatorArgs.linewise = true; + } + tmp.end.line--; + } + } + else if (character === 't') { + tmp = expandTagUnderCursor(cm, head, inclusive); + } + else if (character === 's') { + var content = cm.getLine(head.line); + if (head.ch > 0 && isEndOfSentenceSymbol(content[head.ch])) { + head.ch -= 1; + } + var end = getSentence(cm, head, motionArgs.repeat, 1, inclusive); + var start = getSentence(cm, head, motionArgs.repeat, -1, inclusive); + if (isWhiteSpaceString(cm.getLine(start.line)[start.ch]) + && isWhiteSpaceString(cm.getLine(end.line)[end.ch - 1])) { + start = { line: start.line, ch: start.ch + 1 }; + } + tmp = { start: start, end: end }; + } + if (!tmp) { + return null; } - if (!cm.state.vim.visualMode) { - return [tmp.start, tmp.end]; - } else { - return expandSelection(cm, tmp.start, tmp.end); + return [tmp.start, tmp.end]; } - }, - - repeatLastCharacterSearch: function(cm, head, motionArgs) { + else { + return expandSelection(cm, tmp.start, tmp.end, move); + } + }, + repeatLastCharacterSearch: function (cm, head, motionArgs) { var lastSearch = vimGlobalState.lastCharacterSearch; var repeat = motionArgs.repeat; var forward = motionArgs.forward === lastSearch.forward; @@ -2849,197 +3149,240 @@ dom.importCssString(".normal-mode .ace_cursor{\ motionArgs.inclusive = forward ? true : false; var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); if (!curEnd) { - cm.moveH(increment, 'char'); - return head; + cm.moveH(increment, 'char'); + return head; } curEnd.ch += increment; return curEnd; - } - }; - - function defineMotion(name, fn) { - motions[name] = fn; } - - function fillArray(val, times) { - var arr = []; - for (var i = 0; i < times; i++) { +}; +function defineMotion(name, fn) { + motions[name] = fn; +} +function fillArray(val, times) { + var arr = []; + for (var i = 0; i < times; i++) { arr.push(val); - } - return arr; } - var operators = { - change: function(cm, args, ranges) { + return arr; +} +var operators = { + change: function (cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; - var anchor = ranges[0].anchor, - head = ranges[0].head; + var anchor = ranges[0].anchor, head = ranges[0].head; if (!vim.visualMode) { - text = cm.getRange(anchor, head); - var lastState = vim.lastEditInputState || {}; - if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { - var match = (/\s+$/).exec(text); - if (match && lastState.motionArgs && lastState.motionArgs.forward) { - head = offsetCursor(head, 0, - match[0].length); - text = text.slice(0, - match[0].length); - } - } - var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); - var wasLastLine = cm.firstLine() == cm.lastLine(); - if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { - cm.replaceRange('', prevLineEnd, head); - } else { + text = cm.getRange(anchor, head); + var lastState = vim.lastEditInputState || {}; + if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + var match = (/\s+$/).exec(text); + if (match && lastState.motionArgs && lastState.motionArgs.forward) { + head = offsetCursor(head, 0, -match[0].length); + text = text.slice(0, -match[0].length); + } + } + if (args.linewise) { + anchor = new Pos(anchor.line, findFirstNonWhiteSpaceCharacter(cm.getLine(anchor.line))); + if (head.line > anchor.line) { + head = new Pos(head.line - 1, Number.MAX_VALUE); + } + } cm.replaceRange('', anchor, head); - } - if (args.linewise) { - if (!wasLastLine) { - cm.setCursor(prevLineEnd); - CodeMirror.commands.newlineAndIndent(cm); - } - anchor.ch = Number.MAX_VALUE; - } - finalHead = anchor; - } else if (args.fullLine) { + finalHead = anchor; + } + else if (args.fullLine) { head.ch = Number.MAX_VALUE; head.line--; - cm.setSelection(anchor, head) + cm.setSelection(anchor, head); text = cm.getSelection(); cm.replaceSelection(""); finalHead = anchor; - } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = cursorMin(ranges[0].head, ranges[0].anchor); - } - vimGlobalState.registerController.pushText( - args.registerName, 'change', text, - args.linewise, ranges.length > 1); - actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim); - }, - 'delete': function(cm, args, ranges) { + } + else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText(args.registerName, 'change', text, args.linewise, ranges.length > 1); + actions.enterInsertMode(cm, { head: finalHead }, cm.state.vim); + }, + 'delete': function (cm, args, ranges) { var finalHead, text; var vim = cm.state.vim; if (!vim.visualBlock) { - var anchor = ranges[0].anchor, - head = ranges[0].head; - if (args.linewise && - head.line != cm.firstLine() && - anchor.line == cm.lastLine() && - anchor.line == head.line - 1) { - if (anchor.line == cm.firstLine()) { - anchor.ch = 0; - } else { - anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); - } - } - text = cm.getRange(anchor, head); - cm.replaceRange('', anchor, head); - finalHead = anchor; - if (args.linewise) { - finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); - } - } else { - text = cm.getSelection(); - var replacement = fillArray('', ranges.length); - cm.replaceSelections(replacement); - finalHead = cursorMin(ranges[0].head, ranges[0].anchor); - } - vimGlobalState.registerController.pushText( - args.registerName, 'delete', text, - args.linewise, vim.visualBlock); + var anchor = ranges[0].anchor, head = ranges[0].head; + if (args.linewise && + head.line != cm.firstLine() && + anchor.line == cm.lastLine() && + anchor.line == head.line - 1) { + if (anchor.line == cm.firstLine()) { + anchor.ch = 0; + } + else { + anchor = new Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + } + } + text = cm.getRange(anchor, head); + cm.replaceRange('', anchor, head); + finalHead = anchor; + if (args.linewise) { + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + } + } + else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText(args.registerName, 'delete', text, args.linewise, vim.visualBlock); return clipCursorToContent(cm, finalHead); - }, - indent: function(cm, args, ranges) { + }, + indent: function (cm, args, ranges) { var vim = cm.state.vim; - var startLine = ranges[0].anchor.line; - var endLine = vim.visualBlock ? - ranges[ranges.length - 1].anchor.line : - ranges[0].head.line; var repeat = (vim.visualMode) ? args.repeat : 1; - if (args.linewise) { - endLine--; + if (vim.visualBlock) { + var tabSize = cm.getOption('tabSize'); + var indent = cm.getOption('indentWithTabs') ? '\t' : ' '.repeat(tabSize); + var cursor; + for (var i = ranges.length - 1; i >= 0; i--) { + cursor = cursorMin(ranges[i].anchor, ranges[i].head); + if (args.indentRight) { + cm.replaceRange(indent.repeat(repeat), cursor, cursor); + } + else { + var text = cm.getLine(cursor.line); + var end = 0; + for (var j = 0; j < repeat; j++) { + var ch = text[cursor.ch + end]; + if (ch == '\t') { + end++; + } + else if (ch == ' ') { + end++; + for (var k = 1; k < indent.length; k++) { + ch = text[cursor.ch + end]; + if (ch !== ' ') + break; + end++; + } + } + else { + break; + } + } + cm.replaceRange('', cursor, offsetCursor(cursor, 0, end)); + } + } + return cursor; + } + else if (cm.indentMore) { + for (var j = 0; j < repeat; j++) { + if (args.indentRight) + cm.indentMore(); + else + cm.indentLess(); + } } - for (var i = startLine; i <= endLine; i++) { - for (var j = 0; j < repeat; j++) { - cm.indentLine(i, args.indentRight); - } + else { + var startLine = ranges[0].anchor.line; + var endLine = vim.visualBlock ? + ranges[ranges.length - 1].anchor.line : + ranges[0].head.line; + if (args.linewise) { + endLine--; + } + for (var i = startLine; i <= endLine; i++) { + for (var j = 0; j < repeat; j++) { + cm.indentLine(i, args.indentRight); + } + } } return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); - }, - indentAuto: function(cm, _args, ranges) { - if (ranges.length > 1) { // ace_patch - cm.setSelection(ranges[0].anchor, ranges[ranges.length - 1].head); - } + }, + indentAuto: function (cm, _args, ranges) { cm.execCommand("indentAuto"); return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); - }, - changeCase: function(cm, args, ranges, oldAnchor, newHead) { + }, + hardWrap: function (cm, operatorArgs, ranges, oldAnchor, newHead) { + if (!cm.hardWrap) + return; + var from = ranges[0].anchor.line; + var to = ranges[0].head.line; + if (operatorArgs.linewise) + to--; + var endRow = cm.hardWrap({ from: from, to: to }); + if (endRow > from && operatorArgs.linewise) + endRow--; + return operatorArgs.keepCursor ? oldAnchor : new Pos(endRow, 0); + }, + changeCase: function (cm, args, ranges, oldAnchor, newHead) { var selections = cm.getSelections(); var swapped = []; var toLower = args.toLower; for (var j = 0; j < selections.length; j++) { - var toSwap = selections[j]; - var text = ''; - if (toLower === true) { - text = toSwap.toLowerCase(); - } else if (toLower === false) { - text = toSwap.toUpperCase(); - } else { - for (var i = 0; i < toSwap.length; i++) { - var character = toSwap.charAt(i); - text += isUpperCase(character) ? character.toLowerCase() : - character.toUpperCase(); - } - } - swapped.push(text); + var toSwap = selections[j]; + var text = ''; + if (toLower === true) { + text = toSwap.toLowerCase(); + } + else if (toLower === false) { + text = toSwap.toUpperCase(); + } + else { + for (var i = 0; i < toSwap.length; i++) { + var character = toSwap.charAt(i); + text += isUpperCase(character) ? character.toLowerCase() : + character.toUpperCase(); + } + } + swapped.push(text); } cm.replaceSelections(swapped); - if (args.shouldMoveCursor){ - return newHead; - } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { - return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); - } else if (args.linewise){ - return oldAnchor; - } else { - return cursorMin(ranges[0].anchor, ranges[0].head); - } - }, - yank: function(cm, args, ranges, oldAnchor) { + if (args.shouldMoveCursor) { + return newHead; + } + else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); + } + else if (args.linewise) { + return oldAnchor; + } + else { + return cursorMin(ranges[0].anchor, ranges[0].head); + } + }, + yank: function (cm, args, ranges, oldAnchor) { var vim = cm.state.vim; var text = cm.getSelection(); var endPos = vim.visualMode - ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) - : oldAnchor; - vimGlobalState.registerController.pushText( - args.registerName, 'yank', - text, args.linewise, vim.visualBlock); + ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) + : oldAnchor; + vimGlobalState.registerController.pushText(args.registerName, 'yank', text, args.linewise, vim.visualBlock); return endPos; - } - }; - - function defineOperator(name, fn) { - operators[name] = fn; } - - var actions = { - jumpListWalk: function(cm, actionArgs, vim) { +}; +function defineOperator(name, fn) { + operators[name] = fn; +} +var actions = { + jumpListWalk: function (cm, actionArgs, vim) { if (vim.visualMode) { - return; + return; } var repeat = actionArgs.repeat; var forward = actionArgs.forward; var jumpList = vimGlobalState.jumpList; - var mark = jumpList.move(cm, forward ? repeat : -repeat); var markPos = mark ? mark.find() : undefined; markPos = markPos ? markPos : cm.getCursor(); cm.setCursor(markPos); cm.ace.curOp.command.scrollIntoView = "center-animate"; // ace_patch - }, - scroll: function(cm, actionArgs, vim) { + }, + scroll: function (cm, actionArgs, vim) { if (vim.visualMode) { - return; + return; } var repeat = actionArgs.repeat || 1; var lineHeight = cm.defaultTextHeight(); @@ -3049,76 +3392,86 @@ dom.importCssString(".normal-mode .ace_cursor{\ var cursor = copyCursor(cm.getCursor()); var cursorCoords = cm.charCoords(cursor, 'local'); if (actionArgs.forward) { - if (newPos > cursorCoords.top) { - cursor.line += (newPos - cursorCoords.top) / lineHeight; - cursor.line = Math.ceil(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo(null, cursorCoords.top); - } else { - cm.scrollTo(null, newPos); - } - } else { - var newBottom = newPos + cm.getScrollInfo().clientHeight; - if (newBottom < cursorCoords.bottom) { - cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; - cursor.line = Math.floor(cursor.line); - cm.setCursor(cursor); - cursorCoords = cm.charCoords(cursor, 'local'); - cm.scrollTo( - null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); - } else { - cm.scrollTo(null, newPos); - } - } - }, - scrollToCursor: function(cm, actionArgs) { + if (newPos > cursorCoords.top) { + cursor.line += (newPos - cursorCoords.top) / lineHeight; + cursor.line = Math.ceil(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.top); + } + else { + cm.scrollTo(null, newPos); + } + } + else { + var newBottom = newPos + cm.getScrollInfo().clientHeight; + if (newBottom < cursorCoords.bottom) { + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; + cursor.line = Math.floor(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + } + else { + cm.scrollTo(null, newPos); + } + } + }, + scrollToCursor: function (cm, actionArgs) { var lineNum = cm.getCursor().line; var charCoords = cm.charCoords(new Pos(lineNum, 0), 'local'); var height = cm.getScrollInfo().clientHeight; var y = charCoords.top; - var lineHeight = charCoords.bottom - y; switch (actionArgs.position) { - case 'center': y = y - (height / 2) + lineHeight; - break; - case 'bottom': y = y - height + lineHeight; - break; + case 'center': + y = charCoords.bottom - height / 2; + break; + case 'bottom': + var lineLastCharPos = new Pos(lineNum, cm.getLine(lineNum).length - 1); + var lineLastCharCoords = cm.charCoords(lineLastCharPos, 'local'); + var lineHeight = lineLastCharCoords.bottom - y; + y = y - height + lineHeight; + break; } cm.scrollTo(null, y); - }, - replayMacro: function(cm, actionArgs, vim) { + }, + replayMacro: function (cm, actionArgs, vim) { var registerName = actionArgs.selectedCharacter; var repeat = actionArgs.repeat; var macroModeState = vimGlobalState.macroModeState; if (registerName == '@') { - registerName = macroModeState.latestRegister; - } else { - macroModeState.latestRegister = registerName; + registerName = macroModeState.latestRegister; + } + else { + macroModeState.latestRegister = registerName; } - while(repeat--){ - executeMacroRegister(cm, vim, macroModeState, registerName); + while (repeat--) { + executeMacroRegister(cm, vim, macroModeState, registerName); } - }, - enterMacroRecordMode: function(cm, actionArgs) { + }, + enterMacroRecordMode: function (cm, actionArgs) { var macroModeState = vimGlobalState.macroModeState; var registerName = actionArgs.selectedCharacter; if (vimGlobalState.registerController.isValidRegister(registerName)) { - macroModeState.enterMacroRecordMode(cm, registerName); + macroModeState.enterMacroRecordMode(cm, registerName); + } + }, + toggleOverwrite: function (cm) { + if (!cm.state.overwrite) { + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "replace" }); + } + else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "insert" }); + } + }, + enterInsertMode: function (cm, actionArgs, vim) { + if (cm.getOption('readOnly')) { + return; } - }, - toggleOverwrite: function(cm) { - if (!cm.state.overwrite) { - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); - } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); - } - }, - enterInsertMode: function(cm, actionArgs, vim) { - if (cm.getOption('readOnly')) { return; } vim.insertMode = true; vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; var insertAt = (actionArgs) ? actionArgs.insertAt : null; @@ -3126,373 +3479,447 @@ dom.importCssString(".normal-mode .ace_cursor{\ var head = actionArgs.head || cm.getCursor('head'); var height = cm.listSelections().length; if (insertAt == 'eol') { - head = new Pos(head.line, lineLength(cm, head.line)); - } else if (insertAt == 'bol') { - head = new Pos(head.line, 0); - } else if (insertAt == 'charAfter') { - head = offsetCursor(head, 0, 1); - } else if (insertAt == 'firstNonBlank') { - head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); - } else if (insertAt == 'startOfSelectedArea') { - if (!vim.visualMode) - return; - if (!vim.visualBlock) { - if (sel.head.line < sel.anchor.line) { - head = sel.head; - } else { - head = new Pos(sel.anchor.line, 0); - } - } else { - head = new Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.min(sel.head.ch, sel.anchor.ch)); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; - } - } else if (insertAt == 'endOfSelectedArea') { + head = new Pos(head.line, lineLength(cm, head.line)); + } + else if (insertAt == 'bol') { + head = new Pos(head.line, 0); + } + else if (insertAt == 'charAfter') { + var newPosition = updateSelectionForSurrogateCharacters(cm, head, offsetCursor(head, 0, 1)); + head = newPosition.end; + } + else if (insertAt == 'firstNonBlank') { + var newPosition = updateSelectionForSurrogateCharacters(cm, head, motions.moveToFirstNonWhiteSpaceCharacter(cm, head)); + head = newPosition.end; + } + else if (insertAt == 'startOfSelectedArea') { if (!vim.visualMode) - return; - if (!vim.visualBlock) { - if (sel.head.line >= sel.anchor.line) { - head = offsetCursor(sel.head, 0, 1); - } else { - head = new Pos(sel.anchor.line, 0); - } - } else { - head = new Pos( - Math.min(sel.head.line, sel.anchor.line), - Math.max(sel.head.ch, sel.anchor.ch) + 1); - height = Math.abs(sel.head.line - sel.anchor.line) + 1; - } - } else if (insertAt == 'inplace') { - if (vim.visualMode){ - return; - } - } else if (insertAt == 'lastEdit') { - head = getLastEditPos(cm) || head; + return; + if (!vim.visualBlock) { + if (sel.head.line < sel.anchor.line) { + head = sel.head; + } + else { + head = new Pos(sel.anchor.line, 0); + } + } + else { + head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.min(sel.head.ch, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } + else if (insertAt == 'endOfSelectedArea') { + if (!vim.visualMode) + return; + if (!vim.visualBlock) { + if (sel.head.line >= sel.anchor.line) { + head = offsetCursor(sel.head, 0, 1); + } + else { + head = new Pos(sel.anchor.line, 0); + } + } + else { + head = new Pos(Math.min(sel.head.line, sel.anchor.line), Math.max(sel.head.ch, sel.anchor.ch) + 1); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } + else if (insertAt == 'inplace') { + if (vim.visualMode) { + return; + } + } + else if (insertAt == 'lastEdit') { + head = getLastEditPos(cm) || head; } cm.setOption('disableInput', false); if (actionArgs && actionArgs.replace) { - cm.toggleOverwrite(true); - cm.setOption('keyMap', 'vim-replace'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "replace"}); - } else { - cm.toggleOverwrite(false); - cm.setOption('keyMap', 'vim-insert'); - CodeMirror.signal(cm, "vim-mode-change", {mode: "insert"}); + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "replace" }); + } + else { + cm.toggleOverwrite(false); + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", { mode: "insert" }); } if (!vimGlobalState.macroModeState.isPlaying) { - cm.on('change', onChange); - CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + cm.on('change', onChange); + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = cm.setBookmark(head, { insertLeft: true }); + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); } if (vim.visualMode) { - exitVisualMode(cm); + exitVisualMode(cm); } selectForInsert(cm, head, height); - }, - toggleVisualMode: function(cm, actionArgs, vim) { + }, + toggleVisualMode: function (cm, actionArgs, vim) { var repeat = actionArgs.repeat; var anchor = cm.getCursor(); var head; if (!vim.visualMode) { - vim.visualMode = true; - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - head = clipCursorToContent( - cm, new Pos(anchor.line, anchor.ch + repeat - 1)); - vim.sel = { - anchor: anchor, - head: head - }; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); - } else if (vim.visualLine ^ actionArgs.linewise || + vim.visualMode = true; + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + head = clipCursorToContent(cm, new Pos(anchor.line, anchor.ch + repeat - 1)); + var newPosition = updateSelectionForSurrogateCharacters(cm, anchor, head); + vim.sel = { + anchor: newPosition.start, + head: newPosition.end + }; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" }); + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + } + else if (vim.visualLine ^ actionArgs.linewise || vim.visualBlock ^ actionArgs.blockwise) { - vim.visualLine = !!actionArgs.linewise; - vim.visualBlock = !!actionArgs.blockwise; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : ""}); - updateCmSelection(cm); - } else { - exitVisualMode(cm); - } - }, - reselectLastSelection: function(cm, _actionArgs, vim) { + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual", subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" }); + updateCmSelection(cm); + } + else { + exitVisualMode(cm); + } + }, + reselectLastSelection: function (cm, _actionArgs, vim) { var lastSelection = vim.lastSelection; if (vim.visualMode) { - updateLastSelection(cm, vim); + updateLastSelection(cm, vim); } if (lastSelection) { - var anchor = lastSelection.anchorMark.find(); - var head = lastSelection.headMark.find(); - if (!anchor || !head) { - return; - } - vim.sel = { - anchor: anchor, - head: head - }; - vim.visualMode = true; - vim.visualLine = lastSelection.visualLine; - vim.visualBlock = lastSelection.visualBlock; - updateCmSelection(cm); - updateMark(cm, vim, '<', cursorMin(anchor, head)); - updateMark(cm, vim, '>', cursorMax(anchor, head)); - CodeMirror.signal(cm, 'vim-mode-change', { - mode: 'visual', - subMode: vim.visualLine ? 'linewise' : - vim.visualBlock ? 'blockwise' : ''}); - } - }, - joinLines: function(cm, actionArgs, vim) { + var anchor = lastSelection.anchorMark.find(); + var head = lastSelection.headMark.find(); + if (!anchor || !head) { + return; + } + vim.sel = { + anchor: anchor, + head: head + }; + vim.visualMode = true; + vim.visualLine = lastSelection.visualLine; + vim.visualBlock = lastSelection.visualBlock; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : + vim.visualBlock ? 'blockwise' : '' + }); + } + }, + joinLines: function (cm, actionArgs, vim) { var curStart, curEnd; if (vim.visualMode) { - curStart = cm.getCursor('anchor'); - curEnd = cm.getCursor('head'); - if (cursorIsBefore(curEnd, curStart)) { - var tmp = curEnd; - curEnd = curStart; - curStart = tmp; - } - curEnd.ch = lineLength(cm, curEnd.line) - 1; - } else { - var repeat = Math.max(actionArgs.repeat, 2); - curStart = cm.getCursor(); - curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, - Infinity)); + curStart = cm.getCursor('anchor'); + curEnd = cm.getCursor('head'); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curEnd; + curEnd = curStart; + curStart = tmp; + } + curEnd.ch = lineLength(cm, curEnd.line) - 1; + } + else { + var repeat = Math.max(actionArgs.repeat, 2); + curStart = cm.getCursor(); + curEnd = clipCursorToContent(cm, new Pos(curStart.line + repeat - 1, Infinity)); } var finalCh = 0; for (var i = curStart.line; i < curEnd.line; i++) { - finalCh = lineLength(cm, curStart.line); - var tmp = new Pos(curStart.line + 1, - lineLength(cm, curStart.line + 1)); - var text = cm.getRange(curStart, tmp); - text = actionArgs.keepSpaces - ? text.replace(/\n\r?/g, '') - : text.replace(/\n\s*/g, ' '); - cm.replaceRange(text, curStart, tmp); - } - var curFinalPos = new Pos(curStart.line, finalCh); + finalCh = lineLength(cm, curStart.line); + var text = ''; + var nextStartCh = 0; + if (!actionArgs.keepSpaces) { + var nextLine = cm.getLine(curStart.line + 1); + nextStartCh = nextLine.search(/\S/); + if (nextStartCh == -1) { + nextStartCh = nextLine.length; + } + else { + text = " "; + } + } + cm.replaceRange(text, new Pos(curStart.line, finalCh), new Pos(curStart.line + 1, nextStartCh)); + } + var curFinalPos = clipCursorToContent(cm, new Pos(curStart.line, finalCh)); if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false); } cm.setCursor(curFinalPos); - }, - newLineAndEnterInsertMode: function(cm, actionArgs, vim) { + }, + newLineAndEnterInsertMode: function (cm, actionArgs, vim) { vim.insertMode = true; var insertAt = copyCursor(cm.getCursor()); if (insertAt.line === cm.firstLine() && !actionArgs.after) { - cm.replaceRange('\n', new Pos(cm.firstLine(), 0)); - cm.setCursor(cm.firstLine(), 0); - } else { - insertAt.line = (actionArgs.after) ? insertAt.line : - insertAt.line - 1; - insertAt.ch = lineLength(cm, insertAt.line); - cm.setCursor(insertAt); - var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || - CodeMirror.commands.newlineAndIndent; - newlineFn(cm); + cm.replaceRange('\n', new Pos(cm.firstLine(), 0)); + cm.setCursor(cm.firstLine(), 0); + } + else { + insertAt.line = (actionArgs.after) ? insertAt.line : + insertAt.line - 1; + insertAt.ch = lineLength(cm, insertAt.line); + cm.setCursor(insertAt); + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + newlineFn(cm); } this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim); - }, - paste: function(cm, actionArgs, vim) { + }, + paste: function (cm, actionArgs, vim) { + var _this = this; + var register = vimGlobalState.registerController.getRegister(actionArgs.registerName); + var fallback = function () { + var text = register.toString(); + _this.continuePaste(cm, actionArgs, vim, text, register); + }; + if (actionArgs.registerName === '+' && + typeof navigator !== 'undefined' && + typeof navigator.clipboard !== 'undefined' && + typeof navigator.clipboard.readText === 'function') { + navigator.clipboard.readText().then(function (value) { + _this.continuePaste(cm, actionArgs, vim, value, register); + }, function () { fallback(); }); + } + else { + fallback(); + } + }, + continuePaste: function (cm, actionArgs, vim, text, register) { var cur = copyCursor(cm.getCursor()); - var register = vimGlobalState.registerController.getRegister( - actionArgs.registerName); - var text = register.toString(); if (!text) { - return; + return; } if (actionArgs.matchIndent) { - var tabSize = cm.getOption("tabSize"); - var whitespaceLength = function(str) { - var tabs = (str.split("\t").length - 1); - var spaces = (str.split(" ").length - 1); - return tabs * tabSize + spaces * 1; - }; - var currentLine = cm.getLine(cm.getCursor().line); - var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); - var chompedText = text.replace(/\n$/, ''); - var wasChomped = text !== chompedText; - var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); - var text = chompedText.replace(/^\s*/gm, function(wspace) { - var newIndent = indent + (whitespaceLength(wspace) - firstIndent); - if (newIndent < 0) { - return ""; - } - else if (cm.getOption("indentWithTabs")) { - var quotient = Math.floor(newIndent / tabSize); - return Array(quotient + 1).join('\t'); - } - else { - return Array(newIndent + 1).join(' '); - } - }); - text += wasChomped ? "\n" : ""; + var tabSize = cm.getOption("tabSize"); + var whitespaceLength = function (str) { + var tabs = (str.split("\t").length - 1); + var spaces = (str.split(" ").length - 1); + return tabs * tabSize + spaces * 1; + }; + var currentLine = cm.getLine(cm.getCursor().line); + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + var chompedText = text.replace(/\n$/, ''); + var wasChomped = text !== chompedText; + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var text = chompedText.replace(/^\s*/gm, function (wspace) { + var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + if (newIndent < 0) { + return ""; + } + else if (cm.getOption("indentWithTabs")) { + var quotient = Math.floor(newIndent / tabSize); + return Array(quotient + 1).join('\t'); + } + else { + return Array(newIndent + 1).join(' '); + } + }); + text += wasChomped ? "\n" : ""; } if (actionArgs.repeat > 1) { - var text = Array(actionArgs.repeat + 1).join(text); + var text = Array(actionArgs.repeat + 1).join(text); } var linewise = register.linewise; var blockwise = register.blockwise; if (blockwise) { - text = text.split('\n'); - if (linewise) { - text.pop(); - } - for (var i = 0; i < text.length; i++) { - text[i] = (text[i] == '') ? ' ' : text[i]; - } - cur.ch += actionArgs.after ? 1 : 0; - cur.ch = Math.min(lineLength(cm, cur.line), cur.ch); - } else if (linewise) { - if(vim.visualMode) { - text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; - } else if (actionArgs.after) { - text = '\n' + text.slice(0, text.length - 1); - cur.ch = lineLength(cm, cur.line); - } else { - cur.ch = 0; - } - } else { - cur.ch += actionArgs.after ? 1 : 0; + text = text.split('\n'); + if (linewise) { + text.pop(); + } + for (var i = 0; i < text.length; i++) { + text[i] = (text[i] == '') ? ' ' : text[i]; + } + cur.ch += actionArgs.after ? 1 : 0; + cur.ch = Math.min(lineLength(cm, cur.line), cur.ch); + } + else if (linewise) { + if (vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + } + else if (actionArgs.after) { + text = '\n' + text.slice(0, text.length - 1); + cur.ch = lineLength(cm, cur.line); + } + else { + cur.ch = 0; + } + } + else { + cur.ch += actionArgs.after ? 1 : 0; } var curPosFinal; - var idx; if (vim.visualMode) { - vim.lastPastedText = text; - var lastSelectionCurEnd; - var selectedArea = getSelectedAreaRange(cm, vim); - var selectionStart = selectedArea[0]; - var selectionEnd = selectedArea[1]; - var selectedText = cm.getSelection(); - var selections = cm.listSelections(); - var emptyStrings = new Array(selections.length).join('1').split('1'); - if (vim.lastSelection) { - lastSelectionCurEnd = vim.lastSelection.headMark.find(); - } - vimGlobalState.registerController.unnamedRegister.setText(selectedText); - if (blockwise) { - cm.replaceSelections(emptyStrings); - selectionEnd = new Pos(selectionStart.line + text.length-1, selectionStart.ch); - cm.setCursor(selectionStart); - selectBlock(cm, selectionEnd); - cm.replaceSelections(text); - curPosFinal = selectionStart; - } else if (vim.visualBlock) { - cm.replaceSelections(emptyStrings); - cm.setCursor(selectionStart); - cm.replaceRange(text, selectionStart, selectionStart); - curPosFinal = selectionStart; - } else { - cm.replaceRange(text, selectionStart, selectionEnd); - curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); - } - if(lastSelectionCurEnd) { - vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); - } - if (linewise) { - curPosFinal.ch=0; - } - } else { - if (blockwise) { - cm.setCursor(cur); - for (var i = 0; i < text.length; i++) { - var line = cur.line+i; - if (line > cm.lastLine()) { - cm.replaceRange('\n', new Pos(line, 0)); - } - var lastCh = lineLength(cm, line); - if (lastCh < cur.ch) { - extendLineToColumn(cm, line, cur.ch); - } - } - cm.setCursor(cur); - selectBlock(cm, new Pos(cur.line + text.length-1, cur.ch)); - cm.replaceSelections(text); - curPosFinal = cur; - } else { - cm.replaceRange(text, cur); - if (linewise && actionArgs.after) { - curPosFinal = new Pos( - cur.line + 1, - findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); - } else if (linewise && !actionArgs.after) { - curPosFinal = new Pos( - cur.line, - findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); - } else if (!linewise && actionArgs.after) { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length - 1); - } else { - idx = cm.indexFromPos(cur); - curPosFinal = cm.posFromIndex(idx + text.length); - } - } + vim.lastPastedText = text; + var lastSelectionCurEnd; + var selectedArea = getSelectedAreaRange(cm, vim); + var selectionStart = selectedArea[0]; + var selectionEnd = selectedArea[1]; + var selectedText = cm.getSelection(); + var selections = cm.listSelections(); + var emptyStrings = new Array(selections.length).join('1').split('1'); + if (vim.lastSelection) { + lastSelectionCurEnd = vim.lastSelection.headMark.find(); + } + vimGlobalState.registerController.unnamedRegister.setText(selectedText); + if (blockwise) { + cm.replaceSelections(emptyStrings); + selectionEnd = new Pos(selectionStart.line + text.length - 1, selectionStart.ch); + cm.setCursor(selectionStart); + selectBlock(cm, selectionEnd); + cm.replaceSelections(text); + curPosFinal = selectionStart; + } + else if (vim.visualBlock) { + cm.replaceSelections(emptyStrings); + cm.setCursor(selectionStart); + cm.replaceRange(text, selectionStart, selectionStart); + curPosFinal = selectionStart; + } + else { + cm.replaceRange(text, selectionStart, selectionEnd); + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + } + if (lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + } + if (linewise) { + curPosFinal.ch = 0; + } + } + else { + if (blockwise) { + cm.setCursor(cur); + for (var i = 0; i < text.length; i++) { + var line = cur.line + i; + if (line > cm.lastLine()) { + cm.replaceRange('\n', new Pos(line, 0)); + } + var lastCh = lineLength(cm, line); + if (lastCh < cur.ch) { + extendLineToColumn(cm, line, cur.ch); + } + } + cm.setCursor(cur); + selectBlock(cm, new Pos(cur.line + text.length - 1, cur.ch)); + cm.replaceSelections(text); + curPosFinal = cur; + } + else { + cm.replaceRange(text, cur); + if (linewise) { + var line = actionArgs.after ? cur.line + 1 : cur.line; + curPosFinal = new Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + } + else { + curPosFinal = copyCursor(cur); + if (!/\n/.test(text)) { + curPosFinal.ch += text.length - (actionArgs.after ? 1 : 0); + } + } + } } if (vim.visualMode) { - exitVisualMode(cm, false); + exitVisualMode(cm, false); } cm.setCursor(curPosFinal); - }, - undo: function(cm, actionArgs) { - cm.operation(function() { - repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); - cm.setCursor(cm.getCursor('anchor')); + }, + undo: function (cm, actionArgs) { + cm.operation(function () { + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); + cm.setCursor(clipCursorToContent(cm, cm.getCursor('start'))); }); - }, - redo: function(cm, actionArgs) { + }, + redo: function (cm, actionArgs) { repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); - }, - setRegister: function(_cm, actionArgs, vim) { + }, + setRegister: function (_cm, actionArgs, vim) { vim.inputState.registerName = actionArgs.selectedCharacter; - }, - setMark: function(cm, actionArgs, vim) { + }, + insertRegister: function (cm, actionArgs, vim) { + var registerName = actionArgs.selectedCharacter; + var register = vimGlobalState.registerController.getRegister(registerName); + var text = register && register.toString(); + if (text) { + cm.replaceSelection(text); + } + }, + oneNormalCommand: function (cm, actionArgs, vim) { + exitInsertMode(cm, true); + vim.insertModeReturn = true; + CodeMirror.on(cm, 'vim-command-done', function handler() { + if (vim.visualMode) + return; + if (vim.insertModeReturn) { + vim.insertModeReturn = false; + if (!vim.insertMode) { + actions.enterInsertMode(cm, {}, vim); + } + } + CodeMirror.off(cm, 'vim-command-done', handler); + }); + }, + setMark: function (cm, actionArgs, vim) { var markName = actionArgs.selectedCharacter; updateMark(cm, vim, markName, cm.getCursor()); - }, - replace: function(cm, actionArgs, vim) { + }, + replace: function (cm, actionArgs, vim) { var replaceWith = actionArgs.selectedCharacter; var curStart = cm.getCursor(); var replaceTo; var curEnd; var selections = cm.listSelections(); if (vim.visualMode) { - curStart = cm.getCursor('start'); - curEnd = cm.getCursor('end'); - } else { - var line = cm.getLine(curStart.line); - replaceTo = curStart.ch + actionArgs.repeat; - if (replaceTo > line.length) { - replaceTo=line.length; - } - curEnd = new Pos(curStart.line, replaceTo); - } - if (replaceWith=='\n') { - if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); - (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); - } else { - var replaceWithStr = cm.getRange(curStart, curEnd); - replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); - if (vim.visualBlock) { - var spaces = new Array(cm.getOption("tabSize")+1).join(' '); - replaceWithStr = cm.getSelection(); - replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); - cm.replaceSelections(replaceWithStr); - } else { - cm.replaceRange(replaceWithStr, curStart, curEnd); - } - if (vim.visualMode) { - curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? - selections[0].anchor : selections[0].head; - cm.setCursor(curStart); - exitVisualMode(cm, false); - } else { - cm.setCursor(offsetCursor(curEnd, 0, -1)); - } + curStart = cm.getCursor('start'); + curEnd = cm.getCursor('end'); + } + else { + var line = cm.getLine(curStart.line); + replaceTo = curStart.ch + actionArgs.repeat; + if (replaceTo > line.length) { + replaceTo = line.length; + } + curEnd = new Pos(curStart.line, replaceTo); + } + var newPositions = updateSelectionForSurrogateCharacters(cm, curStart, curEnd); + curStart = newPositions.start; + curEnd = newPositions.end; + if (replaceWith == '\n') { + if (!vim.visualMode) + cm.replaceRange('', curStart, curEnd); + (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + } + else { + var replaceWithStr = cm.getRange(curStart, curEnd); + replaceWithStr = replaceWithStr.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, replaceWith); + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + if (vim.visualBlock) { + var spaces = new Array(cm.getOption("tabSize") + 1).join(' '); + replaceWithStr = cm.getSelection(); + replaceWithStr = replaceWithStr.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, replaceWith); + replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); + cm.replaceSelections(replaceWithStr); + } + else { + cm.replaceRange(replaceWithStr, curStart, curEnd); + } + if (vim.visualMode) { + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? + selections[0].anchor : selections[0].head; + cm.setCursor(curStart); + exitVisualMode(cm, false); + } + else { + cm.setCursor(offsetCursor(curEnd, 0, -1)); + } } - }, - incrementNumberToken: function(cm, actionArgs) { + }, + incrementNumberToken: function (cm, actionArgs) { var cur = cm.getCursor(); var lineStr = cm.getLine(cur.line); var re = /(-?)(?:(0x)([\da-f]+)|(0b|0|)(\d+))/gi; @@ -3501,1921 +3928,2244 @@ dom.importCssString(".normal-mode .ace_cursor{\ var end; var numberStr; while ((match = re.exec(lineStr)) !== null) { - start = match.index; - end = start + match[0].length; - if (cur.ch < end)break; + start = match.index; + end = start + match[0].length; + if (cur.ch < end) + break; } - if (!actionArgs.backtrack && (end <= cur.ch))return; + if (!actionArgs.backtrack && (end <= cur.ch)) + return; if (match) { - var baseStr = match[2] || match[4] - var digits = match[3] || match[5] - var increment = actionArgs.increase ? 1 : -1; - var base = {'0b': 2, '0': 8, '': 10, '0x': 16}[baseStr.toLowerCase()]; - var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); - numberStr = number.toString(base); - var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : '' - if (numberStr.charAt(0) === '-') { - numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); - } else { - numberStr = baseStr + zeroPadding + numberStr; - } - var from = new Pos(cur.line, start); - var to = new Pos(cur.line, end); - cm.replaceRange(numberStr, from, to); - } else { - return; + var baseStr = match[2] || match[4]; + var digits = match[3] || match[5]; + var increment = actionArgs.increase ? 1 : -1; + var base = { '0b': 2, '0': 8, '': 10, '0x': 16 }[baseStr.toLowerCase()]; + var number = parseInt(match[1] + digits, base) + (increment * actionArgs.repeat); + numberStr = number.toString(base); + var zeroPadding = baseStr ? new Array(digits.length - numberStr.length + 1 + match[1].length).join('0') : ''; + if (numberStr.charAt(0) === '-') { + numberStr = '-' + baseStr + zeroPadding + numberStr.substr(1); + } + else { + numberStr = baseStr + zeroPadding + numberStr; + } + var from = new Pos(cur.line, start); + var to = new Pos(cur.line, end); + cm.replaceRange(numberStr, from, to); + } + else { + return; } cm.setCursor(new Pos(cur.line, start + numberStr.length - 1)); - }, - repeatLastEdit: function(cm, actionArgs, vim) { + }, + repeatLastEdit: function (cm, actionArgs, vim) { var lastEditInputState = vim.lastEditInputState; - if (!lastEditInputState) { return; } + if (!lastEditInputState) { + return; + } var repeat = actionArgs.repeat; if (repeat && actionArgs.repeatIsExplicit) { - vim.lastEditInputState.repeatOverride = repeat; - } else { - repeat = vim.lastEditInputState.repeatOverride || repeat; + vim.lastEditInputState.repeatOverride = repeat; + } + else { + repeat = vim.lastEditInputState.repeatOverride || repeat; } repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */); - }, - indent: function(cm, actionArgs) { + }, + indent: function (cm, actionArgs) { cm.indentLine(cm.getCursor().line, actionArgs.indentRight); - }, - exitInsertMode: exitInsertMode - }; - - function defineAction(name, fn) { - actions[name] = fn; - } - function clipCursorToContent(cm, cur) { - var vim = cm.state.vim; - var includeLineBreak = vim.insertMode || vim.visualMode; - var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() ); - var maxCh = lineLength(cm, line) - 1 + !!includeLineBreak; - var ch = Math.min(Math.max(0, cur.ch), maxCh); - return new Pos(line, ch); - } - function copyArgs(args) { - var ret = {}; - for (var prop in args) { + }, + exitInsertMode: exitInsertMode +}; +function defineAction(name, fn) { + actions[name] = fn; +} +function clipCursorToContent(cm, cur, oldCur) { + var vim = cm.state.vim; + var includeLineBreak = vim.insertMode || vim.visualMode; + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine()); + var text = cm.getLine(line); + var maxCh = text.length - 1 + Number(!!includeLineBreak); + var ch = Math.min(Math.max(0, cur.ch), maxCh); + var charCode = text.charCodeAt(ch); + if (0xDC00 <= charCode && charCode <= 0xDFFF) { + var direction = 1; + if (oldCur && oldCur.line == line && oldCur.ch > ch) { + direction = -1; + } + ch += direction; + if (ch > maxCh) + ch -= 2; + } + return new Pos(line, ch); +} +function copyArgs(args) { + var ret = {}; + for (var prop in args) { if (args.hasOwnProperty(prop)) { - ret[prop] = args[prop]; + ret[prop] = args[prop]; } - } - return ret; } - function offsetCursor(cur, offsetLine, offsetCh) { - if (typeof offsetLine === 'object') { + return ret; +} +function offsetCursor(cur, offsetLine, offsetCh) { + if (typeof offsetLine === 'object') { offsetCh = offsetLine.ch; offsetLine = offsetLine.line; - } - return new Pos(cur.line + offsetLine, cur.ch + offsetCh); } - function commandMatches(keys, keyMap, context, inputState) { - var match, partial = [], full = []; - for (var i = 0; i < keyMap.length; i++) { + return new Pos(cur.line + offsetLine, cur.ch + offsetCh); +} +function commandMatches(keys, keyMap, context, inputState) { + if (inputState.operator) + context = "operatorPending"; + var match, partial = [], full = []; + var startIndex = noremap ? keyMap.length - defaultKeymapLength : 0; + for (var i = startIndex; i < keyMap.length; i++) { var command = keyMap[i]; if (context == 'insert' && command.context != 'insert' || - command.context && command.context != context || + (command.context && command.context != context) || inputState.operator && command.type == 'action' || - !(match = commandMatch(keys, command.keys))) { continue; } - if (match == 'partial') { partial.push(command); } - if (match == 'full') { full.push(command); } - } - return { + !(match = commandMatch(keys, command.keys))) { + continue; + } + if (match == 'partial') { + partial.push(command); + } + if (match == 'full') { + full.push(command); + } + } + return { partial: partial.length && partial, full: full.length && full - }; - } - function commandMatch(pressed, mapped) { - if (mapped.slice(-11) == '') { - var prefixLen = mapped.length - 11; + }; +} +function commandMatch(pressed, mapped) { + var isLastCharacter = mapped.slice(-11) == ''; + var isLastRegister = mapped.slice(-10) == ''; + if (isLastCharacter || isLastRegister) { + var prefixLen = mapped.length - (isLastCharacter ? 11 : 10); var pressedPrefix = pressed.slice(0, prefixLen); var mappedPrefix = mapped.slice(0, prefixLen); return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : - mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; - } else { + mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + } + else { return pressed == mapped ? 'full' : - mapped.indexOf(pressed) == 0 ? 'partial' : false; - } - } - function lastChar(keys) { - var match = /^.*(<[^>]+>)$/.exec(keys); - var selectedCharacter = match ? match[1] : keys.slice(-1); - if (selectedCharacter.length > 1){ - switch(selectedCharacter){ - case '': - selectedCharacter='\n'; - break; - case '': - selectedCharacter=' '; - break; - default: - selectedCharacter=''; - break; - } - } - return selectedCharacter; + mapped.indexOf(pressed) == 0 ? 'partial' : false; } - function repeatFn(cm, fn, repeat) { - return function() { +} +function lastChar(keys) { + var match = /^.*(<[^>]+>)$/.exec(keys); + var selectedCharacter = match ? match[1] : keys.slice(-1); + if (selectedCharacter.length > 1) { + switch (selectedCharacter) { + case '': + selectedCharacter = '\n'; + break; + case '': + selectedCharacter = ' '; + break; + default: + selectedCharacter = ''; + break; + } + } + return selectedCharacter; +} +function repeatFn(cm, fn, repeat) { + return function () { for (var i = 0; i < repeat; i++) { - fn(cm); + fn(cm); } - }; - } - function copyCursor(cur) { - return new Pos(cur.line, cur.ch); - } - function cursorEqual(cur1, cur2) { - return cur1.ch == cur2.ch && cur1.line == cur2.line; - } - function cursorIsBefore(cur1, cur2) { - if (cur1.line < cur2.line) { + }; +} +function copyCursor(cur) { + return new Pos(cur.line, cur.ch); +} +function cursorEqual(cur1, cur2) { + return cur1.ch == cur2.ch && cur1.line == cur2.line; +} +function cursorIsBefore(cur1, cur2) { + if (cur1.line < cur2.line) { return true; - } - if (cur1.line == cur2.line && cur1.ch < cur2.ch) { + } + if (cur1.line == cur2.line && cur1.ch < cur2.ch) { return true; - } - return false; } - function cursorMin(cur1, cur2) { - if (arguments.length > 2) { + return false; +} +function cursorMin(cur1, cur2) { + if (arguments.length > 2) { cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); - } - return cursorIsBefore(cur1, cur2) ? cur1 : cur2; } - function cursorMax(cur1, cur2) { - if (arguments.length > 2) { + return cursorIsBefore(cur1, cur2) ? cur1 : cur2; +} +function cursorMax(cur1, cur2) { + if (arguments.length > 2) { cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); - } - return cursorIsBefore(cur1, cur2) ? cur2 : cur1; - } - function cursorIsBetween(cur1, cur2, cur3) { - var cur1before2 = cursorIsBefore(cur1, cur2); - var cur2before3 = cursorIsBefore(cur2, cur3); - return cur1before2 && cur2before3; } - function lineLength(cm, lineNum) { - return cm.getLine(lineNum).length; - } - function trim(s) { - if (s.trim) { + return cursorIsBefore(cur1, cur2) ? cur2 : cur1; +} +function cursorIsBetween(cur1, cur2, cur3) { + var cur1before2 = cursorIsBefore(cur1, cur2); + var cur2before3 = cursorIsBefore(cur2, cur3); + return cur1before2 && cur2before3; +} +function lineLength(cm, lineNum) { + return cm.getLine(lineNum).length; +} +function trim(s) { + if (s.trim) { return s.trim(); - } - return s.replace(/^\s+|\s+$/g, ''); - } - function escapeRegex(s) { - return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); - } - function extendLineToColumn(cm, lineNum, column) { - var endCh = lineLength(cm, lineNum); - var spaces = new Array(column-endCh+1).join(' '); - cm.setCursor(new Pos(lineNum, endCh)); - cm.replaceRange(spaces, cm.getCursor()); - } - function selectBlock(cm, selectionEnd) { - var selections = [], ranges = cm.listSelections(); - var head = copyCursor(cm.clipPos(selectionEnd)); - var isClipped = !cursorEqual(selectionEnd, head); - var curHead = cm.getCursor('head'); - var primIndex = getIndex(ranges, curHead); - var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); - var max = ranges.length - 1; - var index = max - primIndex > primIndex ? max : 0; - var base = ranges[index].anchor; - - var firstLine = Math.min(base.line, head.line); - var lastLine = Math.max(base.line, head.line); - var baseCh = base.ch, headCh = head.ch; - - var dir = ranges[index].head.ch - baseCh; - var newDir = headCh - baseCh; - if (dir > 0 && newDir <= 0) { + } + return s.replace(/^\s+|\s+$/g, ''); +} +function escapeRegex(s) { + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); +} +function extendLineToColumn(cm, lineNum, column) { + var endCh = lineLength(cm, lineNum); + var spaces = new Array(column - endCh + 1).join(' '); + cm.setCursor(new Pos(lineNum, endCh)); + cm.replaceRange(spaces, cm.getCursor()); +} +function selectBlock(cm, selectionEnd) { + var selections = [], ranges = cm.listSelections(); + var head = copyCursor(cm.clipPos(selectionEnd)); + var isClipped = !cursorEqual(selectionEnd, head); + var curHead = cm.getCursor('head'); + var primIndex = getIndex(ranges, curHead); + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); + var max = ranges.length - 1; + var index = max - primIndex > primIndex ? max : 0; + var base = ranges[index].anchor; + var firstLine = Math.min(base.line, head.line); + var lastLine = Math.max(base.line, head.line); + var baseCh = base.ch, headCh = head.ch; + var dir = ranges[index].head.ch - baseCh; + var newDir = headCh - baseCh; + if (dir > 0 && newDir <= 0) { baseCh++; - if (!isClipped) { headCh--; } - } else if (dir < 0 && newDir >= 0) { + if (!isClipped) { + headCh--; + } + } + else if (dir < 0 && newDir >= 0) { baseCh--; - if (!wasClipped) { headCh++; } - } else if (dir < 0 && newDir == -1) { + if (!wasClipped) { + headCh++; + } + } + else if (dir < 0 && newDir == -1) { baseCh--; headCh++; - } - for (var line = firstLine; line <= lastLine; line++) { - var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)}; + } + for (var line = firstLine; line <= lastLine; line++) { + var range = { anchor: new Pos(line, baseCh), head: new Pos(line, headCh) }; selections.push(range); - } - cm.setSelections(selections); - selectionEnd.ch = headCh; - base.ch = baseCh; - return base; - } - function selectForInsert(cm, head, height) { - var sel = []; - for (var i = 0; i < height; i++) { + } + cm.setSelections(selections); + selectionEnd.ch = headCh; + base.ch = baseCh; + return base; +} +function selectForInsert(cm, head, height) { + var sel = []; + for (var i = 0; i < height; i++) { var lineHead = offsetCursor(head, i, 0); - sel.push({anchor: lineHead, head: lineHead}); - } - cm.setSelections(sel, 0); + sel.push({ anchor: lineHead, head: lineHead }); } - function getIndex(ranges, cursor, end) { - for (var i = 0; i < ranges.length; i++) { + cm.setSelections(sel, 0); +} +function getIndex(ranges, cursor, end) { + for (var i = 0; i < ranges.length; i++) { var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); if (atAnchor || atHead) { - return i; + return i; } - } - return -1; } - function getSelectedAreaRange(cm, vim) { - var lastSelection = vim.lastSelection; - var getCurrentSelectedAreaRange = function() { + return -1; +} +function getSelectedAreaRange(cm, vim) { + var lastSelection = vim.lastSelection; + var getCurrentSelectedAreaRange = function () { var selections = cm.listSelections(); - var start = selections[0]; - var end = selections[selections.length-1]; + var start = selections[0]; + var end = selections[selections.length - 1]; var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; return [selectionStart, selectionEnd]; - }; - var getLastSelectedAreaRange = function() { + }; + var getLastSelectedAreaRange = function () { var selectionStart = cm.getCursor(); var selectionEnd = cm.getCursor(); var block = lastSelection.visualBlock; if (block) { - var width = block.width; - var height = block.height; - selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width); - var selections = []; - for (var i = selectionStart.line; i < selectionEnd.line; i++) { - var anchor = new Pos(i, selectionStart.ch); - var head = new Pos(i, selectionEnd.ch); - var range = {anchor: anchor, head: head}; - selections.push(range); - } - cm.setSelections(selections); - } else { - var start = lastSelection.anchorMark.find(); - var end = lastSelection.headMark.find(); - var line = end.line - start.line; - var ch = end.ch - start.ch; - selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch}; - if (lastSelection.visualLine) { - selectionStart = new Pos(selectionStart.line, 0); - selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); - } - cm.setSelection(selectionStart, selectionEnd); + var width = block.width; + var height = block.height; + selectionEnd = new Pos(selectionStart.line + height, selectionStart.ch + width); + var selections = []; + for (var i = selectionStart.line; i < selectionEnd.line; i++) { + var anchor = new Pos(i, selectionStart.ch); + var head = new Pos(i, selectionEnd.ch); + var range = { anchor: anchor, head: head }; + selections.push(range); + } + cm.setSelections(selections); + } + else { + var start = lastSelection.anchorMark.find(); + var end = lastSelection.headMark.find(); + var line = end.line - start.line; + var ch = end.ch - start.ch; + selectionEnd = { line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch }; + if (lastSelection.visualLine) { + selectionStart = new Pos(selectionStart.line, 0); + selectionEnd = new Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + } + cm.setSelection(selectionStart, selectionEnd); } return [selectionStart, selectionEnd]; - }; - if (!vim.visualMode) { + }; + if (!vim.visualMode) { return getLastSelectedAreaRange(); - } else { + } + else { return getCurrentSelectedAreaRange(); - } } - function updateLastSelection(cm, vim) { - var anchor = vim.sel.anchor; - var head = vim.sel.head; - if (vim.lastPastedText) { +} +function updateLastSelection(cm, vim) { + var anchor = vim.sel.anchor; + var head = vim.sel.head; + if (vim.lastPastedText) { head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); vim.lastPastedText = null; - } - vim.lastSelection = {'anchorMark': cm.setBookmark(anchor), - 'headMark': cm.setBookmark(head), - 'anchor': copyCursor(anchor), - 'head': copyCursor(head), - 'visualMode': vim.visualMode, - 'visualLine': vim.visualLine, - 'visualBlock': vim.visualBlock}; - } - function expandSelection(cm, start, end) { - var sel = cm.state.vim.sel; - var head = sel.head; - var anchor = sel.anchor; - var tmp; - if (cursorIsBefore(end, start)) { + } + vim.lastSelection = { 'anchorMark': cm.setBookmark(anchor), + 'headMark': cm.setBookmark(head), + 'anchor': copyCursor(anchor), + 'head': copyCursor(head), + 'visualMode': vim.visualMode, + 'visualLine': vim.visualLine, + 'visualBlock': vim.visualBlock }; +} +function expandSelection(cm, start, end, move) { + var sel = cm.state.vim.sel; + var head = move ? start : sel.head; + var anchor = move ? start : sel.anchor; + var tmp; + if (cursorIsBefore(end, start)) { tmp = end; end = start; start = tmp; - } - if (cursorIsBefore(head, anchor)) { + } + if (cursorIsBefore(head, anchor)) { head = cursorMin(start, head); anchor = cursorMax(anchor, end); - } else { + } + else { anchor = cursorMin(start, anchor); head = cursorMax(head, end); head = offsetCursor(head, 0, -1); if (head.ch == -1 && head.line != cm.firstLine()) { - head = new Pos(head.line - 1, lineLength(cm, head.line - 1)); + head = new Pos(head.line - 1, lineLength(cm, head.line - 1)); } - } - return [anchor, head]; } - function updateCmSelection(cm, sel, mode) { - var vim = cm.state.vim; - sel = sel || vim.sel; - var mode = mode || + return [anchor, head]; +} +function updateCmSelection(cm, sel, mode) { + var vim = cm.state.vim; + sel = sel || vim.sel; + var mode = mode || vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; - var cmSel = makeCmSelection(cm, sel, mode); - cm.setSelections(cmSel.ranges, cmSel.primary); - } - function makeCmSelection(cm, sel, mode, exclusive) { - var head = copyCursor(sel.head); - var anchor = copyCursor(sel.anchor); - if (mode == 'char') { + var cmSel = makeCmSelection(cm, sel, mode); + cm.setSelections(cmSel.ranges, cmSel.primary); +} +function makeCmSelection(cm, sel, mode, exclusive) { + var head = copyCursor(sel.head); + var anchor = copyCursor(sel.anchor); + if (mode == 'char') { var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; head = offsetCursor(sel.head, 0, headOffset); anchor = offsetCursor(sel.anchor, 0, anchorOffset); return { - ranges: [{anchor: anchor, head: head}], - primary: 0 + ranges: [{ anchor: anchor, head: head }], + primary: 0 }; - } else if (mode == 'line') { + } + else if (mode == 'line') { if (!cursorIsBefore(sel.head, sel.anchor)) { - anchor.ch = 0; - - var lastLine = cm.lastLine(); - if (head.line > lastLine) { - head.line = lastLine; - } - head.ch = lineLength(cm, head.line); - } else { - head.ch = 0; - anchor.ch = lineLength(cm, anchor.line); + anchor.ch = 0; + var lastLine = cm.lastLine(); + if (head.line > lastLine) { + head.line = lastLine; + } + head.ch = lineLength(cm, head.line); + } + else { + head.ch = 0; + anchor.ch = lineLength(cm, anchor.line); } return { - ranges: [{anchor: anchor, head: head}], - primary: 0 + ranges: [{ anchor: anchor, head: head }], + primary: 0 }; - } else if (mode == 'block') { - var top = Math.min(anchor.line, head.line), - fromCh = anchor.ch, - bottom = Math.max(anchor.line, head.line), - toCh = head.ch; - if (fromCh < toCh) { toCh += 1 } - else { fromCh += 1 }; + } + else if (mode == 'block') { + var top = Math.min(anchor.line, head.line), fromCh = anchor.ch, bottom = Math.max(anchor.line, head.line), toCh = head.ch; + if (fromCh < toCh) { + toCh += 1; + } + else { + fromCh += 1; + } + ; var height = bottom - top + 1; var primary = head.line == top ? 0 : height - 1; var ranges = []; for (var i = 0; i < height; i++) { - ranges.push({ - anchor: new Pos(top + i, fromCh), - head: new Pos(top + i, toCh) - }); + ranges.push({ + anchor: new Pos(top + i, fromCh), + head: new Pos(top + i, toCh) + }); } return { - ranges: ranges, - primary: primary + ranges: ranges, + primary: primary }; - } } - function getHead(cm) { - var cur = cm.getCursor('head'); - if (cm.getSelection().length == 1) { +} +function getHead(cm) { + var cur = cm.getCursor('head'); + if (cm.getSelection().length == 1) { cur = cursorMin(cur, cm.getCursor('anchor')); - } - return cur; } - function exitVisualMode(cm, moveHead) { - var vim = cm.state.vim; - if (moveHead !== false) { - cm.setCursor(clipCursorToContent(cm, vim.sel.head)); - } - updateLastSelection(cm, vim); - vim.visualMode = false; - vim.visualLine = false; - vim.visualBlock = false; - if (!vim.insertMode) CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - } - function clipToLine(cm, curStart, curEnd) { - var selection = cm.getRange(curStart, curEnd); - if (/\n\s*$/.test(selection)) { - var lines = selection.split('\n'); - lines.pop(); - var line; - for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { - curEnd.line--; - curEnd.ch = 0; + return cur; +} +function exitVisualMode(cm, moveHead) { + var vim = cm.state.vim; + if (moveHead !== false) { + cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + } + updateLastSelection(cm, vim); + vim.visualMode = false; + vim.visualLine = false; + vim.visualBlock = false; + if (!vim.insertMode) + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); +} +function clipToLine(cm, curStart, curEnd) { + var selection = cm.getRange(curStart, curEnd); + if (/\n\s*$/.test(selection)) { + var lines = selection.split('\n'); + lines.pop(); + var line; + for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { + curEnd.line--; + curEnd.ch = 0; + } + if (line) { + curEnd.line--; + curEnd.ch = lineLength(cm, curEnd.line); + } + else { + curEnd.ch = 0; + } + } +} +function expandSelectionToLine(_cm, curStart, curEnd) { + curStart.ch = 0; + curEnd.ch = 0; + curEnd.line++; +} +function findFirstNonWhiteSpaceCharacter(text) { + if (!text) { + return 0; + } + var firstNonWS = text.search(/\S/); + return firstNonWS == -1 ? text.length : firstNonWS; +} +function expandWordUnderCursor(cm, _a, cursor) { + var inclusive = _a.inclusive, innerWord = _a.innerWord, bigWord = _a.bigWord, noSymbol = _a.noSymbol, multiline = _a.multiline; + var cur = cursor || getHead(cm); + var line = cm.getLine(cur.line); + var endLine = line; + var startLineNumber = cur.line; + var endLineNumber = startLineNumber; + var idx = cur.ch; + var wordOnNextLine; + var test = noSymbol ? wordCharTest[0] : bigWordCharTest[0]; + if (innerWord && /\s/.test(line.charAt(idx))) { + test = function (ch) { return /\s/.test(ch); }; + } + else { + while (!test(line.charAt(idx))) { + idx++; + if (idx >= line.length) { + if (!multiline) + return null; + idx--; + wordOnNextLine = findWord(cm, cur, true, bigWord, true); + break; + } } - if (line) { - curEnd.line--; - curEnd.ch = lineLength(cm, curEnd.line); - } else { - curEnd.ch = 0; + if (bigWord) { + test = bigWordCharTest[0]; + } + else { + test = wordCharTest[0]; + if (!test(line.charAt(idx))) { + test = wordCharTest[1]; + } } - } } - function expandSelectionToLine(_cm, curStart, curEnd) { - curStart.ch = 0; - curEnd.ch = 0; - curEnd.line++; + var end = idx, start = idx; + while (test(line.charAt(start)) && start >= 0) { + start--; } - - function findFirstNonWhiteSpaceCharacter(text) { - if (!text) { - return 0; - } - var firstNonWS = text.search(/\S/); - return firstNonWS == -1 ? text.length : firstNonWS; + start++; + if (wordOnNextLine) { + end = wordOnNextLine.to; + endLineNumber = wordOnNextLine.line; + endLine = cm.getLine(endLineNumber); + if (!endLine && end == 0) + end++; } - - function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { - var cur = getHead(cm); - var line = cm.getLine(cur.line); - var idx = cur.ch; - var test = noSymbol ? wordCharTest[0] : bigWordCharTest [0]; - while (!test(line.charAt(idx))) { - idx++; - if (idx >= line.length) { return null; } - } - - if (bigWord) { - test = bigWordCharTest[0]; - } else { - test = wordCharTest[0]; - if (!test(line.charAt(idx))) { - test = wordCharTest[1]; - } - } - - var end = idx, start = idx; - while (test(line.charAt(end)) && end < line.length) { end++; } - while (test(line.charAt(start)) && start >= 0) { start--; } - start++; - - if (inclusive) { + else { + while (test(line.charAt(end)) && end < line.length) { + end++; + } + } + if (inclusive) { var wordEnd = end; - while (/\s/.test(line.charAt(end)) && end < line.length) { end++; } - if (wordEnd == end) { - var wordStart = start; - while (/\s/.test(line.charAt(start - 1)) && start > 0) { start--; } - if (!start) { start = wordStart; } - } - } - return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) }; - } - function expandTagUnderCursor(cm, head, inclusive) { - var cur = head; - if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { + var startsWithSpace = cur.ch <= start && /\s/.test(line.charAt(cur.ch)); + if (!startsWithSpace) { + while (/\s/.test(endLine.charAt(end)) && end < endLine.length) { + end++; + } + } + if (wordEnd == end || startsWithSpace) { + var wordStart = start; + while (/\s/.test(line.charAt(start - 1)) && start > 0) { + start--; + } + if (!start && !startsWithSpace) { + start = wordStart; + } + } + } + return { start: new Pos(startLineNumber, start), end: new Pos(endLineNumber, end) }; +} +function expandTagUnderCursor(cm, head, inclusive) { + var cur = head; + if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { return { start: cur, end: cur }; - } - - var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); - if (!tags || !tags.open || !tags.close) { + } + var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); + if (!tags || !tags.open || !tags.close) { return { start: cur, end: cur }; - } - - if (inclusive) { + } + if (inclusive) { return { start: tags.open.from, end: tags.close.to }; - } - return { start: tags.open.to, end: tags.close.from }; } - - function recordJumpPosition(cm, oldCur, newCur) { - if (!cursorEqual(oldCur, newCur)) { + return { start: tags.open.to, end: tags.close.from }; +} +function recordJumpPosition(cm, oldCur, newCur) { + if (!cursorEqual(oldCur, newCur)) { vimGlobalState.jumpList.add(cm, oldCur, newCur); - } - } - - function recordLastCharacterSearch(increment, args) { - vimGlobalState.lastCharacterSearch.increment = increment; - vimGlobalState.lastCharacterSearch.forward = args.forward; - vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; } - - var symbolToMode = { - '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', - '[': 'section', ']': 'section', - '*': 'comment', '/': 'comment', - 'm': 'method', 'M': 'method', - '#': 'preprocess' - }; - var findSymbolModes = { - bracket: { - isComplete: function(state) { - if (state.nextCh === state.symb) { - state.depth++; - if (state.depth >= 1)return true; - } else if (state.nextCh === state.reverseSymb) { - state.depth--; - } - return false; - } - }, - section: { - init: function(state) { - state.curMoveThrough = true; - state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; - }, - isComplete: function(state) { - return state.index === 0 && state.nextCh === state.symb; - } - }, - comment: { - isComplete: function(state) { - var found = state.lastCh === '*' && state.nextCh === '/'; - state.lastCh = state.nextCh; - return found; - } - }, - method: { - init: function(state) { - state.symb = (state.symb === 'm' ? '{' : '}'); - state.reverseSymb = state.symb === '{' ? '}' : '{'; +} +function recordLastCharacterSearch(increment, args) { + vimGlobalState.lastCharacterSearch.increment = increment; + vimGlobalState.lastCharacterSearch.forward = args.forward; + vimGlobalState.lastCharacterSearch.selectedCharacter = args.selectedCharacter; +} +var symbolToMode = { + '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket', + '[': 'section', ']': 'section', + '*': 'comment', '/': 'comment', + 'm': 'method', 'M': 'method', + '#': 'preprocess' +}; +var findSymbolModes = { + bracket: { + isComplete: function (state) { + if (state.nextCh === state.symb) { + state.depth++; + if (state.depth >= 1) + return true; + } + else if (state.nextCh === state.reverseSymb) { + state.depth--; + } + return false; + } + }, + section: { + init: function (state) { + state.curMoveThrough = true; + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; }, - isComplete: function(state) { - if (state.nextCh === state.symb)return true; - return false; - } - }, - preprocess: { - init: function(state) { - state.index = 0; + isComplete: function (state) { + return state.index === 0 && state.nextCh === state.symb; + } + }, + comment: { + isComplete: function (state) { + var found = state.lastCh === '*' && state.nextCh === '/'; + state.lastCh = state.nextCh; + return found; + } + }, + method: { + init: function (state) { + state.symb = (state.symb === 'm' ? '{' : '}'); + state.reverseSymb = state.symb === '{' ? '}' : '{'; }, - isComplete: function(state) { - if (state.nextCh === '#') { - var token = state.lineText.match(/^#(\w+)/)[1]; - if (token === 'endif') { - if (state.forward && state.depth === 0) { - return true; - } - state.depth++; - } else if (token === 'if') { - if (!state.forward && state.depth === 0) { + isComplete: function (state) { + if (state.nextCh === state.symb) return true; - } - state.depth--; + return false; + } + }, + preprocess: { + init: function (state) { + state.index = 0; + }, + isComplete: function (state) { + if (state.nextCh === '#') { + var token = state.lineText.match(/^#(\w+)/)[1]; + if (token === 'endif') { + if (state.forward && state.depth === 0) { + return true; + } + state.depth++; + } + else if (token === 'if') { + if (!state.forward && state.depth === 0) { + return true; + } + state.depth--; + } + if (token === 'else' && state.depth === 0) + return true; } - if (token === 'else' && state.depth === 0)return true; - } - return false; + return false; } - } - }; - function findSymbol(cm, repeat, forward, symb) { - var cur = copyCursor(cm.getCursor()); - var increment = forward ? 1 : -1; - var endLine = forward ? cm.lineCount() : -1; - var curCh = cur.ch; - var line = cur.line; - var lineText = cm.getLine(line); - var state = { + } +}; +function findSymbol(cm, repeat, forward, symb) { + var cur = copyCursor(cm.getCursor()); + var increment = forward ? 1 : -1; + var endLine = forward ? cm.lineCount() : -1; + var curCh = cur.ch; + var line = cur.line; + var lineText = cm.getLine(line); + var state = { lineText: lineText, nextCh: lineText.charAt(curCh), lastCh: null, index: curCh, symb: symb, - reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], + reverseSymb: (forward ? { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb], forward: forward, depth: 0, curMoveThrough: false - }; - var mode = symbolToMode[symb]; - if (!mode)return cur; - var init = findSymbolModes[mode].init; - var isComplete = findSymbolModes[mode].isComplete; - if (init) { init(state); } - while (line !== endLine && repeat) { + }; + var mode = symbolToMode[symb]; + if (!mode) + return cur; + var init = findSymbolModes[mode].init; + var isComplete = findSymbolModes[mode].isComplete; + if (init) { + init(state); + } + while (line !== endLine && repeat) { state.index += increment; state.nextCh = state.lineText.charAt(state.index); if (!state.nextCh) { - line += increment; - state.lineText = cm.getLine(line) || ''; - if (increment > 0) { - state.index = 0; - } else { - var lineLen = state.lineText.length; - state.index = (lineLen > 0) ? (lineLen-1) : 0; - } - state.nextCh = state.lineText.charAt(state.index); + line += increment; + state.lineText = cm.getLine(line) || ''; + if (increment > 0) { + state.index = 0; + } + else { + var lineLen = state.lineText.length; + state.index = (lineLen > 0) ? (lineLen - 1) : 0; + } + state.nextCh = state.lineText.charAt(state.index); } if (isComplete(state)) { - cur.line = line; - cur.ch = state.index; - repeat--; + cur.line = line; + cur.ch = state.index; + repeat--; } - } - if (state.nextCh || state.curMoveThrough) { + } + if (state.nextCh || state.curMoveThrough) { return new Pos(line, state.index); - } - return cur; - } - function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { - var lineNum = cur.line; - var pos = cur.ch; - var line = cm.getLine(lineNum); - var dir = forward ? 1 : -1; - var charTests = bigWord ? bigWordCharTest: wordCharTest; - - if (emptyLineIsWord && line == '') { + } + return cur; +} +function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { + var lineNum = cur.line; + var pos = cur.ch; + var line = cm.getLine(lineNum); + var dir = forward ? 1 : -1; + var charTests = bigWord ? bigWordCharTest : wordCharTest; + if (emptyLineIsWord && line == '') { lineNum += dir; line = cm.getLine(lineNum); if (!isLine(cm, lineNum)) { - return null; + return null; } pos = (forward) ? 0 : line.length; - } - - while (true) { + } + while (true) { if (emptyLineIsWord && line == '') { - return { from: 0, to: 0, line: lineNum }; + return { from: 0, to: 0, line: lineNum }; } var stop = (dir > 0) ? line.length : -1; var wordStart = stop, wordEnd = stop; while (pos != stop) { - var foundWord = false; - for (var i = 0; i < charTests.length && !foundWord; ++i) { - if (charTests[i](line.charAt(pos))) { - wordStart = pos; - while (pos != stop && charTests[i](line.charAt(pos))) { + var foundWord = false; + for (var i = 0; i < charTests.length && !foundWord; ++i) { + if (charTests[i](line.charAt(pos))) { + wordStart = pos; + while (pos != stop && charTests[i](line.charAt(pos))) { + pos += dir; + } + wordEnd = pos; + foundWord = wordStart != wordEnd; + if (wordStart == cur.ch && lineNum == cur.line && + wordEnd == wordStart + dir) { + continue; + } + else { + return { + from: Math.min(wordStart, wordEnd + 1), + to: Math.max(wordStart, wordEnd), + line: lineNum + }; + } + } + } + if (!foundWord) { pos += dir; - } - wordEnd = pos; - foundWord = wordStart != wordEnd; - if (wordStart == cur.ch && lineNum == cur.line && - wordEnd == wordStart + dir) { - continue; - } else { - return { - from: Math.min(wordStart, wordEnd + 1), - to: Math.max(wordStart, wordEnd), - line: lineNum }; - } - } - } - if (!foundWord) { - pos += dir; - } + } } lineNum += dir; if (!isLine(cm, lineNum)) { - return null; + return null; } line = cm.getLine(lineNum); pos = (dir > 0) ? 0 : line.length; - } } - function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { - var curStart = copyCursor(cur); - var words = []; - if (forward && !wordEnd || !forward && wordEnd) { +} +function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { + var curStart = copyCursor(cur); + var words = []; + if (forward && !wordEnd || !forward && wordEnd) { repeat++; - } - var emptyLineIsWord = !(forward && wordEnd); - for (var i = 0; i < repeat; i++) { + } + var emptyLineIsWord = !(forward && wordEnd); + for (var i = 0; i < repeat; i++) { var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); if (!word) { - var eodCh = lineLength(cm, cm.lastLine()); - words.push(forward - ? {line: cm.lastLine(), from: eodCh, to: eodCh} - : {line: 0, from: 0, to: 0}); - break; + var eodCh = lineLength(cm, cm.lastLine()); + words.push(forward + ? { line: cm.lastLine(), from: eodCh, to: eodCh } + : { line: 0, from: 0, to: 0 }); + break; } words.push(word); cur = new Pos(word.line, forward ? (word.to - 1) : word.from); - } - var shortCircuit = words.length != repeat; - var firstWord = words[0]; - var lastWord = words.pop(); - if (forward && !wordEnd) { + } + var shortCircuit = words.length != repeat; + var firstWord = words[0]; + var lastWord = words.pop(); + if (forward && !wordEnd) { if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { - lastWord = words.pop(); + lastWord = words.pop(); } return new Pos(lastWord.line, lastWord.from); - } else if (forward && wordEnd) { + } + else if (forward && wordEnd) { return new Pos(lastWord.line, lastWord.to - 1); - } else if (!forward && wordEnd) { + } + else if (!forward && wordEnd) { if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { - lastWord = words.pop(); + lastWord = words.pop(); } return new Pos(lastWord.line, lastWord.to); - } else { + } + else { return new Pos(lastWord.line, lastWord.from); - } } - - function moveToEol(cm, head, motionArgs, vim, keepHPos) { - var cur = head; - var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity); - var end=cm.clipPos(retval); - end.ch--; - if (!keepHPos) { +} +function moveToEol(cm, head, motionArgs, vim, keepHPos) { + var cur = head; + var retval = new Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end = cm.clipPos(retval); + end.ch--; + if (!keepHPos) { vim.lastHPos = Infinity; - vim.lastHSPos = cm.charCoords(end,'div').left; - } - return retval; + vim.lastHSPos = cm.charCoords(end, 'div').left; } - - function moveToCharacter(cm, repeat, forward, character) { - var cur = cm.getCursor(); - var start = cur.ch; - var idx; - for (var i = 0; i < repeat; i ++) { + return retval; +} +function moveToCharacter(cm, repeat, forward, character, head) { + var cur = head || cm.getCursor(); + var start = cur.ch; + var idx; + for (var i = 0; i < repeat; i++) { var line = cm.getLine(cur.line); idx = charIdxInLine(start, line, character, forward, true); if (idx == -1) { - return null; + return null; } start = idx; - } - return new Pos(cm.getCursor().line, idx); - } - - function moveToColumn(cm, repeat) { - var line = cm.getCursor().line; - return clipCursorToContent(cm, new Pos(line, repeat - 1)); } - - function updateMark(cm, vim, markName, pos) { - if (!inArray(markName, validMarks)) { + return new Pos(cm.getCursor().line, idx); +} +function moveToColumn(cm, repeat) { + var line = cm.getCursor().line; + return clipCursorToContent(cm, new Pos(line, repeat - 1)); +} +function updateMark(cm, vim, markName, pos) { + if (!inArray(markName, validMarks) && !latinCharRegex.test(markName)) { return; - } - if (vim.marks[markName]) { + } + if (vim.marks[markName]) { vim.marks[markName].clear(); - } - vim.marks[markName] = cm.setBookmark(pos); } - - function charIdxInLine(start, line, character, forward, includeChar) { - var idx; - if (forward) { + vim.marks[markName] = cm.setBookmark(pos); +} +function charIdxInLine(start, line, character, forward, includeChar) { + var idx; + if (forward) { idx = line.indexOf(character, start + 1); if (idx != -1 && !includeChar) { - idx -= 1; + idx -= 1; } - } else { + } + else { idx = line.lastIndexOf(character, start - 1); if (idx != -1 && !includeChar) { - idx += 1; + idx += 1; } - } - return idx; } - - function findParagraph(cm, head, repeat, dir, inclusive) { - var line = head.line; - var min = cm.firstLine(); - var max = cm.lastLine(); - var start, end, i = line; - function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch - function isBoundary(i, dir, any) { - if (any) { return isEmpty(i) != isEmpty(i + dir); } + return idx; +} +function findParagraph(cm, head, repeat, dir, inclusive) { + var line = head.line; + var min = cm.firstLine(); + var max = cm.lastLine(); + var start, end, i = line; + function isEmpty(i) { return !/\S/.test(cm.getLine(i)); } // ace_patch + function isBoundary(i, dir, any) { + if (any) { + return isEmpty(i) != isEmpty(i + dir); + } return !isEmpty(i) && isEmpty(i + dir); - } - function skipFold(i) { - dir = dir > 0 ? 1 : -1; - var foldLine = cm.ace.session.getFoldLine(i); - if (foldLine) { - if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) - dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; - } - } - if (dir) { + } + function skipFold(i) { + dir = dir > 0 ? 1 : -1; + var foldLine = cm.ace.session.getFoldLine(i); + if (foldLine) { + if (i + dir > foldLine.start.row && i + dir < foldLine.end.row) + dir = (dir > 0 ? foldLine.end.row : foldLine.start.row) - i; + } + } + if (dir) { while (min <= i && i <= max && repeat > 0) { - skipFold(i); - if (isBoundary(i, dir)) { repeat--; } - i += dir; + skipFold(i); + if (isBoundary(i, dir)) { + repeat--; + } + i += dir; } return new Pos(i, 0); - } - - var vim = cm.state.vim; - if (vim.visualLine && isBoundary(line, 1, true)) { + } + var vim = cm.state.vim; + if (vim.visualLine && isBoundary(line, 1, true)) { var anchor = vim.sel.anchor; if (isBoundary(anchor.line, -1, true)) { - if (!inclusive || anchor.line != line) { - line += 1; - } + if (!inclusive || anchor.line != line) { + line += 1; + } } - } - var startState = isEmpty(line); - for (i = line; i <= max && repeat; i++) { + } + var startState = isEmpty(line); + for (i = line; i <= max && repeat; i++) { if (isBoundary(i, 1, true)) { - if (!inclusive || isEmpty(i) != startState) { - repeat--; - } + if (!inclusive || isEmpty(i) != startState) { + repeat--; + } } - } - end = new Pos(i, 0); - if (i > max && !startState) { startState = true; } - else { inclusive = false; } - for (i = line; i > min; i--) { + } + end = new Pos(i, 0); + if (i > max && !startState) { + startState = true; + } + else { + inclusive = false; + } + for (i = line; i > min; i--) { if (!inclusive || isEmpty(i) == startState || i == line) { - if (isBoundary(i, -1, true)) { break; } + if (isBoundary(i, -1, true)) { + break; + } } - } - start = new Pos(i, 0); - return { start: start, end: end }; } - - function findSentence(cm, cur, repeat, dir) { - function nextChar(cm, idx) { + start = new Pos(i, 0); + return { start: start, end: end }; +} +function getSentence(cm, cur, repeat, dir, inclusive /*includes whitespace*/) { + function nextChar(curr) { + if (curr.pos + curr.dir < 0 || curr.pos + curr.dir >= curr.line.length) { + curr.line = null; + } + else { + curr.pos += curr.dir; + } + } + function forward(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + var lastSentencePos = curr.pos; + nextChar(curr); + while (curr.line !== null) { + lastSentencePos = curr.pos; + if (isEndOfSentenceSymbol(curr.line[curr.pos])) { + if (!inclusive) { + return { ln: curr.ln, pos: curr.pos + 1 }; + } + else { + nextChar(curr); + while (curr.line !== null) { + if (isWhiteSpaceString(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + nextChar(curr); + } + else { + break; + } + } + return { ln: curr.ln, pos: lastSentencePos + 1 }; + } + } + nextChar(curr); + } + return { ln: curr.ln, pos: lastSentencePos + 1 }; + } + function reverse(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + var lastSentencePos = curr.pos; + nextChar(curr); + while (curr.line !== null) { + if (!isWhiteSpaceString(curr.line[curr.pos]) && !isEndOfSentenceSymbol(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos])) { + if (!inclusive) { + return { ln: curr.ln, pos: lastSentencePos }; + } + else { + if (isWhiteSpaceString(curr.line[curr.pos + 1])) { + return { ln: curr.ln, pos: curr.pos + 1 }; + } + else { + return { ln: curr.ln, pos: lastSentencePos }; + } + } + } + nextChar(curr); + } + curr.line = line; + if (inclusive && isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos }; + } + else { + return { ln: curr.ln, pos: lastSentencePos }; + } + } + var curr_index = { + ln: cur.line, + pos: cur.ch, + }; + while (repeat > 0) { + if (dir < 0) { + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + } + else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + } + repeat--; + } + return new Pos(curr_index.ln, curr_index.pos); +} +function findSentence(cm, cur, repeat, dir) { + function nextChar(cm, idx) { if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) { - idx.ln += idx.dir; - if (!isLine(cm, idx.ln)) { - idx.line = null; - idx.ln = null; - idx.pos = null; - return; - } - idx.line = cm.getLine(idx.ln); - idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; + idx.ln += idx.dir; + if (!isLine(cm, idx.ln)) { + idx.line = null; + idx.ln = null; + idx.pos = null; + return; + } + idx.line = cm.getLine(idx.ln); + idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; } else { - idx.pos += idx.dir; + idx.pos += idx.dir; } - } - function forward(cm, ln, pos, dir) { + } + function forward(cm, ln, pos, dir) { var line = cm.getLine(ln); var stop = (line === ""); - var curr = { - line: line, - ln: ln, - pos: pos, - dir: dir, - } - + line: line, + ln: ln, + pos: pos, + dir: dir, + }; var last_valid = { - ln: curr.ln, - pos: curr.pos, - } - + ln: curr.ln, + pos: curr.pos, + }; var skip_empty_lines = (curr.line === ""); nextChar(cm, curr); - while (curr.line !== null) { - last_valid.ln = curr.ln; - last_valid.pos = curr.pos; - - if (curr.line === "" && !skip_empty_lines) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - return { ln: curr.ln, pos: curr.pos, }; - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && !stop - && (curr.pos === curr.line.length - 1 - || isWhiteSpaceString(curr.line[curr.pos + 1]))) { - stop = true; - } - - nextChar(cm, curr); + last_valid.ln = curr.ln; + last_valid.pos = curr.pos; + if (curr.line === "" && !skip_empty_lines) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && !stop + && (curr.pos === curr.line.length - 1 + || isWhiteSpaceString(curr.line[curr.pos + 1]))) { + stop = true; + } + nextChar(cm, curr); } var line = cm.getLine(last_valid.ln); last_valid.pos = 0; - for(var i = line.length - 1; i >= 0; --i) { - if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; - } + for (var i = line.length - 1; i >= 0; --i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } } - return last_valid; - - } - function reverse(cm, ln, pos, dir) { + } + function reverse(cm, ln, pos, dir) { var line = cm.getLine(ln); - var curr = { - line: line, - ln: ln, - pos: pos, - dir: dir, - } - + line: line, + ln: ln, + pos: pos, + dir: dir, + }; var last_valid = { - ln: curr.ln, - pos: null, + ln: curr.ln, + pos: null, }; - var skip_empty_lines = (curr.line === ""); nextChar(cm, curr); - while (curr.line !== null) { - - if (curr.line === "" && !skip_empty_lines) { - if (last_valid.pos !== null) { - return last_valid; + if (curr.line === "" && !skip_empty_lines) { + if (last_valid.pos !== null) { + return last_valid; + } + else { + return { ln: curr.ln, pos: curr.pos }; + } } - else { - return { ln: curr.ln, pos: curr.pos }; - } - } - else if (isEndOfSentenceSymbol(curr.line[curr.pos]) - && last_valid.pos !== null - && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { - return last_valid; - } - else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { - skip_empty_lines = false; - last_valid = { ln: curr.ln, pos: curr.pos } - } - - nextChar(cm, curr); + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && last_valid.pos !== null + && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { + return last_valid; + } + else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + skip_empty_lines = false; + last_valid = { ln: curr.ln, pos: curr.pos }; + } + nextChar(cm, curr); } var line = cm.getLine(last_valid.ln); last_valid.pos = 0; - for(var i = 0; i < line.length; ++i) { - if (!isWhiteSpaceString(line[i])) { - last_valid.pos = i; - break; - } + for (var i = 0; i < line.length; ++i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } } return last_valid; - } - - var curr_index = { + } + var curr_index = { ln: cur.line, pos: cur.ch, - }; - - while (repeat > 0) { + }; + while (repeat > 0) { if (dir < 0) { - curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); } else { - curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); } repeat--; - } - - return new Pos(curr_index.ln, curr_index.pos); } - function selectCompanionObject(cm, head, symb, inclusive) { - var cur = head, start, end; - - var bracketRegexp = ({ + return new Pos(curr_index.ln, curr_index.pos); +} +function selectCompanionObject(cm, head, symb, inclusive) { + var cur = head, start, end; + var bracketRegexp = ({ '(': /[()]/, ')': /[()]/, '[': /[[\]]/, ']': /[[\]]/, '{': /[{}]/, '}': /[{}]/, - '<': /[<>]/, '>': /[<>]/})[symb]; - var openSym = ({ + '<': /[<>]/, '>': /[<>]/ + })[symb]; + var openSym = ({ '(': '(', ')': '(', '[': '[', ']': '[', '{': '{', '}': '{', - '<': '<', '>': '<'})[symb]; - var curChar = cm.getLine(cur.line).charAt(cur.ch); - var offset = curChar === openSym ? 1 : 0; - - start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp}); - end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp}); - - if (!start || !end) { - return { start: cur, end: cur }; - } - - start = start.pos; - end = end.pos; - - if ((start.line == end.line && start.ch > end.ch) - || (start.line > end.line)) { + '<': '<', '>': '<' + })[symb]; + var curChar = cm.getLine(cur.line).charAt(cur.ch); + var offset = curChar === openSym ? 1 : 0; + start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, { 'bracketRegex': bracketRegexp }); + end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, { 'bracketRegex': bracketRegexp }); + if (!start || !end) + return null; + start = start.pos; + end = end.pos; + if ((start.line == end.line && start.ch > end.ch) + || (start.line > end.line)) { var tmp = start; start = end; end = tmp; - } - - if (inclusive) { + } + if (inclusive) { end.ch += 1; - } else { + } + else { start.ch += 1; - } - - return { start: start, end: end }; - } - function findBeginningAndEnd(cm, head, symb, inclusive) { - var cur = copyCursor(head); - var line = cm.getLine(cur.line); - var chars = line.split(''); - var start, end, i, len; - var firstIndex = chars.indexOf(symb); - if (cur.ch < firstIndex) { + } + return { start: start, end: end }; +} +function findBeginningAndEnd(cm, head, symb, inclusive) { + var cur = copyCursor(head); + var line = cm.getLine(cur.line); + var chars = line.split(''); + var start, end, i, len; + var firstIndex = chars.indexOf(symb); + if (cur.ch < firstIndex) { cur.ch = firstIndex; - } - else if (firstIndex < cur.ch && chars[cur.ch] == symb) { - end = cur.ch; // assign end to the current cursor - --cur.ch; // make sure to look backwards - } - if (chars[cur.ch] == symb && !end) { + } + else if (firstIndex < cur.ch && chars[cur.ch] == symb) { + var stringAfter = /string/.test(cm.getTokenTypeAt(offsetCursor(head, 0, 1))); + var stringBefore = /string/.test(cm.getTokenTypeAt(head)); + var isStringStart = stringAfter && !stringBefore; + if (!isStringStart) { + end = cur.ch; // assign end to the current cursor + --cur.ch; // make sure to look backwards + } + } + if (chars[cur.ch] == symb && !end) { start = cur.ch + 1; // assign start to ahead of the cursor - } else { + } + else { for (i = cur.ch; i > -1 && !start; i--) { - if (chars[i] == symb) { - start = i + 1; - } + if (chars[i] == symb) { + start = i + 1; + } } - } - if (start && !end) { + } + if (start && !end) { for (i = start, len = chars.length; i < len && !end; i++) { - if (chars[i] == symb) { - end = i; - } + if (chars[i] == symb) { + end = i; + } } - } - if (!start || !end) { + } + if (!start || !end) { return { start: cur, end: cur }; - } - if (inclusive) { - --start; ++end; - } - - return { + } + if (inclusive) { + --start; + ++end; + } + return { start: new Pos(cur.line, start), end: new Pos(cur.line, end) - }; - } - defineOption('pcre', true, 'boolean'); - function SearchState() {} - SearchState.prototype = { - getQuery: function() { + }; +} +defineOption('pcre', true, 'boolean'); +function SearchState() { } +SearchState.prototype = { + getQuery: function () { return vimGlobalState.query; - }, - setQuery: function(query) { + }, + setQuery: function (query) { vimGlobalState.query = query; - }, - getOverlay: function() { + }, + getOverlay: function () { return this.searchOverlay; - }, - setOverlay: function(overlay) { + }, + setOverlay: function (overlay) { this.searchOverlay = overlay; - }, - isReversed: function() { + }, + isReversed: function () { return vimGlobalState.isReversed; - }, - setReversed: function(reversed) { + }, + setReversed: function (reversed) { vimGlobalState.isReversed = reversed; - }, - getScrollbarAnnotate: function() { + }, + getScrollbarAnnotate: function () { return this.annotate; - }, - setScrollbarAnnotate: function(annotate) { + }, + setScrollbarAnnotate: function (annotate) { this.annotate = annotate; - } - }; - function getSearchState(cm) { - var vim = cm.state.vim; - return vim.searchState_ || (vim.searchState_ = new SearchState()); - } - function splitBySlash(argString) { - return splitBySeparator(argString, '/'); - } - - function findUnescapedSlashes(argString) { - return findUnescapedSeparators(argString, '/'); } - - function splitBySeparator(argString, separator) { - var slashes = findUnescapedSeparators(argString, separator) || []; - if (!slashes.length) return []; - var tokens = []; - if (slashes[0] !== 0) return; - for (var i = 0; i < slashes.length; i++) { +}; +function getSearchState(cm) { + var vim = cm.state.vim; + return vim.searchState_ || (vim.searchState_ = new SearchState()); +} +function splitBySlash(argString) { + return splitBySeparator(argString, '/'); +} +function findUnescapedSlashes(argString) { + return findUnescapedSeparators(argString, '/'); +} +function splitBySeparator(argString, separator) { + var slashes = findUnescapedSeparators(argString, separator) || []; + if (!slashes.length) + return []; + var tokens = []; + if (slashes[0] !== 0) + return; + for (var i = 0; i < slashes.length; i++) { if (typeof slashes[i] == 'number') - tokens.push(argString.substring(slashes[i] + 1, slashes[i+1])); - } - return tokens; + tokens.push(argString.substring(slashes[i] + 1, slashes[i + 1])); } - - function findUnescapedSeparators(str, separator) { - if (!separator) + return tokens; +} +function findUnescapedSeparators(str, separator) { + if (!separator) separator = '/'; - - var escapeNextChar = false; - var slashes = []; - for (var i = 0; i < str.length; i++) { + var escapeNextChar = false; + var slashes = []; + for (var i = 0; i < str.length; i++) { var c = str.charAt(i); if (!escapeNextChar && c == separator) { - slashes.push(i); + slashes.push(i); } escapeNextChar = !escapeNextChar && (c == '\\'); - } - return slashes; - } - function translateRegex(str) { - var specials = '|(){'; - var unescape = '}'; - var escapeNextChar = false; - var out = []; - for (var i = -1; i < str.length; i++) { + } + return slashes; +} +function translateRegex(str) { + var specials = '|(){'; + var unescape = '}'; + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; + var n = str.charAt(i + 1) || ''; var specialComesNext = (n && specials.indexOf(n) != -1); if (escapeNextChar) { - if (c !== '\\' || !specialComesNext) { - out.push(c); - } - escapeNextChar = false; - } else { - if (c === '\\') { - escapeNextChar = true; - if (n && unescape.indexOf(n) != -1) { - specialComesNext = true; - } - if (!specialComesNext || n === '\\') { - out.push(c); - } - } else { - out.push(c); - if (specialComesNext && n !== '\\') { - out.push('\\'); + if (c !== '\\' || !specialComesNext) { + out.push(c); + } + escapeNextChar = false; + } + else { + if (c === '\\') { + escapeNextChar = true; + if (n && unescape.indexOf(n) != -1) { + specialComesNext = true; + } + if (!specialComesNext || n === '\\') { + out.push(c); + } + } + else { + out.push(c); + if (specialComesNext && n !== '\\') { + out.push('\\'); + } } - } } - } - return out.join(''); } - var charUnescapes = {'\\n': '\n', '\\r': '\r', '\\t': '\t'}; - function translateRegexReplace(str) { - var escapeNextChar = false; - var out = []; - for (var i = -1; i < str.length; i++) { + return out.join(''); +} +var charUnescapes = { '\\n': '\n', '\\r': '\r', '\\t': '\t' }; +function translateRegexReplace(str) { + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { var c = str.charAt(i) || ''; - var n = str.charAt(i+1) || ''; + var n = str.charAt(i + 1) || ''; if (charUnescapes[c + n]) { - out.push(charUnescapes[c+n]); - i++; - } else if (escapeNextChar) { - out.push(c); - escapeNextChar = false; - } else { - if (c === '\\') { - escapeNextChar = true; - if ((isNumber(n) || n === '$')) { - out.push('$'); - } else if (n !== '/' && n !== '\\') { - out.push('\\'); - } - } else { - if (c === '$') { - out.push('$'); - } + out.push(charUnescapes[c + n]); + i++; + } + else if (escapeNextChar) { out.push(c); - if (n === '/') { - out.push('\\'); + escapeNextChar = false; + } + else { + if (c === '\\') { + escapeNextChar = true; + if ((isNumber(n) || n === '$')) { + out.push('$'); + } + else if (n !== '/' && n !== '\\') { + out.push('\\'); + } + } + else { + if (c === '$') { + out.push('$'); + } + out.push(c); + if (n === '/') { + out.push('\\'); + } } - } } - } - return out.join(''); } - var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&':'&'}; - function unescapeRegexReplace(str) { - var stream = new CodeMirror.StringStream(str); - var output = []; - while (!stream.eol()) { + return out.join(''); +} +var unescapes = { '\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&': '&' }; +function unescapeRegexReplace(str) { + var stream = new CodeMirror.StringStream(str); + var output = []; + while (!stream.eol()) { while (stream.peek() && stream.peek() != '\\') { - output.push(stream.next()); + output.push(stream.next()); } var matched = false; for (var matcher in unescapes) { - if (stream.match(matcher, true)) { - matched = true; - output.push(unescapes[matcher]); - break; - } + if (stream.match(matcher, true)) { + matched = true; + output.push(unescapes[matcher]); + break; + } } if (!matched) { - output.push(stream.next()); - } - } - return output.join(''); - } - function parseQuery(query, ignoreCase, smartCase) { - var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); - lastSearchRegister.setText(query); - if (query instanceof RegExp) { return query; } - var slashes = findUnescapedSlashes(query); - var regexPart; - var forceIgnoreCase; - if (!slashes.length) { + output.push(stream.next()); + } + } + return output.join(''); +} +function parseQuery(query, ignoreCase, smartCase) { + var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); + lastSearchRegister.setText(query); + if (query instanceof RegExp) { + return query; + } + var slashes = findUnescapedSlashes(query); + var regexPart; + var forceIgnoreCase; + if (!slashes.length) { regexPart = query; - } else { + } + else { regexPart = query.substring(0, slashes[0]); var flagsPart = query.substring(slashes[0]); forceIgnoreCase = (flagsPart.indexOf('i') != -1); - } - if (!regexPart) { + } + if (!regexPart) { return null; - } - if (!getOption('pcre')) { + } + if (!getOption('pcre')) { regexPart = translateRegex(regexPart); - } - if (smartCase) { + } + if (smartCase) { ignoreCase = (/^[^A-Z]*$/).test(regexPart); - } - var regexp = new RegExp(regexPart, - (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); - return regexp; - } - function hdom(n) { - if (typeof n === 'string') n = document.createElement(n); - for (var a, i = 1; i < arguments.length; i++) { - if (!(a = arguments[i])) continue; - if (typeof a !== 'object') a = document.createTextNode(a); - if (a.nodeType) n.appendChild(a); - else for (var key in a) { - if (!Object.prototype.hasOwnProperty.call(a, key)) continue; - if (key[0] === '$') n.style[key.slice(1)] = a[key]; - else n.setAttribute(key, a[key]); - } - } - return n; } - - function showConfirm(cm, template) { - var pre = hdom('span', {$color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message'}, template); //ace_patch span instead of pre - if (cm.openNotification) { - cm.openNotification(pre, {bottom: true, duration: 5000}); - } else { + var regexp = new RegExp(regexPart, (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); + return regexp; +} +function dom(n) { + if (typeof n === 'string') + n = document.createElement(n); + for (var a, i = 1; i < arguments.length; i++) { + if (!(a = arguments[i])) + continue; + if (typeof a !== 'object') + a = document.createTextNode(a); + if (a.nodeType) + n.appendChild(a); + else + for (var key in a) { + if (!Object.prototype.hasOwnProperty.call(a, key)) + continue; + if (key[0] === '$') + n.style[key.slice(1)] = a[key]; + else + n.setAttribute(key, a[key]); + } + } + return n; +} +function showConfirm(cm, template) { + var pre = dom('div', { $color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message' }, template); + if (cm.openNotification) { + cm.openNotification(pre, { bottom: true, duration: 5000 }); + } + else { alert(pre.innerText); - } } - - function makePrompt(prefix, desc) { - return hdom(document.createDocumentFragment(), - hdom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'}, - prefix, - hdom('input', {type: 'text', autocorrect: 'off', - autocapitalize: 'off', spellcheck: 'false'})), - desc && hdom('span', {$color: '#888'}, desc)); +} +function makePrompt(prefix, desc) { + return dom('div', { $display: 'flex' }, dom('span', { $fontFamily: 'monospace', $whiteSpace: 'pre', $flex: 1 }, prefix, dom('input', { type: 'text', autocorrect: 'off', + autocapitalize: 'off', spellcheck: 'false', $width: '100%' })), desc && dom('span', { $color: '#888' }, desc)); +} +function showPrompt(cm, options) { + if (keyToKeyStack.length) { + if (!options.value) + options.value = ''; + virtualPrompt = options; + return; } - - function showPrompt(cm, options) { - var template = makePrompt(options.prefix, options.desc); - if (cm.openDialog) { + var template = makePrompt(options.prefix, options.desc); + if (cm.openDialog) { cm.openDialog(template, options.onClose, { - onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, - bottom: true, selectValueOnOpen: false, value: options.value + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, + bottom: true, selectValueOnOpen: false, value: options.value }); - } - else { + } + else { var shortText = ''; - if (typeof options.prefix != "string" && options.prefix) shortText += options.prefix.textContent; - if (options.desc) shortText += " " + options.desc; + if (typeof options.prefix != "string" && options.prefix) + shortText += options.prefix.textContent; + if (options.desc) + shortText += " " + options.desc; options.onClose(prompt(shortText, '')); - } } - - function regexEqual(r1, r2) { - if (r1 instanceof RegExp && r2 instanceof RegExp) { - var props = ['global', 'multiline', 'ignoreCase', 'source']; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - if (r1[prop] !== r2[prop]) { - return false; - } - } - return true; - } - return false; - } - function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { - if (!rawQuery) { +} +function regexEqual(r1, r2) { + if (r1 instanceof RegExp && r2 instanceof RegExp) { + var props = ['global', 'multiline', 'ignoreCase', 'source']; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (r1[prop] !== r2[prop]) { + return false; + } + } + return true; + } + return false; +} +function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { + if (!rawQuery) { return; - } - var state = getSearchState(cm); - var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); - if (!query) { + } + var state = getSearchState(cm); + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + if (!query) { return; - } - highlightSearchMatches(cm, query); - if (regexEqual(query, state.getQuery())) { + } + highlightSearchMatches(cm, query); + if (regexEqual(query, state.getQuery())) { return query; - } - state.setQuery(query); - return query; } - function searchOverlay(query) { - if (query.source.charAt(0) == '^') { + state.setQuery(query); + return query; +} +function searchOverlay(query) { + if (query.source.charAt(0) == '^') { var matchSol = true; - } - return { - token: function(stream) { - if (matchSol && !stream.sol()) { - stream.skipToEnd(); - return; - } - var match = stream.match(query, false); - if (match) { - if (match[0].length == 0) { - stream.next(); - return 'searching'; - } - if (!stream.sol()) { - stream.backUp(1); - if (!query.exec(stream.next() + match[0])) { + } + return { + token: function (stream) { + if (matchSol && !stream.sol()) { + stream.skipToEnd(); + return; + } + var match = stream.match(query, false); + if (match) { + if (match[0].length == 0) { + stream.next(); + return 'searching'; + } + if (!stream.sol()) { + stream.backUp(1); + if (!query.exec(stream.next() + match[0])) { + stream.next(); + return null; + } + } + stream.match(query); + return 'searching'; + } + while (!stream.eol()) { stream.next(); - return null; - } - } - stream.match(query); - return 'searching'; - } - while (!stream.eol()) { - stream.next(); - if (stream.match(query, false)) break; - } + if (stream.match(query, false)) + break; + } }, query: query - }; - } - function highlightSearchMatches(cm, query) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); - if (!overlay || query != overlay.query) { - if (overlay) { - cm.removeOverlay(overlay); - } - overlay = searchOverlay(query); - cm.addOverlay(overlay); - if (cm.showMatchesOnScrollbar) { - if (searchState.getScrollbarAnnotate()) { - searchState.getScrollbarAnnotate().clear(); - } - searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); - } - searchState.setOverlay(overlay); - } - } - function findNext(cm, prev, query, repeat) { - if (repeat === undefined) { repeat = 1; } - return cm.operation(function() { + }; +} +var highlightTimeout = 0; +function highlightSearchMatches(cm, query) { + clearTimeout(highlightTimeout); + var searchState = getSearchState(cm); + searchState.highlightTimeout = highlightTimeout; + highlightTimeout = setTimeout(function () { + if (!cm.state.vim) + return; + var searchState = getSearchState(cm); + searchState.highlightTimeout = null; + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); + } + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); + } + }, 50); +} +function findNext(cm, prev, query, repeat) { + if (repeat === undefined) { + repeat = 1; + } + return cm.operation(function () { var pos = cm.getCursor(); var cursor = cm.getSearchCursor(query, pos); for (var i = 0; i < repeat; i++) { - var found = cursor.find(prev); - if (i == 0 && found && cursorEqual(cursor.from(), pos)) { - var lastEndPos = prev ? cursor.from() : cursor.to(); - found = cursor.find(prev); - if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { - if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + var found = cursor.find(prev); + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { + var lastEndPos = prev ? cursor.from() : cursor.to(); found = cursor.find(prev); + if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { + if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + found = cursor.find(prev); + } } - } - if (!found) { - cursor = cm.getSearchCursor(query, - (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); - if (!cursor.find(prev)) { - return; + if (!found) { + cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0)); + if (!cursor.find(prev)) { + return; + } } - } } return cursor.from(); - }); + }); +} +function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { + if (repeat === undefined) { + repeat = 1; } - function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { - if (repeat === undefined) { repeat = 1; } - return cm.operation(function() { + return cm.operation(function () { var pos = cm.getCursor(); var cursor = cm.getSearchCursor(query, pos); var found = cursor.find(!prev); if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) { - cursor.find(!prev); + cursor.find(!prev); } - for (var i = 0; i < repeat; i++) { - found = cursor.find(prev); - if (!found) { - cursor = cm.getSearchCursor(query, - (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); - if (!cursor.find(prev)) { - return; + found = cursor.find(prev); + if (!found) { + cursor = cm.getSearchCursor(query, (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0)); + if (!cursor.find(prev)) { + return; + } } - } } return [cursor.from(), cursor.to()]; - }); - } - function clearSearchHighlight(cm) { - var state = getSearchState(cm); - cm.removeOverlay(getSearchState(cm).getOverlay()); - state.setOverlay(null); - if (state.getScrollbarAnnotate()) { + }); +} +function clearSearchHighlight(cm) { + var state = getSearchState(cm); + if (state.highlightTimeout) { + clearTimeout(state.highlightTimeout); + state.highlightTimeout = null; + } + cm.removeOverlay(getSearchState(cm).getOverlay()); + state.setOverlay(null); + if (state.getScrollbarAnnotate()) { state.getScrollbarAnnotate().clear(); state.setScrollbarAnnotate(null); - } } - function isInRange(pos, start, end) { - if (typeof pos != 'number') { +} +function isInRange(pos, start, end) { + if (typeof pos != 'number') { pos = pos.line; - } - if (start instanceof Array) { + } + if (start instanceof Array) { return inArray(pos, start); - } else { + } + else { if (typeof end == 'number') { - return (pos >= start && pos <= end); - } else { - return pos == start; + return (pos >= start && pos <= end); + } + else { + return pos == start; } - } } - function getUserVisibleLines(cm) { - var renderer = cm.ace.renderer; - return { +} +function getUserVisibleLines(cm) { + var renderer = cm.ace.renderer; + return { top: renderer.getFirstFullyVisibleRow(), bottom: renderer.getLastFullyVisibleRow() - } - } - - function getMarkPos(cm, vim, markName) { - if (markName == '\'' || markName == '`') { + }; +} +function getMarkPos(cm, vim, markName) { + if (markName == '\'' || markName == '`') { return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0); - } else if (markName == '.') { + } + else if (markName == '.') { return getLastEditPos(cm); - } - - var mark = vim.marks[markName]; - return mark && mark.find(); } - - function getLastEditPos(cm) { - var undoManager = cm.ace.session.$undoManager; - if (undoManager && undoManager.$lastDelta) - return toCmPos(undoManager.$lastDelta.end); + var mark = vim.marks[markName]; + return mark && mark.find(); +} +function getLastEditPos(cm) { + if (cm.getLastEditEnd) { + return cm.getLastEditEnd(); } - - var ExCommandDispatcher = function() { - this.buildCommandMap_(); - }; - ExCommandDispatcher.prototype = { - processCommand: function(cm, input, opt_params) { + var done = cm.doc.history.done; + for (var i = done.length; i--;) { + if (done[i].changes) { + return copyCursor(done[i].changes[0].to); + } + } +} +var ExCommandDispatcher = function () { + this.buildCommandMap_(); +}; +ExCommandDispatcher.prototype = { + processCommand: function (cm, input, opt_params) { var that = this; cm.operation(function () { - cm.curOp.isVimOp = true; - that._processCommand(cm, input, opt_params); + cm.curOp.isVimOp = true; + that._processCommand(cm, input, opt_params); }); - }, - _processCommand: function(cm, input, opt_params) { + }, + _processCommand: function (cm, input, opt_params) { var vim = cm.state.vim; var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); var previousCommand = commandHistoryRegister.toString(); - if (vim.visualMode) { - exitVisualMode(cm); - } var inputStream = new CodeMirror.StringStream(input); commandHistoryRegister.setText(input); var params = opt_params || {}; params.input = input; try { - this.parseInput_(cm, inputStream, params); - } catch(e) { - showConfirm(cm, e.toString()); - throw e; + this.parseInput_(cm, inputStream, params); + } + catch (e) { + showConfirm(cm, e.toString()); + throw e; + } + if (vim.visualMode) { + exitVisualMode(cm); } var command; var commandName; if (!params.commandName) { - if (params.line !== undefined) { - commandName = 'move'; - } - } else { - command = this.matchCommand_(params.commandName); - if (command) { - commandName = command.name; - if (command.excludeFromCommandHistory) { - commandHistoryRegister.setText(previousCommand); - } - this.parseCommandArgs_(inputStream, params, command); - if (command.type == 'exToKey') { - for (var i = 0; i < command.toKeys.length; i++) { - vimApi.handleKey(cm, command.toKeys[i], 'mapping'); - } - return; - } else if (command.type == 'exToEx') { - this.processCommand(cm, command.toInput); - return; - } - } + if (params.line !== undefined) { + commandName = 'move'; + } + } + else { + command = this.matchCommand_(params.commandName); + if (command) { + commandName = command.name; + if (command.excludeFromCommandHistory) { + commandHistoryRegister.setText(previousCommand); + } + this.parseCommandArgs_(inputStream, params, command); + if (command.type == 'exToKey') { + doKeyToKey(cm, command.toKeys, command); + return; + } + else if (command.type == 'exToEx') { + this.processCommand(cm, command.toInput); + return; + } + } } if (!commandName) { - showConfirm(cm, 'Not an editor command ":' + input + '"'); - return; + showConfirm(cm, 'Not an editor command ":' + input + '"'); + return; } try { - exCommands[commandName](cm, params); - if ((!command || !command.possiblyAsync) && params.callback) { - params.callback(); - } - } catch(e) { - showConfirm(cm, e.toString()); - throw e; - } - }, - parseInput_: function(cm, inputStream, result) { + exCommands[commandName](cm, params); + if ((!command || !command.possiblyAsync) && params.callback) { + params.callback(); + } + } + catch (e) { + showConfirm(cm, e.toString()); + throw e; + } + }, + parseInput_: function (cm, inputStream, result) { inputStream.eatWhile(':'); if (inputStream.eat('%')) { - result.line = cm.firstLine(); - result.lineEnd = cm.lastLine(); - } else { - result.line = this.parseLineSpec_(cm, inputStream); - if (result.line !== undefined && inputStream.eat(',')) { - result.lineEnd = this.parseLineSpec_(cm, inputStream); - } + result.line = cm.firstLine(); + result.lineEnd = cm.lastLine(); + } + else { + result.line = this.parseLineSpec_(cm, inputStream); + if (result.line !== undefined && inputStream.eat(',')) { + result.lineEnd = this.parseLineSpec_(cm, inputStream); + } + } + if (result.line == undefined) { + if (cm.state.vim.visualMode) { + var pos = getMarkPos(cm, cm.state.vim, '<'); + result.selectionLine = pos && pos.line; + pos = getMarkPos(cm, cm.state.vim, '>'); + result.selectionLineEnd = pos && pos.line; + } + else { + result.selectionLine = cm.getCursor().line; + } + } + else { + result.selectionLine = result.line; + result.selectionLineEnd = result.lineEnd; } var commandMatch = inputStream.match(/^(\w+|!!|@@|[!#&*<=>@~])/); if (commandMatch) { - result.commandName = commandMatch[1]; - } else { - result.commandName = inputStream.match(/.*/)[0]; + result.commandName = commandMatch[1]; + } + else { + result.commandName = inputStream.match(/.*/)[0]; } - return result; - }, - parseLineSpec_: function(cm, inputStream) { + }, + parseLineSpec_: function (cm, inputStream) { var numberMatch = inputStream.match(/^(\d+)/); if (numberMatch) { - return parseInt(numberMatch[1], 10) - 1; + return parseInt(numberMatch[1], 10) - 1; } switch (inputStream.next()) { - case '.': - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); - case '$': - return this.parseLineSpecOffset_(inputStream, cm.lastLine()); - case '\'': - var markName = inputStream.next(); - var markPos = getMarkPos(cm, cm.state.vim, markName); - if (!markPos) throw new Error('Mark not set'); - return this.parseLineSpecOffset_(inputStream, markPos.line); - case '-': - case '+': - inputStream.backUp(1); - return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); - default: - inputStream.backUp(1); - return undefined; - } - }, - parseLineSpecOffset_: function(inputStream, line) { + case '.': + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + case '$': + return this.parseLineSpecOffset_(inputStream, cm.lastLine()); + case '\'': + var markName = inputStream.next(); + var markPos = getMarkPos(cm, cm.state.vim, markName); + if (!markPos) + throw new Error('Mark not set'); + return this.parseLineSpecOffset_(inputStream, markPos.line); + case '-': + case '+': + inputStream.backUp(1); + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); + default: + inputStream.backUp(1); + return undefined; + } + }, + parseLineSpecOffset_: function (inputStream, line) { var offsetMatch = inputStream.match(/^([+-])?(\d+)/); if (offsetMatch) { - var offset = parseInt(offsetMatch[2], 10); - if (offsetMatch[1] == "-") { - line -= offset; - } else { - line += offset; - } + var offset = parseInt(offsetMatch[2], 10); + if (offsetMatch[1] == "-") { + line -= offset; + } + else { + line += offset; + } } return line; - }, - parseCommandArgs_: function(inputStream, params, command) { + }, + parseCommandArgs_: function (inputStream, params, command) { if (inputStream.eol()) { - return; + return; } params.argString = inputStream.match(/.*/)[0]; var delim = command.argDelimiter || /\s+/; var args = trim(params.argString).split(delim); if (args.length && args[0]) { - params.args = args; + params.args = args; } - }, - matchCommand_: function(commandName) { + }, + matchCommand_: function (commandName) { for (var i = commandName.length; i > 0; i--) { - var prefix = commandName.substring(0, i); - if (this.commandMap_[prefix]) { - var command = this.commandMap_[prefix]; - if (command.name.indexOf(commandName) === 0) { - return command; + var prefix = commandName.substring(0, i); + if (this.commandMap_[prefix]) { + var command = this.commandMap_[prefix]; + if (command.name.indexOf(commandName) === 0) { + return command; + } } - } } return null; - }, - buildCommandMap_: function() { + }, + buildCommandMap_: function () { this.commandMap_ = {}; for (var i = 0; i < defaultExCommandMap.length; i++) { - var command = defaultExCommandMap[i]; - var key = command.shortName || command.name; - this.commandMap_[key] = command; + var command = defaultExCommandMap[i]; + var key = command.shortName || command.name; + this.commandMap_[key] = command; } - }, - map: function(lhs, rhs, ctx) { + }, + map: function (lhs, rhs, ctx, noremap) { if (lhs != ':' && lhs.charAt(0) == ':') { - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); - if (rhs != ':' && rhs.charAt(0) == ':') { - this.commandMap_[commandName] = { - name: commandName, - type: 'exToEx', - toInput: rhs.substring(1), - user: true - }; - } else { - this.commandMap_[commandName] = { - name: commandName, - type: 'exToKey', - toKeys: rhs, - user: true - }; - } - } else { - if (rhs != ':' && rhs.charAt(0) == ':') { - var mapping = { - keys: lhs, - type: 'keyToEx', - exArgs: { input: rhs.substring(1) } - }; - if (ctx) { mapping.context = ctx; } - defaultKeymap.unshift(mapping); - } else { + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (rhs != ':' && rhs.charAt(0) == ':') { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToEx', + toInput: rhs.substring(1), + user: true + }; + } + else { + this.commandMap_[commandName] = { + name: commandName, + type: 'exToKey', + toKeys: rhs, + user: true + }; + } + } + else { var mapping = { - keys: lhs, - type: 'keyToKey', - toKeys: rhs + keys: lhs, + type: 'keyToKey', + toKeys: rhs, + noremap: !!noremap }; - if (ctx) { mapping.context = ctx; } + if (ctx) { + mapping.context = ctx; + } defaultKeymap.unshift(mapping); - } } - }, - unmap: function(lhs, ctx) { + }, + unmap: function (lhs, ctx) { if (lhs != ':' && lhs.charAt(0) == ':') { - if (ctx) { throw Error('Mode not supported for ex mappings'); } - var commandName = lhs.substring(1); - if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { - delete this.commandMap_[commandName]; - return true; - } - } else { - var keys = lhs; - for (var i = 0; i < defaultKeymap.length; i++) { - if (keys == defaultKeymap[i].keys - && defaultKeymap[i].context === ctx) { - defaultKeymap.splice(i, 1); - return true; - } - } - } - } - }; - - var exCommands = { - colorscheme: function(cm, params) { + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { + delete this.commandMap_[commandName]; + return true; + } + } + else { + var keys = lhs; + for (var i = 0; i < defaultKeymap.length; i++) { + if (keys == defaultKeymap[i].keys + && defaultKeymap[i].context === ctx) { + defaultKeymap.splice(i, 1); + return true; + } + } + } + } +}; +var exCommands = { + colorscheme: function (cm, params) { if (!params.args || params.args.length < 1) { - showConfirm(cm, cm.getOption('theme')); - return; + showConfirm(cm, cm.getOption('theme')); + return; } cm.setOption('theme', params.args[0]); - }, - map: function(cm, params, ctx) { + }, + map: function (cm, params, ctx, defaultOnly) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 2) { - if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); - } - return; - } - exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); - }, - imap: function(cm, params) { this.map(cm, params, 'insert'); }, - nmap: function(cm, params) { this.map(cm, params, 'normal'); }, - vmap: function(cm, params) { this.map(cm, params, 'visual'); }, - unmap: function(cm, params, ctx) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx, defaultOnly); + }, + imap: function (cm, params) { this.map(cm, params, 'insert'); }, + nmap: function (cm, params) { this.map(cm, params, 'normal'); }, + vmap: function (cm, params) { this.map(cm, params, 'visual'); }, + omap: function (cm, params) { this.map(cm, params, 'operatorPending'); }, + noremap: function (cm, params) { this.map(cm, params, undefined, true); }, + inoremap: function (cm, params) { this.map(cm, params, 'insert', true); }, + nnoremap: function (cm, params) { this.map(cm, params, 'normal', true); }, + vnoremap: function (cm, params) { this.map(cm, params, 'visual', true); }, + onoremap: function (cm, params) { this.map(cm, params, 'operatorPending', true); }, + unmap: function (cm, params, ctx) { var mapArgs = params.args; if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) { - if (cm) { - showConfirm(cm, 'No such mapping: ' + params.input); - } + if (cm) { + showConfirm(cm, 'No such mapping: ' + params.input); + } } - }, - move: function(cm, params) { + }, + mapclear: function (cm, params) { vimApi.mapclear(); }, + imapclear: function (cm, params) { vimApi.mapclear('insert'); }, + nmapclear: function (cm, params) { vimApi.mapclear('normal'); }, + vmapclear: function (cm, params) { vimApi.mapclear('visual'); }, + omapclear: function (cm, params) { vimApi.mapclear('operatorPending'); }, + move: function (cm, params) { commandDispatcher.processCommand(cm, cm.state.vim, { type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, - linewise: true }, - repeatOverride: params.line+1}); - }, - set: function(cm, params) { + linewise: true }, + repeatOverride: params.line + 1 + }); + }, + set: function (cm, params) { var setArgs = params.args; var setCfg = params.setCfg || {}; if (!setArgs || setArgs.length < 1) { - if (cm) { - showConfirm(cm, 'Invalid mapping: ' + params.input); - } - return; + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; } var expr = setArgs[0].split('='); var optionName = expr[0]; var value = expr[1]; var forceGet = false; - + var forceToggle = false; if (optionName.charAt(optionName.length - 1) == '?') { - if (value) { throw Error('Trailing characters: ' + params.argString); } - optionName = optionName.substring(0, optionName.length - 1); - forceGet = true; + if (value) { + throw Error('Trailing characters: ' + params.argString); + } + optionName = optionName.substring(0, optionName.length - 1); + forceGet = true; + } + else if (optionName.charAt(optionName.length - 1) == '!') { + optionName = optionName.substring(0, optionName.length - 1); + forceToggle = true; } if (value === undefined && optionName.substring(0, 2) == 'no') { - optionName = optionName.substring(2); - value = false; + optionName = optionName.substring(2); + value = false; } - var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; - if (optionIsBoolean && value == undefined) { - value = true; + if (optionIsBoolean) { + if (forceToggle) { + value = !getOption(optionName, cm, setCfg); + } + else if (value == undefined) { + value = true; + } } if (!optionIsBoolean && value === undefined || forceGet) { - var oldValue = getOption(optionName, cm, setCfg); - if (oldValue instanceof Error) { - showConfirm(cm, oldValue.message); - } else if (oldValue === true || oldValue === false) { - showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); - } else { - showConfirm(cm, ' ' + optionName + '=' + oldValue); - } - } else { - var setOptionReturn = setOption(optionName, value, cm, setCfg); - if (setOptionReturn instanceof Error) { - showConfirm(cm, setOptionReturn.message); - } - } - }, - setlocal: function (cm, params) { - params.setCfg = {scope: 'local'}; + var oldValue = getOption(optionName, cm, setCfg); + if (oldValue instanceof Error) { + showConfirm(cm, oldValue.message); + } + else if (oldValue === true || oldValue === false) { + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + } + else { + showConfirm(cm, ' ' + optionName + '=' + oldValue); + } + } + else { + var setOptionReturn = setOption(optionName, value, cm, setCfg); + if (setOptionReturn instanceof Error) { + showConfirm(cm, setOptionReturn.message); + } + } + }, + setlocal: function (cm, params) { + params.setCfg = { scope: 'local' }; this.set(cm, params); - }, - setglobal: function (cm, params) { - params.setCfg = {scope: 'global'}; + }, + setglobal: function (cm, params) { + params.setCfg = { scope: 'global' }; this.set(cm, params); - }, - registers: function(cm, params) { + }, + registers: function (cm, params) { var regArgs = params.args; var registers = vimGlobalState.registerController.registers; var regInfo = '----------Registers----------\n\n'; if (!regArgs) { - for (var registerName in registers) { - var text = registers[registerName].toString(); - if (text.length) { - regInfo += '"' + registerName + ' ' + text + '\n' - } - } - } else { - var registerName; - regArgs = regArgs.join(''); - for (var i = 0; i < regArgs.length; i++) { - registerName = regArgs.charAt(i); - if (!vimGlobalState.registerController.isValidRegister(registerName)) { - continue; - } - var register = registers[registerName] || new Register(); - regInfo += '"' + registerName + ' ' + register.toString() + '\n' - } + for (var registerName in registers) { + var text = registers[registerName].toString(); + if (text.length) { + regInfo += '"' + registerName + ' ' + text + '\n'; + } + } + } + else { + var registerName; + regArgs = regArgs.join(''); + for (var i = 0; i < regArgs.length; i++) { + registerName = regArgs.charAt(i); + if (!vimGlobalState.registerController.isValidRegister(registerName)) { + continue; + } + var register = registers[registerName] || new Register(); + regInfo += '"' + registerName + ' ' + register.toString() + '\n'; + } } showConfirm(cm, regInfo); - }, - sort: function(cm, params) { + }, + sort: function (cm, params) { var reverse, ignoreCase, unique, number, pattern; function parseArgs() { - if (params.argString) { - var args = new CodeMirror.StringStream(params.argString); - if (args.eat('!')) { reverse = true; } - if (args.eol()) { return; } - if (!args.eatSpace()) { return 'Invalid arguments'; } - var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); - if (!opts && !args.eol()) { return 'Invalid arguments'; } - if (opts[1]) { - ignoreCase = opts[1].indexOf('i') != -1; - unique = opts[1].indexOf('u') != -1; - var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; - var hex = opts[1].indexOf('x') != -1 && 1; - var octal = opts[1].indexOf('o') != -1 && 1; - if (decimal + hex + octal > 1) { return 'Invalid arguments'; } - number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; - } - if (opts[2]) { - pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); - } - } + if (params.argString) { + var args = new CodeMirror.StringStream(params.argString); + if (args.eat('!')) { + reverse = true; + } + if (args.eol()) { + return; + } + if (!args.eatSpace()) { + return 'Invalid arguments'; + } + var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); + if (!opts && !args.eol()) { + return 'Invalid arguments'; + } + if (opts[1]) { + ignoreCase = opts[1].indexOf('i') != -1; + unique = opts[1].indexOf('u') != -1; + var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; + var hex = opts[1].indexOf('x') != -1 && 1; + var octal = opts[1].indexOf('o') != -1 && 1; + if (decimal + hex + octal > 1) { + return 'Invalid arguments'; + } + number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + } + if (opts[2]) { + pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); + } + } } var err = parseArgs(); if (err) { - showConfirm(cm, err + ': ' + params.argString); - return; + showConfirm(cm, err + ': ' + params.argString); + return; } var lineStart = params.line || cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); - if (lineStart == lineEnd) { return; } + if (lineStart == lineEnd) { + return; + } var curStart = new Pos(lineStart, 0); var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd)); var text = cm.getRange(curStart, curEnd).split('\n'); var numberRegex = pattern ? pattern : - (number == 'decimal') ? /(-?)([\d]+)/ : - (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : - (number == 'octal') ? /([0-7]+)/ : null; + (number == 'decimal') ? /(-?)([\d]+)/ : + (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : + (number == 'octal') ? /([0-7]+)/ : null; var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; var numPart = [], textPart = []; if (number || pattern) { - for (var i = 0; i < text.length; i++) { - var matchPart = pattern ? text[i].match(pattern) : null; - if (matchPart && matchPart[0] != '') { - numPart.push(matchPart); - } else if (!pattern && numberRegex.exec(text[i])) { - numPart.push(text[i]); - } else { - textPart.push(text[i]); - } - } - } else { - textPart = text; + for (var i = 0; i < text.length; i++) { + var matchPart = pattern ? text[i].match(pattern) : null; + if (matchPart && matchPart[0] != '') { + numPart.push(matchPart); + } + else if (!pattern && numberRegex.exec(text[i])) { + numPart.push(text[i]); + } + else { + textPart.push(text[i]); + } + } + } + else { + textPart = text; } function compareFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); } - var anum = number && numberRegex.exec(a); - var bnum = number && numberRegex.exec(b); - if (!anum) { return a < b ? -1 : 1; } - anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); - bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); - return anum - bnum; + if (reverse) { + var tmp; + tmp = a; + a = b; + b = tmp; + } + if (ignoreCase) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + var anum = number && numberRegex.exec(a); + var bnum = number && numberRegex.exec(b); + if (!anum) { + return a < b ? -1 : 1; + } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); + return anum - bnum; } function comparePatternFn(a, b) { - if (reverse) { var tmp; tmp = a; a = b; b = tmp; } - if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); } - return (a[0] < b[0]) ? -1 : 1; + if (reverse) { + var tmp; + tmp = a; + a = b; + b = tmp; + } + if (ignoreCase) { + a[0] = a[0].toLowerCase(); + b[0] = b[0].toLowerCase(); + } + return (a[0] < b[0]) ? -1 : 1; } numPart.sort(pattern ? comparePatternFn : compareFn); if (pattern) { - for (var i = 0; i < numPart.length; i++) { - numPart[i] = numPart[i].input; - } - } else if (!number) { textPart.sort(compareFn); } + for (var i = 0; i < numPart.length; i++) { + numPart[i] = numPart[i].input; + } + } + else if (!number) { + textPart.sort(compareFn); + } text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); if (unique) { // Remove duplicate lines - var textOld = text; - var lastLine; - text = []; - for (var i = 0; i < textOld.length; i++) { - if (textOld[i] != lastLine) { - text.push(textOld[i]); + var textOld = text; + var lastLine; + text = []; + for (var i = 0; i < textOld.length; i++) { + if (textOld[i] != lastLine) { + text.push(textOld[i]); + } + lastLine = textOld[i]; + } + } + cm.replaceRange(text.join('\n'), curStart, curEnd); + }, + vglobal: function (cm, params) { + this.global(cm, params); + }, + normal: function (cm, params) { + var argString = params.argString; + if (argString && argString[0] == '!') { + argString = argString.slice(1); + noremap = true; + } + argString = argString.trimStart(); + if (!argString) { + showConfirm(cm, 'Argument is required.'); + return; + } + var line = params.line; + if (typeof line == 'number') { + var lineEnd = isNaN(params.lineEnd) ? line : params.lineEnd; + for (var i = line; i <= lineEnd; i++) { + cm.setCursor(i, 0); + doKeyToKey(cm, params.argString.trimStart()); + if (cm.state.vim.insertMode) { + exitInsertMode(cm, true); + } } - lastLine = textOld[i]; - } } - cm.replaceRange(text.join('\n'), curStart, curEnd); - }, - vglobal: function(cm, params) { - this.global(cm, params); - }, - global: function(cm, params) { + else { + doKeyToKey(cm, params.argString.trimStart()); + if (cm.state.vim.insertMode) { + exitInsertMode(cm, true); + } + } + }, + global: function (cm, params) { var argString = params.argString; if (!argString) { - showConfirm(cm, 'Regular Expression missing from global'); - return; + showConfirm(cm, 'Regular Expression missing from global'); + return; } var inverted = params.commandName[0] === 'v'; + if (argString[0] === '!' && params.commandName[0] === 'g') { + inverted = true; + argString = argString.slice(1); + } var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); var tokens = splitBySlash(argString); var regexPart = argString, cmd; if (tokens.length) { - regexPart = tokens[0]; - cmd = tokens.slice(1, tokens.length).join('/'); + regexPart = tokens[0]; + cmd = tokens.slice(1, tokens.length).join('/'); } if (regexPart) { - try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; - } + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } } var query = getSearchState(cm).getQuery(); var matchedLines = []; for (var i = lineStart; i <= lineEnd; i++) { - var line = cm.getLineHandle(i); - var matched = query.test(line.text); - if (matched !== inverted) { - matchedLines.push(cmd ? line : line.text); - } + var line = cm.getLine(i); + var matched = query.test(line); + if (matched !== inverted) { + matchedLines.push(cmd ? cm.getLineHandle(i) : line); + } } if (!cmd) { - showConfirm(cm, matchedLines.join('\n')); - return; + showConfirm(cm, matchedLines.join('\n')); + return; } var index = 0; - var nextCommand = function() { - if (index < matchedLines.length) { - var line = matchedLines[index++]; - var lineNum = cm.getLineNumber(line); - if (lineNum == null) { - nextCommand(); - return; - } - var command = (lineNum + 1) + cmd; - exCommandDispatcher.processCommand(cm, command, { - callback: nextCommand - }); - } + var nextCommand = function () { + if (index < matchedLines.length) { + var lineHandle = matchedLines[index++]; + var lineNum = cm.getLineNumber(lineHandle); + if (lineNum == null) { + nextCommand(); + return; + } + var command = (lineNum + 1) + cmd; + exCommandDispatcher.processCommand(cm, command, { + callback: nextCommand + }); + } + else if (cm.releaseLineHandles) { + cm.releaseLineHandles(); + } }; nextCommand(); - }, - substitute: function(cm, params) { + }, + substitute: function (cm, params) { if (!cm.getSearchCursor) { - throw new Error('Search feature not available. Requires searchcursor.js or ' + - 'any other getSearchCursor implementation.'); + throw new Error('Search feature not available. Requires searchcursor.js or ' + + 'any other getSearchCursor implementation.'); } var argString = params.argString; var tokens = argString ? splitBySeparator(argString, argString[0]) : []; @@ -5423,157 +6173,173 @@ dom.importCssString(".normal-mode .ace_cursor{\ var confirm = false; // Whether to confirm each replace. var global = false; // True to replace all instances on a line, false to replace only 1. if (tokens.length) { - regexPart = tokens[0]; - if (getOption('pcre') && regexPart !== '') { - regexPart = new RegExp(regexPart).source; //normalize not escaped characters - } - replacePart = tokens[1]; - if (replacePart !== undefined) { - if (getOption('pcre')) { - replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g,"$1$$&")); - } else { - replacePart = translateRegexReplace(replacePart); - } - vimGlobalState.lastSubstituteReplacePart = replacePart; - } - trailing = tokens[2] ? tokens[2].split(' ') : []; - } else { - if (argString && argString.length) { - showConfirm(cm, 'Substitutions should be of the form ' + - ':s/pattern/replace/'); - return; - } - } - if (trailing) { - flagsPart = trailing[0]; - count = parseInt(trailing[1]); - if (flagsPart) { - if (flagsPart.indexOf('c') != -1) { - confirm = true; + regexPart = tokens[0]; + if (getOption('pcre') && regexPart !== '') { + regexPart = new RegExp(regexPart).source; //normalize not escaped characters + } + replacePart = tokens[1]; + if (replacePart !== undefined) { + if (getOption('pcre')) { + replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g, "$1$$&")); + } + else { + replacePart = translateRegexReplace(replacePart); + } + vimGlobalState.lastSubstituteReplacePart = replacePart; } - if (flagsPart.indexOf('g') != -1) { - global = true; + trailing = tokens[2] ? tokens[2].split(' ') : []; + } + else { + if (argString && argString.length) { + showConfirm(cm, 'Substitutions should be of the form ' + + ':s/pattern/replace/'); + return; } - if (getOption('pcre')) { - regexPart = regexPart + '/' + flagsPart; - } else { - regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } + if (trailing) { + flagsPart = trailing[0]; + count = parseInt(trailing[1]); + if (flagsPart) { + if (flagsPart.indexOf('c') != -1) { + confirm = true; + } + if (flagsPart.indexOf('g') != -1) { + global = true; + } + if (getOption('pcre')) { + regexPart = regexPart + '/' + flagsPart; + } + else { + regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } } - } } if (regexPart) { - try { - updateSearchQuery(cm, regexPart, true /** ignoreCase */, - true /** smartCase */); - } catch (e) { - showConfirm(cm, 'Invalid regex: ' + regexPart); - return; - } + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */, true /** smartCase */); + } + catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } } replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; if (replacePart === undefined) { - showConfirm(cm, 'No previous substitute regular expression'); - return; + showConfirm(cm, 'No previous substitute regular expression'); + return; } var state = getSearchState(cm); var query = state.getQuery(); var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; var lineEnd = params.lineEnd || lineStart; if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { - lineEnd = Infinity; + lineEnd = Infinity; } if (count) { - lineStart = lineEnd; - lineEnd = lineStart + count - 1; + lineStart = lineEnd; + lineEnd = lineStart + count - 1; } var startPos = clipCursorToContent(cm, new Pos(lineStart, 0)); var cursor = cm.getSearchCursor(query, startPos); doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); - }, - redo: CodeMirror.commands.redo, - undo: CodeMirror.commands.undo, - write: function(cm) { + }, + startinsert: function (cm, params) { + doKeyToKey(cm, params.argString == '!' ? 'A' : 'i', {}); + }, + redo: CodeMirror.commands.redo, + undo: CodeMirror.commands.undo, + write: function (cm) { if (CodeMirror.commands.save) { - CodeMirror.commands.save(cm); - } else if (cm.save) { - cm.save(); + CodeMirror.commands.save(cm); + } + else if (cm.save) { + cm.save(); } - }, - nohlsearch: function(cm) { + }, + nohlsearch: function (cm) { clearSearchHighlight(cm); - }, - yank: function (cm) { + }, + yank: function (cm) { var cur = copyCursor(cm.getCursor()); var line = cur.line; var lineText = cm.getLine(line); - vimGlobalState.registerController.pushText( - '0', 'yank', lineText, true, true); - }, - delmarks: function(cm, params) { + vimGlobalState.registerController.pushText('0', 'yank', lineText, true, true); + }, + delete: function (cm, params) { + var line = params.selectionLine; + var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd; + operators.delete(cm, { linewise: true }, [ + { anchor: new Pos(line, 0), + head: new Pos(lineEnd + 1, 0) } + ]); + }, + join: function (cm, params) { + var line = params.selectionLine; + var lineEnd = isNaN(params.selectionLineEnd) ? line : params.selectionLineEnd; + cm.setCursor(new Pos(line, 0)); + actions.joinLines(cm, { repeat: lineEnd - line }, cm.state.vim); + }, + delmarks: function (cm, params) { if (!params.argString || !trim(params.argString)) { - showConfirm(cm, 'Argument required'); - return; + showConfirm(cm, 'Argument required'); + return; } - var state = cm.state.vim; var stream = new CodeMirror.StringStream(trim(params.argString)); while (!stream.eol()) { - stream.eatSpace(); - var count = stream.pos; - - if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; - } - - var sym = stream.next(); - if (stream.match('-', true)) { + stream.eatSpace(); + var count = stream.pos; if (!stream.match(/[a-zA-Z]/, false)) { - showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); - return; - } - - var startMark = sym; - var finishMark = stream.next(); - if (isLowerCase(startMark) && isLowerCase(finishMark) || - isUpperCase(startMark) && isUpperCase(finishMark)) { - var start = startMark.charCodeAt(0); - var finish = finishMark.charCodeAt(0); - if (start >= finish) { showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); return; - } - for (var j = 0; j <= finish - start; j++) { - var mark = String.fromCharCode(start + j); - delete state.marks[mark]; - } - } else { - showConfirm(cm, 'Invalid argument: ' + startMark + '-'); - return; - } - } else { - delete state.marks[sym]; - } - } - } - }; - - var exCommandDispatcher = new ExCommandDispatcher(); - function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, - replaceWith, callback) { - cm.state.vim.exMode = true; - var done = false; - var lastPos, modifiedLineNumber, joined; - function replaceAll() { - cm.operation(function() { - while (!done) { - replace(); - next(); - } - stop(); + } + var sym = stream.next(); + if (stream.match('-', true)) { + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + var startMark = sym; + var finishMark = stream.next(); + if (isLowerCase(startMark) && isLowerCase(finishMark) || + isUpperCase(startMark) && isUpperCase(finishMark)) { + var start = startMark.charCodeAt(0); + var finish = finishMark.charCodeAt(0); + if (start >= finish) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + for (var j = 0; j <= finish - start; j++) { + var mark = String.fromCharCode(start + j); + delete state.marks[mark]; + } + } + else { + showConfirm(cm, 'Invalid argument: ' + startMark + '-'); + return; + } + } + else { + delete state.marks[sym]; + } + } + } +}; +var exCommandDispatcher = new ExCommandDispatcher(); +function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, replaceWith, callback) { + cm.state.vim.exMode = true; + var done = false; + var lastPos, modifiedLineNumber, joined; + function replaceAll() { + cm.operation(function () { + while (!done) { + replace(); + next(); + } + stop(); }); - } - function replace() { + } + function replace() { var text = cm.getRange(searchCursor.from(), searchCursor.to()); var newText = text.replace(query, replaceWith); var unmodifiedLineNumber = searchCursor.to().line; @@ -5581,698 +6347,750 @@ dom.importCssString(".normal-mode .ace_cursor{\ modifiedLineNumber = searchCursor.to().line; lineEnd += modifiedLineNumber - unmodifiedLineNumber; joined = modifiedLineNumber < unmodifiedLineNumber; - } - function findNextValidMatch() { + } + function findNextValidMatch() { var lastMatchTo = lastPos && copyCursor(searchCursor.to()); var match = searchCursor.findNext(); if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) { - match = searchCursor.findNext(); + match = searchCursor.findNext(); } return match; - } - function next() { - while(findNextValidMatch() && - isInRange(searchCursor.from(), lineStart, lineEnd)) { - if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { - continue; - } - cm.scrollIntoView(searchCursor.from(), 30); - cm.setSelection(searchCursor.from(), searchCursor.to()); - lastPos = searchCursor.from(); - done = false; - return; + } + function next() { + while (findNextValidMatch() && + isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { + continue; + } + cm.scrollIntoView(searchCursor.from(), 30); + cm.setSelection(searchCursor.from(), searchCursor.to()); + lastPos = searchCursor.from(); + done = false; + return; } done = true; - } - function stop(close) { - if (close) { close(); } + } + function stop(close) { + if (close) { + close(); + } cm.focus(); if (lastPos) { - cm.setCursor(lastPos); - var vim = cm.state.vim; - vim.exMode = false; - vim.lastHPos = vim.lastHSPos = lastPos.ch; - } - if (callback) { callback(); } - } - function onPromptKeyDown(e, _value, close) { + cm.setCursor(lastPos); + var vim = cm.state.vim; + vim.exMode = false; + vim.lastHPos = vim.lastHSPos = lastPos.ch; + } + if (callback) { + callback(); + } + } + function onPromptKeyDown(e, _value, close) { CodeMirror.e_stop(e); - var keyName = CodeMirror.keyName(e); + var keyName = vimKeyFromEvent(e); switch (keyName) { - case 'Y': - replace(); next(); break; - case 'N': - next(); break; - case 'A': - var savedCallback = callback; - callback = undefined; - cm.operation(replaceAll); - callback = savedCallback; - break; - case 'L': - replace(); - case 'Q': - case 'Esc': - case 'Ctrl-C': - case 'Ctrl-[': + case 'y': + replace(); + next(); + break; + case 'n': + next(); + break; + case 'a': + var savedCallback = callback; + callback = undefined; + cm.operation(replaceAll); + callback = savedCallback; + break; + case 'l': + replace(); + case 'q': + case '': + case '': + case '': + stop(close); + break; + } + if (done) { stop(close); - break; } - if (done) { stop(close); } return true; - } - next(); - if (done) { + } + next(); + if (done) { showConfirm(cm, 'No matches for ' + query.source); return; - } - if (!confirm) { + } + if (!confirm) { replaceAll(); - if (callback) { callback(); } + if (callback) { + callback(); + } return; - } - showPrompt(cm, { - prefix: hdom('span', 'replace with ', hdom('strong', replaceWith), ' (y/n/a/q/l)'), - onKeyDown: onPromptKeyDown - }); } - - CodeMirror.keyMap.vim = { - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - function exitInsertMode(cm) { - var vim = cm.state.vim; - var macroModeState = vimGlobalState.macroModeState; - var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); - var isPlaying = macroModeState.isPlaying; - var lastChange = macroModeState.lastInsertModeChanges; - if (!isPlaying) { + showPrompt(cm, { + prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'), + onKeyDown: onPromptKeyDown + }); +} +function exitInsertMode(cm, keepCursor) { + var vim = cm.state.vim; + var macroModeState = vimGlobalState.macroModeState; + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); + var isPlaying = macroModeState.isPlaying; + var lastChange = macroModeState.lastInsertModeChanges; + if (!isPlaying) { cm.off('change', onChange); + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = null; CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); - } - if (!isPlaying && vim.insertModeRepeat > 1) { - repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, - true /** repeatForInsert */); + } + if (!isPlaying && vim.insertModeRepeat > 1) { + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, true /** repeatForInsert */); vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; - } - delete vim.insertModeRepeat; - vim.insertMode = false; - cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1); - cm.setOption('keyMap', 'vim'); - cm.setOption('disableInput', true); - cm.toggleOverwrite(false); // exit replace mode if we were in it. - insertModeChangeRegister.setText(lastChange.changes.join('')); - CodeMirror.signal(cm, "vim-mode-change", {mode: "normal"}); - if (macroModeState.isRecording) { - logInsertModeChange(macroModeState); - } } - - function _mapCommand(command) { - defaultKeymap.unshift(command); + delete vim.insertModeRepeat; + vim.insertMode = false; + if (!keepCursor) { + cm.setCursor(cm.getCursor().line, cm.getCursor().ch - 1); + } + cm.setOption('keyMap', 'vim'); + cm.setOption('disableInput', true); + cm.toggleOverwrite(false); // exit replace mode if we were in it. + insertModeChangeRegister.setText(lastChange.changes.join('')); + CodeMirror.signal(cm, "vim-mode-change", { mode: "normal" }); + if (macroModeState.isRecording) { + logInsertModeChange(macroModeState); } - - function mapCommand(keys, type, name, args, extra) { - var command = {keys: keys, type: type}; - command[type] = name; - command[type + "Args"] = args; - for (var key in extra) +} +function _mapCommand(command) { + defaultKeymap.unshift(command); +} +function mapCommand(keys, type, name, args, extra) { + var command = { keys: keys, type: type }; + command[type] = name; + command[type + "Args"] = args; + for (var key in extra) command[key] = extra[key]; - _mapCommand(command); - } - defineOption('insertModeEscKeysTimeout', 200, 'number'); - - CodeMirror.keyMap['vim-insert'] = { - fallthrough: ['default'], - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - CodeMirror.keyMap['vim-replace'] = { - 'Backspace': 'goCharLeft', - fallthrough: ['vim-insert'], - attach: attachVimMap, - detach: detachVimMap, - call: cmKey - }; - - function executeMacroRegister(cm, vim, macroModeState, registerName) { - var register = vimGlobalState.registerController.getRegister(registerName); - if (registerName == ':') { + _mapCommand(command); +} +defineOption('insertModeEscKeysTimeout', 200, 'number'); +function executeMacroRegister(cm, vim, macroModeState, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); + if (registerName == ':') { if (register.keyBuffer[0]) { - exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); } macroModeState.isPlaying = false; return; - } - var keyBuffer = register.keyBuffer; - var imc = 0; - macroModeState.isPlaying = true; - macroModeState.replaySearchQueries = register.searchQueries.slice(0); - for (var i = 0; i < keyBuffer.length; i++) { + } + var keyBuffer = register.keyBuffer; + var imc = 0; + macroModeState.isPlaying = true; + macroModeState.replaySearchQueries = register.searchQueries.slice(0); + for (var i = 0; i < keyBuffer.length; i++) { var text = keyBuffer[i]; var match, key; while (text) { - match = (/<\w+-.+?>|<\w+>|./).exec(text); - key = match[0]; - text = text.substring(match.index + key.length); - vimApi.handleKey(cm, key, 'macro'); - if (vim.insertMode) { - var changes = register.insertModeChanges[imc++].changes; - vimGlobalState.macroModeState.lastInsertModeChanges.changes = - changes; - repeatInsertModeChanges(cm, changes, 1); - exitInsertMode(cm); - } - } - } - macroModeState.isPlaying = false; + match = (/<\w+-.+?>|<\w+>|./).exec(text); + key = match[0]; + text = text.substring(match.index + key.length); + vimApi.handleKey(cm, key, 'macro'); + if (vim.insertMode) { + var changes = register.insertModeChanges[imc++].changes; + vimGlobalState.macroModeState.lastInsertModeChanges.changes = + changes; + repeatInsertModeChanges(cm, changes, 1); + exitInsertMode(cm); + } + } } - - function logKey(macroModeState, key) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register) { + macroModeState.isPlaying = false; +} +function logKey(macroModeState, key) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register) { register.pushText(key); - } } - - function logInsertModeChange(macroModeState) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register && register.pushInsertModeChanges) { +} +function logInsertModeChange(macroModeState) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushInsertModeChanges) { register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); - } } - - function logSearchQuery(macroModeState, query) { - if (macroModeState.isPlaying) { return; } - var registerName = macroModeState.latestRegister; - var register = vimGlobalState.registerController.getRegister(registerName); - if (register && register.pushSearchQuery) { +} +function logSearchQuery(macroModeState, query) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushSearchQuery) { register.pushSearchQuery(query); - } - } - function onChange(cm, changeObj) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; - if (!macroModeState.isPlaying) { - while(changeObj) { - lastChange.expectCursorActivityForChange = true; - if (lastChange.ignoreCount > 1) { - lastChange.ignoreCount--; - } else if (changeObj.origin == '+input' || changeObj.origin == 'paste' - || changeObj.origin === undefined /* only in testing */) { - var selectionCount = cm.listSelections().length; - if (selectionCount > 1) - lastChange.ignoreCount = selectionCount; - var text = changeObj.text.join('\n'); - if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; - } - if (text) { - if (cm.state.overwrite && !/\n/.test(text)) { - lastChange.changes.push([text]); - } else { - lastChange.changes.push(text); - } - } - } - changeObj = changeObj.next; - } - } - } - function onCursorActivity(cm) { - var vim = cm.state.vim; - if (vim.insertMode) { + } +} +function onChange(cm, changeObj) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + if (!macroModeState.isPlaying) { + var vim = cm.state.vim; + while (changeObj) { + lastChange.expectCursorActivityForChange = true; + if (lastChange.ignoreCount > 1) { + lastChange.ignoreCount--; + } + else if (changeObj.origin == '+input' || changeObj.origin == 'paste' + || changeObj.origin === undefined /* only in testing */) { + var selectionCount = cm.listSelections().length; + if (selectionCount > 1) + lastChange.ignoreCount = selectionCount; + var text = changeObj.text.join('\n'); + if (lastChange.maybeReset) { + lastChange.changes = []; + lastChange.maybeReset = false; + } + if (text) { + if (cm.state.overwrite && !/\n/.test(text)) { + lastChange.changes.push([text]); + } + else { + if (text.length > 1) { + var insertEnd = vim && vim.insertEnd && vim.insertEnd.find(); + var cursor = cm.getCursor(); + if (insertEnd && insertEnd.line == cursor.line) { + var offset = insertEnd.ch - cursor.ch; + if (offset > 0 && offset < text.length) { + lastChange.changes.push([text, offset]); + text = ''; + } + } + } + if (text) + lastChange.changes.push(text); + } + } + } + changeObj = changeObj.next; + } + } +} +function onCursorActivity(cm) { + var vim = cm.state.vim; + if (vim.insertMode) { var macroModeState = vimGlobalState.macroModeState; - if (macroModeState.isPlaying) { return; } + if (macroModeState.isPlaying) { + return; + } var lastChange = macroModeState.lastInsertModeChanges; if (lastChange.expectCursorActivityForChange) { - lastChange.expectCursorActivityForChange = false; - } else { - lastChange.maybeReset = true; + lastChange.expectCursorActivityForChange = false; + } + else { + lastChange.maybeReset = true; + if (vim.insertEnd) + vim.insertEnd.clear(); + vim.insertEnd = cm.setBookmark(cm.getCursor(), { insertLeft: true }); } - } else if (!cm.curOp.isVimOp) { + } + else if (!cm.curOp.isVimOp) { handleExternalSelection(cm, vim); - } } - function handleExternalSelection(cm, vim, keepHPos) { - var anchor = cm.getCursor('anchor'); - var head = cm.getCursor('head'); - if (vim.visualMode && !cm.somethingSelected()) { +} +function handleExternalSelection(cm, vim, keepHPos) { + var anchor = cm.getCursor('anchor'); + var head = cm.getCursor('head'); + if (vim.visualMode && !cm.somethingSelected()) { exitVisualMode(cm, false); - } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { + } + else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { vim.visualMode = true; vim.visualLine = false; - CodeMirror.signal(cm, "vim-mode-change", {mode: "visual"}); - } - if (vim.visualMode) { + CodeMirror.signal(cm, "vim-mode-change", { mode: "visual" }); + } + if (vim.visualMode) { var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; head = offsetCursor(head, 0, headOffset); anchor = offsetCursor(anchor, 0, anchorOffset); vim.sel = { - anchor: anchor, - head: head + anchor: anchor, + head: head }; updateMark(cm, vim, '<', cursorMin(head, anchor)); updateMark(cm, vim, '>', cursorMax(head, anchor)); - } else if (!vim.insertMode && !keepHPos) { + } + else if (!vim.insertMode && !keepHPos) { vim.lastHPos = cm.getCursor().ch; - } } - function InsertModeKey(keyName) { - this.keyName = keyName; +} +function InsertModeKey(keyName, e) { + this.keyName = keyName; + this.key = e.key; + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + this.metaKey = e.metaKey; + this.shiftKey = e.shiftKey; +} +function onKeyEventTargetKeyDown(e) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + var keyName = CodeMirror.keyName ? CodeMirror.keyName(e) : e.key; + if (!keyName) { + return; } - function onKeyEventTargetKeyDown(e) { - var macroModeState = vimGlobalState.macroModeState; - var lastChange = macroModeState.lastInsertModeChanges; - var keyName = CodeMirror.keyName(e); - if (!keyName) { return; } - function onKeyFound() { + if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { if (lastChange.maybeReset) { - lastChange.changes = []; - lastChange.maybeReset = false; + lastChange.changes = []; + lastChange.maybeReset = false; } - lastChange.changes.push(new InsertModeKey(keyName)); - return true; - } - if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { - CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); - } - } - function repeatLastEdit(cm, vim, repeat, repeatForInsert) { - var macroModeState = vimGlobalState.macroModeState; - macroModeState.isPlaying = true; - var isAction = !!vim.lastEditActionCommand; - var cachedInputState = vim.inputState; - function repeatCommand() { + lastChange.changes.push(new InsertModeKey(keyName, e)); + } +} +function repeatLastEdit(cm, vim, repeat, repeatForInsert) { + var macroModeState = vimGlobalState.macroModeState; + macroModeState.isPlaying = true; + var isAction = !!vim.lastEditActionCommand; + var cachedInputState = vim.inputState; + function repeatCommand() { if (isAction) { - commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); - } else { - commandDispatcher.evalInput(cm, vim); + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + } + else { + commandDispatcher.evalInput(cm, vim); } - } - function repeatInsert(repeat) { + } + function repeatInsert(repeat) { if (macroModeState.lastInsertModeChanges.changes.length > 0) { - repeat = !vim.lastEditActionCommand ? 1 : repeat; - var changeObject = macroModeState.lastInsertModeChanges; - repeatInsertModeChanges(cm, changeObject.changes, repeat); + repeat = !vim.lastEditActionCommand ? 1 : repeat; + var changeObject = macroModeState.lastInsertModeChanges; + repeatInsertModeChanges(cm, changeObject.changes, repeat); } - } - vim.inputState = vim.lastEditInputState; - if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { + } + vim.inputState = vim.lastEditInputState; + if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { for (var i = 0; i < repeat; i++) { - repeatCommand(); - repeatInsert(1); + repeatCommand(); + repeatInsert(1); } - } else { + } + else { if (!repeatForInsert) { - repeatCommand(); + repeatCommand(); } repeatInsert(repeat); - } - vim.inputState = cachedInputState; - if (vim.insertMode && !repeatForInsert) { + } + vim.inputState = cachedInputState; + if (vim.insertMode && !repeatForInsert) { exitInsertMode(cm); - } - macroModeState.isPlaying = false; } - - function repeatInsertModeChanges(cm, changes, repeat) { - function keyHandler(binding) { + macroModeState.isPlaying = false; +} +function sendCmKey(cm, key) { + CodeMirror.lookupKey(key, 'vim-insert', function keyHandler(binding) { if (typeof binding == 'string') { - CodeMirror.commands[binding](cm); - } else { - binding(cm); + CodeMirror.commands[binding](cm); + } + else { + binding(cm); } return true; - } - var head = cm.getCursor('head'); - var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; - if (visualBlock) { + }); +} +function repeatInsertModeChanges(cm, changes, repeat) { + var head = cm.getCursor('head'); + var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; + if (visualBlock) { selectForInsert(cm, head, visualBlock + 1); repeat = cm.listSelections().length; cm.setCursor(head); - } - for (var i = 0; i < repeat; i++) { + } + for (var i = 0; i < repeat; i++) { if (visualBlock) { - cm.setCursor(offsetCursor(head, i, 0)); + cm.setCursor(offsetCursor(head, i, 0)); } for (var j = 0; j < changes.length; j++) { - var change = changes[j]; - if (change instanceof InsertModeKey) { - CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); - } else if (typeof change == "string") { - cm.replaceSelection(change); - } else { - var start = cm.getCursor(); - var end = offsetCursor(start, 0, change[0].length); - cm.replaceRange(change[0], start, end); - cm.setCursor(end); - } - } - } - if (visualBlock) { + var change = changes[j]; + if (change instanceof InsertModeKey) { + sendCmKey(cm, change.keyName, change); + } + else if (typeof change == "string") { + cm.replaceSelection(change); + } + else { + var start = cm.getCursor(); + var end = offsetCursor(start, 0, change[0].length - (change[1] || 0)); + cm.replaceRange(change[0], start, change[1] ? start : end); + cm.setCursor(end); + } + } + } + if (visualBlock) { cm.setCursor(offsetCursor(head, 0, 1)); - } } - - resetVimGlobalState(); - CodeMirror.Vim = Vim(); - - Vim = CodeMirror.Vim; - - var specialKey = {'return':'CR',backspace:'BS','delete':'Del',esc:'Esc', - left:'Left',right:'Right',up:'Up',down:'Down',space: 'Space',insert: 'Ins', - home:'Home',end:'End',pageup:'PageUp',pagedown:'PageDown', enter: 'CR' - }; - function lookupKey(hashId, key, e) { +} +CodeMirror.Vim = vimApi; +var specialKeyAce = { 'return': 'CR', backspace: 'BS', 'delete': 'Del', esc: 'Esc', + left: 'Left', right: 'Right', up: 'Up', down: 'Down', space: 'Space', insert: 'Ins', + home: 'Home', end: 'End', pageup: 'PageUp', pagedown: 'PageDown', enter: 'CR' +}; +function lookupKey(hashId, key, e, vim) { if (key.length > 1 && key[0] == "n") { - key = key.replace("numpad", ""); + key = key.replace("numpad", ""); } - key = specialKey[key] || key; + key = specialKeyAce[key] || key; var name = ''; - if (e.ctrlKey) { name += 'C-'; } - if (e.altKey) { name += 'A-'; } - if ((name || key.length > 1) && e.shiftKey) { name += 'S-'; } - + if (e.ctrlKey) { + name += 'C-'; + } + if (e.altKey) { + name += 'A-'; + } + if ((name || key.length > 1) && e.shiftKey) { + name += 'S-'; + } + if (vim && !vim.expectLiteralNext && key.length == 1) { + if (langmap.keymap && key in langmap.keymap) { + if (langmap.remapCtrl !== false || !name) + key = langmap.keymap[key]; + } + else if (key.charCodeAt(0) > 255) { + var code = e.code && e.code.slice(-1) || ""; + if (!e.shiftKey) + code = code.toLowerCase(); + if (code) + key = code; + } + } name += key; - if (name.length > 1) { name = '<' + name + '>'; } + if (name.length > 1) { + name = '<' + name + '>'; + } return name; - } - var handleKey = Vim.handleKey.bind(Vim); - Vim.handleKey = function(cm, key, origin) { - return cm.operation(function() { - return handleKey(cm, key, origin); +} +var handleKey = vimApi.handleKey.bind(vimApi); +vimApi.handleKey = function (cm, key, origin) { + return cm.operation(function () { + return handleKey(cm, key, origin); }, true); - } - function cloneVimState(state) { +}; +function cloneVimState(state) { var n = new state.constructor(); - Object.keys(state).forEach(function(key) { - var o = state[key]; - if (Array.isArray(o)) - o = o.slice(); - else if (o && typeof o == "object" && o.constructor != Object) - o = cloneVimState(o); - n[key] = o; + Object.keys(state).forEach(function (key) { + if (key == "insertEnd") + return; + var o = state[key]; + if (Array.isArray(o)) + o = o.slice(); + else if (o && typeof o == "object" && o.constructor != Object) + o = cloneVimState(o); + n[key] = o; }); if (state.sel) { - n.sel = { - head: state.sel.head && copyCursor(state.sel.head), - anchor: state.sel.anchor && copyCursor(state.sel.anchor) - }; + n.sel = { + head: state.sel.head && copyCursor(state.sel.head), + anchor: state.sel.anchor && copyCursor(state.sel.anchor) + }; } return n; - } - function multiSelectHandleKey(cm, key, origin) { +} +function multiSelectHandleKey(cm, key, origin) { var isHandled = false; - var vim = Vim.maybeInitVimState_(cm); + var vim = vimApi.maybeInitVimState_(cm); var visualBlock = vim.visualBlock || vim.wasInVisualBlock; - var wasMultiselect = cm.ace.inMultiSelectMode; if (vim.wasInVisualBlock && !wasMultiselect) { - vim.wasInVisualBlock = false; - } else if (wasMultiselect && vim.visualBlock) { - vim.wasInVisualBlock = true; + vim.wasInVisualBlock = false; + } + else if (wasMultiselect && vim.visualBlock) { + vim.wasInVisualBlock = true; } - if (key == '' && !vim.insertMode && !vim.visualMode && wasMultiselect) { - cm.ace.exitMultiSelectMode(); - } else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) { - isHandled = Vim.handleKey(cm, key, origin); - } else { - var old = cloneVimState(vim); - cm.operation(function() { - cm.ace.forEachSelection(function() { - var sel = cm.ace.selection; - cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; - var head = cm.getCursor("head"); - var anchor = cm.getCursor("anchor"); - var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; - var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; - head = offsetCursor(head, 0, headOffset); - anchor = offsetCursor(anchor, 0, anchorOffset); - cm.state.vim.sel.head = head; - cm.state.vim.sel.anchor = anchor; - - isHandled = handleKey(cm, key, origin); - sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; - if (cm.virtualSelectionMode()) { - cm.state.vim = cloneVimState(old); - } - }); - if (cm.curOp.cursorActivity && !isHandled) - cm.curOp.cursorActivity = false; - }, true); + cm.ace.exitMultiSelectMode(); + } + else if (visualBlock || !wasMultiselect || cm.ace.inVirtualSelectionMode) { + isHandled = vimApi.handleKey(cm, key, origin); + } + else { + var old = cloneVimState(vim); + var changeQueueList = vim.inputState.changeQueueList || []; + cm.operation(function () { + cm.curOp.isVimOp = true; + var index = 0; + cm.ace.forEachSelection(function () { + var sel = cm.ace.selection; + cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn; + cm.state.vim.inputState.changeQueue = changeQueueList[index]; + var head = cm.getCursor("head"); + var anchor = cm.getCursor("anchor"); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + cm.state.vim.sel.head = head; + cm.state.vim.sel.anchor = anchor; + isHandled = handleKey(cm, key, origin); + sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos; + if (cm.ace.inVirtualSelectionMode) { + changeQueueList[index] = cm.state.vim.inputState.changeQueue; + } + if (cm.virtualSelectionMode()) { + cm.state.vim = cloneVimState(old); + } + index++; + }); + if (cm.curOp.cursorActivity && !isHandled) + cm.curOp.cursorActivity = false; + vim.status = cm.state.vim.status; + cm.state.vim = vim; + vim.inputState.changeQueueList = changeQueueList; + vim.inputState.changeQueue = null; + }, true); } if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) { - handleExternalSelection(cm, vim, true); + handleExternalSelection(cm, vim, true); } return isHandled; - } - exports.CodeMirror = CodeMirror; - var getVim = Vim.maybeInitVimState_; - exports.handler = { +} +resetVimGlobalState(); +exports.CodeMirror = CodeMirror; +var getVim = vimApi.maybeInitVimState_; +exports.handler = { $id: "ace/keyboard/vim", - drawCursor: function(element, pixelPos, config, sel, session) { - var vim = this.state.vim || {}; - var w = config.characterWidth; - var h = config.lineHeight; - var top = pixelPos.top; - var left = pixelPos.left; - if (!vim.insertMode) { - var isbackwards = !sel.cursor - ? session.selection.isBackwards() || session.selection.isEmpty() - : Range.comparePoints(sel.cursor, sel.start) <= 0; - if (!isbackwards && left > w) - left -= w; - } - if (!vim.insertMode && vim.status) { - h = h / 2; - top += h; - } - dom.translate(element, left, top); - dom.setStyle(element.style, "width", w + "px"); - dom.setStyle(element.style, "height", h + "px"); - }, - handleKeyboard: function(data, hashId, key, keyCode, e) { - var editor = data.editor; - var cm = editor.state.cm; - var vim = getVim(cm); - if (keyCode == -1) return; - if (!vim.insertMode) { - if (hashId == -1) { - if (key.charCodeAt(0) > 0xFF) { - if (data.inputKey) { - key = data.inputKey; - if (key && data.inputHash == 4) - key = key.toUpperCase(); - } - } - data.inputChar = key; - } - else if (hashId == 4 || hashId == 0) { - if (data.inputKey == key && data.inputHash == hashId && data.inputChar) { - key = data.inputChar; - hashId = -1 - } - else { - data.inputChar = null; - data.inputKey = key; - data.inputHash = hashId; - } + drawCursor: function (element, pixelPos, config, sel, session) { + var vim = this.state.vim || {}; + var w = config.characterWidth; + var h = config.lineHeight; + var top = pixelPos.top; + var left = pixelPos.left; + if (!vim.insertMode) { + var isbackwards = !sel.cursor + ? session.selection.isBackwards() || session.selection.isEmpty() + : Range.comparePoints(sel.cursor, sel.start) <= 0; + if (!isbackwards && left > w) + left -= w; + } + if (!vim.insertMode && vim.status) { + h = h / 2; + top += h; + } + domLib.translate(element, left, top); + domLib.setStyle(element.style, "width", w + "px"); + domLib.setStyle(element.style, "height", h + "px"); + }, + $getDirectionForHighlight: function (editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (!vim.insertMode) { + return editor.session.selection.isBackwards() || editor.session.selection.isEmpty(); } - else { - data.inputChar = data.inputKey = null; - } - } - - if (cm.state.overwrite && vim.insertMode && key == "backspace" && hashId == 0) { - return {command: "gotoleft"} - } - if (key == "c" && hashId == 1) { // key == "ctrl-c" - if (!useragent.isMac && editor.getCopyText()) { - editor.once("copy", function() { - if (vim.insertMode) editor.selection.clearSelection(); - else cm.operation(function() { exitVisualMode(cm); }); - }); - return {command: "null", passEvent: true}; - } - } - - if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); - if (overlay) cm.removeOverlay(overlay); - } - - if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { - var insertMode = vim.insertMode; - var name = lookupKey(hashId, key, e || {}); - if (vim.status == null) - vim.status = ""; - var isHandled = multiSelectHandleKey(cm, name, 'user'); - vim = getVim(cm); // may be changed by multiSelectHandleKey - if (isHandled && vim.status != null) - vim.status += name; - else if (vim.status == null) - vim.status = ""; - cm._signal("changeStatus"); - if (!isHandled && (hashId != -1 || insertMode)) - return; - return {command: "null", passEvent: !isHandled}; - } - }, - attach: function(editor) { - if (!editor.state) editor.state = {}; - var cm = new CodeMirror(editor); - editor.state.cm = cm; - editor.$vimModeHandler = this; - CodeMirror.keyMap.vim.attach(cm); - getVim(cm).status = null; - cm.on('vim-command-done', function() { - if (cm.virtualSelectionMode()) return; + }, + handleKeyboard: function (data, hashId, key, keyCode, e) { + var editor = data.editor; + var cm = editor.state.cm; + var vim = getVim(cm); + if (keyCode == -1) + return; + if (!vim.insertMode) { + if (hashId == -1) { + if (key.charCodeAt(0) > 0xFF) { + if (data.inputKey) { + key = data.inputKey; + if (key && data.inputHash == 4) + key = key.toUpperCase(); + } + } + data.inputChar = key; + } + else if (hashId == 4 || hashId == 0) { + if (data.inputKey == key && data.inputHash == hashId && data.inputChar) { + key = data.inputChar; + hashId = -1; + } + else { + data.inputChar = null; + data.inputKey = key; + data.inputHash = hashId; + } + } + else { + data.inputChar = data.inputKey = null; + } + } + if (cm.state.overwrite && vim.insertMode && key == "backspace" && hashId == 0) { + return { command: "gotoleft" }; + } + if (key == "c" && hashId == 1) { // key == "ctrl-c" + if (!useragent.isMac && editor.getCopyText()) { + editor.once("copy", function () { + if (vim.insertMode) + editor.selection.clearSelection(); + else + cm.operation(function () { exitVisualMode(cm); }); + }); + return { command: "null", passEvent: true }; + } + } + if (key == "esc" && !vim.insertMode && !vim.visualMode && !cm.ace.inMultiSelectMode) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (overlay) + cm.removeOverlay(overlay); + } + if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) { + var insertMode = vim.insertMode; + var name = lookupKey(hashId, key, e || {}, vim); + if (vim.status == null) + vim.status = ""; + var isHandled = multiSelectHandleKey(cm, name, 'user'); + vim = getVim(cm); // may be changed by multiSelectHandleKey + if (isHandled && vim.status != null) + vim.status += name; + else if (vim.status == null) + vim.status = ""; + cm._signal("changeStatus"); + if (!isHandled && (hashId != -1 || insertMode)) + return; + return { command: "null", passEvent: !isHandled }; + } + }, + attach: function (editor) { + if (!editor.state) + editor.state = {}; + var cm = new CodeMirror(editor); + editor.state.cm = cm; + editor.$vimModeHandler = this; + enterVimMode(cm); getVim(cm).status = null; - cm.ace._signal("changeStatus"); - cm.ace.session.markUndoGroup(); - }); - cm.on("changeStatus", function() { - cm.ace.renderer.updateCursor(); - cm.ace._signal("changeStatus"); - }); - cm.on("vim-mode-change", function() { - if (cm.virtualSelectionMode()) return; + cm.on('vim-command-done', function () { + if (cm.virtualSelectionMode()) + return; + getVim(cm).status = null; + cm.ace._signal("changeStatus"); + cm.ace.session.markUndoGroup(); + }); + cm.on("changeStatus", function () { + cm.ace.renderer.updateCursor(); + cm.ace._signal("changeStatus"); + }); + cm.on("vim-mode-change", function () { + if (cm.virtualSelectionMode()) + return; + updateInputMode(); + cm._signal("changeStatus"); + }); + function updateInputMode() { + var isIntsert = getVim(cm).insertMode; + cm.ace.renderer.setStyle("normal-mode", !isIntsert); + editor.textInput.setCommandMode(!isIntsert); + editor.renderer.$keepTextAreaAtCursor = isIntsert; + editor.renderer.$blockCursor = !isIntsert; + } updateInputMode(); - cm._signal("changeStatus"); - }); - function updateInputMode() { - var isIntsert = getVim(cm).insertMode; - cm.ace.renderer.setStyle("normal-mode", !isIntsert); - editor.textInput.setCommandMode(!isIntsert); - editor.renderer.$keepTextAreaAtCursor = isIntsert; - editor.renderer.$blockCursor = !isIntsert; - } - updateInputMode(); - editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); - }, - detach: function(editor) { - var cm = editor.state.cm; - CodeMirror.keyMap.vim.detach(cm); - cm.destroy(); - editor.state.cm = null; - editor.$vimModeHandler = null; - editor.renderer.$cursorLayer.drawCursor = null; - editor.renderer.setStyle("normal-mode", false); - editor.textInput.setCommandMode(false); - editor.renderer.$keepTextAreaAtCursor = true; - }, - getStatusText: function(editor) { - var cm = editor.state.cm; - var vim = getVim(cm); - if (vim.insertMode) - return "INSERT"; - var status = ""; - if (vim.visualMode) { - status += "VISUAL"; - if (vim.visualLine) - status += " LINE"; - if (vim.visualBlock) - status += " BLOCK"; - } - if (vim.status) - status += (status ? " " : "") + vim.status; - return status; - } - }; - Vim.defineOption({ + editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm); + }, + detach: function (editor) { + var cm = editor.state.cm; + leaveVimMode(cm); + cm.destroy(); + editor.state.cm = null; + editor.$vimModeHandler = null; + editor.renderer.$cursorLayer.drawCursor = null; + editor.renderer.setStyle("normal-mode", false); + editor.textInput.setCommandMode(false); + editor.renderer.$keepTextAreaAtCursor = true; + }, + getStatusText: function (editor) { + var cm = editor.state.cm; + var vim = getVim(cm); + if (vim.insertMode) + return "INSERT"; + var status = ""; + if (vim.visualMode) { + status += "VISUAL"; + if (vim.visualLine) + status += " LINE"; + if (vim.visualBlock) + status += " BLOCK"; + } + if (vim.status) + status += (status ? " " : "") + vim.status; + return status; + } +}; +vimApi.defineOption({ name: "wrap", - set: function(value, cm) { - if (cm) {cm.ace.setOption("wrap", value)} + set: function (value, cm) { + if (cm) { + cm.ace.setOption("wrap", value); + } }, type: "boolean" - }, false); - Vim.defineEx('write', 'w', function() { - console.log(':write is not implemented') - }); - defaultKeymap.push( - { keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, - { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, - { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, - { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, - { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, - { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, - - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, - { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } } - ); - - defaultKeymap.push({ +}, false); +vimApi.defineEx('write', 'w', function () { + console.log(':write is not implemented'); +}); +defaultKeymap.push({ keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } }, { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } }, { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true } }, { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } }, { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } }, { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAbove" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelow" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorAboveSkipCurrent" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "addCursorBelowSkipCurrent" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreBefore" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectMoreAfter" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextBefore" } }, { keys: '', type: 'action', action: 'aceCommand', actionArgs: { name: "selectNextAfter" } }); +defaultKeymap.push({ keys: 'gq', type: 'operator', operator: 'hardWrap' - }); - Vim.defineOperator("hardWrap", function(cm, operatorArgs, ranges, oldAnchor, newHead) { +}); +vimApi.defineOperator("hardWrap", function (cm, operatorArgs, ranges, oldAnchor, newHead) { var anchor = ranges[0].anchor.line; var head = ranges[0].head.line; - if (operatorArgs.linewise) head--; - hardWrap(cm.ace, {startRow: anchor, endRow: head}); + if (operatorArgs.linewise) + head--; + hardWrap(cm.ace, { startRow: anchor, endRow: head }); return Pos(head, 0); - }); - defineOption('textwidth', undefined, 'number', ['tw'], function(width, cm) { +}); +defineOption('textwidth', undefined, 'number', ['tw'], function (width, cm) { if (cm === undefined) { - return; + return; } if (width === undefined) { - var value = cm.ace.getOption('printMarginColumn'); - return value; - } else { - var column = Math.round(width); - if (column > 1) { - cm.ace.setOption('printMarginColumn', column); - } - } - }); - - actions.aceCommand = function(cm, actionArgs, vim) { + var value = cm.ace.getOption('printMarginColumn'); + return value; + } + else { + var column = Math.round(width); + if (column > 1) { + cm.ace.setOption('printMarginColumn', column); + } + } +}); +actions.aceCommand = function (cm, actionArgs, vim) { cm.vimCmd = actionArgs; if (cm.ace.inVirtualSelectionMode) - cm.ace.on("beforeEndOperation", delayedExecAceCommand); + cm.ace.on("beforeEndOperation", delayedExecAceCommand); else - delayedExecAceCommand(null, cm.ace); - }; - function delayedExecAceCommand(op, ace) { + delayedExecAceCommand(null, cm.ace); +}; +function delayedExecAceCommand(op, ace) { ace.off("beforeEndOperation", delayedExecAceCommand); var cmd = ace.state.cm.vimCmd; if (cmd) { - ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); + ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args); } ace.curOp = ace.prevOp; - } - actions.fold = function(cm, actionArgs, vim) { +} +actions.fold = function (cm, actionArgs, vim) { cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall' - ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); - }; + ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]); +}; +defaultKeymapLength = defaultKeymap.length; // ace_patch +exports.handler.defaultKeymap = defaultKeymap; +exports.handler.actions = actions; +exports.Vim = vimApi; - exports.handler.defaultKeymap = defaultKeymap; - exports.handler.actions = actions; - exports.Vim = Vim; }); (function() { window.require(["ace/keyboard/vim"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/keybinding-vscode.js b/app/Resources/ui/js/ace/keybinding-vscode.js index 5ab3448..1098cf8 100644 --- a/app/Resources/ui/js/ace/keybinding-vscode.js +++ b/app/Resources/ui/js/ace/keybinding-vscode.js @@ -1,251 +1,244 @@ -define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"], function(require, exports, module) { -"use strict"; - +define("ace/keyboard/vscode",["require","exports","module","ace/keyboard/hash_handler","ace/config"], function(require, exports, module){"use strict"; var HashHandler = require("../keyboard/hash_handler").HashHandler; var config = require("../config"); - exports.handler = new HashHandler(); exports.handler.$id = "ace/keyboard/vscode"; - exports.handler.addCommands([{ - name: "toggleWordWrap", - exec: function(editor) { - var wrapUsed = editor.session.getUseWrapMode(); - editor.session.setUseWrapMode(!wrapUsed); - }, - readOnly: true -}, { - name: "navigateToLastEditLocation", - exec: function(editor) { - var lastDelta = editor.session.getUndoManager().$lastDelta; - var range = (lastDelta.action == "remove")? lastDelta.start: lastDelta.end; - editor.moveCursorTo(range.row, range.column); - editor.clearSelection(); - } -}, { - name: "replaceAll", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, true); - }); - } else { - if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { - editor.searchBox.replaceAll(); + name: "toggleWordWrap", + exec: function (editor) { + var wrapUsed = editor.session.getUseWrapMode(); + editor.session.setUseWrapMode(!wrapUsed); + }, + readOnly: true + }, { + name: "navigateToLastEditLocation", + exec: function (editor) { + var lastDelta = editor.session.getUndoManager().$lastDelta; + var range = (lastDelta.action == "remove") ? lastDelta.start : lastDelta.end; + editor.moveCursorTo(range.row, range.column); + editor.clearSelection(); + } + }, { + name: "replaceAll", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, true); + }); + } + else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replaceAll(); + } } } - } -}, { - name: "replaceOne", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, true); - }); - } else { - if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { - editor.searchBox.replace(); + }, { + name: "replaceOne", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, true); + }); + } + else { + if (editor.searchBox.active === true && editor.searchBox.replaceOption.checked === true) { + editor.searchBox.replace(); + } } } - } -}, { - name: "selectAllMatches", - exec: function (editor) { - if (!editor.searchBox) { - config.loadModule("ace/ext/searchbox", function(e) { + }, { + name: "selectAllMatches", + exec: function (editor) { + if (!editor.searchBox) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + }); + } + else { + if (editor.searchBox.active === true) { + editor.searchBox.findAll(); + } + } + } + }, { + name: "toggleFindCaseSensitive", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { e.Search(editor, false); + var sb = editor.searchBox; + sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; + sb.$syncOptions(); }); - } else { - if (editor.searchBox.active === true) { - editor.searchBox.findAll(); - } } - } -}, { - name: "toggleFindCaseSensitive", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked; - sb.$syncOptions(); - }); - - } -}, { - name: "toggleFindInSelection", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.searchOption.checked = !sb.searchRange; - sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); - sb.$syncOptions(); - }); - } -}, { - name: "toggleFindRegex", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.regExpOption.checked = !sb.regExpOption.checked; - sb.$syncOptions(); - }); - } -}, { - name: "toggleFindWholeWord", - exec: function (editor) { - config.loadModule("ace/ext/searchbox", function(e) { - e.Search(editor, false); - var sb = editor.searchBox; - sb.wholeWordOption.checked = !sb.wholeWordOption.checked; - sb.$syncOptions(); - }); - } -}, { - name: "removeSecondaryCursors", - exec: function (editor) { - var ranges = editor.selection.ranges; - if (ranges && ranges.length > 1) - editor.selection.toSingleRange(ranges[ranges.length - 1]); - else - editor.selection.clearSelection(); - } -}]); - - + }, { + name: "toggleFindInSelection", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.searchOption.checked = !sb.searchRange; + sb.setSearchRange(sb.searchOption.checked && sb.editor.getSelectionRange()); + sb.$syncOptions(); + }); + } + }, { + name: "toggleFindRegex", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.regExpOption.checked = !sb.regExpOption.checked; + sb.$syncOptions(); + }); + } + }, { + name: "toggleFindWholeWord", + exec: function (editor) { + config.loadModule("ace/ext/searchbox", function (e) { + e.Search(editor, false); + var sb = editor.searchBox; + sb.wholeWordOption.checked = !sb.wholeWordOption.checked; + sb.$syncOptions(); + }); + } + }, { + name: "removeSecondaryCursors", + exec: function (editor) { + var ranges = editor.selection.ranges; + if (ranges && ranges.length > 1) + editor.selection.toSingleRange(ranges[ranges.length - 1]); + else + editor.selection.clearSelection(); + } + }]); [{ - bindKey: {mac: "Ctrl-G", win: "Ctrl-G"}, - name: "gotoline" -}, { - bindKey: {mac: "Command-Shift-L|Command-F2", win: "Ctrl-Shift-L|Ctrl-F2"}, - name: "findAll" -}, { - bindKey: {mac: "Shift-F8|Shift-Option-F8", win: "Shift-F8|Shift-Alt-F8"}, - name: "goToPreviousError" -}, { - bindKey: {mac: "F8|Option-F8", win: "F8|Alt-F8"}, - name: "goToNextError" -}, { - bindKey: {mac: "Command-Shift-P|F1", win: "Ctrl-Shift-P|F1"}, - name: "openCommandPallete" -}, { - bindKey: {mac: "Command-K|Command-S", win: "Ctrl-K|Ctrl-S"}, - name: "showKeyboardShortcuts" -}, { - bindKey: {mac: "Shift-Option-Up", win: "Alt-Shift-Up"}, - name: "copylinesup" -}, { - bindKey: {mac: "Shift-Option-Down", win: "Alt-Shift-Down"}, - name: "copylinesdown" -}, { - bindKey: {mac: "Command-Shift-K", win: "Ctrl-Shift-K"}, - name: "removeline" -}, { - bindKey: {mac: "Command-Enter", win: "Ctrl-Enter"}, - name: "addLineAfter" -}, { - bindKey: {mac: "Command-Shift-Enter", win: "Ctrl-Shift-Enter"}, - name: "addLineBefore" -}, { - bindKey: {mac: "Command-Shift-\\", win: "Ctrl-Shift-\\"}, - name: "jumptomatching" -}, { - bindKey: {mac: "Command-]", win: "Ctrl-]"}, - name: "blockindent" -}, { - bindKey: {mac: "Command-[", win: "Ctrl-["}, - name: "blockoutdent" -}, { - bindKey: {mac: "Ctrl-PageDown", win: "Alt-PageDown"}, - name: "pagedown" -}, { - bindKey: {mac: "Ctrl-PageUp", win: "Alt-PageUp"}, - name: "pageup" -}, { - bindKey: {mac: "Shift-Option-A", win: "Shift-Alt-A"}, - name: "toggleBlockComment" -}, { - bindKey: {mac: "Option-Z", win: "Alt-Z"}, - name: "toggleWordWrap" -}, { - bindKey: {mac: "Command-G", win: "F3|Ctrl-K Ctrl-D"}, - name: "findnext" -}, { - bindKey: {mac: "Command-Shift-G", win: "Shift-F3"}, - name: "findprevious" -}, { - bindKey: {mac: "Option-Enter", win: "Alt-Enter"}, - name: "selectAllMatches" -}, { - bindKey: {mac: "Command-D", win: "Ctrl-D"}, - name: "selectMoreAfter" -}, { - bindKey: {mac: "Command-K Command-D", win: "Ctrl-K Ctrl-D"}, - name: "selectOrFindNext" -}, { - bindKey: {mac: "Shift-Option-I", win: "Shift-Alt-I"}, - name: "splitSelectionIntoLines" -}, { - bindKey: {mac: "Command-K M", win: "Ctrl-K M"}, - name: "modeSelect" -}, { - bindKey: {mac: "Command-Option-[", win: "Ctrl-Shift-["}, - name: "toggleFoldWidget" -}, { - bindKey: {mac: "Command-Option-]", win: "Ctrl-Shift-]"}, - name: "toggleFoldWidget" -}, { - bindKey: {mac: "Command-K Command-0", win: "Ctrl-K Ctrl-0"}, - name: "foldall" -}, { - bindKey: {mac: "Command-K Command-J", win: "Ctrl-K Ctrl-J"}, - name: "unfoldall" -}, { - bindKey: { mac: "Command-K Command-1", win: "Ctrl-K Ctrl-1" }, - name: "foldOther" -}, { - bindKey: { mac: "Command-K Command-Q", win: "Ctrl-K Ctrl-Q" }, - name: "navigateToLastEditLocation" -}, { - bindKey: { mac: "Command-K Command-R|Command-K Command-S", win: "Ctrl-K Ctrl-R|Ctrl-K Ctrl-S" }, - name: "showKeyboardShortcuts" -}, { - bindKey: { mac: "Command-K Command-X", win: "Ctrl-K Ctrl-X" }, - name: "trimTrailingSpace" -}, { - bindKey: {mac: "Shift-Down|Command-Shift-Down", win: "Shift-Down|Ctrl-Shift-Down"}, - name: "selectdown" -}, { - bindKey: {mac: "Shift-Up|Command-Shift-Up", win: "Shift-Up|Ctrl-Shift-Up"}, - name: "selectup" -}, { - bindKey: {mac: "Command-Alt-Enter", win: "Ctrl-Alt-Enter"}, - name: "replaceAll" -}, { - bindKey: {mac: "Command-Shift-1", win: "Ctrl-Shift-1"}, - name: "replaceOne" -}, { - bindKey: {mac: "Option-C", win: "Alt-C"}, - name: "toggleFindCaseSensitive" -}, { - bindKey: {mac: "Option-L", win: "Alt-L"}, - name: "toggleFindInSelection" -}, { - bindKey: {mac: "Option-R", win: "Alt-R"}, - name: "toggleFindRegex" -}, { - bindKey: {mac: "Option-W", win: "Alt-W"}, - name: "toggleFindWholeWord" -}, { - bindKey: {mac: "Command-L", win: "Ctrl-L"}, - name: "expandtoline" -}, { - bindKey: {mac: "Shift-Esc", win: "Shift-Esc"}, - name: "removeSecondaryCursors" -} -].forEach(function(binding) { + bindKey: { mac: "Ctrl-G", win: "Ctrl-G" }, + name: "gotoline" + }, { + bindKey: { mac: "Command-Shift-L|Command-F2", win: "Ctrl-Shift-L|Ctrl-F2" }, + name: "findAll" + }, { + bindKey: { mac: "Shift-F8|Shift-Option-F8", win: "Shift-F8|Shift-Alt-F8" }, + name: "goToPreviousError" + }, { + bindKey: { mac: "F8|Option-F8", win: "F8|Alt-F8" }, + name: "goToNextError" + }, { + bindKey: { mac: "Command-Shift-P|F1", win: "Ctrl-Shift-P|F1" }, + name: "openCommandPalette" + }, { + bindKey: { mac: "Shift-Option-Up", win: "Alt-Shift-Up" }, + name: "copylinesup" + }, { + bindKey: { mac: "Shift-Option-Down", win: "Alt-Shift-Down" }, + name: "copylinesdown" + }, { + bindKey: { mac: "Command-Shift-K", win: "Ctrl-Shift-K" }, + name: "removeline" + }, { + bindKey: { mac: "Command-Enter", win: "Ctrl-Enter" }, + name: "addLineAfter" + }, { + bindKey: { mac: "Command-Shift-Enter", win: "Ctrl-Shift-Enter" }, + name: "addLineBefore" + }, { + bindKey: { mac: "Command-Shift-\\", win: "Ctrl-Shift-\\" }, + name: "jumptomatching" + }, { + bindKey: { mac: "Command-]", win: "Ctrl-]" }, + name: "blockindent" + }, { + bindKey: { mac: "Command-[", win: "Ctrl-[" }, + name: "blockoutdent" + }, { + bindKey: { mac: "Ctrl-PageDown", win: "Alt-PageDown" }, + name: "pagedown" + }, { + bindKey: { mac: "Ctrl-PageUp", win: "Alt-PageUp" }, + name: "pageup" + }, { + bindKey: { mac: "Shift-Option-A", win: "Shift-Alt-A" }, + name: "toggleBlockComment" + }, { + bindKey: { mac: "Option-Z", win: "Alt-Z" }, + name: "toggleWordWrap" + }, { + bindKey: { mac: "Command-G", win: "F3|Ctrl-K Ctrl-D" }, + name: "findnext" + }, { + bindKey: { mac: "Command-Shift-G", win: "Shift-F3" }, + name: "findprevious" + }, { + bindKey: { mac: "Option-Enter", win: "Alt-Enter" }, + name: "selectAllMatches" + }, { + bindKey: { mac: "Command-D", win: "Ctrl-D" }, + name: "selectMoreAfter" + }, { + bindKey: { mac: "Command-K Command-D", win: "Ctrl-K Ctrl-D" }, + name: "selectOrFindNext" + }, { + bindKey: { mac: "Shift-Option-I", win: "Shift-Alt-I" }, + name: "splitSelectionIntoLines" + }, { + bindKey: { mac: "Command-K M", win: "Ctrl-K M" }, + name: "modeSelect" + }, { + bindKey: { mac: "Command-Option-[", win: "Ctrl-Shift-[" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "Command-Option-]", win: "Ctrl-Shift-]" }, + name: "toggleFoldWidget" + }, { + bindKey: { mac: "Command-K Command-0", win: "Ctrl-K Ctrl-0" }, + name: "foldall" + }, { + bindKey: { mac: "Command-K Command-J", win: "Ctrl-K Ctrl-J" }, + name: "unfoldall" + }, { + bindKey: { mac: "Command-K Command-1", win: "Ctrl-K Ctrl-1" }, + name: "foldOther" + }, { + bindKey: { mac: "Command-K Command-Q", win: "Ctrl-K Ctrl-Q" }, + name: "navigateToLastEditLocation" + }, { + bindKey: { mac: "Command-K Command-R|Command-K Command-S", win: "Ctrl-K Ctrl-R|Ctrl-K Ctrl-S" }, + name: "showKeyboardShortcuts" + }, { + bindKey: { mac: "Command-K Command-X", win: "Ctrl-K Ctrl-X" }, + name: "trimTrailingSpace" + }, { + bindKey: { mac: "Shift-Down|Command-Shift-Down", win: "Shift-Down|Ctrl-Shift-Down" }, + name: "selectdown" + }, { + bindKey: { mac: "Shift-Up|Command-Shift-Up", win: "Shift-Up|Ctrl-Shift-Up" }, + name: "selectup" + }, { + bindKey: { mac: "Command-Alt-Enter", win: "Ctrl-Alt-Enter" }, + name: "replaceAll" + }, { + bindKey: { mac: "Command-Shift-1", win: "Ctrl-Shift-1" }, + name: "replaceOne" + }, { + bindKey: { mac: "Option-C", win: "Alt-C" }, + name: "toggleFindCaseSensitive" + }, { + bindKey: { mac: "Option-L", win: "Alt-L" }, + name: "toggleFindInSelection" + }, { + bindKey: { mac: "Option-R", win: "Alt-R" }, + name: "toggleFindRegex" + }, { + bindKey: { mac: "Option-W", win: "Alt-W" }, + name: "toggleFindWholeWord" + }, { + bindKey: { mac: "Command-L", win: "Ctrl-L" }, + name: "expandtoline" + }, { + bindKey: { mac: "Shift-Esc", win: "Shift-Esc" }, + name: "removeSecondaryCursors" + } +].forEach(function (binding) { var command = exports.handler.commands[binding.name]; if (command) command.bindKey = binding.bindKey; diff --git a/app/Resources/ui/js/ace/theme-ambiance.js b/app/Resources/ui/js/ace/theme-ambiance.js index 0830aed..7ed8808 100644 --- a/app/Resources/ui/js/ace/theme-ambiance.js +++ b/app/Resources/ui/js/ace/theme-ambiance.js @@ -1,177 +1,10 @@ -define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/ambiance-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-ambiance .ace_gutter {\n background-color: #3d3d3d;\n background-image: linear-gradient(left, #3D3D3D, #333);\n background-repeat: repeat-x;\n border-right: 1px solid #4d4d4d;\n text-shadow: 0px 1px 1px #4d4d4d;\n color: #222;\n}\n\n.ace-ambiance .ace_gutter-layer {\n background: repeat left top;\n}\n\n.ace-ambiance .ace_gutter-active-line {\n background-color: #3F3F3F;\n}\n\n.ace-ambiance .ace_fold-widget {\n text-align: center;\n}\n\n.ace-ambiance .ace_fold-widget:hover {\n color: #777;\n}\n\n.ace-ambiance .ace_fold-widget.ace_start,\n.ace-ambiance .ace_fold-widget.ace_end,\n.ace-ambiance .ace_fold-widget.ace_closed{\n background: none !important;\n border: none;\n box-shadow: none;\n}\n\n.ace-ambiance .ace_fold-widget.ace_start:after {\n content: '\u25BE'\n}\n\n.ace-ambiance .ace_fold-widget.ace_end:after {\n content: '\u25B4'\n}\n\n.ace-ambiance .ace_fold-widget.ace_closed:after {\n content: '\u2023'\n}\n\n.ace-ambiance .ace_print-margin {\n border-left: 1px dotted #2D2D2D;\n right: 0;\n background: #262626;\n}\n\n.ace-ambiance .ace_scroller {\n -webkit-box-shadow: inset 0 0 10px black;\n -moz-box-shadow: inset 0 0 10px black;\n -o-box-shadow: inset 0 0 10px black;\n box-shadow: inset 0 0 10px black;\n}\n\n.ace-ambiance {\n color: #E6E1DC;\n background-color: #202020;\n}\n\n.ace-ambiance .ace_cursor {\n border-left: 1px solid #7991E8;\n}\n\n.ace-ambiance .ace_overwrite-cursors .ace_cursor {\n border: 1px solid #FFE300;\n background: #766B13;\n}\n\n.ace-ambiance.normal-mode .ace_cursor-layer {\n z-index: 0;\n}\n \n.ace-ambiance .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20);\n}\n\n.ace-ambiance .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n box-shadow: 0 0 4px black;\n}\n\n.ace-ambiance .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-ambiance .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25);\n}\n\n.ace-ambiance .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031);\n}\n\n.ace-ambiance .ace_invisible {\n color: #333;\n}\n\n.ace-ambiance .ace_paren {\n color: #24C2C7;\n}\n\n.ace-ambiance .ace_keyword {\n color: #cda869;\n}\n\n.ace-ambiance .ace_keyword.ace_operator {\n color: #fa8d6a;\n}\n\n.ace-ambiance .ace_punctuation.ace_operator {\n color: #fa8d6a;\n}\n\n.ace-ambiance .ace_identifier {\n}\n\n.ace-ambiance .ace-statement {\n color: #cda869;\n}\n\n.ace-ambiance .ace_constant {\n color: #CF7EA9;\n}\n\n.ace-ambiance .ace_constant.ace_language {\n color: #CF7EA9;\n}\n\n.ace-ambiance .ace_constant.ace_library {\n \n}\n\n.ace-ambiance .ace_constant.ace_numeric {\n color: #78CF8A;\n}\n\n.ace-ambiance .ace_invalid {\n text-decoration: underline;\n}\n\n.ace-ambiance .ace_invalid.ace_illegal {\n color:#F8F8F8;\n background-color: rgba(86, 45, 86, 0.75);\n}\n\n.ace-ambiance .ace_invalid,\n.ace-ambiance .ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1;\n}\n\n.ace-ambiance .ace_support {\n color: #9B859D;\n}\n\n.ace-ambiance .ace_support.ace_function {\n color: #DAD085;\n}\n\n.ace-ambiance .ace_function.ace_buildin {\n color: #9b859d;\n}\n\n.ace-ambiance .ace_string {\n color: #8f9d6a;\n}\n\n.ace-ambiance .ace_string.ace_regexp {\n color: #DAD085;\n}\n\n.ace-ambiance .ace_comment {\n font-style: italic;\n color: #555;\n}\n\n.ace-ambiance .ace_comment.ace_doc {\n}\n\n.ace-ambiance .ace_comment.ace_doc.ace_tag {\n color: #666;\n font-style: normal;\n}\n\n.ace-ambiance .ace_definition,\n.ace-ambiance .ace_type {\n color: #aac6e3;\n}\n\n.ace-ambiance .ace_variable {\n color: #9999cc;\n}\n\n.ace-ambiance .ace_variable.ace_language {\n color: #9b859d;\n}\n\n.ace-ambiance .ace_xml-pe {\n color: #494949;\n}\n\n.ace-ambiance .ace_gutter-layer,\n.ace-ambiance .ace_text-layer {\n background-image: url(\"data:image/png;base64,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\");\n}\n\n.ace-ambiance .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\n}\n\n.ace-ambiance .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-ambiance"; -exports.cssText = ".ace-ambiance .ace_gutter {\ -background-color: #3d3d3d;\ -background-image: linear-gradient(left, #3D3D3D, #333);\ -background-repeat: repeat-x;\ -border-right: 1px solid #4d4d4d;\ -text-shadow: 0px 1px 1px #4d4d4d;\ -color: #222;\ -}\ -.ace-ambiance .ace_gutter-layer {\ -background: repeat left top;\ -}\ -.ace-ambiance .ace_gutter-active-line {\ -background-color: #3F3F3F;\ -}\ -.ace-ambiance .ace_fold-widget {\ -text-align: center;\ -}\ -.ace-ambiance .ace_fold-widget:hover {\ -color: #777;\ -}\ -.ace-ambiance .ace_fold-widget.ace_start,\ -.ace-ambiance .ace_fold-widget.ace_end,\ -.ace-ambiance .ace_fold-widget.ace_closed{\ -background: none !important;\ -border: none;\ -box-shadow: none;\ -}\ -.ace-ambiance .ace_fold-widget.ace_start:after {\ -content: '▾'\ -}\ -.ace-ambiance .ace_fold-widget.ace_end:after {\ -content: '▴'\ -}\ -.ace-ambiance .ace_fold-widget.ace_closed:after {\ -content: '‣'\ -}\ -.ace-ambiance .ace_print-margin {\ -border-left: 1px dotted #2D2D2D;\ -right: 0;\ -background: #262626;\ -}\ -.ace-ambiance .ace_scroller {\ --webkit-box-shadow: inset 0 0 10px black;\ --moz-box-shadow: inset 0 0 10px black;\ --o-box-shadow: inset 0 0 10px black;\ -box-shadow: inset 0 0 10px black;\ -}\ -.ace-ambiance {\ -color: #E6E1DC;\ -background-color: #202020;\ -}\ -.ace-ambiance .ace_cursor {\ -border-left: 1px solid #7991E8;\ -}\ -.ace-ambiance .ace_overwrite-cursors .ace_cursor {\ -border: 1px solid #FFE300;\ -background: #766B13;\ -}\ -.ace-ambiance.normal-mode .ace_cursor-layer {\ -z-index: 0;\ -}\ -.ace-ambiance .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20);\ -}\ -.ace-ambiance .ace_marker-layer .ace_selected-word {\ -border-radius: 4px;\ -border: 8px solid #3f475d;\ -box-shadow: 0 0 4px black;\ -}\ -.ace-ambiance .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-ambiance .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25);\ -}\ -.ace-ambiance .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031);\ -}\ -.ace-ambiance .ace_invisible {\ -color: #333;\ -}\ -.ace-ambiance .ace_paren {\ -color: #24C2C7;\ -}\ -.ace-ambiance .ace_keyword {\ -color: #cda869;\ -}\ -.ace-ambiance .ace_keyword.ace_operator {\ -color: #fa8d6a;\ -}\ -.ace-ambiance .ace_punctuation.ace_operator {\ -color: #fa8d6a;\ -}\ -.ace-ambiance .ace_identifier {\ -}\ -.ace-ambiance .ace-statement {\ -color: #cda869;\ -}\ -.ace-ambiance .ace_constant {\ -color: #CF7EA9;\ -}\ -.ace-ambiance .ace_constant.ace_language {\ -color: #CF7EA9;\ -}\ -.ace-ambiance .ace_constant.ace_library {\ -}\ -.ace-ambiance .ace_constant.ace_numeric {\ -color: #78CF8A;\ -}\ -.ace-ambiance .ace_invalid {\ -text-decoration: underline;\ -}\ -.ace-ambiance .ace_invalid.ace_illegal {\ -color:#F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75);\ -}\ -.ace-ambiance .ace_invalid,\ -.ace-ambiance .ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1;\ -}\ -.ace-ambiance .ace_support {\ -color: #9B859D;\ -}\ -.ace-ambiance .ace_support.ace_function {\ -color: #DAD085;\ -}\ -.ace-ambiance .ace_function.ace_buildin {\ -color: #9b859d;\ -}\ -.ace-ambiance .ace_string {\ -color: #8f9d6a;\ -}\ -.ace-ambiance .ace_string.ace_regexp {\ -color: #DAD085;\ -}\ -.ace-ambiance .ace_comment {\ -font-style: italic;\ -color: #555;\ -}\ -.ace-ambiance .ace_comment.ace_doc {\ -}\ -.ace-ambiance .ace_comment.ace_doc.ace_tag {\ -color: #666;\ -font-style: normal;\ -}\ -.ace-ambiance .ace_definition,\ -.ace-ambiance .ace_type {\ -color: #aac6e3;\ -}\ -.ace-ambiance .ace_variable {\ -color: #9999cc;\ -}\ -.ace-ambiance .ace_variable.ace_language {\ -color: #9b859d;\ -}\ -.ace-ambiance .ace_xml-pe {\ -color: #494949;\ -}\ -.ace-ambiance .ace_gutter-layer,\ -.ace-ambiance .ace_text-layer {\ -background-image: url(\"data:image/png;base64,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\");\ -}\ -.ace-ambiance .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ -}\ -"; +}); +define("ace/theme/ambiance",["require","exports","module","ace/theme/ambiance-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-ambiance"; +exports.cssText = require("./ambiance-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-chaos.js b/app/Resources/ui/js/ace/theme-chaos.js index 630a72f..7fb2e05 100644 --- a/app/Resources/ui/js/ace/theme-chaos.js +++ b/app/Resources/ui/js/ace/theme-chaos.js @@ -1,155 +1,10 @@ -define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/chaos-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-chaos .ace_gutter {\n background: #141414;\n color: #595959;\n border-right: 1px solid #282828;\n}\n.ace-chaos .ace_gutter-cell.ace_warning {\n background-image: none;\n background: #FC0;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_gutter-cell.ace_error {\n background-position: -6px center;\n background-image: none;\n background: #F10;\n border-left: none;\n padding-left: 0;\n color: #000;\n}\n.ace-chaos .ace_print-margin {\n border-left: 1px solid #555;\n right: 0;\n background: #1D1D1D;\n}\n.ace-chaos {\n background-color: #161616;\n color: #E6E1DC;\n}\n\n.ace-chaos .ace_cursor {\n border-left: 2px solid #FFFFFF;\n}\n.ace-chaos .ace_cursor.ace_overwrite {\n border-left: 0px;\n border-bottom: 1px solid #FFFFFF;\n}\n.ace-chaos .ace_marker-layer .ace_selection {\n background: #494836;\n}\n.ace-chaos .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n.ace-chaos .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #FCE94F;\n}\n.ace-chaos .ace_marker-layer .ace_active-line {\n background: #333;\n}\n.ace-chaos .ace_gutter-active-line {\n background-color: #222;\n}\n.ace-chaos .ace_invisible {\n color: #404040;\n}\n.ace-chaos .ace_keyword {\n color:#00698F;\n}\n.ace-chaos .ace_keyword.ace_operator {\n color:#FF308F;\n}\n.ace-chaos .ace_constant {\n color:#1EDAFB;\n}\n.ace-chaos .ace_constant.ace_language {\n color:#FDC251;\n}\n.ace-chaos .ace_constant.ace_library {\n color:#8DFF0A;\n}\n.ace-chaos .ace_constant.ace_numeric {\n color:#58C554;\n}\n.ace-chaos .ace_invalid {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_invalid.ace_deprecated {\n color:#FFFFFF;\n background-color:#990000;\n}\n.ace-chaos .ace_support {\n color: #999;\n}\n.ace-chaos .ace_support.ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_function {\n color:#00AEEF;\n}\n.ace-chaos .ace_string {\n color:#58C554;\n}\n.ace-chaos .ace_comment {\n color:#555;\n font-style:italic;\n padding-bottom: 0px;\n}\n.ace-chaos .ace_variable {\n color:#997744;\n}\n.ace-chaos .ace_meta.ace_tag {\n color:#BE53E6;\n}\n.ace-chaos .ace_entity.ace_other.ace_attribute-name {\n color:#FFFF89;\n}\n.ace-chaos .ace_markup.ace_underline {\n text-decoration: underline;\n}\n.ace-chaos .ace_fold-widget {\n text-align: center;\n}\n\n.ace-chaos .ace_fold-widget:hover {\n color: #777;\n}\n\n.ace-chaos .ace_fold-widget.ace_start,\n.ace-chaos .ace_fold-widget.ace_end,\n.ace-chaos .ace_fold-widget.ace_closed{\n background: none !important;\n border: none;\n box-shadow: none;\n}\n\n.ace-chaos .ace_fold-widget.ace_start:after {\n content: '\u25BE'\n}\n\n.ace-chaos .ace_fold-widget.ace_end:after {\n content: '\u25B4'\n}\n\n.ace-chaos .ace_fold-widget.ace_closed:after {\n content: '\u2023'\n}\n\n.ace-chaos .ace_indent-guide {\n border-right:1px dotted #333333;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_indent-guide-active {\n border-right:1px dotted #afafaf;\n margin-right:-1px;\n}\n\n.ace-chaos .ace_fold { \n background: #222; \n border-radius: 3px; \n color: #7AF; \n border: none; \n}\n.ace-chaos .ace_fold:hover {\n background: #CCC; \n color: #000;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-chaos"; -exports.cssText = ".ace-chaos .ace_gutter {\ -background: #141414;\ -color: #595959;\ -border-right: 1px solid #282828;\ -}\ -.ace-chaos .ace_gutter-cell.ace_warning {\ -background-image: none;\ -background: #FC0;\ -border-left: none;\ -padding-left: 0;\ -color: #000;\ -}\ -.ace-chaos .ace_gutter-cell.ace_error {\ -background-position: -6px center;\ -background-image: none;\ -background: #F10;\ -border-left: none;\ -padding-left: 0;\ -color: #000;\ -}\ -.ace-chaos .ace_print-margin {\ -border-left: 1px solid #555;\ -right: 0;\ -background: #1D1D1D;\ -}\ -.ace-chaos {\ -background-color: #161616;\ -color: #E6E1DC;\ -}\ -.ace-chaos .ace_cursor {\ -border-left: 2px solid #FFFFFF;\ -}\ -.ace-chaos .ace_cursor.ace_overwrite {\ -border-left: 0px;\ -border-bottom: 1px solid #FFFFFF;\ -}\ -.ace-chaos .ace_marker-layer .ace_selection {\ -background: #494836;\ -}\ -.ace-chaos .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-chaos .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #FCE94F;\ -}\ -.ace-chaos .ace_marker-layer .ace_active-line {\ -background: #333;\ -}\ -.ace-chaos .ace_gutter-active-line {\ -background-color: #222;\ -}\ -.ace-chaos .ace_invisible {\ -color: #404040;\ -}\ -.ace-chaos .ace_keyword {\ -color:#00698F;\ -}\ -.ace-chaos .ace_keyword.ace_operator {\ -color:#FF308F;\ -}\ -.ace-chaos .ace_constant {\ -color:#1EDAFB;\ -}\ -.ace-chaos .ace_constant.ace_language {\ -color:#FDC251;\ -}\ -.ace-chaos .ace_constant.ace_library {\ -color:#8DFF0A;\ -}\ -.ace-chaos .ace_constant.ace_numeric {\ -color:#58C554;\ -}\ -.ace-chaos .ace_invalid {\ -color:#FFFFFF;\ -background-color:#990000;\ -}\ -.ace-chaos .ace_invalid.ace_deprecated {\ -color:#FFFFFF;\ -background-color:#990000;\ -}\ -.ace-chaos .ace_support {\ -color: #999;\ -}\ -.ace-chaos .ace_support.ace_function {\ -color:#00AEEF;\ -}\ -.ace-chaos .ace_function {\ -color:#00AEEF;\ -}\ -.ace-chaos .ace_string {\ -color:#58C554;\ -}\ -.ace-chaos .ace_comment {\ -color:#555;\ -font-style:italic;\ -padding-bottom: 0px;\ -}\ -.ace-chaos .ace_variable {\ -color:#997744;\ -}\ -.ace-chaos .ace_meta.ace_tag {\ -color:#BE53E6;\ -}\ -.ace-chaos .ace_entity.ace_other.ace_attribute-name {\ -color:#FFFF89;\ -}\ -.ace-chaos .ace_markup.ace_underline {\ -text-decoration: underline;\ -}\ -.ace-chaos .ace_fold-widget {\ -text-align: center;\ -}\ -.ace-chaos .ace_fold-widget:hover {\ -color: #777;\ -}\ -.ace-chaos .ace_fold-widget.ace_start,\ -.ace-chaos .ace_fold-widget.ace_end,\ -.ace-chaos .ace_fold-widget.ace_closed{\ -background: none !important;\ -border: none;\ -box-shadow: none;\ -}\ -.ace-chaos .ace_fold-widget.ace_start:after {\ -content: '▾'\ -}\ -.ace-chaos .ace_fold-widget.ace_end:after {\ -content: '▴'\ -}\ -.ace-chaos .ace_fold-widget.ace_closed:after {\ -content: '‣'\ -}\ -.ace-chaos .ace_indent-guide {\ -border-right:1px dotted #333;\ -margin-right:-1px;\ -}\ -.ace-chaos .ace_fold { \ -background: #222; \ -border-radius: 3px; \ -color: #7AF; \ -border: none; \ -}\ -.ace-chaos .ace_fold:hover {\ -background: #CCC; \ -color: #000;\ -}\ -"; +}); +define("ace/theme/chaos",["require","exports","module","ace/theme/chaos-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-chaos"; +exports.cssText = require("./chaos-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-chrome.js b/app/Resources/ui/js/ace/theme-chrome.js index 534625a..fdff3ba 100644 --- a/app/Resources/ui/js/ace/theme-chrome.js +++ b/app/Resources/ui/js/ace/theme-chrome.js @@ -1,129 +1,13 @@ -define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/chrome-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-chrome .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow : hidden;\n}\n\n.ace-chrome .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-chrome {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-chrome .ace_cursor {\n color: black;\n}\n\n.ace-chrome .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-chrome .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-chrome .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-chrome .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-chrome .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-chrome .ace_fold {\n}\n\n.ace-chrome .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-chrome .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-chrome .ace_support.ace_type,\n.ace-chrome .ace_support.ace_class\n.ace-chrome .ace_support.ace_other {\n color: rgb(109, 121, 222);\n}\n\n.ace-chrome .ace_variable.ace_parameter {\n font-style:italic;\n color:#FD971F;\n}\n.ace-chrome .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-chrome .ace_comment {\n color: #236e24;\n}\n\n.ace-chrome .ace_comment.ace_doc {\n color: #236e24;\n}\n\n.ace-chrome .ace_comment.ace_doc.ace_tag {\n color: #236e24;\n}\n\n.ace-chrome .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-chrome .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-chrome .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-chrome .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-chrome .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-chrome .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-chrome .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-chrome .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-chrome .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-chrome .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-chrome .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-chrome .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-chrome .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-chrome .ace_storage,\n.ace-chrome .ace_keyword,\n.ace-chrome .ace_meta.ace_tag {\n color: rgb(147, 15, 128);\n}\n\n.ace-chrome .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-chrome .ace_string {\n color: #1A1AA6;\n}\n\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\n color: #994409;\n}\n\n.ace-chrome .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n \n.ace-chrome .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-chrome"; -exports.cssText = ".ace-chrome .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow : hidden;\ -}\ -.ace-chrome .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-chrome {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-chrome .ace_cursor {\ -color: black;\ -}\ -.ace-chrome .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-chrome .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-chrome .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-chrome .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-chrome .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-chrome .ace_fold {\ -}\ -.ace-chrome .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-chrome .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-chrome .ace_support.ace_type,\ -.ace-chrome .ace_support.ace_class\ -.ace-chrome .ace_support.ace_other {\ -color: rgb(109, 121, 222);\ -}\ -.ace-chrome .ace_variable.ace_parameter {\ -font-style:italic;\ -color:#FD971F;\ -}\ -.ace-chrome .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-chrome .ace_comment {\ -color: #236e24;\ -}\ -.ace-chrome .ace_comment.ace_doc {\ -color: #236e24;\ -}\ -.ace-chrome .ace_comment.ace_doc.ace_tag {\ -color: #236e24;\ -}\ -.ace-chrome .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-chrome .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-chrome .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-chrome .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-chrome .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-chrome .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-chrome .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-chrome .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-chrome .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-chrome .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-chrome .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-chrome .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-chrome .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-chrome .ace_storage,\ -.ace-chrome .ace_keyword,\ -.ace-chrome .ace_meta.ace_tag {\ -color: rgb(147, 15, 128);\ -}\ -.ace-chrome .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-chrome .ace_string {\ -color: #1A1AA6;\ -}\ -.ace-chrome .ace_entity.ace_other.ace_attribute-name {\ -color: #994409;\ -}\ -.ace-chrome .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); +define("ace/theme/chrome",["require","exports","module","ace/theme/chrome-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-chrome"; +exports.cssText = require("./chrome-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/chrome"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_day.js b/app/Resources/ui/js/ace/theme-cloud9_day.js index 1e5ee0e..60d73bb 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_day.js +++ b/app/Resources/ui/js/ace/theme-cloud9_day.js @@ -1,130 +1,14 @@ -define("ace/theme/cloud9_day",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - "use strict"; +define("ace/theme/cloud9_day-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-day .ace_gutter {\n background: #ECECEC;\n color: #333;\n}\n\n.ace-cloud9-day .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-cloud9-day .ace_fold {\n background-color: #6B72E6;\n}\n\n.ace-cloud9-day {\n background-color: #FBFBFB;\n color: black;\n}\n\n.ace-cloud9-day .ace_cursor {\n color: black;\n}\n\n.ace-cloud9-day .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-cloud9-day .ace_storage,\n.ace-cloud9-day .ace_keyword {\n color: rgb(24, 122, 234);\n}\n\n.ace-cloud9-day .ace_constant {\n color: rgb(197, 6, 11);\n}\n\n.ace-cloud9-day .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-cloud9-day .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-cloud9-day .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-cloud9-day .ace_invalid {\n background-color: rgba(255, 0, 0, 0.1);\n color: red;\n}\n\n.ace-cloud9-day .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-cloud9-day .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-cloud9-day .ace_support.ace_type,\n.ace-cloud9-day .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-cloud9-day .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-cloud9-day .ace_string {\n color: rgb(3, 106, 7);\n}\n\n.ace-cloud9-day .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-cloud9-day .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-cloud9-day .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-cloud9-day .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-cloud9-day .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-cloud9-day .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-cloud9-day .ace_entity.ace_name.ace_function {\n color: #0000A2;\n}\n\n\n.ace-cloud9-day .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-cloud9-day .ace_list {\n color: rgb(185, 6, 144);\n}\n\n.ace-cloud9-day .ace_meta.ace_tag {\n color: rgb(0, 22, 142);\n}\n\n.ace-cloud9-day .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-cloud9-day.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_step {\n background: rgb(247, 237, 137);\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_stack {\n background: #BAE0A0;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-cloud9-day .ace_gutter-active-line {\n background-color: #E5E5E5;\n}\n\n.ace-cloud9-day .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-cloud9-day .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-cloud9-day .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; - exports.isDark = false; - exports.cssClass = "ace-cloud9-day"; - exports.cssText = ".ace-cloud9-day .ace_gutter {\ -background: #ECECEC;\ -color: #333;\ -}\ -.ace-cloud9-day .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-cloud9-day .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-cloud9-day {\ -background-color: #FBFBFB;\ -color: black;\ -}\ -.ace-cloud9-day .ace_cursor {\ -color: black;\ -}\ -.ace-cloud9-day .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-cloud9-day .ace_storage,\ -.ace-cloud9-day .ace_keyword {\ -color: rgb(24, 122, 234);\ -}\ -.ace-cloud9-day .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-cloud9-day .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-cloud9-day .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-cloud9-day .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-cloud9-day .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-cloud9-day .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-cloud9-day .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-cloud9-day .ace_support.ace_type,\ -.ace-cloud9-day .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-cloud9-day .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-cloud9-day .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-cloud9-day .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-cloud9-day .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-cloud9-day .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-cloud9-day .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-cloud9-day .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-cloud9-day .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-cloud9-day .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-cloud9-day .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-cloud9-day .ace_list {\ -color: rgb(185, 6, 144);\ -}\ -.ace-cloud9-day .ace_meta.ace_tag {\ -color: rgb(0, 22, 142);\ -}\ -.ace-cloud9-day .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-cloud9-day.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_step {\ -background: rgb(247, 237, 137);\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_stack {\ -background: #BAE0A0;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-cloud9-day .ace_gutter-active-line {\ -background-color: #E5E5E5;\ -}\ -.ace-cloud9-day .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-cloud9-day .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); + +define("ace/theme/cloud9_day",["require","exports","module","ace/theme/cloud9_day-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssClass = "ace-cloud9-day"; +exports.cssText = require("./cloud9_day-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_day"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_night.js b/app/Resources/ui/js/ace/theme-cloud9_night.js index c7d5186..3a14ede 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_night.js +++ b/app/Resources/ui/js/ace/theme-cloud9_night.js @@ -1,124 +1,13 @@ -define("ace/theme/cloud9_night",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - exports.isDark = true; - exports.cssClass = "ace-cloud9-night"; - exports.cssText = ".ace-cloud9-night .ace_gutter {\ -background: #303130;\ -color: #eee\ -}\ -.ace-cloud9-night .ace_print-margin {\ -width: 1px;\ -background: #222\ -}\ -.ace-cloud9-night {\ -background-color: #181818;\ -color: #EBEBEB\ -}\ -.ace-cloud9-night .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-cloud9-night.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -border-radius: 2px\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1);\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_active-line {\ -background: #292929\ -}\ -.ace-cloud9-night .ace_gutter-active-line {\ -background-color: #3D3D3D\ -}\ -.ace-cloud9-night .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-cloud9-night .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night .ace_invisible {\ -color: #343434\ -}\ -.ace-cloud9-night .ace_keyword,\ -.ace-cloud9-night .ace_meta,\ -.ace-cloud9-night .ace_storage,\ -.ace-cloud9-night .ace_storage.ace_type,\ -.ace-cloud9-night .ace_support.ace_type {\ -color: #C397D8\ -}\ -.ace-cloud9-night .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-cloud9-night .ace_constant.ace_character,\ -.ace-cloud9-night .ace_constant.ace_language,\ -.ace-cloud9-night .ace_constant.ace_numeric,\ -.ace-cloud9-night .ace_keyword.ace_other.ace_unit,\ -.ace-cloud9-night .ace_support.ace_constant,\ -.ace-cloud9-night .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-cloud9-night .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-cloud9-night .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-cloud9-night .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-cloud9-night .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-cloud9-night .ace_entity.ace_name.ace_function,\ -.ace-cloud9-night .ace_support.ace_function,\ -.ace-cloud9-night .ace_variable:not(.ace_parameter),\ -.ace-cloud9-night .ace_constant:not(.ace_numeric) {\ -color: #7AA6DA\ -}\ -.ace-cloud9-night .ace_support.ace_class,\ -.ace-cloud9-night .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-cloud9-night .ace_heading,\ -.ace-cloud9-night .ace_markup.ace_heading,\ -.ace-cloud9-night .ace_string {\ -color: #B9CA4A\ -}\ -.ace-cloud9-night .ace_entity.ace_name.ace_tag,\ -.ace-cloud9-night .ace_entity.ace_other.ace_attribute-name,\ -.ace-cloud9-night .ace_meta.ace_tag,\ -.ace-cloud9-night .ace_string.ace_regexp,\ -.ace-cloud9-night .ace_variable {\ -color: #D54E53\ -}\ -.ace-cloud9-night .ace_comment {\ -color: #969896\ -}\ -.ace-cloud9-night .ace_c9searchresults.ace_keyword {\ -color: #C2C280;\ -}\ -.ace-cloud9-night .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +define("ace/theme/cloud9_night-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-night .ace_gutter {\n background: #303130;\n color: #eee\n}\n\n.ace-cloud9-night .ace_print-margin {\n width: 1px;\n background: #222\n}\n\n.ace-cloud9-night {\n background-color: #181818;\n color: #EBEBEB\n}\n\n.ace-cloud9-night .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-cloud9-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n border-radius: 2px\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1);\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_active-line {\n background: #292929\n}\n\n.ace-cloud9-night .ace_gutter-active-line {\n background-color: #3D3D3D\n}\n\n.ace-cloud9-night .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-cloud9-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-cloud9-night .ace_invisible {\n color: #343434\n}\n\n.ace-cloud9-night .ace_keyword,\n.ace-cloud9-night .ace_meta,\n.ace-cloud9-night .ace_storage,\n.ace-cloud9-night .ace_storage.ace_type,\n.ace-cloud9-night .ace_support.ace_type {\n color: #C397D8\n}\n\n.ace-cloud9-night .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-cloud9-night .ace_constant.ace_character,\n.ace-cloud9-night .ace_constant.ace_language,\n.ace-cloud9-night .ace_constant.ace_numeric,\n.ace-cloud9-night .ace_keyword.ace_other.ace_unit,\n.ace-cloud9-night .ace_support.ace_constant,\n.ace-cloud9-night .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-cloud9-night .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-cloud9-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-cloud9-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-cloud9-night .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-cloud9-night .ace_entity.ace_name.ace_function,\n.ace-cloud9-night .ace_support.ace_function,\n.ace-cloud9-night .ace_variable:not(.ace_parameter),\n.ace-cloud9-night .ace_constant:not(.ace_numeric) {\n color: #7AA6DA\n}\n\n.ace-cloud9-night .ace_support.ace_class,\n.ace-cloud9-night .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-cloud9-night .ace_heading,\n.ace-cloud9-night .ace_markup.ace_heading,\n.ace-cloud9-night .ace_string {\n color: #B9CA4A\n}\n\n.ace-cloud9-night .ace_entity.ace_name.ace_tag,\n.ace-cloud9-night .ace_entity.ace_other.ace_attribute-name,\n.ace-cloud9-night .ace_meta.ace_tag,\n.ace-cloud9-night .ace_string.ace_regexp,\n.ace-cloud9-night .ace_variable {\n color: #D54E53\n}\n\n.ace-cloud9-night .ace_comment {\n color: #969896\n}\n\n.ace-cloud9-night .ace_c9searchresults.ace_keyword {\n color: #C2C280;\n}\n\n.ace-cloud9-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cloud9-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; + +}); + +define("ace/theme/cloud9_night",["require","exports","module","ace/theme/cloud9_night-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cloud9-night"; +exports.cssText = require("./cloud9_night-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_night"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js index 0ee9b23..6902bf1 100644 --- a/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js +++ b/app/Resources/ui/js/ace/theme-cloud9_night_low_color.js @@ -1,113 +1,13 @@ -define("ace/theme/cloud9_night_low_color",["require","exports","module","ace/lib/dom"], function (require, exports, module) { - exports.isDark = true; - exports.cssClass = "ace-cloud9-night-low-color"; - exports.cssText = ".ace-cloud9-night-low-color .ace_gutter {\ -background: #303130;\ -color: #eee\ -}\ -.ace-cloud9-night-low-color .ace_print-margin {\ -width: 1px;\ -background: #222\ -}\ -.ace-cloud9-night-low-color {\ -background-color: #181818;\ -color: #EBEBEB\ -}\ -.ace-cloud9-night-low-color .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-cloud9-night-low-color.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -border-radius: 2px\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1);\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_active-line {\ -background: #292929\ -}\ -.ace-cloud9-night-low-color .ace_gutter-active-line {\ -background-color: #3D3D3D\ -}\ -.ace-cloud9-night-low-color .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-cloud9-night-low-color .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-cloud9-night-low-color .ace_invisible {\ -color: #343434\ -}\ -.ace-cloud9-night-low-color .ace_keyword,\ -.ace-cloud9-night-low-color .ace_meta,\ -.ace-cloud9-night-low-color .ace_storage {\ -color: #C397D8\ -}\ -.ace-cloud9-night-low-color .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-cloud9-night-low-color .ace_constant.ace_character,\ -.ace-cloud9-night-low-color .ace_constant.ace_language,\ -.ace-cloud9-night-low-color .ace_constant.ace_numeric,\ -.ace-cloud9-night-low-color .ace_keyword.ace_other.ace_unit {\ -color: #DAA637\ -}\ -.ace-cloud9-night-low-color .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-cloud9-night-low-color .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-cloud9-night-low-color .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-cloud9-night-low-color .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-cloud9-night-low-color .ace_entity.ace_name.ace_function,\ -.ace-cloud9-night-low-color .ace_support.ace_function,\ -.ace-cloud9-night-low-color .ace_variable:not(.ace_parameter),\ -.ace-cloud9-night-low-color .ace_constant:not(.ace_numeric) {\ -color: #7AA6DA\ -}\ -.ace-cloud9-night-low-color .ace_support.ace_class,\ -.ace-cloud9-night-low-color .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-cloud9-night-low-color .ace_heading,\ -.ace-cloud9-night-low-color .ace_markup.ace_heading,\ -.ace-cloud9-night-low-color .ace_string {\ -color: #B9CA4A\ -}\ -.ace-cloud9-night-low-color .ace_comment {\ -color: #969896\ -}\ -.ace-cloud9-night-low-color .ace_c9searchresults.ace_keyword {\ -color: #C2C280;\ -}\ -.ace-cloud9-night-low-color .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +define("ace/theme/cloud9_night_low_color-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cloud9-night-low-color .ace_gutter {\n background: #303130;\n color: #eee\n}\n\n.ace-cloud9-night-low-color .ace_print-margin {\n width: 1px;\n background: #222\n}\n\n.ace-cloud9-night-low-color {\n background-color: #181818;\n color: #EBEBEB\n}\n\n.ace-cloud9-night-low-color .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-cloud9-night-low-color.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n border-radius: 2px\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1);\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_active-line {\n background: #292929\n}\n\n.ace-cloud9-night-low-color .ace_gutter-active-line {\n background-color: #3D3D3D\n}\n\n.ace-cloud9-night-low-color .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-cloud9-night-low-color .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-cloud9-night-low-color .ace_invisible {\n color: #343434\n}\n\n.ace-cloud9-night-low-color .ace_keyword,\n.ace-cloud9-night-low-color .ace_meta,\n.ace-cloud9-night-low-color .ace_storage {\n color: #C397D8\n}\n\n.ace-cloud9-night-low-color .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-cloud9-night-low-color .ace_constant.ace_character,\n.ace-cloud9-night-low-color .ace_constant.ace_language,\n.ace-cloud9-night-low-color .ace_constant.ace_numeric,\n.ace-cloud9-night-low-color .ace_keyword.ace_other.ace_unit {\n color: #DAA637\n}\n\n.ace-cloud9-night-low-color .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-cloud9-night-low-color .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-cloud9-night-low-color .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-cloud9-night-low-color .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-cloud9-night-low-color .ace_entity.ace_name.ace_function,\n.ace-cloud9-night-low-color .ace_support.ace_function,\n.ace-cloud9-night-low-color .ace_variable:not(.ace_parameter),\n.ace-cloud9-night-low-color .ace_constant:not(.ace_numeric) {\n color: #7AA6DA\n}\n\n.ace-cloud9-night-low-color .ace_support.ace_class,\n.ace-cloud9-night-low-color .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-cloud9-night-low-color .ace_heading,\n.ace-cloud9-night-low-color .ace_markup.ace_heading,\n.ace-cloud9-night-low-color .ace_string {\n color: #B9CA4A\n}\n\n.ace-cloud9-night-low-color .ace_comment {\n color: #969896\n}\n\n.ace-cloud9-night-low-color .ace_c9searchresults.ace_keyword {\n color: #C2C280;\n}\n\n.ace-cloud9-night-low-color .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cloud9-night-low-color .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; + +}); + +define("ace/theme/cloud9_night_low_color",["require","exports","module","ace/theme/cloud9_night_low_color-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cloud9-night-low-color"; +exports.cssText = require("./cloud9_night_low_color-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass); }); (function() { window.require(["ace/theme/cloud9_night_low_color"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-clouds.js b/app/Resources/ui/js/ace/theme-clouds.js index 2673f62..0adc9cf 100644 --- a/app/Resources/ui/js/ace/theme-clouds.js +++ b/app/Resources/ui/js/ace/theme-clouds.js @@ -1,97 +1,13 @@ -define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/clouds-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-clouds .ace_gutter {\n background: #ebebeb;\n color: #333\n}\n\n.ace-clouds .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-clouds {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-clouds .ace_cursor {\n color: #000000\n}\n\n.ace-clouds .ace_marker-layer .ace_selection {\n background: #BDD5FC\n}\n\n.ace-clouds.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-clouds .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-clouds .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-clouds .ace_marker-layer .ace_active-line {\n background: #FFFBD1\n}\n\n.ace-clouds .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-clouds .ace_marker-layer .ace_selected-word {\n border: 1px solid #BDD5FC\n}\n\n.ace-clouds .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-clouds .ace_keyword,\n.ace-clouds .ace_meta,\n.ace-clouds .ace_support.ace_constant.ace_property-value {\n color: #AF956F\n}\n\n.ace-clouds .ace_keyword.ace_operator {\n color: #484848\n}\n\n.ace-clouds .ace_keyword.ace_other.ace_unit {\n color: #96DC5F\n}\n\n.ace-clouds .ace_constant.ace_language {\n color: #39946A\n}\n\n.ace-clouds .ace_constant.ace_numeric {\n color: #46A609\n}\n\n.ace-clouds .ace_constant.ace_character.ace_entity {\n color: #BF78CC\n}\n\n.ace-clouds .ace_invalid {\n background-color: #FF002A\n}\n\n.ace-clouds .ace_fold {\n background-color: #AF956F;\n border-color: #000000\n}\n\n.ace-clouds .ace_storage,\n.ace-clouds .ace_support.ace_class,\n.ace-clouds .ace_support.ace_function,\n.ace-clouds .ace_support.ace_other,\n.ace-clouds .ace_support.ace_type {\n color: #C52727\n}\n\n.ace-clouds .ace_string {\n color: #5D90CD\n}\n\n.ace-clouds .ace_comment {\n color: #BCC8BA\n}\n\n.ace-clouds .ace_entity.ace_name.ace_tag,\n.ace-clouds .ace_entity.ace_other.ace_attribute-name {\n color: #606060\n}\n\n.ace-clouds .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\n}\n\n.ace-clouds .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-clouds"; -exports.cssText = ".ace-clouds .ace_gutter {\ -background: #ebebeb;\ -color: #333\ -}\ -.ace-clouds .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-clouds {\ -background-color: #FFFFFF;\ -color: #000000\ -}\ -.ace-clouds .ace_cursor {\ -color: #000000\ -}\ -.ace-clouds .ace_marker-layer .ace_selection {\ -background: #BDD5FC\ -}\ -.ace-clouds.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-clouds .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-clouds .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-clouds .ace_marker-layer .ace_active-line {\ -background: #FFFBD1\ -}\ -.ace-clouds .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-clouds .ace_marker-layer .ace_selected-word {\ -border: 1px solid #BDD5FC\ -}\ -.ace-clouds .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-clouds .ace_keyword,\ -.ace-clouds .ace_meta,\ -.ace-clouds .ace_support.ace_constant.ace_property-value {\ -color: #AF956F\ -}\ -.ace-clouds .ace_keyword.ace_operator {\ -color: #484848\ -}\ -.ace-clouds .ace_keyword.ace_other.ace_unit {\ -color: #96DC5F\ -}\ -.ace-clouds .ace_constant.ace_language {\ -color: #39946A\ -}\ -.ace-clouds .ace_constant.ace_numeric {\ -color: #46A609\ -}\ -.ace-clouds .ace_constant.ace_character.ace_entity {\ -color: #BF78CC\ -}\ -.ace-clouds .ace_invalid {\ -background-color: #FF002A\ -}\ -.ace-clouds .ace_fold {\ -background-color: #AF956F;\ -border-color: #000000\ -}\ -.ace-clouds .ace_storage,\ -.ace-clouds .ace_support.ace_class,\ -.ace-clouds .ace_support.ace_function,\ -.ace-clouds .ace_support.ace_other,\ -.ace-clouds .ace_support.ace_type {\ -color: #C52727\ -}\ -.ace-clouds .ace_string {\ -color: #5D90CD\ -}\ -.ace-clouds .ace_comment {\ -color: #BCC8BA\ -}\ -.ace-clouds .ace_entity.ace_name.ace_tag,\ -.ace-clouds .ace_entity.ace_other.ace_attribute-name {\ -color: #606060\ -}\ -.ace-clouds .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\ -}"; +}); +define("ace/theme/clouds",["require","exports","module","ace/theme/clouds-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-clouds"; +exports.cssText = require("./clouds-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/clouds"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-clouds_midnight.js b/app/Resources/ui/js/ace/theme-clouds_midnight.js index d88ece2..08739da 100644 --- a/app/Resources/ui/js/ace/theme-clouds_midnight.js +++ b/app/Resources/ui/js/ace/theme-clouds_midnight.js @@ -1,98 +1,13 @@ -define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/clouds_midnight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-clouds-midnight .ace_gutter {\n background: #232323;\n color: #929292\n}\n\n.ace-clouds-midnight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-clouds-midnight {\n background-color: #191919;\n color: #929292\n}\n\n.ace-clouds-midnight .ace_cursor {\n color: #7DA5DC\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_selection {\n background: #000000\n}\n\n.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #191919;\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_active-line {\n background: rgba(215, 215, 215, 0.031)\n}\n\n.ace-clouds-midnight .ace_gutter-active-line {\n background-color: rgba(215, 215, 215, 0.031)\n}\n\n.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\n border: 1px solid #000000\n}\n\n.ace-clouds-midnight .ace_invisible {\n color: #666\n}\n\n.ace-clouds-midnight .ace_keyword,\n.ace-clouds-midnight .ace_meta,\n.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\n color: #927C5D\n}\n\n.ace-clouds-midnight .ace_keyword.ace_operator {\n color: #4B4B4B\n}\n\n.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\n color: #366F1A\n}\n\n.ace-clouds-midnight .ace_constant.ace_language {\n color: #39946A\n}\n\n.ace-clouds-midnight .ace_constant.ace_numeric {\n color: #46A609\n}\n\n.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\n color: #A165AC\n}\n\n.ace-clouds-midnight .ace_invalid {\n color: #FFFFFF;\n background-color: #E92E2E\n}\n\n.ace-clouds-midnight .ace_fold {\n background-color: #927C5D;\n border-color: #929292\n}\n\n.ace-clouds-midnight .ace_storage,\n.ace-clouds-midnight .ace_support.ace_class,\n.ace-clouds-midnight .ace_support.ace_function,\n.ace-clouds-midnight .ace_support.ace_other,\n.ace-clouds-midnight .ace_support.ace_type {\n color: #E92E2E\n}\n\n.ace-clouds-midnight .ace_string {\n color: #5D90CD\n}\n\n.ace-clouds-midnight .ace_comment {\n color: #3C403B\n}\n\n.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\n.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\n color: #606060\n}\n\n.ace-clouds-midnight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-clouds-midnight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-clouds-midnight"; -exports.cssText = ".ace-clouds-midnight .ace_gutter {\ -background: #232323;\ -color: #929292\ -}\ -.ace-clouds-midnight .ace_print-margin {\ -width: 1px;\ -background: #232323\ -}\ -.ace-clouds-midnight {\ -background-color: #191919;\ -color: #929292\ -}\ -.ace-clouds-midnight .ace_cursor {\ -color: #7DA5DC\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_selection {\ -background: #000000\ -}\ -.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #191919;\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_active-line {\ -background: rgba(215, 215, 215, 0.031)\ -}\ -.ace-clouds-midnight .ace_gutter-active-line {\ -background-color: rgba(215, 215, 215, 0.031)\ -}\ -.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\ -border: 1px solid #000000\ -}\ -.ace-clouds-midnight .ace_invisible {\ -color: #666\ -}\ -.ace-clouds-midnight .ace_keyword,\ -.ace-clouds-midnight .ace_meta,\ -.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\ -color: #927C5D\ -}\ -.ace-clouds-midnight .ace_keyword.ace_operator {\ -color: #4B4B4B\ -}\ -.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\ -color: #366F1A\ -}\ -.ace-clouds-midnight .ace_constant.ace_language {\ -color: #39946A\ -}\ -.ace-clouds-midnight .ace_constant.ace_numeric {\ -color: #46A609\ -}\ -.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\ -color: #A165AC\ -}\ -.ace-clouds-midnight .ace_invalid {\ -color: #FFFFFF;\ -background-color: #E92E2E\ -}\ -.ace-clouds-midnight .ace_fold {\ -background-color: #927C5D;\ -border-color: #929292\ -}\ -.ace-clouds-midnight .ace_storage,\ -.ace-clouds-midnight .ace_support.ace_class,\ -.ace-clouds-midnight .ace_support.ace_function,\ -.ace-clouds-midnight .ace_support.ace_other,\ -.ace-clouds-midnight .ace_support.ace_type {\ -color: #E92E2E\ -}\ -.ace-clouds-midnight .ace_string {\ -color: #5D90CD\ -}\ -.ace-clouds-midnight .ace_comment {\ -color: #3C403B\ -}\ -.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\ -.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\ -color: #606060\ -}\ -.ace-clouds-midnight .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/clouds_midnight",["require","exports","module","ace/theme/clouds_midnight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-clouds-midnight"; +exports.cssText = require("./clouds_midnight-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/clouds_midnight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-cobalt.js b/app/Resources/ui/js/ace/theme-cobalt.js index 5459c75..53697f6 100644 --- a/app/Resources/ui/js/ace/theme-cobalt.js +++ b/app/Resources/ui/js/ace/theme-cobalt.js @@ -1,115 +1,13 @@ -define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/cobalt-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-cobalt .ace_gutter {\n background: #011e3a;\n color: rgb(128,145,160)\n}\n\n.ace-cobalt .ace_print-margin {\n width: 1px;\n background: #555555\n}\n\n.ace-cobalt {\n background-color: #002240;\n color: #FFFFFF\n}\n\n.ace-cobalt .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-cobalt .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-cobalt.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-cobalt .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-cobalt .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.15)\n}\n\n.ace-cobalt .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.35)\n}\n\n.ace-cobalt .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.35)\n}\n\n.ace-cobalt .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(179, 101, 57, 0.75)\n}\n\n.ace-cobalt .ace_invisible {\n color: rgba(255, 255, 255, 0.15)\n}\n\n.ace-cobalt .ace_keyword,\n.ace-cobalt .ace_meta {\n color: #FF9D00\n}\n\n.ace-cobalt .ace_constant,\n.ace-cobalt .ace_constant.ace_character,\n.ace-cobalt .ace_constant.ace_character.ace_escape,\n.ace-cobalt .ace_constant.ace_other {\n color: #FF628C\n}\n\n.ace-cobalt .ace_invalid {\n color: #F8F8F8;\n background-color: #800F00\n}\n\n.ace-cobalt .ace_support {\n color: #80FFBB\n}\n\n.ace-cobalt .ace_support.ace_constant {\n color: #EB939A\n}\n\n.ace-cobalt .ace_fold {\n background-color: #FF9D00;\n border-color: #FFFFFF\n}\n\n.ace-cobalt .ace_support.ace_function {\n color: #FFB054\n}\n\n.ace-cobalt .ace_storage {\n color: #FFEE80\n}\n\n.ace-cobalt .ace_entity {\n color: #FFDD00\n}\n\n.ace-cobalt .ace_string {\n color: #3AD900\n}\n\n.ace-cobalt .ace_string.ace_regexp {\n color: #80FFC2\n}\n\n.ace-cobalt .ace_comment {\n font-style: italic;\n color: #0088FF\n}\n\n.ace-cobalt .ace_heading,\n.ace-cobalt .ace_markup.ace_heading {\n color: #C8E4FD;\n background-color: #001221\n}\n\n.ace-cobalt .ace_list,\n.ace-cobalt .ace_markup.ace_list {\n background-color: #130D26\n}\n\n.ace-cobalt .ace_variable {\n color: #CCCCCC\n}\n\n.ace-cobalt .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-cobalt .ace_meta.ace_tag {\n color: #9EFFFF\n}\n\n.ace-cobalt .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-cobalt .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-cobalt"; -exports.cssText = ".ace-cobalt .ace_gutter {\ -background: #011e3a;\ -color: rgb(128,145,160)\ -}\ -.ace-cobalt .ace_print-margin {\ -width: 1px;\ -background: #555555\ -}\ -.ace-cobalt {\ -background-color: #002240;\ -color: #FFFFFF\ -}\ -.ace-cobalt .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-cobalt .ace_marker-layer .ace_selection {\ -background: rgba(179, 101, 57, 0.75)\ -}\ -.ace-cobalt.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002240;\ -}\ -.ace-cobalt .ace_marker-layer .ace_step {\ -background: rgb(127, 111, 19)\ -}\ -.ace-cobalt .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.15)\ -}\ -.ace-cobalt .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.35)\ -}\ -.ace-cobalt .ace_gutter-active-line {\ -background-color: rgba(0, 0, 0, 0.35)\ -}\ -.ace-cobalt .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(179, 101, 57, 0.75)\ -}\ -.ace-cobalt .ace_invisible {\ -color: rgba(255, 255, 255, 0.15)\ -}\ -.ace-cobalt .ace_keyword,\ -.ace-cobalt .ace_meta {\ -color: #FF9D00\ -}\ -.ace-cobalt .ace_constant,\ -.ace-cobalt .ace_constant.ace_character,\ -.ace-cobalt .ace_constant.ace_character.ace_escape,\ -.ace-cobalt .ace_constant.ace_other {\ -color: #FF628C\ -}\ -.ace-cobalt .ace_invalid {\ -color: #F8F8F8;\ -background-color: #800F00\ -}\ -.ace-cobalt .ace_support {\ -color: #80FFBB\ -}\ -.ace-cobalt .ace_support.ace_constant {\ -color: #EB939A\ -}\ -.ace-cobalt .ace_fold {\ -background-color: #FF9D00;\ -border-color: #FFFFFF\ -}\ -.ace-cobalt .ace_support.ace_function {\ -color: #FFB054\ -}\ -.ace-cobalt .ace_storage {\ -color: #FFEE80\ -}\ -.ace-cobalt .ace_entity {\ -color: #FFDD00\ -}\ -.ace-cobalt .ace_string {\ -color: #3AD900\ -}\ -.ace-cobalt .ace_string.ace_regexp {\ -color: #80FFC2\ -}\ -.ace-cobalt .ace_comment {\ -font-style: italic;\ -color: #0088FF\ -}\ -.ace-cobalt .ace_heading,\ -.ace-cobalt .ace_markup.ace_heading {\ -color: #C8E4FD;\ -background-color: #001221\ -}\ -.ace-cobalt .ace_list,\ -.ace-cobalt .ace_markup.ace_list {\ -background-color: #130D26\ -}\ -.ace-cobalt .ace_variable {\ -color: #CCCCCC\ -}\ -.ace-cobalt .ace_variable.ace_language {\ -color: #FF80E1\ -}\ -.ace-cobalt .ace_meta.ace_tag {\ -color: #9EFFFF\ -}\ -.ace-cobalt .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/cobalt",["require","exports","module","ace/theme/cobalt-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-cobalt"; +exports.cssText = require("./cobalt-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/cobalt"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-crimson_editor.js b/app/Resources/ui/js/ace/theme-crimson_editor.js index b162e5b..93d240f 100644 --- a/app/Resources/ui/js/ace/theme-crimson_editor.js +++ b/app/Resources/ui/js/ace/theme-crimson_editor.js @@ -1,120 +1,13 @@ -define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -exports.isDark = false; -exports.cssText = ".ace-crimson-editor .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow : hidden;\ -}\ -.ace-crimson-editor .ace_gutter-layer {\ -width: 100%;\ -text-align: right;\ -}\ -.ace-crimson-editor .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-crimson-editor {\ -background-color: #FFFFFF;\ -color: rgb(64, 64, 64);\ -}\ -.ace-crimson-editor .ace_cursor {\ -color: black;\ -}\ -.ace-crimson-editor .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-crimson-editor .ace_identifier {\ -color: black;\ -}\ -.ace-crimson-editor .ace_keyword {\ -color: blue;\ -}\ -.ace-crimson-editor .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-crimson-editor .ace_constant.ace_language {\ -color: rgb(255, 156, 0);\ -}\ -.ace-crimson-editor .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-crimson-editor .ace_invalid {\ -text-decoration: line-through;\ -color: rgb(224, 0, 0);\ -}\ -.ace-crimson-editor .ace_fold {\ -}\ -.ace-crimson-editor .ace_support.ace_function {\ -color: rgb(192, 0, 0);\ -}\ -.ace-crimson-editor .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-crimson-editor .ace_support.ace_type,\ -.ace-crimson-editor .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-crimson-editor .ace_keyword.ace_operator {\ -color: rgb(49, 132, 149);\ -}\ -.ace-crimson-editor .ace_string {\ -color: rgb(128, 0, 128);\ -}\ -.ace-crimson-editor .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-crimson-editor .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-crimson-editor .ace_constant.ace_numeric {\ -color: rgb(0, 0, 64);\ -}\ -.ace-crimson-editor .ace_variable {\ -color: rgb(0, 64, 128);\ -}\ -.ace-crimson-editor .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_active-line {\ -background: rgb(232, 242, 254);\ -}\ -.ace-crimson-editor .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-crimson-editor .ace_meta.ace_tag {\ -color:rgb(28, 2, 255);\ -}\ -.ace-crimson-editor .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-crimson-editor .ace_string.ace_regex {\ -color: rgb(192, 0, 192);\ -}\ -.ace-crimson-editor .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +define("ace/theme/crimson_editor-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-crimson-editor .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow : hidden;\n}\n\n.ace-crimson-editor .ace_gutter-layer {\n width: 100%;\n text-align: right;\n}\n\n.ace-crimson-editor .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-crimson-editor {\n background-color: #FFFFFF;\n color: rgb(64, 64, 64);\n}\n\n.ace-crimson-editor .ace_cursor {\n color: black;\n}\n\n.ace-crimson-editor .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-crimson-editor .ace_identifier {\n color: black;\n}\n\n.ace-crimson-editor .ace_keyword {\n color: blue;\n}\n\n.ace-crimson-editor .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-crimson-editor .ace_constant.ace_language {\n color: rgb(255, 156, 0);\n}\n\n.ace-crimson-editor .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-crimson-editor .ace_invalid {\n text-decoration: line-through;\n color: rgb(224, 0, 0);\n}\n\n.ace-crimson-editor .ace_fold {\n}\n\n.ace-crimson-editor .ace_support.ace_function {\n color: rgb(192, 0, 0);\n}\n\n.ace-crimson-editor .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-crimson-editor .ace_support.ace_type,\n.ace-crimson-editor .ace_support.ace_class {\n color: rgb(109, 121, 222);\n}\n\n.ace-crimson-editor .ace_keyword.ace_operator {\n color: rgb(49, 132, 149);\n}\n\n.ace-crimson-editor .ace_string {\n color: rgb(128, 0, 128);\n}\n\n.ace-crimson-editor .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-crimson-editor .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-crimson-editor .ace_constant.ace_numeric {\n color: rgb(0, 0, 64);\n}\n\n.ace-crimson-editor .ace_variable {\n color: rgb(0, 64, 128);\n}\n\n.ace-crimson-editor .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_active-line {\n background: rgb(232, 242, 254);\n}\n\n.ace-crimson-editor .ace_gutter-active-line {\n background-color : #dcdcdc;\n}\n\n.ace-crimson-editor .ace_meta.ace_tag {\n color:rgb(28, 2, 255);\n}\n\n.ace-crimson-editor .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-crimson-editor .ace_string.ace_regex {\n color: rgb(192, 0, 192);\n}\n\n.ace-crimson-editor .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-crimson-editor .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.cssClass = "ace-crimson-editor"; +}); +define("ace/theme/crimson_editor",["require","exports","module","ace/theme/crimson_editor-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssText = require("./crimson_editor-css"); +exports.cssClass = "ace-crimson-editor"; var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/crimson_editor"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dawn.js b/app/Resources/ui/js/ace/theme-dawn.js index 923dad6..46817fe 100644 --- a/app/Resources/ui/js/ace/theme-dawn.js +++ b/app/Resources/ui/js/ace/theme-dawn.js @@ -1,110 +1,13 @@ -define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/dawn-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-dawn .ace_gutter {\n background: #ebebeb;\n color: #333\n}\n\n.ace-dawn .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-dawn {\n background-color: #F9F9F9;\n color: #080808\n}\n\n.ace-dawn .ace_cursor {\n color: #000000\n}\n\n.ace-dawn .ace_marker-layer .ace_selection {\n background: rgba(39, 95, 255, 0.30)\n}\n\n.ace-dawn.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #F9F9F9;\n}\n\n.ace-dawn .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-dawn .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(75, 75, 126, 0.50)\n}\n\n.ace-dawn .ace_marker-layer .ace_active-line {\n background: rgba(36, 99, 180, 0.12)\n}\n\n.ace-dawn .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-dawn .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(39, 95, 255, 0.30)\n}\n\n.ace-dawn .ace_invisible {\n color: rgba(75, 75, 126, 0.50)\n}\n\n.ace-dawn .ace_keyword,\n.ace-dawn .ace_meta {\n color: #794938\n}\n\n.ace-dawn .ace_constant,\n.ace-dawn .ace_constant.ace_character,\n.ace-dawn .ace_constant.ace_character.ace_escape,\n.ace-dawn .ace_constant.ace_other {\n color: #811F24\n}\n\n.ace-dawn .ace_invalid.ace_illegal {\n text-decoration: underline;\n font-style: italic;\n color: #F8F8F8;\n background-color: #B52A1D\n}\n\n.ace-dawn .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #B52A1D\n}\n\n.ace-dawn .ace_support {\n color: #691C97\n}\n\n.ace-dawn .ace_support.ace_constant {\n color: #B4371F\n}\n\n.ace-dawn .ace_fold {\n background-color: #794938;\n border-color: #080808\n}\n\n.ace-dawn .ace_list,\n.ace-dawn .ace_markup.ace_list,\n.ace-dawn .ace_support.ace_function {\n color: #693A17\n}\n\n.ace-dawn .ace_storage {\n font-style: italic;\n color: #A71D5D\n}\n\n.ace-dawn .ace_string {\n color: #0B6125\n}\n\n.ace-dawn .ace_string.ace_regexp {\n color: #CF5628\n}\n\n.ace-dawn .ace_comment {\n font-style: italic;\n color: #5A525F\n}\n\n.ace-dawn .ace_heading,\n.ace-dawn .ace_markup.ace_heading {\n color: #19356D\n}\n\n.ace-dawn .ace_variable {\n color: #234A97\n}\n\n.ace-dawn .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-dawn .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-dawn"; -exports.cssText = ".ace-dawn .ace_gutter {\ -background: #ebebeb;\ -color: #333\ -}\ -.ace-dawn .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-dawn {\ -background-color: #F9F9F9;\ -color: #080808\ -}\ -.ace-dawn .ace_cursor {\ -color: #000000\ -}\ -.ace-dawn .ace_marker-layer .ace_selection {\ -background: rgba(39, 95, 255, 0.30)\ -}\ -.ace-dawn.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #F9F9F9;\ -}\ -.ace-dawn .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-dawn .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(75, 75, 126, 0.50)\ -}\ -.ace-dawn .ace_marker-layer .ace_active-line {\ -background: rgba(36, 99, 180, 0.12)\ -}\ -.ace-dawn .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-dawn .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(39, 95, 255, 0.30)\ -}\ -.ace-dawn .ace_invisible {\ -color: rgba(75, 75, 126, 0.50)\ -}\ -.ace-dawn .ace_keyword,\ -.ace-dawn .ace_meta {\ -color: #794938\ -}\ -.ace-dawn .ace_constant,\ -.ace-dawn .ace_constant.ace_character,\ -.ace-dawn .ace_constant.ace_character.ace_escape,\ -.ace-dawn .ace_constant.ace_other {\ -color: #811F24\ -}\ -.ace-dawn .ace_invalid.ace_illegal {\ -text-decoration: underline;\ -font-style: italic;\ -color: #F8F8F8;\ -background-color: #B52A1D\ -}\ -.ace-dawn .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #B52A1D\ -}\ -.ace-dawn .ace_support {\ -color: #691C97\ -}\ -.ace-dawn .ace_support.ace_constant {\ -color: #B4371F\ -}\ -.ace-dawn .ace_fold {\ -background-color: #794938;\ -border-color: #080808\ -}\ -.ace-dawn .ace_list,\ -.ace-dawn .ace_markup.ace_list,\ -.ace-dawn .ace_support.ace_function {\ -color: #693A17\ -}\ -.ace-dawn .ace_storage {\ -font-style: italic;\ -color: #A71D5D\ -}\ -.ace-dawn .ace_string {\ -color: #0B6125\ -}\ -.ace-dawn .ace_string.ace_regexp {\ -color: #CF5628\ -}\ -.ace-dawn .ace_comment {\ -font-style: italic;\ -color: #5A525F\ -}\ -.ace-dawn .ace_heading,\ -.ace-dawn .ace_markup.ace_heading {\ -color: #19356D\ -}\ -.ace-dawn .ace_variable {\ -color: #234A97\ -}\ -.ace-dawn .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/dawn",["require","exports","module","ace/theme/dawn-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-dawn"; +exports.cssText = require("./dawn-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dawn"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dracula.js b/app/Resources/ui/js/ace/theme-dracula.js index 3085b9d..e1e2f14 100644 --- a/app/Resources/ui/js/ace/theme-dracula.js +++ b/app/Resources/ui/js/ace/theme-dracula.js @@ -1,130 +1,14 @@ -define("ace/theme/dracula",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/dracula-css",["require","exports","module"], function(require, exports, module){module.exports = "/*\n * Copyright \u00A9 2017 Zeno Rocha \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201CSoftware\u201D), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \u201CAS IS\u201D, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n.ace-dracula .ace_gutter {\n background: #282a36;\n color: rgb(144,145,148)\n}\n\n.ace-dracula .ace_print-margin {\n width: 1px;\n background: #44475a\n}\n\n.ace-dracula {\n background-color: #282a36;\n color: #f8f8f2\n}\n\n.ace-dracula .ace_cursor {\n color: #f8f8f0\n}\n\n.ace-dracula .ace_marker-layer .ace_selection {\n background: #44475a\n}\n\n.ace-dracula.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #282a36;\n border-radius: 2px\n}\n\n.ace-dracula .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-dracula .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #a29709\n}\n\n.ace-dracula .ace_marker-layer .ace_active-line {\n background: #44475a\n}\n\n.ace-dracula .ace_gutter-active-line {\n background-color: #44475a\n}\n\n.ace-dracula .ace_marker-layer .ace_selected-word {\n box-shadow: 0px 0px 0px 1px #a29709;\n border-radius: 3px;\n}\n\n.ace-dracula .ace_fold {\n background-color: #50fa7b;\n border-color: #f8f8f2\n}\n\n.ace-dracula .ace_keyword {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_language {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_numeric {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character {\n color: #bd93f9\n}\n\n.ace-dracula .ace_constant.ace_character.ace_escape {\n color: #ff79c6\n}\n\n.ace-dracula .ace_constant.ace_other {\n color: #bd93f9\n}\n\n.ace-dracula .ace_support.ace_function {\n color: #8be9fd\n}\n\n.ace-dracula .ace_support.ace_constant {\n color: #6be5fd\n}\n\n.ace-dracula .ace_support.ace_class {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_support.ace_type {\n font-style: italic;\n color: #66d9ef\n}\n\n.ace-dracula .ace_storage {\n color: #ff79c6\n}\n\n.ace-dracula .ace_storage.ace_type {\n font-style: italic;\n color: #8be9fd\n}\n\n.ace-dracula .ace_invalid {\n color: #F8F8F0;\n background-color: #ff79c6\n}\n\n.ace-dracula .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #bd93f9\n}\n\n.ace-dracula .ace_string {\n color: #f1fa8c\n}\n\n.ace-dracula .ace_comment {\n color: #6272a4\n}\n\n.ace-dracula .ace_variable {\n color: #50fa7b\n}\n\n.ace-dracula .ace_variable.ace_parameter {\n font-style: italic;\n color: #ffb86c\n}\n\n.ace-dracula .ace_entity.ace_other.ace_attribute-name {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_function {\n color: #50fa7b\n}\n\n.ace-dracula .ace_entity.ace_name.ace_tag {\n color: #ff79c6\n}\n.ace-dracula .ace_invisible {\n color: #626680;\n}\n\n.ace-dracula .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-dracula .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACAQMAAACjTyRkAAAABlBMVEUAAADCwsK76u2xAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjYGBoAAAAhACBGFbxzQAAAABJRU5ErkJggg==\") right repeat-y;\n}\n"; -exports.isDark = true; +}); + +define("ace/theme/dracula",["require","exports","module","ace/theme/dracula-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; exports.cssClass = "ace-dracula"; -exports.cssText = "\ -.ace-dracula .ace_gutter {\ -background: #282a36;\ -color: rgb(144,145,148)\ -}\ -.ace-dracula .ace_print-margin {\ -width: 1px;\ -background: #44475a\ -}\ -.ace-dracula {\ -background-color: #282a36;\ -color: #f8f8f2\ -}\ -.ace-dracula .ace_cursor {\ -color: #f8f8f0\ -}\ -.ace-dracula .ace_marker-layer .ace_selection {\ -background: #44475a\ -}\ -.ace-dracula.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #282a36;\ -border-radius: 2px\ -}\ -.ace-dracula .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-dracula .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #a29709\ -}\ -.ace-dracula .ace_marker-layer .ace_active-line {\ -background: #44475a\ -}\ -.ace-dracula .ace_gutter-active-line {\ -background-color: #44475a\ -}\ -.ace-dracula .ace_marker-layer .ace_selected-word {\ -box-shadow: 0px 0px 0px 1px #a29709;\ -border-radius: 3px;\ -}\ -.ace-dracula .ace_fold {\ -background-color: #50fa7b;\ -border-color: #f8f8f2\ -}\ -.ace-dracula .ace_keyword {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_constant.ace_language {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_numeric {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_character {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_constant.ace_character.ace_escape {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_constant.ace_other {\ -color: #bd93f9\ -}\ -.ace-dracula .ace_support.ace_function {\ -color: #8be9fd\ -}\ -.ace-dracula .ace_support.ace_constant {\ -color: #6be5fd\ -}\ -.ace-dracula .ace_support.ace_class {\ -font-style: italic;\ -color: #66d9ef\ -}\ -.ace-dracula .ace_support.ace_type {\ -font-style: italic;\ -color: #66d9ef\ -}\ -.ace-dracula .ace_storage {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_storage.ace_type {\ -font-style: italic;\ -color: #8be9fd\ -}\ -.ace-dracula .ace_invalid {\ -color: #F8F8F0;\ -background-color: #ff79c6\ -}\ -.ace-dracula .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #bd93f9\ -}\ -.ace-dracula .ace_string {\ -color: #f1fa8c\ -}\ -.ace-dracula .ace_comment {\ -color: #6272a4\ -}\ -.ace-dracula .ace_variable {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #ffb86c\ -}\ -.ace-dracula .ace_entity.ace_other.ace_attribute-name {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_entity.ace_name.ace_function {\ -color: #50fa7b\ -}\ -.ace-dracula .ace_entity.ace_name.ace_tag {\ -color: #ff79c6\ -}\ -.ace-dracula .ace_invisible {\ -color: #626680;\ -}\ -.ace-dracula .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +exports.cssText = require("./dracula-css"); exports.$selectionColorConflict = true; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dracula"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-dreamweaver.js b/app/Resources/ui/js/ace/theme-dreamweaver.js index fa9771e..1e4c5c8 100644 --- a/app/Resources/ui/js/ace/theme-dreamweaver.js +++ b/app/Resources/ui/js/ace/theme-dreamweaver.js @@ -1,143 +1,13 @@ -define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -exports.isDark = false; -exports.cssClass = "ace-dreamweaver"; -exports.cssText = ".ace-dreamweaver .ace_gutter {\ -background: #e8e8e8;\ -color: #333;\ -}\ -.ace-dreamweaver .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-dreamweaver {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-dreamweaver .ace_fold {\ -background-color: #757AD8;\ -}\ -.ace-dreamweaver .ace_cursor {\ -color: black;\ -}\ -.ace-dreamweaver .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-dreamweaver .ace_storage,\ -.ace-dreamweaver .ace_keyword {\ -color: blue;\ -}\ -.ace-dreamweaver .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-dreamweaver .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-dreamweaver .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-dreamweaver .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-dreamweaver .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-dreamweaver .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-dreamweaver .ace_support.ace_type,\ -.ace-dreamweaver .ace_support.ace_class {\ -color: #009;\ -}\ -.ace-dreamweaver .ace_support.ace_php_tag {\ -color: #f00;\ -}\ -.ace-dreamweaver .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-dreamweaver .ace_string {\ -color: #00F;\ -}\ -.ace-dreamweaver .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-dreamweaver .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-dreamweaver .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-dreamweaver .ace_variable {\ -color: #06F\ -}\ -.ace-dreamweaver .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-dreamweaver .ace_entity.ace_name.ace_function {\ -color: #00F;\ -}\ -.ace-dreamweaver .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-dreamweaver .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-dreamweaver .ace_gutter-active-line {\ -background-color : #DCDCDC;\ -}\ -.ace-dreamweaver .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-dreamweaver .ace_meta.ace_tag {\ -color:#009;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\ -color:#060;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_form {\ -color:#F90;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_image {\ -color:#909;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_script {\ -color:#900;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_style {\ -color:#909;\ -}\ -.ace-dreamweaver .ace_meta.ace_tag.ace_table {\ -color:#099;\ -}\ -.ace-dreamweaver .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-dreamweaver .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +define("ace/theme/dreamweaver-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-dreamweaver .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-dreamweaver .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-dreamweaver {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-dreamweaver .ace_fold {\n background-color: #757AD8;\n}\n\n.ace-dreamweaver .ace_cursor {\n color: black;\n}\n \n.ace-dreamweaver .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-dreamweaver .ace_storage,\n.ace-dreamweaver .ace_keyword {\n color: blue;\n}\n\n.ace-dreamweaver .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-dreamweaver .ace_constant.ace_language {\n color: rgb(88, 92, 246);\n}\n\n.ace-dreamweaver .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-dreamweaver .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-dreamweaver .ace_support.ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-dreamweaver .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-dreamweaver .ace_support.ace_type,\n.ace-dreamweaver .ace_support.ace_class {\n color: #009;\n}\n\n.ace-dreamweaver .ace_support.ace_php_tag {\n color: #f00;\n}\n\n.ace-dreamweaver .ace_keyword.ace_operator {\n color: rgb(104, 118, 135);\n}\n\n.ace-dreamweaver .ace_string {\n color: #00F;\n}\n\n.ace-dreamweaver .ace_comment {\n color: rgb(76, 136, 107);\n}\n\n.ace-dreamweaver .ace_comment.ace_doc {\n color: rgb(0, 102, 255);\n}\n\n.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\n color: rgb(128, 159, 191);\n}\n\n.ace-dreamweaver .ace_constant.ace_numeric {\n color: rgb(0, 0, 205);\n}\n\n.ace-dreamweaver .ace_variable {\n color: #06F\n}\n\n.ace-dreamweaver .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-dreamweaver .ace_entity.ace_name.ace_function {\n color: #00F;\n}\n\n\n.ace-dreamweaver .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-dreamweaver .ace_list {\n color:rgb(185, 6, 144);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-dreamweaver .ace_gutter-active-line {\n background-color : #DCDCDC;\n}\n\n.ace-dreamweaver .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-dreamweaver .ace_meta.ace_tag {\n color:#009;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\n color:#060;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_form {\n color:#F90;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_image {\n color:#909;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_script {\n color:#900;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_style {\n color:#909;\n}\n\n.ace-dreamweaver .ace_meta.ace_tag.ace_table {\n color:#099;\n}\n\n.ace-dreamweaver .ace_string.ace_regex {\n color: rgb(255, 0, 0)\n}\n\n.ace-dreamweaver .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-dreamweaver .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; + +}); +define("ace/theme/dreamweaver",["require","exports","module","ace/theme/dreamweaver-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-dreamweaver"; +exports.cssText = require("./dreamweaver-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/dreamweaver"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-eclipse.js b/app/Resources/ui/js/ace/theme-eclipse.js index 5deddde..1163cb3 100644 --- a/app/Resources/ui/js/ace/theme-eclipse.js +++ b/app/Resources/ui/js/ace/theme-eclipse.js @@ -1,100 +1,14 @@ -define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; +define("ace/theme/eclipse-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-eclipse .ace_gutter {\n background: #ebebeb;\n border-right: 1px solid rgb(159, 159, 159);\n color: rgb(136, 136, 136);\n}\n\n.ace-eclipse .ace_print-margin {\n width: 1px;\n background: #ebebeb;\n}\n\n.ace-eclipse {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-eclipse .ace_fold {\n background-color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_cursor {\n color: black;\n}\n\n.ace-eclipse .ace_storage,\n.ace-eclipse .ace_keyword,\n.ace-eclipse .ace_variable {\n color: rgb(127, 0, 85);\n}\n\n.ace-eclipse .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-eclipse .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-eclipse .ace_function {\n color: rgb(60, 76, 114);\n}\n\n.ace-eclipse .ace_string {\n color: rgb(42, 0, 255);\n}\n\n.ace-eclipse .ace_comment {\n color: rgb(113, 150, 130);\n}\n\n.ace-eclipse .ace_comment.ace_doc {\n color: rgb(63, 95, 191);\n}\n\n.ace-eclipse .ace_comment.ace_doc.ace_tag {\n color: rgb(127, 159, 191);\n}\n\n.ace-eclipse .ace_constant.ace_numeric {\n color: darkblue;\n}\n\n.ace-eclipse .ace_tag {\n color: rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_type {\n color: rgb(127, 0, 127);\n}\n\n.ace-eclipse .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-eclipse .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-eclipse .ace_meta.ace_tag {\n color:rgb(25, 118, 116);\n}\n\n.ace-eclipse .ace_invisible {\n color: #ddd;\n}\n\n.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\n color:rgb(127, 0, 127);\n}\n.ace-eclipse .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0);\n}\n\n.ace-eclipse .ace_active-line {\n background: rgb(232, 242, 254);\n}\n\n.ace-eclipse .ace_gutter-active-line {\n background-color : #DADADA;\n}\n\n.ace-eclipse .ace_marker-layer .ace_selected-word {\n border: 1px solid rgb(181, 213, 255);\n}\n\n.ace-eclipse .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-eclipse .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssText = ".ace-eclipse .ace_gutter {\ -background: #ebebeb;\ -border-right: 1px solid rgb(159, 159, 159);\ -color: rgb(136, 136, 136);\ -}\ -.ace-eclipse .ace_print-margin {\ -width: 1px;\ -background: #ebebeb;\ -}\ -.ace-eclipse {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-eclipse .ace_fold {\ -background-color: rgb(60, 76, 114);\ -}\ -.ace-eclipse .ace_cursor {\ -color: black;\ -}\ -.ace-eclipse .ace_storage,\ -.ace-eclipse .ace_keyword,\ -.ace-eclipse .ace_variable {\ -color: rgb(127, 0, 85);\ -}\ -.ace-eclipse .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-eclipse .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-eclipse .ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-eclipse .ace_string {\ -color: rgb(42, 0, 255);\ -}\ -.ace-eclipse .ace_comment {\ -color: rgb(113, 150, 130);\ -}\ -.ace-eclipse .ace_comment.ace_doc {\ -color: rgb(63, 95, 191);\ -}\ -.ace-eclipse .ace_comment.ace_doc.ace_tag {\ -color: rgb(127, 159, 191);\ -}\ -.ace-eclipse .ace_constant.ace_numeric {\ -color: darkblue;\ -}\ -.ace-eclipse .ace_tag {\ -color: rgb(25, 118, 116);\ -}\ -.ace-eclipse .ace_type {\ -color: rgb(127, 0, 127);\ -}\ -.ace-eclipse .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-eclipse .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-eclipse .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-eclipse .ace_meta.ace_tag {\ -color:rgb(25, 118, 116);\ -}\ -.ace-eclipse .ace_invisible {\ -color: #ddd;\ -}\ -.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\ -color:rgb(127, 0, 127);\ -}\ -.ace-eclipse .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0);\ -}\ -.ace-eclipse .ace_active-line {\ -background: rgb(232, 242, 254);\ -}\ -.ace-eclipse .ace_gutter-active-line {\ -background-color : #DADADA;\ -}\ -.ace-eclipse .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgb(181, 213, 255);\ -}\ -.ace-eclipse .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +}); +define("ace/theme/eclipse",["require","exports","module","ace/theme/eclipse-css","ace/lib/dom"], function(require, exports, module){"use strict"; +exports.isDark = false; +exports.cssText = require("./eclipse-css"); exports.cssClass = "ace-eclipse"; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/eclipse"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-github.js b/app/Resources/ui/js/ace/theme-github.js index 12d70bc..80bffa3 100644 --- a/app/Resources/ui/js/ace/theme-github.js +++ b/app/Resources/ui/js/ace/theme-github.js @@ -1,105 +1,13 @@ -define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/github-css",["require","exports","module"], function(require, exports, module){module.exports = "/* CSS style content from github's default pygments highlighter template.\n Cursor and selection styles from textmate.css. */\n.ace-github .ace_gutter {\n background: #e8e8e8;\n color: #AAA;\n}\n\n.ace-github {\n background: #fff;\n color: #000;\n}\n\n.ace-github .ace_keyword {\n font-weight: bold;\n}\n\n.ace-github .ace_string {\n color: #D14;\n}\n\n.ace-github .ace_variable.ace_class {\n color: teal;\n}\n\n.ace-github .ace_constant.ace_numeric {\n color: #099;\n}\n\n.ace-github .ace_constant.ace_buildin {\n color: #0086B3;\n}\n\n.ace-github .ace_support.ace_function {\n color: #0086B3;\n}\n\n.ace-github .ace_comment {\n color: #998;\n font-style: italic;\n}\n\n.ace-github .ace_variable.ace_language {\n color: #0086B3;\n}\n\n.ace-github .ace_paren {\n font-weight: bold;\n}\n\n.ace-github .ace_boolean {\n font-weight: bold;\n}\n\n.ace-github .ace_string.ace_regexp {\n color: #009926;\n font-weight: normal;\n}\n\n.ace-github .ace_variable.ace_instance {\n color: teal;\n}\n\n.ace-github .ace_constant.ace_language {\n font-weight: bold;\n}\n\n.ace-github .ace_cursor {\n color: black;\n}\n\n.ace-github.ace_focus .ace_marker-layer .ace_active-line {\n background: rgb(255, 255, 204);\n}\n.ace-github .ace_marker-layer .ace_active-line {\n background: rgb(245, 245, 245);\n}\n\n.ace-github .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-github.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px white;\n}\n/* bold keywords cause cursor issues for some fonts */\n/* this disables bold style for editor and keeps for static highlighter */\n.ace-github.ace_nobold .ace_line > span {\n font-weight: normal !important;\n}\n\n.ace-github .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-github .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-github .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-github .ace_gutter-active-line {\n background-color : rgba(0, 0, 0, 0.07);\n}\n\n.ace-github .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-github .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-github .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-github .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; +}); + +define("ace/theme/github",["require","exports","module","ace/theme/github-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; exports.cssClass = "ace-github"; -exports.cssText = "\ -.ace-github .ace_gutter {\ -background: #e8e8e8;\ -color: #AAA;\ -}\ -.ace-github {\ -background: #fff;\ -color: #000;\ -}\ -.ace-github .ace_keyword {\ -font-weight: bold;\ -}\ -.ace-github .ace_string {\ -color: #D14;\ -}\ -.ace-github .ace_variable.ace_class {\ -color: teal;\ -}\ -.ace-github .ace_constant.ace_numeric {\ -color: #099;\ -}\ -.ace-github .ace_constant.ace_buildin {\ -color: #0086B3;\ -}\ -.ace-github .ace_support.ace_function {\ -color: #0086B3;\ -}\ -.ace-github .ace_comment {\ -color: #998;\ -font-style: italic;\ -}\ -.ace-github .ace_variable.ace_language {\ -color: #0086B3;\ -}\ -.ace-github .ace_paren {\ -font-weight: bold;\ -}\ -.ace-github .ace_boolean {\ -font-weight: bold;\ -}\ -.ace-github .ace_string.ace_regexp {\ -color: #009926;\ -font-weight: normal;\ -}\ -.ace-github .ace_variable.ace_instance {\ -color: teal;\ -}\ -.ace-github .ace_constant.ace_language {\ -font-weight: bold;\ -}\ -.ace-github .ace_cursor {\ -color: black;\ -}\ -.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ -background: rgb(255, 255, 204);\ -}\ -.ace-github .ace_marker-layer .ace_active-line {\ -background: rgb(245, 245, 245);\ -}\ -.ace-github .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-github.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-github.ace_nobold .ace_line > span {\ -font-weight: normal !important;\ -}\ -.ace-github .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-github .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-github .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-github .ace_gutter-active-line {\ -background-color : rgba(0, 0, 0, 0.07);\ -}\ -.ace-github .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-github .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-github .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-github .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}"; +exports.cssText = require("./github-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass, false); }); (function() { window.require(["ace/theme/github"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gob.js b/app/Resources/ui/js/ace/theme-gob.js index 7326db1..ae5e4c0 100644 --- a/app/Resources/ui/js/ace/theme-gob.js +++ b/app/Resources/ui/js/ace/theme-gob.js @@ -1,114 +1,13 @@ -define("ace/theme/gob",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gob-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gob .ace_gutter {\n background: #0B1818;\n color: #03EE03\n}\n\n.ace-gob .ace_print-margin {\n width: 1px;\n background: #131313\n}\n\n.ace-gob {\n background-color: #0B0B0B;\n color: #00FF00\n}\n\n.ace-gob .ace_cursor {\n border-color: rgba(16, 248, 255, 0.90);\n background-color: rgba(16, 240, 248, 0.70);\n opacity: 0.4;\n}\n\n.ace-gob .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-gob.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-gob .ace_marker-layer .ace_step {\n background: rgb(16, 128, 0)\n}\n\n.ace-gob .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(64, 255, 255, 0.25)\n}\n\n.ace-gob .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(192, 240, 255, 0.20)\n}\n\n.ace-gob .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-gob .ace_keyword,\n.ace-gob .ace_meta {\n color: #10D8E8\n}\n\n.ace-gob .ace_constant,\n.ace-gob .ace_constant.ace_character,\n.ace-gob .ace_constant.ace_character.ace_escape,\n.ace-gob .ace_constant.ace_other,\n.ace-gob .ace_heading,\n.ace-gob .ace_markup.ace_heading,\n.ace-gob .ace_support.ace_constant {\n color: #10F0A0\n}\n\n.ace-gob .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-gob .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #20F8C0\n}\n\n.ace-gob .ace_support {\n color: #20E8B0\n}\n\n.ace-gob .ace_fold {\n background-color: #50B8B8;\n border-color: #70F8F8\n}\n\n.ace-gob .ace_support.ace_function {\n color: #00F800\n}\n\n.ace-gob .ace_list,\n.ace-gob .ace_markup.ace_list,\n.ace-gob .ace_storage {\n color: #10FF98\n}\n\n.ace-gob .ace_entity.ace_name.ace_function,\n.ace-gob .ace_meta.ace_tag,\n.ace-gob .ace_variable {\n color: #00F868\n}\n\n.ace-gob .ace_string {\n color: #10F060\n}\n\n.ace-gob .ace_string.ace_regexp {\n color: #20F090;\n}\n\n.ace-gob .ace_comment {\n font-style: italic;\n color: #00E060;\n}\n\n.ace-gob .ace_variable {\n color: #00F888;\n}\n\n.ace-gob .ace_xml-pe {\n color: #488858;\n}\n\n.ace-gob .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-gob .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gob"; -exports.cssText = ".ace-gob .ace_gutter {\ -background: #0B1818;\ -color: #03EE03\ -}\ -.ace-gob .ace_print-margin {\ -width: 1px;\ -background: #131313\ -}\ -.ace-gob {\ -background-color: #0B0B0B;\ -color: #00FF00\ -}\ -.ace-gob .ace_cursor {\ -border-color: rgba(16, 248, 255, 0.90);\ -background-color: rgba(16, 240, 248, 0.70);\ -opacity: 0.4;\ -}\ -.ace-gob .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-gob.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #141414;\ -}\ -.ace-gob .ace_marker-layer .ace_step {\ -background: rgb(16, 128, 0)\ -}\ -.ace-gob .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(64, 255, 255, 0.25)\ -}\ -.ace-gob .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.04)\ -}\ -.ace-gob .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.04)\ -}\ -.ace-gob .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(192, 240, 255, 0.20)\ -}\ -.ace-gob .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-gob .ace_keyword,\ -.ace-gob .ace_meta {\ -color: #10D8E8\ -}\ -.ace-gob .ace_constant,\ -.ace-gob .ace_constant.ace_character,\ -.ace-gob .ace_constant.ace_character.ace_escape,\ -.ace-gob .ace_constant.ace_other,\ -.ace-gob .ace_heading,\ -.ace-gob .ace_markup.ace_heading,\ -.ace-gob .ace_support.ace_constant {\ -color: #10F0A0\ -}\ -.ace-gob .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-gob .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #20F8C0\ -}\ -.ace-gob .ace_support {\ -color: #20E8B0\ -}\ -.ace-gob .ace_fold {\ -background-color: #50B8B8;\ -border-color: #70F8F8\ -}\ -.ace-gob .ace_support.ace_function {\ -color: #00F800\ -}\ -.ace-gob .ace_list,\ -.ace-gob .ace_markup.ace_list,\ -.ace-gob .ace_storage {\ -color: #10FF98\ -}\ -.ace-gob .ace_entity.ace_name.ace_function,\ -.ace-gob .ace_meta.ace_tag,\ -.ace-gob .ace_variable {\ -color: #00F868\ -}\ -.ace-gob .ace_string {\ -color: #10F060\ -}\ -.ace-gob .ace_string.ace_regexp {\ -color: #20F090;\ -}\ -.ace-gob .ace_comment {\ -font-style: italic;\ -color: #00E060;\ -}\ -.ace-gob .ace_variable {\ -color: #00F888;\ -}\ -.ace-gob .ace_xml-pe {\ -color: #488858;\ -}\ -.ace-gob .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/gob",["require","exports","module","ace/theme/gob-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gob"; +exports.cssText = require("./gob-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gob"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gruvbox.js b/app/Resources/ui/js/ace/theme-gruvbox.js index c52e8f0..edd4ede 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox.js +++ b/app/Resources/ui/js/ace/theme-gruvbox.js @@ -1,81 +1,10 @@ -define("ace/theme/gruvbox",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox .ace_gutter-active-line {\n background-color: #3C3836;\n}\n\n.ace-gruvbox {\n color: #EBDAB4;\n background-color: #1D2021;\n}\n\n.ace-gruvbox .ace_invisible {\n color: #504945;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-gruvbox .ace_keyword {\n color: #8ec07c;\n}\n\n.ace-gruvbox .ace_comment {\n font-style: italic;\n color: #928375;\n}\n\n.ace-gruvbox .ace-statement {\n color: red;\n}\n\n.ace-gruvbox .ace_variable {\n color: #84A598;\n}\n\n.ace-gruvbox .ace_variable.ace_language {\n color: #D2879B;\n}\n\n.ace-gruvbox .ace_constant {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_language {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_numeric {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_string {\n color: #B8BA37;\n}\n\n.ace-gruvbox .ace_support {\n color: #F9BC41;\n}\n\n.ace-gruvbox .ace_support.ace_function {\n color: #F84B3C;\n}\n\n.ace-gruvbox .ace_storage {\n color: #8FBF7F;\n}\n\n.ace-gruvbox .ace_keyword.ace_operator {\n color: #EBDAB4;\n}\n\n.ace-gruvbox .ace_punctuation.ace_operator {\n color: yellow;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_active-line {\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n}\n\n.ace-gruvbox .ace_print-margin {\n width: 5px;\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\n}\n\n.ace-gruvbox .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gruvbox"; -exports.cssText = ".ace-gruvbox .ace_gutter-active-line {\ -background-color: #3C3836;\ -}\ -.ace-gruvbox {\ -color: #EBDAB4;\ -background-color: #1D2021;\ -}\ -.ace-gruvbox .ace_invisible {\ -color: #504945;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_selection {\ -background: rgba(179, 101, 57, 0.75)\ -}\ -.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002240;\ -}\ -.ace-gruvbox .ace_keyword {\ -color: #8ec07c;\ -}\ -.ace-gruvbox .ace_comment {\ -font-style: italic;\ -color: #928375;\ -}\ -.ace-gruvbox .ace-statement {\ -color: red;\ -}\ -.ace-gruvbox .ace_variable {\ -color: #84A598;\ -}\ -.ace-gruvbox .ace_variable.ace_language {\ -color: #D2879B;\ -}\ -.ace-gruvbox .ace_constant {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_constant.ace_language {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_constant.ace_numeric {\ -color: #C2859A;\ -}\ -.ace-gruvbox .ace_string {\ -color: #B8BA37;\ -}\ -.ace-gruvbox .ace_support {\ -color: #F9BC41;\ -}\ -.ace-gruvbox .ace_support.ace_function {\ -color: #F84B3C;\ -}\ -.ace-gruvbox .ace_storage {\ -color: #8FBF7F;\ -}\ -.ace-gruvbox .ace_keyword.ace_operator {\ -color: #EBDAB4;\ -}\ -.ace-gruvbox .ace_punctuation.ace_operator {\ -color: yellow;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_active-line {\ -background: #3C3836;\ -}\ -.ace-gruvbox .ace_marker-layer .ace_selected-word {\ -border-radius: 4px;\ -border: 8px solid #3f475d;\ -}\ -.ace-gruvbox .ace_print-margin {\ -width: 5px;\ -background: #3C3836;\ -}\ -.ace-gruvbox .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\ -}"; +}); +define("ace/theme/gruvbox",["require","exports","module","ace/theme/gruvbox-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gruvbox"; +exports.cssText = require("./gruvbox-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); diff --git a/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js index 3c6ae39..cbf33ea 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js +++ b/app/Resources/ui/js/ace/theme-gruvbox_dark_hard.js @@ -1,132 +1,13 @@ -define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox_dark_hard-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox-dark-hard .ace_gutter {\n background: #1d2021;\n color: rgb(132,126,106)\n}\n\n.ace-gruvbox-dark-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-dark-hard {\n background-color: #1d2021;\n color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_cursor {\n color: #a89984\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1d2021;\n border-radius: 2px\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(235, 219, 178, 0.15)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_gutter-active-line {\n background-color: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_fold {\n background-color: #b8bb26;\n border-color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_keyword {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-dark-hard .ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_other {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_function {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_class {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_type {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_storage {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_invalid {\n color: #f9f5d7;\n background-color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_string {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_string.ace_regexp {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-dark-hard .ace_variable {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_language {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_meta.ace_tag {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_heading {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_list {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-gruvbox-dark-hard"; -exports.cssText = ".ace-gruvbox-dark-hard .ace_gutter {\ -background: #1d2021;\ -color: rgb(132,126,106)\ -}\ -.ace-gruvbox-dark-hard .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-gruvbox-dark-hard {\ -background-color: #1d2021;\ -color: rgba(235, 219, 178, 0.50)\ -}\ -.ace-gruvbox-dark-hard .ace_cursor {\ -color: #a89984\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\ -background: #3c3836\ -}\ -.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1d2021;\ -border-radius: 2px\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(235, 219, 178, 0.15)\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\ -background: #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_gutter-active-line {\ -background-color: #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\ -border: 1px solid #3c3836\ -}\ -.ace-gruvbox-dark-hard .ace_fold {\ -background-color: #b8bb26;\ -border-color: rgba(235, 219, 178, 0.50)\ -}\ -.ace-gruvbox-dark-hard .ace_keyword {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\ -color: #8ec07c\ -}\ -.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\ -color: #b16286\ -}\ -.ace-gruvbox-dark-hard .ace_constant {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_constant.ace_other {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_function {\ -color: #8ec07c\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_constant {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_class {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_support.ace_type {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_storage {\ -color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_invalid {\ -color: #f9f5d7;\ -background-color: #fb4934\ -}\ -.ace-gruvbox-dark-hard .ace_string {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_string.ace_regexp {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_comment {\ -font-style: italic;\ -color: #928374\ -}\ -.ace-gruvbox-dark-hard .ace_variable {\ -color: #83a598\ -}\ -.ace-gruvbox-dark-hard .ace_variable.ace_language {\ -color: #d3869b\ -}\ -.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_meta.ace_tag {\ -color: #f9f5d7\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\ -color: #fabd2f\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\ -color: #83a598\ -}\ -.ace-gruvbox-dark-hard .ace_markup.ace_heading {\ -color: #b8bb26\ -}\ -.ace-gruvbox-dark-hard .ace_markup.ace_list {\ -color: #83a598\ -}"; +}); +define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/theme/gruvbox_dark_hard-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-gruvbox-dark-hard"; +exports.cssText = require("./gruvbox_dark_hard-css"); var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); +dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gruvbox_dark_hard"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js index 403d4b6..83aa831 100644 --- a/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js +++ b/app/Resources/ui/js/ace/theme-gruvbox_light_hard.js @@ -1,132 +1,13 @@ -define("ace/theme/gruvbox_light_hard",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/gruvbox_light_hard-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-gruvbox-light-hard .ace_gutter {\n background: #f9f5d7;\n color: rgb(155,151,135)\n}\n\n.ace-gruvbox-light-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-light-hard {\n background-color: #f9f5d7;\n color: rgba(60, 56, 54, 0.50)\n}\n\n.ace-gruvbox-light-hard .ace_cursor {\n color: #7c6f64\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_selection {\n background: #ebdbb2\n}\n\n.ace-gruvbox-light-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #f9f5d7;\n border-radius: 2px\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(60, 56, 54, 0.15)\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_active-line {\n background: #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_gutter-active-line {\n background-color: #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #ebdbb2\n}\n\n.ace-gruvbox-light-hard .ace_fold {\n background-color: #79740e;\n border-color: rgba(60, 56, 54, 0.50)\n}\n\n.ace-gruvbox-light-hard .ace_keyword {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_keyword.ace_operator {\n color: #427b58\n}\n\n.ace-gruvbox-light-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-light-hard .ace_constant {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_numeric {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_character.ace_escape {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_constant.ace_other {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_function {\n color: #427b58\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_constant {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_constant.ace_property-value {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_class {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_support.ace_type {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_storage {\n color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_invalid {\n color: #1d2021;\n background-color: #9d0006\n}\n\n.ace-gruvbox-light-hard .ace_string {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_string.ace_regexp {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-light-hard .ace_variable {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_variable.ace_language {\n color: #8f3f71\n}\n\n.ace-gruvbox-light-hard .ace_variable.ace_parameter {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_meta.ace_tag {\n color: #1d2021\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_other.ace_attribute-name {\n color: #b57614\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_name.ace_function {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_entity.ace_name.ace_tag {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_markup.ace_heading {\n color: #79740e\n}\n\n.ace-gruvbox-light-hard .ace_markup.ace_list {\n color: #076678\n}\n\n.ace-gruvbox-light-hard .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-gruvbox-light-hard .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-gruvbox-light-hard"; -exports.cssText = ".ace-gruvbox-light-hard .ace_gutter {\ -background: #f9f5d7;\ -color: rgb(155,151,135)\ -}\ -.ace-gruvbox-light-hard .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-gruvbox-light-hard {\ -background-color: #f9f5d7;\ -color: rgba(60, 56, 54, 0.50)\ -}\ -.ace-gruvbox-light-hard .ace_cursor {\ -color: #7c6f64\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_selection {\ -background: #ebdbb2\ -}\ -.ace-gruvbox-light-hard.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #f9f5d7;\ -border-radius: 2px\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(60, 56, 54, 0.15)\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_active-line {\ -background: #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_gutter-active-line {\ -background-color: #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_marker-layer .ace_selected-word {\ -border: 1px solid #ebdbb2\ -}\ -.ace-gruvbox-light-hard .ace_fold {\ -background-color: #79740e;\ -border-color: rgba(60, 56, 54, 0.50)\ -}\ -.ace-gruvbox-light-hard .ace_keyword {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_keyword.ace_operator {\ -color: #427b58\ -}\ -.ace-gruvbox-light-hard .ace_keyword.ace_other.ace_unit {\ -color: #b16286\ -}\ -.ace-gruvbox-light-hard .ace_constant {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_numeric {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_character.ace_escape {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_constant.ace_other {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_function {\ -color: #427b58\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_constant {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_constant.ace_property-value {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_class {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_support.ace_type {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_storage {\ -color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_invalid {\ -color: #1d2021;\ -background-color: #9d0006\ -}\ -.ace-gruvbox-light-hard .ace_string {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_string.ace_regexp {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_comment {\ -font-style: italic;\ -color: #928374\ -}\ -.ace-gruvbox-light-hard .ace_variable {\ -color: #076678\ -}\ -.ace-gruvbox-light-hard .ace_variable.ace_language {\ -color: #8f3f71\ -}\ -.ace-gruvbox-light-hard .ace_variable.ace_parameter {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_meta.ace_tag {\ -color: #1d2021\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_other.ace_attribute-name {\ -color: #b57614\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_name.ace_function {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_entity.ace_name.ace_tag {\ -color: #076678\ -}\ -.ace-gruvbox-light-hard .ace_markup.ace_heading {\ -color: #79740e\ -}\ -.ace-gruvbox-light-hard .ace_markup.ace_list {\ -color: #076678\ -}"; +}); +define("ace/theme/gruvbox_light_hard",["require","exports","module","ace/theme/gruvbox_light_hard-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-gruvbox-light-hard"; +exports.cssText = require("./gruvbox_light_hard-css"); var dom = require("../lib/dom"); -dom.importCssString(exports.cssText, exports.cssClass); +dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/gruvbox_light_hard"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-idle_fingers.js b/app/Resources/ui/js/ace/theme-idle_fingers.js index 1af5e27..ab8a311 100644 --- a/app/Resources/ui/js/ace/theme-idle_fingers.js +++ b/app/Resources/ui/js/ace/theme-idle_fingers.js @@ -1,98 +1,13 @@ -define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/idle_fingers-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-idle-fingers .ace_gutter {\n background: #3b3b3b;\n color: rgb(153,153,153)\n}\n\n.ace-idle-fingers .ace_print-margin {\n width: 1px;\n background: #3b3b3b\n}\n\n.ace-idle-fingers {\n background-color: #323232;\n color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_cursor {\n color: #91FF00\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selection {\n background: rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #323232;\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_active-line {\n background: #353637\n}\n\n.ace-idle-fingers .ace_gutter-active-line {\n background-color: #353637\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers .ace_invisible {\n color: #404040\n}\n\n.ace-idle-fingers .ace_keyword,\n.ace-idle-fingers .ace_meta {\n color: #CC7833\n}\n\n.ace-idle-fingers .ace_constant,\n.ace-idle-fingers .ace_constant.ace_character,\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\n.ace-idle-fingers .ace_constant.ace_other,\n.ace-idle-fingers .ace_support.ace_constant {\n color: #6C99BB\n}\n\n.ace-idle-fingers .ace_invalid {\n color: #FFFFFF;\n background-color: #FF0000\n}\n\n.ace-idle-fingers .ace_fold {\n background-color: #CC7833;\n border-color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_support.ace_function {\n color: #B83426\n}\n\n.ace-idle-fingers .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-idle-fingers .ace_string {\n color: #A5C261\n}\n\n.ace-idle-fingers .ace_string.ace_regexp {\n color: #CCCC33\n}\n\n.ace-idle-fingers .ace_comment {\n font-style: italic;\n color: #BC9458\n}\n\n.ace-idle-fingers .ace_meta.ace_tag {\n color: #FFE5BB\n}\n\n.ace-idle-fingers .ace_entity.ace_name {\n color: #FFC66D\n}\n\n.ace-idle-fingers .ace_collab.ace_user1 {\n color: #323232;\n background-color: #FFF980\n}\n\n.ace-idle-fingers .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-idle-fingers .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-idle-fingers"; -exports.cssText = ".ace-idle-fingers .ace_gutter {\ -background: #3b3b3b;\ -color: rgb(153,153,153)\ -}\ -.ace-idle-fingers .ace_print-margin {\ -width: 1px;\ -background: #3b3b3b\ -}\ -.ace-idle-fingers {\ -background-color: #323232;\ -color: #FFFFFF\ -}\ -.ace-idle-fingers .ace_cursor {\ -color: #91FF00\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_selection {\ -background: rgba(90, 100, 126, 0.88)\ -}\ -.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #323232;\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_active-line {\ -background: #353637\ -}\ -.ace-idle-fingers .ace_gutter-active-line {\ -background-color: #353637\ -}\ -.ace-idle-fingers .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(90, 100, 126, 0.88)\ -}\ -.ace-idle-fingers .ace_invisible {\ -color: #404040\ -}\ -.ace-idle-fingers .ace_keyword,\ -.ace-idle-fingers .ace_meta {\ -color: #CC7833\ -}\ -.ace-idle-fingers .ace_constant,\ -.ace-idle-fingers .ace_constant.ace_character,\ -.ace-idle-fingers .ace_constant.ace_character.ace_escape,\ -.ace-idle-fingers .ace_constant.ace_other,\ -.ace-idle-fingers .ace_support.ace_constant {\ -color: #6C99BB\ -}\ -.ace-idle-fingers .ace_invalid {\ -color: #FFFFFF;\ -background-color: #FF0000\ -}\ -.ace-idle-fingers .ace_fold {\ -background-color: #CC7833;\ -border-color: #FFFFFF\ -}\ -.ace-idle-fingers .ace_support.ace_function {\ -color: #B83426\ -}\ -.ace-idle-fingers .ace_variable.ace_parameter {\ -font-style: italic\ -}\ -.ace-idle-fingers .ace_string {\ -color: #A5C261\ -}\ -.ace-idle-fingers .ace_string.ace_regexp {\ -color: #CCCC33\ -}\ -.ace-idle-fingers .ace_comment {\ -font-style: italic;\ -color: #BC9458\ -}\ -.ace-idle-fingers .ace_meta.ace_tag {\ -color: #FFE5BB\ -}\ -.ace-idle-fingers .ace_entity.ace_name {\ -color: #FFC66D\ -}\ -.ace-idle-fingers .ace_collab.ace_user1 {\ -color: #323232;\ -background-color: #FFF980\ -}\ -.ace-idle-fingers .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/idle_fingers",["require","exports","module","ace/theme/idle_fingers-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-idle-fingers"; +exports.cssText = require("./idle_fingers-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/idle_fingers"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-iplastic.js b/app/Resources/ui/js/ace/theme-iplastic.js index 6eaf7ab..799f643 100644 --- a/app/Resources/ui/js/ace/theme-iplastic.js +++ b/app/Resources/ui/js/ace/theme-iplastic.js @@ -1,123 +1,13 @@ -define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/iplastic-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-iplastic .ace_gutter {\n background: #dddddd;\n color: #666666\n}\n\n.ace-iplastic .ace_print-margin {\n width: 1px;\n background: #bbbbbb\n}\n\n.ace-iplastic {\n background-color: #eeeeee;\n color: #333333\n}\n\n.ace-iplastic .ace_cursor {\n color: #333\n}\n\n.ace-iplastic .ace_marker-layer .ace_selection {\n background: #BAD6FD;\n}\n\n.ace-iplastic.ace_multiselect .ace_selection.ace_start {\n border-radius: 4px\n}\n\n.ace-iplastic .ace_marker-layer .ace_step {\n background: #444444\n}\n\n.ace-iplastic .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E;\n background: #FFF799\n}\n\n.ace-iplastic .ace_marker-layer .ace_active-line {\n background: #e5e5e5\n}\n\n.ace-iplastic .ace_gutter-active-line {\n background-color: #eeeeee\n}\n\n.ace-iplastic .ace_marker-layer .ace_selected-word {\n border: 1px solid #555555;\n border-radius:4px\n}\n\n.ace-iplastic .ace_invisible {\n color: #999999\n}\n\n.ace-iplastic .ace_entity.ace_name.ace_tag,\n.ace-iplastic .ace_keyword,\n.ace-iplastic .ace_meta.ace_tag,\n.ace-iplastic .ace_storage {\n color: #0000FF\n}\n\n.ace-iplastic .ace_punctuation,\n.ace-iplastic .ace_punctuation.ace_tag {\n color: #000\n}\n\n.ace-iplastic .ace_constant {\n color: #333333;\n font-weight: 700\n}\n\n.ace-iplastic .ace_constant.ace_character,\n.ace-iplastic .ace_constant.ace_language,\n.ace-iplastic .ace_constant.ace_numeric,\n.ace-iplastic .ace_constant.ace_other {\n color: #0066FF;\n font-weight: 700\n}\n\n.ace-iplastic .ace_constant.ace_numeric{\n font-weight: 100\n}\n\n.ace-iplastic .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-iplastic .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-iplastic .ace_support.ace_constant,\n.ace-iplastic .ace_support.ace_function {\n color: #333333;\n font-weight: 700\n}\n\n.ace-iplastic .ace_fold {\n background-color: #464646;\n border-color: #F8F8F2\n}\n\n.ace-iplastic .ace_storage.ace_type,\n.ace-iplastic .ace_support.ace_class,\n.ace-iplastic .ace_support.ace_type {\n color: #3333fc;\n font-weight: 700\n}\n\n.ace-iplastic .ace_entity.ace_name.ace_function,\n.ace-iplastic .ace_entity.ace_other,\n.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\n.ace-iplastic .ace_variable {\n color: #3366cc;\n font-style: italic\n}\n\n.ace-iplastic .ace_variable.ace_parameter {\n font-style: italic;\n color: #2469E0\n}\n\n.ace-iplastic .ace_string {\n color: #a55f03\n}\n\n.ace-iplastic .ace_comment {\n color: #777777;\n font-style: italic\n}\n\n.ace-iplastic .ace_fold-widget {\n background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\n}\n\n.ace-iplastic .ace_indent-guide {\n background: url(data:image/png;base64,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) right repeat-y\n}\n\n.ace-iplastic .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-iplastic"; -exports.cssText = ".ace-iplastic .ace_gutter {\ -background: #dddddd;\ -color: #666666\ -}\ -.ace-iplastic .ace_print-margin {\ -width: 1px;\ -background: #bbbbbb\ -}\ -.ace-iplastic {\ -background-color: #eeeeee;\ -color: #333333\ -}\ -.ace-iplastic .ace_cursor {\ -color: #333\ -}\ -.ace-iplastic .ace_marker-layer .ace_selection {\ -background: #BAD6FD;\ -}\ -.ace-iplastic.ace_multiselect .ace_selection.ace_start {\ -border-radius: 4px\ -}\ -.ace-iplastic .ace_marker-layer .ace_step {\ -background: #444444\ -}\ -.ace-iplastic .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #49483E;\ -background: #FFF799\ -}\ -.ace-iplastic .ace_marker-layer .ace_active-line {\ -background: #e5e5e5\ -}\ -.ace-iplastic .ace_gutter-active-line {\ -background-color: #eeeeee\ -}\ -.ace-iplastic .ace_marker-layer .ace_selected-word {\ -border: 1px solid #555555;\ -border-radius:4px\ -}\ -.ace-iplastic .ace_invisible {\ -color: #999999\ -}\ -.ace-iplastic .ace_entity.ace_name.ace_tag,\ -.ace-iplastic .ace_keyword,\ -.ace-iplastic .ace_meta.ace_tag,\ -.ace-iplastic .ace_storage {\ -color: #0000FF\ -}\ -.ace-iplastic .ace_punctuation,\ -.ace-iplastic .ace_punctuation.ace_tag {\ -color: #000\ -}\ -.ace-iplastic .ace_constant {\ -color: #333333;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_constant.ace_character,\ -.ace-iplastic .ace_constant.ace_language,\ -.ace-iplastic .ace_constant.ace_numeric,\ -.ace-iplastic .ace_constant.ace_other {\ -color: #0066FF;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_constant.ace_numeric{\ -font-weight: 100\ -}\ -.ace-iplastic .ace_invalid {\ -color: #F8F8F0;\ -background-color: #F92672\ -}\ -.ace-iplastic .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #AE81FF\ -}\ -.ace-iplastic .ace_support.ace_constant,\ -.ace-iplastic .ace_support.ace_function {\ -color: #333333;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_fold {\ -background-color: #464646;\ -border-color: #F8F8F2\ -}\ -.ace-iplastic .ace_storage.ace_type,\ -.ace-iplastic .ace_support.ace_class,\ -.ace-iplastic .ace_support.ace_type {\ -color: #3333fc;\ -font-weight: 700\ -}\ -.ace-iplastic .ace_entity.ace_name.ace_function,\ -.ace-iplastic .ace_entity.ace_other,\ -.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\ -.ace-iplastic .ace_variable {\ -color: #3366cc;\ -font-style: italic\ -}\ -.ace-iplastic .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #2469E0\ -}\ -.ace-iplastic .ace_string {\ -color: #a55f03\ -}\ -.ace-iplastic .ace_comment {\ -color: #777777;\ -font-style: italic\ -}\ -.ace-iplastic .ace_fold-widget {\ -background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\ -}\ -.ace-iplastic .ace_indent-guide {\ -background: url(data:image/png;base64,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) right repeat-y\ -}"; +}); +define("ace/theme/iplastic",["require","exports","module","ace/theme/iplastic-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-iplastic"; +exports.cssText = require("./iplastic-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/iplastic"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-katzenmilch.js b/app/Resources/ui/js/ace/theme-katzenmilch.js index 596d970..2e79430 100644 --- a/app/Resources/ui/js/ace/theme-katzenmilch.js +++ b/app/Resources/ui/js/ace/theme-katzenmilch.js @@ -1,123 +1,13 @@ -define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/katzenmilch-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-katzenmilch .ace_gutter,\n/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: ) */\n\n.ace-katzenmilch .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-katzenmilch .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-katzenmilch {\n background-color: #f3f2f3;\n color: rgba(15, 0, 9, 1.0)\n}\n\n.ace-katzenmilch .ace_cursor {\n border-left: 2px solid #100011\n}\n\n.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\n border-left: 0px;\n border-bottom: 1px solid #100011\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_selection {\n background: rgba(100, 5, 208, 0.27)\n}\n\n.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #f3f2f3;\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.33);\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_active-line {\n background: rgb(232, 242, 254)\n}\n\n.ace-katzenmilch .ace_gutter-active-line {\n background-color: rgb(232, 242, 254)\n}\n\n.ace-katzenmilch .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(100, 5, 208, 0.27)\n}\n\n.ace-katzenmilch .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-katzenmilch .ace_fold {\n background-color: rgba(2, 95, 73, 0.97);\n border-color: rgba(15, 0, 9, 1.0)\n}\n\n.ace-katzenmilch .ace_keyword {\n color: #674Aa8;\n rbackground-color: rgba(163, 170, 216, 0.055)\n}\n\n.ace-katzenmilch .ace_constant.ace_language {\n color: #7D7e52;\n rbackground-color: rgba(189, 190, 130, 0.059)\n}\n\n.ace-katzenmilch .ace_constant.ace_numeric {\n color: rgba(79, 130, 123, 0.93);\n rbackground-color: rgba(119, 194, 187, 0.059)\n}\n\n.ace-katzenmilch .ace_constant.ace_character,\n.ace-katzenmilch .ace_constant.ace_other {\n color: rgba(2, 95, 105, 1.0);\n rbackground-color: rgba(127, 34, 153, 0.063)\n}\n\n.ace-katzenmilch .ace_support.ace_function {\n color: #9D7e62;\n rbackground-color: rgba(189, 190, 130, 0.039)\n}\n\n.ace-katzenmilch .ace_support.ace_class {\n color: rgba(239, 106, 167, 1.0);\n rbackground-color: rgba(239, 106, 167, 0.063)\n}\n\n.ace-katzenmilch .ace_storage {\n color: rgba(123, 92, 191, 1.0);\n rbackground-color: rgba(139, 93, 223, 0.051)\n}\n\n.ace-katzenmilch .ace_invalid {\n color: #DFDFD5;\n rbackground-color: #CC1B27\n}\n\n.ace-katzenmilch .ace_string {\n color: #5a5f9b;\n rbackground-color: rgba(170, 175, 219, 0.035)\n}\n\n.ace-katzenmilch .ace_comment {\n font-style: italic;\n color: rgba(64, 79, 80, 0.67);\n rbackground-color: rgba(95, 15, 255, 0.0078)\n}\n\n.ace-katzenmilch .ace_entity.ace_name.ace_function,\n.ace-katzenmilch .ace_variable {\n color: rgba(2, 95, 73, 0.97);\n rbackground-color: rgba(34, 255, 73, 0.12)\n}\n\n.ace-katzenmilch .ace_variable.ace_language {\n color: #316fcf;\n rbackground-color: rgba(58, 175, 255, 0.039)\n}\n\n.ace-katzenmilch .ace_variable.ace_parameter {\n font-style: italic;\n color: rgba(51, 150, 159, 0.87);\n rbackground-color: rgba(5, 214, 249, 0.043)\n}\n\n.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\n color: rgba(73, 70, 194, 0.93);\n rbackground-color: rgba(73, 134, 194, 0.035)\n}\n\n.ace-katzenmilch .ace_entity.ace_name.ace_tag {\n color: #3976a2;\n rbackground-color: rgba(73, 166, 210, 0.039)\n}\n\n.ace-katzenmilch .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-katzenmilch .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n}\n"; -exports.isDark = false; -exports.cssClass = "ace-katzenmilch"; -exports.cssText = ".ace-katzenmilch .ace_gutter,\ -.ace-katzenmilch .ace_gutter {\ -background: #e8e8e8;\ -color: #333\ -}\ -.ace-katzenmilch .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-katzenmilch {\ -background-color: #f3f2f3;\ -color: rgba(15, 0, 9, 1.0)\ -}\ -.ace-katzenmilch .ace_cursor {\ -border-left: 2px solid #100011\ -}\ -.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\ -border-left: 0px;\ -border-bottom: 1px solid #100011\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_selection {\ -background: rgba(100, 5, 208, 0.27)\ -}\ -.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #f3f2f3;\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(0, 0, 0, 0.33);\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_active-line {\ -background: rgb(232, 242, 254)\ -}\ -.ace-katzenmilch .ace_gutter-active-line {\ -background-color: rgb(232, 242, 254)\ -}\ -.ace-katzenmilch .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(100, 5, 208, 0.27)\ -}\ -.ace-katzenmilch .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-katzenmilch .ace_fold {\ -background-color: rgba(2, 95, 73, 0.97);\ -border-color: rgba(15, 0, 9, 1.0)\ -}\ -.ace-katzenmilch .ace_keyword {\ -color: #674Aa8;\ -rbackground-color: rgba(163, 170, 216, 0.055)\ -}\ -.ace-katzenmilch .ace_constant.ace_language {\ -color: #7D7e52;\ -rbackground-color: rgba(189, 190, 130, 0.059)\ -}\ -.ace-katzenmilch .ace_constant.ace_numeric {\ -color: rgba(79, 130, 123, 0.93);\ -rbackground-color: rgba(119, 194, 187, 0.059)\ -}\ -.ace-katzenmilch .ace_constant.ace_character,\ -.ace-katzenmilch .ace_constant.ace_other {\ -color: rgba(2, 95, 105, 1.0);\ -rbackground-color: rgba(127, 34, 153, 0.063)\ -}\ -.ace-katzenmilch .ace_support.ace_function {\ -color: #9D7e62;\ -rbackground-color: rgba(189, 190, 130, 0.039)\ -}\ -.ace-katzenmilch .ace_support.ace_class {\ -color: rgba(239, 106, 167, 1.0);\ -rbackground-color: rgba(239, 106, 167, 0.063)\ -}\ -.ace-katzenmilch .ace_storage {\ -color: rgba(123, 92, 191, 1.0);\ -rbackground-color: rgba(139, 93, 223, 0.051)\ -}\ -.ace-katzenmilch .ace_invalid {\ -color: #DFDFD5;\ -rbackground-color: #CC1B27\ -}\ -.ace-katzenmilch .ace_string {\ -color: #5a5f9b;\ -rbackground-color: rgba(170, 175, 219, 0.035)\ -}\ -.ace-katzenmilch .ace_comment {\ -font-style: italic;\ -color: rgba(64, 79, 80, 0.67);\ -rbackground-color: rgba(95, 15, 255, 0.0078)\ -}\ -.ace-katzenmilch .ace_entity.ace_name.ace_function,\ -.ace-katzenmilch .ace_variable {\ -color: rgba(2, 95, 73, 0.97);\ -rbackground-color: rgba(34, 255, 73, 0.12)\ -}\ -.ace-katzenmilch .ace_variable.ace_language {\ -color: #316fcf;\ -rbackground-color: rgba(58, 175, 255, 0.039)\ -}\ -.ace-katzenmilch .ace_variable.ace_parameter {\ -font-style: italic;\ -color: rgba(51, 150, 159, 0.87);\ -rbackground-color: rgba(5, 214, 249, 0.043)\ -}\ -.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\ -color: rgba(73, 70, 194, 0.93);\ -rbackground-color: rgba(73, 134, 194, 0.035)\ -}\ -.ace-katzenmilch .ace_entity.ace_name.ace_tag {\ -color: #3976a2;\ -rbackground-color: rgba(73, 166, 210, 0.039)\ -}"; +}); +define("ace/theme/katzenmilch",["require","exports","module","ace/theme/katzenmilch-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-katzenmilch"; +exports.cssText = require("./katzenmilch-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/katzenmilch"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-kr_theme.js b/app/Resources/ui/js/ace/theme-kr_theme.js index 1509c0b..0b70427 100644 --- a/app/Resources/ui/js/ace/theme-kr_theme.js +++ b/app/Resources/ui/js/ace/theme-kr_theme.js @@ -1,106 +1,13 @@ -define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/kr_theme-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-kr-theme .ace_gutter {\n background: #1c1917;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_print-margin {\n width: 1px;\n background: #1c1917\n}\n\n.ace-kr-theme {\n background-color: #0B0A09;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_cursor {\n color: #FF9900\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selection {\n background: rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0B0A09;\n}\n\n.ace-kr-theme .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_active-line {\n background: #38403D\n}\n\n.ace-kr-theme .ace_gutter-active-line {\n background-color : #38403D\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme .ace_invisible {\n color: rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_keyword,\n.ace-kr-theme .ace_meta {\n color: #949C8B\n}\n\n.ace-kr-theme .ace_constant,\n.ace-kr-theme .ace_constant.ace_character,\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\n.ace-kr-theme .ace_constant.ace_other {\n color: rgba(210, 117, 24, 0.76)\n}\n\n.ace-kr-theme .ace_invalid {\n color: #F8F8F8;\n background-color: #A41300\n}\n\n.ace-kr-theme .ace_support {\n color: #9FC28A\n}\n\n.ace-kr-theme .ace_support.ace_constant {\n color: #C27E66\n}\n\n.ace-kr-theme .ace_fold {\n background-color: #949C8B;\n border-color: #FCFFE0\n}\n\n.ace-kr-theme .ace_support.ace_function {\n color: #85873A\n}\n\n.ace-kr-theme .ace_storage {\n color: #FFEE80\n}\n\n.ace-kr-theme .ace_string {\n color: rgba(164, 161, 181, 0.8)\n}\n\n.ace-kr-theme .ace_string.ace_regexp {\n color: rgba(125, 255, 192, 0.65)\n}\n\n.ace-kr-theme .ace_comment {\n font-style: italic;\n color: #706D5B\n}\n\n.ace-kr-theme .ace_variable {\n color: #D1A796\n}\n\n.ace-kr-theme .ace_list,\n.ace-kr-theme .ace_markup.ace_list {\n background-color: #0F0040\n}\n\n.ace-kr-theme .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-kr-theme .ace_meta.ace_tag {\n color: #BABD9C\n}\n\n.ace-kr-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-kr-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-kr-theme"; -exports.cssText = ".ace-kr-theme .ace_gutter {\ -background: #1c1917;\ -color: #FCFFE0\ -}\ -.ace-kr-theme .ace_print-margin {\ -width: 1px;\ -background: #1c1917\ -}\ -.ace-kr-theme {\ -background-color: #0B0A09;\ -color: #FCFFE0\ -}\ -.ace-kr-theme .ace_cursor {\ -color: #FF9900\ -}\ -.ace-kr-theme .ace_marker-layer .ace_selection {\ -background: rgba(170, 0, 255, 0.45)\ -}\ -.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #0B0A09;\ -}\ -.ace-kr-theme .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-kr-theme .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 177, 111, 0.32)\ -}\ -.ace-kr-theme .ace_marker-layer .ace_active-line {\ -background: #38403D\ -}\ -.ace-kr-theme .ace_gutter-active-line {\ -background-color : #38403D\ -}\ -.ace-kr-theme .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(170, 0, 255, 0.45)\ -}\ -.ace-kr-theme .ace_invisible {\ -color: rgba(255, 177, 111, 0.32)\ -}\ -.ace-kr-theme .ace_keyword,\ -.ace-kr-theme .ace_meta {\ -color: #949C8B\ -}\ -.ace-kr-theme .ace_constant,\ -.ace-kr-theme .ace_constant.ace_character,\ -.ace-kr-theme .ace_constant.ace_character.ace_escape,\ -.ace-kr-theme .ace_constant.ace_other {\ -color: rgba(210, 117, 24, 0.76)\ -}\ -.ace-kr-theme .ace_invalid {\ -color: #F8F8F8;\ -background-color: #A41300\ -}\ -.ace-kr-theme .ace_support {\ -color: #9FC28A\ -}\ -.ace-kr-theme .ace_support.ace_constant {\ -color: #C27E66\ -}\ -.ace-kr-theme .ace_fold {\ -background-color: #949C8B;\ -border-color: #FCFFE0\ -}\ -.ace-kr-theme .ace_support.ace_function {\ -color: #85873A\ -}\ -.ace-kr-theme .ace_storage {\ -color: #FFEE80\ -}\ -.ace-kr-theme .ace_string {\ -color: rgba(164, 161, 181, 0.8)\ -}\ -.ace-kr-theme .ace_string.ace_regexp {\ -color: rgba(125, 255, 192, 0.65)\ -}\ -.ace-kr-theme .ace_comment {\ -font-style: italic;\ -color: #706D5B\ -}\ -.ace-kr-theme .ace_variable {\ -color: #D1A796\ -}\ -.ace-kr-theme .ace_list,\ -.ace-kr-theme .ace_markup.ace_list {\ -background-color: #0F0040\ -}\ -.ace-kr-theme .ace_variable.ace_language {\ -color: #FF80E1\ -}\ -.ace-kr-theme .ace_meta.ace_tag {\ -color: #BABD9C\ -}\ -.ace-kr-theme .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/kr_theme",["require","exports","module","ace/theme/kr_theme-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-kr-theme"; +exports.cssText = require("./kr_theme-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/kr_theme"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-kuroir.js b/app/Resources/ui/js/ace/theme-kuroir.js index 85af8e8..58f911b 100644 --- a/app/Resources/ui/js/ace/theme-kuroir.js +++ b/app/Resources/ui/js/ace/theme-kuroir.js @@ -1,63 +1,13 @@ -define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/kuroir-css",["require","exports","module"], function(require, exports, module){module.exports = "/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */\n\n.ace-kuroir .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-kuroir .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-kuroir {\n background-color: #E8E9E8;\n color: #363636;\n}\n\n.ace-kuroir .ace_cursor {\n color: #202020;\n}\n\n.ace-kuroir .ace_marker-layer .ace_selection {\n background: rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #E8E9E8;\n}\n\n.ace-kuroir .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-kuroir .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.29);\n}\n\n.ace-kuroir .ace_marker-layer .ace_active-line {\n background: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_gutter-active-line {\n background-color: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-kuroir .ace_fold {\n border-color: #363636;\n}\n\n\n\n\n\n.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\nbackground-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\nfont-style:italic;\ncolor:#FD1732;\nbackground-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\nbackground-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\nbackground-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\nbackground-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\n\n.ace-kuroir .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-kuroir .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-kuroir"; -exports.cssText = "\ -.ace-kuroir .ace_gutter {\ -background: #e8e8e8;\ -color: #333;\ -}\ -.ace-kuroir .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-kuroir {\ -background-color: #E8E9E8;\ -color: #363636;\ -}\ -.ace-kuroir .ace_cursor {\ -color: #202020;\ -}\ -.ace-kuroir .ace_marker-layer .ace_selection {\ -background: rgba(245, 170, 0, 0.57);\ -}\ -.ace-kuroir.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #E8E9E8;\ -}\ -.ace-kuroir .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174);\ -}\ -.ace-kuroir .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(0, 0, 0, 0.29);\ -}\ -.ace-kuroir .ace_marker-layer .ace_active-line {\ -background: rgba(203, 220, 47, 0.22);\ -}\ -.ace-kuroir .ace_gutter-active-line {\ -background-color: rgba(203, 220, 47, 0.22);\ -}\ -.ace-kuroir .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(245, 170, 0, 0.57);\ -}\ -.ace-kuroir .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-kuroir .ace_fold {\ -border-color: #363636;\ -}\ -.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\ -background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\ -font-style:italic;\ -color:#FD1732;\ -background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\ -background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\ -background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\ -background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\ -"; +}); +define("ace/theme/kuroir",["require","exports","module","ace/theme/kuroir-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-kuroir"; +exports.cssText = require("./kuroir-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/kuroir"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-merbivore.js b/app/Resources/ui/js/ace/theme-merbivore.js index e638fb1..bb95938 100644 --- a/app/Resources/ui/js/ace/theme-merbivore.js +++ b/app/Resources/ui/js/ace/theme-merbivore.js @@ -1,97 +1,13 @@ -define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/merbivore-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-merbivore .ace_gutter {\n background: #202020;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-merbivore {\n background-color: #161616;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore .ace_marker-layer .ace_selection {\n background: #454545\n}\n\n.ace-merbivore.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #161616;\n}\n\n.ace-merbivore .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore .ace_marker-layer .ace_selected-word {\n border: 1px solid #454545\n}\n\n.ace-merbivore .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore .ace_entity.ace_name.ace_tag,\n.ace-merbivore .ace_keyword,\n.ace-merbivore .ace_meta,\n.ace-merbivore .ace_meta.ace_tag,\n.ace-merbivore .ace_storage,\n.ace-merbivore .ace_support.ace_function {\n color: #FC6F09\n}\n\n.ace-merbivore .ace_constant,\n.ace-merbivore .ace_constant.ace_character,\n.ace-merbivore .ace_constant.ace_character.ace_escape,\n.ace-merbivore .ace_constant.ace_other,\n.ace-merbivore .ace_support.ace_type {\n color: #1EDAFB\n}\n\n.ace-merbivore .ace_constant.ace_character.ace_escape {\n color: #519F50\n}\n\n.ace-merbivore .ace_constant.ace_language {\n color: #FDC251\n}\n\n.ace-merbivore .ace_constant.ace_library,\n.ace-merbivore .ace_string,\n.ace-merbivore .ace_support.ace_constant {\n color: #8DFF0A\n}\n\n.ace-merbivore .ace_constant.ace_numeric {\n color: #58C554\n}\n\n.ace-merbivore .ace_invalid {\n color: #FFFFFF;\n background-color: #990000\n}\n\n.ace-merbivore .ace_fold {\n background-color: #FC6F09;\n border-color: #E6E1DC\n}\n\n.ace-merbivore .ace_comment {\n font-style: italic;\n color: #AD2EA4\n}\n\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\n color: #FFFF89\n}\n\n.ace-merbivore .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-merbivore"; -exports.cssText = ".ace-merbivore .ace_gutter {\ -background: #202020;\ -color: #E6E1DC\ -}\ -.ace-merbivore .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-merbivore {\ -background-color: #161616;\ -color: #E6E1DC\ -}\ -.ace-merbivore .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-merbivore .ace_marker-layer .ace_selection {\ -background: #454545\ -}\ -.ace-merbivore.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #161616;\ -}\ -.ace-merbivore .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-merbivore .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-merbivore .ace_marker-layer .ace_active-line {\ -background: #333435\ -}\ -.ace-merbivore .ace_gutter-active-line {\ -background-color: #333435\ -}\ -.ace-merbivore .ace_marker-layer .ace_selected-word {\ -border: 1px solid #454545\ -}\ -.ace-merbivore .ace_invisible {\ -color: #404040\ -}\ -.ace-merbivore .ace_entity.ace_name.ace_tag,\ -.ace-merbivore .ace_keyword,\ -.ace-merbivore .ace_meta,\ -.ace-merbivore .ace_meta.ace_tag,\ -.ace-merbivore .ace_storage,\ -.ace-merbivore .ace_support.ace_function {\ -color: #FC6F09\ -}\ -.ace-merbivore .ace_constant,\ -.ace-merbivore .ace_constant.ace_character,\ -.ace-merbivore .ace_constant.ace_character.ace_escape,\ -.ace-merbivore .ace_constant.ace_other,\ -.ace-merbivore .ace_support.ace_type {\ -color: #1EDAFB\ -}\ -.ace-merbivore .ace_constant.ace_character.ace_escape {\ -color: #519F50\ -}\ -.ace-merbivore .ace_constant.ace_language {\ -color: #FDC251\ -}\ -.ace-merbivore .ace_constant.ace_library,\ -.ace-merbivore .ace_string,\ -.ace-merbivore .ace_support.ace_constant {\ -color: #8DFF0A\ -}\ -.ace-merbivore .ace_constant.ace_numeric {\ -color: #58C554\ -}\ -.ace-merbivore .ace_invalid {\ -color: #FFFFFF;\ -background-color: #990000\ -}\ -.ace-merbivore .ace_fold {\ -background-color: #FC6F09;\ -border-color: #E6E1DC\ -}\ -.ace-merbivore .ace_comment {\ -font-style: italic;\ -color: #AD2EA4\ -}\ -.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\ -color: #FFFF89\ -}\ -.ace-merbivore .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/merbivore",["require","exports","module","ace/theme/merbivore-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-merbivore"; +exports.cssText = require("./merbivore-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/merbivore"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-merbivore_soft.js b/app/Resources/ui/js/ace/theme-merbivore_soft.js index d79865b..c629451 100644 --- a/app/Resources/ui/js/ace/theme-merbivore_soft.js +++ b/app/Resources/ui/js/ace/theme-merbivore_soft.js @@ -1,98 +1,13 @@ -define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/merbivore_soft-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-merbivore-soft .ace_gutter {\n background: #262424;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_print-margin {\n width: 1px;\n background: #262424\n}\n\n.ace-merbivore-soft {\n background-color: #1C1C1C;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\n background: #494949\n}\n\n.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1C1C1C;\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore-soft .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\n border: 1px solid #494949\n}\n\n.ace-merbivore-soft .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\n.ace-merbivore-soft .ace_keyword,\n.ace-merbivore-soft .ace_meta,\n.ace-merbivore-soft .ace_meta.ace_tag,\n.ace-merbivore-soft .ace_storage {\n color: #FC803A\n}\n\n.ace-merbivore-soft .ace_constant,\n.ace-merbivore-soft .ace_constant.ace_character,\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\n.ace-merbivore-soft .ace_constant.ace_other,\n.ace-merbivore-soft .ace_support.ace_type {\n color: #68C1D8\n}\n\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\n color: #B3E5B4\n}\n\n.ace-merbivore-soft .ace_constant.ace_language {\n color: #E1C582\n}\n\n.ace-merbivore-soft .ace_constant.ace_library,\n.ace-merbivore-soft .ace_string,\n.ace-merbivore-soft .ace_support.ace_constant {\n color: #8EC65F\n}\n\n.ace-merbivore-soft .ace_constant.ace_numeric {\n color: #7FC578\n}\n\n.ace-merbivore-soft .ace_invalid,\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #FE3838\n}\n\n.ace-merbivore-soft .ace_fold {\n background-color: #FC803A;\n border-color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_comment,\n.ace-merbivore-soft .ace_meta {\n font-style: italic;\n color: #AC4BB8\n}\n\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\n color: #EAF1A3\n}\n\n.ace-merbivore-soft .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore-soft .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-merbivore-soft"; -exports.cssText = ".ace-merbivore-soft .ace_gutter {\ -background: #262424;\ -color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_print-margin {\ -width: 1px;\ -background: #262424\ -}\ -.ace-merbivore-soft {\ -background-color: #1C1C1C;\ -color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_selection {\ -background: #494949\ -}\ -.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1C1C1C;\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_active-line {\ -background: #333435\ -}\ -.ace-merbivore-soft .ace_gutter-active-line {\ -background-color: #333435\ -}\ -.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\ -border: 1px solid #494949\ -}\ -.ace-merbivore-soft .ace_invisible {\ -color: #404040\ -}\ -.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\ -.ace-merbivore-soft .ace_keyword,\ -.ace-merbivore-soft .ace_meta,\ -.ace-merbivore-soft .ace_meta.ace_tag,\ -.ace-merbivore-soft .ace_storage {\ -color: #FC803A\ -}\ -.ace-merbivore-soft .ace_constant,\ -.ace-merbivore-soft .ace_constant.ace_character,\ -.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\ -.ace-merbivore-soft .ace_constant.ace_other,\ -.ace-merbivore-soft .ace_support.ace_type {\ -color: #68C1D8\ -}\ -.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\ -color: #B3E5B4\ -}\ -.ace-merbivore-soft .ace_constant.ace_language {\ -color: #E1C582\ -}\ -.ace-merbivore-soft .ace_constant.ace_library,\ -.ace-merbivore-soft .ace_string,\ -.ace-merbivore-soft .ace_support.ace_constant {\ -color: #8EC65F\ -}\ -.ace-merbivore-soft .ace_constant.ace_numeric {\ -color: #7FC578\ -}\ -.ace-merbivore-soft .ace_invalid,\ -.ace-merbivore-soft .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #FE3838\ -}\ -.ace-merbivore-soft .ace_fold {\ -background-color: #FC803A;\ -border-color: #E6E1DC\ -}\ -.ace-merbivore-soft .ace_comment,\ -.ace-merbivore-soft .ace_meta {\ -font-style: italic;\ -color: #AC4BB8\ -}\ -.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\ -color: #EAF1A3\ -}\ -.ace-merbivore-soft .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/merbivore_soft",["require","exports","module","ace/theme/merbivore_soft-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-merbivore-soft"; +exports.cssText = require("./merbivore_soft-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/merbivore_soft"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-mono_industrial.js b/app/Resources/ui/js/ace/theme-mono_industrial.js index 0bd5766..d5d5fc3 100644 --- a/app/Resources/ui/js/ace/theme-mono_industrial.js +++ b/app/Resources/ui/js/ace/theme-mono_industrial.js @@ -1,109 +1,13 @@ -define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/mono_industrial-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-mono-industrial .ace_gutter {\n background: #1d2521;\n color: #C5C9C9\n}\n\n.ace-mono-industrial .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-mono-industrial {\n background-color: #222C28;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selection {\n background: rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #222C28;\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\n background: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_gutter-active-line {\n background-color: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial .ace_invisible {\n color: rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_string {\n background-color: #151C19;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_keyword,\n.ace-mono-industrial .ace_meta {\n color: #A39E64\n}\n\n.ace-mono-industrial .ace_constant,\n.ace-mono-industrial .ace_constant.ace_character,\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\n.ace-mono-industrial .ace_constant.ace_numeric,\n.ace-mono-industrial .ace_constant.ace_other {\n color: #E98800\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\n.ace-mono-industrial .ace_keyword.ace_operator,\n.ace-mono-industrial .ace_variable {\n color: #A8B3AB\n}\n\n.ace-mono-industrial .ace_invalid {\n color: #FFFFFF;\n background-color: rgba(153, 0, 0, 0.68)\n}\n\n.ace-mono-industrial .ace_support.ace_constant {\n color: #C87500\n}\n\n.ace-mono-industrial .ace_fold {\n background-color: #A8B3AB;\n border-color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_support.ace_function {\n color: #588E60\n}\n\n.ace-mono-industrial .ace_entity.ace_name,\n.ace-mono-industrial .ace_support.ace_class,\n.ace-mono-industrial .ace_support.ace_type {\n color: #5778B6\n}\n\n.ace-mono-industrial .ace_storage {\n color: #C23B00\n}\n\n.ace-mono-industrial .ace_variable.ace_language,\n.ace-mono-industrial .ace_variable.ace_parameter {\n color: #648BD2\n}\n\n.ace-mono-industrial .ace_comment {\n color: #666C68;\n background-color: #151C19\n}\n\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\n color: #909993\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\n color: #A65EFF\n}\n\n.ace-mono-industrial .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-mono-industrial .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-mono-industrial"; -exports.cssText = ".ace-mono-industrial .ace_gutter {\ -background: #1d2521;\ -color: #C5C9C9\ -}\ -.ace-mono-industrial .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-mono-industrial {\ -background-color: #222C28;\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_selection {\ -background: rgba(145, 153, 148, 0.40)\ -}\ -.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #222C28;\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(102, 108, 104, 0.50)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_active-line {\ -background: rgba(12, 13, 12, 0.25)\ -}\ -.ace-mono-industrial .ace_gutter-active-line {\ -background-color: rgba(12, 13, 12, 0.25)\ -}\ -.ace-mono-industrial .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(145, 153, 148, 0.40)\ -}\ -.ace-mono-industrial .ace_invisible {\ -color: rgba(102, 108, 104, 0.50)\ -}\ -.ace-mono-industrial .ace_string {\ -background-color: #151C19;\ -color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_keyword,\ -.ace-mono-industrial .ace_meta {\ -color: #A39E64\ -}\ -.ace-mono-industrial .ace_constant,\ -.ace-mono-industrial .ace_constant.ace_character,\ -.ace-mono-industrial .ace_constant.ace_character.ace_escape,\ -.ace-mono-industrial .ace_constant.ace_numeric,\ -.ace-mono-industrial .ace_constant.ace_other {\ -color: #E98800\ -}\ -.ace-mono-industrial .ace_entity.ace_name.ace_function,\ -.ace-mono-industrial .ace_keyword.ace_operator,\ -.ace-mono-industrial .ace_variable {\ -color: #A8B3AB\ -}\ -.ace-mono-industrial .ace_invalid {\ -color: #FFFFFF;\ -background-color: rgba(153, 0, 0, 0.68)\ -}\ -.ace-mono-industrial .ace_support.ace_constant {\ -color: #C87500\ -}\ -.ace-mono-industrial .ace_fold {\ -background-color: #A8B3AB;\ -border-color: #FFFFFF\ -}\ -.ace-mono-industrial .ace_support.ace_function {\ -color: #588E60\ -}\ -.ace-mono-industrial .ace_entity.ace_name,\ -.ace-mono-industrial .ace_support.ace_class,\ -.ace-mono-industrial .ace_support.ace_type {\ -color: #5778B6\ -}\ -.ace-mono-industrial .ace_storage {\ -color: #C23B00\ -}\ -.ace-mono-industrial .ace_variable.ace_language,\ -.ace-mono-industrial .ace_variable.ace_parameter {\ -color: #648BD2\ -}\ -.ace-mono-industrial .ace_comment {\ -color: #666C68;\ -background-color: #151C19\ -}\ -.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\ -color: #909993\ -}\ -.ace-mono-industrial .ace_entity.ace_name.ace_tag {\ -color: #A65EFF\ -}\ -.ace-mono-industrial .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/mono_industrial",["require","exports","module","ace/theme/mono_industrial-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-mono-industrial"; +exports.cssText = require("./mono_industrial-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/mono_industrial"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-monokai.js b/app/Resources/ui/js/ace/theme-monokai.js index 7eed6b4..e918f80 100644 --- a/app/Resources/ui/js/ace/theme-monokai.js +++ b/app/Resources/ui/js/ace/theme-monokai.js @@ -1,107 +1,13 @@ -define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/monokai-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-monokai .ace_gutter {\n background: #2F3129;\n color: #8F908A\n}\n\n.ace-monokai .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-monokai {\n background-color: #272822;\n color: #F8F8F2\n}\n\n.ace-monokai .ace_cursor {\n color: #F8F8F0\n}\n\n.ace-monokai .ace_marker-layer .ace_selection {\n background: #49483E\n}\n\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #272822;\n}\n\n.ace-monokai .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-monokai .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_marker-layer .ace_active-line {\n background: #202020\n}\n\n.ace-monokai .ace_gutter-active-line {\n background-color: #272727\n}\n\n.ace-monokai .ace_marker-layer .ace_selected-word {\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_invisible {\n color: #52524d\n}\n\n.ace-monokai .ace_entity.ace_name.ace_tag,\n.ace-monokai .ace_keyword,\n.ace-monokai .ace_meta.ace_tag,\n.ace-monokai .ace_storage {\n color: #F92672\n}\n\n.ace-monokai .ace_punctuation,\n.ace-monokai .ace_punctuation.ace_tag {\n color: #fff\n}\n\n.ace-monokai .ace_constant.ace_character,\n.ace-monokai .ace_constant.ace_language,\n.ace-monokai .ace_constant.ace_numeric,\n.ace-monokai .ace_constant.ace_other {\n color: #AE81FF\n}\n\n.ace-monokai .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-monokai .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-monokai .ace_support.ace_constant,\n.ace-monokai .ace_support.ace_function {\n color: #66D9EF\n}\n\n.ace-monokai .ace_fold {\n background-color: #A6E22E;\n border-color: #F8F8F2\n}\n\n.ace-monokai .ace_storage.ace_type,\n.ace-monokai .ace_support.ace_class,\n.ace-monokai .ace_support.ace_type {\n font-style: italic;\n color: #66D9EF\n}\n\n.ace-monokai .ace_entity.ace_name.ace_function,\n.ace-monokai .ace_entity.ace_other,\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\n.ace-monokai .ace_variable {\n color: #A6E22E\n}\n\n.ace-monokai .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F\n}\n\n.ace-monokai .ace_string {\n color: #E6DB74\n}\n\n.ace-monokai .ace_comment {\n color: #75715E\n}\n\n.ace-monokai .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-monokai .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-monokai"; -exports.cssText = ".ace-monokai .ace_gutter {\ -background: #2F3129;\ -color: #8F908A\ -}\ -.ace-monokai .ace_print-margin {\ -width: 1px;\ -background: #555651\ -}\ -.ace-monokai {\ -background-color: #272822;\ -color: #F8F8F2\ -}\ -.ace-monokai .ace_cursor {\ -color: #F8F8F0\ -}\ -.ace-monokai .ace_marker-layer .ace_selection {\ -background: #49483E\ -}\ -.ace-monokai.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #272822;\ -}\ -.ace-monokai .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-monokai .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #49483E\ -}\ -.ace-monokai .ace_marker-layer .ace_active-line {\ -background: #202020\ -}\ -.ace-monokai .ace_gutter-active-line {\ -background-color: #272727\ -}\ -.ace-monokai .ace_marker-layer .ace_selected-word {\ -border: 1px solid #49483E\ -}\ -.ace-monokai .ace_invisible {\ -color: #52524d\ -}\ -.ace-monokai .ace_entity.ace_name.ace_tag,\ -.ace-monokai .ace_keyword,\ -.ace-monokai .ace_meta.ace_tag,\ -.ace-monokai .ace_storage {\ -color: #F92672\ -}\ -.ace-monokai .ace_punctuation,\ -.ace-monokai .ace_punctuation.ace_tag {\ -color: #fff\ -}\ -.ace-monokai .ace_constant.ace_character,\ -.ace-monokai .ace_constant.ace_language,\ -.ace-monokai .ace_constant.ace_numeric,\ -.ace-monokai .ace_constant.ace_other {\ -color: #AE81FF\ -}\ -.ace-monokai .ace_invalid {\ -color: #F8F8F0;\ -background-color: #F92672\ -}\ -.ace-monokai .ace_invalid.ace_deprecated {\ -color: #F8F8F0;\ -background-color: #AE81FF\ -}\ -.ace-monokai .ace_support.ace_constant,\ -.ace-monokai .ace_support.ace_function {\ -color: #66D9EF\ -}\ -.ace-monokai .ace_fold {\ -background-color: #A6E22E;\ -border-color: #F8F8F2\ -}\ -.ace-monokai .ace_storage.ace_type,\ -.ace-monokai .ace_support.ace_class,\ -.ace-monokai .ace_support.ace_type {\ -font-style: italic;\ -color: #66D9EF\ -}\ -.ace-monokai .ace_entity.ace_name.ace_function,\ -.ace-monokai .ace_entity.ace_other,\ -.ace-monokai .ace_entity.ace_other.ace_attribute-name,\ -.ace-monokai .ace_variable {\ -color: #A6E22E\ -}\ -.ace-monokai .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #FD971F\ -}\ -.ace-monokai .ace_string {\ -color: #E6DB74\ -}\ -.ace-monokai .ace_comment {\ -color: #75715E\ -}\ -.ace-monokai .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/monokai",["require","exports","module","ace/theme/monokai-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-monokai"; +exports.cssText = require("./monokai-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/monokai"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-nord_dark.js b/app/Resources/ui/js/ace/theme-nord_dark.js index c97f583..bc86271 100644 --- a/app/Resources/ui/js/ace/theme-nord_dark.js +++ b/app/Resources/ui/js/ace/theme-nord_dark.js @@ -1,97 +1,14 @@ -define("ace/theme/nord_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/nord_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-nord-dark .ace_gutter {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_print-margin {\n width: 1px;\n background: #4c566a;\n}\n\n.ace-nord-dark {\n background-color: #2e3440;\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-nord-dark .ace_storage {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_cursor {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_string.ace_regexp {\n color: #bf616a;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_active-line {\n background: #434c5ecc;\n}\n.ace-nord-dark .ace_marker-layer .ace_selection {\n background: #434c5ecc;\n}\n\n.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2e3440;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_step {\n background: #ebcb8b;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_gutter-active-line {\n background-color: #434c5ecc;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_invisible {\n color: #4c566a;\n}\n\n.ace-nord-dark .ace_keyword,\n.ace-nord-dark .ace_meta,\n.ace-nord-dark .ace_support.ace_class,\n.ace-nord-dark .ace_support.ace_type {\n color: #81a1c1;\n}\n\n.ace-nord-dark .ace_constant.ace_character,\n.ace-nord-dark .ace_constant.ace_other {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_constant.ace_language {\n color: #5e81ac;\n}\n\n.ace-nord-dark .ace_constant.ace_escape {\n color: #ebcB8b;\n}\n\n.ace-nord-dark .ace_constant.ace_numeric {\n color: #b48ead;\n}\n\n.ace-nord-dark .ace_fold {\n background-color: #4c566a;\n border-color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_name.ace_function,\n.ace-nord-dark .ace_entity.ace_name.ace_tag,\n.ace-nord-dark .ace_support.ace_function,\n.ace-nord-dark .ace_variable,\n.ace-nord-dark .ace_variable.ace_language {\n color: #8fbcbb;\n}\n\n.ace-nord-dark .ace_string {\n color: #a3be8c;\n}\n\n.ace-nord-dark .ace_comment {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_indent-guide {\n box-shadow: inset -1px 0 0 0 #434c5eb3;\n}\n\n.ace-nord-dark .ace_indent-guide-active {\n box-shadow: inset -1px 0 0 0 #8395b8b3;\n}\n"; -exports.isDark = true; +}); + +define("ace/theme/nord_dark",["require","exports","module","ace/theme/nord_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; exports.cssClass = "ace-nord-dark"; -exports.cssText = ".ace-nord-dark .ace_gutter {\ -color: #616e88;\ -}\ -.ace-nord-dark .ace_print-margin {\ -width: 1px;\ -background: #4c566a;\ -}\ -.ace-nord-dark {\ -background-color: #2e3440;\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\ -.ace-nord-dark .ace_storage {\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_cursor {\ -color: #d8dee9;\ -},\ -.ace-nord-dark .ace_string.ace_regexp {\ -color: #bf616a;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_active-line {\ -background: #434c5ecc;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_selection {\ -background: #434c5ecc;\ -}\ -.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2e3440;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_step {\ -background: #ebcb8b;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #88c0d066;\ -}\ -.ace-nord-dark .ace_gutter-active-line {\ -background-color: #434c5ecc;\ -}\ -.ace-nord-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #88c0d066;\ -}\ -.ace-nord-dark .ace_invisible {\ -color: #4c566a;\ -}\ -.ace-nord-dark .ace_keyword,\ -.ace-nord-dark .ace_meta,\ -.ace-nord-dark .ace_support.ace_class,\ -.ace-nord-dark .ace_support.ace_type {\ -color: #81a1c1;\ -}\ -.ace-nord-dark .ace_constant.ace_character,\ -.ace-nord-dark .ace_constant.ace_other {\ -color: #d8dee9;\ -}\ -.ace-nord-dark .ace_constant.ace_language {\ -color: #5e81ac;\ -}\ -.ace-nord-dark .ace_constant.ace_escape {\ -color: #ebcB8b;\ -}\ -.ace-nord-dark .ace_constant.ace_numeric {\ -color: #b48ead;\ -}\ -.ace-nord-dark .ace_fold {\ -background-color: #4c566a;\ -border-color: #d8dee9;\ -}\ -.ace-nord-dark .ace_entity.ace_name.ace_function,\ -.ace-nord-dark .ace_entity.ace_name.ace_tag,\ -.ace-nord-dark .ace_support.ace_function,\ -.ace-nord-dark .ace_variable,\ -.ace-nord-dark .ace_variable.ace_language {\ -color: #8fbcbb;\ -}\ -.ace-nord-dark .ace_string {\ -color: #a3be8c;\ -}\ -.ace-nord-dark .ace_comment {\ -color: #616e88;\ -}\ -.ace-nord-dark .ace_indent-guide {\ -box-shadow: inset -1px 0 0 0 #434c5eb3;\ -}\ -"; +exports.cssText = require("./nord_dark-css"); exports.$selectionColorConflict = true; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/nord_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-one_dark.js b/app/Resources/ui/js/ace/theme-one_dark.js index b99f228..760ce48 100644 --- a/app/Resources/ui/js/ace/theme-one_dark.js +++ b/app/Resources/ui/js/ace/theme-one_dark.js @@ -1,135 +1,14 @@ -define("ace/theme/one_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/one_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-one-dark .ace_gutter {\n background: #282c34;\n color: #6a6f7a\n}\n\n.ace-one-dark .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-one-dark {\n background-color: #282c34;\n color: #abb2bf\n}\n\n.ace-one-dark .ace_cursor {\n color: #528bff\n}\n\n.ace-one-dark .ace_marker-layer .ace_selection {\n background: #3d4350\n}\n\n.ace-one-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0 #282c34;\n border-radius: 2px\n}\n\n.ace-one-dark .ace_marker-layer .ace_step {\n background: #c6dbae\n}\n\n.ace-one-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #747369\n}\n\n.ace-one-dark .ace_marker-layer .ace_active-line {\n background: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_gutter-active-line {\n background-color: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #3d4350\n}\n\n.ace-one-dark .ace_fold {\n background-color: #61afef;\n border-color: #abb2bf\n}\n\n.ace-one-dark .ace_keyword {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_operator {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_other.ace_unit {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_language {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_numeric {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_character {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_constant.ace_other {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_support.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_support.ace_constant {\n color: #d19a66\n}\n\n.ace-one-dark .ace_support.ace_class {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_support.ace_type {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_storage {\n color: #c678dd\n}\n\n.ace-one-dark .ace_storage.ace_type {\n color: #c678dd\n}\n\n.ace-one-dark .ace_invalid {\n color: #fff;\n background-color: #f2777a\n}\n\n.ace-one-dark .ace_invalid.ace_deprecated {\n color: #272b33;\n background-color: #d27b53\n}\n\n.ace-one-dark .ace_string {\n color: #98c379\n}\n\n.ace-one-dark .ace_string.ace_regexp {\n color: #e06c75\n}\n\n.ace-one-dark .ace_comment {\n font-style: italic;\n color: #5c6370\n}\n\n.ace-one-dark .ace_variable {\n color: #e06c75\n}\n\n.ace-one-dark .ace_variable.ace_parameter {\n color: #d19a66\n}\n\n.ace-one-dark .ace_meta.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_markup.ace_heading {\n color: #98c379\n}\n\n.ace-one-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-one-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; - exports.isDark = true; - exports.cssClass = "ace-one-dark"; - exports.cssText = ".ace-one-dark .ace_gutter {\ -background: #282c34;\ -color: #6a6f7a\ -}\ -.ace-one-dark .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-one-dark {\ -background-color: #282c34;\ -color: #abb2bf\ -}\ -.ace-one-dark .ace_cursor {\ -color: #528bff\ -}\ -.ace-one-dark .ace_marker-layer .ace_selection {\ -background: #3d4350\ -}\ -.ace-one-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0 #282c34;\ -border-radius: 2px\ -}\ -.ace-one-dark .ace_marker-layer .ace_step {\ -background: #c6dbae\ -}\ -.ace-one-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #747369\ -}\ -.ace-one-dark .ace_marker-layer .ace_active-line {\ -background: rgba(76, 87, 103, .19)\ -}\ -.ace-one-dark .ace_gutter-active-line {\ -background-color: rgba(76, 87, 103, .19)\ -}\ -.ace-one-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #3d4350\ -}\ -.ace-one-dark .ace_fold {\ -background-color: #61afef;\ -border-color: #abb2bf\ -}\ -.ace-one-dark .ace_keyword {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_keyword.ace_operator {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_keyword.ace_other.ace_unit {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_language {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_numeric {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_constant.ace_character {\ -color: #56b6c2\ -}\ -.ace-one-dark .ace_constant.ace_other {\ -color: #56b6c2\ -}\ -.ace-one-dark .ace_support.ace_function {\ -color: #61afef\ -}\ -.ace-one-dark .ace_support.ace_constant {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_support.ace_class {\ -color: #e5c07b\ -}\ -.ace-one-dark .ace_support.ace_type {\ -color: #e5c07b\ -}\ -.ace-one-dark .ace_storage {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_storage.ace_type {\ -color: #c678dd\ -}\ -.ace-one-dark .ace_invalid {\ -color: #fff;\ -background-color: #f2777a\ -}\ -.ace-one-dark .ace_invalid.ace_deprecated {\ -color: #272b33;\ -background-color: #d27b53\ -}\ -.ace-one-dark .ace_string {\ -color: #98c379\ -}\ -.ace-one-dark .ace_string.ace_regexp {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_comment {\ -font-style: italic;\ -color: #5c6370\ -}\ -.ace-one-dark .ace_variable {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_variable.ace_parameter {\ -color: #d19a66\ -}\ -.ace-one-dark .ace_meta.ace_tag {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_entity.ace_name.ace_function {\ -color: #61afef\ -}\ -.ace-one-dark .ace_entity.ace_name.ace_tag {\ -color: #e06c75\ -}\ -.ace-one-dark .ace_markup.ace_heading {\ -color: #98c379\ -}\ -.ace-one-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; - - var dom = require("../lib/dom"); - dom.importCssString(exports.cssText, exports.cssClass, false); - }); (function() { +}); + +define("ace/theme/one_dark",["require","exports","module","ace/theme/one_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-one-dark"; +exports.cssText = require("./one_dark-css"); +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass, false); + +}); (function() { window.require(["ace/theme/one_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { module.exports = m; diff --git a/app/Resources/ui/js/ace/theme-pastel_on_dark.js b/app/Resources/ui/js/ace/theme-pastel_on_dark.js index cc51053..277e427 100644 --- a/app/Resources/ui/js/ace/theme-pastel_on_dark.js +++ b/app/Resources/ui/js/ace/theme-pastel_on_dark.js @@ -1,110 +1,13 @@ -define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/pastel_on_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-pastel-on-dark .ace_gutter {\n background: #353030;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_print-margin {\n width: 1px;\n background: #353030\n}\n\n.ace-pastel-on-dark {\n background-color: #2C2828;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2C2828;\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_keyword,\n.ace-pastel-on-dark .ace_meta {\n color: #757aD8\n}\n\n.ace-pastel-on-dark .ace_constant,\n.ace-pastel-on-dark .ace_constant.ace_character,\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\n.ace-pastel-on-dark .ace_constant.ace_other {\n color: #4FB7C5\n}\n\n.ace-pastel-on-dark .ace_keyword.ace_operator {\n color: #797878\n}\n\n.ace-pastel-on-dark .ace_constant.ace_character {\n color: #AFA472\n}\n\n.ace-pastel-on-dark .ace_constant.ace_language {\n color: #DE8E30\n}\n\n.ace-pastel-on-dark .ace_constant.ace_numeric {\n color: #CCCCCC\n}\n\n.ace-pastel-on-dark .ace_invalid,\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-pastel-on-dark .ace_fold {\n background-color: #757aD8;\n border-color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_support.ace_function {\n color: #AEB2F8\n}\n\n.ace-pastel-on-dark .ace_string {\n color: #66A968\n}\n\n.ace-pastel-on-dark .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-pastel-on-dark .ace_comment {\n color: #A6C6FF\n}\n\n.ace-pastel-on-dark .ace_variable {\n color: #BEBF55\n}\n\n.ace-pastel-on-dark .ace_variable.ace_language {\n color: #C1C144\n}\n\n.ace-pastel-on-dark .ace_xml-pe {\n color: #494949\n}\n\n.ace-pastel-on-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-pastel-on-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-pastel-on-dark"; -exports.cssText = ".ace-pastel-on-dark .ace_gutter {\ -background: #353030;\ -color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_print-margin {\ -width: 1px;\ -background: #353030\ -}\ -.ace-pastel-on-dark {\ -background-color: #2C2828;\ -color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_cursor {\ -color: #A7A7A7\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2C2828;\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031)\ -}\ -.ace-pastel-on-dark .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.031)\ -}\ -.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(221, 240, 255, 0.20)\ -}\ -.ace-pastel-on-dark .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-pastel-on-dark .ace_keyword,\ -.ace-pastel-on-dark .ace_meta {\ -color: #757aD8\ -}\ -.ace-pastel-on-dark .ace_constant,\ -.ace-pastel-on-dark .ace_constant.ace_character,\ -.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\ -.ace-pastel-on-dark .ace_constant.ace_other {\ -color: #4FB7C5\ -}\ -.ace-pastel-on-dark .ace_keyword.ace_operator {\ -color: #797878\ -}\ -.ace-pastel-on-dark .ace_constant.ace_character {\ -color: #AFA472\ -}\ -.ace-pastel-on-dark .ace_constant.ace_language {\ -color: #DE8E30\ -}\ -.ace-pastel-on-dark .ace_constant.ace_numeric {\ -color: #CCCCCC\ -}\ -.ace-pastel-on-dark .ace_invalid,\ -.ace-pastel-on-dark .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-pastel-on-dark .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1\ -}\ -.ace-pastel-on-dark .ace_fold {\ -background-color: #757aD8;\ -border-color: #8F938F\ -}\ -.ace-pastel-on-dark .ace_support.ace_function {\ -color: #AEB2F8\ -}\ -.ace-pastel-on-dark .ace_string {\ -color: #66A968\ -}\ -.ace-pastel-on-dark .ace_string.ace_regexp {\ -color: #E9C062\ -}\ -.ace-pastel-on-dark .ace_comment {\ -color: #A6C6FF\ -}\ -.ace-pastel-on-dark .ace_variable {\ -color: #BEBF55\ -}\ -.ace-pastel-on-dark .ace_variable.ace_language {\ -color: #C1C144\ -}\ -.ace-pastel-on-dark .ace_xml-pe {\ -color: #494949\ -}\ -.ace-pastel-on-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/pastel_on_dark",["require","exports","module","ace/theme/pastel_on_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-pastel-on-dark"; +exports.cssText = require("./pastel_on_dark-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/pastel_on_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-solarized_dark.js b/app/Resources/ui/js/ace/theme-solarized_dark.js index e9a2664..5109518 100644 --- a/app/Resources/ui/js/ace/theme-solarized_dark.js +++ b/app/Resources/ui/js/ace/theme-solarized_dark.js @@ -1,90 +1,13 @@ -define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/solarized_dark-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #839496\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #839496\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-solarized-dark"; -exports.cssText = ".ace-solarized-dark .ace_gutter {\ -background: #01313f;\ -color: #d0edf7\ -}\ -.ace-solarized-dark .ace_print-margin {\ -width: 1px;\ -background: #33555E\ -}\ -.ace-solarized-dark {\ -background-color: #002B36;\ -color: #93A1A1\ -}\ -.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\ -.ace-solarized-dark .ace_storage {\ -color: #93A1A1\ -}\ -.ace-solarized-dark .ace_cursor,\ -.ace-solarized-dark .ace_string.ace_regexp {\ -color: #D30102\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_active-line,\ -.ace-solarized-dark .ace_marker-layer .ace_selection {\ -background: rgba(255, 255, 255, 0.1)\ -}\ -.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002B36;\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-dark .ace_gutter-active-line {\ -background-color: #0d3440\ -}\ -.ace-solarized-dark .ace_marker-layer .ace_selected-word {\ -border: 1px solid #073642\ -}\ -.ace-solarized-dark .ace_invisible {\ -color: rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-dark .ace_keyword,\ -.ace-solarized-dark .ace_meta,\ -.ace-solarized-dark .ace_support.ace_class,\ -.ace-solarized-dark .ace_support.ace_type {\ -color: #859900\ -}\ -.ace-solarized-dark .ace_constant.ace_character,\ -.ace-solarized-dark .ace_constant.ace_other {\ -color: #CB4B16\ -}\ -.ace-solarized-dark .ace_constant.ace_language {\ -color: #B58900\ -}\ -.ace-solarized-dark .ace_constant.ace_numeric {\ -color: #D33682\ -}\ -.ace-solarized-dark .ace_fold {\ -background-color: #268BD2;\ -border-color: #93A1A1\ -}\ -.ace-solarized-dark .ace_entity.ace_name.ace_function,\ -.ace-solarized-dark .ace_entity.ace_name.ace_tag,\ -.ace-solarized-dark .ace_support.ace_function,\ -.ace-solarized-dark .ace_variable,\ -.ace-solarized-dark .ace_variable.ace_language {\ -color: #268BD2\ -}\ -.ace-solarized-dark .ace_string {\ -color: #2AA198\ -}\ -.ace-solarized-dark .ace_comment {\ -font-style: italic;\ -color: #657B83\ -}\ -.ace-solarized-dark .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-solarized-dark"; +exports.cssText = require("./solarized_dark-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/solarized_dark"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-solarized_light.js b/app/Resources/ui/js/ace/theme-solarized_light.js index 2746ea6..be6c287 100644 --- a/app/Resources/ui/js/ace/theme-solarized_light.js +++ b/app/Resources/ui/js/ace/theme-solarized_light.js @@ -1,93 +1,13 @@ -define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/solarized_light-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-solarized-light .ace_gutter {\n background: #fbf1d3;\n color: #333\n}\n\n.ace-solarized-light .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-solarized-light {\n background-color: #FDF6E3;\n color: #586E75\n}\n\n.ace-solarized-light .ace_cursor {\n color: #000000\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selection {\n background: rgba(7, 54, 67, 0.09)\n}\n\n.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FDF6E3;\n}\n\n.ace-solarized-light .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_active-line {\n background: #EEE8D5\n}\n\n.ace-solarized-light .ace_gutter-active-line {\n background-color : #EDE5C1\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selected-word {\n border: 1px solid #7f9390\n}\n\n.ace-solarized-light .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_keyword,\n.ace-solarized-light .ace_meta,\n.ace-solarized-light .ace_support.ace_class,\n.ace-solarized-light .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-light .ace_constant.ace_character,\n.ace-solarized-light .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-light .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-light .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-light .ace_fold {\n background-color: #268BD2;\n border-color: #586E75\n}\n\n.ace-solarized-light .ace_entity.ace_name.ace_function,\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\n.ace-solarized-light .ace_support.ace_function,\n.ace-solarized-light .ace_variable,\n.ace-solarized-light .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-light .ace_storage {\n color: #073642\n}\n\n.ace-solarized-light .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-light .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-light .ace_comment,\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\n color: #93A1A1\n}\n\n.ace-solarized-light .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-light .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-solarized-light"; -exports.cssText = ".ace-solarized-light .ace_gutter {\ -background: #fbf1d3;\ -color: #333\ -}\ -.ace-solarized-light .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-solarized-light {\ -background-color: #FDF6E3;\ -color: #586E75\ -}\ -.ace-solarized-light .ace_cursor {\ -color: #000000\ -}\ -.ace-solarized-light .ace_marker-layer .ace_selection {\ -background: rgba(7, 54, 67, 0.09)\ -}\ -.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FDF6E3;\ -}\ -.ace-solarized-light .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-solarized-light .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-light .ace_marker-layer .ace_active-line {\ -background: #EEE8D5\ -}\ -.ace-solarized-light .ace_gutter-active-line {\ -background-color : #EDE5C1\ -}\ -.ace-solarized-light .ace_marker-layer .ace_selected-word {\ -border: 1px solid #7f9390\ -}\ -.ace-solarized-light .ace_invisible {\ -color: rgba(147, 161, 161, 0.50)\ -}\ -.ace-solarized-light .ace_keyword,\ -.ace-solarized-light .ace_meta,\ -.ace-solarized-light .ace_support.ace_class,\ -.ace-solarized-light .ace_support.ace_type {\ -color: #859900\ -}\ -.ace-solarized-light .ace_constant.ace_character,\ -.ace-solarized-light .ace_constant.ace_other {\ -color: #CB4B16\ -}\ -.ace-solarized-light .ace_constant.ace_language {\ -color: #B58900\ -}\ -.ace-solarized-light .ace_constant.ace_numeric {\ -color: #D33682\ -}\ -.ace-solarized-light .ace_fold {\ -background-color: #268BD2;\ -border-color: #586E75\ -}\ -.ace-solarized-light .ace_entity.ace_name.ace_function,\ -.ace-solarized-light .ace_entity.ace_name.ace_tag,\ -.ace-solarized-light .ace_support.ace_function,\ -.ace-solarized-light .ace_variable,\ -.ace-solarized-light .ace_variable.ace_language {\ -color: #268BD2\ -}\ -.ace-solarized-light .ace_storage {\ -color: #073642\ -}\ -.ace-solarized-light .ace_string {\ -color: #2AA198\ -}\ -.ace-solarized-light .ace_string.ace_regexp {\ -color: #D30102\ -}\ -.ace-solarized-light .ace_comment,\ -.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\ -color: #93A1A1\ -}\ -.ace-solarized-light .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/solarized_light",["require","exports","module","ace/theme/solarized_light-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-solarized-light"; +exports.cssText = require("./solarized_light-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/solarized_light"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-sqlserver.js b/app/Resources/ui/js/ace/theme-sqlserver.js index 1b626a2..d5f1e4f 100644 --- a/app/Resources/ui/js/ace/theme-sqlserver.js +++ b/app/Resources/ui/js/ace/theme-sqlserver.js @@ -1,140 +1,13 @@ -define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/sqlserver-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-sqlserver .ace_gutter {\n background: #ebebeb;\n color: #333;\n overflow: hidden;\n}\n\n.ace-sqlserver .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-sqlserver {\n background-color: #FFFFFF;\n color: black;\n}\n\n.ace-sqlserver .ace_identifier {\n color: black;\n}\n\n.ace-sqlserver .ace_keyword {\n color: #0000FF;\n}\n\n.ace-sqlserver .ace_numeric {\n color: black;\n}\n\n.ace-sqlserver .ace_storage {\n color: #11B7BE;\n}\n\n.ace-sqlserver .ace_keyword.ace_operator,\n.ace-sqlserver .ace_lparen,\n.ace-sqlserver .ace_rparen,\n.ace-sqlserver .ace_punctuation {\n color: #808080;\n}\n\n.ace-sqlserver .ace_set.ace_statement {\n color: #0000FF;\n text-decoration: underline;\n}\n\n.ace-sqlserver .ace_cursor {\n color: black;\n}\n\n.ace-sqlserver .ace_invisible {\n color: rgb(191, 191, 191);\n}\n\n.ace-sqlserver .ace_constant.ace_buildin {\n color: rgb(88, 72, 246);\n}\n\n.ace-sqlserver .ace_constant.ace_language {\n color: #979797;\n}\n\n.ace-sqlserver .ace_constant.ace_library {\n color: rgb(6, 150, 14);\n}\n\n.ace-sqlserver .ace_invalid {\n background-color: rgb(153, 0, 0);\n color: white;\n}\n\n.ace-sqlserver .ace_support.ace_function {\n color: #FF00FF;\n}\n\n.ace-sqlserver .ace_support.ace_constant {\n color: rgb(6, 150, 14);\n}\n\n.ace-sqlserver .ace_class {\n color: #008080;\n}\n\n.ace-sqlserver .ace_support.ace_other {\n color: #6D79DE;\n}\n\n.ace-sqlserver .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F;\n}\n\n.ace-sqlserver .ace_comment {\n color: #008000;\n}\n\n.ace-sqlserver .ace_constant.ace_numeric {\n color: black;\n}\n\n.ace-sqlserver .ace_variable {\n color: rgb(49, 132, 149);\n}\n\n.ace-sqlserver .ace_xml-pe {\n color: rgb(104, 104, 91);\n}\n\n.ace-sqlserver .ace_support.ace_storedprocedure {\n color: #800000;\n}\n\n.ace-sqlserver .ace_heading {\n color: rgb(12, 7, 255);\n}\n\n.ace-sqlserver .ace_list {\n color: rgb(185, 6, 144);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_selection {\n background: rgb(181, 213, 255);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-sqlserver .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.07);\n}\n\n.ace-sqlserver .ace_gutter-active-line {\n background-color: #dcdcdc;\n}\n\n.ace-sqlserver .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-sqlserver .ace_meta.ace_tag {\n color: #0000FF;\n}\n\n.ace-sqlserver .ace_string.ace_regex {\n color: #FF0000;\n}\n\n.ace-sqlserver .ace_string {\n color: #FF0000;\n}\n\n.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\n color: #994409;\n}\n\n.ace-sqlserver .ace_indent-guide {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\n}\n\n.ace-sqlserver .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-sqlserver"; -exports.cssText = ".ace-sqlserver .ace_gutter {\ -background: #ebebeb;\ -color: #333;\ -overflow: hidden;\ -}\ -.ace-sqlserver .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-sqlserver {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-sqlserver .ace_identifier {\ -color: black;\ -}\ -.ace-sqlserver .ace_keyword {\ -color: #0000FF;\ -}\ -.ace-sqlserver .ace_numeric {\ -color: black;\ -}\ -.ace-sqlserver .ace_storage {\ -color: #11B7BE;\ -}\ -.ace-sqlserver .ace_keyword.ace_operator,\ -.ace-sqlserver .ace_lparen,\ -.ace-sqlserver .ace_rparen,\ -.ace-sqlserver .ace_punctuation {\ -color: #808080;\ -}\ -.ace-sqlserver .ace_set.ace_statement {\ -color: #0000FF;\ -text-decoration: underline;\ -}\ -.ace-sqlserver .ace_cursor {\ -color: black;\ -}\ -.ace-sqlserver .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-sqlserver .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-sqlserver .ace_constant.ace_language {\ -color: #979797;\ -}\ -.ace-sqlserver .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-sqlserver .ace_invalid {\ -background-color: rgb(153, 0, 0);\ -color: white;\ -}\ -.ace-sqlserver .ace_support.ace_function {\ -color: #FF00FF;\ -}\ -.ace-sqlserver .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-sqlserver .ace_class {\ -color: #008080;\ -}\ -.ace-sqlserver .ace_support.ace_other {\ -color: #6D79DE;\ -}\ -.ace-sqlserver .ace_variable.ace_parameter {\ -font-style: italic;\ -color: #FD971F;\ -}\ -.ace-sqlserver .ace_comment {\ -color: #008000;\ -}\ -.ace-sqlserver .ace_constant.ace_numeric {\ -color: black;\ -}\ -.ace-sqlserver .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-sqlserver .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-sqlserver .ace_support.ace_storedprocedure {\ -color: #800000;\ -}\ -.ace-sqlserver .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-sqlserver .ace_list {\ -color: rgb(185, 6, 144);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-sqlserver .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-sqlserver .ace_gutter-active-line {\ -background-color: #dcdcdc;\ -}\ -.ace-sqlserver .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-sqlserver .ace_meta.ace_tag {\ -color: #0000FF;\ -}\ -.ace-sqlserver .ace_string.ace_regex {\ -color: #FF0000;\ -}\ -.ace-sqlserver .ace_string {\ -color: #FF0000;\ -}\ -.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\ -color: #994409;\ -}\ -.ace-sqlserver .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; +}); +define("ace/theme/sqlserver",["require","exports","module","ace/theme/sqlserver-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-sqlserver"; +exports.cssText = require("./sqlserver-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/sqlserver"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-terminal.js b/app/Resources/ui/js/ace/theme-terminal.js index b10de0b..1aa6c89 100644 --- a/app/Resources/ui/js/ace/theme-terminal.js +++ b/app/Resources/ui/js/ace/theme-terminal.js @@ -1,116 +1,13 @@ -define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/terminal-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-terminal-theme .ace_gutter {\n background: #1a0005;\n color: steelblue\n}\n\n.ace-terminal-theme .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-terminal-theme {\n background-color: black;\n color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px black;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_step {\n background: rgb(0, 0, 0)\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\n margin: -1px 0 0 -1px;\n border: 1px solid #900\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-terminal-theme .ace_gutter-active-line {\n background-color: #2A112A\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid #424242\n}\n\n.ace-terminal-theme .ace_invisible {\n color: #343434\n}\n\n.ace-terminal-theme .ace_keyword,\n.ace-terminal-theme .ace_meta,\n.ace-terminal-theme .ace_storage,\n.ace-terminal-theme .ace_storage.ace_type,\n.ace-terminal-theme .ace_support.ace_type {\n color: tomato\n}\n\n.ace-terminal-theme .ace_keyword.ace_operator {\n color: deeppink\n}\n\n.ace-terminal-theme .ace_constant.ace_character,\n.ace-terminal-theme .ace_constant.ace_language,\n.ace-terminal-theme .ace_constant.ace_numeric,\n.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\n.ace-terminal-theme .ace_support.ace_constant,\n.ace-terminal-theme .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-terminal-theme .ace_constant.ace_other {\n color: gold\n}\n\n.ace-terminal-theme .ace_invalid {\n color: yellow;\n background-color: red\n}\n\n.ace-terminal-theme .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-terminal-theme .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_function,\n.ace-terminal-theme .ace_support.ace_function,\n.ace-terminal-theme .ace_variable {\n color: #7AA6DA\n}\n\n.ace-terminal-theme .ace_support.ace_class,\n.ace-terminal-theme .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-terminal-theme .ace_heading,\n.ace-terminal-theme .ace_string {\n color: #B9CA4A\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_tag,\n.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\n.ace-terminal-theme .ace_meta.ace_tag,\n.ace-terminal-theme .ace_string.ace_regexp,\n.ace-terminal-theme .ace_variable {\n color: #D54E53\n}\n\n.ace-terminal-theme .ace_comment {\n color: orangered\n}\n\n.ace-terminal-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-terminal-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-terminal-theme"; -exports.cssText = ".ace-terminal-theme .ace_gutter {\ -background: #1a0005;\ -color: steelblue\ -}\ -.ace-terminal-theme .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-terminal-theme {\ -background-color: black;\ -color: #DEDEDE\ -}\ -.ace-terminal-theme .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px black;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_step {\ -background: rgb(0, 0, 0)\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket {\ -background: #090;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\ -background: #090;\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #900\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_active-line {\ -background: #2A2A2A\ -}\ -.ace-terminal-theme .ace_gutter-active-line {\ -background-color: #2A112A\ -}\ -.ace-terminal-theme .ace_marker-layer .ace_selected-word {\ -border: 1px solid #424242\ -}\ -.ace-terminal-theme .ace_invisible {\ -color: #343434\ -}\ -.ace-terminal-theme .ace_keyword,\ -.ace-terminal-theme .ace_meta,\ -.ace-terminal-theme .ace_storage,\ -.ace-terminal-theme .ace_storage.ace_type,\ -.ace-terminal-theme .ace_support.ace_type {\ -color: tomato\ -}\ -.ace-terminal-theme .ace_keyword.ace_operator {\ -color: deeppink\ -}\ -.ace-terminal-theme .ace_constant.ace_character,\ -.ace-terminal-theme .ace_constant.ace_language,\ -.ace-terminal-theme .ace_constant.ace_numeric,\ -.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\ -.ace-terminal-theme .ace_support.ace_constant,\ -.ace-terminal-theme .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-terminal-theme .ace_constant.ace_other {\ -color: gold\ -}\ -.ace-terminal-theme .ace_invalid {\ -color: yellow;\ -background-color: red\ -}\ -.ace-terminal-theme .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-terminal-theme .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-terminal-theme .ace_entity.ace_name.ace_function,\ -.ace-terminal-theme .ace_support.ace_function,\ -.ace-terminal-theme .ace_variable {\ -color: #7AA6DA\ -}\ -.ace-terminal-theme .ace_support.ace_class,\ -.ace-terminal-theme .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-terminal-theme .ace_heading,\ -.ace-terminal-theme .ace_string {\ -color: #B9CA4A\ -}\ -.ace-terminal-theme .ace_entity.ace_name.ace_tag,\ -.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\ -.ace-terminal-theme .ace_meta.ace_tag,\ -.ace-terminal-theme .ace_string.ace_regexp,\ -.ace-terminal-theme .ace_variable {\ -color: #D54E53\ -}\ -.ace-terminal-theme .ace_comment {\ -color: orangered\ -}\ -.ace-terminal-theme .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\ -}\ -"; +}); +define("ace/theme/terminal",["require","exports","module","ace/theme/terminal-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-terminal-theme"; +exports.cssText = require("./terminal-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/terminal"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-textmate.js b/app/Resources/ui/js/ace/theme-textmate.js index dc651d7..524b432 100644 --- a/app/Resources/ui/js/ace/theme-textmate.js +++ b/app/Resources/ui/js/ace/theme-textmate.js @@ -1,132 +1,11 @@ -define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { -"use strict"; - +define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"], function(require, exports, module){"use strict"; exports.isDark = false; exports.cssClass = "ace-tm"; -exports.cssText = ".ace-tm .ace_gutter {\ -background: #f0f0f0;\ -color: #333;\ -}\ -.ace-tm .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8;\ -}\ -.ace-tm .ace_fold {\ -background-color: #6B72E6;\ -}\ -.ace-tm {\ -background-color: #FFFFFF;\ -color: black;\ -}\ -.ace-tm .ace_cursor {\ -color: black;\ -}\ -.ace-tm .ace_invisible {\ -color: rgb(191, 191, 191);\ -}\ -.ace-tm .ace_storage,\ -.ace-tm .ace_keyword {\ -color: blue;\ -}\ -.ace-tm .ace_constant {\ -color: rgb(197, 6, 11);\ -}\ -.ace-tm .ace_constant.ace_buildin {\ -color: rgb(88, 72, 246);\ -}\ -.ace-tm .ace_constant.ace_language {\ -color: rgb(88, 92, 246);\ -}\ -.ace-tm .ace_constant.ace_library {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_invalid {\ -background-color: rgba(255, 0, 0, 0.1);\ -color: red;\ -}\ -.ace-tm .ace_support.ace_function {\ -color: rgb(60, 76, 114);\ -}\ -.ace-tm .ace_support.ace_constant {\ -color: rgb(6, 150, 14);\ -}\ -.ace-tm .ace_support.ace_type,\ -.ace-tm .ace_support.ace_class {\ -color: rgb(109, 121, 222);\ -}\ -.ace-tm .ace_keyword.ace_operator {\ -color: rgb(104, 118, 135);\ -}\ -.ace-tm .ace_string {\ -color: rgb(3, 106, 7);\ -}\ -.ace-tm .ace_comment {\ -color: rgb(76, 136, 107);\ -}\ -.ace-tm .ace_comment.ace_doc {\ -color: rgb(0, 102, 255);\ -}\ -.ace-tm .ace_comment.ace_doc.ace_tag {\ -color: rgb(128, 159, 191);\ -}\ -.ace-tm .ace_constant.ace_numeric {\ -color: rgb(0, 0, 205);\ -}\ -.ace-tm .ace_variable {\ -color: rgb(49, 132, 149);\ -}\ -.ace-tm .ace_xml-pe {\ -color: rgb(104, 104, 91);\ -}\ -.ace-tm .ace_entity.ace_name.ace_function {\ -color: #0000A2;\ -}\ -.ace-tm .ace_heading {\ -color: rgb(12, 7, 255);\ -}\ -.ace-tm .ace_list {\ -color:rgb(185, 6, 144);\ -}\ -.ace-tm .ace_meta.ace_tag {\ -color:rgb(0, 22, 142);\ -}\ -.ace-tm .ace_string.ace_regex {\ -color: rgb(255, 0, 0)\ -}\ -.ace-tm .ace_marker-layer .ace_selection {\ -background: rgb(181, 213, 255);\ -}\ -.ace-tm.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px white;\ -}\ -.ace-tm .ace_marker-layer .ace_step {\ -background: rgb(252, 255, 0);\ -}\ -.ace-tm .ace_marker-layer .ace_stack {\ -background: rgb(164, 229, 101);\ -}\ -.ace-tm .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgb(192, 192, 192);\ -}\ -.ace-tm .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.07);\ -}\ -.ace-tm .ace_gutter-active-line {\ -background-color : #dcdcdc;\ -}\ -.ace-tm .ace_marker-layer .ace_selected-word {\ -background: rgb(250, 250, 255);\ -border: 1px solid rgb(200, 200, 250);\ -}\ -.ace-tm .ace_indent-guide {\ -background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ -}\ -"; +exports.cssText = require("./textmate-css"); exports.$id = "ace/theme/textmate"; - var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/textmate"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow.js b/app/Resources/ui/js/ace/theme-tomorrow.js index b1f73da..d0d1b80 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow.js +++ b/app/Resources/ui/js/ace/theme-tomorrow.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow .ace_gutter {\n background: #f6f6f6;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_print-margin {\n width: 1px;\n background: #f6f6f6\n}\n\n.ace-tomorrow {\n background-color: #FFFFFF;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selection {\n background: #D6D6D6\n}\n\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-tomorrow .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-tomorrow .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #D1D1D1\n}\n\n.ace-tomorrow .ace_marker-layer .ace_active-line {\n background: #EFEFEF\n}\n\n.ace-tomorrow .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\n border: 1px solid #D6D6D6\n}\n\n.ace-tomorrow .ace_invisible {\n color: #D1D1D1\n}\n\n.ace-tomorrow .ace_keyword,\n.ace-tomorrow .ace_meta,\n.ace-tomorrow .ace_storage,\n.ace-tomorrow .ace_storage.ace_type,\n.ace-tomorrow .ace_support.ace_type {\n color: #8959A8\n}\n\n.ace-tomorrow .ace_keyword.ace_operator {\n color: #3E999F\n}\n\n.ace-tomorrow .ace_constant.ace_character,\n.ace-tomorrow .ace_constant.ace_language,\n.ace-tomorrow .ace_constant.ace_numeric,\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow .ace_support.ace_constant,\n.ace-tomorrow .ace_variable.ace_parameter {\n color: #F5871F\n}\n\n.ace-tomorrow .ace_constant.ace_other {\n color: #666969\n}\n\n.ace-tomorrow .ace_invalid {\n color: #FFFFFF;\n background-color: #C82829\n}\n\n.ace-tomorrow .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #8959A8\n}\n\n.ace-tomorrow .ace_fold {\n background-color: #4271AE;\n border-color: #4D4D4C\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_function,\n.ace-tomorrow .ace_support.ace_function,\n.ace-tomorrow .ace_variable {\n color: #4271AE\n}\n\n.ace-tomorrow .ace_support.ace_class,\n.ace-tomorrow .ace_support.ace_type {\n color: #C99E00\n}\n\n.ace-tomorrow .ace_heading,\n.ace-tomorrow .ace_markup.ace_heading,\n.ace-tomorrow .ace_string {\n color: #718C00\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow .ace_meta.ace_tag,\n.ace-tomorrow .ace_string.ace_regexp,\n.ace-tomorrow .ace_variable {\n color: #C82829\n}\n\n.ace-tomorrow .ace_comment {\n color: #8E908C\n}\n\n.ace-tomorrow .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-tomorrow .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-tomorrow"; -exports.cssText = ".ace-tomorrow .ace_gutter {\ -background: #f6f6f6;\ -color: #4D4D4C\ -}\ -.ace-tomorrow .ace_print-margin {\ -width: 1px;\ -background: #f6f6f6\ -}\ -.ace-tomorrow {\ -background-color: #FFFFFF;\ -color: #4D4D4C\ -}\ -.ace-tomorrow .ace_cursor {\ -color: #AEAFAD\ -}\ -.ace-tomorrow .ace_marker-layer .ace_selection {\ -background: #D6D6D6\ -}\ -.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-tomorrow .ace_marker-layer .ace_step {\ -background: rgb(255, 255, 0)\ -}\ -.ace-tomorrow .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #D1D1D1\ -}\ -.ace-tomorrow .ace_marker-layer .ace_active-line {\ -background: #EFEFEF\ -}\ -.ace-tomorrow .ace_gutter-active-line {\ -background-color : #dcdcdc\ -}\ -.ace-tomorrow .ace_marker-layer .ace_selected-word {\ -border: 1px solid #D6D6D6\ -}\ -.ace-tomorrow .ace_invisible {\ -color: #D1D1D1\ -}\ -.ace-tomorrow .ace_keyword,\ -.ace-tomorrow .ace_meta,\ -.ace-tomorrow .ace_storage,\ -.ace-tomorrow .ace_storage.ace_type,\ -.ace-tomorrow .ace_support.ace_type {\ -color: #8959A8\ -}\ -.ace-tomorrow .ace_keyword.ace_operator {\ -color: #3E999F\ -}\ -.ace-tomorrow .ace_constant.ace_character,\ -.ace-tomorrow .ace_constant.ace_language,\ -.ace-tomorrow .ace_constant.ace_numeric,\ -.ace-tomorrow .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow .ace_support.ace_constant,\ -.ace-tomorrow .ace_variable.ace_parameter {\ -color: #F5871F\ -}\ -.ace-tomorrow .ace_constant.ace_other {\ -color: #666969\ -}\ -.ace-tomorrow .ace_invalid {\ -color: #FFFFFF;\ -background-color: #C82829\ -}\ -.ace-tomorrow .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #8959A8\ -}\ -.ace-tomorrow .ace_fold {\ -background-color: #4271AE;\ -border-color: #4D4D4C\ -}\ -.ace-tomorrow .ace_entity.ace_name.ace_function,\ -.ace-tomorrow .ace_support.ace_function,\ -.ace-tomorrow .ace_variable {\ -color: #4271AE\ -}\ -.ace-tomorrow .ace_support.ace_class,\ -.ace-tomorrow .ace_support.ace_type {\ -color: #C99E00\ -}\ -.ace-tomorrow .ace_heading,\ -.ace-tomorrow .ace_markup.ace_heading,\ -.ace-tomorrow .ace_string {\ -color: #718C00\ -}\ -.ace-tomorrow .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow .ace_meta.ace_tag,\ -.ace-tomorrow .ace_string.ace_regexp,\ -.ace-tomorrow .ace_variable {\ -color: #C82829\ -}\ -.ace-tomorrow .ace_comment {\ -color: #8E908C\ -}\ -.ace-tomorrow .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow",["require","exports","module","ace/theme/tomorrow-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-tomorrow"; +exports.cssText = require("./tomorrow-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night.js b/app/Resources/ui/js/ace/theme-tomorrow_night.js index 36c748f..7984404 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night .ace_gutter {\n background: #25282c;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_print-margin {\n width: 1px;\n background: #25282c\n}\n\n.ace-tomorrow-night {\n background-color: #1D1F21;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\n background: #373B41\n}\n\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1D1F21;\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #4B4E55\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\n background: #282A2E\n}\n\n.ace-tomorrow-night .ace_gutter-active-line {\n background-color: #282A2E\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #373B41\n}\n\n.ace-tomorrow-night .ace_invisible {\n color: #4B4E55\n}\n\n.ace-tomorrow-night .ace_keyword,\n.ace-tomorrow-night .ace_meta,\n.ace-tomorrow-night .ace_storage,\n.ace-tomorrow-night .ace_storage.ace_type,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #B294BB\n}\n\n.ace-tomorrow-night .ace_keyword.ace_operator {\n color: #8ABEB7\n}\n\n.ace-tomorrow-night .ace_constant.ace_character,\n.ace-tomorrow-night .ace_constant.ace_language,\n.ace-tomorrow-night .ace_constant.ace_numeric,\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night .ace_support.ace_constant,\n.ace-tomorrow-night .ace_variable.ace_parameter {\n color: #DE935F\n}\n\n.ace-tomorrow-night .ace_constant.ace_other {\n color: #CED1CF\n}\n\n.ace-tomorrow-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night .ace_fold {\n background-color: #81A2BE;\n border-color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night .ace_support.ace_function,\n.ace-tomorrow-night .ace_variable {\n color: #81A2BE\n}\n\n.ace-tomorrow-night .ace_support.ace_class,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #F0C674\n}\n\n.ace-tomorrow-night .ace_heading,\n.ace-tomorrow-night .ace_markup.ace_heading,\n.ace-tomorrow-night .ace_string {\n color: #B5BD68\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night .ace_meta.ace_tag,\n.ace-tomorrow-night .ace_string.ace_regexp,\n.ace-tomorrow-night .ace_variable {\n color: #CC6666\n}\n\n.ace-tomorrow-night .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night"; -exports.cssText = ".ace-tomorrow-night .ace_gutter {\ -background: #25282c;\ -color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_print-margin {\ -width: 1px;\ -background: #25282c\ -}\ -.ace-tomorrow-night {\ -background-color: #1D1F21;\ -color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_cursor {\ -color: #AEAFAD\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_selection {\ -background: #373B41\ -}\ -.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #1D1F21;\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #4B4E55\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_active-line {\ -background: #282A2E\ -}\ -.ace-tomorrow-night .ace_gutter-active-line {\ -background-color: #282A2E\ -}\ -.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\ -border: 1px solid #373B41\ -}\ -.ace-tomorrow-night .ace_invisible {\ -color: #4B4E55\ -}\ -.ace-tomorrow-night .ace_keyword,\ -.ace-tomorrow-night .ace_meta,\ -.ace-tomorrow-night .ace_storage,\ -.ace-tomorrow-night .ace_storage.ace_type,\ -.ace-tomorrow-night .ace_support.ace_type {\ -color: #B294BB\ -}\ -.ace-tomorrow-night .ace_keyword.ace_operator {\ -color: #8ABEB7\ -}\ -.ace-tomorrow-night .ace_constant.ace_character,\ -.ace-tomorrow-night .ace_constant.ace_language,\ -.ace-tomorrow-night .ace_constant.ace_numeric,\ -.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night .ace_support.ace_constant,\ -.ace-tomorrow-night .ace_variable.ace_parameter {\ -color: #DE935F\ -}\ -.ace-tomorrow-night .ace_constant.ace_other {\ -color: #CED1CF\ -}\ -.ace-tomorrow-night .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-tomorrow-night .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-tomorrow-night .ace_fold {\ -background-color: #81A2BE;\ -border-color: #C5C8C6\ -}\ -.ace-tomorrow-night .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night .ace_support.ace_function,\ -.ace-tomorrow-night .ace_variable {\ -color: #81A2BE\ -}\ -.ace-tomorrow-night .ace_support.ace_class,\ -.ace-tomorrow-night .ace_support.ace_type {\ -color: #F0C674\ -}\ -.ace-tomorrow-night .ace_heading,\ -.ace-tomorrow-night .ace_markup.ace_heading,\ -.ace-tomorrow-night .ace_string {\ -color: #B5BD68\ -}\ -.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night .ace_meta.ace_tag,\ -.ace-tomorrow-night .ace_string.ace_regexp,\ -.ace-tomorrow-night .ace_variable {\ -color: #CC6666\ -}\ -.ace-tomorrow-night .ace_comment {\ -color: #969896\ -}\ -.ace-tomorrow-night .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night",["require","exports","module","ace/theme/tomorrow_night-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night"; +exports.cssText = require("./tomorrow_night-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js index 7bf7fc6..dd46696 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_blue.js @@ -1,108 +1,13 @@ -define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_blue-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-blue .ace_gutter {\n background: #00204b;\n color: #7388b5\n}\n\n.ace-tomorrow-night-blue .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-tomorrow-night-blue {\n background-color: #002451;\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_other,\n.ace-tomorrow-night-blue .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002451;\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-tomorrow-night-blue .ace_gutter-active-line {\n background-color: #022040\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-tomorrow-night-blue .ace_invisible {\n color: #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_keyword,\n.ace-tomorrow-night-blue .ace_meta,\n.ace-tomorrow-night-blue .ace_storage,\n.ace-tomorrow-night-blue .ace_storage.ace_type,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\n color: #99FFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_character,\n.ace-tomorrow-night-blue .ace_constant.ace_language,\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-blue .ace_support.ace_constant,\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-tomorrow-night-blue .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-blue .ace_support.ace_function,\n.ace-tomorrow-night-blue .ace_variable {\n color: #BBDAFF\n}\n\n.ace-tomorrow-night-blue .ace_support.ace_class,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-tomorrow-night-blue .ace_heading,\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\n.ace-tomorrow-night-blue .ace_string {\n color: #D1F1A9\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\n.ace-tomorrow-night-blue .ace_variable {\n color: #FF9DA4\n}\n\n.ace-tomorrow-night-blue .ace_comment {\n color: #7285B7\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-blue"; -exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\ -background: #00204b;\ -color: #7388b5\ -}\ -.ace-tomorrow-night-blue .ace_print-margin {\ -width: 1px;\ -background: #00204b\ -}\ -.ace-tomorrow-night-blue {\ -background-color: #002451;\ -color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_constant.ace_other,\ -.ace-tomorrow-night-blue .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\ -background: #003F8E\ -}\ -.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #002451;\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\ -background: rgb(127, 111, 19)\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404F7D\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\ -background: #00346E\ -}\ -.ace-tomorrow-night-blue .ace_gutter-active-line {\ -background-color: #022040\ -}\ -.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\ -border: 1px solid #003F8E\ -}\ -.ace-tomorrow-night-blue .ace_invisible {\ -color: #404F7D\ -}\ -.ace-tomorrow-night-blue .ace_keyword,\ -.ace-tomorrow-night-blue .ace_meta,\ -.ace-tomorrow-night-blue .ace_storage,\ -.ace-tomorrow-night-blue .ace_storage.ace_type,\ -.ace-tomorrow-night-blue .ace_support.ace_type {\ -color: #EBBBFF\ -}\ -.ace-tomorrow-night-blue .ace_keyword.ace_operator {\ -color: #99FFFF\ -}\ -.ace-tomorrow-night-blue .ace_constant.ace_character,\ -.ace-tomorrow-night-blue .ace_constant.ace_language,\ -.ace-tomorrow-night-blue .ace_constant.ace_numeric,\ -.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-blue .ace_support.ace_constant,\ -.ace-tomorrow-night-blue .ace_variable.ace_parameter {\ -color: #FFC58F\ -}\ -.ace-tomorrow-night-blue .ace_invalid {\ -color: #FFFFFF;\ -background-color: #F99DA5\ -}\ -.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\ -color: #FFFFFF;\ -background-color: #EBBBFF\ -}\ -.ace-tomorrow-night-blue .ace_fold {\ -background-color: #BBDAFF;\ -border-color: #FFFFFF\ -}\ -.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-blue .ace_support.ace_function,\ -.ace-tomorrow-night-blue .ace_variable {\ -color: #BBDAFF\ -}\ -.ace-tomorrow-night-blue .ace_support.ace_class,\ -.ace-tomorrow-night-blue .ace_support.ace_type {\ -color: #FFEEAD\ -}\ -.ace-tomorrow-night-blue .ace_heading,\ -.ace-tomorrow-night-blue .ace_markup.ace_heading,\ -.ace-tomorrow-night-blue .ace_string {\ -color: #D1F1A9\ -}\ -.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-blue .ace_meta.ace_tag,\ -.ace-tomorrow-night-blue .ace_string.ace_regexp,\ -.ace-tomorrow-night-blue .ace_variable {\ -color: #FF9DA4\ -}\ -.ace-tomorrow-night-blue .ace_comment {\ -color: #7285B7\ -}\ -.ace-tomorrow-night-blue .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/theme/tomorrow_night_blue-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-blue"; +exports.cssText = require("./tomorrow_night_blue-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_blue"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js index 3bf12dd..1ce857a 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_bright.js @@ -1,123 +1,13 @@ -define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_bright-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-bright .ace_gutter {\n background: #1a1a1a;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-tomorrow-night-bright {\n background-color: #000000;\n color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #000000;\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\n border: 1px solid rgb(110, 119, 0);\n border-bottom: 0;\n box-shadow: inset 0 -1px rgb(110, 119, 0);\n margin: -1px 0 0 -1px;\n background: rgba(255, 235, 0, 0.1)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_gutter-active-line {\n background-color: #2A2A2A\n}\n\n.ace-tomorrow-night-bright .ace_stack {\n background-color: rgb(66, 90, 44)\n}\n\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\n border: 1px solid #888888\n}\n\n.ace-tomorrow-night-bright .ace_invisible {\n color: #343434\n}\n\n.ace-tomorrow-night-bright .ace_keyword,\n.ace-tomorrow-night-bright .ace_meta,\n.ace-tomorrow-night-bright .ace_storage,\n.ace-tomorrow-night-bright .ace_storage.ace_type,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #C397D8\n}\n\n.ace-tomorrow-night-bright .ace_keyword.ace_operator {\n color: #70C0B1\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_character,\n.ace-tomorrow-night-bright .ace_constant.ace_language,\n.ace-tomorrow-night-bright .ace_constant.ace_numeric,\n.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-bright .ace_support.ace_constant,\n.ace-tomorrow-night-bright .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-tomorrow-night-bright .ace_constant.ace_other {\n color: #EEEEEE\n}\n\n.ace-tomorrow-night-bright .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night-bright .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-bright .ace_support.ace_function,\n.ace-tomorrow-night-bright .ace_variable {\n color: #7AA6DA\n}\n\n.ace-tomorrow-night-bright .ace_support.ace_class,\n.ace-tomorrow-night-bright .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-tomorrow-night-bright .ace_heading,\n.ace-tomorrow-night-bright .ace_markup.ace_heading,\n.ace-tomorrow-night-bright .ace_string {\n color: #B9CA4A\n}\n\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-bright .ace_meta.ace_tag,\n.ace-tomorrow-night-bright .ace_string.ace_regexp,\n.ace-tomorrow-night-bright .ace_variable {\n color: #D54E53\n}\n\n.ace-tomorrow-night-bright .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\n color: #C2C280\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-bright .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-bright"; -exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\ -background: #1a1a1a;\ -color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-tomorrow-night-bright {\ -background-color: #000000;\ -color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_cursor {\ -color: #9F9F9F\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\ -background: #424242\ -}\ -.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #000000;\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #888888\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\ -border: 1px solid rgb(110, 119, 0);\ -border-bottom: 0;\ -box-shadow: inset 0 -1px rgb(110, 119, 0);\ -margin: -1px 0 0 -1px;\ -background: rgba(255, 235, 0, 0.1)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\ -background: #2A2A2A\ -}\ -.ace-tomorrow-night-bright .ace_gutter-active-line {\ -background-color: #2A2A2A\ -}\ -.ace-tomorrow-night-bright .ace_stack {\ -background-color: rgb(66, 90, 44)\ -}\ -.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\ -border: 1px solid #888888\ -}\ -.ace-tomorrow-night-bright .ace_invisible {\ -color: #343434\ -}\ -.ace-tomorrow-night-bright .ace_keyword,\ -.ace-tomorrow-night-bright .ace_meta,\ -.ace-tomorrow-night-bright .ace_storage,\ -.ace-tomorrow-night-bright .ace_storage.ace_type,\ -.ace-tomorrow-night-bright .ace_support.ace_type {\ -color: #C397D8\ -}\ -.ace-tomorrow-night-bright .ace_keyword.ace_operator {\ -color: #70C0B1\ -}\ -.ace-tomorrow-night-bright .ace_constant.ace_character,\ -.ace-tomorrow-night-bright .ace_constant.ace_language,\ -.ace-tomorrow-night-bright .ace_constant.ace_numeric,\ -.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-bright .ace_support.ace_constant,\ -.ace-tomorrow-night-bright .ace_variable.ace_parameter {\ -color: #E78C45\ -}\ -.ace-tomorrow-night-bright .ace_constant.ace_other {\ -color: #EEEEEE\ -}\ -.ace-tomorrow-night-bright .ace_invalid {\ -color: #CED2CF;\ -background-color: #DF5F5F\ -}\ -.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\ -color: #CED2CF;\ -background-color: #B798BF\ -}\ -.ace-tomorrow-night-bright .ace_fold {\ -background-color: #7AA6DA;\ -border-color: #DEDEDE\ -}\ -.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-bright .ace_support.ace_function,\ -.ace-tomorrow-night-bright .ace_variable {\ -color: #7AA6DA\ -}\ -.ace-tomorrow-night-bright .ace_support.ace_class,\ -.ace-tomorrow-night-bright .ace_support.ace_type {\ -color: #E7C547\ -}\ -.ace-tomorrow-night-bright .ace_heading,\ -.ace-tomorrow-night-bright .ace_markup.ace_heading,\ -.ace-tomorrow-night-bright .ace_string {\ -color: #B9CA4A\ -}\ -.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-bright .ace_meta.ace_tag,\ -.ace-tomorrow-night-bright .ace_string.ace_regexp,\ -.ace-tomorrow-night-bright .ace_variable {\ -color: #D54E53\ -}\ -.ace-tomorrow-night-bright .ace_comment {\ -color: #969896\ -}\ -.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\ -color: #C2C280\ -}\ -.ace-tomorrow-night-bright .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/theme/tomorrow_night_bright-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-bright"; +exports.cssText = require("./tomorrow_night_bright-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_bright"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js index e5c48fc..8fb1192 100644 --- a/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js +++ b/app/Resources/ui/js/ace/theme-tomorrow_night_eighties.js @@ -1,110 +1,13 @@ -define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/tomorrow_night_eighties-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-tomorrow-night-eighties .ace_gutter {\n background: #272727;\n color: #CCC\n}\n\n.ace-tomorrow-night-eighties .ace_print-margin {\n width: 1px;\n background: #272727\n}\n\n.ace-tomorrow-night-eighties {\n background-color: #2D2D2D;\n color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_constant.ace_other,\n.ace-tomorrow-night-eighties .ace_cursor {\n color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\n background: #515151\n}\n\n.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2D2D2D;\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #6A6A6A\n}\n\n.ace-tomorrow-night-bright .ace_stack {\n background: rgb(66, 90, 44)\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\n background: #393939\n}\n\n.ace-tomorrow-night-eighties .ace_gutter-active-line {\n background-color: #393939\n}\n\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\n border: 1px solid #515151\n}\n\n.ace-tomorrow-night-eighties .ace_invisible {\n color: #6A6A6A\n}\n\n.ace-tomorrow-night-eighties .ace_keyword,\n.ace-tomorrow-night-eighties .ace_meta,\n.ace-tomorrow-night-eighties .ace_storage,\n.ace-tomorrow-night-eighties .ace_storage.ace_type,\n.ace-tomorrow-night-eighties .ace_support.ace_type {\n color: #CC99CC\n}\n\n.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\n color: #66CCCC\n}\n\n.ace-tomorrow-night-eighties .ace_constant.ace_character,\n.ace-tomorrow-night-eighties .ace_constant.ace_language,\n.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\n.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-eighties .ace_support.ace_constant,\n.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\n color: #F99157\n}\n\n.ace-tomorrow-night-eighties .ace_invalid {\n color: #CDCDCD;\n background-color: #F2777A\n}\n\n.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\n color: #CDCDCD;\n background-color: #CC99CC\n}\n\n.ace-tomorrow-night-eighties .ace_fold {\n background-color: #6699CC;\n border-color: #CCCCCC\n}\n\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-eighties .ace_support.ace_function,\n.ace-tomorrow-night-eighties .ace_variable {\n color: #6699CC\n}\n\n.ace-tomorrow-night-eighties .ace_support.ace_class,\n.ace-tomorrow-night-eighties .ace_support.ace_type {\n color: #FFCC66\n}\n\n.ace-tomorrow-night-eighties .ace_heading,\n.ace-tomorrow-night-eighties .ace_markup.ace_heading,\n.ace-tomorrow-night-eighties .ace_string {\n color: #99CC99\n}\n\n.ace-tomorrow-night-eighties .ace_comment {\n color: #999999\n}\n\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-eighties .ace_meta.ace_tag,\n.ace-tomorrow-night-eighties .ace_variable {\n color: #F2777A\n}\n\n.ace-tomorrow-night-eighties .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-eighties .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-tomorrow-night-eighties"; -exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\ -background: #272727;\ -color: #CCC\ -}\ -.ace-tomorrow-night-eighties .ace_print-margin {\ -width: 1px;\ -background: #272727\ -}\ -.ace-tomorrow-night-eighties {\ -background-color: #2D2D2D;\ -color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_constant.ace_other,\ -.ace-tomorrow-night-eighties .ace_cursor {\ -color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\ -background: #515151\ -}\ -.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #2D2D2D;\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #6A6A6A\ -}\ -.ace-tomorrow-night-bright .ace_stack {\ -background: rgb(66, 90, 44)\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\ -background: #393939\ -}\ -.ace-tomorrow-night-eighties .ace_gutter-active-line {\ -background-color: #393939\ -}\ -.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\ -border: 1px solid #515151\ -}\ -.ace-tomorrow-night-eighties .ace_invisible {\ -color: #6A6A6A\ -}\ -.ace-tomorrow-night-eighties .ace_keyword,\ -.ace-tomorrow-night-eighties .ace_meta,\ -.ace-tomorrow-night-eighties .ace_storage,\ -.ace-tomorrow-night-eighties .ace_storage.ace_type,\ -.ace-tomorrow-night-eighties .ace_support.ace_type {\ -color: #CC99CC\ -}\ -.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\ -color: #66CCCC\ -}\ -.ace-tomorrow-night-eighties .ace_constant.ace_character,\ -.ace-tomorrow-night-eighties .ace_constant.ace_language,\ -.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\ -.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\ -.ace-tomorrow-night-eighties .ace_support.ace_constant,\ -.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\ -color: #F99157\ -}\ -.ace-tomorrow-night-eighties .ace_invalid {\ -color: #CDCDCD;\ -background-color: #F2777A\ -}\ -.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\ -color: #CDCDCD;\ -background-color: #CC99CC\ -}\ -.ace-tomorrow-night-eighties .ace_fold {\ -background-color: #6699CC;\ -border-color: #CCCCCC\ -}\ -.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\ -.ace-tomorrow-night-eighties .ace_support.ace_function,\ -.ace-tomorrow-night-eighties .ace_variable {\ -color: #6699CC\ -}\ -.ace-tomorrow-night-eighties .ace_support.ace_class,\ -.ace-tomorrow-night-eighties .ace_support.ace_type {\ -color: #FFCC66\ -}\ -.ace-tomorrow-night-eighties .ace_heading,\ -.ace-tomorrow-night-eighties .ace_markup.ace_heading,\ -.ace-tomorrow-night-eighties .ace_string {\ -color: #99CC99\ -}\ -.ace-tomorrow-night-eighties .ace_comment {\ -color: #999999\ -}\ -.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\ -.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\ -.ace-tomorrow-night-eighties .ace_meta.ace_tag,\ -.ace-tomorrow-night-eighties .ace_variable {\ -color: #F2777A\ -}\ -.ace-tomorrow-night-eighties .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/theme/tomorrow_night_eighties-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-tomorrow-night-eighties"; +exports.cssText = require("./tomorrow_night_eighties-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/tomorrow_night_eighties"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-twilight.js b/app/Resources/ui/js/ace/theme-twilight.js index 03e9d07..86f1836 100644 --- a/app/Resources/ui/js/ace/theme-twilight.js +++ b/app/Resources/ui/js/ace/theme-twilight.js @@ -1,111 +1,13 @@ -define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/twilight-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-twilight"; -exports.cssText = ".ace-twilight .ace_gutter {\ -background: #232323;\ -color: #E2E2E2\ -}\ -.ace-twilight .ace_print-margin {\ -width: 1px;\ -background: #232323\ -}\ -.ace-twilight {\ -background-color: #141414;\ -color: #F8F8F8\ -}\ -.ace-twilight .ace_cursor {\ -color: #A7A7A7\ -}\ -.ace-twilight .ace_marker-layer .ace_selection {\ -background: rgba(221, 240, 255, 0.20)\ -}\ -.ace-twilight.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #141414;\ -}\ -.ace-twilight .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-twilight .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid rgba(255, 255, 255, 0.25)\ -}\ -.ace-twilight .ace_marker-layer .ace_active-line {\ -background: rgba(255, 255, 255, 0.031)\ -}\ -.ace-twilight .ace_gutter-active-line {\ -background-color: rgba(255, 255, 255, 0.031)\ -}\ -.ace-twilight .ace_marker-layer .ace_selected-word {\ -border: 1px solid rgba(221, 240, 255, 0.20)\ -}\ -.ace-twilight .ace_invisible {\ -color: rgba(255, 255, 255, 0.25)\ -}\ -.ace-twilight .ace_keyword,\ -.ace-twilight .ace_meta {\ -color: #CDA869\ -}\ -.ace-twilight .ace_constant,\ -.ace-twilight .ace_constant.ace_character,\ -.ace-twilight .ace_constant.ace_character.ace_escape,\ -.ace-twilight .ace_constant.ace_other,\ -.ace-twilight .ace_heading,\ -.ace-twilight .ace_markup.ace_heading,\ -.ace-twilight .ace_support.ace_constant {\ -color: #CF6A4C\ -}\ -.ace-twilight .ace_invalid.ace_illegal {\ -color: #F8F8F8;\ -background-color: rgba(86, 45, 86, 0.75)\ -}\ -.ace-twilight .ace_invalid.ace_deprecated {\ -text-decoration: underline;\ -font-style: italic;\ -color: #D2A8A1\ -}\ -.ace-twilight .ace_support {\ -color: #9B859D\ -}\ -.ace-twilight .ace_fold {\ -background-color: #AC885B;\ -border-color: #F8F8F8\ -}\ -.ace-twilight .ace_support.ace_function {\ -color: #DAD085\ -}\ -.ace-twilight .ace_list,\ -.ace-twilight .ace_markup.ace_list,\ -.ace-twilight .ace_storage {\ -color: #F9EE98\ -}\ -.ace-twilight .ace_entity.ace_name.ace_function,\ -.ace-twilight .ace_meta.ace_tag {\ -color: #AC885B\ -}\ -.ace-twilight .ace_string {\ -color: #8F9D6A\ -}\ -.ace-twilight .ace_string.ace_regexp {\ -color: #E9C062\ -}\ -.ace-twilight .ace_comment {\ -font-style: italic;\ -color: #5F5A60\ -}\ -.ace-twilight .ace_variable {\ -color: #7587A6\ -}\ -.ace-twilight .ace_xml-pe {\ -color: #494949\ -}\ -.ace-twilight .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\ -}\ -"; +}); +define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-twilight"; +exports.cssText = require("./twilight-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/twilight"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-vibrant_ink.js b/app/Resources/ui/js/ace/theme-vibrant_ink.js index 26f7de9..8d6d712 100644 --- a/app/Resources/ui/js/ace/theme-vibrant_ink.js +++ b/app/Resources/ui/js/ace/theme-vibrant_ink.js @@ -1,96 +1,13 @@ -define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/vibrant_ink-css",["require","exports","module"], function(require, exports, module){module.exports = ".ace-vibrant-ink .ace_gutter {\n background: #1a1a1a;\n color: #BEBEBE\n}\n\n.ace-vibrant-ink .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-vibrant-ink {\n background-color: #0F0F0F;\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\n background: #6699CC\n}\n\n.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0F0F0F;\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_active-line {\n background: #333333\n}\n\n.ace-vibrant-ink .ace_gutter-active-line {\n background-color: #333333\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\n border: 1px solid #6699CC\n}\n\n.ace-vibrant-ink .ace_invisible {\n color: #404040\n}\n\n.ace-vibrant-ink .ace_keyword,\n.ace-vibrant-ink .ace_meta {\n color: #FF6600\n}\n\n.ace-vibrant-ink .ace_constant,\n.ace-vibrant-ink .ace_constant.ace_character,\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\n.ace-vibrant-ink .ace_constant.ace_other {\n color: #339999\n}\n\n.ace-vibrant-ink .ace_constant.ace_numeric {\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_invalid,\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\n color: #CCFF33;\n background-color: #000000\n}\n\n.ace-vibrant-ink .ace_fold {\n background-color: #FFCC00;\n border-color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\n.ace-vibrant-ink .ace_support.ace_function,\n.ace-vibrant-ink .ace_variable {\n color: #FFCC00\n}\n\n.ace-vibrant-ink .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-vibrant-ink .ace_string {\n color: #66FF00\n}\n\n.ace-vibrant-ink .ace_string.ace_regexp {\n color: #44B4CC\n}\n\n.ace-vibrant-ink .ace_comment {\n color: #9933CC\n}\n\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\n font-style: italic;\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-vibrant-ink .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"; -exports.isDark = true; -exports.cssClass = "ace-vibrant-ink"; -exports.cssText = ".ace-vibrant-ink .ace_gutter {\ -background: #1a1a1a;\ -color: #BEBEBE\ -}\ -.ace-vibrant-ink .ace_print-margin {\ -width: 1px;\ -background: #1a1a1a\ -}\ -.ace-vibrant-ink {\ -background-color: #0F0F0F;\ -color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_cursor {\ -color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_selection {\ -background: #6699CC\ -}\ -.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #0F0F0F;\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_step {\ -background: rgb(102, 82, 0)\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #404040\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_active-line {\ -background: #333333\ -}\ -.ace-vibrant-ink .ace_gutter-active-line {\ -background-color: #333333\ -}\ -.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\ -border: 1px solid #6699CC\ -}\ -.ace-vibrant-ink .ace_invisible {\ -color: #404040\ -}\ -.ace-vibrant-ink .ace_keyword,\ -.ace-vibrant-ink .ace_meta {\ -color: #FF6600\ -}\ -.ace-vibrant-ink .ace_constant,\ -.ace-vibrant-ink .ace_constant.ace_character,\ -.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\ -.ace-vibrant-ink .ace_constant.ace_other {\ -color: #339999\ -}\ -.ace-vibrant-ink .ace_constant.ace_numeric {\ -color: #99CC99\ -}\ -.ace-vibrant-ink .ace_invalid,\ -.ace-vibrant-ink .ace_invalid.ace_deprecated {\ -color: #CCFF33;\ -background-color: #000000\ -}\ -.ace-vibrant-ink .ace_fold {\ -background-color: #FFCC00;\ -border-color: #FFFFFF\ -}\ -.ace-vibrant-ink .ace_entity.ace_name.ace_function,\ -.ace-vibrant-ink .ace_support.ace_function,\ -.ace-vibrant-ink .ace_variable {\ -color: #FFCC00\ -}\ -.ace-vibrant-ink .ace_variable.ace_parameter {\ -font-style: italic\ -}\ -.ace-vibrant-ink .ace_string {\ -color: #66FF00\ -}\ -.ace-vibrant-ink .ace_string.ace_regexp {\ -color: #44B4CC\ -}\ -.ace-vibrant-ink .ace_comment {\ -color: #9933CC\ -}\ -.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\ -font-style: italic;\ -color: #99CC99\ -}\ -.ace-vibrant-ink .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\ -}"; +}); +define("ace/theme/vibrant_ink",["require","exports","module","ace/theme/vibrant_ink-css","ace/lib/dom"], function(require, exports, module){exports.isDark = true; +exports.cssClass = "ace-vibrant-ink"; +exports.cssText = require("./vibrant_ink-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/vibrant_ink"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/theme-xcode.js b/app/Resources/ui/js/ace/theme-xcode.js index daded3a..56c2b42 100644 --- a/app/Resources/ui/js/ace/theme-xcode.js +++ b/app/Resources/ui/js/ace/theme-xcode.js @@ -1,90 +1,13 @@ -define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +define("ace/theme/xcode-css",["require","exports","module"], function(require, exports, module){module.exports = "/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\n\n.ace-xcode .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-xcode .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-xcode {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-xcode .ace_cursor {\n color: #000000\n}\n\n.ace-xcode .ace_marker-layer .ace_selection {\n background: #B5D5FF\n}\n\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-xcode .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-xcode .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-xcode .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_marker-layer .ace_selected-word {\n border: 1px solid #B5D5FF\n}\n\n.ace-xcode .ace_constant.ace_language,\n.ace-xcode .ace_keyword,\n.ace-xcode .ace_meta,\n.ace-xcode .ace_variable.ace_language {\n color: #C800A4\n}\n\n.ace-xcode .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-xcode .ace_constant.ace_character,\n.ace-xcode .ace_constant.ace_other {\n color: #275A5E\n}\n\n.ace-xcode .ace_constant.ace_numeric {\n color: #3A00DC\n}\n\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\n.ace-xcode .ace_support.ace_constant,\n.ace-xcode .ace_support.ace_function {\n color: #450084\n}\n\n.ace-xcode .ace_fold {\n background-color: #C800A4;\n border-color: #000000\n}\n\n.ace-xcode .ace_entity.ace_name.ace_tag,\n.ace-xcode .ace_support.ace_class,\n.ace-xcode .ace_support.ace_type {\n color: #790EAD\n}\n\n.ace-xcode .ace_storage {\n color: #C900A4\n}\n\n.ace-xcode .ace_string {\n color: #DF0002\n}\n\n.ace-xcode .ace_comment {\n color: #008E00\n}\n\n.ace-xcode .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-xcode .ace_indent-guide-active {\n background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\n} \n"; -exports.isDark = false; -exports.cssClass = "ace-xcode"; -exports.cssText = "\ -.ace-xcode .ace_gutter {\ -background: #e8e8e8;\ -color: #333\ -}\ -.ace-xcode .ace_print-margin {\ -width: 1px;\ -background: #e8e8e8\ -}\ -.ace-xcode {\ -background-color: #FFFFFF;\ -color: #000000\ -}\ -.ace-xcode .ace_cursor {\ -color: #000000\ -}\ -.ace-xcode .ace_marker-layer .ace_selection {\ -background: #B5D5FF\ -}\ -.ace-xcode.ace_multiselect .ace_selection.ace_start {\ -box-shadow: 0 0 3px 0px #FFFFFF;\ -}\ -.ace-xcode .ace_marker-layer .ace_step {\ -background: rgb(198, 219, 174)\ -}\ -.ace-xcode .ace_marker-layer .ace_bracket {\ -margin: -1px 0 0 -1px;\ -border: 1px solid #BFBFBF\ -}\ -.ace-xcode .ace_marker-layer .ace_active-line {\ -background: rgba(0, 0, 0, 0.071)\ -}\ -.ace-xcode .ace_gutter-active-line {\ -background-color: rgba(0, 0, 0, 0.071)\ -}\ -.ace-xcode .ace_marker-layer .ace_selected-word {\ -border: 1px solid #B5D5FF\ -}\ -.ace-xcode .ace_constant.ace_language,\ -.ace-xcode .ace_keyword,\ -.ace-xcode .ace_meta,\ -.ace-xcode .ace_variable.ace_language {\ -color: #C800A4\ -}\ -.ace-xcode .ace_invisible {\ -color: #BFBFBF\ -}\ -.ace-xcode .ace_constant.ace_character,\ -.ace-xcode .ace_constant.ace_other {\ -color: #275A5E\ -}\ -.ace-xcode .ace_constant.ace_numeric {\ -color: #3A00DC\ -}\ -.ace-xcode .ace_entity.ace_other.ace_attribute-name,\ -.ace-xcode .ace_support.ace_constant,\ -.ace-xcode .ace_support.ace_function {\ -color: #450084\ -}\ -.ace-xcode .ace_fold {\ -background-color: #C800A4;\ -border-color: #000000\ -}\ -.ace-xcode .ace_entity.ace_name.ace_tag,\ -.ace-xcode .ace_support.ace_class,\ -.ace-xcode .ace_support.ace_type {\ -color: #790EAD\ -}\ -.ace-xcode .ace_storage {\ -color: #C900A4\ -}\ -.ace-xcode .ace_string {\ -color: #DF0002\ -}\ -.ace-xcode .ace_comment {\ -color: #008E00\ -}\ -.ace-xcode .ace_indent-guide {\ -background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\ -}"; +}); +define("ace/theme/xcode",["require","exports","module","ace/theme/xcode-css","ace/lib/dom"], function(require, exports, module){exports.isDark = false; +exports.cssClass = "ace-xcode"; +exports.cssText = require("./xcode-css"); var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass, false); + }); (function() { window.require(["ace/theme/xcode"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { diff --git a/app/Resources/ui/js/ace/worker-base.js b/app/Resources/ui/js/ace/worker-base.js index 800d6a6..2a2fabf 100644 --- a/app/Resources/ui/js/ace/worker-base.js +++ b/app/Resources/ui/js/ace/worker-base.js @@ -216,10 +216,8 @@ window.onmessage = function(e) { }; })(this); -define("ace/lib/oop",[], function(require, exports, module) { -"use strict"; - -exports.inherits = function(ctor, superCtor) { +define("ace/lib/oop",[], function(require, exports, module){"use strict"; +exports.inherits = function (ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { @@ -230,40 +228,34 @@ exports.inherits = function(ctor, superCtor) { } }); }; - -exports.mixin = function(obj, mixin) { +exports.mixin = function (obj, mixin) { for (var key in mixin) { obj[key] = mixin[key]; } return obj; }; - -exports.implement = function(proto, mixin) { +exports.implement = function (proto, mixin) { exports.mixin(proto, mixin); }; }); -define("ace/apply_delta",[], function(require, exports, module) { -"use strict"; - -function throwDeltaError(delta, errorText){ +define("ace/apply_delta",[], function(require, exports, module){"use strict"; +function throwDeltaError(delta, errorText) { console.log("Invalid Delta:", delta); throw "Invalid Delta: " + errorText; } - function positionInDocument(docLines, position) { - return position.row >= 0 && position.row < docLines.length && - position.column >= 0 && position.column <= docLines[position.row].length; + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; } - function validateDelta(docLines, delta) { if (delta.action != "insert" && delta.action != "remove") throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); if (!(delta.lines instanceof Array)) throwDeltaError(delta, "delta.lines must be an Array"); if (!delta.start || !delta.end) - throwDeltaError(delta, "delta.start/end must be an present"); + throwDeltaError(delta, "delta.start/end must be an present"); var start = delta.start; if (!positionInDocument(docLines, delta.start)) throwDeltaError(delta, "delta.start must be contained in document"); @@ -275,9 +267,7 @@ function validateDelta(docLines, delta) { if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) throwDeltaError(delta, "delta.range must match delta lines"); } - -exports.applyDelta = function(docLines, delta, doNotValidate) { - +exports.applyDelta = function (docLines, delta, doNotValidate) { var row = delta.start.row; var startColumn = delta.start.column; var line = docLines[row] || ""; @@ -286,7 +276,8 @@ exports.applyDelta = function(docLines, delta, doNotValidate) { var lines = delta.lines; if (lines.length === 1) { docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); - } else { + } + else { var args = [row, 1].concat(delta.lines); docLines.splice.apply(docLines, args); docLines[row] = line.substring(0, startColumn) + docLines[row]; @@ -298,84 +289,69 @@ exports.applyDelta = function(docLines, delta, doNotValidate) { var endRow = delta.end.row; if (row === endRow) { docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); - } else { - docLines.splice( - row, endRow - row + 1, - line.substring(0, startColumn) + docLines[endRow].substring(endColumn) - ); + } + else { + docLines.splice(row, endRow - row + 1, line.substring(0, startColumn) + docLines[endRow].substring(endColumn)); } break; } }; -}); -define("ace/lib/event_emitter",[], function(require, exports, module) { -"use strict"; +}); +define("ace/lib/event_emitter",[], function(require, exports, module){"use strict"; var EventEmitter = {}; -var stopPropagation = function() { this.propagationStopped = true; }; -var preventDefault = function() { this.defaultPrevented = true; }; - +var stopPropagation = function () { this.propagationStopped = true; }; +var preventDefault = function () { this.defaultPrevented = true; }; EventEmitter._emit = -EventEmitter._dispatchEvent = function(eventName, e) { - this._eventRegistry || (this._eventRegistry = {}); - this._defaultHandlers || (this._defaultHandlers = {}); - - var listeners = this._eventRegistry[eventName] || []; - var defaultHandler = this._defaultHandlers[eventName]; - if (!listeners.length && !defaultHandler) - return; - - if (typeof e != "object" || !e) - e = {}; - - if (!e.type) - e.type = eventName; - if (!e.stopPropagation) - e.stopPropagation = stopPropagation; - if (!e.preventDefault) - e.preventDefault = preventDefault; - - listeners = listeners.slice(); - for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); }; - - this.contains = function(row, column) { + Range.prototype.contains = function (row, column) { return this.compare(row, column) == 0; }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - + Range.prototype.compareRange = function (range) { + var cmp, end = range.end, start = range.start; cmp = this.compare(end.row, end.column); if (cmp == 1) { cmp = this.compare(start.row, start.column); if (cmp == 1) { return 2; - } else if (cmp == 0) { + } + else if (cmp == 0) { return 1; - } else { + } + else { return 0; } - } else if (cmp == -1) { + } + else if (cmp == -1) { return -2; - } else { + } + else { cmp = this.compare(start.row, start.column); if (cmp == -1) { return -1; - } else if (cmp == 1) { + } + else if (cmp == 1) { return 42; - } else { + } + else { return 0; } } }; - this.comparePoint = function(p) { + Range.prototype.comparePoint = function (p) { return this.compare(p.row, p.column); }; - this.containsRange = function(range) { + Range.prototype.containsRange = function (range) { return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; }; - this.intersects = function(range) { + Range.prototype.intersects = function (range) { var cmp = this.compareRange(range); return (cmp == -1 || cmp == 0 || cmp == 1); }; - this.isEnd = function(row, column) { + Range.prototype.isEnd = function (row, column) { return this.end.row == row && this.end.column == column; }; - this.isStart = function(row, column) { + Range.prototype.isStart = function (row, column) { return this.start.row == row && this.start.column == column; }; - this.setStart = function(row, column) { + Range.prototype.setStart = function (row, column) { if (typeof row == "object") { this.start.column = row.column; this.start.row = row.row; - } else { + } + else { this.start.row = row; this.start.column = column; } }; - this.setEnd = function(row, column) { + Range.prototype.setEnd = function (row, column) { if (typeof row == "object") { this.end.column = row.column; this.end.row = row.row; - } else { + } + else { this.end.row = row; this.end.column = column; } }; - this.inside = function(row, column) { + Range.prototype.inside = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column) || this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideStart = function(row, column) { + Range.prototype.insideStart = function (row, column) { if (this.compare(row, column) == 0) { if (this.isEnd(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.insideEnd = function(row, column) { + Range.prototype.insideEnd = function (row, column) { if (this.compare(row, column) == 0) { if (this.isStart(row, column)) { return false; - } else { + } + else { return true; } } return false; }; - this.compare = function(row, column) { + Range.prototype.compare = function (row, column) { if (!this.isMultiLine()) { if (row === this.start.row) { return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); } } - if (row < this.start.row) return -1; - if (row > this.end.row) return 1; - if (this.start.row === row) return column >= this.start.column ? 0 : -1; - if (this.end.row === row) return column <= this.end.column ? 0 : 1; - return 0; }; - this.compareStart = function(row, column) { + Range.prototype.compareStart = function (row, column) { if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.compareEnd = function(row, column) { + Range.prototype.compareEnd = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else { + } + else { return this.compare(row, column); } }; - this.compareInside = function(row, column) { + Range.prototype.compareInside = function (row, column) { if (this.end.row == row && this.end.column == column) { return 1; - } else if (this.start.row == row && this.start.column == column) { + } + else if (this.start.row == row && this.start.column == column) { return -1; - } else { + } + else { return this.compare(row, column); } }; - this.clipRows = function(firstRow, lastRow) { + Range.prototype.clipRows = function (firstRow, lastRow) { if (this.end.row > lastRow) - var end = {row: lastRow + 1, column: 0}; + var end = { row: lastRow + 1, column: 0 }; else if (this.end.row < firstRow) - var end = {row: firstRow, column: 0}; - + var end = { row: firstRow, column: 0 }; if (this.start.row > lastRow) - var start = {row: lastRow + 1, column: 0}; + var start = { row: lastRow + 1, column: 0 }; else if (this.start.row < firstRow) - var start = {row: firstRow, column: 0}; - + var start = { row: firstRow, column: 0 }; return Range.fromPoints(start || this.start, end || this.end); }; - this.extend = function(row, column) { + Range.prototype.extend = function (row, column) { var cmp = this.compare(row, column); - if (cmp == 0) return this; else if (cmp == -1) - var start = {row: row, column: column}; + var start = { row: row, column: column }; else - var end = {row: row, column: column}; - + var end = { row: row, column: column }; return Range.fromPoints(start || this.start, end || this.end); }; - - this.isEmpty = function() { + Range.prototype.isEmpty = function () { return (this.start.row === this.end.row && this.start.column === this.end.column); }; - this.isMultiLine = function() { + Range.prototype.isMultiLine = function () { return (this.start.row !== this.end.row); }; - this.clone = function() { + Range.prototype.clone = function () { return Range.fromPoints(this.start, this.end); }; - this.collapseRows = function() { + Range.prototype.collapseRows = function () { if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0); + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row - 1), 0); else return new Range(this.start.row, 0, this.end.row, 0); }; - this.toScreenRange = function(session) { + Range.prototype.toScreenRange = function (session) { var screenPosStart = session.documentToScreenPosition(this.start); var screenPosEnd = session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); + return new Range(screenPosStart.row, screenPosStart.column, screenPosEnd.row, screenPosEnd.column); }; - this.moveBy = function(row, column) { + Range.prototype.moveBy = function (row, column) { this.start.row += row; this.start.column += column; this.end.row += row; this.end.column += column; }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { + return Range; +}()); +Range.fromPoints = function (start, end) { return new Range(start.row, start.column, end.row, end.column); }; -Range.comparePoints = comparePoints; - -Range.comparePoints = function(p1, p2) { +Range.comparePoints = function (p1, p2) { return p1.row - p2.row || p1.column - p2.column; }; - - exports.Range = Range; -}); -define("ace/anchor",[], function(require, exports, module) { -"use strict"; +}); +define("ace/anchor",[], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.$onChange = this.onChange.bind(this); - this.attach(doc); - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.getPosition = function() { +var Anchor = /** @class */ (function () { + function Anchor(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + if (typeof row != "number") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); + } + Anchor.prototype.getPosition = function () { return this.$clipPositionToDocument(this.row, this.column); }; - this.getDocument = function() { + Anchor.prototype.getDocument = function () { return this.document; }; - this.$insertRight = false; - this.onChange = function(delta) { + Anchor.prototype.onChange = function (delta) { if (delta.start.row == delta.end.row && delta.start.row != this.row) return; - if (delta.start.row > this.row) return; - - var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + var point = $getTransformedPoint(delta, { row: this.row, column: this.column }, this.$insertRight); this.setPosition(point.row, point.column, true); }; - - function $pointsInOrder(point1, point2, equalPointsInOrder) { - var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; - return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); - } - - function $getTransformedPoint(delta, point, moveIfEqual) { - var deltaIsInsert = delta.action == "insert"; - var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); - var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); - var deltaStart = delta.start; - var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. - if ($pointsInOrder(point, deltaStart, moveIfEqual)) { - return { - row: point.row, - column: point.column - }; - } - if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { - return { - row: point.row + deltaRowShift, - column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) - }; - } - - return { - row: deltaStart.row, - column: deltaStart.column - }; - } - this.setPosition = function(row, column, noClip) { + Anchor.prototype.setPosition = function (row, column, noClip) { var pos; if (noClip) { pos = { row: row, column: column }; - } else { + } + else { pos = this.$clipPositionToDocument(row, column); } - if (this.row == pos.row && this.column == pos.column) return; - var old = { row: this.row, column: this.column }; - this.row = pos.row; this.column = pos.column; this._signal("change", { @@ -772,16 +689,15 @@ var Anchor = exports.Anchor = function(doc, row, column) { value: pos }); }; - this.detach = function() { + Anchor.prototype.detach = function () { this.document.off("change", this.$onChange); }; - this.attach = function(doc) { + Anchor.prototype.attach = function (doc) { this.document = doc || this.document; this.document.on("change", this.$onChange); }; - this.$clipPositionToDocument = function(row, column) { + Anchor.prototype.$clipPositionToDocument = function (row, column) { var pos = {}; - if (row >= this.document.getLength()) { pos.row = Math.max(0, this.document.getLength() - 1); pos.column = this.document.getLine(pos.row).length; @@ -794,117 +710,123 @@ var Anchor = exports.Anchor = function(doc, row, column) { pos.row = row; pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); } - if (column < 0) pos.column = 0; - return pos; }; - -}).call(Anchor.prototype); + return Anchor; +}()); +Anchor.prototype.$insertRight = false; +oop.implement(Anchor.prototype, EventEmitter); +function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); +} +function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + return { + row: deltaStart.row, + column: deltaStart.column + }; +} +exports.Anchor = Anchor; }); -define("ace/document",[], function(require, exports, module) { -"use strict"; - +define("ace/document",[], function(require, exports, module){"use strict"; var oop = require("./lib/oop"); var applyDelta = require("./apply_delta").applyDelta; var EventEmitter = require("./lib/event_emitter").EventEmitter; var Range = require("./range").Range; var Anchor = require("./anchor").Anchor; - -var Document = function(textOrLines) { - this.$lines = [""]; - if (textOrLines.length === 0) { +var Document = /** @class */ (function () { + function Document(textOrLines) { this.$lines = [""]; - } else if (Array.isArray(textOrLines)) { - this.insertMergedLines({row: 0, column: 0}, textOrLines); - } else { - this.insert({row: 0, column:0}, textOrLines); + if (textOrLines.length === 0) { + this.$lines = [""]; + } + else if (Array.isArray(textOrLines)) { + this.insertMergedLines({ row: 0, column: 0 }, textOrLines); + } + else { + this.insert({ row: 0, column: 0 }, textOrLines); + } } -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.initialize = function(text) { - this.refresh(text); - }; - this.setValue = function(text) { + Document.prototype.setValue = function (text) { var len = this.getLength() - 1; this.remove(new Range(0, 0, len, this.getLine(len).length)); - this.insert({row: 0, column: 0}, text); + this.insert({ row: 0, column: 0 }, text || ""); }; - this.getValue = function() { + Document.prototype.getValue = function () { return this.getAllLines().join(this.getNewLineCharacter()); }; - this.createAnchor = function(row, column) { + Document.prototype.createAnchor = function (row, column) { return new Anchor(this, row, column); }; - if ("aaa".split(/a/).length === 0) { - this.$split = function(text) { - return text.replace(/\r\n|\r/g, "\n").split("\n"); - }; - } else { - this.$split = function(text) { - return text.split(/\r\n|\r|\n/); - }; - } - - - this.$detectNewLine = function(text) { + Document.prototype.$detectNewLine = function (text) { var match = text.match(/^.*?(\r\n|\r|\n)/m); this.$autoNewLine = match ? match[1] : "\n"; this._signal("changeNewLineMode"); }; - this.getNewLineCharacter = function() { + Document.prototype.getNewLineCharacter = function () { switch (this.$newLineMode) { - case "windows": - return "\r\n"; - case "unix": - return "\n"; - default: - return this.$autoNewLine || "\n"; + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; } }; - - this.$autoNewLine = ""; - this.$newLineMode = "auto"; - this.setNewLineMode = function(newLineMode) { + Document.prototype.setNewLineMode = function (newLineMode) { if (this.$newLineMode === newLineMode) return; - this.$newLineMode = newLineMode; this._signal("changeNewLineMode"); }; - this.getNewLineMode = function() { + Document.prototype.getNewLineMode = function () { return this.$newLineMode; }; - this.isNewLine = function(text) { + Document.prototype.isNewLine = function (text) { return (text == "\r\n" || text == "\r" || text == "\n"); }; - this.getLine = function(row) { + Document.prototype.getLine = function (row) { return this.$lines[row] || ""; }; - this.getLines = function(firstRow, lastRow) { + Document.prototype.getLines = function (firstRow, lastRow) { return this.$lines.slice(firstRow, lastRow + 1); }; - this.getAllLines = function() { + Document.prototype.getAllLines = function () { return this.getLines(0, this.getLength()); }; - this.getLength = function() { + Document.prototype.getLength = function () { return this.$lines.length; }; - this.getTextRange = function(range) { + Document.prototype.getTextRange = function (range) { return this.getLinesForRange(range).join(this.getNewLineCharacter()); }; - this.getLinesForRange = function(range) { + Document.prototype.getLinesForRange = function (range) { var lines; if (range.start.row === range.end.row) { lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; - } else { + } + else { lines = this.getLines(range.start.row, range.end.row); lines[0] = (lines[0] || "").substring(range.start.column); var l = lines.length - 1; @@ -913,45 +835,43 @@ var Document = function(textOrLines) { } return lines; }; - this.insertLines = function(row, lines) { + Document.prototype.insertLines = function (row, lines) { console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); return this.insertFullLines(row, lines); }; - this.removeLines = function(firstRow, lastRow) { + Document.prototype.removeLines = function (firstRow, lastRow) { console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); return this.removeFullLines(firstRow, lastRow); }; - this.insertNewLine = function(position) { + Document.prototype.insertNewLine = function (position) { console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); return this.insertMergedLines(position, ["", ""]); }; - this.insert = function(position, text) { + Document.prototype.insert = function (position, text) { if (this.getLength() <= 1) this.$detectNewLine(text); - return this.insertMergedLines(position, this.$split(text)); }; - this.insertInLine = function(position, text) { + Document.prototype.insertInLine = function (position, text) { var start = this.clippedPos(position.row, position.column); var end = this.pos(position.row, position.column + text.length); - this.applyDelta({ start: start, end: end, action: "insert", lines: [text] }, true); - return this.clonePos(end); }; - - this.clippedPos = function(row, column) { + Document.prototype.clippedPos = function (row, column) { var length = this.getLength(); if (row === undefined) { row = length; - } else if (row < 0) { + } + else if (row < 0) { row = 0; - } else if (row >= length) { + } + else if (row >= length) { row = length - 1; column = undefined; } @@ -959,115 +879,87 @@ var Document = function(textOrLines) { if (column == undefined) column = line.length; column = Math.min(Math.max(column, 0), line.length); - return {row: row, column: column}; + return { row: row, column: column }; }; - - this.clonePos = function(pos) { - return {row: pos.row, column: pos.column}; + Document.prototype.clonePos = function (pos) { + return { row: pos.row, column: pos.column }; }; - - this.pos = function(row, column) { - return {row: row, column: column}; + Document.prototype.pos = function (row, column) { + return { row: row, column: column }; }; - - this.$clipPosition = function(position) { + Document.prototype.$clipPosition = function (position) { var length = this.getLength(); if (position.row >= length) { position.row = Math.max(0, length - 1); position.column = this.getLine(length - 1).length; - } else { + } + else { position.row = Math.max(0, position.row); position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); } return position; }; - - this.refresh = function(text, row){ - var row = row || 0 - var lines = this.$split(text); - if (lines.length > 0xFFFF) { - var end = this.refresh(row, lines.slice(0xFFFF)); - lines = lines.slice(0, 0xFFFF); - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - context: 'refresh', - range: range, - lines: lines - }; - this._emit("change", { data: delta }); - return {row:0, column:0}; - } - this.insertFullLines = function(row, lines) { + Document.prototype.insertFullLines = function (row, lines) { row = Math.min(Math.max(row, 0), this.getLength()); var column = 0; if (row < this.getLength()) { lines = lines.concat([""]); column = 0; - } else { + } + else { lines = [""].concat(lines); row--; column = this.$lines[row].length; } - this.insertMergedLines({row: row, column: column}, lines); + this.insertMergedLines({ row: row, column: column }, lines); }; - this.insertMergedLines = function(position, lines) { + Document.prototype.insertMergedLines = function (position, lines) { var start = this.clippedPos(position.row, position.column); var end = { row: start.row + lines.length - 1, column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length }; - this.applyDelta({ start: start, end: end, action: "insert", lines: lines }); - return this.clonePos(end); }; - this.remove = function(range) { + Document.prototype.remove = function (range) { var start = this.clippedPos(range.start.row, range.start.column); var end = this.clippedPos(range.end.row, range.end.column); this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }); return this.clonePos(start); }; - this.removeInLine = function(row, startColumn, endColumn) { + Document.prototype.removeInLine = function (row, startColumn, endColumn) { var start = this.clippedPos(row, startColumn); var end = this.clippedPos(row, endColumn); - this.applyDelta({ start: start, end: end, action: "remove", - lines: this.getLinesForRange({start: start, end: end}) + lines: this.getLinesForRange({ start: start, end: end }) }, true); - return this.clonePos(start); }; - this.removeFullLines = function(firstRow, lastRow) { + Document.prototype.removeFullLines = function (firstRow, lastRow) { firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); - lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1); var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; - var deleteLastNewLine = lastRow < this.getLength() - 1; - var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); - var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); - var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); - var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = (deleteFirstNewLine ? firstRow - 1 : firstRow); + var startCol = (deleteFirstNewLine ? this.getLine(startRow).length : 0); + var endRow = (deleteLastNewLine ? lastRow + 1 : lastRow); + var endCol = (deleteLastNewLine ? 0 : this.getLine(endRow).length); var range = new Range(startRow, startCol, endRow, endCol); var deletedLines = this.$lines.slice(firstRow, lastRow + 1); - this.applyDelta({ start: range.start, end: range.end, @@ -1076,7 +968,7 @@ var Document = function(textOrLines) { }); return deletedLines; }; - this.removeNewLine = function(row) { + Document.prototype.removeNewLine = function (row) { if (row < this.getLength() - 1 && row >= 0) { this.applyDelta({ start: this.pos(row, this.getLine(row).length), @@ -1086,14 +978,13 @@ var Document = function(textOrLines) { }); } }; - this.replace = function(range, text) { + Document.prototype.replace = function (range, text) { if (!(range instanceof Range)) range = Range.fromPoints(range.start, range.end); if (text.length === 0 && range.isEmpty()) return range.start; if (text == this.getTextRange(range)) return range.end; - this.remove(range); var end; if (text) { @@ -1102,26 +993,24 @@ var Document = function(textOrLines) { else { end = range.start; } - return end; }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { + Document.prototype.revertDeltas = function (deltas) { + for (var i = deltas.length - 1; i >= 0; i--) { this.revertDelta(deltas[i]); } }; - this.applyDelta = function(delta, doNotValidate) { + Document.prototype.applyDelta = function (delta, doNotValidate) { var isInsert = delta.action == "insert"; if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] : !Range.comparePoints(delta.start, delta.end)) { return; } - if (isInsert && delta.lines.length > 20000) { this.$splitAndapplyLargeDelta(delta, 20000); } @@ -1130,18 +1019,14 @@ var Document = function(textOrLines) { this._signal("change", delta); } }; - - this.$safeApplyDelta = function(delta) { + Document.prototype.$safeApplyDelta = function (delta) { var docLength = this.$lines.length; - if ( - delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength - || delta.action == "insert" && delta.start.row <= docLength - ) { + if (delta.action == "remove" && delta.start.row < docLength && delta.end.row < docLength + || delta.action == "insert" && delta.start.row <= docLength) { this.applyDelta(delta); } }; - - this.$splitAndapplyLargeDelta = function(delta, MAX) { + Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) { var lines = delta.lines; var l = lines.length - MAX + 1; var row = delta.start.row; @@ -1162,7 +1047,7 @@ var Document = function(textOrLines) { delta.start.column = column; this.applyDelta(delta, true); }; - this.revertDelta = function(delta) { + Document.prototype.revertDelta = function (delta) { this.$safeApplyDelta({ start: this.clonePos(delta.start), end: this.clonePos(delta.end), @@ -1170,218 +1055,211 @@ var Document = function(textOrLines) { lines: delta.lines.slice() }); }; - this.indexToPosition = function(index, startRow) { + Document.prototype.indexToPosition = function (index, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; for (var i = startRow || 0, l = lines.length; i < l; i++) { index -= lines[i].length + newlineLength; if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; + return { row: i, column: index + lines[i].length + newlineLength }; } - return {row: l-1, column: index + lines[l-1].length + newlineLength}; + return { row: l - 1, column: index + lines[l - 1].length + newlineLength }; }; - this.positionToIndex = function(pos, startRow) { + Document.prototype.positionToIndex = function (pos, startRow) { var lines = this.$lines || this.getAllLines(); var newlineLength = this.getNewLineCharacter().length; var index = 0; var row = Math.min(pos.row, lines.length); for (var i = startRow || 0; i < row; ++i) index += lines[i].length + newlineLength; - return index + pos.column; }; - -}).call(Document.prototype); - + Document.prototype.$split = function (text) { + return text.split(/\r\n|\r|\n/); + }; + return Document; +}()); +Document.prototype.$autoNewLine = ""; +Document.prototype.$newLineMode = "auto"; +oop.implement(Document.prototype, EventEmitter); exports.Document = Document; + }); -define("ace/lib/lang",[], function(require, exports, module) { -"use strict"; +define("ace/lib/deep_copy",[], function(require, exports, module){exports.deepCopy = function deepCopy(obj) { + if (typeof obj !== "object" || !obj) + return obj; + var copy; + if (Array.isArray(obj)) { + copy = []; + for (var key = 0; key < obj.length; key++) { + copy[key] = deepCopy(obj[key]); + } + return copy; + } + if (Object.prototype.toString.call(obj) !== "[object Object]") + return obj; + copy = {}; + for (var key in obj) + copy[key] = deepCopy(obj[key]); + return copy; +}; -exports.last = function(a) { +}); + +define("ace/lib/lang",[], function(require, exports, module){"use strict"; +exports.last = function (a) { return a[a.length - 1]; }; - -exports.stringReverse = function(string) { +exports.stringReverse = function (string) { return string.split("").reverse().join(""); }; - exports.stringRepeat = function (string, count) { var result = ''; while (count > 0) { if (count & 1) result += string; - if (count >>= 1) string += string; } return result; }; - var trimBeginRegexp = /^\s\s*/; var trimEndRegexp = /\s\s*$/; - exports.stringTrimLeft = function (string) { return string.replace(trimBeginRegexp, ''); }; - exports.stringTrimRight = function (string) { return string.replace(trimEndRegexp, ''); }; - -exports.copyObject = function(obj) { +exports.copyObject = function (obj) { var copy = {}; for (var key in obj) { copy[key] = obj[key]; } return copy; }; - -exports.copyArray = function(array){ +exports.copyArray = function (array) { var copy = []; - for (var i=0, l=array.length; i 0xffff ? 2 : 1; +}; + }); define("ace/worker/mirror",[], function(require, exports, module) { From 40164de7c0c91eeba1f01a7ba40dc6cc628f0b7b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 20:00:55 -0400 Subject: [PATCH 42/54] local ace modification: filter autocompletions --- app/Resources/ui/js/ace/ext-language_tools.js | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/Resources/ui/js/ace/ext-language_tools.js b/app/Resources/ui/js/ace/ext-language_tools.js index 2a2d27d..3285b5f 100644 --- a/app/Resources/ui/js/ace/ext-language_tools.js +++ b/app/Resources/ui/js/ace/ext-language_tools.js @@ -1988,6 +1988,8 @@ var Autocomplete = /** @class */ (function () { var theme = this.editor.renderer.theme; this.tooltipNode.className = "ace_tooltip ace_doc-tooltip " + (theme.isDark ? "ace_dark " : "") + (theme.cssClass || ""); + // default tooltip style is too specific to override with css, so manually set background to match theme + this.tooltipNode.style.backgroundColor = getComputedStyle(this.editor.container).backgroundColor; var tooltipNode = this.tooltipNode; if (item.docHTML) { tooltipNode.innerHTML = item.docHTML; @@ -2352,6 +2354,23 @@ var FilteredList = /** @class */ (function () { item.$score = (item.score || 0) - penalty; results.push(item); } + var snippetNames = Object.create(null); + var keywordNames = Object.create(null); + for (var i=0, j=results.length; i=0;){ + if (!results[i]) continue; + var name = results[i].caption || results[i].value || results[i].name; + if (results[i].meta=='local' && (snippetNames[name] || keywordNames[name])){ + results.splice(i,1) + } else if (results[i].meta=='keyword' && snippetNames[name]){ + results.splice(i,1) + } + } return results; }; return FilteredList; @@ -2721,4 +2740,3 @@ exports.MarkerGroup = MarkerGroup; } }); })(); - \ No newline at end of file From 3846f3ab929312d4b94301b737fb815156bbe626 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 15:29:08 -0400 Subject: [PATCH 43/54] local ace modification: fix snippet formatting --- app/Resources/ui/js/ace/ext-language_tools.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/Resources/ui/js/ace/ext-language_tools.js b/app/Resources/ui/js/ace/ext-language_tools.js index 3285b5f..3942c22 100644 --- a/app/Resources/ui/js/ace/ext-language_tools.js +++ b/app/Resources/ui/js/ace/ext-language_tools.js @@ -2552,11 +2552,18 @@ var keyWordCompleter = { id: "keywordCompleter" }; var transformSnippetTooltip = function (str) { + // resolve leaf placeholders (no nested ${...} in their default text) first, + // then repeat until stable so nested groups collapse regardless of depth var record = {}; - return str.replace(/\${(\d+)(:(.*?))?}/g, function (_, p1, p2, p3) { - return (record[p1] = p3 || ''); - }).replace(/\$(\d+?)/g, function (_, p1) { - return record[p1]; + var prev; + do { + prev = str; + str = str.replace(/\${(\d+)(:([^{}]*))?}/g, function (_, p1, p2, p3) { + return (record[p1] = p3 || ''); + }); + } while (str !== prev); + return str.replace(/\$(\d+?)/g, function (_, p1) { + return record[p1] || ''; }); }; var snippetCompleter = { From 8ca98b3fd65df5fff5a62db29ff00ae81ccfa673 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 16:06:01 -0400 Subject: [PATCH 44/54] rough draft: add command-click documentation lookups - this changes the previous keybinding for adding a new insertion point: it now uses command-opt-click --- app/Resources/ui/editor.html | 20 +++++++- app/Resources/ui/js/editor.js | 86 ++++++++++++++++++++++++++++++++++ app/Resources/ui/js/symbols.js | 4 ++ plotdevice/gui/editor.py | 6 ++- 4 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 app/Resources/ui/js/symbols.js diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 17611f2..55d1ed8 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -43,11 +43,29 @@ box-shadow: inset 0 0 6px rgba(255, 255, 255, 0.3); } - + .ace_symbol-doc-link { + /* ace's "text" markers are empty overlay divs, not text nodes, so + text-decoration has nothing to draw under -- border-bottom works + since these divs are already sized to the token's line height. + position:absolute is required -- ace's built-in marker classes + (ace_selection, ace_bracket, etc.) each declare this themselves + in the stylesheet; the top/left set inline by the renderer are + otherwise ignored and the div renders in normal static flow. + z-index must beat the other .ace_marker-layer classes (active-line:2, + step/stack:3, selected-word:4, selection:5, bracket:6) or this gets + painted underneath them since it otherwise stacks in DOM order */ + position: absolute; + z-index: 7; + border-bottom: 1px solid currentColor; + cursor: pointer; + } + + + diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index cd9d840..57fa5d5 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -1,5 +1,8 @@ // the language-tools extension provides snippets and autocomplete ace.require("ace/ext/language_tools"); +// the linking extension provides accel-hover/click token events (used for cmd-click docs links) +ace.require("ace/ext/linking"); +var Range = ace.require("ace/range").Range; // Wrap the ace UndoManager's mutation methods with callbacks to the pyobjc EditorView // keeping it up-to-date on whether the file has been modified & whether undo/redo are available. @@ -28,6 +31,9 @@ var Editor = function(elt){ "Python":[] } var _htimer = null, _vtimer = null, _hmin=0, _vmin=0; + var _linkMarker = null; + var _altHeld = false; + var _lastMouseEvent = null; var that = { init:function(){ @@ -47,6 +53,26 @@ var Editor = function(elt){ ed.on("blur", that._blur) ed.on("focus", that._focus) + // cmd-hover/cmd-click a mapped symbol to underline/open its docs. + // $enableJumpToDef frees up plain cmd-click for this (multi-cursor-add + // moves to cmd-option-click instead). registered before enableLinking so + // it runs first and _altHeld is current by the time linkHover/linkClick + // fire (ext-linking.js doesn't pass the alt-key state through itself) + ed.on("mousemove", that._trackMouse) + ed.on("click", that._trackMouse) + ed.setOption("enableLinking", true) + ed.$mouseHandler.$enableJumpToDef = true + ed.on("linkHover", that._linkHover) + ed.on("linkHoverOut", that._linkHoverOut) + ed.on("linkClick", that._linkClick) + + // mousemove-driven hover only fires on actual pointer movement, so + // pressing/releasing cmd while stationary over a symbol wouldn't + // otherwise show/hide the underline -- re-check the last known + // mouse position directly against cmd's/option's keydown/keyup instead + document.addEventListener('keydown', that._trackModifiers, true) + document.addEventListener('keyup', that._trackModifiers, true) + // configure the buffer sess = ed.getSession() sess.setMode("ace/mode/plotdevice"); @@ -104,6 +130,66 @@ var Editor = function(elt){ _blur:function(){ ed.setHighlightActiveLine(false) ed.setHighlightGutterLine(false) + that._linkHoverOut() + }, + + _trackMouse:function(e){ + // ext-linking.js's linkHover/linkClick events don't carry the raw dom + // event, so track option/alt ourselves to know whether it's held + // alongside cmd (in which case ace's own cmd-option-click add-cursor + // gesture should win instead of the docs link) -- also cache the + // event itself so _trackModifiers can re-derive hover state against + // the last known mouse position when cmd/option change while stationary + _altHeld = !!(e.domEvent && e.domEvent.altKey) + _lastMouseEvent = e + }, + _trackModifiers:function(e){ + // pressing/releasing cmd or option alone doesn't fire a mousemove, so + // ext-linking.js never re-evaluates the token under a stationary pointer + // -- do it ourselves. modifier flags on the event reflect live state + // (including for the key's own keyup), so no keydown/keyup branching + // is needed -- just recompute from current state each time + if ((e.key !== 'Meta' && e.key !== 'Alt') || !_lastMouseEvent) return + _altHeld = !!e.altKey + if (!e.metaKey || _altHeld){ + that._linkHoverOut() + return + } + var docPos = _lastMouseEvent.getDocumentPosition() + that._linkHover({position:docPos, token:sess.getTokenAt(docPos.row, docPos.column)}) + }, + _linkHover:function(e){ + var word = e.token && e.token.value + if (_altHeld || !Object.prototype.hasOwnProperty.call(PLOTDEVICE_SYMBOL_DOCS, word)){ + that._linkHoverOut() + return + } + that._linkHoverOut() + ed.renderer.setCursorStyle("pointer") // .ace_layer has pointer-events:none, so css :hover/cursor on the marker itself has no effect + var row = e.position.row + var range = Range.fromPoints({row:row, column:e.token.start}, {row:row, column:e.token.start+e.token.value.length}) + // addMarker(..., "text") goes through drawTextMarker, which is built for + // multi-row wrapped spans (wrong width + rounded corners for a single-row + // range) -- draw a plain single-line underline via the same primitive + // ace uses for selection/highlight markers instead. a dynamic marker must + // NOT have a .range property or ace routes it through the static-marker + // path (using its .clazz, which we don't set) instead of calling .update() + _linkMarker = sess.addDynamicMarker({ + update: function(html, markerLayer, session, config){ + markerLayer.drawSingleLineMarker(html, range, "ace_symbol-doc-link", config) + } + }) + }, + _linkHoverOut:function(){ + if (_linkMarker!=null) sess.removeMarker(_linkMarker.id) + _linkMarker = null + ed.renderer.setCursorStyle("") + }, + _linkClick:function(e){ + if (_altHeld) return // let ace's own cmd-option-click add-cursor gesture proceed instead + var word = e.token && e.token.value + var url = PLOTDEVICE_SYMBOL_DOCS[word] + if (url) app.openDoc(url) }, focus:function(){ diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js new file mode 100644 index 0000000..a9a03cd --- /dev/null +++ b/app/Resources/ui/js/symbols.js @@ -0,0 +1,4 @@ +// symbol name -> documentation URL. Filled in separately. +var PLOTDEVICE_SYMBOL_DOCS = { + // "BezierPath": "https://plotdevice.io/doc/#bezierpath", +} diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 794b237..d38fe17 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -159,7 +159,7 @@ def webViewWebContentProcessDidTerminate_(self, sender): def userContentController_didReceiveScriptMessage_(self, ucc, msg): body = msg.body() fn, fnargs = body['fn'], list(body.get('args', [])) - if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs'): + if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs', 'openDoc'): getattr(self, fn)(*fnargs) def resizeSubviewsWithOldSize_(self, oldSize): @@ -329,6 +329,10 @@ def undoAction_(self, sender): def loadPrefs(self): NSApp().delegate().showPreferencesPanel_(self) + @objc.python_method + def openDoc(self, url): + NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(url)) + def cancelRun(self): # catch command-period even when the editor is first responder mm=NSApp().mainMenu() From f68126d4eb353ee3220d7fc0186b59b59828de1d Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 16:35:09 -0400 Subject: [PATCH 45/54] Add links to the documentation for all known symbols --- app/Resources/ui/js/symbols.js | 175 ++++++++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 2 deletions(-) diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js index a9a03cd..22c5885 100644 --- a/app/Resources/ui/js/symbols.js +++ b/app/Resources/ui/js/symbols.js @@ -1,4 +1,175 @@ -// symbol name -> documentation URL. Filled in separately. +// symbol name -> documentation URL. var PLOTDEVICE_SYMBOL_DOCS = { - // "BezierPath": "https://plotdevice.io/doc/#bezierpath", + // Canvas + "size": "https://plotdevice.io/ref/Canvas#size()", + "speed": "https://plotdevice.io/ref/Canvas#speed()", + "background": "https://plotdevice.io/ref/Canvas#background()", + "geometry": "https://plotdevice.io/ref/Canvas#geometry()", + "export": "https://plotdevice.io/ref/Canvas#export()", + "plot": "https://plotdevice.io/ref/Canvas#plot()", + "clear": "https://plotdevice.io/ref/Canvas#clear()", + "outputmode": "https://plotdevice.io/ref/Canvas#outputmode()", + "ximport": "https://plotdevice.io/ref/Canvas#ximport()", + "halt": "https://plotdevice.io/ref/Canvas#halt()", + + // Line & Color + "color": "https://plotdevice.io/ref/Line+Color#color()", + "stroke": "https://plotdevice.io/ref/Line+Color#stroke()", + "fill": "https://plotdevice.io/ref/Line+Color#fill()", + "pen": "https://plotdevice.io/ref/Line+Color#pen()", + "capstyle": "https://plotdevice.io/ref/Line+Color#capstyle()", + "colormode": "https://plotdevice.io/ref/Line+Color#colormode()", + "joinstyle": "https://plotdevice.io/ref/Line+Color#joinstyle()", + "nofill": "https://plotdevice.io/ref/Line+Color#nofill()", + "nostroke": "https://plotdevice.io/ref/Line+Color#nostroke()", + "strokewidth": "https://plotdevice.io/ref/Line+Color#strokewidth()", + + // Primitives + "poly": "https://plotdevice.io/ref/Primitives#poly()", + "rect": "https://plotdevice.io/ref/Primitives#rect()", + "arc": "https://plotdevice.io/ref/Primitives#arc()", + "oval": "https://plotdevice.io/ref/Primitives#oval()", + "line": "https://plotdevice.io/ref/Primitives#line()", + "image": "https://plotdevice.io/ref/Primitives#image()", + "text": "https://plotdevice.io/ref/Primitives#text()", + "arrow": "https://plotdevice.io/ref/Primitives#arrow()", + "star": "https://plotdevice.io/ref/Primitives#star()", + + // Drawing + "bezier": "https://plotdevice.io/ref/Drawing#bezier()", + "moveto": "https://plotdevice.io/ref/Drawing#moveto()", + "lineto": "https://plotdevice.io/ref/Drawing#lineto()", + "arcto": "https://plotdevice.io/ref/Drawing#arcto()", + "curveto": "https://plotdevice.io/ref/Drawing#curveto()", + "autoclosepath": "https://plotdevice.io/ref/Drawing#autoclosepath()", + "beginpath": "https://plotdevice.io/ref/Drawing#beginpath()", + "drawpath": "https://plotdevice.io/ref/Drawing#drawpath()", + "endpath": "https://plotdevice.io/ref/Drawing#endpath()", + "findpath": "https://plotdevice.io/ref/Drawing#findpath()", + + // Transform + "transform": "https://plotdevice.io/ref/Transform#transform()", + "translate": "https://plotdevice.io/ref/Transform#translate()", + "rotate": "https://plotdevice.io/ref/Transform#rotate()", + "scale": "https://plotdevice.io/ref/Transform#scale()", + "skew": "https://plotdevice.io/ref/Transform#skew()", + "reset": "https://plotdevice.io/ref/Transform#reset()", + "pop": "https://plotdevice.io/ref/Transform#pop()", + "push": "https://plotdevice.io/ref/Transform#push()", + + // Compositing + "alpha": "https://plotdevice.io/ref/Compositing#alpha()", + "blend": "https://plotdevice.io/ref/Compositing#blend()", + "shadow": "https://plotdevice.io/ref/Compositing#shadow()", + "clip": "https://plotdevice.io/ref/Compositing#clip()", + "mask": "https://plotdevice.io/ref/Compositing#mask()", + "noshadow": "https://plotdevice.io/ref/Compositing#noshadow()", + "beginclip": "https://plotdevice.io/ref/Compositing#beginclip()", + "endclip": "https://plotdevice.io/ref/Compositing#endclip()", + + // Typography + "font": "https://plotdevice.io/ref/Typography#font()", + "layout": "https://plotdevice.io/ref/Typography#layout()", + "stylesheet": "https://plotdevice.io/ref/Typography#stylesheet()", + "paginate": "https://plotdevice.io/ref/Typography#paginate()", + "textpath": "https://plotdevice.io/ref/Typography#textpath()", + "align": "https://plotdevice.io/ref/Typography#align()", + "fontsize": "https://plotdevice.io/ref/Typography#fontsize()", + "lineheight": "https://plotdevice.io/ref/Typography#lineheight()", + "textheight": "https://plotdevice.io/ref/Typography#textheight()", + "textmetrics": "https://plotdevice.io/ref/Typography#textmetrics()", + "textwidth": "https://plotdevice.io/ref/Typography#textwidth()", + + // Misc (Utility & Entropy) + "read": "https://plotdevice.io/ref/Misc#read()", + "measure": "https://plotdevice.io/ref/Misc#measure()", + "files": "https://plotdevice.io/ref/Misc#files()", + "fonts": "https://plotdevice.io/ref/Misc#fonts()", + "var": "https://plotdevice.io/ref/Misc#var()", + "imagesize": "https://plotdevice.io/ref/Misc#imagesize()", + "open": "https://plotdevice.io/ref/Misc#open()", + "random": "https://plotdevice.io/ref/Misc#random()", + "choice": "https://plotdevice.io/ref/Misc#choice()", + "shuffled": "https://plotdevice.io/ref/Misc#shuffled()", + "ordered": "https://plotdevice.io/ref/Misc#ordered()", + "grid": "https://plotdevice.io/ref/Misc#grid()", + "autotext": "https://plotdevice.io/ref/Misc#autotext()", + + // Objects: Drawing + "Bezier": "https://plotdevice.io/ref/Drawing#Bezier", + "Curve": "https://plotdevice.io/ref/Drawing#Curve", + "Image": "https://plotdevice.io/ref/Drawing#Image", + "Context": "https://plotdevice.io/ref/Drawing#Context", + + // Objects: Line & Color + "Color": "https://plotdevice.io/ref/Line+Color#Color", + "Gradient": "https://plotdevice.io/ref/Line+Color#Gradient", + "Shadow": "https://plotdevice.io/ref/Line+Color#Shadow", + + // Objects: Transform + "Point": "https://plotdevice.io/ref/Transform#Point", + "Size": "https://plotdevice.io/ref/Transform#Size", + "Region": "https://plotdevice.io/ref/Transform#Region", + "Transform": "https://plotdevice.io/ref/Transform#Transform", + + // Objects: Typography + "Text": "https://plotdevice.io/ref/Typography#Text", + "TextBlock": "https://plotdevice.io/ref/Typography#TextBlock", + "TextFragment": "https://plotdevice.io/ref/Typography#TextFragment", + "Font": "https://plotdevice.io/ref/Typography#Font", + "Family": "https://plotdevice.io/ref/Typography#Family", + + // Constants + "px": "https://plotdevice.io/ref/Misc#constants", + "pica": "https://plotdevice.io/ref/Misc#constants", + "inch": "https://plotdevice.io/ref/Misc#constants", + "cm": "https://plotdevice.io/ref/Misc#constants", + "mm": "https://plotdevice.io/ref/Misc#constants", + "pi": "https://plotdevice.io/ref/Misc#constants", + "tau": "https://plotdevice.io/ref/Misc#constants", + "RGB": "https://plotdevice.io/ref/Misc#constants", + "HSV": "https://plotdevice.io/ref/Misc#constants", + "CMYK": "https://plotdevice.io/ref/Misc#constants", + "CENTER": "https://plotdevice.io/ref/Misc#constants", + "CORNER": "https://plotdevice.io/ref/Misc#constants", + "DEGREES": "https://plotdevice.io/ref/Misc#constants", + "RADIANS": "https://plotdevice.io/ref/Misc#constants", + "PERCENT": "https://plotdevice.io/ref/Misc#constants", + "LEFT": "https://plotdevice.io/ref/Misc#constants", + "RIGHT": "https://plotdevice.io/ref/Misc#constants", + "JUSTIFY": "https://plotdevice.io/ref/Misc#constants", + "MOVETO": "https://plotdevice.io/ref/Misc#constants", + "LINETO": "https://plotdevice.io/ref/Misc#constants", + "CURVETO": "https://plotdevice.io/ref/Misc#constants", + "CLOSE": "https://plotdevice.io/ref/Misc#constants", + "MITER": "https://plotdevice.io/ref/Misc#constants", + "ROUND": "https://plotdevice.io/ref/Misc#constants", + "BEVEL": "https://plotdevice.io/ref/Misc#constants", + "BUTT": "https://plotdevice.io/ref/Misc#constants", + "SQUARE": "https://plotdevice.io/ref/Misc#constants", + "NORMAL": "https://plotdevice.io/ref/Misc#constants", + "FORTYFIVE": "https://plotdevice.io/ref/Misc#constants", + "NUMBER": "https://plotdevice.io/ref/Misc#constants", + "TEXT": "https://plotdevice.io/ref/Misc#constants", + "BOOLEAN": "https://plotdevice.io/ref/Misc#constants", + "BUTTON": "https://plotdevice.io/ref/Misc#constants", + "WIDTH": "https://plotdevice.io/ref/Misc#constants", + "HEIGHT": "https://plotdevice.io/ref/Misc#constants", + "FRAME": "https://plotdevice.io/ref/Misc#constants", + "PAGENUM": "https://plotdevice.io/ref/Misc#constants", + "MOUSEX": "https://plotdevice.io/ref/Misc#constants", + "MOUSEY": "https://plotdevice.io/ref/Misc#constants", + "mousedown": "https://plotdevice.io/ref/Misc#constants", + "KEY_UP": "https://plotdevice.io/ref/Misc#constants", + "KEY_DOWN": "https://plotdevice.io/ref/Misc#constants", + "KEY_LEFT": "https://plotdevice.io/ref/Misc#constants", + "KEY_RIGHT": "https://plotdevice.io/ref/Misc#constants", + "KEY_BACKSPACE": "https://plotdevice.io/ref/Misc#constants", + "KEY_TAB": "https://plotdevice.io/ref/Misc#constants", + "KEY_ESC": "https://plotdevice.io/ref/Misc#constants", + + // Dictionaries + "adict": "https://plotdevice.io/ref/Misc#dictionaries", + "ddict": "https://plotdevice.io/ref/Misc#dictionaries", + "odict": "https://plotdevice.io/ref/Misc#dictionaries", } From 81318c4c73f0f451fa68074422938e75f07f2eca Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 16:54:06 -0400 Subject: [PATCH 46/54] add usage samples --- app/Resources/ui/js/symbols.js | 119 +++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js index 22c5885..55def10 100644 --- a/app/Resources/ui/js/symbols.js +++ b/app/Resources/ui/js/symbols.js @@ -173,3 +173,122 @@ var PLOTDEVICE_SYMBOL_DOCS = { "ddict": "https://plotdevice.io/ref/Misc#dictionaries", "odict": "https://plotdevice.io/ref/Misc#dictionaries", } + +// symbol name -> array of example usage lines (from each ref page's "Syntax" section). +var PLOTDEVICE_SYMBOL_USAGE = { + // Canvas + "size": ["size(width, height, unit=px)"], + "speed": ["speed(fps)"], + "background": ["background(r, g, b, a=1.0)", "background(h, s, b, a=1.0)", "background(c, m, y, k, a=1.0)", "background(k, a=1.0)", "background(color)", "background(None) # transparent backdrop", "background(*colors, angle, steps=[0,1]) # axial gradient", "background(*colors, steps=[0,1], center=[0,0]) # radial gradient"], + "geometry": ["geometry(units)"], + "export": ["... # draw to the canvas", "export(\"spool.pdf\", cmyk=False)", "... # draw at retina-quality to the canvas", "export(\"spool.png\", zoom=2)", "with export(\"movie.mov\", fps=30, bitrate=1.0):", " ... # draw movie frames", "with export(\"anim.gif\", fps=30, loop=0):", " ... # draw gif frames"], + "plot": ["plot(grob)"], + "clear": ["clear() # erase the canvas", "clear(all) # erase the canvas and reset drawing state", "clear(*grobs) # remove specific objects from the canvas"], + "outputmode": ["outputmode(mode)"], + "ximport": ["libname = ximport(\"libname\")"], + "halt": ["halt()"], + + // Line & Color + "color": ["color(mode=RGB, range=1.0) # the default color mode and range", "color(range=255) # use 0-255 component values rather than 0–1", "color(HSV) # color-related commands will expect HSV values", "color(r, g, b, a=1) # RGB mode", "color(h, s, v, a=1) # HSV mode", "color(c, m, y, k, a=1) # CMYK mode", "color(v, a=1)"], + "stroke": ["stroke(r, g, b, a=1.0)", "stroke(h, s, v, a=1.0)", "stroke(c, m, y, k, a=1.0)", "stroke(v, a=1.0)", "stroke(color)"], + "fill": ["fill(r, g, b, a=1.0)", "fill(h, s, v, a=1.0)", "fill(c, m, y, k, a=1.0)", "fill(v, a=1.0)", "fill(color)", "fill(*colors, angle, steps=[0,1]) # axial gradient", "fill(*colors, steps=[0,1], center=[0,0]) # radial gradient"], + "pen": ["pen(nib, join=MITER, cap=BUTT, dash=None)"], + "capstyle": ["capstyle(style)"], + "colormode": ["colormode(mode, range=1.0)"], + "joinstyle": ["joinstyle(style)"], + "nofill": ["nofill()"], + "nostroke": ["nostroke()"], + "strokewidth": ["strokewidth(width)"], + + // Primitives + "poly": ["poly(self, x, y, radius, sides=4, points=None, plot=True, **style)"], + "rect": ["rect(x, y, width, height, roundness=0.0, radius=None, plot=True, **style)"], + "arc": ["arc(x, y, radius, range=None, ccw=False, close=False, plot=True, **style)"], + "oval": ["oval(x, y, width, height, plot=True, **style)"], + "line": ["line(x1, y1, x2, y2, plot=True)"], + "image": ["image(src, x, y, width=None, height=None, plot=True, **style)", "image(x, y, width=None, height=None, src=\"path-or-url\", plot=True, **style)", "image(x, y, width=None, height=None, data=\"bytes-or-base64\", plot=True, **style)"], + "text": ["text(str, x, y, width=None, height=None, outline=False, plot=True, **options)", "text(x, y, width=None, height=None, str=\"\", **options)", "text(x, y, width=None, height=None, xml=\"\", **options)", "text(x, y, width=None, height=None, src=\"\", **options)"], + "arrow": ["arrow(x, y, width, type=NORMAL, plot=True, **style)"], + "star": ["star(x, y, points=20, outer=100, inner=50, plot=True, **style)"], + + // Drawing + "bezier": ["bezier(points=[], smooth=False, **opts)", "bezier(path, **opts)", "with bezier(x=0, y=0, **opts) as path:", " ... # drawing commands like moveto(), lineto(), arcto(), or curveto()"], + "moveto": ["moveto(x, y)"], + "lineto": ["lineto(x, y, close=False)"], + "arcto": ["arcto(x, y, ccw=False, close=False)", "arcto(cx, cy, x, y, radius, close=False)"], + "curveto": ["curveto(h1x, h1y, h2x, h2y, x, y, close=False)"], + "autoclosepath": ["autoclosepath(close=True)"], + "beginpath": ["beginpath(x=None, y=None)"], + "drawpath": ["drawpath(path)"], + "endpath": ["endpath(draw=True)"], + "findpath": ["findpath(list, curvature=1.0)"], + + // Transform + "transform": ["transform(mode)", "transform(matrix=[m11, m21, m12, m22, tX, tY])", "with transform(mode=None, matrix=None):", " ... # drawing & transformation commands", "with transform(CORNER):", " translate(100,20)", " line(0,0, 40,0)", "oldmode = CENTER", "transform(CORNER)", "push()", "translate(100,20)", "line(0,0, 40,0)", "pop()", "transform(oldmode)", "fill(0.2)", "fontsize(14)", "rotate(90)", "text(\"one\", 40, 80)", "", "with transform():", " rotate(-90)", " text(\"two\", 40, 40)", "", "text(\"three\", 50, 80)"], + "translate": ["translate(x, y)"], + "rotate": ["rotate(amount) # amount to rotate (in default unit)", "rotate(percent=0.5) # 0 ... 1.0", "rotate(degrees=180) # 0 ... 360", "rotate(radians=pi) # 0 ... 2*pi (a.k.a. tau)"], + "scale": ["scale(x, y=None)"], + "skew": ["skew(x, y=None)"], + "reset": ["reset()"], + "pop": ["pop()"], + "push": ["push()"], + + // Compositing + "alpha": ["alpha(opacity)"], + "blend": ["blend(mode)"], + "shadow": ["shadow(color, blur=10, offset=(5,5))"], + "clip": ["with clip(stencil, channel=\"alpha\"):"], + "mask": ["with mask(stencil, channel=\"alpha\"):"], + "noshadow": ["noshadow()"], + "beginclip": ["beginclip(path)"], + "endclip": ["endclip()"], + + // Typography + "font": ["font(family, weight, size, italic=False, **options)"], + "layout": ["layout(**options)"], + "stylesheet": ["stylesheet(\"name\", *font, **options) # define a style", "stylesheet(\"name\") # retrieve a preexisting style", "stylesheet(\"name\", None) # undefine a style"], + "paginate": ["paginate(str, x, y, width, height, **options)", "paginate(x, y, width, height, str=\"\", **options)", "paginate(x, y, width, height, xml=\"\", **options)", "paginate(x, y, width, height, src=\"\", **options)", "paginate(Text, folio=1, verso=None)"], + "textpath": ["textpath(txt, x, y, width=None, height=1000000, **options)"], + "align": ["align(style=LEFT)"], + "fontsize": ["fontsize(size)"], + "lineheight": ["lineheight(height=None)"], + "textheight": ["textheight(txt, width=None, **options)"], + "textmetrics": ["textmetrics(txt, width=None)"], + "textwidth": ["textwidth(txt, width=None)"], + + // Misc (Utility & Entropy) + "read": ["read(path, format=None, encoding='utf-8', cols=None, dict=dict)"], + "measure": ["measure(grob)", "measure(image=\"path\", width=None, height=None)", "measure(\"text\", width=None, height=None, **fontstyle)"], + "files": ["files(pattern, case=True)"], + "fonts": ["fonts(like=None, western=True)"], + "var": ["var(name, NUMBER, value=50, min=0, max=100, step=None, label=None)", "var(name, TEXT, value, label=None)", "var(name, BOOLEAN, value, label=None)", "var(name, BUTTON, value, color=None, label=None)"], + "imagesize": ["imagesize(path)"], + "open": ["open(path).read()"], + "random": ["random(v1=None, v2=None)"], + "choice": ["choice(sequence)"], + "shuffled": ["shuffled(sequence)"], + "ordered": ["ordered(list, *names, reverse=False)"], + "grid": ["grid(cols, rows, colsize=1, rowsize=1)"], + "autotext": ["autotext()"], + + // Objects: Drawing + "Bezier": ["Bezier()"], + "Curve": ["Curve()"], + "Context": ["Context()"], + + // Objects: Line & Color + "Color": ["Color()"], + "Gradient": ["Gradient(*colors, steps=[0,1], angle=0)"], + "Shadow": ["Shadow(color, blur=10, offset=(5,5))"], + + // Objects: Transform + "Point": ["Point(x, y)"], + "Size": ["Size(width, height)"], + "Region": ["Region(x, y, w, h)", "Region(Point, Size)"], + "Transform": ["Transform()"], + + // Objects: Typography + "Text": ["Text(str, x, y, width=None, height=None, **options)", "Text(x, y, width=None, height=None, str=\"\", **options)", "Text(x, y, width=None, height=None, xml=\"\", **options)", "Text(x, y, width=None, height=None, src=\"\", **options)"], + "Font": ["Font(family, weight, size, italic=False, **options)"], + "Family": ["Family(famname)"], +} From 41ca645618400e53f077702364d206210d76b879 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 16:59:10 -0400 Subject: [PATCH 47/54] reformat --- app/Resources/ui/js/symbols.js | 592 ++++++++++++++++++++------------- 1 file changed, 355 insertions(+), 237 deletions(-) diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js index 55def10..dbe08a5 100644 --- a/app/Resources/ui/js/symbols.js +++ b/app/Resources/ui/js/symbols.js @@ -1,294 +1,412 @@ // symbol name -> documentation URL. var PLOTDEVICE_SYMBOL_DOCS = { // Canvas - "size": "https://plotdevice.io/ref/Canvas#size()", - "speed": "https://plotdevice.io/ref/Canvas#speed()", - "background": "https://plotdevice.io/ref/Canvas#background()", - "geometry": "https://plotdevice.io/ref/Canvas#geometry()", - "export": "https://plotdevice.io/ref/Canvas#export()", - "plot": "https://plotdevice.io/ref/Canvas#plot()", - "clear": "https://plotdevice.io/ref/Canvas#clear()", - "outputmode": "https://plotdevice.io/ref/Canvas#outputmode()", - "ximport": "https://plotdevice.io/ref/Canvas#ximport()", - "halt": "https://plotdevice.io/ref/Canvas#halt()", + size: "https://plotdevice.io/ref/Canvas#size()", + speed: "https://plotdevice.io/ref/Canvas#speed()", + background: "https://plotdevice.io/ref/Canvas#background()", + geometry: "https://plotdevice.io/ref/Canvas#geometry()", + export: "https://plotdevice.io/ref/Canvas#export()", + plot: "https://plotdevice.io/ref/Canvas#plot()", + clear: "https://plotdevice.io/ref/Canvas#clear()", + outputmode: "https://plotdevice.io/ref/Canvas#outputmode()", + ximport: "https://plotdevice.io/ref/Canvas#ximport()", + halt: "https://plotdevice.io/ref/Canvas#halt()", // Line & Color - "color": "https://plotdevice.io/ref/Line+Color#color()", - "stroke": "https://plotdevice.io/ref/Line+Color#stroke()", - "fill": "https://plotdevice.io/ref/Line+Color#fill()", - "pen": "https://plotdevice.io/ref/Line+Color#pen()", - "capstyle": "https://plotdevice.io/ref/Line+Color#capstyle()", - "colormode": "https://plotdevice.io/ref/Line+Color#colormode()", - "joinstyle": "https://plotdevice.io/ref/Line+Color#joinstyle()", - "nofill": "https://plotdevice.io/ref/Line+Color#nofill()", - "nostroke": "https://plotdevice.io/ref/Line+Color#nostroke()", - "strokewidth": "https://plotdevice.io/ref/Line+Color#strokewidth()", + color: "https://plotdevice.io/ref/Line+Color#color()", + stroke: "https://plotdevice.io/ref/Line+Color#stroke()", + fill: "https://plotdevice.io/ref/Line+Color#fill()", + pen: "https://plotdevice.io/ref/Line+Color#pen()", + capstyle: "https://plotdevice.io/ref/Line+Color#capstyle()", + colormode: "https://plotdevice.io/ref/Line+Color#colormode()", + joinstyle: "https://plotdevice.io/ref/Line+Color#joinstyle()", + nofill: "https://plotdevice.io/ref/Line+Color#nofill()", + nostroke: "https://plotdevice.io/ref/Line+Color#nostroke()", + strokewidth: "https://plotdevice.io/ref/Line+Color#strokewidth()", // Primitives - "poly": "https://plotdevice.io/ref/Primitives#poly()", - "rect": "https://plotdevice.io/ref/Primitives#rect()", - "arc": "https://plotdevice.io/ref/Primitives#arc()", - "oval": "https://plotdevice.io/ref/Primitives#oval()", - "line": "https://plotdevice.io/ref/Primitives#line()", - "image": "https://plotdevice.io/ref/Primitives#image()", - "text": "https://plotdevice.io/ref/Primitives#text()", - "arrow": "https://plotdevice.io/ref/Primitives#arrow()", - "star": "https://plotdevice.io/ref/Primitives#star()", + poly: "https://plotdevice.io/ref/Primitives#poly()", + rect: "https://plotdevice.io/ref/Primitives#rect()", + arc: "https://plotdevice.io/ref/Primitives#arc()", + oval: "https://plotdevice.io/ref/Primitives#oval()", + line: "https://plotdevice.io/ref/Primitives#line()", + image: "https://plotdevice.io/ref/Primitives#image()", + text: "https://plotdevice.io/ref/Primitives#text()", + arrow: "https://plotdevice.io/ref/Primitives#arrow()", + star: "https://plotdevice.io/ref/Primitives#star()", // Drawing - "bezier": "https://plotdevice.io/ref/Drawing#bezier()", - "moveto": "https://plotdevice.io/ref/Drawing#moveto()", - "lineto": "https://plotdevice.io/ref/Drawing#lineto()", - "arcto": "https://plotdevice.io/ref/Drawing#arcto()", - "curveto": "https://plotdevice.io/ref/Drawing#curveto()", - "autoclosepath": "https://plotdevice.io/ref/Drawing#autoclosepath()", - "beginpath": "https://plotdevice.io/ref/Drawing#beginpath()", - "drawpath": "https://plotdevice.io/ref/Drawing#drawpath()", - "endpath": "https://plotdevice.io/ref/Drawing#endpath()", - "findpath": "https://plotdevice.io/ref/Drawing#findpath()", + bezier: "https://plotdevice.io/ref/Drawing#bezier()", + moveto: "https://plotdevice.io/ref/Drawing#moveto()", + lineto: "https://plotdevice.io/ref/Drawing#lineto()", + arcto: "https://plotdevice.io/ref/Drawing#arcto()", + curveto: "https://plotdevice.io/ref/Drawing#curveto()", + autoclosepath: "https://plotdevice.io/ref/Drawing#autoclosepath()", + beginpath: "https://plotdevice.io/ref/Drawing#beginpath()", + drawpath: "https://plotdevice.io/ref/Drawing#drawpath()", + endpath: "https://plotdevice.io/ref/Drawing#endpath()", + findpath: "https://plotdevice.io/ref/Drawing#findpath()", // Transform - "transform": "https://plotdevice.io/ref/Transform#transform()", - "translate": "https://plotdevice.io/ref/Transform#translate()", - "rotate": "https://plotdevice.io/ref/Transform#rotate()", - "scale": "https://plotdevice.io/ref/Transform#scale()", - "skew": "https://plotdevice.io/ref/Transform#skew()", - "reset": "https://plotdevice.io/ref/Transform#reset()", - "pop": "https://plotdevice.io/ref/Transform#pop()", - "push": "https://plotdevice.io/ref/Transform#push()", + transform: "https://plotdevice.io/ref/Transform#transform()", + translate: "https://plotdevice.io/ref/Transform#translate()", + rotate: "https://plotdevice.io/ref/Transform#rotate()", + scale: "https://plotdevice.io/ref/Transform#scale()", + skew: "https://plotdevice.io/ref/Transform#skew()", + reset: "https://plotdevice.io/ref/Transform#reset()", + pop: "https://plotdevice.io/ref/Transform#pop()", + push: "https://plotdevice.io/ref/Transform#push()", // Compositing - "alpha": "https://plotdevice.io/ref/Compositing#alpha()", - "blend": "https://plotdevice.io/ref/Compositing#blend()", - "shadow": "https://plotdevice.io/ref/Compositing#shadow()", - "clip": "https://plotdevice.io/ref/Compositing#clip()", - "mask": "https://plotdevice.io/ref/Compositing#mask()", - "noshadow": "https://plotdevice.io/ref/Compositing#noshadow()", - "beginclip": "https://plotdevice.io/ref/Compositing#beginclip()", - "endclip": "https://plotdevice.io/ref/Compositing#endclip()", + alpha: "https://plotdevice.io/ref/Compositing#alpha()", + blend: "https://plotdevice.io/ref/Compositing#blend()", + shadow: "https://plotdevice.io/ref/Compositing#shadow()", + clip: "https://plotdevice.io/ref/Compositing#clip()", + mask: "https://plotdevice.io/ref/Compositing#mask()", + noshadow: "https://plotdevice.io/ref/Compositing#noshadow()", + beginclip: "https://plotdevice.io/ref/Compositing#beginclip()", + endclip: "https://plotdevice.io/ref/Compositing#endclip()", // Typography - "font": "https://plotdevice.io/ref/Typography#font()", - "layout": "https://plotdevice.io/ref/Typography#layout()", - "stylesheet": "https://plotdevice.io/ref/Typography#stylesheet()", - "paginate": "https://plotdevice.io/ref/Typography#paginate()", - "textpath": "https://plotdevice.io/ref/Typography#textpath()", - "align": "https://plotdevice.io/ref/Typography#align()", - "fontsize": "https://plotdevice.io/ref/Typography#fontsize()", - "lineheight": "https://plotdevice.io/ref/Typography#lineheight()", - "textheight": "https://plotdevice.io/ref/Typography#textheight()", - "textmetrics": "https://plotdevice.io/ref/Typography#textmetrics()", - "textwidth": "https://plotdevice.io/ref/Typography#textwidth()", + font: "https://plotdevice.io/ref/Typography#font()", + layout: "https://plotdevice.io/ref/Typography#layout()", + stylesheet: "https://plotdevice.io/ref/Typography#stylesheet()", + paginate: "https://plotdevice.io/ref/Typography#paginate()", + textpath: "https://plotdevice.io/ref/Typography#textpath()", + align: "https://plotdevice.io/ref/Typography#align()", + fontsize: "https://plotdevice.io/ref/Typography#fontsize()", + lineheight: "https://plotdevice.io/ref/Typography#lineheight()", + textheight: "https://plotdevice.io/ref/Typography#textheight()", + textmetrics: "https://plotdevice.io/ref/Typography#textmetrics()", + textwidth: "https://plotdevice.io/ref/Typography#textwidth()", // Misc (Utility & Entropy) - "read": "https://plotdevice.io/ref/Misc#read()", - "measure": "https://plotdevice.io/ref/Misc#measure()", - "files": "https://plotdevice.io/ref/Misc#files()", - "fonts": "https://plotdevice.io/ref/Misc#fonts()", - "var": "https://plotdevice.io/ref/Misc#var()", - "imagesize": "https://plotdevice.io/ref/Misc#imagesize()", - "open": "https://plotdevice.io/ref/Misc#open()", - "random": "https://plotdevice.io/ref/Misc#random()", - "choice": "https://plotdevice.io/ref/Misc#choice()", - "shuffled": "https://plotdevice.io/ref/Misc#shuffled()", - "ordered": "https://plotdevice.io/ref/Misc#ordered()", - "grid": "https://plotdevice.io/ref/Misc#grid()", - "autotext": "https://plotdevice.io/ref/Misc#autotext()", + read: "https://plotdevice.io/ref/Misc#read()", + measure: "https://plotdevice.io/ref/Misc#measure()", + files: "https://plotdevice.io/ref/Misc#files()", + fonts: "https://plotdevice.io/ref/Misc#fonts()", + var: "https://plotdevice.io/ref/Misc#var()", + imagesize: "https://plotdevice.io/ref/Misc#imagesize()", + open: "https://plotdevice.io/ref/Misc#open()", + random: "https://plotdevice.io/ref/Misc#random()", + choice: "https://plotdevice.io/ref/Misc#choice()", + shuffled: "https://plotdevice.io/ref/Misc#shuffled()", + ordered: "https://plotdevice.io/ref/Misc#ordered()", + grid: "https://plotdevice.io/ref/Misc#grid()", + autotext: "https://plotdevice.io/ref/Misc#autotext()", // Objects: Drawing - "Bezier": "https://plotdevice.io/ref/Drawing#Bezier", - "Curve": "https://plotdevice.io/ref/Drawing#Curve", - "Image": "https://plotdevice.io/ref/Drawing#Image", - "Context": "https://plotdevice.io/ref/Drawing#Context", + Bezier: "https://plotdevice.io/ref/Drawing#Bezier", + Curve: "https://plotdevice.io/ref/Drawing#Curve", + Image: "https://plotdevice.io/ref/Drawing#Image", + Context: "https://plotdevice.io/ref/Drawing#Context", // Objects: Line & Color - "Color": "https://plotdevice.io/ref/Line+Color#Color", - "Gradient": "https://plotdevice.io/ref/Line+Color#Gradient", - "Shadow": "https://plotdevice.io/ref/Line+Color#Shadow", + Color: "https://plotdevice.io/ref/Line+Color#Color", + Gradient: "https://plotdevice.io/ref/Line+Color#Gradient", + Shadow: "https://plotdevice.io/ref/Line+Color#Shadow", // Objects: Transform - "Point": "https://plotdevice.io/ref/Transform#Point", - "Size": "https://plotdevice.io/ref/Transform#Size", - "Region": "https://plotdevice.io/ref/Transform#Region", - "Transform": "https://plotdevice.io/ref/Transform#Transform", + Point: "https://plotdevice.io/ref/Transform#Point", + Size: "https://plotdevice.io/ref/Transform#Size", + Region: "https://plotdevice.io/ref/Transform#Region", + Transform: "https://plotdevice.io/ref/Transform#Transform", // Objects: Typography - "Text": "https://plotdevice.io/ref/Typography#Text", - "TextBlock": "https://plotdevice.io/ref/Typography#TextBlock", - "TextFragment": "https://plotdevice.io/ref/Typography#TextFragment", - "Font": "https://plotdevice.io/ref/Typography#Font", - "Family": "https://plotdevice.io/ref/Typography#Family", + Text: "https://plotdevice.io/ref/Typography#Text", + TextBlock: "https://plotdevice.io/ref/Typography#TextBlock", + TextFragment: "https://plotdevice.io/ref/Typography#TextFragment", + Font: "https://plotdevice.io/ref/Typography#Font", + Family: "https://plotdevice.io/ref/Typography#Family", // Constants - "px": "https://plotdevice.io/ref/Misc#constants", - "pica": "https://plotdevice.io/ref/Misc#constants", - "inch": "https://plotdevice.io/ref/Misc#constants", - "cm": "https://plotdevice.io/ref/Misc#constants", - "mm": "https://plotdevice.io/ref/Misc#constants", - "pi": "https://plotdevice.io/ref/Misc#constants", - "tau": "https://plotdevice.io/ref/Misc#constants", - "RGB": "https://plotdevice.io/ref/Misc#constants", - "HSV": "https://plotdevice.io/ref/Misc#constants", - "CMYK": "https://plotdevice.io/ref/Misc#constants", - "CENTER": "https://plotdevice.io/ref/Misc#constants", - "CORNER": "https://plotdevice.io/ref/Misc#constants", - "DEGREES": "https://plotdevice.io/ref/Misc#constants", - "RADIANS": "https://plotdevice.io/ref/Misc#constants", - "PERCENT": "https://plotdevice.io/ref/Misc#constants", - "LEFT": "https://plotdevice.io/ref/Misc#constants", - "RIGHT": "https://plotdevice.io/ref/Misc#constants", - "JUSTIFY": "https://plotdevice.io/ref/Misc#constants", - "MOVETO": "https://plotdevice.io/ref/Misc#constants", - "LINETO": "https://plotdevice.io/ref/Misc#constants", - "CURVETO": "https://plotdevice.io/ref/Misc#constants", - "CLOSE": "https://plotdevice.io/ref/Misc#constants", - "MITER": "https://plotdevice.io/ref/Misc#constants", - "ROUND": "https://plotdevice.io/ref/Misc#constants", - "BEVEL": "https://plotdevice.io/ref/Misc#constants", - "BUTT": "https://plotdevice.io/ref/Misc#constants", - "SQUARE": "https://plotdevice.io/ref/Misc#constants", - "NORMAL": "https://plotdevice.io/ref/Misc#constants", - "FORTYFIVE": "https://plotdevice.io/ref/Misc#constants", - "NUMBER": "https://plotdevice.io/ref/Misc#constants", - "TEXT": "https://plotdevice.io/ref/Misc#constants", - "BOOLEAN": "https://plotdevice.io/ref/Misc#constants", - "BUTTON": "https://plotdevice.io/ref/Misc#constants", - "WIDTH": "https://plotdevice.io/ref/Misc#constants", - "HEIGHT": "https://plotdevice.io/ref/Misc#constants", - "FRAME": "https://plotdevice.io/ref/Misc#constants", - "PAGENUM": "https://plotdevice.io/ref/Misc#constants", - "MOUSEX": "https://plotdevice.io/ref/Misc#constants", - "MOUSEY": "https://plotdevice.io/ref/Misc#constants", - "mousedown": "https://plotdevice.io/ref/Misc#constants", - "KEY_UP": "https://plotdevice.io/ref/Misc#constants", - "KEY_DOWN": "https://plotdevice.io/ref/Misc#constants", - "KEY_LEFT": "https://plotdevice.io/ref/Misc#constants", - "KEY_RIGHT": "https://plotdevice.io/ref/Misc#constants", - "KEY_BACKSPACE": "https://plotdevice.io/ref/Misc#constants", - "KEY_TAB": "https://plotdevice.io/ref/Misc#constants", - "KEY_ESC": "https://plotdevice.io/ref/Misc#constants", + px: "https://plotdevice.io/ref/Misc#constants", + pica: "https://plotdevice.io/ref/Misc#constants", + inch: "https://plotdevice.io/ref/Misc#constants", + cm: "https://plotdevice.io/ref/Misc#constants", + mm: "https://plotdevice.io/ref/Misc#constants", + pi: "https://plotdevice.io/ref/Misc#constants", + tau: "https://plotdevice.io/ref/Misc#constants", + RGB: "https://plotdevice.io/ref/Misc#constants", + HSV: "https://plotdevice.io/ref/Misc#constants", + CMYK: "https://plotdevice.io/ref/Misc#constants", + CENTER: "https://plotdevice.io/ref/Misc#constants", + CORNER: "https://plotdevice.io/ref/Misc#constants", + DEGREES: "https://plotdevice.io/ref/Misc#constants", + RADIANS: "https://plotdevice.io/ref/Misc#constants", + PERCENT: "https://plotdevice.io/ref/Misc#constants", + LEFT: "https://plotdevice.io/ref/Misc#constants", + RIGHT: "https://plotdevice.io/ref/Misc#constants", + JUSTIFY: "https://plotdevice.io/ref/Misc#constants", + MOVETO: "https://plotdevice.io/ref/Misc#constants", + LINETO: "https://plotdevice.io/ref/Misc#constants", + CURVETO: "https://plotdevice.io/ref/Misc#constants", + CLOSE: "https://plotdevice.io/ref/Misc#constants", + MITER: "https://plotdevice.io/ref/Misc#constants", + ROUND: "https://plotdevice.io/ref/Misc#constants", + BEVEL: "https://plotdevice.io/ref/Misc#constants", + BUTT: "https://plotdevice.io/ref/Misc#constants", + SQUARE: "https://plotdevice.io/ref/Misc#constants", + NORMAL: "https://plotdevice.io/ref/Misc#constants", + FORTYFIVE: "https://plotdevice.io/ref/Misc#constants", + NUMBER: "https://plotdevice.io/ref/Misc#constants", + TEXT: "https://plotdevice.io/ref/Misc#constants", + BOOLEAN: "https://plotdevice.io/ref/Misc#constants", + BUTTON: "https://plotdevice.io/ref/Misc#constants", + WIDTH: "https://plotdevice.io/ref/Misc#constants", + HEIGHT: "https://plotdevice.io/ref/Misc#constants", + FRAME: "https://plotdevice.io/ref/Misc#constants", + PAGENUM: "https://plotdevice.io/ref/Misc#constants", + MOUSEX: "https://plotdevice.io/ref/Misc#constants", + MOUSEY: "https://plotdevice.io/ref/Misc#constants", + mousedown: "https://plotdevice.io/ref/Misc#constants", + KEY_UP: "https://plotdevice.io/ref/Misc#constants", + KEY_DOWN: "https://plotdevice.io/ref/Misc#constants", + KEY_LEFT: "https://plotdevice.io/ref/Misc#constants", + KEY_RIGHT: "https://plotdevice.io/ref/Misc#constants", + KEY_BACKSPACE: "https://plotdevice.io/ref/Misc#constants", + KEY_TAB: "https://plotdevice.io/ref/Misc#constants", + KEY_ESC: "https://plotdevice.io/ref/Misc#constants", // Dictionaries - "adict": "https://plotdevice.io/ref/Misc#dictionaries", - "ddict": "https://plotdevice.io/ref/Misc#dictionaries", - "odict": "https://plotdevice.io/ref/Misc#dictionaries", + adict: "https://plotdevice.io/ref/Misc#dictionaries", + ddict: "https://plotdevice.io/ref/Misc#dictionaries", + odict: "https://plotdevice.io/ref/Misc#dictionaries", } // symbol name -> array of example usage lines (from each ref page's "Syntax" section). var PLOTDEVICE_SYMBOL_USAGE = { // Canvas - "size": ["size(width, height, unit=px)"], - "speed": ["speed(fps)"], - "background": ["background(r, g, b, a=1.0)", "background(h, s, b, a=1.0)", "background(c, m, y, k, a=1.0)", "background(k, a=1.0)", "background(color)", "background(None) # transparent backdrop", "background(*colors, angle, steps=[0,1]) # axial gradient", "background(*colors, steps=[0,1], center=[0,0]) # radial gradient"], - "geometry": ["geometry(units)"], - "export": ["... # draw to the canvas", "export(\"spool.pdf\", cmyk=False)", "... # draw at retina-quality to the canvas", "export(\"spool.png\", zoom=2)", "with export(\"movie.mov\", fps=30, bitrate=1.0):", " ... # draw movie frames", "with export(\"anim.gif\", fps=30, loop=0):", " ... # draw gif frames"], - "plot": ["plot(grob)"], - "clear": ["clear() # erase the canvas", "clear(all) # erase the canvas and reset drawing state", "clear(*grobs) # remove specific objects from the canvas"], - "outputmode": ["outputmode(mode)"], - "ximport": ["libname = ximport(\"libname\")"], - "halt": ["halt()"], + size: [`size(width, height, unit=px)`], + speed: [`speed(fps)`], + background: [ + `background(r, g, b, a=1.0)`, + `background(h, s, b, a=1.0)`, + `background(c, m, y, k, a=1.0)`, + `background(k, a=1.0)`, + `background(color)`, + `background(None) # transparent backdrop`, + `background(*colors, angle, steps=[0,1]) # axial gradient`, + `background(*colors, steps=[0,1], center=[0,0]) # radial gradient` + ], + geometry: [`geometry(units)`], + export: [ + `... # draw to the canvas`, + `export("spool.pdf", cmyk=False)`, + `... # draw at retina-quality to the canvas`, + `export("spool.png", zoom=2)`, + `with export("movie.mov", fps=30, bitrate=1.0):`, + ` ... # draw movie frames`, + `with export("anim.gif", fps=30, loop=0):`, + ` ... # draw gif frames` + ], + plot: [`plot(grob)`], + clear: [ + `clear() # erase the canvas`, + `clear(all) # erase the canvas and reset drawing state`, + `clear(*grobs) # remove specific objects from the canvas` + ], + outputmode: [`outputmode(mode)`], + ximport: [`libname = ximport("libname")`], + halt: [`halt()`], // Line & Color - "color": ["color(mode=RGB, range=1.0) # the default color mode and range", "color(range=255) # use 0-255 component values rather than 0–1", "color(HSV) # color-related commands will expect HSV values", "color(r, g, b, a=1) # RGB mode", "color(h, s, v, a=1) # HSV mode", "color(c, m, y, k, a=1) # CMYK mode", "color(v, a=1)"], - "stroke": ["stroke(r, g, b, a=1.0)", "stroke(h, s, v, a=1.0)", "stroke(c, m, y, k, a=1.0)", "stroke(v, a=1.0)", "stroke(color)"], - "fill": ["fill(r, g, b, a=1.0)", "fill(h, s, v, a=1.0)", "fill(c, m, y, k, a=1.0)", "fill(v, a=1.0)", "fill(color)", "fill(*colors, angle, steps=[0,1]) # axial gradient", "fill(*colors, steps=[0,1], center=[0,0]) # radial gradient"], - "pen": ["pen(nib, join=MITER, cap=BUTT, dash=None)"], - "capstyle": ["capstyle(style)"], - "colormode": ["colormode(mode, range=1.0)"], - "joinstyle": ["joinstyle(style)"], - "nofill": ["nofill()"], - "nostroke": ["nostroke()"], - "strokewidth": ["strokewidth(width)"], + color: [ + `color(mode=RGB, range=1.0) # the default color mode and range`, + `color(range=255) # use 0-255 component values rather than 0–1`, + `color(HSV) # color-related commands will expect HSV values`, + `color(r, g, b, a=1) # RGB mode`, + `color(h, s, v, a=1) # HSV mode`, + `color(c, m, y, k, a=1) # CMYK mode`, + `color(v, a=1)` + ], + stroke: [ + `stroke(r, g, b, a=1.0)`, + `stroke(h, s, v, a=1.0)`, + `stroke(c, m, y, k, a=1.0)`, + `stroke(v, a=1.0)`, + `stroke(color)` + ], + fill: [ + `fill(r, g, b, a=1.0)`, + `fill(h, s, v, a=1.0)`, + `fill(c, m, y, k, a=1.0)`, + `fill(v, a=1.0)`, + `fill(color)`, + `fill(*colors, angle, steps=[0,1]) # axial gradient`, + `fill(*colors, steps=[0,1], center=[0,0]) # radial gradient` + ], + pen: [`pen(nib, join=MITER, cap=BUTT, dash=None)`], + capstyle: [`capstyle(style)`], + colormode: [`colormode(mode, range=1.0)`], + joinstyle: [`joinstyle(style)`], + nofill: [`nofill()`], + nostroke: [`nostroke()`], + strokewidth: [`strokewidth(width)`], // Primitives - "poly": ["poly(self, x, y, radius, sides=4, points=None, plot=True, **style)"], - "rect": ["rect(x, y, width, height, roundness=0.0, radius=None, plot=True, **style)"], - "arc": ["arc(x, y, radius, range=None, ccw=False, close=False, plot=True, **style)"], - "oval": ["oval(x, y, width, height, plot=True, **style)"], - "line": ["line(x1, y1, x2, y2, plot=True)"], - "image": ["image(src, x, y, width=None, height=None, plot=True, **style)", "image(x, y, width=None, height=None, src=\"path-or-url\", plot=True, **style)", "image(x, y, width=None, height=None, data=\"bytes-or-base64\", plot=True, **style)"], - "text": ["text(str, x, y, width=None, height=None, outline=False, plot=True, **options)", "text(x, y, width=None, height=None, str=\"\", **options)", "text(x, y, width=None, height=None, xml=\"\", **options)", "text(x, y, width=None, height=None, src=\"\", **options)"], - "arrow": ["arrow(x, y, width, type=NORMAL, plot=True, **style)"], - "star": ["star(x, y, points=20, outer=100, inner=50, plot=True, **style)"], + poly: [`poly(self, x, y, radius, sides=4, points=None, plot=True, **style)`], + rect: [`rect(x, y, width, height, roundness=0.0, radius=None, plot=True, **style)`], + arc: [`arc(x, y, radius, range=None, ccw=False, close=False, plot=True, **style)`], + oval: [`oval(x, y, width, height, plot=True, **style)`], + line: [`line(x1, y1, x2, y2, plot=True)`], + image: [ + `image(src, x, y, width=None, height=None, plot=True, **style)`, + `image(x, y, width=None, height=None, src="path-or-url", plot=True, **style)`, + `image(x, y, width=None, height=None, data="bytes-or-base64", plot=True, **style)` + ], + text: [ + `text(str, x, y, width=None, height=None, outline=False, plot=True, **options)`, + `text(x, y, width=None, height=None, str="", **options)`, + `text(x, y, width=None, height=None, xml="", **options)`, + `text(x, y, width=None, height=None, src="", **options)` + ], + arrow: [`arrow(x, y, width, type=NORMAL, plot=True, **style)`], + star: [`star(x, y, points=20, outer=100, inner=50, plot=True, **style)`], // Drawing - "bezier": ["bezier(points=[], smooth=False, **opts)", "bezier(path, **opts)", "with bezier(x=0, y=0, **opts) as path:", " ... # drawing commands like moveto(), lineto(), arcto(), or curveto()"], - "moveto": ["moveto(x, y)"], - "lineto": ["lineto(x, y, close=False)"], - "arcto": ["arcto(x, y, ccw=False, close=False)", "arcto(cx, cy, x, y, radius, close=False)"], - "curveto": ["curveto(h1x, h1y, h2x, h2y, x, y, close=False)"], - "autoclosepath": ["autoclosepath(close=True)"], - "beginpath": ["beginpath(x=None, y=None)"], - "drawpath": ["drawpath(path)"], - "endpath": ["endpath(draw=True)"], - "findpath": ["findpath(list, curvature=1.0)"], + bezier: [ + `bezier(points=[], smooth=False, **opts)`, + `bezier(path, **opts)`, + `with bezier(x=0, y=0, **opts) as path:`, + ` ... # drawing commands like moveto(), lineto(), arcto(), or curveto()` + ], + moveto: [`moveto(x, y)`], + lineto: [`lineto(x, y, close=False)`], + arcto: [ + `arcto(x, y, ccw=False, close=False)`, + `arcto(cx, cy, x, y, radius, close=False)` + ], + curveto: [`curveto(h1x, h1y, h2x, h2y, x, y, close=False)`], + autoclosepath: [`autoclosepath(close=True)`], + beginpath: [`beginpath(x=None, y=None)`], + drawpath: [`drawpath(path)`], + endpath: [`endpath(draw=True)`], + findpath: [`findpath(list, curvature=1.0)`], // Transform - "transform": ["transform(mode)", "transform(matrix=[m11, m21, m12, m22, tX, tY])", "with transform(mode=None, matrix=None):", " ... # drawing & transformation commands", "with transform(CORNER):", " translate(100,20)", " line(0,0, 40,0)", "oldmode = CENTER", "transform(CORNER)", "push()", "translate(100,20)", "line(0,0, 40,0)", "pop()", "transform(oldmode)", "fill(0.2)", "fontsize(14)", "rotate(90)", "text(\"one\", 40, 80)", "", "with transform():", " rotate(-90)", " text(\"two\", 40, 40)", "", "text(\"three\", 50, 80)"], - "translate": ["translate(x, y)"], - "rotate": ["rotate(amount) # amount to rotate (in default unit)", "rotate(percent=0.5) # 0 ... 1.0", "rotate(degrees=180) # 0 ... 360", "rotate(radians=pi) # 0 ... 2*pi (a.k.a. tau)"], - "scale": ["scale(x, y=None)"], - "skew": ["skew(x, y=None)"], - "reset": ["reset()"], - "pop": ["pop()"], - "push": ["push()"], + transform: [ + `transform(mode)`, + `transform(matrix=[m11, m21, m12, m22, tX, tY])`, + `with transform(mode=None, matrix=None):`, + ` ... # drawing & transformation commands`, + `with transform(CORNER):`, + ` translate(100,20)`, + ` line(0,0, 40,0)`, + `oldmode = CENTER`, + `transform(CORNER)`, + `push()`, + `translate(100,20)`, + `line(0,0, 40,0)`, + `pop()`, + `transform(oldmode)`, + `fill(0.2)`, + `fontsize(14)`, + `rotate(90)`, + `text("one", 40, 80)`, + ``, + `with transform():`, + ` rotate(-90)`, + ` text("two", 40, 40)`, + ``, + `text("three", 50, 80)` + ], + translate: [`translate(x, y)`], + rotate: [ + `rotate(amount) # amount to rotate (in default unit)`, + `rotate(percent=0.5) # 0 ... 1.0`, + `rotate(degrees=180) # 0 ... 360`, + `rotate(radians=pi) # 0 ... 2*pi (a.k.a. tau)` + ], + scale: [`scale(x, y=None)`], + skew: [`skew(x, y=None)`], + reset: [`reset()`], + pop: [`pop()`], + push: [`push()`], // Compositing - "alpha": ["alpha(opacity)"], - "blend": ["blend(mode)"], - "shadow": ["shadow(color, blur=10, offset=(5,5))"], - "clip": ["with clip(stencil, channel=\"alpha\"):"], - "mask": ["with mask(stencil, channel=\"alpha\"):"], - "noshadow": ["noshadow()"], - "beginclip": ["beginclip(path)"], - "endclip": ["endclip()"], + alpha: [`alpha(opacity)`], + blend: [`blend(mode)`], + shadow: [`shadow(color, blur=10, offset=(5,5))`], + clip: [`with clip(stencil, channel="alpha"):`], + mask: [`with mask(stencil, channel="alpha"):`], + noshadow: [`noshadow()`], + beginclip: [`beginclip(path)`], + endclip: [`endclip()`], // Typography - "font": ["font(family, weight, size, italic=False, **options)"], - "layout": ["layout(**options)"], - "stylesheet": ["stylesheet(\"name\", *font, **options) # define a style", "stylesheet(\"name\") # retrieve a preexisting style", "stylesheet(\"name\", None) # undefine a style"], - "paginate": ["paginate(str, x, y, width, height, **options)", "paginate(x, y, width, height, str=\"\", **options)", "paginate(x, y, width, height, xml=\"\", **options)", "paginate(x, y, width, height, src=\"\", **options)", "paginate(Text, folio=1, verso=None)"], - "textpath": ["textpath(txt, x, y, width=None, height=1000000, **options)"], - "align": ["align(style=LEFT)"], - "fontsize": ["fontsize(size)"], - "lineheight": ["lineheight(height=None)"], - "textheight": ["textheight(txt, width=None, **options)"], - "textmetrics": ["textmetrics(txt, width=None)"], - "textwidth": ["textwidth(txt, width=None)"], + font: [`font(family, weight, size, italic=False, **options)`], + layout: [`layout(**options)`], + stylesheet: [ + `stylesheet("name", *font, **options) # define a style`, + `stylesheet("name") # retrieve a preexisting style`, + `stylesheet("name", None) # undefine a style` + ], + paginate: [ + `paginate(str, x, y, width, height, **options)`, + `paginate(x, y, width, height, str="", **options)`, + `paginate(x, y, width, height, xml="", **options)`, + `paginate(x, y, width, height, src="", **options)`, + `paginate(Text, folio=1, verso=None)` + ], + textpath: [`textpath(txt, x, y, width=None, height=1000000, **options)`], + align: [`align(style=LEFT)`], + fontsize: [`fontsize(size)`], + lineheight: [`lineheight(height=None)`], + textheight: [`textheight(txt, width=None, **options)`], + textmetrics: [`textmetrics(txt, width=None)`], + textwidth: [`textwidth(txt, width=None)`], // Misc (Utility & Entropy) - "read": ["read(path, format=None, encoding='utf-8', cols=None, dict=dict)"], - "measure": ["measure(grob)", "measure(image=\"path\", width=None, height=None)", "measure(\"text\", width=None, height=None, **fontstyle)"], - "files": ["files(pattern, case=True)"], - "fonts": ["fonts(like=None, western=True)"], - "var": ["var(name, NUMBER, value=50, min=0, max=100, step=None, label=None)", "var(name, TEXT, value, label=None)", "var(name, BOOLEAN, value, label=None)", "var(name, BUTTON, value, color=None, label=None)"], - "imagesize": ["imagesize(path)"], - "open": ["open(path).read()"], - "random": ["random(v1=None, v2=None)"], - "choice": ["choice(sequence)"], - "shuffled": ["shuffled(sequence)"], - "ordered": ["ordered(list, *names, reverse=False)"], - "grid": ["grid(cols, rows, colsize=1, rowsize=1)"], - "autotext": ["autotext()"], + read: [`read(path, format=None, encoding='utf-8', cols=None, dict=dict)`], + measure: [ + `measure(grob)`, + `measure(image="path", width=None, height=None)`, + `measure("text", width=None, height=None, **fontstyle)` + ], + files: [`files(pattern, case=True)`], + fonts: [`fonts(like=None, western=True)`], + var: [ + `var(name, NUMBER, value=50, min=0, max=100, step=None, label=None)`, + `var(name, TEXT, value, label=None)`, + `var(name, BOOLEAN, value, label=None)`, + `var(name, BUTTON, value, color=None, label=None)` + ], + imagesize: [`imagesize(path)`], + open: [`open(path).read()`], + random: [`random(v1=None, v2=None)`], + choice: [`choice(sequence)`], + shuffled: [`shuffled(sequence)`], + ordered: [`ordered(list, *names, reverse=False)`], + grid: [`grid(cols, rows, colsize=1, rowsize=1)`], + autotext: [`autotext()`], // Objects: Drawing - "Bezier": ["Bezier()"], - "Curve": ["Curve()"], - "Context": ["Context()"], + Bezier: [`Bezier()`], + Curve: [`Curve()`], + Context: [`Context()`], // Objects: Line & Color - "Color": ["Color()"], - "Gradient": ["Gradient(*colors, steps=[0,1], angle=0)"], - "Shadow": ["Shadow(color, blur=10, offset=(5,5))"], + Color: [`Color()`], + Gradient: [`Gradient(*colors, steps=[0,1], angle=0)`], + Shadow: [`Shadow(color, blur=10, offset=(5,5))`], // Objects: Transform - "Point": ["Point(x, y)"], - "Size": ["Size(width, height)"], - "Region": ["Region(x, y, w, h)", "Region(Point, Size)"], - "Transform": ["Transform()"], + Point: [`Point(x, y)`], + Size: [`Size(width, height)`], + Region: [ + `Region(x, y, w, h)`, + `Region(Point, Size)` + ], + Transform: [`Transform()`], // Objects: Typography - "Text": ["Text(str, x, y, width=None, height=None, **options)", "Text(x, y, width=None, height=None, str=\"\", **options)", "Text(x, y, width=None, height=None, xml=\"\", **options)", "Text(x, y, width=None, height=None, src=\"\", **options)"], - "Font": ["Font(family, weight, size, italic=False, **options)"], - "Family": ["Family(famname)"], + Text: [ + `Text(str, x, y, width=None, height=None, **options)`, + `Text(x, y, width=None, height=None, str="", **options)`, + `Text(x, y, width=None, height=None, xml="", **options)`, + `Text(x, y, width=None, height=None, src="", **options)` + ], + Font: [`Font(family, weight, size, italic=False, **options)`], + Family: [`Family(famname)`], } From 4daf9a3187207284f721e5cd78a123188fe68dae Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 17:59:00 -0400 Subject: [PATCH 48/54] ensure only actual function tokens have clickable docs - when, say, `fill` is used as a kwarg, it won't let you click it (since that would take you to the docs for `fill()` instead) --- app/Resources/ui/editor.html | 3 +++ app/Resources/ui/js/ace/mode-plotdevice.js | 19 +++++++++++++++++-- app/Resources/ui/js/editor.js | 9 ++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 55d1ed8..08ddb23 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -43,6 +43,9 @@ box-shadow: inset 0 0 6px rgba(255, 255, 255, 0.3); } + /* italicize kwarg names */ + .ace_variable.ace_parameter { font-style: italic; } + .ace_symbol-doc-link { /* ace's "text" markers are empty overlay divs, not text nodes, so text-decoration has nothing to draw under -- border-bottom works diff --git a/app/Resources/ui/js/ace/mode-plotdevice.js b/app/Resources/ui/js/ace/mode-plotdevice.js index 6583566..5815956 100644 --- a/app/Resources/ui/js/ace/mode-plotdevice.js +++ b/app/Resources/ui/js/ace/mode-plotdevice.js @@ -181,11 +181,20 @@ var PlotDeviceHighlightRules = function() { token: "punctuation", regex: ",|:|;|\\->|\\+=|\\-=|\\*=|\\/=|\\/\\/=|%=|@=|&=|\\|=|^=|>>=|<<=|\\*\\*=" }, { + // count current bracket depth in `stack` token: "paren.lparen", - regex: "[\\[\\(\\{]" + regex: "[\\[\\(\\{]", + onMatch: function(value, currentState, stack){ + stack.unshift(value) + return "paren.lparen" + } }, { token: "paren.rparen", - regex: "[\\]\\)\\}]" + regex: "[\\]\\)\\}]", + onMatch: function(value, currentState, stack){ + stack.shift() + return "paren.rparen" + } }, { token: ["keyword", "text", "entity.name.function"], regex: "(def|class)(\\s+)([\\u00BF-\\u1FFF\\u2C00-\\uD7FF\\w]+)" @@ -446,6 +455,12 @@ var PlotDeviceHighlightRules = function() { }, { token: ["punctuation", "function.support"],// method regex: "(\\.)([a-zA-Z_]+)\\b" + }, { + // distinguish between variable assignments and kwargs (based on whether there are surrounding parens) + regex: "[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*=(?!=))", + onMatch: function(value, currentState, stack){ + return stack.length ? "variable.parameter" : "variable.assignment" + } }, { token: keywordMapper, regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 57fa5d5..33c4848 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -160,7 +160,7 @@ var Editor = function(elt){ }, _linkHover:function(e){ var word = e.token && e.token.value - if (_altHeld || !Object.prototype.hasOwnProperty.call(PLOTDEVICE_SYMBOL_DOCS, word)){ + if (_altHeld || that._isBindingTarget(e.token) || !PLOTDEVICE_SYMBOL_DOCS.hasOwnProperty(word)){ that._linkHoverOut() return } @@ -185,8 +185,15 @@ var Editor = function(elt){ _linkMarker = null ed.renderer.setCursorStyle("") }, + _isBindingTarget:function(token){ + // spot locations where a term is being used as a kwarg (or other assignment), so we can + // exclude it from the command-click-for-docs behavior (since it would only coincidentally + // share the name of a documented function in that case) + return !!token && (token.type === "variable.parameter" || token.type === "variable.assignment") + }, _linkClick:function(e){ if (_altHeld) return // let ace's own cmd-option-click add-cursor gesture proceed instead + if (that._isBindingTarget(e.token)) return // kwargs/assignments never have cmd-clickable docs var word = e.token && e.token.value var url = PLOTDEVICE_SYMBOL_DOCS[word] if (url) app.openDoc(url) From 87f9178897f3096f6b3ff7050de90ede53a08ad4 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 21:23:49 -0400 Subject: [PATCH 49/54] Add tooltips with syntax reference for plotdevice symbols --- PlotDevice.xcodeproj/project.pbxproj | 4 +++ app/Resources/ui/editor.html | 33 ++++++++++++++++++++++- app/Resources/ui/js/editor.js | 39 ++++++++++++++++++++++++++++ app/Resources/ui/js/symbols.js | 24 ++--------------- 4 files changed, 77 insertions(+), 23 deletions(-) diff --git a/PlotDevice.xcodeproj/project.pbxproj b/PlotDevice.xcodeproj/project.pbxproj index bc32252..3a4d221 100644 --- a/PlotDevice.xcodeproj/project.pbxproj +++ b/PlotDevice.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 2A15C45218A329BD006BDFF0 /* themes.json in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C44618A329AE006BDFF0 /* themes.json */; }; 2A15C45618A48770006BDFF0 /* autocomplete.css in Copy Editor Assets */ = {isa = PBXBuildFile; fileRef = 2A15C45418A48765006BDFF0 /* autocomplete.css */; }; 2A2EFF223005C16B000B4593 /* Assets.car in Resources */ = {isa = PBXBuildFile; fileRef = 2A2EFF213005C16B000B4593 /* Assets.car */; }; + 2A2EFF2430073AE1000B4593 /* symbols.js in Copy Editor Scripts */ = {isa = PBXBuildFile; fileRef = 2A2EFF2330073AE1000B4593 /* symbols.js */; }; 2A36AE2D2868B4E50088976E /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; }; 2A36AE2E2868B4F30088976E /* Python.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2A36AE2C2868B4E50088976E /* Python.framework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 2A36AE58286CA75B0088976E /* placeholder-light.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2A36AE54286CA75B0088976E /* placeholder-light.pdf */; }; @@ -62,6 +63,7 @@ 2A36AE5E287210C70088976E /* ace in Copy Editor Scripts */, 2A66ECEC18A99328002903DE /* editor.js in Copy Editor Scripts */, 2A66ECEE18A99328002903DE /* keybindings.js in Copy Editor Scripts */, + 2A2EFF2430073AE1000B4593 /* symbols.js in Copy Editor Scripts */, ); name = "Copy Editor Scripts"; runOnlyForDeploymentPostprocessing = 0; @@ -92,6 +94,7 @@ 2A294467185E575F00E9F650 /* document.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = document.py; sourceTree = ""; }; 2A294468185E575F00E9F650 /* preferences.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = preferences.py; sourceTree = ""; }; 2A2EFF213005C16B000B4593 /* Assets.car */ = {isa = PBXFileReference; lastKnownFileType = file; name = Assets.car; path = Resources/Assets.car; sourceTree = ""; }; + 2A2EFF2330073AE1000B4593 /* symbols.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = symbols.js; path = Resources/ui/js/symbols.js; sourceTree = ""; }; 2A32957218C59D0A00EEDD1C /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; 2A32957718C59D0A00EEDD1C /* io.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = io.py; sourceTree = ""; }; 2A32957918C59D0A00EEDD1C /* pathmatics.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pathmatics.py; sourceTree = ""; }; @@ -306,6 +309,7 @@ 2A36AE5D287210C70088976E /* ace */, 2A66ECDF18A992BD002903DE /* editor.js */, 2A66ECE118A992BD002903DE /* keybindings.js */, + 2A2EFF2330073AE1000B4593 /* symbols.js */, ); name = js; sourceTree = ""; diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 08ddb23..6e94e60 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -63,10 +63,41 @@ cursor: pointer; } + /* allow the max tooltip width to be a little bigger than default */ + #editor .ace_tooltip { + max-width: min(48em, 66vw); + } + + /* the "read mode…" link in tooltips */ + .ace_symbol-doc-more { + margin-top: 4px; + cursor: pointer; + font-family: system-ui; + font-style: italic; + } + + .ace_symbol-doc-more::before{ + content:""; + display:block; + border-top: 1px solid currentColor; + opacity: 0.6; + } + .ace_symbol-doc-more span{ + opacity: .6; + padding: 4px 0 2px 0; + display:inline-block; + } + .ace_symbol-doc-more:hover span { + text-decoration: underline; + opacity:1; + } + + + @@ -95,4 +126,4 @@ - \ No newline at end of file + diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 33c4848..0bbf7bc 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -2,6 +2,8 @@ ace.require("ace/ext/language_tools"); // the linking extension provides accel-hover/click token events (used for cmd-click docs links) ace.require("ace/ext/linking"); +// used to render usage-sample tooltips with the same tokenizer+theme as the live editor +var staticHighlight = ace.require("ace/ext/static_highlight"); var Range = ace.require("ace/range").Range; // Wrap the ace UndoManager's mutation methods with callbacks to the pyobjc EditorView @@ -53,6 +55,10 @@ var Editor = function(elt){ ed.on("blur", that._blur) ed.on("focus", that._focus) + // enable syntax-documentation tooltips + ed.hoverTooltip.setDataProvider(that._sampleHover) + ed.hoverTooltip.addToEditor(ed) + // cmd-hover/cmd-click a mapped symbol to underline/open its docs. // $enableJumpToDef frees up plain cmd-click for this (multi-cursor-add // moves to cmd-option-click instead). registered before enableLinking so @@ -191,6 +197,39 @@ var Editor = function(elt){ // share the name of a documented function in that case) return !!token && (token.type === "variable.parameter" || token.type === "variable.assignment") }, + _sampleHover:function(e, editor){ + var pos = e.getDocumentPosition() + var token = sess.getTokenAt(pos.row, pos.column) + var word = token && token.value + + // don't show tooltip for kwargs if the docs are for a function + if (!token || that._isBindingTarget(token) || !PLOTDEVICE_SYMBOL_USAGE.hasOwnProperty(word)) return + var range = Range.fromPoints({row:pos.row, column:token.start}, {row:pos.row, column:token.start+token.value.length}) + var text = PLOTDEVICE_SYMBOL_USAGE[word].join("\n") + + // use syntax highlighting to style the usage sample + staticHighlight.render(text, sess.getMode(), ed.getTheme(), 1, true, function(result){ + var tooltip = document.createElement("div") + tooltip.innerHTML = result.html + + // add a link to the docs page (if applicable) + var url = PLOTDEVICE_SYMBOL_DOCS[word] + if (url){ + var more = document.createElement("div") + more.className = "ace_symbol-doc-more" + more.style.color = getComputedStyle(dom).color + var moreText = document.createElement("span") + moreText.textContent = "read more…" + more.appendChild(moreText) + more.addEventListener("click", function(){ app.openDoc(url) }) + tooltip.appendChild(more) + } + + // default tooltip style is too specific to override with css, so manully set background to match theme + ed.hoverTooltip.getElement().style.backgroundColor = getComputedStyle(dom).backgroundColor + ed.hoverTooltip.showForRange(editor, range, tooltip, e) + }) + }, _linkClick:function(e){ if (_altHeld) return // let ace's own cmd-option-click add-cursor gesture proceed instead if (that._isBindingTarget(e.token)) return // kwargs/assignments never have cmd-clickable docs diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js index dbe08a5..810d77b 100644 --- a/app/Resources/ui/js/symbols.js +++ b/app/Resources/ui/js/symbols.js @@ -245,7 +245,7 @@ var PLOTDEVICE_SYMBOL_USAGE = { strokewidth: [`strokewidth(width)`], // Primitives - poly: [`poly(self, x, y, radius, sides=4, points=None, plot=True, **style)`], + poly: [`poly(x, y, radius, sides=4, points=None, plot=True, **style)`], rect: [`rect(x, y, width, height, roundness=0.0, radius=None, plot=True, **style)`], arc: [`arc(x, y, radius, range=None, ccw=False, close=False, plot=True, **style)`], oval: [`oval(x, y, width, height, plot=True, **style)`], @@ -290,33 +290,13 @@ var PLOTDEVICE_SYMBOL_USAGE = { `transform(matrix=[m11, m21, m12, m22, tX, tY])`, `with transform(mode=None, matrix=None):`, ` ... # drawing & transformation commands`, - `with transform(CORNER):`, - ` translate(100,20)`, - ` line(0,0, 40,0)`, - `oldmode = CENTER`, - `transform(CORNER)`, - `push()`, - `translate(100,20)`, - `line(0,0, 40,0)`, - `pop()`, - `transform(oldmode)`, - `fill(0.2)`, - `fontsize(14)`, - `rotate(90)`, - `text("one", 40, 80)`, - ``, - `with transform():`, - ` rotate(-90)`, - ` text("two", 40, 40)`, - ``, - `text("three", 50, 80)` ], translate: [`translate(x, y)`], rotate: [ `rotate(amount) # amount to rotate (in default unit)`, `rotate(percent=0.5) # 0 ... 1.0`, `rotate(degrees=180) # 0 ... 360`, - `rotate(radians=pi) # 0 ... 2*pi (a.k.a. tau)` + `rotate(radians=pi) # 0 ... 2*pi` ], scale: [`scale(x, y=None)`], skew: [`skew(x, y=None)`], From b22781bc25abb58966a13477cdc313dccc8d7e11 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 00:27:14 -0400 Subject: [PATCH 50/54] remove command-click docs (but keep tooltip links) --- app/Resources/ui/editor.html | 18 ------- app/Resources/ui/js/editor.js | 91 ++--------------------------------- 2 files changed, 3 insertions(+), 106 deletions(-) diff --git a/app/Resources/ui/editor.html b/app/Resources/ui/editor.html index 6e94e60..088a320 100644 --- a/app/Resources/ui/editor.html +++ b/app/Resources/ui/editor.html @@ -46,23 +46,6 @@ /* italicize kwarg names */ .ace_variable.ace_parameter { font-style: italic; } - .ace_symbol-doc-link { - /* ace's "text" markers are empty overlay divs, not text nodes, so - text-decoration has nothing to draw under -- border-bottom works - since these divs are already sized to the token's line height. - position:absolute is required -- ace's built-in marker classes - (ace_selection, ace_bracket, etc.) each declare this themselves - in the stylesheet; the top/left set inline by the renderer are - otherwise ignored and the div renders in normal static flow. - z-index must beat the other .ace_marker-layer classes (active-line:2, - step/stack:3, selected-word:4, selection:5, bracket:6) or this gets - painted underneath them since it otherwise stacks in DOM order */ - position: absolute; - z-index: 7; - border-bottom: 1px solid currentColor; - cursor: pointer; - } - /* allow the max tooltip width to be a little bigger than default */ #editor .ace_tooltip { max-width: min(48em, 66vw); @@ -96,7 +79,6 @@ - diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 0bbf7bc..6d19077 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -1,7 +1,5 @@ // the language-tools extension provides snippets and autocomplete ace.require("ace/ext/language_tools"); -// the linking extension provides accel-hover/click token events (used for cmd-click docs links) -ace.require("ace/ext/linking"); // used to render usage-sample tooltips with the same tokenizer+theme as the live editor var staticHighlight = ace.require("ace/ext/static_highlight"); var Range = ace.require("ace/range").Range; @@ -33,9 +31,6 @@ var Editor = function(elt){ "Python":[] } var _htimer = null, _vtimer = null, _hmin=0, _vmin=0; - var _linkMarker = null; - var _altHeld = false; - var _lastMouseEvent = null; var that = { init:function(){ @@ -59,26 +54,6 @@ var Editor = function(elt){ ed.hoverTooltip.setDataProvider(that._sampleHover) ed.hoverTooltip.addToEditor(ed) - // cmd-hover/cmd-click a mapped symbol to underline/open its docs. - // $enableJumpToDef frees up plain cmd-click for this (multi-cursor-add - // moves to cmd-option-click instead). registered before enableLinking so - // it runs first and _altHeld is current by the time linkHover/linkClick - // fire (ext-linking.js doesn't pass the alt-key state through itself) - ed.on("mousemove", that._trackMouse) - ed.on("click", that._trackMouse) - ed.setOption("enableLinking", true) - ed.$mouseHandler.$enableJumpToDef = true - ed.on("linkHover", that._linkHover) - ed.on("linkHoverOut", that._linkHoverOut) - ed.on("linkClick", that._linkClick) - - // mousemove-driven hover only fires on actual pointer movement, so - // pressing/releasing cmd while stationary over a symbol wouldn't - // otherwise show/hide the underline -- re-check the last known - // mouse position directly against cmd's/option's keydown/keyup instead - document.addEventListener('keydown', that._trackModifiers, true) - document.addEventListener('keyup', that._trackModifiers, true) - // configure the buffer sess = ed.getSession() sess.setMode("ace/mode/plotdevice"); @@ -136,65 +111,12 @@ var Editor = function(elt){ _blur:function(){ ed.setHighlightActiveLine(false) ed.setHighlightGutterLine(false) - that._linkHoverOut() }, - _trackMouse:function(e){ - // ext-linking.js's linkHover/linkClick events don't carry the raw dom - // event, so track option/alt ourselves to know whether it's held - // alongside cmd (in which case ace's own cmd-option-click add-cursor - // gesture should win instead of the docs link) -- also cache the - // event itself so _trackModifiers can re-derive hover state against - // the last known mouse position when cmd/option change while stationary - _altHeld = !!(e.domEvent && e.domEvent.altKey) - _lastMouseEvent = e - }, - _trackModifiers:function(e){ - // pressing/releasing cmd or option alone doesn't fire a mousemove, so - // ext-linking.js never re-evaluates the token under a stationary pointer - // -- do it ourselves. modifier flags on the event reflect live state - // (including for the key's own keyup), so no keydown/keyup branching - // is needed -- just recompute from current state each time - if ((e.key !== 'Meta' && e.key !== 'Alt') || !_lastMouseEvent) return - _altHeld = !!e.altKey - if (!e.metaKey || _altHeld){ - that._linkHoverOut() - return - } - var docPos = _lastMouseEvent.getDocumentPosition() - that._linkHover({position:docPos, token:sess.getTokenAt(docPos.row, docPos.column)}) - }, - _linkHover:function(e){ - var word = e.token && e.token.value - if (_altHeld || that._isBindingTarget(e.token) || !PLOTDEVICE_SYMBOL_DOCS.hasOwnProperty(word)){ - that._linkHoverOut() - return - } - that._linkHoverOut() - ed.renderer.setCursorStyle("pointer") // .ace_layer has pointer-events:none, so css :hover/cursor on the marker itself has no effect - var row = e.position.row - var range = Range.fromPoints({row:row, column:e.token.start}, {row:row, column:e.token.start+e.token.value.length}) - // addMarker(..., "text") goes through drawTextMarker, which is built for - // multi-row wrapped spans (wrong width + rounded corners for a single-row - // range) -- draw a plain single-line underline via the same primitive - // ace uses for selection/highlight markers instead. a dynamic marker must - // NOT have a .range property or ace routes it through the static-marker - // path (using its .clazz, which we don't set) instead of calling .update() - _linkMarker = sess.addDynamicMarker({ - update: function(html, markerLayer, session, config){ - markerLayer.drawSingleLineMarker(html, range, "ace_symbol-doc-link", config) - } - }) - }, - _linkHoverOut:function(){ - if (_linkMarker!=null) sess.removeMarker(_linkMarker.id) - _linkMarker = null - ed.renderer.setCursorStyle("") - }, _isBindingTarget:function(token){ - // spot locations where a term is being used as a kwarg (or other assignment), so we can - // exclude it from the command-click-for-docs behavior (since it would only coincidentally - // share the name of a documented function in that case) + // spot locations where a term is being used as a kwarg (or other assignment), so we can + // exclude it from the usage-sample tooltip (since it would only coincidentally share + // the name of a documented function in that case) return !!token && (token.type === "variable.parameter" || token.type === "variable.assignment") }, _sampleHover:function(e, editor){ @@ -230,13 +152,6 @@ var Editor = function(elt){ ed.hoverTooltip.showForRange(editor, range, tooltip, e) }) }, - _linkClick:function(e){ - if (_altHeld) return // let ace's own cmd-option-click add-cursor gesture proceed instead - if (that._isBindingTarget(e.token)) return // kwargs/assignments never have cmd-clickable docs - var word = e.token && e.token.value - var url = PLOTDEVICE_SYMBOL_DOCS[word] - if (url) app.openDoc(url) - }, focus:function(){ ed.focus() From a94fec77e4fe10fa770a97366d21bebd2981690e Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 00:52:51 -0400 Subject: [PATCH 51/54] add context menu for opening docs --- app/Resources/ui/js/editor.js | 28 ++++++++++++++++-- plotdevice/gui/editor.py | 54 ++++++++++++++++++++++++++--------- plotdevice/lib/cocoa.py | 2 +- 3 files changed, 66 insertions(+), 18 deletions(-) diff --git a/app/Resources/ui/js/editor.js b/app/Resources/ui/js/editor.js index 6d19077..bdb5650 100644 --- a/app/Resources/ui/js/editor.js +++ b/app/Resources/ui/js/editor.js @@ -54,6 +54,13 @@ var Editor = function(elt){ ed.hoverTooltip.setDataProvider(that._sampleHover) ed.hoverTooltip.addToEditor(ed) + // keep the native side informed of which documented symbol (if any) is + // under the pointer and/or text cursor, so the right-click context menu + // can offer a "View Documentation" item + that._docTarget = {mouse: null, caret: null} + ed.on("changeSelection", that._trackDocTarget) + ed.on("nativecontextmenu", that._trackDocTarget) + // configure the buffer sess = ed.getSession() sess.setMode("ace/mode/plotdevice"); @@ -115,10 +122,25 @@ var Editor = function(elt){ _isBindingTarget:function(token){ // spot locations where a term is being used as a kwarg (or other assignment), so we can - // exclude it from the usage-sample tooltip (since it would only coincidentally share - // the name of a documented function in that case) + // exclude it from the usage-sample tooltip and doc-target tracking (since it would only + // coincidentally share the name of a documented function in that case) return !!token && (token.type === "variable.parameter" || token.type === "variable.assignment") }, + _trackDocTarget:function(e){ + // find the symbol currently under the mouse (if e is defined) or the insertion point (if not) + let coords = e?.domEvent + let pos = coords ? ed.renderer.screenToTextCoordinates(coords.clientX, coords.clientY) : ed.getCursorPosition() + var token = sess.getTokenAt(pos.row, pos.column) + var word = token && token.value + + // if there's documentation for it (and it's changed since the last event), relay it to the pyobjc side + var url = (!that._isBindingTarget(token) && word && PLOTDEVICE_SYMBOL_DOCS[word]) || null + let inputType = coords ? "mouse" : "caret" + if (url !== that._docTarget[inputType]?.url){ + that._docTarget[inputType] = url ? {word, url} : null + app.setDocTarget(that._docTarget) + } + }, _sampleHover:function(e, editor){ var pos = e.getDocumentPosition() var token = sess.getTokenAt(pos.row, pos.column) @@ -141,7 +163,7 @@ var Editor = function(elt){ more.className = "ace_symbol-doc-more" more.style.color = getComputedStyle(dom).color var moreText = document.createElement("span") - moreText.textContent = "read more…" + moreText.textContent = "view documentation…" more.appendChild(moreText) more.addEventListener("click", function(){ app.openDoc(url) }) tooltip.appendChild(more) diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index d38fe17..3405297 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -14,6 +14,13 @@ def args(*jsargs): return ', '.join([json.dumps(v, ensure_ascii=False) for v in jsargs]) +def menu_index_of(menu, identifier): + # NSMenu has no indexOfItemWithIdentifier_ in this AppKit/PyObjC version; search manually + for i, item in enumerate(menu.itemArray()): + if item.identifier() == identifier: + return i + return -1 + class DraggyWebView(WKWebView): def draggingEntered_(self, sender): pb = sender.draggingPasteboard() @@ -51,21 +58,35 @@ def willOpenMenu_withEvent_(self, menu, event): for item in list(menu.itemArray()): if item.identifier() not in keep: menu.removeItem_(item) - inspect = menu.indexOfItemWithIdentifier_('WKMenuItemIdentifierInspectElement') - if inspect > 0: + + # read _doc_target to get the tokens currently targeted by the mouse and caret + # then choose which one to offer a View Docs menu item for based on the event type + targets = getattr(self.owner, '_doc_target', None) or {} + target = targets.get('caret' if event.type() == NSEventTypeKeyDown else 'mouse') + if target: + idx = menu_index_of(menu, 'WKMenuItemIdentifierInspectElement') + idx = idx if idx >= 0 else menu.numberOfItems() + if menu.numberOfItems() > 0: + menu.insertItem_atIndex_(NSMenuItem.separatorItem(), idx) + idx += 1 + prefix = u"View Documentation: " + title = prefix + target['word'] + base_font = NSFont.menuFontOfSize_(0) + mono_font = NSFont.monospacedSystemFontOfSize_weight_(base_font.pointSize(), -0.8) + attr_title = NSMutableAttributedString.alloc().initWithString_attributes_(title, {"NSFont":base_font}) + attr_title.addAttribute_value_range_("NSFont", mono_font, (len(prefix), len(target['word']))) + doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(title, "viewDocumentation:", "") + doc.setAttributedTitle_(attr_title) + doc.setTarget_(self) + doc.setRepresentedObject_(target['url']) + menu.insertItem_atIndex_(doc, idx) + + inspect = menu_index_of(menu, 'WKMenuItemIdentifierInspectElement') + if inspect >= 0: menu.insertItem_atIndex_(NSMenuItem.separatorItem(), inspect) - # TODO: once a doc viewer exists, add a lookup-ref menu item pointing to it: - # word = self.js('editor.selected') - # _ns = ['curveto', 'TEXT', 'BezierPath', ...] - # def ref_url(proc): - # if proc in _ns: - # return proc - # if ref_url(word): - # doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(u"Documentation for ‘%s()’"%word, "copy:", "") - # sep = NSMenuItem.separatorItem() - # items.insert(0, sep) - # items.insert(0, doc) + def viewDocumentation_(self, sender): + self.owner.openDoc(sender.representedObject()) class EditorView(NSView): @@ -89,6 +110,7 @@ def awakeFromNib(self): ucc.addUserScript_(shim) self.webview = DraggyWebView.alloc().initWithFrame_configuration_(self.bounds(), config) + self.webview.owner = self if dev and self.webview.respondsToSelector_('setInspectable:'): self.webview.setInspectable_(True) self.webview.setValue_forKey_(False, 'drawsBackground') @@ -159,7 +181,7 @@ def webViewWebContentProcessDidTerminate_(self, sender): def userContentController_didReceiveScriptMessage_(self, ucc, msg): body = msg.body() fn, fnargs = body['fn'], list(body.get('args', [])) - if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs', 'openDoc'): + if fn in ('sync_edits', 'flash_menu', 'setSearchPasteboard', 'cancelRun', 'loadPrefs', 'openDoc', 'setDocTarget'): getattr(self, fn)(*fnargs) def resizeSubviewsWithOldSize_(self, oldSize): @@ -333,6 +355,10 @@ def loadPrefs(self): def openDoc(self, url): NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(url)) + @objc.python_method + def setDocTarget(self, target): + self._doc_target = target + def cancelRun(self): # catch command-period even when the editor is first responder mm=NSApp().mainMenu() diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index a6962d6..53e39c9 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -31,7 +31,7 @@ NSChangeRedone, NSChangeUndone, NSClipView, NSClosePathBezierPathElement, NSColor, NSColorSpace, \ NSCommandKeyMask, NSCompositeCopy, NSCompositeSourceOver, NSContentsCellMask, NSCriticalAlertStyle, NSCursor, \ NSCurveToBezierPathElement, NSDeviceCMYKColorSpace, NSDeviceIndependentModifierFlagsMask, NSDeviceRGBColorSpace, NSDocument, \ - NSDocumentController, NSDragOperationCopy, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ + NSDocumentController, NSDragOperationCopy, NSEventTypeKeyDown, NSFindPboard, NSFixedPitchFontMask, NSFocusRingTypeExterior, NSFont, \ NSFontDescriptor, NSFontManager, NSForegroundColorAttributeName, NSGIFFileType, NSGradient, \ NSGraphicsContext, NSGraphiteControlTint, NSImage, NSImageCacheNever, NSImageCompressionFactor, \ NSImageInterpolationHigh, NSItalicFontMask, NSJPEGFileType, NSJustifiedTextAlignment, \ From 97474d74ee531744bfe1bf2b1f78808fa99fc62a Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 13:54:00 -0400 Subject: [PATCH 52/54] add () to token name in View Docs context menu --- plotdevice/gui/editor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plotdevice/gui/editor.py b/plotdevice/gui/editor.py index 3405297..4ffd969 100644 --- a/plotdevice/gui/editor.py +++ b/plotdevice/gui/editor.py @@ -70,11 +70,12 @@ def willOpenMenu_withEvent_(self, menu, event): menu.insertItem_atIndex_(NSMenuItem.separatorItem(), idx) idx += 1 prefix = u"View Documentation: " - title = prefix + target['word'] + suffix = "()" if target['url'].endswith('()') else "" + title = prefix + target['word'] + suffix base_font = NSFont.menuFontOfSize_(0) mono_font = NSFont.monospacedSystemFontOfSize_weight_(base_font.pointSize(), -0.8) attr_title = NSMutableAttributedString.alloc().initWithString_attributes_(title, {"NSFont":base_font}) - attr_title.addAttribute_value_range_("NSFont", mono_font, (len(prefix), len(target['word']))) + attr_title.addAttribute_value_range_("NSFont", mono_font, (len(prefix), len(target['word'] + suffix))) doc = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(title, "viewDocumentation:", "") doc.setAttributedTitle_(attr_title) doc.setTarget_(self) From e53ec9111fa05dde86fd2a5f86733f74fa87fce1 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 13:54:00 -0400 Subject: [PATCH 53/54] clean up usage strings --- app/Resources/ui/js/symbols.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/Resources/ui/js/symbols.js b/app/Resources/ui/js/symbols.js index 810d77b..a3ea01c 100644 --- a/app/Resources/ui/js/symbols.js +++ b/app/Resources/ui/js/symbols.js @@ -191,14 +191,10 @@ var PLOTDEVICE_SYMBOL_USAGE = { ], geometry: [`geometry(units)`], export: [ - `... # draw to the canvas`, `export("spool.pdf", cmyk=False)`, - `... # draw at retina-quality to the canvas`, `export("spool.png", zoom=2)`, `with export("movie.mov", fps=30, bitrate=1.0):`, ` ... # draw movie frames`, - `with export("anim.gif", fps=30, loop=0):`, - ` ... # draw gif frames` ], plot: [`plot(grob)`], clear: [ @@ -215,9 +211,9 @@ var PLOTDEVICE_SYMBOL_USAGE = { `color(mode=RGB, range=1.0) # the default color mode and range`, `color(range=255) # use 0-255 component values rather than 0–1`, `color(HSV) # color-related commands will expect HSV values`, - `color(r, g, b, a=1) # RGB mode`, - `color(h, s, v, a=1) # HSV mode`, - `color(c, m, y, k, a=1) # CMYK mode`, + `color(r, g, b, a=1) # RGB mode`, + `color(h, s, v, a=1) # HSV mode`, + `color(c, m, y, k, a=1) # CMYK mode`, `color(v, a=1)` ], stroke: [ From 86cedbf8833b5b1c07d3e064beeb213a4afe29be Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Wed, 15 Jul 2026 13:54:00 -0400 Subject: [PATCH 54/54] fix refreshdoc command mishandling an empty source string ace's default command-exec handler replaces falsy args (including a legitimately empty source, e.g. a brand-new blank document) with {} before invoking the command, which the refreshdoc command forwarded straight into session.setValue() -- crashing $detectNewLine since {} is truthy and has no .match(). Guard against non-string args instead. --- app/Resources/ui/js/keybindings.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Resources/ui/js/keybindings.js b/app/Resources/ui/js/keybindings.js index 2111097..4d1a3a2 100644 --- a/app/Resources/ui/js/keybindings.js +++ b/app/Resources/ui/js/keybindings.js @@ -23,7 +23,9 @@ PLOTDEVICE_KEYBINDINGS=[ scrollIntoView: "selectionPart" },{ name: "refreshdoc", - exec: function(editor, str) { editor.session.setValue(str); }, + // ace's default command dispatcher replaces falsy args (e.g. a legitimately + // empty source string) with {} before calling exec, so guard against that here + exec: function(editor, str) { editor.session.setValue(typeof str === "string" ? str : ""); }, },{ name: "cancelRun", bindKey: {mac: "Command-."}, @@ -152,4 +154,4 @@ PLOTDEVICE_KEYBINDINGS=[ } } -] \ No newline at end of file +]

HF&7^i8}L( z?2+*M>)~n5InKMc5x(ay`2UJBu3mlQxuB*9eCP{iw``qmcM2mae_C7NTMHF5LUhyj z{n9DTy^c_B2^Hsifryg|$2~`v^-7$azj>+8p|;D=cXuA;U%a=jM^^kJ)k1K=Adc0n z0(b81GX?otZiTf#6dTH`jX-O?d6$1%hZnQd%QO*_R_7Js6o|Iq*&DZcwD>(*wOlSL z2~0!5jD~t;JsTpLIn~N*!#TGK*0y##k$UWka}@jT4b%(e{_4WrC*bF751hFX7)Sw}q;K%QZZ&e;VcJF#nZ$WX%CQ@htSj z5z!Gi#;3!D)-jw2ZCJej=JPLNN1zb4H)XZNpB^p0SNj_cLB0|-{|0PA^iCD<*shP1 zo8wkezPza;l{_2e*Fnx4wD2@rn!gO_;*eupm6EOH2- znZeb_=2~P8xV5NuXTZ49{{H`WtGbe%qL5APwHE%0!7-s7F=bKcK%tpJV{16%^031Fi-M%YjpIv-chpysnM*Cz?1 z*x8MSJ>Fbv{79)7`gjv{qG;iP`g^PIv~#;Aa-@QyrlXwO)=~3LRgRiA zl->zlQ@{g9b{rQ%an-4d*>PH6w#Ty&)5Mpd3(z8)NX@k8~1=AyA+q1baha_xf7R@oGs3zB~fAB&miNv zn)Suu(mTts@fLO5wvn|7H@jLjS2oOnZ@)1wlYthN8XnGu{iy!j(nb$lHnB=UO|!2#vlgXFx5K!S&o z0X9?$Bp80PsXN}=Yu8LV%G3z{)h;`T&Us(3z-``>0}gLvMFN1twK2wQqDK>z)A!(~ zJZd+I5Qc8V>`Le=!ojtxSw(>Fgr*3L;sSKe?m5BD7dk8GL4WqwYNyx&E%0aAe#9;* zm=%6K0sVtSv`h7tOMNg?{PJ5u-MZ)2+=o#+dcsEQ8POwnzl%_QUahD*0YN>!p^;Y| zagjt3;w@hVpUBq)zYCZLyEw`XSx(@~g&+d-pdu5>X2k z+Fg&@`KImCjLpzt?B)q#!xjNR>WK5u%)9N+52Z&aVSihk_L-PYksVJ+k?r)dTNMKt zoZYObTC(u{_}3mJaOaWH-OpoJ7Ky#OAi^%7Mwt#9D5JpuuSSW&S(tDjnzny38sS6) zr_{@24YX@MgCP#V_BSSRj@;f5W*gGc`GdF?AKySR03%%J_VUlLFyHxDhzaiU8ykCg z@W9Lz*2Pb9sC)pqZq`!XKe}mg68Ye}&y`)@Lf``+Cp?{?s@{23)ci@bpJB8PL%iUv zdyqLBWUtdJBoG*LYBasRfY(3rTJXIIsS2{rpw8I(4dYpF%PC@^4Oc`FE4@IeXjxyq zV8HnbI+ai*q_{Kv{QdM#*{2?bX23tbxi6&6E7kO_Xpf@z|R*|PRVEdOekoTr3lFYyPbzK1{VuXn*b#rVs zJ2IwZ({)Xru8}8FVXe+f6aoxz_WW!Gi95e8?1gL^O_!tC;{Xy|PilUT^P0T@?T|!| zn5Phwl(udTe*EHYva%Y!CAV9j6YZE&VX-b|?z8Q*h)eNN;dnag)cf=7A}(jO0mS2I zM*{GZVxK{Y>y*K({3%9U?vQyt4}YxE&}FI|Z!LgKOyw^{%1#nR zO@&fkEe0rdu~q=JROd?OaS`sh5sPWckE7LCE`#1yTT8AApuG<|fv~^+)o)b2ycW~~ z(A!C~=sFPL))zYEuOO*vkiETU#?P#wL?NHSh3lMF^!B$qDZ6SL<&+)LoO7<$R~Z8T zuA6psa(&syW9=caa5+7J+s9{LcfFBDec!#IW7Ebs80)ZG8WS7@d2Vd@AD@99e#S=*`tRS{?wn~qlF!T|6aD6tR{f#sdk@Mm@ zAVAd1C34^6HZ#<8(z=Y`@{Kp}Ng`*MN~mk6evY254F_Ra?XAG$e%(VU;CMpzQmGp7 zghPaZIwB3Erc@t))KYQFsgyagG?}0sZ)j+kUH;Nc$#p{9?I0f@1Y%|Y#2x|Mk|4(e zVkJZXsQcRuQ&*>kgAhR2D02%u2ycFy{xv&PG_-Z z$_?rDo@loe++1hjtq887@jFXob6$UJP=o>ydo9H+-~Ke0JMc6pT4;>MC<*~N%Z%0` zIiZz>7pfGoEjtTx!)q&&DYj0S1!MrW>x(=M}g86ZX0)!6Z;#8!9 z)Y}y!Pt314f$f!VJfw>a%N(G#TE(RDr|0-T*?iSjZoRwVyI#!ML|htQM6G^FQeU_X zjD0`5qS%N{(Mufykp{zF{Ew@quHiF_**Bg_y zRG5UsGF!3lM##g)B?fkBU;I0UsakaEurd*x^3q5*ff;2Ys{8>zNY&t#IW8WEff`8l z{Fv)G!5*5{g_51Y2|5Av<@;lY&`3b8jeP<2}D0*n|%2+BJ#F&D5vko<$oS zYjP|v$u9zAQ?BQM`9J0-jp#bBozof>0Xxh;K30Q$muyGZZ7J?>E&)XAR*>Dao!h~dF3zN4B0#wbfZXQD+JR^&mw@DJwH=6IlyDeq1W`Sz z#`-NE3TDh>66G5Oanc zV--*-%$M5~NWOio4a;bBk>7T;I-v#yc+^D@H6}n*as^!Hn*2``@KWPa+Z*jQ+g%`( z>YgA#H3j5%3)|!DgpHLxc&%%csKGuZdu|z;xByxKXp-L;?ze>5@zdJ54rdH7l=Zqf z8pS!BXo%2dnaaOy+p*!gnSzWE_1hT*{KV&m)U=)Zj^Dgmay@yt$@Q6;%n4QDk(RBF zO@f8Ndj(L;odkZ8vaSfCtK(OIDnKexU;P2{-bsK9&DLA!b>&u9-fv4FMat+P0Prio zf9PpZ*bhDq6Ha&_C!@tRXv*wK>YCzq7sQEbzw@lWej#-fFnheZt4UHePK$*S4{2G7ggz{MJ@Vein>3Vm!?xNRsyPWsEE8ie|ONong zD5^dSU}r*)CuO}Dgv+O^F%XD%8QINQY^cCk__Dba$?voqMmC36j4(n-)nM~HsI3ZX z7s@|T__!)6n9YPLhI)R9LtXwb{p}Z4QE-Knjp(_g{$R(xVi;uT(UbVhHabw3gM)Aq zl$fJyqwb&(F~*E#e7QT;7`Xbr+K%8p-+!1uOYe?faIX9<#h z;YL@(0;hcM;4Fk%%FXZNlq^Z}p8l0Zs+F8_Z;J?JiFO02$eGSBkE#5x&FE}Y{A99f z1cdyVnxpx*yf;F6W>dR5>sT--oJ;e^ZAHy@*Wsfzy9-}xXA`_YP>VhC1=!m`Zt=?? zH7-!W$8k}dXfsHTZ8W6#3Pk z-2~$_`PH3jfz3raK7Q}@Y^wvDXZ07q#+;N8tWRLKKX68bbWi) zzuE|Jn@l8zNI&^YN~0%`q)(XBTY?+Cr+wBoAX^09=;HsHG~TL01RP?66Y7_$`q~|j z)!UGuenoVOvOeb_f&tRrv36lVVuUf3J2l74oCGx%UW)!oX#toOVv0_)V~cPeZR(WX zsgn)*A#Cz|31aJMahMe(wfR9z^Dl z+S}_n7b+T>Qy`+LXK@-A!R{lmu+`U0s+-s{@?VO^Ek>u!MK}~;&N^>5aK>1uzMpC` zQ)JWKsaB;r*3QlSQ&YhveRy7E1H<*W6opEZT@P*g0fp1DLEN=^|o6P{1BB=L4Tc^wN)nrOX(gkE)*8Q=~`zw-CFTA&Vbrql6svZ+$z`CsC1){gN zB8+R?NQLv9qASeH76B-5$`|{KP-|I{;=1rIo(y8Hl>>5x*eMWpTzksoL+#JA zg7?V35Wbc(oropswyIVT0O9q;eNizOLwcPPyS1aaJ!KZ@D_OqNrrok|C^gjr9*3+v zyWzjOb9%W~jOEWP09&^#_Uy_|*i$x_+Sh%vpyo^C_jBCLBfH1XZItQy3dBul$1x%& zYTK(8_p$@5Z6Bi+Bds1h!_fDB9CFd>zfyiM1vkY5?gQ%Yfp;HB5 z@>HnosIFe%8bkN3UB0B;t11ln% zw|^{JUY@ePRv;tQ;$dsIxoZwmDm+P~y5^TpUDZ@J@2v-Ub)dG*UT`0MSLvlRT01** zc{gIz2}FQw?x_~@WsEs;W(CyT9_hMtg88Fpf3V}c)tg&ja|xTz=QXj_l$-q(oR?CC zQdM76Z`OFmZM~fXrF?FJdooF>dWdzlTrqWX|w5ZgHaAy{UDst5QdetBq zS9!-l>*HNMkPACkE#~tQ$W0xPoD*&qEe%e)YskmmHBWKttW+;IoD}&5rS`Jb2UyjN zxWxvm#>ajMqSWmiJ`ybxgN7r4spC^^5{%xyo57@Dd|urfcLEcE8K3f{7VQsMJb}jX*ZHUmlDD%i_b?DL|5zl z1irqnA|>AQR8`43`c;!m(soE$#8{iz5a`(jz&qUB-hoi@I5r4b7Rqdg*KF^!BIc&2 z8H+)nqQ)pR;#O^TQqu7Cd=pSW(ZC&+qtOh;Lmh)_eCyn;08_JnPMH#jKG)+SUC+~@ zYX_psoY&lr^=63?a3AxT7AheByDUY4z0#ov-u)7`C+`E9d+Xhn7k7VsEv}ob5xCk% z?l;uCY}F7wNGq+n$gm>Rysn0eKqG781OibM)L4D7OLU6_Xc6JD5n!96OE94Uw0Bv>?t||)hH31`Bux3YJZ~E zNqN$4xHZNzW__vYl_turg&-jR5dn^=Uj1yvB0rhN0Hf29)S~$Q{ccA zO0qnx0cTo3!BsWct+Ob?+cUrrY9&L2kOx5RF_>P_vJzl&M9orb=wjxSC;yiuOOEY< z>l1+A7u{A4pq8>Y*Mm{*k4NleQ!5(F;bZkLj4yDEb(I2s%xGO_>6~Y}s<6Ln`rHL5 z$3mdOVED`WM@@}gbJoesRzvV#OF;iihD^%ZmPLqLhrH+Rt*!0R-MF4%mh!Tx8}xvw zV)EZc%CBu-^xrCY;`7dZcc;19a`=A53GaEpRPhYE20XW=lM8K&>(Zg5nW@P$?p z`Bou71+nSfMVC~GIu&d$gT#eQWMug3q8%nM3lxO^HHHZlNZZmG8w7*g zzEDd8;>YK{B)R_jzRUP$0$_{>6?fwqa~9|{0itNT2y>!ni`dA!Y0$Km=6k+;bS1_h z@)i>GM-H!{UC-rPWooH$G=7~TTw9%T9P-+3s31hLxokV;`F(L8iv8q}FAAEOB4=21 zph7O&LQzOSg;?g$hVoxvTVyJ06yKeD792aq1&*M())z_Vj-7QgI63T(uGo#+% zzD&xS*k;%AK=6J@K6x-3_)?_R>_B9=_jTqdurha%*S7=-b@E-M_)*Vh?zQ|REvN9$xp^sHai;iE1~at}J6M?lw?yZQqFvJq zS5S&qMJQ(!rtWy@r1eg1%3|~m3^I(9)+})9fiW^q}4~XJ7UW^XnW-IOTXEu5bI>jcPj9 z5z(7PWnEU!uMneLL==^r`5q6F=(WDz+i#n|qNZ<9!or97B3vl$`qRS2`P5PUjE;^D zE*>ii6BCnQ=Ogf;{a4&I4u*z?mLI`JV*(L~tYJLfMLRIhT9J=WH=g4>*HgUb!d7Ye zH8`Bb%Hvu(VSq`U(H?zhxnn>3JDHexLCl*hDJ3b{$4QqRUM7{5?gT7My&sUbt@@I%#`n;5 zZ{I${zj}kFkbz@`8tLU%#1I19M;14tTwawAtyn6zx90R;X^g^0cmchdgf-R_$!`xo2Z!#Bf&|rhrM1$}z zXy%S(ls=Kw-zOiH5KI%DInq*BSB2tSK9R<2+$q2EHdz)vq-?5U+m4cuy>d=$yQ|Gv z5zc%1_RPj?-71qM($G7o{__KEGwBok`f*yl?o z8y9Yr4t0p|6|=Thgj!G8NE-O*#SYEVWLO_Ng8irzhCXj4?Wu9lLvX4SmV&+=V}(xj zhCJ-7b;FL}c>9jjs|)i>i`&(_ zEapx#mJp0QD@*&00%&0|k}HXn#E^piSFw+tWtkkr!=vux(bo z^QcW&hrTF&`!=Amvf9|({Co|FYKSZ*$R%1hG6axd=vM7wtedX9@RSZBPwPl0f7M|` z?CA%-rEiC#>#tB=F26!j|H#to@RG?#L$V7!x|qhQH6J=At?&C;Dyrj2p0()o^z`Re zQwQ(v{cV-t=zs^coJwe`lu#1j)_{W}LU+ZTn>(X_>cdCQBf|r~PEisOtoZr!wc)La zBu35&)3x~Nl3kka;BnQ4FzXT~Am0l?aQ;|$9ng@?1Ovqoy7FLK(dcWDKwZJpL&DZ( z(K|`;v|5LUPOwNUu#0a?<-W-?TNF3b4w{PIIjltz&~kc=Cf?dJwtj{fBFFk!7?%ts zkc4fhc%u4M#m7D0%P^W)bkuNXh`oD9xK!(SXnjKXb)7msM<128r)(xtDVEjWhU{lH zDhuUaTs0Eej0fj2@#~)7BMXu{PiAFjbMeUIJa)HH$Kqt*i$3qXQ|<-f^PY0a!1**( zni3IG4+W<$yK^ui5En`wEMJo&;nNamKd3_S~5u&+bs^ zYx8iMTK36W3hnolDLqiG5_X@Tl6a~<;)Um%X>D-y_^r*Nto^s0j#;HwQ2VeUAJ#v& z0#(b881c5nIJvqZBh2$G6LZcg`}K|22|n8gx9YzfwYIh9tvX$`&52s~%Sd{5H}Z`* zN|QLUCHM2^)PZ;W7o-tP@cbzG&s`1jkhX>~q zyorg!^VIJ!2Fm2%)DT1`B97`7J)Don^OAl>(%UCPCX4<^`#4>l6&Co_ z{<7TsLdNpiv5&8xJ(BoTuG$0~iiR$cI`@pj%=f!0bl)oox5dilXRlo6D(In*vu*3C z#3|Q;qvys#1+9Id&WJ9X;_ENf8qU_)IPJz0UPHQ zV0zc;oLaiTMjFMN@A^u{xk$;1rB5yj94O=6dHd-4HO)Y2gHi4>8+iMC)geXzf7cVN|K*fkZ5JzhIkTgh*h?f9k?W zW$Yacj6GLc{N_*>-<^X~rnE_4o3aS6@}{P$mbBziWmVs9IiCQAgfHP{VE%&(k6)En zCfcP@{(@z`i08Y*CY#^1 ze#MI3RDaxm+Y2wm8?7m6G|(4_v6yOo>{GiaS;cqf#NgBRf{xU=t$hatt~wPlbw@SC z6WKUvqLF(0p9aqy%+qS15&C^7!3G8f9_Z~i4!aqkgLroYHH0r!PJU zh>h>j-m z0xYU$l?{ih6x{pWD|f7=rqjf>SwrQs1y^4jvDf!akdB~8Z@0c5V-yn`+eDv2a|@`C z$P15(D-M_e*2jr1w#C~WRp(6p0dQJ%8;zQ^G~K`QU5+q=ry&3}|CF`PAV=AB|X zKAw37Q%}7aVOFwjsO|H_$-(RPhrZ=DA)y0h*7wEDnm|%I{1o3RhC@HBb2jX%poW*u zMV>?%Drt_pcs*-&1)-3vFZ}rp8(Z511yrLf!VWS-$UlZ)Iaw2u9xxQy9GMo_d)kA) z=!D4i)MqTeEC@&UKW>qtes?n_W=v-?-1;dGTTaqwv+8yKr@j=FA{mt+RC<@^^<)wF zUr`zcrC|V6cw7F4A6RX<^wAk1{cHM%pVoUlm5_|fwqjZ)5BOfI#{*17b`yjL@5~ls7kvsDG1UKY9^1R!TkT4o;9N_kFm$udCwDs5 z_>5h-c;LnN1#y#}At7!Hvy$Mo@JRrsz|jwlEZWe!dc$GJpMP7*b)o&%*svr+&5x?3 zx20UJT;4X??9O4^ng+2W93V5TY?Ul&%sKfs_Fbr|7K!(+OF;`=#Z)XZnst7@Q0=J1 zO+`Cd9eUSl4tb1ZVR_<;`?(M(G7LS(U3Q0D{5AdWKk-Eml-qI*4_O$7N}2j|TbrG6 zl_|ycZv;QZgCMEiUF%=$Ta@*G;E1qRv0QvYA$F zJ#5<+PH^%)K%28@(xY;9pl_@!R`c$~dw27eO?x^{0*N2-cEo>G@xSyuZ)z<^ZNnoW zcW~3RP4_wB!df*lxIW=A-Db_FgD4t0+W35aeG|jDXAcE87P!r4wvN-P(ng%G4XzOJ zeerCK0nQBK1e9t&N6a11fHJsg_U}Iln(W_a`0I!Fl%nN#vbS;Dy!z)=SoE1^!L&Bz5E>^=Efrpf-}fi7rp0%{~ujn z9Tw%cMhl{VN`neg0;04C(kTogp@4*flu9Wn-KeA}AV?_P9RkuZgoGg75<`c?&>i<3 z^qliN_qq3Or4 z%N|tq*CT##IGlvqYl%h)A~ZsdS<6flVT99P=fe2xCXQgU)$Z%N zVv4suoHEWe{4NL(3UxM`x$MOB+s@`syJO&mnKRLtf;iE!K-#bR-tOi1ek>WGp`zGW zsW?_bXD?wgwBH|*^^KWjQqqOne`wzhxZu!r++Y~Cxk8bMMBCWfeosj1IV7-5IVakU%fBL?ggN%nM=hFet(57tHg@qFOfLxg4GcK;oZ#_g#JJC=XWa?89@EhT znoVE4D)~%faqn@LO$ts>cK$ZgNvXrxsWDR3S{v{ans&43SNqt>@nzjJU4qdGWF6M4 zlpC*!<;(TVTxcP`UbOV3TVFaZSl`Xf5TpH4H~0l^*|Fakt1$M`@WIb{UrjjIPQx$u zDFt?KK#R*8Wn*A%Rh4$ks<{90@ulE*yrm;uK2-sElw)AgCK|gLsq|l7wOZTr)6@i~ z3Osg=7F9UWZhfXOrkZ^nFTn`*%^V1}wW>{Rl^NeSlQoehf z*dff-HSXc^B#p4d_gY!H)7flnl*ck98hjcB-ucSKi@!ZAgA9xqrN^-!Y_Inn9ef$s zt4%H1GWOZI`Ra06`q!TZ^ojcq&6jt`E+-;4+BFZSBp$wUch#EJy2e@5@iMD{{?G$r z*~#ja*0`+4i+r6I50u8e-I@p`kXwgYj&p}W&yQWS`ja9{W~^tPIW`-Ya^{~+(Zrls zS_w6FjA5=$uISRM!Jx=UVZn19Y((;fgO7Ceo!*FxPVv6!3A=wiU7;rn@4M-~GNRKYlFbbNfLmt}P<-F}N_Q7yOVtV+RPMus(8ZQ|Q_cum;@+>D zsPA_=@vIEH+Z%ptLd7!^88Ipq*Ax zb7Lo8Fs}+}U}W^XEmH9!wE?l7dj|UWJUS+Ye~-6Hqg4mzeWVQ6D-9P%7pY=UddUUN zjQnJQN+%I<@ocJBxOIdO?T}!n^gye(O@i&Hx15G@; zFZHx{BFxG~hB@|PpoLn~7?v%)y?x6uXNC++S~5S)Ru09n9hwM7A{&T&uSa}@4L|Ya zAJ2prP1@(}SOq<8IDH8v^k%KR*u+iD4+@5@XZ0g587WfyfpktPv2c^wk1*+sz0L7DcEap9%JFYL9F?$kq_pGDolz6K(}amB_JQ z#5MkAX-Rlb;)Ek%S+H-@vyfchd#v)?FT1mLJ?MHs)D@SrO*z&Gac#VQ zjIl@kTBx~jx0)AxUn<0idm##+zN0||7e&qLqr_vpX%Mo5RiTVCV9@qq9+X!h#PrD!ghy7F_S3>)gcHGQD^{9~ZI zk6XupiI(ixtIyR@f)2CXx~65+0;?HM-z={*15e)bpXE`?#o zRP9`pq_V%BzS8reSdU9Z9#6w5Cd$m>OB9-&=YJX~9jO8`rZ{+v=PbgBlI^(EE*|t9 zy?1rj!Yz2-i1HBzRlC*-CFn!GBT4-aWN5V>Is)PwM%O;#C-$G4iJZ@n?TwsI90+A* zWYl_Ckp2EI#&G*z8^Bmp%$Jl_BGT1HGW(>*=Dds8nwDkEkG0YLGhwJb(@L9T+4mOm zYLMrk_hyGrO{(?8dil&@-O0nYYz$*x4!1xBzN@9`J=W1|@tFr_@G;K683n;KYf|j} zzmmjniG}KKsmL1m?~lk9;A!*oW(u~viV6l0ma4K$uGPJ|LeL(+x5=R9K9~1dyjKKv zdi$+9PZch^f)cUrqV#yXd26wyaTWtYK$XWWzNB@VVSlDwBU;2p5MIsae~;_>i+w=f z>TG%aJK^_&<7x}ntVFD3`pTI3R1^Em zmqDEM0&>+vI?j>>35x4ac^PC)q4h?g0~JT;Mko-gBlT1UJxcK0z9e&Dqv>R9;%+hhE<} zODvr0=C!)ylT_wB395hZLK;k)l9u*j`M2z(^YL?tV+c&K%Yp&N?$?fUY%hCUw%by= zsV>O5;cOY7IlGojnE7-#l3e$pc%Ke^xqpQ2Ay=&XE3vVPPP103x%~UJR5ZU&FfRJp z7UvAKXM(-E1VqaoxR1#2k{}e+8Do`rSn1AhKdK!s5)Tb?7h5n&Qo>8M%6v(@-D_F2 zNht!sA~t93x?ULWOWZ5Nx=n?BvB@q$`DFj?e^e?v^f2+rHyvzAjfdk6vv2N!~H_zR6~-`va=Mj#^EH z`-P(w7K-Zxm#erccC}z-q9&(Nyiom?gJ0BYc9pB>WNXv{hp7 zb)4-9JX{<4YjaxEVMGRXS_7HrbF5WF{`I%I3RY+0@I&MOEZm}^L{;g zGTy0fYpZ=f(yqNoxPOxd*Ee?((W6EF5= zihD{Sb3#)vIAnzd4bJP~9b5ei5N=CHh9Y};+mop1$}h-8Vn99Tr(zy)gX0c-_z;F4 z>mG}{J10tY~ zNhG>3#jqbM6vGzsp8@0Z0*r6M&8X);S^#T&hUeUPaK(xIq}^X@yN$6!#8ym)c!kd` zLTyalKO?D>{tW%l@6-#v@-I0GmbB~4`{MIkESDoy2uJcqM(nITJw&Dh%26)ZG0Gg_Uf>o0NZJs*P$ z=|>ICcHOU4HYo-8AY=KgC+~b&H&?2P7bM;G7@?0g#zemRuVtA1#Zv0(H{lNf{NnB$ z_Lhqqv_3W>AodB&(tfNfs95q!`J*erP3v*V0yyk@upUN65&xz=_GOd@tx8^I0T0io zuffk8(+n(kX6J4TNaQUFnGT4DtX~;$K#w)lz1v0&GkyKqJT7C{vj6AU?bo8Kjivd~ zSD75m*z`wBi7hUl-L5O3oaSN*cbhz-dk=TN|0)uS9 zt(Z9HqRI!Y0v@O_m}4KTI?7MjU%46^v$8ezro)3gX^eW+S(bz#xBX4;G8Y0i7gMZ` zb9wayo12KNqg&^qYKl&_n9kb$I(FOalHmQWlr%eseqmwJzG)Bj^fh*N1<4Om^h@Zm zBl&~so}RVls|NvJJM3l>pvQXN@wwUI%GC>#;PhWMQ9qI`p+LrwyTsqvdN|2gUGAVX zV8g@9n{V_WRfe+wuPSaKqQc?E&eU@y*7Z^EavZxd;vg3f&(~H0-~DnhwPr`3JgI;5w;=Z`z>h_If^>U3dC(rQ#5DydFae7DbV;3+xZSyVZYdyy+3PaTI=Y$FE1bCnSKEr;<5RYT<@N* zggc(fyc+Q<8%mPSt0Mjyjk;*xWkIX`B_Zv zSg6AqCBdCfmMu6t|Hf|a7VbQSdVxFseS3mVIpT_Q^ODwQ6AYBzuZUp&A9ucSP)ssy zw?O(0(e=lEu`TfZCU|NVj;)qX$le$g1X4ClX@HQDFXGrrQ^tR$`w1J+AB`NWc<*1!{;_WbJC!LAG9F=tU@CDUrKu~2nP&)s7mP- zqOv4{Kp4pWMVtPIJN=49QpUr#UJ^+CWZ9h2rB9lRcT%2|GXe&PSYpb_>4(}xW}GWmHuCy~FGk0ycFeSd)guA0NVy2{9Z(Nfw4 zvA?fA@&AAI&FH_c&iw!S$Z6${#B5$-X{YnC7J1q>38~5jHdd!ISc<-1l9G_;uox29 zhCJu1H)bL{ct&qv>Sau*{;FnUW7FJnhKFZ27~VAd=AT1mh~!f01$aVU+#-(eFsC;u z*Shz?7^JfW6vpJxCmgiLh@5c5%Ye9weM<54?AtLBy$xZEc?CzUg}>|Oz-$FsADq_d zf&aCXe|Tn>_1|5jxbm;`_rG8H2remL~I9Dx|5SPazF;#!HG&Ctn zj01>{=4O&X9$3#{=?wto_)Y=FMEEA|{LYojR&hy{V6@y|n`)xcn+*p$ST^Kb&Fz;3 zKYjB1L3&B*S4YQ1vrCYj)-h(H;RR-k(D)$g(SRv7{Ics{1^!R{s!OrBrJ<<5i|{6a z53FJ8JTltEw3K`loa)v;KJ-ge)YR4a>+Mx8HkDKeMC9uSfZm#(n(2Ej)o?#QmRQU? zGFv~`^ggFC30t-Mv!w+Jut{KotnQs7UBEoa>?eGrbbv@?!u=k7wyr&xj%rs0BleX6-dA)#o&)JU%EN@cI9sNxGEaM~p zBRLjM&Q1E1)P{ymk9TXBZN<F%$Fa;&vjGN--5=nypFe)&ds65#a6e=E_~;JL_ z_j-VVt|ED`hPB_rP!os?sdZ`vaoO1%J+;_*ZhrS~2_fd%MC9*amQQC5qKhQ(S@`$e zY(z#tTpeqIBhy!~SvcHNT3-Gv<}r@T(gM=P?I~FnC-U9E}kxs4!w! zZeCt!cdt!imIN*UyTl-@@@ndgMkqxo7YnK8%;yKF`?lmPZ>#O5h{MsIi|^$A4`6eC&AEod_1hToJJf8_!^rS_%y~UjG!l#h;59b)FY>3_1eP$2 z>0+XR^B)Yo=WJDrOZKq0{GRrePzbG@Vq&x}UoNCd;J?=C?5)Q{z`x(f4v7tKG@YX0 zM}E^^-o_MlMB3zH-d<9+U+6?@P3aT+f@B3Wfgyy2s78LeMltT2p>`U09#O$+n=fdZ z_FwZHXkcB`o8p#^{`YjP)#e+mnB_25{4YO;3^40*3-tuSA`k}W2Fjb1K{~Y9FNTYS zk83=>;r6zxLxQ}(?H^B?<0Z?d`IpzabQ;Z^CjnF?J1#Gq!FR2Gf411?qu}dx&e8!( zEUe8#H$3Ou?>CF@8eA0Jmid&mI`ZHv$|%Vf2)X_K23$J zhebWXpKHQDsjO^K*9qLOiaWWHAHXm?o`36}mX_9Tp$nVW{JC@9EMt^^L|(iQARD>b z-7?X9FF)-LSa6~sXhkqcb-3HF^zlWRf9q|iOZqzbcb_jwZ}zbR5A;yhe%A%*aVF#r zyV(Kbe)~NoR>&g3VP7-$gx)SlJQwCRbc{nFLdzd`(nXWUQD`sAHl81T)#ItEo-%4J9{h)|Q3l&e_dfG2P}<|y^pNXOOwI+yTI zXyYFmJCCdUDp=aKu(pIIG3xvzq{vMSE3%Gl0u6&LiPEe&D=PIu2X=h11(Nvya{p$_ zEf$2j9p{+)T*U5f&r^_V1h`N`{T4e-A|^I^XwIa2z%gSrI}TvqZk@*!B;7tv3mY5x zD2$;c2cx+jarQw)quw?lbPX?I))TGlXThb&>_Xb-0FmXpFt=n{DJHNW>>Ehjwj7_K z)|e$)?Pi`S?C~pXM*ub$4$J{?pAo;xF-g>$q1?{CpI#EUrZ=5J`$ge#brZkjte|cS zk=878R#rK{vs@g*{f9dIq>NWRtwb@FZsGB?r34VuD_bbGEPJhDy+Su*+fCj>U*!FI zfny!v%>isP9$*&{RtXgJbQN~&0_3n}XSAYgHt(j#vpN_?!1n6U(Dgqm-$C@P!6 zQx&QYCJrX%=Z(Ql2+TnQa!M;=;m(Ij{^ulzqYBgxpos@nS{>@vmD~^4644x7TwE1g zIoI2sn=RqCSHGrEk|?4>SGnBVLhqgP27)m=gC8ouKl*-LW2Fv=t*Yy7`rQ)2@%^Bq zx#BzZOoj-Rb4$@263glHFzW;tIQ3`?CD0>*^o`=Ux?=GRaMbB^FZ#6R3mm=X<>_YeqzE}4*byZ{U1QD5kv9G*edtd2`2Mj;U2Gyk;$DO|976#wz-5@Jvi zz{za+OLMS4;I#C`%vs2k*Xp*XmLe4{H>>o3He1!$nO;KrExyXhu z&)d{}nTET!#sIRigG9G+8o|B)ZaB*p*ljW<(?Pmqa9+>K{7rT2?7HNWX$B`Pe<=~f z7>(uutByYNpFblXyP;c-A~TN2;6O1c^0eW?lz=L)AhXDwDu;$HSzf=Hm-$Dl&unoe z_o4zFFUjqTVzH)PO%)(UBn`&L)MJby{{pr=EkP$M>)#Wf449r)OTn*C!%;02x3&BE zqLI-kMb>9U-^O3F z$Bqpi)u;RWo3pH$ zy{m}Frwei>@$8VmjXvly5eGfRjR$5$h&Ti!|LmeDTe;0=W(GygSQ+^4EL+cTR-k9b zjK61Q=E@9(qvPY_mDLIB9TqR{y6Wj~ZlL1l!w(}hjs8vCaa`Y=#z-| z(>rduj|U9v`1!BH>xS0N>_`6DB{-WpzM-Vw>%x?Akk<1x0RFD^n8@uoYJOo^cU{C* zxDb5cf(NqOWyHFv96kV4v0A8y>{jV)k8kI3?J#?FAn09+&GsIa#<6!$hui^#@a*C7 zc>-dchQUF?KAWOwWayl?h=T=_)!cSSQ>gf!x#$`~=)#E1Yq3VAFwttNVTU_4%VStO z`-Bs5cq=1~F*W7{?!SYw+;n#T=rKzV-_kgAyKzJgNfwekFf)ol7$P$QxCMd81o6$S{io5|QOtZeH< z9SHzj$}`eG!*ZaLeMC%52(PUF(?+Jsn8HOKgi2I}ge^N4vt*8S=#RD6%Jg;UPBQ_%Ey-tixg3nv@}D3H&A zpogAXz~Vy5-4LU-?zhGdXqiGOL9398r?gs4tYR&Hu%jp2tH#60L_Urk^{=m(^)>#> zgttaAVe|)@%lRXxI)#l$`jh)cH+U%L)3WncP)(KXcCVg3^)ON~U7D(Si(Yg-yct#f zOhuuY2vdod)5XQczAZ8x$UT&#MFiZq%vZ?XH(kEI3PPhg6oka7>GyLHZtakN)pG4#jL;mO?5;YSLH6uDHvgJy4jq8E^k!U%NA?BAF_)c>udLn#qr$o)^p54W zs(QY9p6oZAP#;$xd6skm7!P~(5sH{aXWHOul~rREk7K-(dj8%%30k5AHn!pk;3sP` z61?1iYMu>GqNKUwQ2%@3*F9-BrmI)4@-1J%AN8XHhvwy!B{;W`uZsjz2LaVP@Q29a zp5Of+`}s}r0y)~S9}~Mx~!2xH^s7UQ=ZFCk)CyphWNQo+KdV_ER#< zgy>FeXP;8l7`2Io5aadxdFg{bpej&%Rv3KL^ygqrfBMM|urEb9LL=>DN~}Ph6P>tZ z?+9vU4^&j8UIqc(hu=gqYZPr$D31Et2wferC%24&KK^_&R?oWLqs%n!Ns}N}rQ@os z$)FoI&9}TCOSf}HZ?(+*sBl0tBFFPqrwZxQr8Wl5ztqkI@@t!kM1NK9Ifh-#f2{&qouFO-TRMMt8!Lv zozT>Dn>L1tf&w2@&V(nU0W>%N3Pz@^WwUaN8-cC$tqQowcZ--0ltRFaWL`rpx!i-8 z0;05xEJBc>KE0YOOV{Dd;h^iX+2uQ@!gM5VHOKFqYs=v>_K|tLFmMEoJr12ldd@KY zmJ!`yS-Po{;{8}=3HTYnb?dEImz^sdrUVEu5al*oP3 zeJ7vMGSuXJA(>92&W%KxXi@Sb+l_-vWkiTk*XU5Hv)T0TRj7SZ`xWyBwQ}~s#y5OQ z3>&FAC2A|o>0c2QYv+nq4sSCQ4^W;|RE&DhqmO9tt}2;~-NF*29U27j-=eg;>OqiM z>lOoYc9jPIT;^y@9R3gzAKI7It}xUDsD$jcei7iKd?}HMRhsONn zBBw9-=R$|fvR){tNww+MsrPB^?c6yw`R?4g!zH3T|L~)xGi2NHlMU{2F1>+EKYiQ^=PB~IW-E%cn_#N!+YVmg$NcjX z|8@TnkF9MNXn!$=zBbe>@lu>Vdm6^jsdz>4r23G})c}c^*iGKKQ9y`64WO|Q+WDa} zmJCHe!prS;C}2JxzqgXBnhc2gwAfOp^YYO(iswkjRbK^*!)Vbp*WMv#oTCVJf%{pR zri5+r=ib1~fDe+6_J~9K`EAPRTIeM1E3_($RoCcH61ksw%X;?AtR-Vr*E+d6$@12i zq>|<1QnT{xAFBS5kx&4kO!nj)@0HR))w6c5RY^_aqI}`}@^W4J4sPWbY2VU1L>|%D z2ViH^Tu+y6y^KD(h^7GJ8l8K@UIy0q=Mb^wVvepP;cCip)dq5@k3cKPnEWA)#D`g4 zSwghlS;+PC#|_`u)IOh14fum77ih}_VSWLN5ig*DGBfRcEXhP@h8*F>2Cj_qZz0W@ zgp%_|3CKKZn6~KSU?@{Ghe?>e@z1a)n1E5aIqC3t1Qot+E;xEv{Ra~-DCZX&p#%XG zRUb(0an_-aIw%p!*oKQ(!wyUD(ESe{Fqgkgal>&Ol)x-&4Hz=0ncS3*Po53B#jl+O zCmVGGdh7@ITxQF69M~oS_~1up%k-A-5x|#`=(^V&9?QIU^}r7I2x7Im^8E3Ud*5QX zo^;;N6ecLafS9c(0i8k3coFu3N=qOH)1;N z=#B4If(2_E+d&bbS%F1plR2I}${y9PEL7TmDvOg5d&ws^K*=L=N&V zUYoA&S4c!Mp+c#ut(-=k4*ZHEY?wcIcGq}e@xDf=jq!PhZcpZsfM@V;CMx+-_WWoU zSD7*V0abso^)lzyuOE2UP$ztcMcVSp7dxhu>Xyey>~5gsk-k9^RhOzYMHk{~ctxr+ zUdFXpTdtc)X?~A-_);?{vl_i}c)gOVq>F5_rJ#{E#@r;`@+`@PZ#!rY`-Xz{;DqPO zkqzPNXWC|Z*`Wj)Ehbi%Ff}*5Cuj&u#B3jJ6?ABfU$^Ow-5p9^f`l%}>-7g)x9|Y=To_!G+^&c(3 z*SXqp0ygBv0Pz4$fJ&X1mV~9bscyapR#${{XLpGKWR_gwJ@pQHnsR>#AbdIIx|6I8 zYg5MRZr_V?H2FS@&@qoN)!TqNz_^{J?>ow*$w|qwTGhF%Ibpye(yJ0mDyjjjSg~>t(z+`xHS=r=Bo3pf-jFBj(n|;4CM9Y#RI=m zyTrK2`IXLzW?{jhA@&iC&~fUYFEA+gh;~QoH~He=$6}hh$w0j8n(k%%DFX`M2bYX8 zf#&dAH`(>B!__|iKFL>rY77YkzS`%Y%t7PST*N5-sKuwPY*FcnYQD%nU-i{4U?}F;GMUb!%Bu#CmEI038Fuvk<*ANhF|^30*^hqA@9-Jm3meKm`b-h=MT#N4!>res+q~@<|(>C1; zFwC6kJgjo)82?I(>aFBTfnq=93i8A2hA9Uw)dF&SZ-SPB%-{*9J7SN2W7?HBomf$D zj_#DPP2;vkS!Y(2C62;pv0SZI*@{E2r0>taPc5{nD5_FIv^z_H$_La}8mgetOBy3p zQdtbF!qqckLr_bghPP~Y9c={*lERyHR({J0N#3KwT5sQ@E*pRm3j>^a{?HznUf z<$Ft1FDWBZnp@EG%FZ%=$2#5{7@#zaeWq*pAchSQ1=0@Cpz(QIgD?(+PQLZ4asYBn zIGNBB>(#Gz))Y*XRgQ{nDS02XOIlt5O;zq5UxOz_G)5@LEqW&&Y`kL7UTe$Qp8w9P z;j~0OP?}F*D_PHH&pcT~FKVdUvjhr0&c4ngD&aKg)Yeq?w}o;vY7$UyDvOaXQ`)zf z1Yy25i~)3LxZJ@ThZn)*3g^RiADqaYry4357dp0R(y+KeE?3w`*Eh8l9*_5i>A@e8 zV-RVAXz@u8$GRMQoFzKG@S~#-eiq6@(J$}xnOTEdAMdS5 zNf%(%AaJ7{5MTaq748up)7G-cseV$79=vocOgd5aNav{Jj<1a*%QZFJr&{%k6GC`%(#xqQ#DmUc}#ipK5FIR?} z^1^5s4(G!=F;AUPgn!%wFv(!T8KleYt2S)_7Wv@KVI^>n+&}NM=P=LPnU-XsGMA2S31Gv|x$vDe!&>#Cj{xu%%LLETd1@fa82tG-t`U|)ki}PoPDd%k*SV>uUy<>5sCk&m1WV%+E zfxHgR_C>lmG?DdhOY4IRlQ~K+Ln{HQyeY{k-blQ6*iWp9eizJ$M8@va9h1YTi~Yi?++E6{Nz<-hcq{+y>Hj|vHA&v7l(Cm_1Mr( zFmp*!cua{DB&`)IW%t-$NfS4m-lwVYsaBQEq$eD;fQ}p^t3Ir14fDNikF zu+TizLUX@p#UR_kc0c8X4nu(7JpK8aK?nbuiiDTnUiy-tNeo}QKys&6e=ootp3i3u zOrI7`xL+k`pZxWeX#y=4`#_=pPEc|*tGJ+TpE61fqbaP^HCM+*I3>+IV>Qg%@yXa4 zNFqdVXC@^*7?5NL&LtM3iT@mRQ1m6}>B?_o)L5ipz0Hs{L%H7zSAZJY12slFRDB-7 zoELC!t)jn6W47?>OwZudfc~74D6^@GDKa+8_yCGD6`Z|3$qVfqn(V**9NLkYnb#6t zqPnyH2(tGpKLb`JE%V1FOz{wS&lOmRt0ERMj(J( zOs%3?QTkT>n<#8aDWj>@P&d~UD^_;)iwmTS27kmFU&J60G*cLQXvYSN<9tAXPZqmM z`wiOpWq*YyI&eqCy4zqwveM81eb3QhP0X-Q*1F=uWAVeHaGQdH6A?x<{nsSnheg?ZxeegEfCDbJsH)37c}e9H#*yGKY?>xJjTYM;5JtsP&^kbYf1 zJk!!6M(*1ABf!G&qdE6wz34n9T0t_o>l3vsMNeB%*F7VJR)~%;OpR zVlLj!du3>tPpLCfz&oS*`eIPnVyH`%fTH?W-9>WX#R+E6mPO5VYU$U?i zJ6tBfcKuM9i&x*s$~&aM%ej^ZM>JG{!B6zwn@&k`!&380Gp6&T6#mV)czIXd2@~HP zhCNYv+wki)-SVN~EG2!=6YIOTvQWHXZ~JWZTe^qlVD~15vLGx$iTxb9M93qL&EMO@ zIOMHaju(Yt=imjY-E(6#e+8>6{tC4SqHy|{b9rwi@yncP(*iO=qSy&!Su3b1=oBx#Y`tJVQd-Ci0-ymdaf-7|1(eJ1lEn`1Ka#25suat|j5e zu@G#wFggpO8fgY$ue0lj?*+Zp_3~L4K!3wn00NvzHT8i^i#PATIAJWJD9`}Ikyq$f zPv_!m_{?LfV$E*=GGpcwS}hbb`CqSU={b&WA^ZkDD$Xn|#ou9fMT(yw1SJP}$qye! z>mngv*x_0vqarDF@;wk06DHv(3DW8{O9R|}fJ#`#O3#C8A+kTAZ)zMg@BsG_A$?&+ z8H1=qTe#B$yF5;NM0nilK~)zcQex*D7|iU!-cpir#x5yzIDpTuW~N2;C`xIZ(EOS> zcEL8)a;~}6zWHdRMV?Un^Mu0pjfk!nqC>`O>^QA*$fATkNcH|=N|{DI8vVTq z1*u%$D+4goo+vM5aTatNEiLRSORO^070N}`m6ulVX-JBr&&VJnk~Jqh#lxDu(1xjt z?nYgq$T(w38rpXgL7(Par$2+biHyHrL|4wD!NK<;+y(ALMe40OISX^2lZzxot{@MC zPLgJ^#7IhMx90xiC`y0EbW+rTf&5E9-)2+@fUu_65&5C=nflWbiI-<=YsyJ<0F*@y z(8hKlQ(T7&u$|!oAaz4>a?NU5tTS&V8Vw~{u(~Yoewy2O;N|&H?5 z(U>!7pcZ(hH^q)cmz^fGPX)-ciI#+L0h)3zit19CCHoo6yd7Lox;5TpLk%P@`kfkg|z;p%<{|N5ii=~?Esq|9$2p1rmYyS*gB^x zULMs%LsbkDm4~|{cq%96m?^pi2}Za_tBWP;`#kghq0A(-0F)6TTKOewfE*V$5YYX- zLtzrwjMBkvVXoqsKpTak*Mc@M`rh-!w70cz;YC|!gx<{|h3X3Y2w{nU-yU#z#b+2> zJW0yP&M4ga=u!}vKJ){#evD9_latoQ#(^r4oVl#GJWHO{^FP)$#b_M&v?|X4?rM6? z@ME+>j{#CM6_sgXZY#~Q9YCLhxlc|+y9zs4F@SBK@SqlRK_yZHSUoKsd<>-ngg(r8 zB)l|2K_n#rb_Bh6&qGhZTE}S+2$A)R7lPwX9uHD7S7HElpvID5s%umG<-qr&{^IG3 z#AmVqtGqiiP}yJDm}_#2?vNA%xc@N*m+u5~7st!~q43= z>6@UxLAc*l>D_@}OOh84Sh#dR$MrrlTd)%(U8I_KIuI^E4Z-Zc37ZUDVvxLi#+E%Z z_4twP{axg3h0kBB6`)Nsg8>+N(JnV=Bq8J*t-6woVT4Nw0k|1w7C z8WtN%*UkmP4d%SwvLt!df5HZ7+oN^PCqa%WM_?gZkFNF*u_nMuZE4q5JJh*>OjzqAFH!hFGXNZ>3 zm6Z{n+-vpT1(DR4#gXz>VWB0B4BR-Cu&ntLnC2tmz!JF0W2EZf64V?o7FE?V@3KP! z@-W)-&+C*07td@86y&v0JposWCy6&T_G6t@HAZT+ZdK zjt*%O$f~n}{y+gQwqfwg@!i|^Ah-JLfXeoylP$SoP-sQ~C{PIQR zQ~VBl6?OqkP{W-I$@@cP;mYdgvOc=V)_HQkOa-^7;5D;h=i~5@JLD^9%mqxt!M{SA z3fG;LC}#M>Kp1x_xRrNbcyECf95zj&!zKMH)RpwbtN|!*l6^&S2D8h`gnFK3(jwZ$ zJ@zxUSPokyuI%eg@1xeD*K&R5t9wubgmR>0vM!@7aa-Ci_0$s@ubRA@U{U5J(Y zqjA<#Bbzqn*T`a0#1Nmf)09Wq)@{>8YW2dUYUJWVsqb7qf$m~G)Y>m>76#Nk)#37- zO3K@xpIjbt7`ZJ^`SjV(>T|xMFryLu`U~lTD#4e`^xeQt^T%q}jl?FJR}U9*R!Y6+ zYPu!w|JZ8j4a%l_gz*!LNIcZMK>Q>9O~NQwA{D+bc9% zmByMZ!3ss0E#iT${K07DJa0%bl$YJ5L42oxX^gGE$|SfT zB~si2J4*r)F)$k*V9FtsHGq*qT`S8h=YQGy#Gjzc*yxxZYNM;iU)LQ7y^P{nr9Z{8 z)28m2-V82OWT?dA=c8`4*@KdZ9viSv0&g#XYcMA0wQr&`s|Dh^5W6vDbd)_qZ!4G zlWgIpmqlF&dekGh$H=Mo*IsMU%I(qt34+e1vl{2`-!bIAlI7~mhyge|kB!wN6vD0N z8e(tO>tR}kyslV|JY#0)Q(rd-Wfiy>c9Q1y0bIZBx z6_TprYL%@j^+E*mON~p{WrrPjNU0JXzDsELh+5aYv)*=sG1dv@l4X76u3NVf#z0Kz1E**)6~cMX>c4~*uP1b5OPp(QJuEHFh!G> zEq}YvNSM25=>cIOWBnf6+d}8;YY?1{eh9jjRO5T(RlZL?EC*)#zD$dL+tiR38Frx? zqi5~d7+25m_avWDya+&sXq_=*Whpu}^NmQGr*-UKdkN|*3jxW4kqk_{FM z?@)*7;=~&l848Fz9 zReZMWKd}bPUY$8Lh)%?`{8dP>Ibs_x30V)SAp$WaqfOD=G_&$0?beCa0YHY-B59s{ z1@Qb~3{Ha&9-bQV0JH-Sim>r>SmQpTg@QqX?2F9J8NQXQH3(T)4Tl|X|JJPoN7A?| ztTB&=GO(K=#IUWb|Jl|i&`4&LQyFhvZNPN-n!jLhP^wk)6$2aMvCkCLecpN%>y4r7 zsp@QSDN-g|klRF^Z>sTN_3$>*%dNIg|_~hv9*R$?t%bYgHa}6|2wU20C5h z)`eQAHh$KbykUQJ|*nzEgZ&z+EwJ_x50 z4id5X1{WfYc2LvND7QI!a9HVOCCw;5QKjylK z8&ir;D+QN--0~C5AS}in9=(li_PHw1bM+~Cl)%pSCR0xa0hxDaiOeiNj$2SW4}=sH z^`tgEH$5)pySDu6hoH}qw79R$rgM8&7qzpvdWKZsCwHpJ6wuA?c9(DKpN#7y~= zb$6l_%E>SqhH@vf<}^-52c5Rz66be54$qtW#)Kk&{|@{n!CM>IJMg;v=t3S_QOUp$ zAN!y859&TV)7zcXAktZSMX1UAGlqqU`3{L{MnuY^saGBFo5MsttY7e)pUaw28`Tn8 z^w_ugzDB!koWdxryt^FqXpcj*e>y(7RIPKnoiGl&1MwMgF-|AfkcMZ)XK_et;#alq zBStPnt^of=BRb^Uwqt2!#BlobcZn-f@*;DR@4Q{21k$|Cd|gtfu3C!iv~SSY?aec| zxFmVa$8J?fJh!}ZDPls+rDVS8XTL>L00aBOB8LOD(3Ok~%>NYd4ZqG^OilOiNeto9 zRc5tods+6nNk#1uTe*L+qF&gi#rq;l8-f!z5gq;b5-V&JRJ+qXs9lb?jJOVEp|lMt ziLvxpxb9-L4+BX(4;&&2rteBmHHEx0#S$Fa<+r3=S6v=W%&Pey-{Lq?Hh7*jLXor5 zCPsA`8A9XE`xy%!KP8TE5O?;|&67hux^eSN>@w=0aA9eI>8?8y&-}j4dICwzr`@~Q z!gBHyiR4oFatMmVjhUHCt6X&fPwyf0dOuILcVeNPzPws;ykg?wQmBAP@e>t}6DtxMv&C0CtA#sP(ojb>UhKN{#R7ieNb9Eqmz1$L=RX9LxR>;%}O=v;Vl*46s9H%^T#4#vNXYxR^uiu<q>=+)TTn} zWnJ#asd-Wks4wFipR{!ts9T)eci8!rHCV(>8qeA*KDjZSUsyEkbZPBF`#C`~8`yH^ z(!QDtGB?nCzScF4?_!c`+)#z}+SLqND+GkQUh@K$Zl2-&t#?my6|aPK-KIuscRY)` zGP?Zp;F!Kh_cDbad)QaX<3oofV;YBbKavroOKz_6ssXt-5BXfVMWUkKxe}N6Cqi7@ zg7y{R-}3g=$M|h(9BK5PR1<0jtPIIES+(1KzA_$X=K8eL#-_^B)st}StGS*cpKG{$ zz{>xj>b(Q0{@*uXLiWf=A!V-+%ASX;j4~@LyX=*jRmUtlq>LyDS=n*y85t?tLFg#s z*yM!gK7GI6=lMN<_4%B0ywCf*#(iJ+bzS%C-6V#_UY2G45mFebKX~%hk#q42)cA)@ zY3Zh6_?wYfgLTtL&VlG1CVy6{#CH*Pc?>P%>y)?GIb=DIiE3&bho8jDD36#$tFEur zGgMGqAX8Gq)Ocbnk#~JW4vZvXuYGwSTmoz2(^0Jc^MEo3EXxJ~!uB_)XEey|dKhvdD1~O8<4s&w-(^L9wNtipq0G zzg1es?tH8~)t++_&&)Q-KFwV9tZl885baxpU$7hO@b%>9-U_9jfB%j3%FsT~Ax=G@ zWY%>rpsJdZGR#%-ShB>(?sfgXJXPn+4jxli|_Qgs?${T88O7LgzU}y^>0T8 zI1k+@(TOMFRm12VUoN|H4`#sSMM!z+dD4}ao{QsmVE8-TvBE#*a(U5;%jJU$C6g9; zIibV#EtJER*JKoPtjvo_rZ(2+t!!+zXkGk6P-Q8#NW!p03&KcJTtLo3zg>!QbGJ*M z)onI@!M!TEX1l}a{c|?Q>pIZ`CCEXTpdu8jp~OivELgTH+4oN5#vU@j{q4$irNrT` zShMei#3r)U$oN#1V4r5^UzG0-zb8ENR9k*VxT*Y6AM4Ypqt$a9hTVmlvgXaNq*{f{ zQl1Q#vA@pW^=k2!fvhGMd&9HZkufL07#?}clGtc8{!{lA!q?!;=G7l(pN?8<4YuqQBABlCR#^2ETZxt+^n&oDjS9D@ypw-;hE=}P`}$r* zm*2h0!8i4usOkzm)0P^$+6m13Pov*nX4T#^>}<+rL8?7P=(u=tWJ1ngBq}ij_razC zB4`19EQ0~&bREC!&@4~U+Pf*#vvzD#uk%dCE7LI8Nb|m;IP>SbH1!#jB@-_*!)$-p zAk@}9g>U3L5a~t*vx|(;n~a$Rgmbhn-EAA@3V)*Neq3V+XZE$231z`!%OuRyJw9w+ zxHa_)cF*|gc6JSR5H02Km1?dq8FTt`_}-b~hZIrILN8PXcR0M#s6XcU#`-ECw@Euc zQahh!LhFg#vB%hx^jPxDK_7G5lejzT$~{dF^8%FE_5vUjar@a=^CoztDFdvOK4{zwBmX&&;kMOQA|A}dO5v^A;NluTJBJOl;uAF|k`JG1`fVCK zYT>{>wPyLa{in>aec`u|llAr|N6BqXnzE2UKjFUhjQaBuUQzj3xaXD=HiEk*v+9jc zt+Djwax@E&`T!bkB#kBWPP}AOvEb?mi41HQ|NeP}Er0S8H6*8bo$hNo-f8T^PF6dG zdd(gap{1J6m`IU2aJJT$zG~bL4{(bLj#m&h=9f6tWa*$3ojyRH zTQ}3^U+l}=AW!q8!HA|-+akAztWGpjAz01Je_%uBln=qWJiRP{?oOi7x5|8 zwhOImW(v?TzE{6NOHAW&u2RAfR=r^160f1_{;d^z^mXG1POkg>A)5$R5#Ipb0FNil zA3j_p32tKef)f)vmWgLmSlE8~n1pR)#Lu(JTGaiEBgbRcf^dX$w%3*YTle=k~Bk0O|ur0^C zPcM?8*alObRK~mYLW{IuGPKi#S>iFulp)Q!=0}>`Er~N}>zg&p<}GH`4T+FmKT;6+ zGNzwiT|DK#x9!gkP=W7L8Iv{!q z_pCM_&)T<}E{HRjTsN%Yjq=Nd3~?za zETr5GWf8#5Zso*!a)QH-H6vbhM{bmQN@dHR@e||cIU)@?u_)|UHnfc@SgIe3uqf~j zw_upI3L9|6h6H(pjalBgT+e=^_=`$Dnjow6%02&eACY^LvJtJV;pK>HZj>&?4+Y)W z`*NyNLw8Ra%f@V0MqLTyThB4X9?g*|5zkFvKMPScYD>BUX6x_Qu|BxN&lj~tK@{uz z_Z#2zf+FVN0CR2`yH!6vpmT7hl2&3cy+CM()dQARx!&yc!RqbsC+**i-nyLK%Xs(w z=j(Tq(T^-tS_ocD=zU2$^Ww`^iCn3XgK}9}+rW>nVXde>6jkvrCbq{?{xV`OgU~;QxjZqK6+{Tovnv( zfqV}$-`Z4;cnR?~R{L{eu@Kd`!{kWhquWOOP>$K^>neCXj8G9W0UMLGV_$m#j7 z;)yAA2}-s1I}^auxV&V8W^C#d3Q4|A2HF16ar|`i1dkzQwtR4GYQb?WGhl81tdVzr zN4A@Z30x+&GMDpTG|GwgK19DN=?zy;S*W~BTbc038;>_=uMut#KeL(ogjr&m3l$7z z;E@yhTN<(cXot?$R&}}FH#_TGm$@9JV~+LS87w*DGl;Lem)q;mQ@^%l23%lZx>}ckf>j5EP)U({Gr$@uFJKrcM4Cd7q}v zWAAmb-B8@Da9+Z0e*o85{11b{dSgqKmR>pMrp6YhOi|yp;O9 zLVsg5-8GaML3r@NR>1TgyAJFysrq&|DAl*9DXyQs`jYKKX~~b?6h8l*<=k>7?=ys- zq_AsOUw;1zi_c7kx#pq_vkgnMhN_m9fXE9sf(;!be!R?K3MP9nrmjcr+nO7 zyErt+T77n`MSf~g4=s>042V4@@v^aZuHEL{)g<5e5#tv{RDm@vCs0UKYxM7b2=K5b zHuH{^#bw^tw_Ins^j;Fl_i5MtMOJ%R$!(+KFYNuPD=RhOmk_f*(%9S6kIhN9Z`MQZ z|H$EC!w_XjiNEj`D!renD$cLQXK-Cst>C`{WO0E9sXE|W2T4t{iaSWokDk3^ZQ6OC z-67OhF_2$Cp80dvogA+>(dji`Sg&6d^%bvM$}J=Xp*UzkH-}^z4Syh&rS~|HR!}J z>g6)D*`-BKRrqPp)YnX@JrZ4P$u#SvsP^VFxFzR@$aA)RBzH+o9W5~gyhx(jB@8D0 zTMe4qlYCA7wUI-fog+yQZm$HbN%NErk^I=Cf&JO|YVUamO{Ndjg*Pj155y&^by9o1 zQOLcVVedRPRU)_SZKImFuuYj*#+kuQQ!h(rdw-M9d|7( zNci9D-}QNnAWLF3&P(wiD^%OJEZZ6_$>x9dj1D0wd7;4mSbeqe%mXhIsQ*v(jV^9X z22TknC%iNtz#yL}@<~z^!C?2^iD{~-(Vn8=ARJ=4g*c_DrPZ1yY{q#vqIPRX;F1^W zGJ=eQ`y9ovmNX(_IW^R{{n&+_m7;j<=j1-45ljn&V;;UlaWi!r>6aZmrqOz2w*=<`ss23m&ESpPWg4{qofSBHy5I&wsbeVGlF)gvg^l%|2+=j>}Ze z93goM;Jt83x_wY19UaRv-SFG==Rk?K+A51IA4Tjvdl~f z$+hq5=F6W5^ToM#M3Fb$U4BMvX1yCNzbG+rD_Sp_Pri9lA{Lk{7mh=X%1a#KPwtz^7(RCd@{ zJ4nn|t(ry>vCN$zzumo?wal~28B-*L07?9tw50_QdjoR{nQqOTMfnZd z`CU*iOV5Nv97(+jW-oEou)E;?@eN%Tw@_`+c}M;21itzJ61emEdlr@NFDZzY5kRrL zF!CvQTAXvrUn+SeILl)kGd=~h3s7@!8r-SsKOtHZ-rRKf5w=O}Ms+v$rvE_m%sNk_ z)qdovE$?O&!iN+1cVtgOvNA$VTVKEXGlfM5SH(4jBQt`q)(w+q8o-kg>qIww+>&0c zF&7dNA~0Dze=bJuk0=Tj7{lnV23T~jp+M-?&s6Olpx9GX7*h=29)@R%By;DdrZT-P zc*0wm{Gwvw=PlzS79bnKO)4z|EDNPx8@Pu}h(CU?!nj%!Fuv;DSlwSe$#(ym%+N22 z2|?dI&$aAso~>;pU4Q)zJ9!H;qHM*u@r9Iwy{mdp3V{LfXhDCXs&QOV!_xzGg&NtvPYshk)7$C-k@yXAc9tmQP?QBz4wx5y@3mECL z>qP6N@R22He9k#O7qb8Mx$Xl3i%d;R{pRk;5x&RR?6kDVFRw;8rC%SY8vApzFJeyY zzeX(Y?kX`qJQ1bLP8ibErRJ2@m#uJ+B=N5kezA zyEXpD*Yb-u299>&Ibc?5Gbi;`S6#HrH_CLZA|l@<1gO+8(%{(iB%7$CTt#-Wq~3?7 zdHg+Yr42b3o}`vzo?~T{k@@I75n+tRusmt<4V$>MMCs&yW~}Dl*S_mWIqQhx3Za^Y5||MZYbijcVn@=Vj(|eb>3O)g=0FL%2Zs z&2|hr`^`hxc-vhkaW%}MtcfnQSA?|}3V;xU%((bHT5jWbQCVh>kDeEOO_!5p<@J5P z4FJeb;U!BVHGa)-^8S>?l~2(cKUBnx^9)I3&pZ(vI(nn+L$A3VNI;qI_*R$*1q3yAZdf^l@Uu?sv_KF-a(}X;9ESJvIv#|vJ3}z? zPh7RgO@;&ZzTOI3R{@k23-MHxUQD?FnMrs4?LVFdKK9~e_OUPl_jP>My68P053x)$ zZ_8X$%>d#=;)Xvj8p0dBVZYj_9StZSKYDimbRr8MJn%Wr)RA;YKjYI!GT)%5C)dyZ zz&%aO4uLyKD=<)&UCA<^?r{erT!c>S-~Gwrg%cad4?hU;FIFtV!5|N>aU$u?Ut#d4 z7r+A^x;rt`n}!D0PbemoO~wdLiti&M{u^5v5cC)R{n`H;aBuJYxlX2K7jrhxFicOA zD&IwK8@bFaP!fD{a3@+s>EE}3YV$)k?@ykbVd^)*I!J#P+3675Q zY;edK1pOV(2tcL`h@R8+mr+#(|wg?~DeGVj9=OefaO->ucjtB3s2H<5R-N#lKD}V)Oh9edi z!IQ|rZ6eR1_Qs7>;PgzpZ7r$&Ua1WE@)fEJVf;6D`91kGzV*v`0H2yt~UG4+_O!YS#|k+fwC)e`p4Xq1XmP-nMd~5yL^?A zE>~Vjx~ku0*;pipeN|&(Vv?9m15d}(gk@}EQl5+OnG7W7;12KE{NKIcxvkLb>JVMR zKq}V`%3kg|HR@sGJ4$V>s=BML6hpSo#oAveyZDv)kO%Dwdbdjq#b}4ZafS9sQHDfWqw0oxzi@3jGm_9_iOO zVxEu>w;ye-k`EWMM8O!_yUT@Y>SS)$N455`kL#H&NVY z{>bh3_6fCQ7s(Q|>>i5%)6nS^jZ7qd4(kykX{hu3Lw0G&d;_08=dnCv9^b`!#7=iY z^V5lk7boxH#~CQ(gF?UzoW64#_Ls{wv4~|gs`{G$ z2(oHZ?{r_4fBM8?!pF2;KR9|a-+l1G@%d3Gpn-~&@66@rNS$jz1mr;DhuaIeT+z6$ zYMKEf)#^G~btmm)ngmD>zCqiXckh|mf@{AkyM6X8twPD+bGf}5tH%<`XBOe|8gX5x%wh|9K zbo{TJ#O)Y;+#PY!jhQVx%!EH}d_$-3huaAs(K(PVbpQ0qn75$Ap|4Nec$Z*TuL&p^ zAHnf6u31WV1dN}K{;a+G;D8QfN#z%BxZn;r6A(L#Dd5Z#mQ*I=V2$QeBQ1%6&7+#p5BKEDyxaYMFP^RX@8aC#|6Tp~J4tq)%B6b@Uv>3Aw|5KwV(b{5 z!rzh%congMTqbL{@M~wsosi&kyO|dil*W0Srl!&6GkpLTlJX5IPnz&RKoJ;DZnm2G z=y;Xfeqhq+CSI=fd}rD^p8fDJ`9joGHFuvk6H_{;S;GZ*XSG>ldzT`$q*uk#k`T1$ zo1Vv#dYDsZnNOmDcU`TiFK;FjvwC+bq6l~r;AAwU@8CnA?gLZ zGBy}&neI$Z(~T8#&g$szf4(}{*E70!Ps3ASYl~t$lyw=~R%fp^gtd1(Isg2#&fct} z!@IfiLEA1_^4cI7n}xHF$%pgZj)BS#eE3R3{FN(B4GK!em?Gu4CE^EP2^^$GTThVN^{Pck}Msoe?)82N!P- zIeEVxVX`Uytr497Fly7=L=HLZwa;3t6R`VNo?lL#^tN1oSi0&f+G_o(8%mLW^$l-6 zn91v%_KjHLF`TTJHT&7!bNzl#Z$D~II%EM_@=+7*^_5^gq?+Zw+(hR~(Dd=+;~k$K z`ks`IOWidLzdt4176?7GJy2k{G4cHLP*+Cd|DWJ4xbC4GGygw6^jP45Ss0@eangs; zrckQrx)%-hecm704wmkYNGP3%+S2EZjh&c(J8Hh{uZZB{h?%P{biY2MbnPKSjmrdm z?l3n517rD+zgcrQ_kTEIVLMaoMt&FQKTztwzG)ZPcmmZK$WnFav0lmw?9|0dC2TQT z;4n`QW`d}TfnQL7>1zCZYlyjcwI;<9<7b`K!qV<+7TX>S1d|`hh1b8WY=(%wD`@WW z(?{k=oLa%e0l5JMU`N9oa}Qjc`O{s`ZLFg0lOaFa6Z+k#P(lJ&LzL~aj3j@L{-#^D zwv_RWPo3Pt5$#DB=k~O;esVZh^cxXx>+3+#{c69D{>9HFrhEFv7hp$3HkJW#7Je*3 zwUeP1^>zDXOsP`oq|uj|6_`ISkDc*5i(VqnB=8c(IeD;>%t2v3JDcL%@5La;pm36J zdh<^pHSiNmKB2Iuh>k3vc4;{_gYBrea^Bt@^Ec{5{o9L-Zn{r#K&mgJeA%ITzC-)h zz%c3K#J+^Em1*>G({2UGo-I(-sU;+=3=ApU&mk$WVHbt>;DE2^WC1|v?(DrBnsTJS za2U}16LU?8aTjL}tcR1+v(**qrM)?V)1;)_x&-HzarClTj#evItMf*xnyg|2umppi zAGiNT5%QU7%8bI1R@0ELoy2JUmZnqW(?jGT~vT(fuj7S5>rNDBlERK@vg-@6hMY^(L=?=Q%G zB>n}Pqx#yzp_Ss-Ms~Da&`yZZ#^m|^%O%K{&ED)TRJF z>Hhu07k=?_^5Y3mB@*i^fBDX21N41tY##zWwr1J3Ynd|WN5pX|IJ9TfO#?hfiYX5W z=aPSM!4gD1S_QPR_wC#E;}hlof}V|g&C$a_Jx45XZRvaRXSSwigZfV{&mVrL4Y_pW z9l|xPIr~d%5#V#m-z>#*^+i2PMNWJ%s`0KGrSU$`rvca}Lvagql}C&JDXB1OM?cy;>q|(WSEvrDD<=~9p z_tk+~fBtzW-0+fM>Pu!`S{fSSdMODs)m5pi>!Gvn=Ll{WZV-C|VYew*^5%N+m)5M@ zAfUmnd%#aQwSU}n3kWj$QCxrG7Mf5wq{)$UxMfxk8O#2F7fnFhr8TiXYKn{k|#T#lAI~V_A@ieD>q;9=g{X znSa2%HUl3`Sz^2X+gbWMIu8E-aaYTQN`$~Fj)8;w7zkiaWBF?Dfv!Casxxt?NF(u%(#EMDv^+n$Wh3k|%s zwg0I8Q+fc?Zy*R+Sd`Rj9OU4$lz+^1{MTn5d-<2=jGa}43&Fx}d}@}7A^EbsU%ciK{L5M3=Rq$fN(^m7$J(}m;K-mS49%d#1N^!F!6wR~|G06d~ zy4d$D7noJ_W!*PK;sMmQy5%?)BaVzyfUt!Hm$B~-a(km>DIS?`Q}~CUW$;>?ER1`= z6ZqbD9jKg+jLNY`2=S>WxWT(`L%&!un(&KnI?B}Zhm4}rT6N0FjCKXp%3V90j#y4G z*pt4)7uBMiC;92OK2|dT7Zm5&M((1WEM^@UKT|EPP>k37p6&)@GneRDySO(Tj+QI%CUoc{bEyfC&I%K~+eBJh?xiWr=_$+jzbA(%-HWTF)A1kR z`6)j$8z4@gb2~D4GE>5Jc4mrWlVj(W$6y!7auxJkBSy+)(xzlG-K7WvHU9wdt)?;fSkSIkeF9eR%ur)5t^%@ zOK}=ER(ThkUGGqGninCj_TaPWD2k9X<*dQKs73`ZTISUTHHg{m-q|+OoN7}p8Jv}B z3Wv+Ay5&UHP~u{WaB-Ff4Q z3)9a|N>`343f7|E9v~j>)wC-nNLijdeQk@O@bNrc&3L0?)<)_ihMn=cmIx-U^7)e> zY*P$)C|&$T79UF3f-tbj%i3t#EH}4}w*=0Q*4YzdQ8+f72 z<>t5cAgUNxdk~g4d8xr=BOP=|Cihki$sWw#Y;3C6kvl7GQtJR00w0PFK!@J+a zbtV$vTbtvlk=CO?@I?@i$&to>_xzB*E8dWRXR;dsu}i4*Y)jbEd9m3xjTG0owZkwr zYF+zT!NE3NhM7@fFU`twYksVa!W? zA;*H7`IVV_?tK$&S@Xebmv0L_bPq4;iKz0xXafgwFcvy^jMBS`)fkS?`N&{_Tr~^` zAZhINciR_7`yYuC3wv_aL^SOGc>^ASlsI=vOQC5ie?{x_>Kap|tqEq@`n!L!okBGD zb7x8LX1?rDFtHNhrLyc}bi3BOU@;zQ>2o09B3-!A zYgAFBxC*l}1|xwVzQXg#g(M9^J|5#^s*7N?rdObGn0bhn7W8>6Qe%N#+d1D(xUiY% z%C-OPLzFhadXA|(me{pL;~MYcZ(OaoADFCM!p6-*E3zV!mjN~LYZD_H_Ai19O?UyWFYlI?L(8+Z;IpDwyb)b%v~$7?hms|TuCCFhuC93xhA z5K2!GOP0k542(wmhSYVHV(*Mg?ci^R8NwU|zt|hK(V9^=FXb705o*#=9FOw&<=c`r z4qO_Ft zW7Tz9HSpya8g?H_PxndNO~=`u8gtFA(QCVT#Nxi@_3nqsYTfRkAUbGlGK4tt_ZYG6 zB@eK!zo8Bau1NxPrB>~Y5AC@{@zk?OMWsu}(m%oK5t+l(x;LjtFc=~kj9m%aPsj(D z4I;$ynnbSoN%EZbZ?q*tku-xNu%4_PqzkCE9Jl5+c2b)2e&8Hq@zULe_uZR^oV?Vk zz4jH;U}Mt#orDenpO<%US#Hw1%TQut#5Z}bT{BM8+AS_F_TRZ5Y>*3gp^$Ta8B1TK z|D|7N9(6dg>KehRy5S{lb3i$`Z`>>>El(Zyo7V#tP!miqkEli zgg{ro>zW_a-HwkPYlFxec4YxrlPO}s``|fH#m@gU0Pj}WGsdcE;7C^z3VIfGY2tUB z=R~xY$_K5jc8gVJaX@?Q88?4!!iUsxmwl4BbUONGz(YxbqifUu2pVoYk8j5XY{(&U z6fvf@xMhAnFqOJIq7b@e=+CkxK43K>r zZN35}Pr)}#CBPxfz>YF)HZ#Hnxa}&{e)qiMw*Rr94b@E9;Ohj|SRSVjNgdR~&ihT> z#a9$2%S}B}8ERP)|KL1SeZ&^W)!$)fmW17*CVE|1!8Laj6!<5U!A;0Fx6XQMtu_30 z?j4Ay&RLi9?YF8PCNm#I1jfxfxvkDszb!2ap?27gUhe*Nwfe{H1-Vt%5?+lB*!16-Uc&8+U-VjLHA>fW+-!;*g#_#d;~^$4Z27KG=8MbaIo zTwLYo#q0JQD!**+sS2zlNvPnRxoT?{(H3ltW)-B#WkNeLdu+~+GE@it? zBF6L+@;wCKpR(rdoIcMor)xq5ZIZFIwCi;KdfZ5;9G<3=24E6saG8$Dh0%Kp_J@L& zLcRjR;~C27t(PmgPkUz{hs?0%O%+I84e2)tmtY|4Q0xMGp=I>?5lV}!uq<4T{2;Kb zyeKHjm1ZnRclrJafs#Oo&zI8U#d1KpMHqp4zk+HU6}r z6}Z(-aC;JT1ZS{ZJjpzg5iPsaqcC~iO-)i{ypd(d~>`ZIv&~(TpTsSi~JF}OoMA&+#Ot+RCl3W ze*@L{>Y6r+<6eH{NPUZ0gPG`-%_oD5R?5cHs>pe~)5EdSUTrI|U2;mk%=xS|r@L#0PH3neM8!}i)YsukpS#j;T;{uE-*DAzlxY7^R{7w!k+qdRTL?Ax zo!#k<8mSz%!V}}^H#zA!WJh=qAIJw}Zl!5|IgOgXDJUTZmErT%5BE-VHJ3grO>b|J z_mwa1_FbrvF&7W+fR;m3@*)Ig>%$-6^-Q@N&=)b2u5(e#viWbIJ0JE>ed;_yD}Z`h ztI6g#1bTeH!Y1&$o{VEN0hm|g5C5TVkpy_HF1Zd!`9@0L3$Ec~$7eswwVXxd_Agp2 zCL0hAUUSY`w0Qf&WQdpx&{e%rlVxAzSum|A{y<6^Q1AHtF`{|*_AMt5&-HH$9;)if z2kC|61Dzop*j;eA=`9U;jT`TvoztE^;G(^>s=Wce-H2V>=G)B5W^vb{{0*An`uW#% zUhZ7L*T4b2twpl#-fhJAMl77eX(0{%+mbnc4OHYpgqj8}W3pU083Ju35J6;H!?dmMkMJ zN3`JpJz+y!>5JA;_2zxjqx||&ukI(wsa;&gCSRR!oo>TQzozh>wQ2Kqb9@2qW*cd_ zpxr&ZrFFi{3um`5WgWK$cJZ>*proFK(Otz&>nl==+0}ZH7x=v!jO?9jo*oZeTDs=Z zIpW6%m>KBnx3QoC;{^!1vk`c4&*)tln9Rm8cE#`aXv$UREj7Uz+#^o29#ND>;A)I& zUyS7SbmieH^u=25Ic|?94&Gff2q1l4I4HtRNj;pEz<%gTDzMo1e5BY*%!o<0_6x4g zo_p2F1$v=O{|HpY$|NIGB#Hdp4s!cZ@*k=w&^>ANrZru+CB}bYElrZ zXMLJ~>Q3uj@mY4ZIb%zc*!KubWV1qWE0L~Si>qWp552$Vm|6N)U)gi1AiU8B9k$Vy z5YBo&r5?(Ue15!Rt}u9<36827H)=MQjuB6)Iloh9oZhf^|4?~PezjG8t4Q+;rYdMp zV{pRJWiOz2aK&{}ws)l`iOgW!J7+_54c)kT9#k^!BN2F9f>g(>=(#mYQJaJ9**{2( z2J7AyFFSc>mcOhudy>7EaP4D-n~waUP^~8mcGs6#`wWAqA{>ULj*+`3 z&+*AChwh`;KViW4zoX8M*CApegDUi#oV%1ejP81fB6_dUxRI6Jv^y-B_Gn0ZB>24n z*VXnZT7VQv)|+56M6cKTDsE(5-(sG7`|ceD&2V>D} zmsp8ZhnLxj1W`qfu(QE5(o(^@(it5#!&-3fuOA z(|hkJu1D%ibNS5d+^buQ>a1$_kq#04^#`o99**}3mYA|XD}i$l3bT1=D|%+8enn0q z0<4=_-`6UBTo{*OYj&)?Am*GGV2juR6^F|BAqQ5}f%T4sS!W8LK5?9_5Fe6^X$TEF zqeLHUR>%)NrG=L6?rt^Dh^bqjf2QI`S=zoAG~}o&yYc(em+<@5D^pPl&mImQZCYwr z6n{Cx$ocvFkFta%#jS0t0Lggf%^Z!81@D|Xxp*!40WyX7FN0q+1ONKJ0bQz0$X{}z zlOg#RajBTdD3{{_VG$jOBJNh{L9@>~6w}Bu2cif@m6|(zc9Mt~vV~+)d-1zNwlF&X zro+}K`gB`yyrV~gabCO`eT^}CpB0zsGAmSvz46wH2#7^lqr8)`iL_7+5^7lsN9oqQ1AY)iQEP`?!rm25G=g)^Y z7X7+zns@YR52A!L;K7oPOg^*zk&yYc|XLjUJZFBdU^JT`Izpl?|d-` z9l8B`9UtOSsi4&A1{>GrUC|&g-?rQ|j?z~=qE>GXy!4(zE*ty`b!*e<=_gw6&Ro}U z#~!l$6ik&}e)$7_rP(d$ZQyqO?oh?^+3{8*gBROK(*~#0ep3_xN>9Hn+V?X!OGXX; zI3RY(pHf4cAu&~0)&L1uEkaJX*khV+&%Rq{5P4DXlM6X#2D0ASg6K^iD+qB}O+G4E zgp=7CHFmW3=cJSeYMMDHmap^JLkWT()j5*)c{YQ=V3!jvvIyp+n;cMJte>nWB4Zin zj>WH(Z|jKvPkp?9RVIYb#;))iFwK{N(e%g*2<=&uvg|RA5xHLOYUk=oUF>YrmGbyG zqxIBk)kAvVFQ(Y*4cy7jJ$qWHxF6N_sUyv$TMW{`eML_iuxCEQ7n5yG{x=N_Vn^0Y z{crHpP4|Ia?H*9Zld?=+8DXHd(EqYd=1;6l(Y`7;>`MD{Mz zvoSQr!;8M6T5h@Q&%QnUlFtJ55?Jm&R!>b}FHKCc<@n-S0>2;ejA$HK9goDkk58ea zXElle$-9{T2%P4RP6bTHl5rrBRp2{unMh{wB?Idj2lrPH_9n*uq#5MS4DYG*i;n8P zhziK{uNh@{oBpf#(Ov#*iJ1;Jl-{Us46XEFZz$CMWxheqs%!DL5yl+(U1ot z@x9m0ltf3_pY0)J27E#=t{n(~Y_~P4<8YU&d4K(t*m-Au^oktOd=#DF0Lx;SBP%^U zf_O^Z#ME^2VAHRSGzmOWU(ASSQ3Yj`U*a4I33xj5ZvuIi`${|C!3;(8^^_0rU3sB= zY0tH1*SO3n$P)?;j`(-7@~*_kg|G!}4xXIq-RpW^nQ_rS1byrI* zmHcqDRl*S?0~Wl-dd8fVtkN@r%(I*P#<0OZ9oo@HZ{f~3JM>pMq<$2^!59?`QlI3+LD$R@5XcAU7L2LUB`V0&IVK`YQ)@* zW0N{#77kr54xxG-n@_>y(gMpCT^2+H#UgvVC58)xVU7oKmyq1NP8dMC9W|=|kZvo! zYV6>0!?ormf4sEMSoU6eL$(E7=X_|dacMbm?WsaH$hBhDxEos99Q z9K$`O^1z5huhY)c-5)0~B&HO_MoyNuS@xuTO*Y&}i=cJVnKe!lv><3Cs;FIBe@9P) zoiqEKOhG_j^!p_s&kO!ztgq~Y8~qbuZ2GDfrPP{b@0|^{ywHm!9R>^TT*PwB0ZW@F zs+PfRKaez$`N#734YC+;1ww;@+kXcm4nG+3_2{YI<4hnGbgX##7C4UQkWs9Hf z4kRNKTVW?s4v64bJ{I9clGSA4C^=x$fTKQuDLYW_UUB;EU>branYa}n63^MLnFbcC z(tBUzh_P$eNa}0L0&Oc@zHeaJk4bQqnA;bmdlCvTv5gCoPQk450`#Wm6_o=iJe~uFJMxLsSyP`M>Bot2@M1pq zTEC(V=0o&Es{5V@!=pYg5ooEY7y${RUF!PJ@y3yiw?V})1L0tqss++$-edPr$R3_8 z{^sAXbrv^X%o*9O7m7vBxOsx+4L~od@!q?e4tcp+e_4JeHPHc+_@C1dAR1KVB!%>g zf@2d7Hn2_*5*8L-9TZi6-`9h8`%~m`bq~ZkDPafsa*j_&3eN6LCK*{;Co;Z_z}@9~ z078^m!O`D>X7a#L4i2@Ym1@OQ6uMD0TGNG#S(G-f#$@s%`Si_NXi6~1fJPQoFPv{n zrLUOOw6l{et1sQ7+?CVdr?6H~zcM{!1=CwE@Yi+_+BKjRW?#Jj?7Z>ce(9Gia&7Dy z;3sd4zf|kKdm0t`^1~$$bcgMIITtSPqgjKS@9Nlo>3=e7k6lP zst_BT#}-7+kpwovB<=YBjX56o#xMh(*(`#S=w_ZjO1ca_BCrmqK4r7sH$Jh>zOm@Mp;N4Ujuk=q$E|a~6{}#qp_v`$UBk=wL5l!BQ1PaYQ6oMpb?t~u9eg(U zX@OU-M>*i#W*&Fncuy&l;`=PHcOslEEmg)-tRH(eqz4~M=AuXL{hK0aVAdV-4vM1l za^r$Nnp{Y)FB4Aq@a-~(`_N)qC(S^)186m(XhNK`@ayjFg+ph6&utWs^=qwEK&gGn zI;b5OhtM(O3t%8|DvGlvv z)cM{(HbX&)iWCWfu0ZU{rG1AGKB7OL5PQvQZM#)lAS*cY`K9?`JK8jLM z7hpPHH}p_-3&~a@NqQ7)#XB8z>AHC2GE72+lB07?6q9m}6IT6}=Xns`yPyNVH-W1w z&pW(!+90Dz+p9o0VrwF(U;?C0u?bmUk`z!qSyfHI`^0>Nc66@gGOIlH%g$~R+Fpjj z2hOGCG_ISX`A2iMA@G2T9U51LhW7}Aro25h4@e}{f%XxV_Z#o5c7528W_P|DT3XSa z_24pdPkaFoS7t=lx3OTdfy9b#yYypDIn`5^H|L-@JN(bdEL*Wd)<$4cD&2dw)y4w+ z%vgvSMZIEk*bv8Ie?Q~8$K6Zmrsp<#3!2YdP!HYu1vQ`D8>f;cpI|;Vv?}xUTyF*07 zzbJ-hr9L0?VJ3IYLE~|6fDK8`yY-`l;V~KNRhgR1d8SSC|XHM(D}kZJTEeq z{5r-GxC+Q9oW|1sn`iK@!aP&a?rn=C16>D{1`|x6s!2uQ<83j^b8Eh$^T6^YcX^`R zgDre{)s(=Sv}5xMkr4wf5Ks_TMih_X10iEVIn{bw*_0dRw^yJJ477&Gi_%Y3@Du){ z3B+clkrOyHy1-3@m!WH_-C!92rUuiCgd6(sH27aQ(?`6(IMoF(+`ptYKY3-_+0|9p zE;PLU-gb!`kTm zNIzQSL+qj5f}$mXg^_tA>yy#M=2yUff$GszE{!iDjvGL4-d{n7nRQf1u(^#@V!X?g zX7MsE<}i#;S_xJt>k|`8|8J0A^_@1g&nx~@DP>NV<*rD(&X6j?G_ zrHHZ&hRc+0kv5clSC(uO!l2d2S}IACrCUN#_9X^c%QACi-$Kk}O~`KE^BZpU-uJ%u zkNctL_blf;=Q-zl&U4O#KDd@x(e5+iTUPNW_n%To;p$(Pm3y3>;If6gNt5J4f!9iy z0w{BtcRQP@P=azZ?^uNse^sWkb<=UW{yb!xtLp7A9chCKLDAdT5i`g&gH(>p)bxPKn}7M9HmX{6r|9PJ-m3$OeP zOgzrWQbI2M-gQCsBl=SJ=m>-bA#6tV8<5;)2oCl2=8`Kdbk~_q1%R}lZ^`sTu!{I@ zWN8uMWs&y$t>mR1htm6L%Q;ZaL@|sLJQk8;?>R0hzg%W`^G4uf zh{%k?%FzMm_na=v73f`MJhxXW z`5;id)^BM!O;+UZh8)h$qr=%s9rL!=7gZbe4`;S*S;R#FJQr4($^T1#sCW+hzT@*2 zRGO?wa`Iqv%LjvE{xG=Jz5e0_Pm9yUqXFSyxa@@l9@8QB(XG6Ko+tc5HCi1fh95<{ z%2?r`HdlXWlQSa8gnSK(mHhG}Hr3bE_`e-2Nj%fD=Ic;s?VDD*MMiBJMa;p0`gKX` z3!TzC{}^JgB^=(0Vyc@|Z-b{h-^0r^s_(9Mpt$8dbjh?xi=%&}4=X?z!ZEu_PhO6H zUv7IDqRHA;|GVInR$wffxP1{drW z&O*OpesJw50yN6m?eL=QyLxg=PEiS@u0Xaq8>+R{|F()ryj^#4=jN<j}}vcN()k ze{89`wZ=D(UZ8zs!i7}-Vx^?BWxEO_8-sB@bcnb<(CMis4*+oqqnP*WTm%7uzH|1K zkgVK4Mz=BLkUKD%SM(mo#bq~dQ!(buJ`Pehwym4=A$NDpd&Sn=`ot80i7rs*t*#LE zMFcFQ)gtyi_*sGv#y4tg)cmi6Yn%4?*EjeyNRBKg@&g2((UW13n_rE-2 zQz{z*sUCqQ7u>2pUB58YjNAMTDbaP>t=y)@x2ac-p9>O-CQ4n!(`NrkK;_8;X@297 zC~(_e0&YXN4g0)7CWE)Md5zrY-}IWV6Era-0y49Q7A@c&>$=T7n zImQ@XYCtkhzQLn3u?KGpCZC zZaE$Obrtb)3KxB<@qlz!b*yUIqx%m)Jx(T@sP+5HFFuC7}sbQ+dxAfOT7sy|* zh@%86+;!1%O>&InR1iuM$DS=OOnmXwGxgOe>$Ny(ND0t_M1<2RD%0>b7?OVgNxor# ziH9k2k-T|&-5-+R;>7p0ZxW%soVYhq^qtX^Rth^A(#}y(T-|coc&(5i{aN7FZOFrc6GP%=0VBG5boGY3kBwL5ZFk7>bWU4y=!%`j1#YP1mm02 z%n7&NO#yX|qSqR+L12GBecGzInhvoS*Li(u?^Gft*~UkPrV_RvyQRe{S2d)b<89?Z zSkKJlLg2f8Ee+aLVx3kxQP}`Se^eX$Y@jt;Fa%Q8;0;_;`ptuNjQKPbw+f|lkGiT4OftyLyFb%y=IpbF&dAi{xkVSPg`0;} zB00-1wd|eCEqB^RVfgMD^yF|YP$4I!PJ3ADhSGhz3sUY=TxC8Q2W?>XdvE9%)AX?) zT-2ZT>F$<8D}C>L3qC4FPByBF>@~;%01Ym%PJ-En(#i0QwrlB_9?fv zBUS5D^T-=VO%su2Kj4j{__4CPtVfQHr8Tv4KhiJNaAK8v@b^8rduiRH=WP{B?Fkd& z;K5eEZYzh3W!1)4Z6oj2nL^@6;;LsMeddy9+^$GxFyST;s$C*Su77ICI_x`*pHY(7 z-hH(X?jn(r{^GNZOI-!dw-+A;_{N$+k>4MhgjA?iPi9gI=Y#Hk$>&vG8XAp$`heq1 z(c=@xc=*(NkFc#zd$c`{?}WNrki`wGB9~CSn;hqn4<%J42i>@L6n_){L+WmIxxDb| zZ%2YiGZDqv+R=fJPO$&k#FyzK$G@NWV9%b8uTMumSbX}}+8N!MYLJ#P)I2r&WX7&l z%JsyADaE0Tmx|9~U--LP;>18qV;^z9fzv^M_;I|jomt?1$bW=) zX?~F@N|~5S!?|=#9nn==qpAud9^;D z?s+q#MNc2Ek>TF4*3N>l3TfZbJhJh0pRu72I@fQ}DqQ7Jj?!S<;|~sY z3YXt~D`p0==!d6V$YV{X92VMCLKLr-3J!_+eq$OEN3;6+9_cCOELud>K9In`r)00O z(SjR`c~@w=pDK4JFIwL3s+k_^D9XxF7!ac;k7xTbUl@B&wN`i-AuM=Q%;^J{ z@77(z#${#TB<4=BW0klWBeN%Ux3zM3-z1&P+ufq+cm0(pY$XC$Y3&-#Oy-p+c4OW zhVqP@u`XiHsD2NX11%Ep3Qst$I@*=@JTB2PnF5zKD_5LgZNA+c>jqQ|Cujl zoW&*c&&~Y4E{Rb*r#o{qZUl&)c3x<^d8$3nY_x|9vozf9pIMobWW_I@zxrG7G>?p9 zy_ur>g6=&v?lLc(U6G1Pc}-W9J9O}A<1!eOqZKZ;(h^P1aaRjxSSU}U^9H-}=I(|} zNj?^!|=wH%^yU_ymQZnisDoHJyIe|kS1rq#m6c%VRItLXWf=#Mp>c2FmRd)55 z|Bu$#Py@4B`*FLazojXY#qIR8#Y*S0aKFj-sZsfxofF3D$jbhLo}&vkcwtlZ@R!rO zurkJK-b}7>WivIg?xLJ$R!7Xm-UacfAMFBK%6+ud6Yn(IZ_a4F8zl2)Gg{>Hw?gI; zZ|~?dQ?eJPZi^~fNb4P2=rkkwGe0!MJL3sEdI>IE{+1ktJ1h)@C*u;3-q@c|Cr#qExylGgH!K z^JC2Irc0#;qs**ru}j(=Gn00`Ek>bfdv_*qMCjF$cu++61w?ukVGvEbmOV#eQ2d6NqhH+F zTIvj#Q)=NkOTEhD(*6_OWm9(kKbFjxv)iOqTz*U`^A_Iq8y_>7tZR3!h@wpHD})Er z1<~X)g-0i^@YhD4x_hC)I9IDF#e)(nf0bP_WiyQ}P8WlH&Phn#2s1g-d0b|ezJyaY zD|CBHAT;%s*E1uzH0CPwN__hYLFJ{S`R+GmHpygHZ>H^SG{ZY%ng;aqOlB4x9&`7s zX~{4|v!mvAB%HPUp0o6VelN*6BTg}!rMf!n zhUxikl>mu^4Cjei72Aw)oK>!ATHoYkR};lgo?MajYFlI`Hjpd+DaIiebH1il`>??iOp8&j(k4;{TunI{BcTyok+cXs2PYM3CGTk zRhFwD9YD0}(jGK9eyclv+9pQcp4jR)Fjv_(Cnr{bl+rK)UEyj&vblu|HVK2(6pxGL zr(Uut11(K~-r+Hzo5vH?e;+b4QP=nZ9LcU zmO7Du5IjLN@#0ReLQ~-E-CJMoUXT(X`$dpoK?wN?98U0~Ee3l^1NzocD8c88J@ACo zGYdK|9kh4G&iZyK2|Hr)Z{f|2Vn~?3Mp(qX^ZS@-kUPIOm=P^^${pBKN##g8$J^|$hPskaqq*J?nK-2b)+%(<+iuQ9bCWwF4=bcWMALa8ruw_8BfGbQXL;cYlXCY^6NRn zW1?cf8*?{8`q&Bc@W0KDspT3|{!P|}ZEIRl`6@6VC_@5nO zhCjESffl$|c?{2GUQ1uMX2B~*f-KJw)rSWrpQ-StnYRvgf~2=^wH_xuP`xR9AAyQ?!uz1Y)3hUOMT^o`_}R*MK%;> zWSoE9ti0%{xP{{tV^QV#ms$I-ITcn^dW@p155>lo z5!#5Z6&+jwA&!@@I51!=US`*|M~U=Sd=A=I2AUC1K&3}(?}AyL*|LU4Rn)-Frc~sM zzt3qLODCP&3z)$XKC7r>$p9)OI*%8{+n(=;7?P78>loh$`-L#LQW`4r&un ze@EAbVf{Tl4=`pF`9%T_f((1u$VQhDWLu|gsAp1~0bWp_eU20apE?9?nPGyBkbRD2Yd1f0;yCELL`!EiSD0fjLVNp;`edSno_YdmPWT zT>`e;o{_m$YWde~$YP{+{A|h}e8;}h6r+QWt+geqeFUE3E*yJtA7(fTyF#EXZcbjA zwKfpl3C+g8jc{CV4FiqA_5%}TVHw*c)>Yr%NMoz2g6}pqvU}gWW&I%t)?*FpKPqsK zWhd_flb!T7Ag6#u4D!3+Z&PNTR*lm-f9%DRl_gl8a~GeToHRY8bG9eBN*y5!=x`d@ z@vpBO#IJ&GLf9ToLb}4nx3^qS4}TM(tppuHYKW++WB5cCWzeRZ-Vh*aAs+1pKMS&C zepw(u&!I%^=xnN`8nVCW0^R~7ZEa02-ON@T2_zXmkNQ8|lMJWp-10VwqZqJ3#WvpS z{x^+5jQbnKQB_qltBT)y|BL?L+Kv=*O>zSt`B(S|3pyUe2RvM0H@A}hzw3(ev6GD^ z%n75}18}e~{P4kFjJZO`rK~mJMCtBII6Jt|r38B5*b$JxG&WTYd?Jg(Sp&F_{iQRj z)SY1-oy4=iDuQjsGsH?Quy0L57K0|Um?TK~#lQ;bfN>%GvOsEpz8GJJ7>Iw?xiztb zbGaKQO7Nd<+-&Mck#2(LSltZvX*_w_Ack% zI&18ucY&<^t6N~n>Pc?#`~TJLy#fQw@Xa%Ig&>B=e*a>(OUr68s>IDxAM!jA>JZ@q zd%nDE9)ml-x&g)s3lCQ&-Uiv~Mo9fK8u9{#+E9w*0xWNjqV^>adA{RH(>y3a5fKs3 zFg}=!$Pf5%nMa?${k4{X*4WeEp^UOV_Y>9sL*4s(2ja9GH5jiZ=-lyr5^&J(E(`K= zJU5&#KQ`g8`)sP1-We~^hD*~Qw`d^R=gmoeU< z3P}RNM{4Ne$zfH#xbSk!+*L2jLR@j>`Ig6rh2jz>Kyr%k3Of8B`_p^%zyWLAO2OdP z#~&7WUTyJ@Plp;dd_6v-lA!e<5Y6WGsYKrbO+GMphf!-U*mFb;C7HBY9K}M{_F4oK z;|7UG#+PexG-agYYbj!Y&LQ3xBN9ro^xT!FQ>D#O#RveGapV%AO5h3kaLRs)QWnV4 z*{LX1g%hb^vJ1KYDhRLu?R^jLj8dG`r=Is&}YR z*&JVo%h6(91U*nZXec_$?okrWxSxFGg%oP?Ywt{BzjBlP6#<<-Wg+zq&yr<8OL^~) z<5*L zPmV{>%T`XuT3DDH00Y5GTTt(1+G0yrW40>;);fW=<9_^N{OBs`ofRFMxh`OF+mx<3 z2RedG;>p~ZAjgTpQXe9%*r z!1w0$W4nazg6TgXM9@+tRacNnA{ik7 zcq*Us_oRuD?a96L&xM$Ij-k@M+?jVOn9oTVm{( zF?GBZPq0hiAUZI=)$Onxd_6_8$0Q_)kP`6&WAE>fAg+Fi(6D`AC>NJTKW2Wh+wqouDA*1h{iYg4_;>a|w%F@Yoia zk&$uIxo2gE#1q^}9kmf80HAp@yYj(~wjfY9h_SvL#5|+*lg4)vgvZWHY2dlML2fo- zuz?kln|AcUnv<@i-j!RnnioGNh-mh}zeU&6$^NUA5Z@u17F}Q^&8;3aDfHp z5l1dwX1eFp%%!zHGSS*tU0bOg;Xe`a16WYfW}2?<7+?jX80}rIzQZ#|f7EvbYMPtL zwcMz-o{P+Qo4=o38PKmi+2ISIMFbLg^gBP=65bZ><5k>}7uR>TPn+N_W=`J~`A9od z$Exwr5NXPOcdXN>rpKspOQfOrr)9KWWiK0z#}nGZJ^_*f%!VvveV6q{3uB?ze`bW) zY5@-D2<)iIHxIXWs&+cjF#eXTj1nY|mAbpB{S}2^v3*95!*oMOI%)y;eCP;##Yt$9 zTZV{&I*DMH`hKC}zz|NtR@6!(V2BVh3;(lxhIBO5Vmo5*0LCF&{X%Gl%Ko2>i3ked z;lQk*O)$u>>~B&5yja1PGPVOaYw@`E#U#KzD;ja%&jp-y7dxt{9>}($0#A>Sx(?|) z-^US9iI_{6r@pKskj6)~h=aKsLl}vPphyu*QT0JX7QyzwT#NOvY#A6bYm_|Y4K|hv z#)nvFx{ZQjJh)}eTC(-%`*?n;#b;!cU$B+j2yy^V^)Eo9uKx>XN3UVHpybz8 zM^^vUKxesJD|qbJz~cMZM0g;U`(FbCkzAnN?l3l?mvQUwW4CfMT+9)jg^& z4D0f*VG-0;HB%0oD8v5WO{bt~<9|2tK@;Y`o2c9j8P+Z?11}Z{$Xpj8+)KMV9&7=U zdGmMb#qXa%@G2Jfw9*$hwxCoYoxhQ4@z;NR^0+n(Pxx_CJrMm17{a-^P3?C(-E*f3 z^csRei6FFJ5TOm@gK_7;a7F07=JWRO5D30S!tGiHvBQz@_mCNz5KjStt|^A%gshFU z%A+eopsCkL;JX3R&h-Sm0(k8or*R{#m5WUzSNE4YbODhd);NjI?AUL=DTANRB$|v{ z!zc!T^HUc*_<3&TFmW7FD`y!2t-mJvdLw|x_|KJzBCB_tJehjM^q2sRjS=&+w}*~8 zm*|P*Z}blf+&e-*&4I_la$(VAla17CyI013umU;4;ARvzA)LI!Ktc56cV8nxekaGpBP;X%uU#g3BPMRgCDsroL z+lQE;V@RTUfIoXwz$ypsX5rV<{T4hZuZ?|M4$qiy-2vtg$|Wd#Y#{sLP$Ut={+t)KkX^6j-gyw?ibqY}3kU5n0qrZG7UnSahM1(NRMCFdqt&&^2Sj_0hE@ z`A#rHeOnd=Ta1GsTM(`b&lS)HYn&3G#ay}hd?!lsZRFbaHgCO_t|j=c4!~!i4t^TH zmwH={CU~dct>+JY1RN&bXW9Rma(Tl-eXt_G#U#0#hO#>20`w8eL1i6^5h<^(K0I=L b-=e?Co_jA+UkLl7;J-hQoW!SUm|y=NA7xcL literal 0 HcmV?d00001 From 0226c2b5d99a7c9efa4582b9ce4b0dfaf803762b Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 11:56:27 -0400 Subject: [PATCH 35/54] Fix deprecation warning from pyobjc --- plotdevice/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plotdevice/__init__.py b/plotdevice/__init__.py index e839706..34de85c 100644 --- a/plotdevice/__init__.py +++ b/plotdevice/__init__.py @@ -44,7 +44,7 @@ class Halted(Exception): pass # special exception to cleanly exit animation from .run import objc # print python exceptions to the console rather than silently failing - objc.setVerbose(True) + objc.options.verbose = True # populate the namespace (or don't) depending on the context if in_app or in_setup: From 2e5635ed16189fc8b944566644bec7b3f537a49c Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 11:57:28 -0400 Subject: [PATCH 36/54] update module providing UTType* --- plotdevice/lib/cocoa.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plotdevice/lib/cocoa.py b/plotdevice/lib/cocoa.py index dd09233..a6962d6 100644 --- a/plotdevice/lib/cocoa.py +++ b/plotdevice/lib/cocoa.py @@ -58,6 +58,6 @@ NSOperationQueue, NSPoint, NSRect, NSRectFromString, NSSelectorFromString, NSSize, NSString, \ NSStringFromRect, NSTimer, NSTimeZone, NSURL, NSUserDefaults, NSUTF8StringEncoding, NSWidth, \ NSZeroRect -from LaunchServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF +from CoreServices import kUTTypePNG, kUTTypeJPEG, kUTTypeGIF, kUTTypeTIFF from WebKit import WKWebView, WKWebViewConfiguration, WKUserScript, WKUserScriptInjectionTimeAtDocumentStart from objc import IBOutlet, IBAction diff --git a/pyproject.toml b/pyproject.toml index f55cdaf..6b97df2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ dependencies = [ "cachecontrol[filecache]", "pyobjc-core==11.1", "pyobjc-framework-Quartz==11.1", - "pyobjc-framework-LaunchServices==11.1", + "pyobjc-framework-CoreServices==11.1", "pyobjc-framework-WebKit==11.1", ] From a119caff3bfaa82ff238df101827deac42217080 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 12:46:37 -0400 Subject: [PATCH 37/54] set exit code on script errors when running `plotdevice` headless --- CHANGES.md | 1 + plotdevice/run/console.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e5f6105..59a9b14 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ PlotDevice 1.0.1 * Upgraded bundled Python to 3.14 in app * Added precompiled wheels for module installs (supporting Python 3.9–3.14) * No longer requires Xcode command line tools in order to install +* `plotdevice` command's exit code now reflects script errors * Added support for running under `uv` ##### Bugfixes diff --git a/plotdevice/run/console.py b/plotdevice/run/console.py index f3c4ab1..408da91 100755 --- a/plotdevice/run/console.py +++ b/plotdevice/run/console.py @@ -101,9 +101,12 @@ def openLink_(self, sender): link += '/doc' NSWorkspace.sharedWorkspace().openURL_(NSURL.URLWithString_(link)) - def done(self, quit=False): - if self.opts['mode']=='headless' or quit: - NSApp().terminate_(None) + def done(self, ok=True): + if self.opts['mode']=='headless': + if not ok: + os._exit(1) + else: + NSApp().terminate_(None) class ScriptWatcher(NSObject): def initWithScript_(self, script): @@ -172,7 +175,7 @@ def invokeHeadless(self, method): result = self.vm.run(method) self.echo(result.output) if not result.ok: - NSApp().terminate_(None) + NSApp().delegate().done(ok=False) def runHeadless(self): self.vm.source = self.unicode_src @@ -203,7 +206,7 @@ def echo(self, output): def exportFrame(self, status, canvas=None): super(ConsoleScript, self).exportFrame(status, canvas) if not status.ok: - NSApp().delegate().done() + NSApp().delegate().done(ok=False) @objc.python_method def exportStatus(self, event): From 8338229860e8e13e5a5ea8e3bbde91e3a23e4b21 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 14:10:07 -0400 Subject: [PATCH 38/54] replace `xrange` with `range` in code samples --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index eb17b97..c48fba1 100644 --- a/README.md +++ b/README.md @@ -332,7 +332,7 @@ use of a nested `with` statement in the final example): ```python # export a 100-frame movie movie = export('anim.mov', fps=50, bitrate=1.8) -for i in xrange(100): +for i in range(100): clear(all) # erase the previous frame from the canvas ... # (do some drawing) movie.add() # add the canvas to the movie @@ -341,7 +341,7 @@ movie.finish() # wait for i/o to complete ```python # export a movie (with the context manager finishing the file when done) with export('anim.mov', fps=50, bitrate=1.8) as movie: - for i in xrange(100): + for i in range(100): clear(all) # erase the previous frame from the canvas ... # (do some drawing) movie.add() # add the canvas to the movie @@ -350,7 +350,7 @@ with export('anim.mov', fps=50, bitrate=1.8) as movie: # export a movie (with the context manager finishing the file when done) # let the movie.frame context manager call clear() and add() for us with export('anim.mov', fps=50, bitrate=1.8) as movie: - for i in xrange(100): + for i in range(100): with movie.frame: ... # draw the next frame ``` @@ -363,7 +363,7 @@ use the `page` attribute rather than `frame`: ```python # export a five-page pdf document pdf = export('multipage.pdf') -for i in xrange(5): +for i in range(5): clear(all) # erase the previous page's graphics from the canvas ... # (do some drawing) pdf.add() # add the canvas to the pdf as a new page @@ -372,7 +372,7 @@ pdf.finish() # write the pdf document to disk ```python # export a pdf document more succinctly with export('multipage.pdf') as pdf: - for i in xrange(5): + for i in range(5): with pdf.page: ... # draw the next page ``` @@ -389,7 +389,7 @@ If the filename contains a number between curly braces (e.g., `"name-{4}.ext"`), # export a sequence of images to output-0001.png, output-0002.png, ... # output-0099.png, output-0100.png with export('output.png') as img: - for i in xrange(100): + for i in range(100): with img.frame: ... # draw the next image in the sequence ``` @@ -397,7 +397,7 @@ with export('output.png') as img: # export a sequence of images to 01-img.png, 02-img.png, ... # 99-img.png, 100-img.png with export('{2}-img.png') as img: - for i in xrange(100): + for i in range(100): with img.frame: ... # draw the next image in the sequence ``` From 1773ce087fc8011ea1ca4b90f2721116975cec08 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 14:31:51 -0400 Subject: [PATCH 39/54] update markdown docs --- BUILDING.md | 141 ++++++++++++++++++++++++++++++++++++++++++--------- CHANGES.md | 7 ++- README.md | 142 ++++++++++++++++------------------------------------ 3 files changed, 167 insertions(+), 123 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 9e8edba..14bec02 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1,14 +1,82 @@ # Building PlotDevice from Source -If you’re interested in using the bleeding edge code from the repository (or doing development work on the +If you’re interested in unreleased code from the repository (or doing development work on the library/app itself), there are a few different ways to build it. ## Requirements - macOS 11+ and Xcode or the Xcode command line tools (`xcode-select --install`) -- A Python 3.8+ interpreter with wheel availability for `pyobjc-core==11.1` +- A Python 3.9+ interpreter with wheel availability for `pyobjc-core==11.1` (i.e. not a brand-new Python release that predates PyObjC’s own support for it) + +## Setting up Python + +By default, macOS 12.3 and later only include a `python3` interpreter if you install Xcode (or its command line tools). +There are a few other ways to get a usable Python setup worth considering if you're interested in using +PlotDevice from the command line. A key feature distinguishing the different options is whether they +install Python as a ‘framework’ or ‘stand-alone’: + +> A **framework** Python installation allows PlotDevice to give you access to a GUI interface for +> running scripts via the `python3 -m plotdevice` command. **Stand-alone** Python is slightly more limited: +> it supports ‘headless’ use (via the command line tool’s [`--export`](#imageanimation-export) option) and +> can open a window displaying your canvas, but it will not show an icon in the Dock or give you access to +> commands in the menu bar. + +### Xcode + +The [Xcode command line tools](https://developer.apple.com/documentation/xcode/installing-the-command-line-tools/) provide a +**framework** build of the (now somewhat long in the tooth) 3.9 release of Python. If you're okay running such an old interpreter, +you can install the tools with the command: +```console +xcode-select --install +``` + +### Homebrew + +The [Homebrew](https://docs.brew.sh/Homebrew-and-Python) package manager provides a **framework** build via its more up-to-date `python3` package. You can install it and run `plotdevice` with: +```console +brew install python3 +``` + +### `pyenv` + +The [pyenv](https://github.com/pyenv/pyenv) version manager lets you easily switch between multiple python versions on the same system. +You can install a new **stand-alone** interpreter by specifying the version number: +```console +pyenv install 3.14.6 +``` + +If you want a **framework** install, you need to pass a custom option via environment variables: +```console +env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.14.6 +``` + +### `uv` + +A newer alternative is [`uv`](https://docs.astral.sh/uv/), which uses its own prebuilt interpreters (but currently does not provide +**framework** builds). If you're okay with the limitations of a **stand-alone** interpreter (see above), `uv` gives you a number of +ways to run PlotDevice. + +Run a script without permanently installing `plotdevice`: +```console +uvx --from plotdevice plotdevice +``` + +Install `plotdevice` as a standalone CLI tool: +```console +uv tool install plotdevice +plotdevice +``` + +Add `plotdevice` as a dependency in a `uv`-managed project: +```console +uv python install 3.14 +uv init myproject && cd myproject +uv add plotdevice +uv run plotdevice +``` + ## Local dev environment `python3 make.py dev` sets up a self-contained virtualenv at `deps/local//` @@ -16,46 +84,73 @@ and ensures PlotDevice’s dependencies (including its native-code extensions) a Once this environment has been set up you can use `python3 -m plotdevice ` or `app/plotdevice ` to run scripts directly from the repo. -## Module builds +The dev environment is also useful for doing local builds of the app (since it has all the +necessary dependencies pre-installed), so be sure to ‘activate’ it via the correct invocation +for your shell before running one of the build commands: -The `plotdevice` Python module depends on native code in the `deps/extensions` directory -but can be installed like any other `pyproject.toml`-based package. From the repo root, type one of: -```console -pip3 install . # for a regular install -pip3 install -e . # editable install, for dev work on plotdevice/*.py -``` -You can run the test suite with: -```console -python3 -m tests +```sh +source ./deps/local//bin/activate # bash, zsh, etc. +source ./deps/local//bin/activate.fish # fish +source ./deps/local//bin/activate.csh # tcsh ``` -Redistributable `sdists` and wheels can be built via: -```console -python3 -m build --sdist -python3 -m build --wheel +To stop using the dev environment and return to your global python interpreter run: +```sh +deactivate ``` ## Application builds -The `make.py` script contains utilities for building **PlotDevice.app** (i.e., the full GUI application). -If you have the full Xcode installed on your system, you can build the app (including its own embedded copy -of Python) with: -```console +The application can be built and debugged in Xcode with the `PlotDevice.xcodeproj` project. + +The `make.py` script contains additional utilities for building **PlotDevice.app** (i.e., the full GUI application) +from the command line. If you have the full Xcode installed on your system, you can build the app +(including its own embedded copy of Python) with: +```sh python3 make.py app ``` Alternatively (if you only have the Xcode command line tools installed) you can use `py2app`, which can be especially useful for quick, local tests: -```console +```sh python3 make.py py2app ``` -## Miscellany +The resulting binary will appear in the `dist` subdirectory and can be moved to your +Applications folder or any other fixed directory. To install a symlink to the command +line tool, launch the app from its installed location and click the Install button in +the Preferences window. + +## Module builds + +PlotDevice can also be built as a Python module, allowing you to rely on an external editor +and launch scripts from the command line (or from a ‘shebang’ line at the top of your +script invoking the `plotdevice` tool). + +The `plotdevice` Python module requires the compilation of native code in the `deps/extensions` directory +but can be installed like any other `pyproject.toml`-based package. From the repo root, type one of: +```sh +pip3 install . # for a regular install +pip3 install -e . # editable install, for dev work on plotdevice/*.py +``` +You can run the test suite with: +```sh +python3 -m tests +``` + +Redistributable `sdists` and wheels can be built via: +```sh +python3 -m build --sdist +python3 -m build --wheel +``` + +## Utilities The `make.py` script contains other subcommands that are primarily useful for packaging: -```console +```sh python3 make.py clean # remove build artifacts python3 make.py distclean # also remove the embedded Python.framework and deps/local +python3 make.py icon # regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon python3 make.py dist # build app (codesigned, notarized, and zipped) and update release.json ``` diff --git a/CHANGES.md b/CHANGES.md index 59a9b14..2108ec8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,4 @@ -PlotDevice 1.0.1 +PlotDevice 1.1.0 ---------------- ##### Misc. Improvements @@ -7,13 +7,16 @@ PlotDevice 1.0.1 * No longer requires Xcode command line tools in order to install * `plotdevice` command's exit code now reflects script errors * Added support for running under `uv` +* Editor now uses a `WKWebView` (replacing the deprecated `WebView`) +* Added new default editor theme +* New app icon should avoid "squircle jail" on macOS 26+ ##### Bugfixes * `ordered()` now works correctly and no longer causes the `Advanced/Sorting.pv` example to crash * `Text.flow()` will now invoke user-provided callbacks to determine layout of multi-column runs * Command line tool now parses `{4}`-style padded number blocks in exported filenames correctly * Silenced a console error by fixing `super()` use in command line tool -* Document restoration in app now uses modern 'secure restorable state' +* Restorable state in the app now uses the newer 'secure' api PlotDevice 1.0.0 ----------------- diff --git a/README.md b/README.md index c48fba1..4bd2c68 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,18 @@

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 iQ+&#PYRX \ No newline at end of file diff --git a/app/art/PlotDevice-app.icon/icon.json b/app/art/PlotDevice-app.icon/icon.json new file mode 100644 index 0000000..a324604 --- /dev/null +++ b/app/art/PlotDevice-app.icon/icon.json @@ -0,0 +1,40 @@ +{ + "fill" : { + "solid" : "display-p3:0.19596,0.19617,0.11763,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "blend-mode" : "normal", + "fill" : "none", + "glass" : false, + "hidden" : false, + "image-name" : "Image.svg", + "name" : "Image", + "position" : { + "scale" : 1.6, + "translation-in-points" : [ + 0, + 0 + ] + } + } + ], + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/app/info.plist b/app/info.plist index 70253bc..ba23038 100644 --- a/app/info.plist +++ b/app/info.plist @@ -55,6 +55,8 @@ ${EXECUTABLE_NAME} CFBundleIconFile PlotDevice.icns + CFBundleIconName + PlotDevice-app CFBundleIdentifier io.plotdevice.PlotDevice CFBundleInfoDictionaryVersion diff --git a/make.py b/make.py index d0da150..20c594b 100644 --- a/make.py +++ b/make.py @@ -6,12 +6,13 @@ app build PlotDevice.app (requires full Xcode install py2app build PlotDevice.app via py2app (requires Xcode command line tools) dist build app (codesigned, notarized, & zipped) and update release.json + icon regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon clean remove build artifacts distclean also remove the embedded Python.framework and deps/local """ -import argparse, os, sys, json, plistlib +import argparse, os, sys, json, plistlib, tempfile from glob import glob -from shutil import rmtree +from shutil import rmtree, copy from subprocess import call, run, Popen, PIPE from os.path import join, exists, dirname, basename, abspath, getsize @@ -80,6 +81,29 @@ def cmd_dev(args): print("\nA local development environment has been set up in %s" % venv_dir) +def cmd_icon(args): + _, _, ret = gosub(['xcrun', '--find', 'actool'], on_err=False) + if ret != 0: + print("make.py: Couldn't find `actool`. Try installing the full Xcode (not just the command line tools)") + sys.exit(1) + + ICON_SRC = 'app/art/PlotDevice-app.icon' + ICON_OUT = 'app/Resources/Assets.car' + info = info_plist() + + with tempfile.TemporaryDirectory() as tmp: + spawn(['xcrun', 'actool', + '--output-format', 'human-readable-text', '--notices', '--warnings', '--errors', + '--platform', 'macosx', '--minimum-deployment-target', info['LSMinimumSystemVersion'], + '--app-icon', info['CFBundleIconName'], + '--output-partial-info-plist', join(tmp, 'partial-info.plist'), + '--compile', tmp, + ICON_SRC]) + copy(join(tmp, 'Assets.car'), ICON_OUT) + + print("done building %s" % ICON_OUT) + + def cmd_clean(args): paths = [ 'build', @@ -197,6 +221,7 @@ def run(self): "app/Resources/en.lproj", "app/Resources/PlotDevice.icns", "app/Resources/PlotDeviceFile.icns", + "app/Resources/Assets.car", "examples", ], options={ # type: ignore[dict-item] @@ -308,6 +333,9 @@ def main(): p_dev = sub.add_parser('dev', help='set up virtualenv in deps/local with required dependencies') p_dev.set_defaults(func=cmd_dev) + p_icon = sub.add_parser('icon', help='regenerate app/Resources/Assets.car from app/art/PlotDevice-app.icon') + p_icon.set_defaults(func=cmd_icon) + p_clean = sub.add_parser('clean', help='remove build artifacts') p_clean.add_argument('--dist', action='store_true', help='also remove Python.framework and deps/local') p_clean.set_defaults(func=cmd_clean) From 43e25993971f2953b9c003cfe7d42c164ab999d3 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Mon, 13 Jul 2026 22:26:42 -0400 Subject: [PATCH 32/54] Replace setup.py with direct call to tests --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e051121..74dd839 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,4 +19,4 @@ jobs: run: brew install python-setuptools - name: Run tests - run: python3 setup.py test + run: python3 -m tests From cf15d6e6d30afb4c744a111683b26ed76e5acf19 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 00:06:16 -0400 Subject: [PATCH 33/54] handle quadratic curves in `path_to_polygon` - support for quads was added in macOS 14, deprecating the now-ambiguously named `NSBezierPathElementCurveTo` --- deps/extensions/pathmatics/pathmatics.m | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/deps/extensions/pathmatics/pathmatics.m b/deps/extensions/pathmatics/pathmatics.m index b2d116c..1bc131d 100644 --- a/deps/extensions/pathmatics/pathmatics.m +++ b/deps/extensions/pathmatics/pathmatics.m @@ -3,6 +3,14 @@ #include #include "gpc.h" +// the macOS 14 SDK renamed NSBezierPathElementCurveTo to ...CubicCurveTo and +// added a new ...QuadraticCurveTo element type +#if defined(MAC_OS_VERSION_14_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0 + #define HAS_QUADRATIC_PATH_ELEMENTS 1 +#else + #define HAS_QUADRATIC_PATH_ELEMENTS 0 +#endif + void _linepoint(double t, double x0, double y0, double x1, double y1, double *out_x, double *out_y ) @@ -306,7 +314,12 @@ void _curvelength(double x0, double y0, double x1, double y1, ++k; break; +#if HAS_QUADRATIC_PATH_ELEMENTS + case NSBezierPathElementCubicCurveTo: + case NSBezierPathElementQuadraticCurveTo: +#else case NSBezierPathElementCurveTo: +#endif // should never happen - we have already converted the path to a flat version. Bail. printf("Got a curveto unexpectedly - bailing.\n"); gpc_free_polygon( poly ); @@ -678,8 +691,20 @@ + (CGPathRef)cgPath:(NSBezierPath *)nsPath{ CGPathMoveToPoint(path, NULL, points[0].x, points[0].y); }else if(elt==NSBezierPathElementLineTo){ CGPathAddLineToPoint(path, NULL, points[0].x, points[0].y); +// NSBezierPathElement* values are compile-time constants, not linked symbols, +// so comparing against the macOS 14 names is safe at any deployment target +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" +#if HAS_QUADRATIC_PATH_ELEMENTS + }else if(elt==NSBezierPathElementCubicCurveTo){ + CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y); + }else if(elt==NSBezierPathElementQuadraticCurveTo){ + CGPathAddQuadCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y); +#else }else if(elt==NSBezierPathElementCurveTo){ CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, points[1].x, points[1].y, points[2].x, points[2].y); +#endif +#pragma clang diagnostic pop }else if(elt==NSBezierPathElementClosePath){ CGPathCloseSubpath(path); } From 8315113a8598d161ada3484546f657ea6d8e2337 Mon Sep 17 00:00:00 2001 From: Christian Swinehart Date: Tue, 14 Jul 2026 11:45:04 -0400 Subject: [PATCH 34/54] Add logo banner to readme --- README.md | 8 +- app/art/hero.ai | 1972 +++++++++++++++++++++++++++++++++++++++++++ app/art/hero@2x.png | Bin 0 -> 69232 bytes 3 files changed, 1978 insertions(+), 2 deletions(-) create mode 100644 app/art/hero.ai create mode 100644 app/art/hero@2x.png diff --git a/README.md b/README.md index 7b78300..eb17b97 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ -PlotDevice -========== +

zfYqPqW&b+%?v)U_;o;ynAA;jLX$@WtH?~^a z1#PcjzFw>$#qMzx%F@%euw``|B}%p{whPo@Z>jCUm~cIytNY8o#DG^W#ho3)FHPtr z?2$=48aVSii@vUII8cCV#5C+o`g7=IG6kXH0UxxUFR2JTES8*VnuOxbwDE-VRRq?y zV%G7#`H~K@DLnQScxnfVASmSk^I@@&r=C|REsOG?)q0y>-r%Y*o%dLYl9U3tJ22Fg{Em-QVcsiG-`={$*ms4QS#7Wxj$`K{`u zRnZFP5m0&+X>bPRTNWb*p6haOJ+0fli+RqnhH90;$_r+w7iWarB;28kN_jamHewO; z89}c`^ef2an}JkesQIhv)K;Wt12dr0Uqn$Rxh4=jO4H8sjX&Ki{wU(4QocfOmm$(> zDvw?u9Ox&t6!3jaOodc)O{Y>ZG)>w4>>)X-vf#AhiX~-=6GQ#U&VZ<8XLW=qnW1S2 z6TNHzI^;L~ksCu}--prkuxwrr?iFmWGMZv27Gk9_A0!i@xvq;MfxS{dYgNEWy4A3# z>evC2s|$gx4NE2R6(M?wVl2hDg-;3mU1pt~CeQ$C{}ZPnf(-P5894D2eO?*@0`(h# zt)ycBN@w>df6{5_;2ZRL2>_Y2)QzA};M~g9b~0AJAxve}u%pY>SkbM#I8A zxyMsN)j9G~M_T>KTdP)_13XUKJtZ5Ti~s(>Ze)nB{_TIAyesTh4edaropeoJr6Fno zSz*y`q8lg=<9H1#mhE+~-nCb}!rx&SM~;zpHV}nBx9f$1-p4{C?`8BBQjrpY5)-O+ za1(XqK{D|>G|+2*DFZTVTPKc*Y%th>j=UZgipO*BtjJqbKZ?RWbte zmX%R3KV>orMUB6g?Nw$JV^Eejb-mY`P~T>`1!q+lKS6#Ak0G!fL{ zxmz53SN35{1~tAi1tUcJ$kH_TRV}&2Ry1Wq$nIjDRyB53QM#ej1=A)ukDCP*B8u3t zE+(Nj#2Pl8ifj{h?h_UHBZ~`u>xcqUF_Vl*M6sI*=5;Q%r*7Z$nI3b;#uSuMD3L>v zVEu<4#`>4@5p{o5eq(E2Y+TB&M`yr8a=gvI9?uEU!mHZP-9eAw3titTX@@}Fy!db5 zPEq-UIo{%TJ`JMaoBXh)L?$%T$V9*G=p9d)vAy|V0__QTYodft|YtYg-5_}R* z;BJVt1O-#I#NRJKz`!x+j2vyinSE-alorSi1pS0xyZG)m{87hQ{da!0)%SiRZZY=GIX=e~&=g_b_cMp}hwznufIb|GYC^ ztua}#IMVd=bBxb+#%4lW=t8?tz0g%kyN_sKJ|Pw@yu2(wUnle<|M+iHAUyANIT-An+bZ+S7nUK&Q`SBzBzP3T!$8`g zxT))=0;8DRLBwX;gfJ$%!>pF*S!Wf-b7daM0Q5SEvUsLX)1fXariWw$?6PWrunk>F zj;!$`M&OhdM2I*bRcm=V2T1zQ(}KS;wc8_aw8+k{Je`?M3Gm>z)vM%{>{dx*Cx3#P zP&?h|YGEGI7~U4^F~wuZ6cya99?@hYfky&LeSVa_AsccY?_HGxm5sbV{xHPu^G>2? zgsTxy6<>ywViUhjO%OsZ&P6dzfgWLPnW~RfSxaN{qDKfe_A)XJBpGB_)k!_)dt@6I z%s9y%{D^Zq;L*shCm&5hLm<>60+FJRG9VEOpk@HlbRn}$nV_WAReOtsW2x{vg6xkH z8H#yK-i~C7Rdr94RplTsf}&P9_nNp3c74gZu3!4x4_AQ{|wg66JiY#yTP z2wSVY-5L;sJdiebW-DL`c>%&;>C%OJz{KPCd?9h2XLS$yF9k*baB5AxB&BC{D4u`R zf4A_9FyIomd77Bzu!x(|N}R19+w;y`@#PsDvM6XQ)-{hV-;Kw;eu8;>U8--%zQ_9 z@-*f8uqKrefp>)HQe(R6xR46k!*z0eUWC9@vTe1E;CwJ@8PmpcT(=H6OE3mvl*k-L zwPloF>}@pGk6k!?%^2yTSmW?A;|r-rpv5`c)GVw>4LSp%0GN(&5<7CbPxW5XJ5w8W zrT#({dbMf}N(c4FYJ*ZJ8JZ}X1RGixVUk^t9A0r8>`N`0g(6rwzm*sisXS^3w!4v- zh#=WyskA_e7`lGyl!{b~pvxGc+;BQd zP}X&I9s(?TUP@+3p({)OqoPoyu!1Y9xCDjKK!S66q|fp*`^$;pMOy+xvQ$eVE`_V2 zv!Hgn#Irp#35PW>^i!KwL)pU{l&^toY}8I-T7B$q~qR^9f8YJ{n|i!O5{2i2>yCmd#A7k*sQYJ z`*~&FFi32EPVQD>870ml*J6(~Ii&n==ZMfQ$gyAOMAu@ey4-J0^neB7Ezf=H#XHA8 z`dC1BcidJcb{%&v423oOrzC_2kK5W>76W7K9yc?F`d0@~$47I1oSGwhU!HMuNw4Tc zlDo_)bhtnmZ$4B|*rqq&=IW9ILBtvz4sXp7z~>a!@?HSPLCX(%T=Q`sW%o`qZZM@3 zmzuelE;~9rl9Y=Sv7#u>C{HgC zf*LIvdFh#Y#};H4r=&)`UW@XAq~IM;Ifp^;O4Y$s3ZI1Zri=_yWxCLlf7r@9fTRZY zNf2kAR8fjTDxx0{nx>R~bWx0?)6a-`;7t?&YnV0y>PuU|1`_sC>0@dd#IgnKxUlPT zdI+gl*v&)qUFre~hg(lfeOcOY#OYQo~a_ zmhjDN@Y=G8fR>F?(;+-H+^AM3oQj2@_EnE46@JN|7DUVha#ucF zhWhbA9%RrgP%Xiw)K3#IinN+EfQ2WNz`xsQy4xDU z{|ZJ0W$isiFNJTP-WcC!u|X0qrNj;7uCJoMySQwwYE~w`#JjAX-1(cdRYprRS)Qz! z-Hoq^AKr3JOf*RRld@Yw`B5#{bwKE=zwPEvi*i*cpQD&{Cn?Pnf5yhh&CA2SzDcjo zkgkDHh=t+Oy11)f)ij`{jG^Rgry4aotUU3lk>Eu22T1^>_=>?pZ!%1k=(TJ*Jx{=? zD@TYHtG#vRXYqW&3r~~NLar(u7(tR5Yh8lRL~Q8xDvnUP^`TtER0^s`v%oq_;=7B# z4U=E7E~#G2I8dpS4&Xn6aS|X$v32`d`@Ar#UyLi{?7}GG5hA8Sa8otXl3(R%FP-bC zgeNMkqt9198`J`)L%#}SSU)K8Bvnf*v z9Ok@axkxxB0bbyzoC;2a?5qidCQdxWGmstyKX^bWKyiBv^qT!5(jmgGa>)P#!=l9w zNuAX7plY(^c5S0N?#^M*P-u;=z-nfMS{zAzdgcQI1*M-v%~g@WILYQx!oF}T?NMj$ zR_Akx4AuI`u5RXh%^k@LQly>_sr8Ip#t7h1C{Q57^6_8Rx-H(S!M>G8xMV zDh)!tIsY%^*IU(i&oBV-eR=56riC3J@MUCgTzJ-avS@uPe|G0*QMUO8bouAk>G*HO zZhK~=L|K%D{#04?QsSA>ES0Ty5Qp91GyUfUrGD3mFU`qX8mb;!HySh5y1rlZ$v}xB zUGM}`4uhiJr4$6GZo0xP2|7uK$BL|QZLYtjCcB>5at$b>YMMRvH>muAC~Z&w9pVW4 zC0bltmW&NfM_RpR@y`3brbON0>1R!*6e}rNH7JPdykUs8fFsGK^(vjL&q@Yv6<+l2 zu$Si$@47Vj5A?#CTvg{7Ow0$)2a?1S6|4%!C9KO3LC~ikg~<4rhD%27c?EZYrb!nh`PLA78=!Poqxa0vuquZv>nd2t4? zB;PuePU#hbWs7?XAS`K#@a5aIJ2s)LgZk^2_=w|LdTau5^$R7cPHYd^It>~vMAu~w6 z7LYhw@ZTJj%}FU0zIhEr!R`my7gn&Ss%x~2O!habch+ZY6Xklg^+k}-(YVLd4*f64 zYD&aw90zqijY@j6>0St@8fonWp9JEQqLDpd!cLAlke;;b%`%S!q8;~m?jfzo(IYhvCm>C2$x z-Bk6FNXgHrYiyfz+>dSFD64X836!4Q;T<9D7p*Q;@$>{%gPzk;%;a!3lABUA=Z<0& zBusTLg)0|BHB@F)h%kQ~&e9ZQG>qGanx@X81*yuIR#D3Dyz;7cyaDn>x5jrQi6&aZ zMOUai4?rC2km7)qHV-qPfnk`wV}3JfTEaGvya>76!@{<wfQin5Y3&G0>8n52(LunyWW1k;>yH%-IB%N2J|?rT=-xG#|9uOr@j&ps3y>I%p`S4_)Fk%6Ljy$T@`b#n?xR zv372nu}Ndt0{DS06Xep6(;*`onJiXg1Tv(Bk6WcJMXX^;NY(e7nR2hDjU;S)5ozDa z0na{QM`wX+aL6PR6^rF`#-MN+?HKvW%LMEr5qvrE{$nEV=6SqiZ!Vs{&|YSjLW`>q zl46LjP?gV`pAf2_RIkGBmxLelw<45gblEqN zKUbzrFjPxHRWTGq>TCFoG91B?Q&2;M@vu9_qhp%O{nu9S#P`ma{tF(yUPrT1Kz zQ%BM#R932@NX}NRuGoPdBllXwA`odAGd)$k>xsG`Jq@me^c6g}HXtaEKgnNeX2>-< z9Cl_NaCQlQbQxXFzDi)fr+}23kFG(3%2}`B0$_eNoKuUqF|2baL={onZA1hE(TwXu zaFOr)CU=s#b{8Uk@=N0Lx(M$o9~q~LaG6UYNQI6ltS}1!u4Vp^rGXhq(|S*)&e`v4 z>9GMpy}9Kon>o@Wuq?Fhp{l}QCTbt@G$wy1St|tXrc#?qhc!Il6YG?6YLa+T02hws z2j%4of_cB|zr4mG-7oE}c-@b1CuE^aOOlnqPQ>1e_Ly#g`YkV~2L=y{eNOIcRW5o) zInSiXc!3`mqClI|u0}8xAXS1N21U%8u+vgbR`E32(#uJvs=_Hk;M0NZ&JyIuxB&otkAp-)HJudE~(;?37Y$KRit1$iJ!A{QSyBTXUI3LhbXDn@p}_aq?mbLUqGVTnj|F@nY8%hQIUCiGaq1Q1HX0@HOVauhnEEqwJK} z6L2BT1angFSPP+iYM9m}=JG(0Vq%mTXnpyuAZGxdkl`$g^p7Iq?xlV&2e%b-#hLbI ztL9Tn0%T8-J_k}I@lEr~Mttx~zXvGQfF8Inbt{kgF{;6)@Zv-s1I-1E<6*K8W3TeS z<7ra7{D9ZYU1i<09P~75l`ze*MjdC@a(1oYL}=BKA55?`S$~vp6RPxmAST`I)>&81Ed z3BMdsW+4Rg7K({2Z95kGS3#O9#yd3FlJh&f6OCTYDy@_Ah>7oe=MB`R1?kj_tOXo1PCEO=plp- z5_*RaLhnTdMF>SiL8XZZs3C;jdza7@e2{8EMF>SY0)hf!p-B-G1XP;x@;mQ;&z`$y z&d%=6o}HbU-MRPkjWUMaU0mV30GOul#(HxcCwHNmslC>wt7h^zUY$jl`%6O z!+(CCH{FL@;}832UZDOWo zM7}oX@dOQkST32+jVQdfX-Rhpkbpiq?;T+K76V5NvUW}{*PzM(~o#&Z}ly9mIZG`)n);1-G%!IPJaZ_TwcyiV3VefbZ9k^S$ zdxwcJ&^}sHpqA=e$vFXGhwf(B^msTd;5S4*P&Ao}GCCmHdq4D(DXLspWu!sacjhsV zxl86dA5&^J6QM4k4Dx3}lddcxHDrZ-f*Xa)6A$exPvE#Z!gO0mx>>+kl4#s&Lrw-4 z&&LP`n=nV7WM~cfIKLSWW@Pt6i(oKIanNN6k6{;%goiO{71z~zjD3w(xne2dr9I-o z@nZs?FY;5qK^||ARAh{0;)eqZwD|ReWi7k^$bS~NO^eKxh+g%U4%B1dwOWldxspL{${i9nIh;X6R!X{G>VE!stU5d*DBM+&U|4BSy{j z5_Z;?q6(=iM`Ddxd1qm6T2Pn7H#^^dkjv3;sOmzb0@wfe%=8h4RQ0?^55~s!G*23N z)k_f{5ZuhYw;<$RTu|6(+4(I4o?|!0{N~lQ&F{QNeZy;`rtLRN3ciSjcj$dHi;qA0 znBEZ;UN#kND1yJ^u2+)OR^h$J3jLkT`^C7d)5AkcY}f7g7ydt~(uZG(0);FU95Fl` zaK3Or7%am5wg!zM0qUY!XrZQUwDcVy=k1&O=T(NgtdKO3URHNhfLSeCBU&c&>Cdof!4tj|m^T_7j6v}kOVxW;^9W&nMaBQz6# zuRlQ0QMoL3XA+dk%Vb%_4Zv_?WBdy!1u&rJ(m_l@%WUFELej@MwE@t7@Yp;Fn0-~C z5J}oow~D8!4d+U=9y23o3Tp+uy#QI5YbJJ4UDi({>8jc~S!7&LtYHEMDfSTQ9NmwH z42&qx(7%}0Lma|EQKGR&|2m-#42^JNOlC|w`}-ieggMk3%w6j*Cz7}bx`k^4o=Zpq zKnS&*{8S<4Oq%3eL1>^xA=2e_nxhvU9-M!T!AnLG)R+kNYY8jZCZp?gwe<2zi+^Fs z1yC*H2zJTWn9hn0Zjpy~SW5DwZx|Keh_wP8BpSS9MxGd|GDu%2phlkv<~9#XY#6c+ zuy=ZOL5>^70HVr}A8)|zv7jHot_=og|NcEDaJboMQ#`tDjQDGdq6v-GV?d%ts{n@C zll}hXqyw(hGlonibn=%sle37&I^rSmp&x^4&xHu=u~=l;E2K$)wt@;=&T7UVou;W;ciGjzhAs z#KD>%#F%CqnFtqBGr_=af<-Dc_i~OF*ht@@^`@(k3l?j}84hFCC8E|j!+(~b!P~Py zUK&4!LIPGr%X=km&auP9N+8&(p5dZ4srcX`$oa>tRZd*rn8~r?e6_$a{$~j;=5j|R z<72RBBwW%>BiM0yNhj!B9A4Z2KAGBpRNAnXf-H)A?i#7xL&ChKdp(af9=v3Ftk zURjr|5yVAtra7X(QSzT6hbJLQmoN?piT&V&3Ic(ZWMHK#$vxcY6SfD2CIp?6 zgrF|N>@qTSkwvJdZXYN)GG^&~X3mo7g~LQ|xumgB61K0x%I{C_7PMXJ z*JIC*HxIXvL8?a+u#;n7;y`T{(M8Fz?+~mz81~P`UM{zpMt@mA`}e{DFH{(pfL+r- z6r*FCct;$me#_`jN|z(VNAFf1F0eBect#Cku*?&vdrDaGiDj=N<4RM{$;{2YzN!#E z%WKpQwWDkbpiO^u3I_PIb@%TdK=^db@e{jU&68fe34b)qI&s%9yRC2j;{K8U!tvD5 zLBH|h-OZHkUtyFo!$Ob0#%EuE->-1>bZ}w~HOY}5JKx^k7Y`@+n-Sh^YqSflB;j}0hl6N^H)=j?rgo`EoqY>rI9nSH~f-Xgb7icWdz_(y{ z-G}!Wm^G{v*u;{g+}k5)RH*e0t%ImXiF+cr(e@JDnSB$CJSX_jo+7aLM2*^YJ3L;T z#@=btpO_Mu>X2d8YHV3O)A^0y*ml|xUFqOsie55NVL{;932n_ro$1$9qx+|=Rc`~AaI>OBhr8!xa%8U*c|(7AWb`T5d4Ta|EfT!1pv7yHtKwD&{`gD@UL^A1myo zkMr#B>JhA25Ht$Qz+|xAuSw-ds6+QJn43pmW=(&P8km`4yCqVNxFOA-Vw12Zl8`x% zXgnrHYd+1`?E>@1IrV)<-cr(PGY2uzoQ?KI^R8P=NytZb@%~DCtWqW5wl;Aj1`weQ z;0Qz(nG?8xMmj!38XUNBA9DKv9eJ0*G&moJyLB0IAm9baW5n;PL+iyU>W%Anc3@2H zJ7M;fp{m019z#_^s&|GXQJnW}0Lk3c-rmCxg?v;>sH)@;`q&!40q8hN+YI@ndiTz$ zRcVjL^dp5TyJJ5_*>UIZoj#L4b7HA~kBZm+g^m2#xNd#Xj@Y3~?Ksc+{VeOh(5|-Q z=K=>`HI0OnZII0whdIuHr+k$0J zjO7P{{YdnLrVk95BdX|3E`3d5E)%DIcoV5<0Ie9>Ma(shz{O7@wba^YP7+=DukF&I zf8_%(ghJ)lKNY0F6$62~z@eH;D(@SVz1XQyZvR?XsAb*9a_Hkx|L(hp;V&u4hhGch z{(j)v|8)N77i4|$Ro=!7SJB_7H=zytzN^oqC;J{H?|lOP836ux5Kq5i9|zy)`~=~a zmwb_tV8#N%Wuv&w0@(~MahGt~!}TB@i=88nP&Ph9mZN=^)B~iH@s{jcWT4>4P1xnm zG{$ut!yX1%Z4H?MS;D#F?dFL- z7?Z{nfFFR$G_}qYJCkSZ(S_?7D%^f^lteMIP?q*(dI2oq;0o#bgQ}ZtCaYY z(7t~T;=`@lYr?tWibYmQ&t+vjiy+LvpjJx&73?=uPet-%0HFyazlTJp_OIwD@qVC4 zmnI`55lMb?_T1wPlV6ao`<-z1qO@5BU9oIoi5j)&{*>Bm{IDNJCAbDy%ZGQ_Cov5Y zEt%@l(-{grhAgf{br1-^e$`K9SJK{^mf?;4*N5Dy&G@7{jlA$x>+cpVg(aNbW7?3T zMu{`j2_$R{4P2zk&jGhPfe{R&?IGAQ7kq;iwBZf<7Wd!76&UN9Cc3JO1@y<5+9?ih zY>j8K>I0v#zIZ=k0;t#PJXHhYdU6e9s)sOu38X)_R!K2cMb2pf-1<9g4UeOt3~#05 zsR!N=NA!@k4U<2oR-CI zFS?HMqlNL5R+pu2SvqG(`Dh(2RuySntRV2nCNKjb5winV>Tsp+h-hu6 zZ!plHCit~DLW(Y=XFCQs)p^xCdQ6jNUmwqs(k3c_(OXOiNGnkaxwr$?8kR}Y_R z#D3Z^&DByb@tmV+B421Ota4kC9@{l<*~%Wv<|+AU1M5VD@o1?)mpa*AFql$asKm+V zDhA9BtX(j2$y|%736UpMrElN>24I+skKaXT5}`G*6Wah;9mgr$li7)l7TE@mlBIAcYRIAUb9I|{tr9W%+#r0V0g`XFbS zRFQVlox@0dP-CV8B+uqEmLHpIoKq|LHf3h$V%K91EMF8r(Ce<^1PaMMDFD(A8EQK5 z`}$gTbzYwraOT2xhr7@(?|9S0rR#A=hb&tY(pwD@qup)j(PIy_pF65^W`=7WVr)mf zB{Oy_E-H&AK_Atkt}(~R_E02<7=QJF01b_$%ebI&>vfBVIo>T0-r@V^n6=u|9X zOOctfE11KEkA-*ts(_FU%gLGh(3B|0_kl}OU8}K=AhN1naM0_{nHwZlZ)Wh2Y^>#iCt<79M)b!-0exclk#!7l+t65+!f< z*CG+xz3>Oza((@jIx$IrZYfw^HG_K_%tNjwVf6%^;#gPl4Zf#$pJrUwl6o{=d=BWs)WR^?9BxJEU zu}eU`6YeB8r=2&);d38JBW5&+pRh6D&%t!`DQ<-dRv8={9kyDrnph6=UwFd`$hyxE z0HBCcOceT|?hEQEf_21sh%ImPZkGwt!_?TPt43y?kAnJSghXKn3s;d{`E6g5;8rl< zjmPnPozQPaFs*qu@|7wlk&oGD1*xmHG-GpCVNd3f!n{-?JDQQ<9Gk6qA(Z%LnJWuC zFAh)DPM}t9Sdzm#6A9&7?BhJIB=HqBMjSli`t?@(H!E2C7e%*Y6Yv*8gYO1=idi|a z!U{=GWIWIr_DJC*lAkGlftzX{2KgHopE#S6Zd%|(YD7-D^)45d09{Sz7B!2d>s~4U zR1sEM*wR6#w*cGHz&in#8If4v%`Oy@f@Cj{$IQJU+Pf1n-XOFFAQT{9pjaNF-weZ0 zg8YkT-XQ-7gH!;A_<;Es$~(vr#qIEYXWUiHl^mChly?g#?SSkRr(p$uuCd zd5_hJ_8Sut2qa=UhFPhK>o+AQH9J82D<>1(yCZd@pH7@B#CVSNnFkZV?U$91!!iE9 zhp_!r{)+T=tBpTqT2H&lgCg`FS3R1+wk#+K^qWt-yS<#f>>(_(i>j#CNXe?SOOK6U zPwRlzOfADeo;a(!1*Q}W7t-`Bq$Xo-wR4o*cg((zh}U-HXQ=|7x0KTXDQ_(#L;T{^$vQ=LS7 zg>ar5-_49Y@?K026LsD?KnfdEkRXq#Ay!S zzholBlq-}+8YTmGyVo_)-^#Oq-yr*tRZjExY_G624l4_#K%I zCkN^RA;w2*aI_lAmwvx&mnF#?DGdab`{@$t z8jPeQCf2?Mc-zQ#y80xE4uOK( zh11wal4Y3LDcHy+5eSBeeVND*bOGoqGZjUt*N}`$oLF|~bUc@on9$=63`2}p7Ry93 zId7>@)~_4s4)f|kAmuIK7ttnlv_)RYp^Cy8&F5Yi&)EPL;tPn+-0^`vU@O&oYG8F& z1^uB+zH#&ddQPcB4G`5Tb|$7n*I}&Vk-&PHo#4SQ*24jo#m##;TN9gz-H-gMn__A* ziH8M2$m0XlpadXi;DC5;9fmOP6Q&TiVThb09DmmpcfjOS&GwAAKK%BGM~<3cRh z61T9&<6Kmm5&UI|CTNz|qf&%F zXXrUBs2X`1PYT4ikhe^(q#K<~VambEZRkBOXxGfyV3&gEbln7fKYS1<$IUc)PPyIK z-`=99D{ijzYv2YeQ#xQd7D7(Nvy=ivK&#m2+;1E8iE1TU=5G)te)vK1dml$Rw$g4d z5Td6T0U6R_Ul&gnJE)rD1PCXwpd|)=t%5yDb$^msh&{_!6e7qb(7!kP7O;>A2=uNJ zHn2>%(U6PG1MBB!r?3mni8?ddk*#7u0Bu*m-&W#&5A}!#^A41zw1wBose)SI_ zU|sYn@x;cU79lK$(M?dwc`3h1ufs+)t<2@X3sz2b{NN}6?5FrJo8hv|r+8QB-vjQA zN{^FpgJHY&nX)_6VyWA0pTt*o4CfleK8+snOvZGu9PWYl{zMhk&s-dq_6iMhB)p?}45WQyF*^Ef56 z4Au$IVDwB@0G2Pcb1}-c6?$l1Fe8cUV($@b={jt+o<3tdOMojb_(_pkFl$+`@n&QG zPgpGpiUPpLKZ9E^Z$Y`qT!v%~(V>Pi3}NIsvO@e#ne4`3qYIbGE_J9J$(^1ILyiZQ zQd(VSvPfG((OxeTxiQhOMtNo%EeN1zK$WbSG13nBA98%4_1<|VLVGXmLFf@U7fXsW zy2sIzVlQ(iu`OW?7@L7L*0Auiu`Y3 zQVQ`21)S$R>7GgPVf%O0`TX=4T=QQDR^F#8E-qFL8(xqtdVv+BZ9@`CH;I z#4e7T6q-DvaxL=|{DM7uyRzyz6xj+DZW#=>vnk-No$BSAQ;fUdNP>bYa(T;5!cI&b8PIT#q$g1`+E8y%0v&&gfbUyeQ4Bh;F9-( z+7IkN|G=@h3@L3uU*z@satkf-t18L#ppfc8APJO*^^6Cwh?UQ6BL}TdVT^wOO?l(H zqKqv_(!zrx1!kf-Im>q;mm!*Uinl@ICA=AXEXcU!R$DH!5FXWYbg~WI99(SApTK!t z##h5N`&N%(B^OvK6%tD=@k6O$yH$|PM^cTz{KuJdTy3Z9S&OE>C%+B`SnJu?mgDMd zXaH{%iezkSs_+)377VJF-et7FIq1@jL{U)Z;atqui=qrxxrBOa=3jvEkFVI6V_oQx zG&flcRnw=}sPAX8V(hfa$~^|<2mipTcL>P#40k<%fW~0`-Bfv9P?;r@W#xi^x>;ep z=nL-YweH4a#Hy!`H&8&(*6F#HD(XRQB;ctuc5_w9wA8^jG;Rt^RXez(3Fy98r}R5w z(ohLtu;ckY{ciZ?k!t&qO#j`@)zLJTx+`&8W__`T8=5h%e(+lVGU~l6Ozm(tx)N&J zpPyBub;`4Q2|bCw?V{r0Q_JQmc#rI3u}kh5z9Yt!9A7-BnN1$ zr3^C-bt|X_bcAemlTSlUW)N+Aj3sbw>2`2?*c@hnbQYe)trcDwYs5d@a}BNQc7l~x z$Hjism{)G*%JsaSrF|}X>1h;cnizr6fQ$7*u%JE64KEiE4Ps3sw&tzbo)VujtqI(Q zMUq#6rbheHeqPQf3W1^1bYsaAFE__t6}bL)v5zBqd_eatpt<(}-n#^!S4;H+OUn}S zF;Mqv3mO&eoAk3Mm$x^Y=?EEbmwR~1B|Su10kNuI=wD9dL8i-Y{LCCaOfRNMxHWY^-h{pDue3s!u$WrqQYERK;Vp96G zVEAM?>DLQdCo~pRtI=f|=iaSut2lZNP5!-rpY>(NZOc1z2OtlwM6pzElt;`cBcJ}= z1mdo|4PaMNrt&)@Uy$cS$2)%w0V9&AmMEqa+Alo{5KIT{Edeyg05{B8C%S!@?a00V zK0W!&3kr_VZdL^GKbeku%&473oA+q0#H;=51xEm?z($d}{(D>sA3p)8u6rHzx()0^ z!0(}=ihsczfW+i|Z!@srZuFf$W#1YM(MNxa51&Zyy#$-Md?uY-xbfFaPZf3%_TGOLY-qA)&!riSJp@ zLBzZi7o|BnwKe8*?2B5K>mWfunoPQo+-OEBM$s|G_~DHYl9mo|^H%bhSAa}eVAJ_7 zNs#vo6c97P2$N9`(vN1s%#G_n`E-!26vApkWJE#6*pj5%Y}VwbL53)(JVIosaVNpP znypGy=)v9q>KkuvMJ;Q?g^m6c2to~|wYw$RjD`P)zlUXk0RTRVArK~w{YaS1ba?7W z7(c;4a&7?-hRh)6)2HoO`b$Fko;>Dfjd0upYb~wLQAFx8O;4Xb{oRGN(u0{Oy4}q<|E?B4t^DpM^4(AO z!}!zpQZ^}UY*aZatp+PogT+!GCOmwIl}W0p`F4WDCl=oK%5%K0{lM#uEmqxyZ`FWXdgMq`IcUzy7(@X{*|tw<;?omLnEZC92}|0!KO7`#F|L zr=R3KL_7L7<(@eg@PEefTvF}n%NN-8kAe1B2=WXJNPl-`=$I((2fcDS3 zz;mJ@jOYtY`TvIAL~_ZwXrstxbR;H0dGGS@;k~oTi&|-me(C?ST4|N~|Fb9SZ@)(( z-R}jRq>CeA;FcRhuq1uFYDCQ85mt!B+*;(#`> zNB^I-UqU5Zevh#<(Q|kl?}>pW;qr-3A3rHld0=7kKFcSSUA$%T3P!HMh2r|z#0^yb z?qThj9{GAZ1-{X>Q1|1k;^+R(@{Vr&E_zbM9MG8g%?emByr<}*Oj)Zzfs6Gk_lBwU zUlFg|N1@#-7Vzkl*@v=|RoiTMzEQYui%5E(`)0VFXymKKpWz$7(q7%;DC2()QMt-4 z%KpC`@7G1j`xdz)^hC?eWOk=#znEMHl{QVET%SupiU;AVODeZt{S^@_`uBNkz>lIU zCVD})2~FX)eG=#hj`;5RKrLZtOoRRE_|y69ihfCPe-1tug~kH+r=NeZaW^qb4b%$o_}?Arv_Xy2 zUvb<;-%yG^(_;E0f(4bh0%;K`p9^gL5K%6Z^ofFbeT|UfrHL_Z5<*l?b3lzd?{wrh zDD{6nCwQ~Ls5Zd`TM*8Wf1F$)gXkt8Vmb)~3{>Oo&F(KIND{X9oVT_4^$T-9+cwzS zq|kiHLtlfRyPe7(`uc)EKtyVvN3{Rmx&;S)YT961%XLwZD)`REITd!hv#aav^Hn!D z9sbgx>cxfNwa`;jCipJwrI5&o7_*Kjb~(x;Zt$I2yuU-tpu{mD)B>tcB{7`aJmGX24cjT6(7D zB^eVZv%Q%F?@<_HKD5$PlGqh=UspPb*{}QGgI7_}o~a2*q-?mpi8qPfY;+lT(X;(f zq+$L;y^;&*zEk~_)$fzq(R`9O>!hyaZ~R(XvaNg*E1rh?b90DeQ(cZ1msgNv_tO0? zuqnakxsOue<8zPR`ZP#O>!zNxFE#J3)4`IOZ5e*5*FC9jA#z=KGVa;?wLIrr$y zf4KpY=O3MspRs&;l4{Nk$h90CsC@If@ltYTr6F(jh$~`aYC+tf;X5+9A3r3S?Kp&U zn!Pp~c4hYJtnK%(m-;qOEq@1#^xk{@!%04%o}E45-Mt%KT_~M_2>n`<`x8%JZ9e_< z^n2v&=bI;o{eE?I^W~>&&mK&i33gPv8HU3^7hMd(|GQ$6#Dbb=xx=T~c)m2`eqjLZ?N$Hi zPE?(&Uix4>?z7+XG%|Tnzi(d-UY0-94MrVR15VREnScJt*|l^ za^b-Px0Ti)U5^v?uYlrLi$TAf?2FQN{TjcEI)c1S8oHC>IP6CF13lX84>i=)-$@Ei zU3wJY+Kg#5efsLgsc|FwGpcK;# zi+OdarQ9G5{3ezAsf&U?E}?8_;@$>I`Mp)5`=HY1Y5v6iAQ214-QzFY5wC30`$CYS zcdjOp`QEmRi^ z|4uyMXgNN(;eGUU_J?(cW`p$gPo=sIx1V~wdkD_TTKN7^Ab)#%sn>^BEaJ4DTFSdd zaSHQxl>P0fsQta|zsPs5B?a?+70`h3zHT&ga_RE)S%|Qx%A2*wyE2vs>K!bSVX8JKaGr==O5Zcj&3wg^A zta@6#17M;2?DA{-D%-g2%+|tPjFG6ZfqXCym|fet*Q56udakge3-elJ>c`_^?xVyDxJ3A zpdkO!pvwylCg=Zi%JX#{Zf-7+ALx(x^>88fhWyg&)36$3E-FV(Qb9QJ&c{6+o$qSO z%Bpi2cz#zFvXe~|3xrB#V&^`Vrihq|yw?-0_RZicDmXm&Q&x6+kA1YZ&*N;{*&?%# z0ZlUgrM1qE;=HHR1$eo`d}tk}Iv4i1fBvoA?{}DudJ=z}d?8tBmiN(@S>wR=8N65; zm0J06-G+hYx!9g|szT#QHb#G2Qc{>h@vrcLR+un>&`v|FyfD5jo*TVZS4I z#L6~>K3!W~0F2E3MD_2vpZ4q^rTT5Gfgeuo0NXwOtG6{X%uQHbycxAuRN439N&L}R z`Tpk@w{E^U7An$@R5|{3y8E8~A_zMCthU}Z4a1)=b;s?o-{rhq#q(z_uAiyHKl9T6 z5b)4h{9mPIuBeEtK5p=MKw2l~`ti@TClfh~qpS1*z7|lsqxj`st~JOZ+hWMB?G;%m zUpU*gGI;yz?`Khw*RLudieK!X3{BqBa~unbKyY(&*g{#`@x;oSctcUd`{hiR-TBHQ zV5XNEKN>@1AY~w3RnDrp$g)v&sHy?(b4aA&XUF)=dFkWkKD&Xah?k%0YX^MJWt&gK zVHe&Vx|j7yxXWF7AmL7FjTe!#XnNo~sYn997T}EVXe#i-iyq&8b^h7M)o0hfDkqF@HPtpv`HpGMeoB?RJvOO8 zD4-K@M)xvd{r9{o$)R?|B#qcpT>eeKSiCs7IG_Kqee3|EK8WLu6yNy`^e>g zYO<71FLW*J{z%(-z2=(Ua{f|w(dXo8nW*mc__+PEGTqeG_~m^uW1XKWT_a7 z4wwIT%-WoncJSZKtVp3xLX;e@1xtm!f=qO*S2N7M#9jf-!vXyoTwYjIdxV^QE1Ld( zH+%(|J&fQyo*D#msI`}#QQio>{n4L3mwtxH{u8fJI;y5I4GbZf8Kd{rs3WClb`SW>VB;a_+=6pLl+%(r;ZNOH;==Q zIu?3*R#&Hc-mR~7g0t6_hI~wVt?!$Gh;MxaOvOK=goIVOS`=k?W%&s9PAxyn`EU2=<2^2B{z;uqEV&sP@vfw4;~Wt$$>u zg%Cd?9*Y&$oqCcbmtB27$ub>Xn~+m(aV}{e;7a6!(;1)YCw3@07j(J&tEU>2&Jg-O z;$~Co{0H9&p1xp@CM3TGack}VinuL*C^)(nropwhxRXF*g@DQ5rib69)@n&jD~4YG2&Jvp^GlwUe^uvdi2 zOifhBJ3GZnEToU>MTvc}wAL`NfW;G7OcafIHY@~s~2}JUjH+jNyb!5 zzKxG}9AO=1wJ}FPc~p%6(L^K!1u}UJSvW4;yDs(__Eh)fJ+YNv{!ap3bgyYtQLP>Dug-nXpnT-1mRD7EeMSbHYeDw@8h(s%rQFZ9lJS;3u+ z>(U-Wc2W=QE(x*AWSdjoZ^l=+ZoD!==u*gb?G#_ca$8%z+kj+zv0?aD?#kGW{nVrZ zLBWcX*TgEUT4K^U$&96=EK2YuZ<=@?KU<=+QB|aVaT3Qh!59PAGV6THb4BH~wTb(T z=TsTFr+@nI-U_}~$2z;R7IOU{Lim0CgSP=&XPppw|I!+m^(n6^rQ~a+%wE|9n+0AX zs|siSXFYiOzN0|2LAo(x?AfoII=cEJqW=vr8{YqP5j^diJ+U=#(8t}IV_T^367z;ye!SlFC{h8IFAu>xydr$G*8%JC7@<+G*F1MNA zkBa(H>t-*5|G2`x`SttK@rz~e#>J**&*ZImEfn8PPSWWL=nVMZd&Bo9E>1aB-8i`V z;e6^NTZvIWrQBwkPrwIJ?)~sSZ|;_a&4kfq@N%}NmBJgJ(*~|qChAtT1dKQuF#@Ku zu$UXW3U4P-iQ>nf`!0#4cX)qQFaEBa+rFw+RB~?S{f%?_KNGjd@eMOa2Inj#(23N3 zmZMy`#MR~gTkkPh2~%Et9yNOp3BpT}P8D?1$h~?09d@qvgYAot+wIr06l1P9R+K+q z-IIcT8aP_cjB}>vyq)yHqZ1A3%)cHBB3oY$*Fz6JOy0RVEH@n)VCk>wYoJ0oEmvS| zVrtrZ^1n*`ib(aTT4$Lh93HYZ4?OUbVJ%DaDz`_2)Ucb2v*G^o;U$uns$FZHKWx0S z%C#=esmWGP9`~D&mhGI{d)3v`a`DQV2HslS0P%imF3?%%yNT%ni`3JbP19sA+>6$l zpwdPmDPM_$hUXfVTn2kgX}-$=kw~}T+=m8pXeco#h;1h-FZPJzs3h0%J`6 zAW08kxAKR5|L?swb`ld)i)zIpM=a?ND1m(JP`hf&%g#lU>dD&6b>=19H|&Q6(p`ov zgZ7~n&4end9il-jB`CAMCDJLTY8Gd&jTVcbAmRB~+&* zimH9xjA5yua{k*wcb_>mJn|0s&3?+G)75{QE$v*>*+zAt(mM|(eDY*%e2WKa96#(x z=IZ;}y`SJNeD2m{F}#-4!sC_0^ZC;S(e%EF{pJy24NQr!-Gj>qdVh~^?PGY)ORW5T zmG^J2bzt*v-19!~=9&j5|1bYSfr`Jj0x1H}%ehv*a4vyB_!!ew36>&on!3;x zP7y8UNqtg}?3Xx7X^sm#CT{>}<%gThyBmzCg?^xns`_V&GW2!5UwNHt0Kn4=@Vt^958*I9`EOkTw!WM;s}IY~vQIX~{)zX?QkcIpRFo5U%sp`qYW z^^r>x9vtjr!fr^$3u%U14578okuMtJ#=1a^r)EwI>iwhX(7Up6>8JgCVS#!c=hz_T zT_$J);MU{Ctan7>jBYcm=XW{P>{))*Nm#TE2Z&ABk@I!$xrFV^01BU&mWZr;ssL?YmH5FSq_A4mlqCR8yz4lFe=6KD;ZqLFsp8G{CR_jN;QoOopuQv zkipzi_#~tJ+XI*ZFz9Uzu84LRt9*O5c25VJXewc>6QI!QgHF-QyOx7FYygn4V#GgA z0AZxF_ihu5x$p^tq-C|-mVgZgHG;=16a;C6OKAd@u-*fELqB>nO^x3ag9H@zeAEzr z1c+E}dU`?-Ny-2bxeSI=Ui)iH)3wf6Ud#yG)SwwCsR1tPYB1=CLq3|eOMy`FRPY;E zP+iU-cK-8K$ZdB&z+hMa5iams5fai!(9~%7TEe~HBAaW}^=cM&&^89h`94iWscf8w zEkEuqFI$#LEO$ucp(RDq{J~PNr>jg}u-W4i_%O?zbpmps@Pol`BG??6=Q(z_CPl7{ z1$+cTP~n%QTM{whwspz?XQaO{cMrFh^N$)QbajqtDB;AWR|~DynwD|&=^$=mbXXH3=%}g z@O&pDtJG?&dJC=G2x|P-lXl~7sRSvkVs8O5V?1ljrvNafB{}T!QBtK^D>;q@yy~{ac$6Iv zOK{6tEMy%F`RQK`>e7$1pWy9wyhYDhFYLb%@Cm4smFmwZLSNM$f! z_m+z^+I!s;?5{DlJuxTKAv7inl=Ezrf_NNgDa&0P!DDU@u?w*g^6)Ui#>*N^f=C&_<s&S5C?Q2Nq!O!W5EOJJ(pX z06z`Y%2E!A_0ELIiWj>;WOq60m)Rdm@*jf0X4bOB&O1Nj`m5;@9%9KtZb z&X$6e@xqIy6s==R=PrpQ=_kbnVSy6SoSf00NFSWp08fc?9)=wsCRPmPgLAd=5sCMTGqo<&cv`_AQO!wm<0I=XCO2s5iC?@!!+kL z4KPFOt7I&r41(GVP~+rLWf)hKx&a6*5NiivK~{XX4cr)r-I9MAQ#=A#HM?aYzA7CJ zF%U}a?m?_(_(}5vtb+h5ITC<{44)cdwYC(Hu`G>5!96EaV4Q%+l^6}!KG>Ovx|)S8 zB%5NKMF$W^w-ZwHx_aWf={l<17flzP zkG~Tbkl;K2o{?bwhC4T}*(p1>$UjiXASg8kHdjgbw= zc4rVKqv2A?esTR(505i{$eJEH1S?zM0c8WCyT(Fna`fqOW`nt{icWmABw&F;;W)Ln)4GN^jjF7+C(RSdp8hLfkXkEYggojd zD;q0Dp7+aK@@U91lfXbOAAG!B*SQV*MS{h=dKakHd#KV{3(#To9(!El*9YErb<*pU zy|1>d!L1OpKOqDUBI`0|4%Gz--enGVnueQ#*8?TUTQd!516buu;SjWisK_NS!E=lghA3scnpGW7_`I!joV2Q$3QUh+fD7 z*d=KNDH3A^WJit8pC&UA0hs2_?nSb4#H9u(&2NeV$jA}XhmJl*BMA`IW^o%;T<W!FLKf#MC-gN4idP1+h0;ttcK9m^*`Ss=mg$TGKUd0dPk+@-++a;v`wK!EJp{PFt!yoQi%cY^X5LA6mT=A)A>P zzp}Yo0YMOzb$Cnx6n;xH^7PK=fPg(ZmsC&ojcqf+nRt-cNiLVxl>>z@)7+FKZ(3eq z7@)f!TNj1?Hpcz3s66J`BI{wcXuAxm7A15{zhgCK1Y{lp^q<=DjL~Gnm8lDC(Hbbf zT$N@@g{L6V87ht$x=~IxL5nY1omXU$lU9sUro?68YGW0_pv@B z6UPs!^Ps~bQM0NJBf)2inU$h($TqQ!#`~^Q|2rJG8xHuNa5-p$6lq8+5zFh6p=ln*xf`xu}Rwx6ELKs8#1auNC$S$mcikBXc5J2ek%DZ?qv_MAA zr8aUD_gwlNeltY`O$9jmhag{WAbY>!emdWiCCo))!og9q8J>4{ElGSt;Fy)Vk@M%q zF$2Af5kpWF6u7#l!=PF`T9tih+B^?Wz!vs$I!0*HPeiC@1>-cN8f?Bun;`(Ur>@RK zwBDgrLdhgzGUaOWapl%XfFvu(4z{MX)4q@;2x+23q{N~i&c1>_6V-ah)`J1ykX8g2 zD?HuT3}B;RBL;YqA7_OvAlZSyumoaZ=qk!a{C}7<+jrP2z#|0AxDF0?@>iox zt9U`}+dX#iR$3GJVCG%|SXmIM3@poYrV{XYBnc_l7PPiW@HI6vyO|7i zZZ#kU?gHQ_2DC;&xrM3{fRdMb-TTg()nRvEGve5#|NSd*S3wG%f}(P8j?{j9yO6Pd zcY_D;-j;6y%*swZ;}#n~cI629LU)N*TGSG%K3a(GqS;6XuUAm{Eb}+EuERik-8uB> z7C>&S^1z0pm_DoE#0boIeRq%kSrKpzYn*aJI;ipwfbLz?x1lh>vjhbRybQ`q>f+|8 z)m$VVYGciBMD-Y?0v%9HobhR%bvEg%r)WDO9%@-5hUi7Tt=OP*96pDjdr@zge2@~o ze4!Jh&pb~^#_?ap$wBpN6Lu}_RQP(?q8AgSqG5`zl#G4EePXII2rs0^xH^R(4Wgh( z-6o(2a=#XjnZ958-HTfrq(s(SJ&1f#pBSwmt8gyo((XYRqEp51aAFvBNjauTC$xyJ1`gF=cn2WOx}~!ge3wI2^hbiZodKBAq4| z9fZo>o$C94r?$L$54|dSKIFi9&}rFvFveQW+XJ|yN#}sw&X7(maRL%?XsPZuN`E=HIaFu0vS#tOP85`hmGl@4C(!R(&#DXPD3RkzsF@S`Z)eKjD`O7|TG!joHSu16H{O@oU35rj!Iho{fm%cm5%OJ^<%% zOr-OOu*8akHM8^J*VJ}zuNqpo*#qsX9*PlAaU$Y;zAwroLNULzUBMM{_2+UYUI3$JT9uk)A9@$UZ+Us1g17tjPzgB-prrJV6;!%-r=j*B3=QVmvmoNIjtUZs2k58O1=X^9S${8OW3@qj z)xKGQn@mNS3R!dY!*|fm606cfW%SRq*H|oUSD`<1_aRA^gtdUAqRJ+ zrN!)^8eKsi{T11sC*g?oT8hA#QlTGn*|cdUvzY|w^yW=t>^A{XTXRG09&J9rG)CpsEQB<`q*s1*6j8;M!L>YY z^`%%~_onlxrC5U#wfKa4mTMcR%p_T3966I&0;NKsxF#Eo1%p&iiB4MZC<5)(+O0`- zS~Q_V>1BEw7Z2jph$W=4k~Qey06ko#fVn43Xb zp5T9u1WQ(GEzuBt7G)89_$D^wp@W(K@D=bchoh@aFa5RQ=D2XTxoBNF^TK*+@Tz9T}PnMbl_S!a)bUsxCZm;*rD& zfXr?!V&-^hXC)V{LJ2BbR<u3^dIH zOrcYil_hqSIH*`j@K@b0>C)lX-f)BUAT?H1J61{L!INs< zwA5b69~}`_Vgu>#AeC}oCD<1(9Kar5?>L^NgI-k&Rd`dhcqWJP5hdcOv| zEmimdjz?FF`?;$j9l9u|JN7zPrrE}B372pHl`JG5NajHH{hZ{ED%Y$x#oj~7jo6Af%M`d+92w|dm!L&h%G43$$)k}PrM+T7$tc7*J$0o;Z-wuSW$k3%fjF{ z#X0e@?pR>9;txL=dDEO}sQ|&DZ1vnRo5sp(oZ#aqUXoBDt3a z4tTNbkg%o;=?cmPnWWn!UOWnRtQTLyrqkGfxs=^4Xpx=285%FdD}adTUHkZew)=TQ zWV!;lAnX78^DfC33M$tENg#2<3*sMD84#7z*NeY^r5xdgY($#CO8P1CmUgWTAe#kU zm$+oWXOeG-o{a1PR1W&>6 z!|TOI2nj>Q7a$JsPLdE^s)a`YrDL2D*LrrL$ep9<0`Hy@_u7a6axzYN-wl};9C4@5 z@xEy$Wz^+J_gw4z4QRXNTQqp&W>Y%c@z#Qk$|CmV1~DpK_QLg70uD%z*LB;~@oLfd zTrV+1)l1oDh5l9WxBYq=LgzeZls)-}G79YLGazNXs4`o4wwFXgMUMvU0%{ywut*S4 z=M-PA6$58j=0NnWO^{9Fo!?XcM*e*%uZs0Ibp>sax5AXy#Q1a#3NckMb0yQD0z1Lg zjDI23SxSO!a6RG!sacklnKOFeh!Su%&|nK$VY3tuCs-!$AHzW{gTd)Xd?=ord>xMq z*H{-x^PnUZS%1OO%hNa=cv`1O=M;}jy{gU5b{wTGjw=}Bh&tkDaqKH_G&&;!GeS3! zq;04TDx9i|;QG0K)jwV;p+9a>+5v~A+4&1Yi^f1;u$TzMoSz0px3Nm9P*QtLbNamP zU81ewWe(BfG){wKJ)L&YoJ7L4`;iczD8TeJVssJrn_R1U9wwh?rx8`f@B<$S5CX2` zllNPwx>p#Cf2hq^5G=PD!BqO|!v@LA2xy1S<$=Wrl){Q-fM8)X0uSe0umsj|S%GV+ zf@=1Xm`6Y>#$1X0e!L@sH7!PAW1)$j3T(JcwC9Gvob$Phn26m z{SBNZ#mz^8Z?-;hLyuKpfR_SN(gIiPj>8<|vAY%{XiBkc$fV{jSx$JM>IX521(BP8 z=!PWC6HP{%k5>Ml@E79#{|WD(CmK+i4=MAZa#tNbL~c5o1`>!Pwxb%HSJ1R(r|TEf zpti&)EyK)psrfrQz$_#I&Pgt68dTNk?~!_MqjNcx146bBkPbDbov>V>2Tmu+{GhQi zXChwY_wLtxwenb7q=hD!<0Mt*P{fKnY6^u}M>^%1lb_py?;1 zhNA_Ma5v)zI2S>E^MfNJA+(I%PCQlZ_#5$pLS-Fbql1>Ejs6m%U*IR{g~~eD&#=(! zU2wFqsRDM->2%taki#w{`>Y0lCkoNJM=Gl7Bc*vz^#~6%g;uI@wJO5Gx!{ZpR|W8q z%EKPOAE9g8H=FPTZ?IH>vT#JV%>F_y$rWyh@E)Z>6_7O}q^W+1j30cZzyS0!o$~Wm zQ1G-gxXD_~anJLdTQiDCNG4_urFOGuoRfF;Y=U=cv|#oz>P>|%I#+1--K-@qBf8g6 z`d$Es2BeT?XR2SO8>tN*2Gu|wc-CT*K@h^FgJ)=6QUaR&hL?r9BKgZ=Og02GZ3FFn zI@sgTu;}^OXh*WWLCn(5!+7`lg6r2{ICx1IH#lUrPO8bm4U!ta(5VD27Mj4#qM0Bd z%g;s9FwnY@gVz*fyd3HC&?H1FxTZ4OF8%PTHd z9i*%n3QJDklDLRO^AvA>q93ZUBQ9Mzrd!FFE7T|gN6TM{`w zx2%UGCt|>eo6)H#Q!uvVkA4Iu$Gu3gm zj-9q~EbXk4`XfXVCjDA%lWzZPJ5G6axWYYRn_Kk{(|RZRKWvh|GZBW-pj3zfKgBWx z>kOBre=@xb61B={TcGv4y>&Rp5r~=;42s53`{gANunO64W-6vnkuVZc%u#}kLATeI z1GZ>DLHzo6*;vpYWmKA zKm%2epPnDl<8#_*@sf<7x?ovypPD3~W~)3z^Cuz8lfh^*5aAecFPH*AC>Whs0X1bn zBRGNp^$j~|NpxYJG{XtP0SVl6DUL7FZUgl$wK1onxRxmT7B%r2C{~aj+ze%a+kp~! z5GM^Ga?W~64Q+jiCwPO*dLOfO5S}=DB_x;`MutUxRM6dq>vS4n-ZwQ9{?| zmcs~CLsD?3dZ7(LBKY39wG%9Bo*$J%9y^Mc7!`;659DWnW;Ityo68T`}wub!Yn{=$+6C$?g{fR0Ayfg2$r zwyz5x^wETI6%B-(LMSv7`E#FVz0x7%eut65ngBs1n?)fW5KVmDqjlKN_Bg$=sBqZ@ zaVTXQmO*ai?uGrjqeYh7cH`bhYAf{V<#5W270xeQvp@M^YHwTb#6XTje0?+~y{Cd% zQq^8eYp3fC7ty2Y;w9w(9t)`3))mXawfK=61SQdSIewrS2qY>M15ih3UI+bq3uw`5 z*+%kvj@9eA7D<9r+wjUN$Z%8S5jwmwvr&hdNG07vLjaT<+Qk_qD;{w#ura7(cSc&~ zC2Ka{#5NE*C5+%|jgSoWuEKIeQN2?B0F4aschb5Hsx`Z$_J?ujqkpQP7#@1u5tMts z6YyRcg-#O84D}6wL8vxUlghS;@Tumta+c<7FN-dkLJ@~HA&^YRHdGL2%EO-1n_-(i z_(hG~P7%nYqy9I$JI~D{|=q zdOt}a=jSpiPy%W1j0dRt_&|o3odSPG#VRAEq<#T$ccts1#kTr^a#h~cfi_(7bO<*| z_D0XM&J0s9EOF#q>x$QB+Bb{w>Dha-Ri%AkdIO79^VhS^w*?g~%IYn~JaRNOi6s*( zp8Fm->Y5>oJWh)%>w0%sz~2wei>KJ{rP1bfKhr)qSFb5A3J1!~V80i=4MO&fo|)ca z>uZ@^a_k!d-En0NH+hAaYV7sINJ}4U1=){We{mleYJBPrvhBfS39IcMO|-(|31y7r z#NBUjX%k67RbSxz;lc(nJ>m0%!Gt>C@goHmNcEqgwE$B>pcsSP|?JpNUnaNaGnRG1;5Mkge`U-?eDn2tC4 zh-KA(vd7g+jyyt+(=)Y+wRm%nD;#s#EQNt13vA7lBs&ZTd{?%z61c?mie=U(l2Th_ zC@VrRtPD2CUen^yDe+K|=5yKwr#if7W2?$VX2D7by&c!>W6IZGGZPvn^!x|CBTW{R5|gnKqU z1sSL9xZMt7|3LcQlZe^II$RDC4m}_c1K881)hoeK3N%1n*}r+WzwMBLps#(EJ`{#> znEU5FC<>a9j3;tL=Vg^|#^FQqolr=ELdie0YU+$AQd|k5r1T>^T3kz+PPDmDkACsr zsN^^4FRNx9}QK=N_70TXw1HhY}fVspz>2g zLI7MkIek8?fdkD@wA-m9~_G+ES^WAoh0o~kYdk4eZQ!? zT;@fDDZ5yI*oQmLI*QLF&r?f+)+eA2A`5KEAp49kP~YTLz*IP|3g~@n+G_3p@W30k zSDO7Tu~Rx5$?#wMv9eceU;pH+LeGAn!&b`bL{E`oUm_OWGee#0!bIwF)Qy`h&h93{ zWSWGk?k?%a-lFl*Qb(lg|Z-G;O8|oTfmyi!{AU* zP9Px3A0>d(ROzEo=hgDMU#H4&md+?>BJHuFU^*)K1IXo1nP3PCnExiQ^C|<4#;R=F zb>DYQkLIb1*Q44VRUYtv z3-N(R8KJSke-uDR-VOI|A!~NGzr7)zEEuQ8TVkcJ?9t}Qbgmz_4y;J}8hv}{L;So* zq&3ZmX1FKNA7{x(+#DvFMy^_ zsuA=IP0=e?(zlKAR10bnFcljhl#8i+IP)fh_nEoA`Oxdgt6TnovcP?dk4_^)pHMSH zHM^DKqg~Jks23NZUmj3|Eqg2Gb7@|f&lBVbqvHQ+zI_XPiilMotGQOAd0Jouiw9&RB+@qtblQLQTX`S5q|9!Pzx3ztGwOPJFB>frAYkiJ%KX<=< zblLLrL1KOdhO>3_>G!KAX2RW-Z1uu8WNsW{<+3PB0AHkze+XACyWDSZDrMT;=~@Di)EQXH>M*7zdU zc6*XVI#Qyvf;NKy$SqA2hU6-xc z>!)P@v4|gC@sG3}e58_aGIv$TW*7#GKP$2}4r&IqJfrPn&fP_Pev4~M3ln+~G6QS+ zL3`&TJaJ>1YW*XtKXRQg@Vv{VBPCENh?s8UH@p7n_TAi9*a#Ps+s`1s2qz4VqE?{i z<4TW@Z6HF9f}aJQBWFne>iuL)msTmw@8~rK{mgIqaoMOkxlyoQs7QkO*5vLYI=q|TjA32w7w{xe*!#9uiG1O??&;W?DZ7p&cN3tgGuCwRQrzJH<_14 z0;`hj?~F|$uM|;ZgR@@M`#ons7p=)#GKhc4hg*88)#9}M{XbNiBxx}T&puA7yy%vC zGe~`m$r`Gt#(&D?^H2zsiDab8$_}dM8pISuK0%geg^Qigd@+PGfwW|N-Cc;elV+|7-mrgR0 zx_q_?kUU6m`ZIyzUKft~S*tw1vJH4t=6!^GoXWPlr}{kaf)LXnvtH4PoD7n>0O;Pn z=#Bs%?ZM`wl@EYSodXhi`a{=i{K zic8Vsh)ZF^yp>C{LqkyLQUz z%w}pshmDXgiJc`V?o)bNI`bli63x~T9jz*w{f-_6HD zwB<$LnV#vHiSYCj`0wdMvD?Dm>gsN)!05U9Zc{nR*CLkPk*2t4?s zJpdUA8_A2`(rA0@^iK8a9T(Ox? z--18vN^22@3ib3F>rZDTLc8bRWI(PX-mPrS&_HsHB&G`KDW zG5#OO?OV+!ko#Py><0<|aDlO~ku8vDrlQ1BuV&0{R*Nw4hd_)#!4g)d=XwQ~1<^el znP?TzyO8}y3-;Q8NPM&^+b15t8wJ`!Y)p5J(uMXD9y_IVXZVo0cMAZeoXnngvj&<$ zz`82MEtMBtU?oADoFC|n|1WQW+KsEsp-1Pa8Rg-0q{?U!Ny`dw);rOD3zP*q728mm zvKP{m%IT2ZFm16)!;ueiOq9!2NH#?n9I`7!{h*XM+OOBz*Fv=lG6@<>Sev1tG`d8! zxu-=-jaOw7x83yO4R?~ESt47PV>u^xTW5GD{GN#<;}_0GJUlFr%+u4)KX9wplLWRM zcese_@=7_Nd|?eq+1W4f^}Wi%kK>$Ai@gx#{S>B#`Zt@xPkW#Jd)prSQ{czA>e56} zZNE9@+gsKJGt1u(S5@xsQiAkX-gGFyXC83Qa(6Dz-ROL31_}!i`co6eX&hqtu-DY7 zWeQ)93hYRQzzhD`9Z4~nCo(R*aMb8VY^qi`CknHST4&W?9;v@Qc>cd1#Y3}_#EINx zBgkv%H&*kQ8hG&KeK%#!6tbNUZVl_x_Ue7%mTPqT`itp?x`ggh{SM?5| z-ajg7iXSO++!!sFT8DabNUhQ{?LT5fTZqt<|NPf4QXSv2j}E2jIyt>#Z0Sy8#&=MW zg8>^@rb@atuMBydF_jd5$p>*-g3|(eb-`xkr`corQ@J)I;{kd=h@vhqnreTpi)JjP z-`M~XfA^_wfCPN-4LQ5q9RnV}s4}T5U55U7yp!%H{9Dm{ub=_zugqjgXQ-Vqxkb9L zqxfx%#LxU9TB7KiR!CTeDSG%+q~_;A?=vpSYJxH}Zx+0*W6GZjv$wke~ZqIe5RVcaUp~JW!6A;Ib-f>F} zA}UikODYH#RSLiQNH``heECxndRL@5L;eZ{=>^8h>i9noFM z%RO%5#3|@{9pmDeijR|oR+Aa;S{P|*P|?(nHYECkCn8ESeMH^?Cj>{oU=}B9NBk>& zm1kTp1Uh#|Q)!yi^13e6tLj+v*4-S>fP1!+t$W5c1ApG}cXf$wV!;4x&LgFBMATGK z>C~l;UoLM%&*I+s`CM#B{4l>_8!=?>Lp&jTY((qTIaU6RSAt*Y8Rci-s{#W=>C#}K zki4vK=Zg;U{^|~fnsP1fs)jU|EZ|wXm7%64g}ykM^a|)_Y|9{U&}kKAy4-~OLlM6lV>w54lfLcV)@o6f2D zpm>3j`}&?<&9M?Xd2CR|Yp4C|9@@4rBJUw1=uN|xyyl0(1Kg%xq;I3`}dAFU}DbPWR)VS(sS$@no@_Cx?_Tm>g>)Ib-YJAM;}3YzL;gOm-` z#a~{-Yd&T^o)T)7UV#%oR9xgd(9F3D&A9SM=(r72)9fYIw4@Y4T6Nm6N?8Wg<^R#x z7T)PBT1MXkT?3yeLjJ3$xDU0eUT}!+2f)c{-T9W#$9qMmll3A}Zclxf{lhNbIMU$5 zKe*m6vuu;K7CM%=%1mm-4KfK=X>q5jPdcxE?*1gWisSxtUN~w{uaU9xjuxLuLbMx4 ztR)j!YM8N0zi~O=;f|LRuB|s>e$#RBR?|6MW25z&Nk9{<+Vpu z+iXm8`>Si1tii}JZNF9fJzt8`KGxFT37l%6JR_~wN=Vro7EK*>))}gT9$eEbW}Yh$ zu$D#c3p3pR)r+xOc*j;d@s_z?ZqBEcqV4B}N`a-pg2Q3yUobS^)osuScx1T!PwKtV z{`Qi+UOIluzoxa!Iaf(}4eFa5WBPV`|w z&t|o_AtI(dcGOP-e&21bf@a!~KQeSfP7!MN;r|G}aiP?Iwl;VsWOhR~Zm)2J6}(RZ8~bnN*HRILXMBFD)Eb_jxe zokbh{PkId>GK8lEo8vm{rt+hj) z`hAb7{y)|FOP>aWC0`seF&a6}ISOfv>)#whC6xWbp1IE-mg4T`Jedzb-jnS6&NJp@ z_=FvN#-Z)L8-g8+Eodwmix;33`L!$66&Hm(kA*5b&e#G1F3!<~r_626YR&XFDk;-c z=LvR1E}FUKeqgXz;p&e+m^9q2E3X&EcM+SaOMC(43Z+Lt?0L21#-c zt)z&Ct2oKwsP6XnsH^IL%mk2N{iWaN;$FPYHtRKMP-#RE+xQ58WL;tR#<3gqlC)fN z#xOLXw;a{x?D|KPww^qg@=7(!9uO(EQi%CGeSgLsl?<#D{Zrjmwi`aP_zr(hq_6i0 z@YR8d`!g%cEYF$33M{1*tSnI8=4b0!Ui7;#ZRGzi?{DPVTu-8A#wSDQpXrc$BU#HA zy&8gZiV#w?aOJqP$aF;k)^n#K_xTfSvBpoDW82AJghyNN7C5W|=_<)U?CIvuxM%Lf zNfTr|YVtvom63vRN#@5QQ=iG)QegO4S8UA*oI%<1dA}nAQ2PD@=$>NNV?RPRgTkO? z(b?snqir=DU!!Ockn#joI`FZ5g(O!YqEnYE5mp7gYp@)@zv0|4kg}YP&A)wjN6&y0 zhS}dHm+>l^;EQ@kHC%R6TS6}(R!eI&?CXyO+316e5_+>wtFX_R>whHus{MvK5Ob0C zk(a>B9x}$BEn-KD%*XamWGwEJO}UvBe1bQiHEnXkD=`?~w#$p2!0_D8{1dDdig3`r zm-7R;<(DnoDFSS2euM)#LZb{*roK~Et*K1F>H2~98_zp`xqFK|LRQ3UF0M3*Q9p2V z$OlV2G&78Hm0-hZ%7=%h&eS_KFqm>6X_Uw0+`#_IwsXH4D z*5Q@+0&b)SVyPA_2#vKamV7}E>hLqYwIi-A`y~=aN)T%m_;yr=gykgqnd+V$u-#{= zeY_V}odjcFeux2`Ln9lgNb{23Znr6=4BU^A0-<&I%?O&r$@gl|hJYz!Gb&0Hev-s7 znOL#S6o!eJf@^7adO4mUuQS)vNC>seii!ZLO#%G@G6%w~lGwsBpg|l_+=loYQIb;@ zDGI$Iz(3?Xtw&Xb+R}uYM{@cAE;3#&1Dn@bJ$-&;aMN%wYJCc#5Lj4l(2J!UCKu+5 z8E@NNa=Nh=ziqT<3)Zs)``gxGHUCE$i213u)2p<(??z&@tGkio<~$pFhx2=cobVO& zBF^D$t?ZxvIAzln;9E#=8z1lLO-KqP&Dt-Lxifdm| z75fEW&>qtDJ0A{GdK&PtQ?6)D_>G>+lyRWM9?mbWp0W|U4yDs%9`~UxPsy$A;A-zSgt~24qrJ15 zLmh)v9+Mm8(cw9w9Ji2g;6V8KDxk9$&ykTIqQS}s5ca2q9|7lsi_{J;=q0O9ntT=UHKj&7j$epMX%yyoV|v|Z zuXe?WwErp=8vkuzr}QLmFX{+7)<0h2O3~%_gd8CyLkF8pre7xT1;P zXE9g(-8NYR%VOAHg)z<} zfFy`j59OcB2bdJ3a(CFCUYQ_tA}pwpO)HCNFpe?B^iCy`3gRG_3Z|o`D&1IX>iK41Q<4rPk?5ucJ1}MoO#-!gHNaEW+0H?tKx~E zifWM<>jnpJVB@M)9DV`+R}jE~X|wLuJ7E4^GzdW2meg$sR|#((QiUC=7qC>6SwEdN zooU70Ze?r?F%zE=KPMvj1Mh5-HhI6ESiPR>nUsfY4V?bhC(*{oCqOSlJ)~}%qA5YG$q02zIvm?vwZ#rQzQ`AYJ}EH{>7nBiC8}i zt=U)^*<6Q@y-^ts7yJO#8T+B{gLsnSMsLWD*oAZ0t9i!hM@@bT!Rsx{>RAcW!iBE5 z=-xSp*6BP^-T&$l!|Q!!4I^~3Q(x$(bRetgUGFy!nC;e7slgX2n|hNLQP%nSP;n|2 zZ+3SE!^8~zZV%hW8w61q%8K`K370ye?j1x+mUvVUJ5E91ecw>=Dq6ehIg? zcSv{d<`e+ct$uYfJRnvXWFu>f9g;ATWV>*}lI%A+Ivr*2naPLI%|L!4+$~I!6H2dkNtA=*Iqr|9;!FP z2uyj6GE;lfNq{X@f-6fr(7h4mnIi;HVT+WI?}`etJS{asSbv{Uyh6+#bxgQOsj2{C zpo61r-ldUqqR_h82~02AYrHiw@ z$SxNEtbV?qHwkPG9xC1lSFU-9S*LfrcqcvaaX9m(C~bfAzHc8u#N>S{Uj_uWskGfz z$b}~oV!bQzbG?51(f3vR)`5Awf_*3+_rL`Ip5r}-V1bwG z84!FQ6aKL(T4b+e_^%cw4)^S=KHtMzRBgER)-!T^hiS7g@7|>uECCdkH1+XgW$b!Q zuIGP+X_6r->}XAeg_|6MqBb)oGcZWkMue^89pLz1h>*Dq`MB48i3#P+poM8Skv02B>+OBq%b=APlU9*~$9n zFb5Y2Mq`C|&@Fh`lftMz(o+D!In2tBhGv1P!I#qNIQ0W*+c2Ul^=FlH@%+0x_WT*uiLL!7<@M7lpkT4bvXUd{@1oKpMj$@ ziUI4ey2f!!zZV7fI2hVkOGfLT7xU{}PorTm!87Qz`-W<*4U}5?wJ`d743!vdeSPXp zDDM4HC@Bw)5>HX@pPZ_{?8x@wphr`@Ch61n7nwoP@uT;NDz6T#J{Bha5;*ve^lTsX zY3hZh9sR2Pou9-LkN$MxUR@Jbah%I9&2@mjf6J{;kX(@OK8!N zyFrOnL9zvD^vhz}SAVS;v`Far{l+Xq3T;+QB1NLP#rdeLDXfgH4vHa?G2 z;r>G*MCe-Inq3+=LcyQmLxn+*1GhjrpGUm+SPk>so)9^-b#jN0;xLJ3P!}kq!O29g z)#8v?Xz~HCe)5}ZMNg}fOlaZ1yk z%G`xTYc*31;rop7yB*iaM=~HV$Abf9!*bNK(7Sjo#4)5V!e8S1{8nCNqv%O5CBy1l zJyYtydjgwOag4K`p2=*ZWNSkrL!SHp`48+6(%@{6kS}xktn{UWMG>ST@p0el(Nc8iNyekq>#HZ~7{loCwGL;sQ!-uav>smsuK4F}S(4z!4 z_c^`m8(Num_$6no+A+@qN=daRNXU|*4KSE8`m9uTLi|F3OpbD9nzG0vx zBHBQAp?)kJED1V?x(A3fr&eXvXP$}~!1arKkK=9(M=LE!^}jiCr0Ho<%^^+56UMKF zcnQFTn8c0mj?D=66`uBsWu2BU{a8>jnRO_}`o&V@mW^qiXuI&}GhA6|ZlBk)4vt)m z=))}2l&{xg=x_a9)!MPF+Y!mkC|wzCTP!HaZA~mtIb;-_Om{nR(|tm^tYlWn&>)yz z<$BvpDbms(BDHlTD*vpD_=P!`f#VU>_`$%8dwSA}c+e2a$?%R-0s2&GhQ+d@*SnG-vw`9(4c- zb~w`F=0S3Xt66BdKo8Kkm}%Tz0+mZcSkIrWASdzY|Gd&5M(p&t?CmvimbxAqP{%1O ziYxGa)VEk8a8iV3&IP{&@eYy*i^i?vTC;IG2E+|IxypXJw0>U|w%D*npXJJiG?daBP)c-z}z zi}OH>c0bQ=Ad|FrsA8Y&s@NNmu9I`&qJc&6AR-~srP3@M(6<)k21q1w1ef*ru_=mKZb#VEQb;Jk|&lVNQBANOXb`ky}bfy@uEvWBX z_OW{sNsSD_Bs}UA2UiapHV7y!AX~^|ixJqajQyhVlfL|mSzR6i%k&gVmNq>w$mO4B zkEIjM77o3#*>eTR;h3ft5Tp=pyDN1!LS|BPgnhAz5Wvs$rgbhTYndZ^H8hc4j~ntq zlPk=bZ3r4n5Ng&*0Myp7KPG}-8yXu)bmg?Ijv?8`&d&{OX>n3ko^_$7bG9DYl zt_+>678~yddUG!2Cb*qSY{tT&nL)1KZ>MJua$<5HYWSdMM?zm z27kl}ia!2(Y9K)QHp3-Gbl; zS5aN76R8*qTL0#gSPxd-0;jaACRkX_sVh@6(Mp*UrJ$?a#!q0$4p`|I7>~{KY09J~ zckJr!&w*DwYJ+Ayg_;B6+vzeP{@)&b*|}nwZ4pHyS>?Ihx~C{QMWAg(*P9 zc@529@x$kpXlyrithdg{zVo0o)Z=J|OrneigB%FpS-~pyi%^3iESRYMStQBcu^Q%@0J)^M|rf#?Bp>dpSIp_TJG$LXEn4Moi9f!o?vPdaPl6FEUV{_BMfIh;1GD1|h2{0nC~MH&X$t`lwm8FffH4F`Gm- zOWOs)Zd-mu*2p)J0wjp(iSQtSuq8oKM&H{gEJnyyy3+}}ndc=A4YF=#_HXRLV4 zMCgJu0?Vi@7SK+>D3l4in{7S8>MFd61}K0x!l98NphDomUA0_za}xIBUy)XANe9S* zvXHx|blHof^!)IF0ILGQU#(6_XN%9WEueORT^7eh z4u;evkcKH(FEQuWevPF1;iQ-9#MUSPGB{e&WxFH1NUO6X8;x!?_m=tzS$;64_L>4B z9o4?=q<~ zXA*>%B>ol1Gp@=Dcg>ljkLk{M&MHEU>J`gfnv)Crsx1@IcoaPy+0)cih7c_pqSuwO zm9;~eai+14Sg0DiUrR-y)!!dI&Y0_ebwdBn#0K2XUbI%goD<%d)7j5MZ?<^n*ahLu(g@Of=q-P z201)(nlqIR7b!=0MgvWvrXCpxfa6XgFNo291Rv0Q`i_TnnO!(GBd^OGQD8+V6pT^^ z1F*geFaH4E8-Ye2fCtD)TNJv~$MJ51yO`T3|_8kgOOkSIn$e3sJL;WuAOK> zD9PN$o!VJb4 zX+bw<+Pj}4B_Eus931w{;d;&C3S75?F8S~ZX#NyN9CD$?2$|QX81xyI=|&D&6g+BG z4rinrvbN%&NJ|;{Bwo z2S^r5xCwXT!hTh75fhIGw-b%;4#ncCOPQ<6TKiN9KDPi>J#$Q-VVf)zX;dfT6j6ny zKgXU)kj0@D%_g@rNu*e?#CqOv>?K=iWokxKnjI)u?MI(#JjJRa zdtTJww95eDVXd=M6nQ=7o|8bQ@2$J=Ag(8(WNyqn3GA(c(U2A-rbtAUx8Gy!)sm;F z%08Lif(Ns(DeAz>9yfleE;;!TE{@9UEwnc!2=r;Ft^ug&bg7DC1DG;gkflegPGoH1=7V?s{7O3^hZbI-F0SwucxPTz)pPAR3+|X)zY;1@ z32SP+U-s-<$kVM{yr1zViez-!sgV;@<|^u^WcgJAbTG^ko0fy{QzW7gK&7P=BFU7~ ze6;^&vd?0H z|1Jvla{K<`e*XUV{pb6v`(Jlf_no($cj1@!fA071&oPAgd(ZpY|3&x{ev9G#N7%q{ z&;EyC^^g1Se+Vb{^NxS-_wLW`-~Sg8Q`~VNP}9MkhbjWLBIv{0ml@i?>*&kJ87zKP5vpBuoPK)D znUFYJB_|jG7Dn|BF!yQP&}zh6xa0TJ?X$uc!A+7>kYQ3(h8E7ebD0nqrE1X^{RnJY zEZ7KfU#TtpWke1qDRnPpv=L#6W8Aj>Az!dkR|IEXWf=033?LLEQsUi=hDu(&^zSDR!ySTLM1nQF}aa;27)z zgyBY_4FL(^012R$bZ?e58ccX?EddcyM<v`cT9Mb_kE3C$vK25hK7@EY=zO^6H;OG%@OU-tGD66wX4PX%(?TH`CR`U7NzU=aKhC2TgT~RZl0S&I40whabYs~Caf zl9X_NDp~^opOsLdTr2SW^l%>|sM_Ngqm@B((k?<(LP;W^g|aAWNW!;}4+{t2C5<(g zMMk_zbIqZK?fua~oieP768OcsFKr6i_5ZHG=f8N6htpIUIwD!4xvjULdSSh z=*7L>US^9T45-5+RM32ptbnIXEL4d2_M-C53ZMr`U%w2;>PBQ0^1@+JcEtcfs1os0 zKDr39IC>`qn>;ps>0V$|q=aoZ5`wnjN17=hAcM+47(9mlySW&M4J!E!)g$q+*gpmg z!S(J#M?$fBEzk`pYiLTml!G1%3P`-4oX%SXMHODdD&dR|y|@7itU0|fqP$hCMwpF+ z5JfpaFP$X92L$&3Fmdw6!%Q2TyI8Ubu@%WF*%NH$QoAI96yhi-#jBSvQ&SOZsPZdN zQ9M3*KVna9IS-IPhf&OhImgM%ON)RoKNO6MCn_OSi|L_&8=dea5aMIHPS%G?ic0_8 zMg8jnGcfjFmkNLa09gMBV1U;@4?qaei^O=WX#m2lSqm^G_#dZB_b4NT{vX#)U2|C4|TYZw|S{ii4Ym;SH*7(0aV6x9rn|D8^V ziR-y}`YJp4yVyDK*?4)03JL{atd))-(#y-i#>d9P&Oyh<-N7*MnXiMp6;f0XDXb_a z#wQ`Fs>&xKsEXi|5ED|ughY@CVKFg5grFp!n3#x&7#{*-1cgNf`DVlI zmV@<_DQDj&aF@9d+iC91c=FEVm;-tm z8w)?F?1{CCPod&FRm)6>jm51V4q1imIrrSo z-hi#At)knFyX)xFsWt99ZoY0s=IPj9?-AOiLqQtG_{n>72iuj7j1h(WO+~=tlwJZN z%oeZOmbR7k_BX#ifoTcZ;<)7D&eXm*SAr&2d z%@aed34x<q(}QSBa@!7qC8NnF;-sb zp}KsjNnhI9*@GQROEQWCk&^H4qVTfX|LkPtWW11K=X&Nym!(qxIbyaGmQ(4I8oj^w zIIgMs63UaCd$sU*XCcMnz`tySbs`^RQr3aboRDbXxvC>uAkBQBEyus2x?KE_KW{xK z>(_^V1nu8p5fzHm*S)`41baA`D^khc=UI>+4;6T+h%lF?>)NgdyV|}bPre`4mYm-& ze?96eC%cf7o7VL1LdUhGr1n;hYg{i^uqP-bXErn<+S1F ze($=}xax|yw-D;);uI2&6lH2}=FZR5HoYy9w9OEKKSwo>hYTs+7ON`{>L+e(==!gk8f zvjFf-t9i9HV9b@YBeGjMS1oO*(|kBnmHVV^(M2M~&Q*>^M5y?K#Teb4X_by-YBC>1 zZPiWTACz^))Cu(v_UF-o#U^_X@r!q4uNxkl8QcC|q5FZFOjH6GMnz4_iF8vvB?Jqs?8$ zMErT{)>HAt5S@y_wUw{noxgE`3L$dVjCxk2d!7#@(Sx0rz{`AK8$@}#8t{COP~G_M^VCSku>KzXcs;*=H)5|xN4MBzpA_hfZ5#%M z-Q91UUWYH;*P0&PgDLJvlww!0%3^V1D--T)#+Dd~IgM-0ZEd=aJxeFMCkNA3G|2L0 z80CyfS^mbuj?KU30#la)K5be^v{Xl{B(`MYO<4mj6=S}{M657Nsrc8MzI>gghp#4g z|My&nqt{Z8G{7DCw_~<{@c87i{KMs8fO0sqWlGi>!ySKTYHaG|C|K01q5$0$VgZLB zAO|KCr|7{h){1Fk$tRTTlr1&+2U|Rv{1wyR-!}i;e>J+eDJ1!1ETdphfD?KvFuQ|GxCtim%A^oSk_G ziHLQ-@^~%<+7`jiwP_QaFsr#I`8L9`UQ`3>p7Z0symR}rcB#+v_vQ7VOsJAqSWR{S z;MR@vELK5~(S#FpLvf96Q|uHno8T!gPM4=7xw$Gqn;Q8)QF}Y`Ix+G0#oxq-cX#DR z4&w8nW5kAb7)zf1XI< znOY4}!S!H@kAUYOWqJl#ZOvN5PYJphzADdIIc*uig{iRuF@_(Rv0G8pIE19ME^meX zd<@6rxttoZoQ)re$IU;gQ8+F#Z!f`VBiNa)+`fqE))_oG45=CjE0m}GyOvsJb#r;C z^lOZf=-#_*vcT+q_)z!mt5Rmnml2fEcDDIuVB@2gUA|I$2CesHuPxr_2nf_p?R>r| z7~DDyRMX*5!B*-2eeU<{-}{*#)lK7P%j3(Y@yg2DTNM=?HSc+9-}8im8$~{T{D>SI3S^<0yl^K{`@)HJz=sVDx*(7C5S$6JqUavcgI5^Q%=px zX-!v~{78LL?|pFR199)ER)o%O##{Ki~p4|NW$$bS&|3W8!I`UWO zq)DHfkwJ}*tKTJ`_UOh=pqxNa0G3{9Wu1|jo;T;KOmd2!LMhYIr5^cHtxYHQpR%%h z&P>f|l}6kPYk>PjNeJ#$jABV7Gm~s!P*C7oT0;iA=xB#XZz!qRF&|9%v(u4icdR>~4N^`0vggN?ee#>Ms5+|xr900Pf1 zz4-=j9yFBHhZCZtwexRtnbw%A9({bWgl6gaeeMD&)H4qe7Z2T%UzfOA$CAX`F<~fV zGzt^DGs#-7?QA)_XHQi!c}~N#C%(aWeM>YDrpbZ<*e&7CXfHD;yZX+5`RqrvZS$hX zkEHtoYF+>*KF$OD6hE|2qM}mC&57b(kG$N{E@LtOcSB>tY2#_i_AJKVLUoS80hROM zkU;&?`Y3xmJUoh*6mPkCc^>~z!7hDC?l`|f)vi@%GN*X@p(%^b){8)OlMkVO^^WS}*L^~CR#08ng&%BhCo4%!{ zM&AV8@}SHd^%or)F1-YV!&PIpc~8SLgzBfJ25Wo*a|idQ>!h;iu5Q;^X+r%n>))MC znHVqf@k*m2e!7jV(}%vR3VEsNpsV+`-}~uPQu9TZUAC}KxxsH{JWRMnUk6IeXXZAK zt^@}0kKNy61H)CYM@v>Cia(H^1erRAy?60)ER2^gE_&v9&dpJAMtQqwb^AE6zDRIr zV%Tgb8V0f#Op=h8OM9iPsnKpa_|#@<-GAZ-%fdq~x5~LHvu7f|U9|P)f8`g>m+tHw z9DLf@sat41^bfUJak~lc!MZ=YeQa8XT3IP#Zc05@*V(mG7*S6+J9hb=@x9u0mc8Be zGq-h@{mRp)#Iho*L*oTUuqN6&8xisCWvy5QrU&Ze;<{55VBzes-O{ZgrT_Kf48qoLUCqUF#1$;qy+uE#@V zd#b?|z0_qwK&I~O>C~xDQ|qQj*yo)79XGMp!vkM8cYb?FWo{hC7d%fqYYYA|b#NS* zZ&}dkaHm^vw}ny&`%`;-fjxx{NJaNVgVZA;R=iibDIO^QWvry7=j`O=Z9QrDdw(Ki zn56W<(fL)GcUTOn%DXB&rYaQTvhAj={GCtt;Ms3(?wZL`i~#6#UwS{=o{(9WEb11)}{zNE2woI zA;znq7TKHpO;C3m+6C}uPbx~94aQxTo#f?=%C3*i&p1fHW4fifYN~8J7h5xZ@vSaX z>77=gxjv^wN*tS^m;5FKWJ34j03jIM-xRSz zL&bZuQY6gFE44;Nl1Y%5JP$#hGttc+Cxg%v(2;6|dS5WMpY%7qN9f<9qqWw7*9;W` z!u^`3FDN7=hP~-??TIW80&C>tr&pEx%%j#bRhf6$Wz%!>zZqr*Ju?2PGHn>vw(F8& ztTN`O(%J?p&&uk6oq}L4b~tu!yh*7vdhgkq8>3$jT)@ArufuD0w)gV#q9Eh;8F&X!}KxtXfq5~yt!URm7#NlC}Udba*L=vo8_ zKqQk?hvi#*>sdYBNLci6p?=s`qyWQ3{SI2<>E{@gsdo6d!km$4_L|7V{gV`VBGs+r zN9TH-mevwcJgkjBrIX4=hB_|m)4R$)xVU{=rpA5g!u_z1WM1c~h%hYHl*||U`ZBEs z`_hH@TH6U=1(P7w$DvTYiSe|U0X_YRBM`&@AdXnHR0kXsCAGJYBe0Zdeu1%MMC|pA zLiCMF)6yiSU#X{w$wmaB4bJPT>}KB84cOY4x!PHR%9-CUL4kzSF{zu&ZFXJaiQ1jVTj_Cl^c6sPH_l1)~ms%M00(He78&Abbp`mJ+l8JKWB(*KI` z=My(Gp$7Ym4rG&WK}T=&Un&oy7K20Eo$1$CY$61cp%=qyEBlV`aR4Y92;{qz zcGzOz#uQ9wFrjAt^lnB<_ebM1y1|-#pC7y8uoIK&>WpnKZwHF``93!ZVq%{3FIP<# z8d~@&=3?lJ7Cda9)^v0eKq4Y^JTvy0T*?DkEDEQ(jTAf@d@h!1fbW zN5045+L_j4W1xHYZeYOJ%*NfFucd9?Rrkh2fT6zbD1Uw3-d1IJI9`y}pjG8VTdC~V z$7?wKGxMdZpYH>j-(6fv7_SeEX4-vfZx@matqlkYx%v~;5nfzfP(_4zLHcr_eObhn zkfusd<_Ooz=Vzv^s?P!q--+6Q^yMIFdQd1VdyVZ2=z!Y}GLTId6ZXN7Da^^Kzko8@ z{N{#KF*i!&MOv6|c&=}h{bZ?b$-9@_pSWlCGq-dPE!z`rxn5~O*pzm)FGO7Srz$}u#%ja zhsO%c*myKVtdVCfEiL-vhL4lJiAkfO9&8(*gWluL>BA2(!el>XIYzYPwZX;*Ncm;{W}bycL(JazbFR>IZjr7PyacK?*F|;{^ve!Cp^^l_`X1E zybYI38KEE8mHZp6U~bA*}Y6uZzX^u&iHgyy^v4LsICUC(hUo_{fy> z`y3|`UZ#@xrHV5fbgHHJQnRw|45qRcvFdJmzF<9$&)_&u&S1q@j`IM@+iK9MRhQAV zd`+=s59^%W00o60f*|ErHahx1TwI#Q-y=qv@uEP6G2vOhJkLdeJYNE15!E2eCr(xo z0w#xbRdpK1rF7;{RyKy~GcJux{gV8b+-2_`Mei7t^~Ak1wMnTpeLrw!T0an1ZR&~h zs7id$ZZToU@3+Td%ZK3e5yLi#b@w!axwS}&g@u8)qSC4BmG8k#`h(Au936UXy+}7l@rj4$4Gb7uMMOyO!@82 zsiuTn2CuiiHeQ;TI5>_Y?PajkP31jw{iV5bun{ftcWUbE-1CDkaCaME z8U&!=!6z|H@CEyKY8-Frly9^1Vh|rMI&Iii`um&Lspy5UY(xb{5q15#60(;-Y7HR zM|lIbU3Q0Y)}CR8mTfl2*}hV5bSkEHe5ItN8PY4kHpI({V0#)c`Qy>;pe1Wl8Td<` zSj8PZDF*zqsUkh8|HOPbUlNxoMJT{pem~Jo-^il$O!9g)anaUY7of*U0f|17ecrr-%JhRm?5lL6pDB3# zpP=D!#heMNqhl6TO?0iZ{o)<}E`g5YcFYxeoP3ykNY@Etxv*_|xoSB}xh4^|CNbcB zGvJ-HcGVBFgJrEAv|m}y`fYF@@oiW>ukAfpO16fm?=64zoRJ{;Tv&wi? zUpsx|7Rpaqg-=MUsIr#C-qAw~5;Rj*1`+j$Upd1=Z7P`*>&f=y3?o{?gp&MO`vg(U z(oar;7wdotkNCic6|I+lqhKg4a5l?`2@pauu&Zw6<_(=V9J&o*gow%Y$ ztdDxEZ9)gIr4J+-u2I#b?D(Xl8mC?$w>^N5vVaXIXT`UN1b!fZuAaSw_nH) z0c5%T3c#A4MC;!S&7g~kpdV6-tL}r>3B{-B@m@LjOlCcdw}&I_18O5)j%3h-k7Iz! zVHtQRqgTx8{KY&G-&f8FBs9*5xU7wsrNr=b8TB(Zw!xm0B8m2~n{lgcJPn2+Uo+y> zd#Uvj8-ycV^g`HqASiZy!Q>J=M2=Egxr#hSbJh7ckKF~IeMs`Mut6(EOJel9z`9(4kBUw0UPWJvl_ z!N6MxQoU?KUJ3SxqX115aN~6}?k-K)u+_~nB2H2*qA*9sm_#u` z74=J9$Z%=gpgi+QP|FRg!SVQ9F1Aq#{qUYO8;`uSBCeZ_W+gq7DVkV^ z8A-f_djcWAg$Bh!mIXXV{DhpP<)dD+@!}DYn=X z_+0*&1Me{*rb1>E*ym7D=mxxm84C(_Ux~t3ShE1R+sTR`7R$R89cm^=r==gM`VVTF z&ZQI%L!+;Pykuo3YH=?qPxI?5$HYKty4@#N*W+OYsgu7?nL@*K&M(ss_XU3bVpMj! z*dMy*k=mliz(k|AX5Z_D-^c#h{&6sU?b(YB00!Ko$9dAv_euetc7fg^yRWFHcmHe? znJdw?J2!DhcWKxvbeq49h+}|2-Ar(pr-}e43MhUo$P%G?Py$w9F}xPai-r9Vr>so@ zd8==LQMrV&Wdli~3j}lqm6Th`N&@j6tH@?&P7U$jr=M|%!1v< z)b}jo{YE`kPO&{9h#vTmW1`SCnnYt+AfXva#gHp^_U@`SzD@!mnu}mm);JcRr9V?+ z_Vlucp2_ib6FyV?4CkXw6i(;vroV7v%h3$_Q(0Tb3^ z%7r6CQ2#;lW~%Lg9^*Rn5Etq_4x6G8S!9&OLMdrRcd`~0y#!zcg=7Ir|7D6(vQpoP zQ;&PRh38eD(D|^#C=Pw3%mbPC0by9q&d_q_lAI<^G(lgyDH^}=_?1@X%rP(rL zY!LN$t@hvN<5v20&q$PJihAvU(O4W*x@R zql-H5b}GEQ3HyHk0lT=u9JO}J0g(65Sp%olf7hZW9MeF&u`qc$s5*x}Qu#=KtDCig zo7#m(FTe)i2XPliejzN>{1f%o|Lq9iSXo55qq6Y9M3NknqdYuWl$c6f~?!EebbKGNvd^{Kk&~l9Tc4gE-KjL?{i}SF$n(h<~OjgakWC zn-K7NTmljiq1R24$eY^7#G)dl69<)e7p1YRV@>}+k0#y|$wGEAqDDS5hsP!v`DQZ# ziD#Kfk0K{d%7$SnVEsTsLEI;ZUZA`PVI*a3o{4=ILJedWY+6?jVYO>q6KLhR{F9EPeZ{g zuB-v~cuFu!T!V21s?aWQI!LwWsaK(mBC4#;VB!Z^2y+{NRO5lOND2^)ZhWyI1mb&i zV254D*H59_f;%Kv%#>(VFOSt@^u^FdToeg96I``BTr8ohi z+oA?M=AOu1>R`PQC-xZiHhJ+|z^h4lT`Rb!9DKyu_eHe01{^fY0H1xfyiRiV*6N2z zXJ7M^H`6;RN5+87X5X`npHzx3uN$p>a4Ba(VLhaOdUV@~lg03`o% zZloKBnEd<%lYn9k*;+@;B`Am_4G6+b;R>wZ_#E_X!x;AVDAacF&YrFV5rT!upodW) zuaYmoC&2yJ&ef_j=wv8Lam*o>C7=r;X6ofw^cumLV;pgQ8g<3&*A*&)!tEFZ5U@id z*i599i4oueHgY`?ImJ3(=%k+n1$HoL6_`FnLK&=K&)Y|a{<#bQs=4E6$SC5Ye$r+IRvNRNKuGM@0f<&hCdm zp{^$~tkH~a*b3-U$+IK9-ax1+WqjVLKAu@02@dB9ixg0nng$MFeQZy|PeGEEO$b>9 zB5w(h+!ol_qU}k3wqKp{qkP~}Z__l^HN24_pf3-VbwG_OF6wk#zLe)QjkKr6GeFxy|sF#G>O^zT^=wir%DWPVi+PrQrAFmh99?i z(R|7m*S+9^07>@$LX*js}iexT4&2K64Lr|gyk?8iS7>HwY9>##VxGsPVTP&B+* z4AdAkaUaGbcJLk`fFNFqS9Hj11}t6~UlL02F+mxG!%qLft7s2N)2OBw45C~^FeDvu zRH;3w8?Rj*AC8_QWbHt+!jovIQ@4K>EanWf%DVLqBp zPl@-GLU-7!K`(2dZy`cZ(G;^C(s~V9=q$Vmk^thb6V&N(Mgp=1fH*J9sFnEHKx8h= zj99lSb*c#FO_bnD0X_M*2pFLV6&3NGjszRwiw7_EoH^A2(AEj-r~s-wMb%M>vZ)&p#R=z48;kjz!ul!8ws|#Sl?BKxh*3R#1^-{L3dq9)qh?%Lg zbxqnVC&wSVkpdj!iKB`jq6}vMoG5%n^f*VzxLk;$3iBN_71$bi@*TAb+iMIca*V|n zq>dz9*6<=LP{3W~Uhf9zYNH3UsKx$#%U&vxMhzcoq6!t@S zD5y9UI7#uCmo>Wyk_Nc`Fl#7|!h|^F$T$bUnQ=vV65QiB@a&gPJ^}1L!gw?*Kgkkl z14(H#J}ry0u$r?!nK1xp0EqBh_;mgjhBEWdBR)P%YwxyjuWyhv+?G>m(i}1az859_ z(C6Ohl1mvk)$8*JI93G@AHq8m#%NNPrn>$HQt0PLJ(nL01Is;ov^Wy?>v>%T`7QpR zyWQrnf|Nha(Lq7X9ZSvy4&`cArJc1`Ja2E_bIcyrg1!EVsI4(}UEi~A|HcJ$qG^<_ zuwQhh4R~tV&yXfj7-wfc;Ex=kxYE>D(_c_LRh&;ywbGQR1WSF3_DA<98h=cq22T^< zp5O@pGx56d>=c-~yMzc8X^8dUw7)Fo+*gsfO@bI*wmjli6~dW}KFzkoOtv0*OO zm^tni)Q?Kz1E)Q;;;`+Pmpzt3=!b)%_%R{d>bZ4V4ZIA^25(>Hm^K%3v3MA$7(TTw zXXj+><;;m2PR-!rR)=yv6*ARWV@V&6uSYRs7qNCcI16Yg8i%l{V7Y-_U`^PdK!Qbh zK{Q2kefG$bSWy-?B@f03jK*oEO`Pq%?5(!y0Gb|B07E<6#Oph@s!XG8GaT@RSb?7S zmj^&a2Mh8N3n$(5g!U`BlUKwcFXoJ};TNzVo<+P;`U(?5S$jwyE4wLx8S2^Q#mo7E zh`h>%XyJ6kUa50CeUphxB*S`O-meNrvCARex$?b&f$DXgx=Er7a2oIHw2&lglW5d= zy`RcxsfU1ppH@dyhbErTZYgcmY>#F=aRpip=Y56|!Y#H|$Uu#z3gBTE2)glStzZgQ zSLX6;hs%XBqges8Wj`p7B5t-m|R)6f@T6l$!EnjSN9wqLo7fi|90YUuM5~ZP=NlTS0j_ZITiCty;GNcY)r8W^DT|bJ7fD)~n2_i~3q)|A? zaF~UR7Rr>rR(bR_9n6S4dDu0nZpy0?+Tc`SA_tl(w z_JOmd&d1F!<-Vl*^sv*I&!V#)q+2s@6~CF(J-2)QcsXmR75>>YVitRD;f2{gfy9@? z@ph7;HvaDB6NV7t;&937S>a1I6Y!p-q@h-`bB>7jN-e~v2@r;Y*{yt;we$C_l?~vOK9+N!`r`ZjFMPDjLotbc+&5(QrJ>WW)Tr@^)WU3wWKFOvlda>M1U)B{pbmv3;&VL_N5b6rIPh5$9(5Eam?VkoiX9(F zsd=LrX`0lF(6)g16x$q;&=zCG2R2c>c^^^X1%bI}AT$VVX^SJ$dPvAt@|d3>K%|yb zal>iXg@XM)lzEUK+SI7p7iPV-k+xmKAG`8cpFnUBxNLuT*s!JlD5HZY3-DL0i&)px zY?1Fu6+GjLyS4EuGoBDCF{)+tG@RIv5>a$Nb=v^(ydaCZ0PM!8YYtoeQKQ>#Li^1< z+>3&UiFz9d6@SZeU0sgM;BD;fjU$Ls2B>@^%(}CdO47|t5_DU;2ES37)Hj~`xI8FT zX#{YpPuS&ABIlPi6(sMahmG^#;&p(z3>??6aBF@nwqqXimijS(&U_v1`;qYX9I z{y&BLmo#5>{{|?<1gA3uYa(P5U}Q#kXHlb4D(XOiN2Rp=4f{b~-rm}rJ%9cELzlyX(#hZGzdw5_6pm_H!yFOe#G6he z=UYK1b;DZ~p zl%0v&7f`1~g^lBYCaGw8vK!q@d7CAV`O!`9!2d7y-ZQAlH+ug}Pk;cShn~=T?;q!_TpaJonlVq9}J+S#H z(8HS5l|&?@HA&bC)8nIp9SAN2NSa3&bdMbLD3Cop2WkKQ^3OG0Cu{LHE=983?1X?4Mux~Bcm|Q4zz$|uqx8>w7 zbS1=8Z!h33blpsXqcyWC)47gK1#BZncnGO2&M&tjr1Cx(BLh9lO|~jUAq+xAOpBls zH6v`$P$Gi>bkU|+7BmcK8&Vw}C9Y@DKkw@GC8}$0+eL_dU{QNl#Hot78dOc|>XIoB zPft$jAt2kj2)c1|tz416kAs}VbVIEd+Jk|67KQ#js)h#%S1n=s;XDvKU>aBDS&^+g z*M;oQ&?yTQg}+4rk8k#3Vj3PkYA67r0&|C?7jvB73c)8L7eySA>EE&xlYT*Da(jjA zxJ#M=CduI1_|7OMkpQ^4ZqO)+r=d*qd!7WM|1qL7*l8I;2DUP3sHaqAR=mtY_AaoDPu^7kn$JbY{4|?P~!=+vP*EazRkfmI0 z2Va3YmXYxCXIf1uzTNC=_QBWbimv4qeSv;JFPTa!B{UOFP1A^S z#AhM(tv%1cEMEBwZZL*R8ywg>aoX}yqL(4c;J7HS@X7@m+v+W27H9(9ry=flnlDV* zn-mM(CNuTu62B`gBA4ph##VXART^5NvW@NgT`PrMHhn@>*R7Ci2iMyj)@+79Aa6T{wOL5cLQ z%I%ItV*n2?(JYO12>JEggfX@r2;m3|VLSP+)z0SG=4f(>eMDeHZCY?xeNIr{@$6np^x(E3x}A3%gnyMHk`YLmif}feDL$9@zu$}->O&6=OV}Il(uUO=H`|`l^^pB=I6?d?u4Z3 zmbN^lyWL{#03a|e0zQ2JL~ALe{)i2fd_P!Oj?!Q*)n|Fk1hGw}(N#2>!*H#0I4laK zOJma!;)%Xhm2*JmV|79hA8p}Yc0Vzn-vO!wb-%WggS3KSo%LF=@( zIdcvVx{rlDc$oo)%QCjh3<@&Qr^K;{YiF)2(R=cZRAV%(C0uDrRBNbPxu}d`8``eW zD+-A-G`j3Q*{g^Q)jxySi!5eSEkE@htzeNdz1^H_X}_q4(%Cq`@HZ|V2AKDFjNnWr84 z2QnhOOqaR82n8hp#C*Qjr%D@tCbf_9tn$=#aR-hX)CEBn-a%aLbgp<=M@!ym${q@f z%@@9WLxW-18*=%s@My-eWff0MC*`GU4?81DxNIz} zOEA0oHt}rgQa1sfT&dU+ThlRPnS8!OjI2ybA<^ir^9+YmK|j_^s;RaPSjidTM(_L? z^B}$R%BN-X5AWqll%WUQN8`Eg9^p;LM~RKGZ@(;NK+zMg{9q2Cn*e9YTu`aZP4@TG%g{_t+kg5ANjFKI$A#1l{Wq4wilLs_56?I5=!7+@X+2S$TKK(gIj?*7##?wMq zY`&uAK3;BJj;`1+6zjaL-vJ(r^BDtPyR7M+!bo}8dVp6;KW+f|IcU^>YV+X^?R%a> zy|MZk7RLRCzp_?&g6zyNGc;AWAgTcqiy(a$lnIyj>Paml%MrrmGSe_0J}PXoS9*X> z*H?8izN$8=Tl-T2riEA-BJPQZ&A3=K+Z_EGcKlX+s~OsUo6nEi{sQbdW>v+3C-B4_ z#*lMc(M0>Yl(B_4c`@lYl@=O zwdG>}-JO?%>*(6dJu;R2SB;&IhJb4iJO|Enr=ditqt-F~TIQ$n!7MslcQ%N=oZ(T?=Q2uA~+S-!eJZ{M^yKHRUB3mYi@V?5wPW2PYr~5Gh9BYl( z;;t?By3O(|n)1^5^}v(9+2@3>x?Wemei*26VSD-;cg@KCvaajhk)nV2!JsFq%})_O za@NjD;%{GMwMxEa$$WA^{>`m1395Jm)qx%g@=p~oKUshe?LWa>0_*v1M^0_?f1gC2 zwb?3y?uKlp&0g1tZZZF#!;Ry1nTu`WuKhYcwwl5;zCi*?M;F}9vP=^@gd}l;y$Y5y z>?Al2G?Q}6UTZvF;L5mleWJpH=0$Ws5FT0+{KI67V-m*VuAr-H#PiL>Pee`3VThg^ z=*!m<6Hq8$a1YBlR66fY{myXN_vUNQCixAfa(zpq^c{03(KNREnWT2AvP7M$UHFtg{6{i@Np$yf4y-Q!d+_LRqPW^QwI-oEf^qDX|yRc;y+ zg*wHbF5ZF@$F^BhS7m-DUtvV<`Ez5=gkWlcof1(tE#d~XBlqi#Co zmOKzY3-V=lc2a0VEz@6j@ZlghhMC)bK+fYE=$$4ckEbguL`^p&G=p9##;h=}Hn5_i z%z~vsY6F|KV$CWHH7wW|%4(;6Ld~XQ{57`JrM|r}J_6A#C+!G3U2s%8C4BXCkclPlcK9MKf_#FtJZ=5+llq83M?CALR`9EbOp9+rj|%7yJ63G9Z-a<}2>v<* z@7pnq0e{Hs+GSOG`%Om~i48%bR745g>snQ`5KLr{iWf}{msZhX4DbHe0w#ml7B(ru zSaOB^8ktI|2t>Dgl;~x8g4w#UfICO*AYi*TZX_PgC58+#3gR9!A0ovY-|tgQut z&^s(u7TZ_!SQxz!7cQdy=>1^qkH>B0`r((x<%Qp$H#4uHPT4-ovS979?Cd4_@J~sE%oTD{iV@zzAE0IGg{YqAp6W~d3Vo`gP zvOVw>8}bXL?@s&c!PxW7wfn^}Z=C&xE)R1Gz|CjhYij7FBKvdwksLM>56ok8^<&vPQ zRttCYk?lF99BY7$sy?GB(AWwKc7kSj0svJnVz;{#9#yrx8V(S5AqwXs*42Gqv-7Z^ z%U&9ZooTx%d#<-Mhg|IQ1szZ-j#>s9s%lU2c0JS#wl6*nO+y!9mrWYdJ%#ieN+ZmM ze}ZmlhBzOG{46Xo^q8gIOA6+gb{>1C)b;&rr7(iO>tII6@%!BI_eMg2`(kLsAExO> z!PI?dh)dA6?D|4na6o3r#qNj7@0Ys69r+^FgwFy52No`z_S3fc#){OJ59v;yMIYhs z17nffhv+i{Ws!TUKLgo+3BR>`y6Yz>qq6e#InNuwW$xt(>o{Ux<*bGx6T0Zqac#-d zT*2sPD=|Xq0?$nf(_sGWF2eR{Tp%{XeRll~(bS>E%xC{$Mr>&fYJCjdenrNxTi!PP zefj%<9?plX=wLQS+QpUi8C@)ZF%dDKWNYjQ<1ON?w{w@lFVg7VtA5tr>1~!o6!h?Y z-YyZ=*irR;^DCbFJ$AGH9-Wt#(gHAR-tdXQZP7i?x}V=(Z+0fVi@34os-^^c#{Pms zOLB=1ck=*KV(?IT>&Gr;LWuO#VI|n=h!YrHd+``|Ga&+XlevluAH+suhwQ}9-kvz>eP5lO|V^m;f7_9=oNa0m>Me?HwE$cEnVW}G}aWA>&N25ey3{``WQ8C!iQ5d zjR+kVpUZDlC1rLrPY1ka=({bDDr%%8+#0^|tbdVtjhOjz?I-mdxD_N4P>v*AbO zRd58Ud{xFph}C&JsBi?wUX>(-=iAe-mR^6BX67ZMi~*DdDVm zojmufwuSb6XubJP>Rc6qQW-y79}fz&sf(|_AXO_F`z5&rzz_B0)&`|}Cu(lkv+8b9 zuJpDWY%ct=^n+=I3M^L5MJJs4d2>o%3$d0d14au3CS?9f9=ZW~=^T4@CsPpk?I&#< z7CvjP#TcFs`pEdDdh=<)-sk>vdeYe}f8FeHW>?Fhdz3RonbDl~*C3+Z>sVGcL#?N(?aMU~dvQ<3HXZJ>> z>fJyS7UPT8MS#GwZU-3{4lRmbza~*U+^_2>+dy6SN@w<7_RWibd=OD50$*X360V&g zDAeU6Bz1UxZ)X(?Idu&7^L65ta>jClflrKd@{k>r+nRD*kSFO%2w z8zbp4=?0FEz2k~-Q_Ko>>yh~aPw>-N`LB+T9t1HU6Hb4Q^YF!H(1jQg9|SCBQSV`X zc99P~s-M*JHQ`tGcW%et3kbVL6~=LaOjcdtUEn17-uJL`bm}`?DUgHGhs&^0T zfnW3?VB4iUeOeCofaKW{R0`^puI2+;I*duCnZ?M7X;$~%GMITlH8Z}v;bVEAqBJkA z;RN{sT`M=a`jvm`bywR1YCWttZrgx1pYI)QwwX`)lFRgMIABg!4s+3aGF5)aKg_9y zdzt+~gjLVz7n-)|2d2ZvCv>jT)BfLl7kuDDQr*k+Z(iUc&DdMqAm(9oF&DDj-)>47 zJL*NcHt00NQlpJk{T+f8Pu4nMx`L>hLFy8t1IYOaAcncu zK+Y7$g+@BQ(S)gGoyQ4zjz4le#RjCc`)q%e!#%)%>0m8}_A&3?ru|Sw;>(n|z{?nc zEpyF}o^G<*^SYgvvG@D?8->c+BL4Oq|4ts%Ry{Q@JcRrno#Ty*eeuL)3SLxgc*^!E zQ@Yj0cd8D*5@zb>XOTG%@WXQp8VJ5O6u}rL$W5tx(}0Bc+U~G)gIU$075OW~aAKAFQs~Y(`*@GhtPVHrCAj zyYWP8j4Yfk5|9^s8Q4ULjF&;)^jN-0dy@6=JGx~z9)B`a=(en3A52!>f-hpS=Po3@G{|ku?(nDNzQ>1R0=hek zYq_!Gh<9ck@wEq}$O1QNoZ{!JLR0J1izc&xPTW*SQeZ_?eAtC?gZL5~e7JS;R>CoI zq!sk+mKVdp+UA3VMvjLmR%0iuH7jSXzHThs{6Po-32p@9O1C9o3WqriO|aY-a1G> za40*HM|=wvl^+;qaz9KsmTjqxKtq;oI?Rtuocf{O7vf`0?(PubsGS;wEF%Fnb<1s9E$)&1dFA>MsE1Tf`Rp?MQ zhYjH|Ej&IL%-j5oP*w0oWIf6z z23iKfd>;;VsuCEhfAKB4Pnf601qOD#XMEv62?X|}?!30$F@tYBXYRRd8N}nU{VMl0 zw6av?$hEINp5n|KeBlW(Vkh|&w+u5t+xJFv@saO^k* z7}Ry)vzFu@2dR{>GMb_A7~f=G+SdhQ3$s)D z0VGn19Uq`huW1H!DBr%xc<4zEyqe&X*d;(&*e=YPgX4BTL7=dIfQk zWQ-{2KLdeJ3f3%__&VzfqU(@Rb<*QpS5afsZtBzeQ?O*{d4S8A`g=TofUwV!FP&ZUP-Z8_5}XO zuf1HmpWIblI`FAYelbL?oRD&BCe?c3-h4jLH@>2gSa@Yf@tS7n%^3=4+v3ZYN(I8O!kjJNkC$z#%+(NH!R&m_DnZ`(}=c46r zj0%JC`_}CdhrzfSOt*?g0x4xxD*akfHs7BNABZVGr@<5qgi52-Fy5yu*KpJLsgB~g z*dWGF!cw8s4%t#%>IU7@%_@C9&0vt7gJC>eOx;#}XdO3fo+2hL%r5bvWhXZ=Ulc0A z0FQXgtIuzJW=W=bFFlquT#8=}sd^Q=@d@RYxqOZFt2?DYZdk|xxxfANaP+d#%a?1~?tyK!wgkHLZy zhUa64?wJteTpy>{7_dDvvlo#!5G{GG*gh#^YpT^;UD^f*uIv)}`-o zYR;lSmZ(kGEQ|kDUHevSk!qLi)jl_57sPAu@szI@1kuwvfao!Xb4FFIngOe;@sOr( zLSJz$Q@X~mcx&I`nd#=@K6bt=yO}=l=&o6I5*uTA`NuuE$i%MHlZj^AHhScIkrSFi z1dU0U@(t|(Y}g!vjIEspL05_j5YK2kN!Y&fS|hKzWs^C;sh@TTe+zNQbWF--lY7a8 zpOwa$C<7>T#x($(rP9+%#cK=`=cN^uV=NTM{LKi%9t|vuHGzP4_mNBh0-R*XOy>V4 z)hUy&z+G`nSAR8Rtb{u_ug6FMMp8;zpYXSuee$yTz;j&jqaqB`D zGC$%stCOQhsY}Ym#(5KyC4vtz&0YG>V&BBCY<@0?lZ0GdSss*ZZrNt2Hk(&V?z(>T z`~)k|G6&SH@E6my<;qA0JQT`Xl?|JDYeM4zhK}7KJROFmHpsR-JF9i0Synf@3ILJ; z*S1*=MV5i}n_#hFJHGJZ4=m}Fl$t=A1SBDkav}TQBPEp^+B6_~DI{LJ9YYZp@f=Gh$Xxf}!hGUs9tW!yjt)~!9R zm)???`YdwwhQ&o3fj75^nc-f@4`Ou zeHfnz7oGdqtzk$uN<{&)BY}tQJoxJEH#0n_mSi*eC=jus1v{^u_q+ zk#=h$G61_w<{v38>OqbfZLIUliSwqHfwWiV3v8u|?i_x@l1Dnnai9Qccw@eA$EpPG z5^^NAUYF`2!~?Y^1XTvT23S{&i~Q1|d79_>^fR2|3!SGP$}RV^I~%G9Cjh)9W$q5C z0ws%0AJmS=K%VJ-GV?TMPDP2mb2F>&9g`zHZAFShTU-HX$>pM>z=O>n-6?43O@9e%{C;~*J* z8~xJkla*uy)DcipX7!6Pj~IO1jgi8^6@WhiP-cmYR8Q7EhM3IthZg8pvGIMS>=Kke zh&v3Q#9~Y1BB7D)M;uhUVJJRd9XP!>9P4gtoz^u&TS&t%VgbK2_c#gN;-2uK z70Gg5uTS>5ws5^m%;vCf%FP7{=`_r@cXL+C>M@169T&s6aDjAMuc!n$HgEy~$Jd?k zqrEQi9O4g;3Xn34HdsMty^E(wuDihtzX6)!tB+3ifl)(UBS`<)3!mTmxvg)sn~5E9 z!YH)63?#0K0HyZf<3_-WR|FS*aI0stL4!>(upm^&&te0grj*A}?#}Qs$7ZU*2d?^;qs959Qp*jOB*u^&f;MK|sfo+1n%6|%hFnz6Gy}4=PZRLO2#htPG}4t=ir ztTrSf38AI(7>Wa2FFcMDQjir7HJ6?Dj?QwFS6{kb`BjB#SxcmrC zB~mB02C}B)+MgeGJQez8HFhx{DvyLeeIGI&OgS%i~9y!;NI3t)jnKJDV*v91f!b_38GRWMJ!*q@Ktz`;^dlf`iy*-S9$hYE8vfYfGHb9 z>p^l4CSJ7|&907mm#8x0xVGsfS91FHN0l zxg8^A_RWG0Y(2y{R>KJXu09$im&3(~DyEvb+4c?})azj1jr}BJAv})4<5n zaGRoN;nRRLHI_H#5y*b}cv@ymEO#>oDoBKpq+o5}2)b&KD%vdhCpA_o+zWB-WXE(3Kb1Sv8VbFtgw03>|ep7EKk z`GhsJTb)PK{~_2fJTNK234e01m>Ax*(TKdtk=|}|b~V%zCDoV2`?jX7_FV>m-YSm~ zTtQ0UjM+$5yPAvW7*c2Y2$GsF_O=!?l61S;q8vN@SWL#V3jt|rymWz&#bH%xgz#bL z5qT59n<(`P39=$!vf?i2$!$HM&zzL*XDHT~Qa9rBT6K;%Da5O@F&>bZTQec7qV39? z)*tEsKf7$Zs7c^^p?!GR!#JZ1?l9$P8q*nu!31MNxuD1Nf0EfbhSLi;qn4Ty&}^f6 zDc^}+r4VrYK^H9DCQEZe@<~FYs$pw|3@+nsf2@>a2$eZ_7N$6)?<| za4ysmlub@LE1w{Dv#?4RfjMWoSp*fzveIKJgEut4_5$AV`#}K!o?AhyJ%FFlETL@| z4rI_stYWqXL71QK82F8QS3`qG{h{zBWb^whM*x6o1Bc5YGY`2Gjb8RnP`Xj9!bxDY z|0`LLl7oTV2W$VtA9-1ZuZ6++#?G-vwIb3J0`LfDX^hnr$s+wmx#`DmXjN%P67z~u zBKE80Mqd}%YwkkAivd(xieYk+jT;DiBYxr5e@fKrbWK|u5l9PoeLdhJcY8$Uw2}d` zF<>*s$5|eP*Hu2soxs4P;+w(vBtjKNiR8{n$%Vu7%k}vl%WWQQ8#9A|x{616|KE~M z_>QuIKd}W*9J1i}!+y~H6j6fr^1L)skb57?j1Ru7@|?Qk$tZrumHi4Rw-?IY?*at+ zu*o2KfAY#6cQ&1|eli9oj4eKT`xT;7&pv4o1ChIiPG8>jMK8fLCSfw-C;*O)$%!?6 z+%V?9HGog44Z98kHHg5ltPp7F5xN=XcZiH}f}lP{kTE12-7NfYO4#m$lipeaAlRIh zZo-t6XtUIP&6#b9;66PWVHN*h66r46nX8O(qCqBWfUV{Q66~o=3?s{5;dz>W%JiBr z;=|MG;5(;pqREWHZ{>GNt3D;D106+^jVhA}&Q%1e*_qrl-I`P$&K7QkxdAC0Kh_t_m+ z8}LW7fK}ly7!mLw37g&q3-O{cUy$?O-7tV`61~_rCBgT*`;Oj#y5g*wioWyyN(Y%) z4lolvo4ZcGHPSf2{Wsn&mw6g##e?td)$|P$&|vnQRRf0{$EBFjM!+~i=hHr z_~>_%n!ighUB-n=K*AyvydWO=Zn3S@V)c(3V1ylH)y{Y6vTqd67bOK`-N-#app0** zseWgs&Pdh2UMq*6S7sZHjP)&p>aG6IuYq*UcDEEIUl*`WkVNu zCJ@ko>su^HGRNtC9S}&{77hB>JQOSPkWcLrReonkBbTXvk(Pz;(7uTr->=Lt;6CjT zII%vnrnU%&zUHbhR8Z~?4)xm0#I)ir$q<5N#41*(3CH%rwNEhOk3U{_VwBI83WD=D#QJ7g!7TCQn z<6@28M_i)TB|b~dV`F)cNeDUJE6j|t*d7Z==>wxLRK+?6N9FQK7@I4ZOS*+jt3ht? zjZbSsCe29+{leM}sH4xgDf4c{l%N{&P6NlIRm~=8Vhj1pDloO8ya=%iF2XO6Lbxvufna z*;dKlEh<>olA@N>ffC*X@xjiiL^-%E2jjVXH_i`3{_6+ZR+3Od4y^=O=lunJ%%I&P za`KyOXu@R5oZ6IkHZbD|G|3`XjK=e?N4dREltv>+C<@qc$^9hgK^_kFG&A2w%_GNn ziz@BNJz49`92lFzu@O+&Onk1NSP2A$Ty#b)LqSwC7BorpSWHkI7@>8yvT}zN%pZ9e z6McNCbP5O)IFno`oq__|G}UM>&P-P7{N;dwF>|SSE9P0?k-lM#}ayEo6k{Z{ONGP^VDo-=;U0kaNz zu|YwJ=nBADNlyanz~PXhd!6>0@X{=jl$QQdWC`$fW+Rl(vo`0c!az5okqJnvc15Mj zDQ0=DiH?CF#l$urZxS7n%*AO1uB z%)o?3hf)CP!^#nJfSz%stg6u*ZM>913s~CJ=rHD~1}!oklW5ADC?hNn(h!?mwE-j4 zNA+`qvSd(WS7YMSA!{qt^I?uu6Xfj#B^jThN$h+EYQvbdaRpcE_rAUO(b`dW_uYJk zU#urPkglowJBo%uTVa{ycDY$1DC6d_Gwl209#kS0w#G~o%4UQkIPt45xbPde%s-=x z7zSfhp@|ix3>7oVpadE2!<>WB`mJk#ZXv|^sgN%pqV+yEuNROGq`Yf##O4`v2Op0q zLdV_*#2BmbVVof3kM58(F#c4Y7$bwh6U0Q5N`_-LSes4CNS-n|h9kvv3rBLF(#qFZ zyb}0e@hnI0Q)6%6Y~A4|sSSLZj-ak4(hZJOE9)DxYDlqk!<;A)EkD9$zOCEw@QDJV zVpoY+d2Zc&OsiMH#prml$fxe3mB;1eMF5rlbk`Y(pg>a?}WxJi8al^6;;V}gheH&c#M>P*`JMN+E3>%MA`>J}$ zst@$}Bx760zA{+o#1(OWF`Vb&`87qy_oRTNQ4DKwVO9%cWyc67MX709T{|XvgS6AN z#USfUP6G;rP0KE`t8vBsFHlMNtFb9-nNuau-URQL_-1I(rUr6HeXsxDR5(8b2g9?8 zoZL`8(X4fjV#q?D7__6A=*FEDqMV-dLaqRe(tAnKmF`GA!Ym%(g;K%mzERUFi}`;R z#^W~T(I+&RrHoeR4(?O>O2N@_n8dS)P*%1s1y(x11eNvInwk;#a8$tw0$9vDgg<72 zuRMjfWr%U=OnV=CqIJ6I%i(vZ#qyl8KP%0|^#uw1f;a{-ZSe1&QSruAeQh2c9I>Au!^%gRQo6B?+8Kj-qi|B`4Jq%mE@pLZ@)L0}a;!M$ehjC?V1zBe}SyGbVx z(0MVb6JEV+H7wt7i7c6l=-N$dj5n9}885oJnfXq;(3#+R{zKz`f|~#Lf>!4m*kNR5 zt@t4PDwk*qJJZ)}Rk((5bm2as#3(1+MIIeD-iZOlA(eJ%e-`k|S2`r=?@yh%y z;qUJ+g_m_C_REzF58k9o?;ddJnkRq>9u(_Ocw?oEo!#S(B(~C zwjy8*7Q(@HGz?@P&=6+IWZV1qHVX^k*DSlt_e4U_jT+FXlEtln*0ojymhs^{QkB;M zn&nKoN(9V8*0($T)5%|_q0664|KABYmTx>xb~>QXkTHz!o8}2l*ZZcq=}M;=#(skx zj4^ZDYEc#JF~%zGo9c+nNhu&Nl~^~C@8Gr()^4z%w;(+U;bw>R)rO?dUfi3qaGv`o zW1GXGB4F-Y;)1N#IneQfmbD8sZE7f_Ru0^Los7+8S(FM6n(yoIpnjaZkaj83=j$eG zHaWF3hnemfJ+hZseC`H8U`i8YUjTG{MnjDt{PQ$4Zmh2;OdW2w9E+1T_P#C_Gka8_ zLIKQ-V;>5;8DLeE!w=X+IAi}I{D^D=A75ok#RCjd**gI43I)Bl^UnZ5HHr}0tvv;y z)D?r;2AWe4;H5c`qy`ru)DlRrb{=R9JyyRtmNm1o?ijFYPDGIQ=REY$9Vyn%akj}r1<=sW9 zB)cAz<-UUwXnc(t3UlWs$U}2(2`LEi&{9`Mz`koQu{C!Ay4{@081iRjZkS5Sv}KmI zZx+EFB9h-Ca$gUzeswAWTqa_tM>|@~!fxV(;i)8M?gl-ZOJ_qgT2E2xS}cb~W+Atb z#@Qk>K6dp{T#!mE0)-_~=?I!X%7L1IJ=4=9s}PdtK2=Tr}cJ@fMr zOXY$&8H>llRC{QMv&?QC_U|znNTf{3Fxt|I3{EP-Qeraxp!5;ZE`@X(aX`))ITNEx=3`Vb@=Kg6>Igc>a0GG2Ycc6x2BBOD;aLV zEd_W&Hbs&!9{G{lQ8)*9nuyN-o?MPK`rng1CW%h9d!l>y{=u%{NZ2LvdS(2Da}gGC zri2taVS!3^%w`Zch8d020reX(hM$=TS@JP)u^DO`O5%prU@$=ibQB~xgXhapj(&*- zpPX1~L@FyXc6b_^oRL8pNRWUDGVtAEZWZeI0#*U+4@T&c1gRR)V+a+U+;bfqxH%dk z9(Fcu>Tzx>6Sel=CECBprkK;&8h-lRTK4=uSOo54MrqLB;+IVXd!3X21poYJ_1}N9 z|J^_N@6!LV{O30L|1bZQcfae6KIAPraq~|+`<`F!g|=+N6$Ul z+ci6!Zah&nys)g8?f9ML4DFtnBO!57hh~ z6slNMiiutK_w;1VDO?n}&T6q-UT2bBH@)aoUpG)FlEhOA^@h{O%ib%b z^RbL7K*cA&?)t0F>os=P2jit$%`^Gt$=6$NEJ0!hIX`}Sa$VWPGuP7nYFEC!$ggjf zpX%S~5(S~(PB~5UzD3EsJXjhXePnf|@#UA<oD$ za=)ze#562$rHe za(n#GuTW#-UJDnOIl7;regIpale#Mc1!nX&Z!WK;J`gIrZu!~ds9AKG$zT(7d0!^P z7j5giA~d(`G~daPR!sa4;B;@Lop-#jSKxx=`gk$)<(H+GKR$K-{`Dy`6-_toq5RUj z$d57UMb@wv?QuQB?M!grr8&ncb(5w)s+jEeQ6FRO9i>-o9L`p0e`uNhCp z>4W_oB0if_jZ%gAq|C!a={oh5#)i$WXuO7n{WyI)w;cmbQGeI2s7}?H)_M8jrqe+3 z_UX#EgN>Y~dxsSUI)1424jwp8FIgb7>h)@qv+&VI<(21Od>Vf_ygs!{{K%E{l6L36ScGe;xgOh9CrEg z>B?n)PCIn(RS~P#`%7#>vzC`#jwZ^7mSD>-83B-HSgxeri|qzOxB*2xP9BY z;9|d7=b(AB+vU0I$?hy0*VTJkfy)i=9UUFqWGX{}Q?z67u2h3G>kPA&PFG_*W32QN7Ggd{&Igf0?GDUX2d>^_Q;kg@s=&y14V7CRddtaXm14d%n5(Jko)e zPxpC#A7R9+>H0bM^ainDe}??(`!R8<&LQ;S#Zi@;|G@Fvj4o|oM_%2%tk6{Vi&tIg zr-{gTFn|XWyj$*KNZJsz%V`|@2=gGRNGzpt>Kw##79AQ4*$Lx-v2)JID?3^7}opi6VaS_!hn;mku$40Ba zZf)*8dg$=k`yKl{7u|WwUbN=#SM{Hkiw2(Bu$(-7%(vCpWR`(2-%lm?!?$TBnfMyJ zCG^E8pE8hn9{=L-ErXO>GmkFsPW}6HX(p}k^1mNT6N_qyLwgBZh<$^=!3c{qO67?H zowrD&YSmwZu!~ODC7U9S{->Z`;?mduU!}FWbDq_aZ8GYYk2R`~AFx91ll@&>GZp)IxUWzDqK4|vkEG5@Mzemk?rDUGOS=Zlg}~?ksTh{9|H~4)@8MOi!n1o>#ofo%Huxry4J-Szy+cPv7D9 zB#e(SW#7Iz>{Z!y`{s?5D|;W6CCvF9|G%o8Rg;>U^fd|-zz>*X;}XXHdq%r*?|i)M z=WnOqKiu!wtp4r@Gk9kS>AF-!Eko(%xEfrc;zp(E)tw&x%Rf~|Bwl5EQ^VLiDoXUC z@fdrI?&6-IiTQBr&{gn(j)a%ByT8A<^ZjXYZf>{k3-ma1GVjtGz*^W)o{;h3{iU5A zUk`3$;Qo80Ha4YNQ{p^*++%Zh^VHI9gHzh$xC^yKt$#c&9@){V$v0^;N@6KK@DhC} zFz{{M`k?g8*Xabk)YXqML%+9m`~Ca%ZJrepoRjymCth1g!_3O{%H_+I<#*H59_iha zrk%fdcEC~V;pq3@DeVpW6yI)$9{e~FOYi(oZL?{Dnc?*(vG$)#8^)SmhIBA4jnXQN z-QG_=7$xs~P^;69rD26kD_SrfzZkqD@7Z0&}Pw#-}b!U}> zmafwdoA`%qF?0P+H)eCJcFXR2mK620&B?zy^ycb(mmgA?F`A>G%?MaC*>zP@Y3t$L zgSe%8y=&+FK3;G8Wf5uq(lqzE`GZ2yY##XG9kx`f)$Imy@6%I@5B&>$hCQa~|@3N(g0In)m@Stb4YlRea#OW|~^* zK!t|tra$47?L)zBD(@yQJh-&;x8t3CjdQ8qkFLCG%f~;g_V?_zGqT>d$AKI1o5Ri^ZWI2y=^YdQ z{`Rz_#_}n$^K|j4lRGcO%Ve`(!2 zc-K!{M29IDSa&IzoeOs&ofF*B4coXNr?%(TRA_Y%_cD$~S6i7I$|PLfHoW-w<7DTt z9<*(h>3m0})x+tdpKk7c`S<(BVY|!C$M>$RjF&!eF$Lu-h~!5Cn*aOH;Mw&(@-NPN zPAL8QGbmOZa@iz)_8DNJEngB{rmSlHYCck zc4pUf1zww{PEU%FI08I~{aS2T;_o zSKvnP+VQN+!7=&zuebAjKJl~r<*k=A6#gE+s>N5##lCt?eVSS~`O;?p!tB&tBvV*k z{$VQH=w$BOUr5sZV-5+<(Uq?+bQ)+rx)R>6QSA5Y`g>{Doz%|T%gax#tYQ_W&XlP? zu}7V2n+KvB$`>PY&3XIwz5Vd}dzQD?v&N%4{)!Wav@pd1UV!xAnpgtZYR-*(E~?#ps%O!J#=X0ghEJb zs(^#1wt{&ezipTSfcIiv5N(w#d`-a=v4#}1340mar?jBd9;av-Y2Z9LZetQ|P2|^a z$I7B0Ct+#>?vzu(90RCVmm+{n;t*Rwsp9r4<^st5`!k| zuQpg=GZ-md`RRNV6L#C+dV=NV@A@5DW)-X>#bS3&Zpu7UiM=_ajG!tVemvRW-0Pzp0}IvD$1CU zZOkv@Z7Df=c6VEUs=RU=>5FxoNk*+b_jVm*aJNiNZB6zBvyQQSbwQ5U3^MUbIOby+@%0r(u7}3S8XZe0eS%Bi5NVc zg^^_Wu$4_Xy0CT^me4U8e&{M6cexs<+7l;jYt7W@#Zpo*1<{B}0>v?g!*rX~Uw&}$ zR4WloBQa1%voL<#mf!|EU;X0*zNbb}7DYj)`lu1-nLdSsQybTX|AR+mqyu${7VO)| zC=tAw&x#Zp+3^YSvxBgWeZPJ7DLl@4^SO%87qWu#wP!T@`3mJ3l@s3>vYQM9xFH?u z0k7t0g=gg(aR{70^)|E%stW#{EXxZJ~LL79GZS%JwRNd6h&Wa}Zg2*kehzp0OZ)Vt@?s$>6CB>i*+%BF-Ps zK#~RC#N|29yU@cGEoKF zos-W3A>{;&r~`$X7;s!e!-8Fdt9LQQhv)R7TOR}#xm5uVfSAj?!{>m)V2*kZMG$)& z$_-B6n+3=aQU|@W$-Rj29yqR?W=fHj7H{2wpIlZ=@HX(+avA_qZZAeK9~ev%RHj#Z zdxJgJIg|sA6>L+V$ri2qAv$=O2^QUq<(>Cj+El?qFZK<~W8FG-{~D0TUFxu)F0OoDVz%T)Jbcvcj!?eX+run6LplIg^L> zbGuy(UqAUf^!2^+&$n+Qzjrv3JG1~y330Ss4+eCB_Hj z238u*R8H@+$78_fYtJsxSRQ|Z2)Try(pd07pN&=!+8cW5<|Hz;AfHxegR$GBga_v~ z93Ut|OHqo@VX!z{LBbS=YAA5~C8K zv4;*y5}0QJ9}p>6NpS|rNA~%$<<&gw<{PWCGF?mLCQ_3rGG}3d3jH!v++fXUJqdoxFuF~&MIHsA2r$dLdJoDgd^t_Y3ujfpy9%Qq%$B;{ zGarxbev|s|W4{bV;olTp`VA1+FsIPcAH>H?4}=Zhb;z1T(A`6x)@NJN6z^EdW{gquNz zmMr4&LC79Hcu2p6HE7mM$)*uWk`FLXp@KXbPUyy4M$mNKwV+m^;r~zPS3qF(zuIP;lZ%qjnPFpo+g9~jbPU; z;Xy?*6_l=PkU8AB)q2zKgiyHc$AuxQpXp7KK@CPjF}6J0=47NIl%cCZ?g(iyZ5QZ8 z&63xXAyBW<1no=Q2PjSS^-;Mk&;Y`kfFG!PJYAIldM~bmUZ|1Ycl67PfSY+26sgRC z?3Ju#K1Ei}w~EgCh_E4G=hp3H6pzHJet&&NN3fqv1mMuSNaR>0QAWUQBd!|AT(%Fm zK;OB|-dARS1kb$Lud*%pVopve%Hd@GA%O?DgyuTFc5I2xDaVQ+T)Hi+1EyY}@*a{G z4pK*+fGV5R9+>J>^jZlVI$h z{VNjuXF_#@;>kXsX|JV=hH(CDxYg6=Pkfq2pXB}eQ(4!&%j(A+(xI-8 zLk)UiXqPo&+HK_f5IGsZJfu55G?`#7Cr)ir`xOF6xVsHhHdQIs;l3-i#F34Ai*gOB zf8}zxxnd|A8tMez9+l!55Gb`UQR9xKXSCGyfY);5mdn7uhGdKVAA=_#NruSD^l$SOUVhROOO`}KD~kS zN)2V)X%smuOdVI|&9oWg^bJ6u^z?gaEhH`%u&F)kW|hsv$g(n!nZkPp1yz-MsO5ei zB6btzQP+@t`}3~>*pbWKYAcBwy#WJi;hb*w>*#~7kAMVlJC;KgzX%i}lYCk8PjMVN z$#&V&Z}~VOklTW~H6rGptBCQ6<9ory_=`SN&UP3UHG(?7vZ)2sOqbt6ZW<)Y4r+{~ zf-^syugrPSvBz^NIR|Pj3)_HR@?)Q%&~>em6BN0Asyz3ma#!Yec#DRrdIVrdk$G%M`8W04bw$W0bRl z8n8a*20G^&&~tUeDT+`bDH6Heb>lVyyg_VFc>2J?NaEX4LO-)XkHy;7VYWmIvwHtr z9{%%tJF7Z%c(lg6;?E1v+Q=Qj)Yr=Fns6(}nlRX(wf5wiP)ooTDelZUsAvbsTKKG~ z#-%imYq8;y2Qq=-KfQ4|yaUdJD@zY|F3WH&elmd@JJqCS11+1w9R&}Gwf_Vxt*hK$ zy$Q{<7fZ$Zr8hXMspy(KbXk-Yh|`(#Y$hDq7FumgM{EDD3mV3#mW-%zW3NAbn`Ku-t1GYT`0MD@(j4v+{W!Id^2*Ku2+?}FFOllMOaGVS`MV@ z-;gbb9}`{{4Vcu}xHByNQr6imMvT`AJI@g* zy~r6c-M5@XqMWmJvJgi@RW2pj^!1q!ZX4)%##> z3SpdW%13aqot{w2etW_eXS2FiBX7$Cv3rfHi5z)pIzzgT%qwl#7eHA!NTWN{L*r04 zQANRhig1rr^@ukhfF|A`S4Nh{u_bD_x^otdwXOtZeT&UxbsAEh9)1aEb=&_7RAjimo`Y@&dB(b_1 zlp=W*lUZad%R*Q)W^hRkMTj2Mh<6dxPAOAFq*}v12&I`3Qzf3keu#EV6pQX4y~i?i z3Oun|J#%cW^6$y)A9)!|Pvm6&z88%V91laAB&WG((VQ0!VJk(UE_g3RW_e-uRtM$RHStb(%N^FW)-B*yV(0+7P}0*?ngCpp3UFX z*ibi7Sh1}w2V(0j%ro---jpdSj&^^kdYl@F;#p-x#>MVxl_3Q0<>_1Q<2-O?=Bg_) z-BCA}woB-$MX`$s>_qK)_!{nOG1@jIUe>KgtUJkBuHNaOG}vb9n4#dX;!PFsy6QNx zfzZ$vtMpAq3a)M~lIUQaLOWzKZh@`{4Iox!%RP_!u8cYO0L=b(bkRKR@#9tD-;=PW zgBL5-K8m<6zYet=?5_BD)8nz>Z+WFZ!}8Lyzhm9qHg2?fh?uh6V(`VoKUqY5TBeKk zP`eJQ@HTROoeqLj6nC~w>$yM6;Y?Wq@@$`OSV~QC!h$cmV%Rw_=`1qsnj@~Z|7-l62J<>jUd-^mk1cJt?j0j%8) z_$oQd-0r-P&Ri_)c{{;55d8p|YSrIPlzifhAiWDm=+xnlGJ!TZHjFX<1HKm@U zNB7x5?Mc}sYxh>dJ+KcxfX{}{>t8GNj8fuV&CTA+G>}~vKu^%a!!ocSe?i@D4;Bx4 zf7z+^E}deM&R|}i5H;z`7)G8ugi%1E#e}_w{1ilmnR9r196=&0lX7$@E+~|h)BTQm(pgMb9WFkQJC1ZQAz5KF}C3Hg! z4OF{0w}9WDZX}bLmz7CTZiy`+1b;WkF1ZiI!0|`S>*1ZQ$CxSdp66Yojkiz?s<#a+ zH$x4%6m?`Lh)FXqUdC2QwTw!B@c z`;+n};q@0v!m8cbwD5_4Rie(QxS1<8!h;U3X^wu|uAGSd=S)gCBk!5=x3;M}yxieh zKLm*SF4+W;tCC;sjzhDYsO;~;0VKugsg&6cnSJ}sv zSh==Eb4st4dw>X9d%&^jk(L3VJ1o#ocV7HFa4S9iEnjW0lCzOf$z)6!DipFO#IFP; zC6aPdLvOTDQxHu>`XbSR^4BA@MlmA3(ik3j6$%XX{9Gb*;qFd%_{o7u7CV%DT6)!a z8!tzlsNXHj3N9cJGnqqfdzTIR1PU2MrA^9P4}tQ;-?)#XDM78TQCv>6q!yh?Ssj#7 zNo%zx+G-f7*TcX^kn=Rz?_>vUer zG0KcC#zEdORf9}=yeT#OX}=~13-02iX3})}**LQE7P$);SqjUr4XRHExJJqQf?i^& zWZ7RK5Wjk47*wNxkf#Px+A)_E^kGM`FfO{u*M!HmX2_Esv=N4~E#1(_S+c%{2KraP z4j-_htrh+{+4=;%DhgiZ=L35$ZyATZmF+5PQBpHw>mn~p^DeGA- z_KzEZ{ioMQ&|3W$T7|umC|J-Gz;dW;6|MlRte71jgH6~3+X2noI2^gFISh1cEcRV z`%D8rjzHC7Q38}+Kv2X1re7#a1uCI{PM1JX3uMixZdsHcx{9);78zq@J$s8dfUdO> zjL@NU%l1_}wAdbveN|_LvCcAsnPCpaYQLR;>Z=G!WioZfa1dLU`XZ8j7?>xH1XP+h zk!u;)kYB<_fY|klFas^z8+V0#8#Igeig2rh4frTVW3(gQ3I14n99Qg9t8j2Ak+gB36-jT3&6-LC3!5E|Ng? zEy_v!FX)(FsN7YMeBdppG1yMdJrF7mBtWuN26p%*c><3UJ}2ejA{!Qt0rK2DmSf}` zJ<_{`cFY04bErswKBQ9o#?pZ*s4d>It=)b*z)w7H6o5MlHU=5A$BBJ%ju)JH&(O&*-J?<%ZH1|raLEC0VR)sv zLT+g})*^{=TXdf|qNeP00I#0r)k_D;wHT9`H~6jgQ}J}oGoO??uYN^wSA!TmxV`5 z){Q#kF1;QyeAxF7dh7fNl-IJo&9u_+U@=pUN~$yOX^{G0Wn!|w#*9Odcdd+eOd4V_ z-l~ZE2FIRdQ7U8;AUw3!-5N&pUM4q=xZf)dJwSTL&0D!K=C!oplR>yiu`V%kmbxa` zx`(_te_y4?txj&xzRnE1`cci{ipwJeaA+Xx|gpx?{+*}ek?;K@~SeM);^_I zSM>aT4TcOVJ;nIGN{XEGXW9SJdvi{CTaXCUqu#ZNOt2}9-L+Ua=MHNLCi0Q5I8B3w z@R>VV2oMViALU19Oy*+?D!BlKgzbrNOTSyhkZ@FCvV}sPaCa%jzA}Af2uZyF=Kwe! zQU)3!tWZ~v`sLU1TUqw$NDGkx z9OlY#?v?ul#7n!?%^o|ce*a=Pd9xt*@A0AOv^PUPu8<~vE^XHD_;Y&Z;gyPI^Z4n) zGI`(y=D_myS_tLBX4e29*5gSX$&VLcidc=hw!`&IMUEJ9EHvB>v`e3jPgoBb|HQAH zoPf|7!lez}IiMp&h}0UR#`UWHEnEIWRS$|zpr9AZ`FjivcD*Cldo89A{XBoF~TGTD@iPc`~_bV*xTeAb!Y ze%wXyj5ZRdt1lVcHS6k_R{=UT8KrYPXR=|3-;mpqm45WE(tJKFgzgEY)qck`8cu#t zslpllVEANO5cf-z5Cxb$rJlwIk;0zF3z+jM&;-$o80}fyS3JN%B*`DOw7= zU?*qk2f$}tZIP4UP5cW`Ws$svoFePov#-?9!JA&@Q??&jDf~u zX09Rg4f*=)xgvqhpn*%zfWwjP^~Af&WQ{fu_R}6677BBb2=RD_P)sU>>cvJXznsWg z#c(I-j`%LaXdmM#rcWEr62QYnYYb1#Xgl7W{_TeHW48?i;QAP=%vEbb!wH;3CB$%7 zJ`!2(C@!{7U(A+Q9xcN$B6I`$&qqzuM>OMm-7e}?EWQ3voIT)TLBQWUa*lcxQE)d5 zF^tnykU--xw#RA}4>CX6vaxGzSfFH3uT8K}qIEQwad+Lhc9|*yHiH`buvJk@df-{R z*yO_Brh~a{|?pzvPc>^=zr*D>3(S)`GCBZHi0IGsYyX;1Ee3e{a4#^J10kU2 z6I)8prc0%`@>;HKg^5uQ{NI=8_6=X^qGPJoX{dSqv=@T(FyWcofHKi`BYwLB0q%~B^a9NG0&2EFi4yWfWGpo7(vcKu*LrzM9F2dF(X(+ZRL~ta&}5NcX%FX-JEZtvK0? zxcM}clAj&KS8O{kyEde(qz^46n#XXf>FDy>FXgB3EQMwx^!$mfpk%Ket>Pmr;SB2^ zQ(E)b_2)g%+i~UPS6QLm>d-tn7ppJNC}HhQuRMJ>K$Lh-6hMHGt9KW zee*^-fz!9+1SD{DJbfvrgR?eEJs|^fr0`xvrzi3`XEc^{Ox7N;!TD-R@DEQCDLat% z4_}kCgVz-=$7G!NTr}n|mMWHcb*>f~14Y9u3`6g3p~-w0uAhXHO{Y<87Lj4tI$*f3 zrX<3Y5@J%+o4M$^v?cKbcrRqEAS_^k6CJ)PxUW)%CB})|9~SUOT=(4NFcAOnrSJu; z`p^7V_(QT$bhmcB<2z|*QF{@c4BFrZ5nFuUEI_ zKCZ{yl9IXjgTsi z?RAs-LP~Aq=$JUN9ynLdBVJ_N5J<9IkBvJQE36~&0|i7(Vrg_jj94kNX_OiVX@;Vf zP+=wz?Z{W2by2hVRr9kKvx{-MGuR@HPJ(gv#C6JsDqyDNJ8?g*Z~Wl{(g!j5F4^*! z4n3^6f~hT1cid1i!VGiOx4hu>;UK2D=5fa7cQzBhkCSdJZ2bA-)R05r>KEnJ6JNwf z$6d~*y^4PIRQ=7_&qI1?WiyA>-`(48wt5HR7c!^3_U3b+OzrI2l|z7WWSL>$FEbRR zY=rW#QMKk|kMf_0>G64!2(Qx~UtxJqnnQu-sFrl`7aKK`f$fOV-9Z8qjZxR}*~(>3 zr@MInz^#5FQwdR3DBl2YBaT`d9c;m#2Yert&}^Dqs496t>9Z-?@Sy=uSYIuq(owAN zh>xfDY8?{rDVQCYg;&ocDzM|wI%oM^{#S1M_O8k%)?O`#^9Put`B%7J!Jo<{ z{sx-&$@Z&I`*ivDLfL7(vlme##m|6ZN&yQCE*mh_pengt$?452QlI39Hcrn!Y(A4r z%lsuwKV>00)VIEg9lwSD!%qj(BWDGAJrhVe!Mk|oxb}; zFS3<)YvI5kZ0`lbU(lJE9rlG&w3a4g)0WfxadRmmQR9z{@M#Oc9qjN7b~D6(a0)!z zm!&FF%SFn*0e1IxhhF#z;@5r-G4*_7&XW)31eG8e2RX%1ZMcRB7=7tOLoJC_G&GfC zLCLD|>V zWK}C|eB$OYT=7|PV6!xPjLGFJYdrFl#E1+lXQFA0Wo=I~x{LAQjI=aD$4 zIzVF!WdwF;2b-cNM(%0_{!-fDvzl8fZU;w5^eMK!glW8HW`Sv>j9CGb@|nmQ^|>0I z{yD3Ut`!ryk63g!B3fBPWaaQZ<5<0VtcttEjEq6%%RvtcVoGN}vIS;_0Js(^tzren zyns^igTmJC$TqITA`tsDtPIZnyRTo{0p5a8+0O@fZA5n!`Y;Xi@geb?6!&V9Zm>sk zA#jtpREXV#IEjWUiVY|lHWF14>>1sb88v?IDiV1L{)B@xFve&^P~wDNdS2%nh{(i` zXg{3#`wjQa6dspfLrqfWEhrlw)jz8z?;}#&h_)Hgn-dR!U7WIj zl3lC^bR}jYuk{4H)~x*D89<76-W=$D+~*dzLi*a^UPc)Yr7$teSk^^X34tV66N;|4 z4t!rwP@6^3nMm~gzRTC@<)Mf5LDvr&zjT7 z;-3hI7qHg)M6RrXa0OmTZ`Y7a^;f7-y>V5U1Y_t@)7@*2c|Clh+X@scxLXB z{Mv8PSas5h<1b0=t5mB`hjKx+)W26el@5Xcc2PJQs44AMy*(?a_5xqMsZZQj7JTUS zsn5fumg!5*=@+fB!fi6p%YUBWaI#vOoR8(y6e46ZaPD#%O|s?-S?ZB_q0VG{j-Gny zNijDP`jK0lrOEln=fJ!XNWu)|ca%qThAz2SNap&$4#74<&C%m*2Rbp#aG^qM2J^<@ znw+*b`Vg26`bZdJI)ASGk;!^lB~wpZ2{=LzcP*byTQ0g^?$zn(;=RZ;f^suw!aU1& zh)fa&Lvr+m*uPn#4u9Pmii#&qEl6Y)y=*6j-1byI7fw0ASCo?ymz?VCjsez@cSTUt zIov9&NUZRp-ADym0lcAgmBNX&bB0jATK&j^Mp`9bU`h!G_SDkJ>LOa6LBCK&gb!pC zexa~{9M$~bzHC3>o;OFM2x-`AjVcf@@{ugNx_>mY1wtq~xa*XTCl~Ijb~Y1U3POu| zqR05RBTh6({h@nT5GmiGsprY%a34aUJBOtHKB-nNf;exl%;2Q->ERW$_GviW^reiF}PY zgf2B&&7Y=3?Xy(;P7Jvwi_BI!@C*+pnY}vHfQc*mGN#3ag~GJ9Co69PZ=4OoJE(z) z13vK=h@{9EFJjE3n^eE2D}Gh32-G80RlaLw))b__5_S5gb8kYx5|FdV#Q=~Zm0?U& zGBk@87R!>bWF!4xLo@P@{Umgkjaf>y8U5(jb|dYR_>Zrm=8wK7Mn7}0a!F%W9oaSi zuuS34+W~T#mSpW~JF|PI<;r=xuZP~xmaM4*0MnuOI!7_Bhk8y8(90X=tvCjc?}zQ_ zfL>j_?>~CXP7BZ_l#LmiLaO)qF2&0>=*nCkJcBg&0RcIR#M_1X?*p1BX%>{vGr+M! z_slZ57MbErZ`5=?|MeB9+`nZO3@3tXOlxN{A zeXRbl<*9lm&>ro%mMwa!wuh+t<81 z-l`hxnuwgMtMG)RpT$}NNujU93m+pBEJxu1$}%p36S&7zt_C)iwd?LsUd{k97LXiX zQGO6$n#PTt@>k_`YpG`)HH%(55xR6diJrIw zp|1Y6Demed7u$UVIRWd>IX!3q*!1te=4umQA2-r-5p%`g$s4q1zoBs8c-eL*#7nuY zHCBf@^A(KD6g+TkJ@Vijo!}1{l%xBFv*Gz1-F$p!s*2cuTZWuD0yf#$sQN+({fd?u z@zQDpDJ@h`dNhkT&I{>Z^r625n#0Mbn?msy9}P!DP_6ittguv1es8x;DDm_oxc*P$ z5=0Mhh`-~G0v?cBDwQA|47Ewga18^$AlRcsE50va!U9|4@S$V&`=I_e$W=`nb#c%Q zwo$!n=e9A?&UeoQJO7=xC2M~`zQG@Z1x-~oFld%v2Dp^My=P!EkLojXeq-w;NMm!J1q6|3SgZ$uyl|0?Wf|3ynrI7`OJ+X(4AOVVCe zb)?b&M>A_8*d%j@T0@0}YX@wRb%v(u6IuV9#Ip*nK=O!xcu_2K~iSTWPY`h07rX zDlzT})?Lf+F!w7Cvr-+}vu(b@lYpqz2w~*{`|Dc~69@!nV)o}(CP>y7X&Z-( zF&Meje+ahPsvB(~umFO*Mhb=I4vs(pPHbyD#Q` z8jJsQ&wFh`@74gsl4g)~&^Zg)ZzDjZ4-%*d*yB>Q6kVh86 zBA4&48lFkA!n$~GkF;zx)&?uv-iyb2^>KRX(#jFgb~e<{%U-&7=&7QjdZL~3qziPK z0eMwK*~#s(8qidRRY9i;FLqFcH5PypgQff|XYmx@)S=INbGL4$sZ#mg0<Nng`dYRG5B<$I@tn;YrL9x?zM+s{ zD(-bb0bkQ9Op{_i-b(&qPcy*-jjGuKCbO}1NIGb@{KV6fr|Hz zL)uD1`bDIz`T@|)HkDJ2mg~vpx`fgJwk}V~mfXyk^1KvdTwpJ|N3#ReJM^MQ9gMng zHws(M90R|EL0sW3VJh-rQF8rZCf}6*Emxg-`jRd9lN4%l^ z8RB?M@n0wBHl3F3m#A>t! zS4K9wE*VSY)>Z0vQ^&c zaq+#@d-PB8Z*dFIZu1mqo{}V=t!{-gi`<6#%-ML^QxFiQRLHD~vTngf0`+b8HWy#xDmjx4p-xN2w0opQ?RZSLbq{SD z$kD4W8=F@#s{1T&fLspy4}YA$(ejM{fB+>+XGAX>ZT7LpGSoyS8|HYbUFr!I+oYI~ zCwZjX(DXV2pQJzrQzxv>;g9xh^g2W_hAY4oIr^ zcbll^QsqSW8E+8v?Vj&u?Qc{ZheQ*y?R#L!ep+DlcNn(KQ4R;Z13)ijwsZf2pg%yd zw~LdRh1`K_@>uakV}^ea%tclzgG$Mj``|BsEel9xFWt7Ua~uS8kld5}!4&Fh~ z>HtFyr2j#Wkrf_==xLiP6f;+X2vV&FTJ$?eGj}G0%1vYuci@M7{Q|-AT66`o5!pz4 zI$6aRALH7f5)5WF`bbxWXk=X{>4!DdnVpZ$3dCGJxGs>ZxV9R_7yTiEwSXgK}IWx$Fc~2u@AG zQ=FHCO6BrRzN4|x^1x^%k=J*H zszQ<1CVtJzSAp>JMfZ7P0|2Uas}JYN>VczVJ5Ez(a7rrQd*cIm-VHQ9U}2lmKNf{v z7l4ymTn4QwN^CVw=%QX@rWo#&Yg~mH2eUry!d0S|av|)DW$}|;E94#nQ`8R6O@O~# zL>&AG2d}x$GsuTjr4M&d(Iqqc^xe$#tLx8j7!RTn>UEex8jB3X-^w|JN-DsqX16VH zk63I_CNZy2$AaVJR|eEuH@7h*{UWt@ZHZNi0lRpTncg9$A&f+=H$Wt!k#CBOIuZ7C zO~)RebSq-|0(vBQgl+ZY?s^X3cywOSO3PDow0_Rid-Vlq*M~WK6~cmYCiAyyHJvNtHQ!j;pu1I ze;z%*SvD=G%abp8K_P@Cz^WrzmN>~f{0%E)!a_GIt?rfhd_uqnxOM*eQJG5g67aVu z?&ml3#a!?a26Ryj*^l7fs6}*vkjwqhBelFEo^sEN`V=|YB04s6jJQI#tuZp`O^_(0 z!z}jAnr&kNBCZb&ov?xGFkyGVCZZ?%2U?<0?TPH~P2>C*=gso%S7|{j`eWU;JR~Y{ z0CY1q@I%gPj)-cKWa>&Y@`9f5my#M~@@3gu(L%nzdoa)jM-Rd{tO>OJbVb#U!!+go zC)kDzlzU~%#&83e;sy7(y)}URC zhiuIbJ7?I!Nn;!1VZ<5dJtAEDwB-e}H$E@vj3oP z3G{8bgL1Pyp^-Y)KCpSiP?LPJc0vWqewmvGCPGf};m5+nnn}a@bx_c< zJ@{Wi?o}(|&jK?S!& z45DKh0#b-V2~;`t_rUbX>59dtc4uqMO42UMufC|npFSMD@MQgyY|n7&v6jwd|& z4X*J7l&QF36Sh(n`I4(x2{of`LAgSqsFC)WYc{yR+vT8d??LA8$|N3?k%f|kqvdR( zJq11M4yI+c(C}?p7kd?wM4HRHy?A(QjHPIt0n1}zWeJ)e(9=n*?Rrr7-u z_r|PYQg)h9`%spC5L9eToL>+psvuVSN88AQY~chufGq?bBf^J2_R)eRioKyOp?Y&Y zAPZvgyH;3yf_ce$)b`F%m3`X-;pr~hz&7i_ljd1XiHb_g{ z4+6Dq4^d#nmUy1xhPBEz@gy!e1^vhopsO)u2(=5>@1m8M0=FQtWpHJxxrF#Q#w9wY zdnF1=FGR4jfjSOAur^4lN-dO&^k5Xt0h7m)P>|D#EGc+aPR*s6Kp~c*H#(+dBq^4N zQrB?7_$5M*DrZPT%cF6&KCX9>Jq1~9(4v%mT-jqp*SZjQLe_|9KOcs+e^7t{M-C(g ze$%c&)$U2}W#OSLqy^-jzYe9ujm~*Wo4Yt$+0H6jlj{$FU_Rp8T-_XaQ3g&nrFr^5 zSWAN&AfYTZ+I~^_Bj#{q>IMW=$jfZS9@(cas5mT^aTl?E_=)DV)Q21L>;F~m_*Y%2 z(QPzd{JJ3HMD|vqF!Ks(#)_c)JVACE82YwIhB>+(22Hc5|GWI_MKPUKWP(~az{;7NnzPZbIf}UQ-Amgf7i(so3iyDZ7i?S;3KKi z9VkEas2IW%IpLolokVDhnd60X9r6>nCR8TL{e|8SPvOE{QY9U9d8QAChI{^mY>M15 zl1?Z;`02~84209VyS0$R-d1EDQ)RkiM9?AQnxC}2Q$(-Q#*}EPw(1N-VZi z_aWOm4gZxOQ~+>!F-z7j>+$g%3 z7!O&#;=M{F zsR+RoHV(QRzszq}l3_ zAW*uu3tW&`4AXU9uL=*<@GdA~m-!UonU#|Z9_Wlkovo%z%0HHoTgS=Y-eKj##3`F8 zAJRWjJMW@C>v+4I`Y6b-8q0jZdAN7%uU-(f;;HiFbIF8Yd!wbthx>j#t6qN)Z1yay zLh7>Oinu8NAiwbAp(Ws@)D|f2;TMzGv0EkPS#C!Z!xOVzE2dL@>Up|8?cg-!olA>=x+#guDEp0k5BFfE2QHXJEsLVsld)bNE8?Rt&wG6!uLW1fyMe& zK?h;bgNUq~5UG{yXtGaimf4t=t`(pJS*ZT{0hk3?Nmlb(eFfTJOoj$^y{@ zZ#G6XmYnP_Q;qOHCMT=+lpqOKE=EX}?*Tm#Irigydn4%OB<|^S1dtg{uZ-e6^fhkL zX40V#lgoXE`UTh83otxo*&Ee3j)O7l8w8h7?x5-N{5nY}eIDZMHgU8I9wIzKsOhd!c$RCYH)Z7ZKztbf>wC3mNwp$Y89VD7vdt7zn<@MH7Sg+QnZUQAIwfyQs!jW8A=xdC4 zI2*FUZXQ%nGULO0vrWhp>!$sb+-j;vA14ehyb_DXoD}4bK&u=BvIZ~; z2qhq!GpemV;UzQ!skCXdbpFfcPwlo^Uw5?@U5A&+j3%o4meK+dh&G%ZCfiNV5&2V8 zWfB1~s^~Pru^(0StEn{oNHa-b6Q|wBR0v2vcFGRRDejh{Y zmyderx>&!=MoxX}a<9oMaxmg6LYSpe-rfWL4<5r(2R<#r0}QgGk?DY`hB}+N_7J&` zkn!jmnJa+(Ep7#TsXwfRS$0)4kVvIRwIaOGQX3Q2RDV4}Ps~@?Sh+B6DzB8O?c=Y3 zizb@#hRjz8RSTU8N0z$%Jyk?@23-;95siK}st6RPGnyqOQP$B@8{q5a?iQkS^gCCTg0l{_R<3Gf43ddh=O0$>REl^UkzI~dEwtj~Nn)V|51V z2oQedS{+~%%j~EMg2`OmuZQ`diz!wl4Akyu50**S0ng2_UjrX3PD!u8Vc+sVi6T%` z3v++@ntkZDyb$B4Fyajf&myORAmJZ?zXgI+Vee6pxRq&7(1c@fufz|xseR@8e5o4L zNbkM8hZiq(BmCvaJ)8?Y+WPh&dxQ7>#Fp}XKEHB@8Rj*yMtaT z68Q#lL}l(Q0~LrN&?DI)AcWiwTsY*jHoZ5{Tr$%Vy{c0p7W*OwtyitjuI3Z8 z5KnEdptBa&@89IVZ<@tzq&x{adtd4McUI83BF^%Jg_B+KlNV_~K-XblCeT$JAQ#i4 z&TM4;n6)Z|PCV8GSdtpdxpx9bw~!N}?c=qS;g z0(z7a1nMEvf5;<*xl^!UegkTObx{c^fjB(Zj>nX!7yu;Q_IX&tj`&<`*Ad3fNn9#mm`<^jn?1ra zi--!fh)GhB)|7Na4}jjk!M6&yGtJcY%j5e@_^3M5Nq)7Sp)=AU*EV~X@IlDK6S#gX z3^@T9AT0PK$lu{IF=ykY4@pRzML_gi0=D<8;(jQxG+80#aRYh{w%4Plbl)&YgPAED zjQIN>wwV`wrgN8aJ+DBChgaLl+y7bnLmXAD1w} z&}wT#Z&yFlXZb0O#k&R~useMdUYQPC#_i6T-<#fm-;LGulmFBs(qioJy4+0-u3I)4Y_g&_6-!cao#P`ZcfgJF~yYZap`z#cPP_ z8?KA)+JNRmR-|Nh=Ik}Z*tVBaI&4K}5Ti1>25t#nwQlO-E&@GVbj!AYr=qvPEUdsb z6c8@e6?UQ0=T}&DtG6mMDUSKKW*K?T!F0yRBj?!4^jaeJUXs>ydUxd2hp!4Y;-1-M z8bUH``Zhl0X4p{fn{}K@W7Gv{#)Q4!{K@{jch~Y`*@=UX9(^s)`tjO${@Ofyc`kSE z!D`{ftO+GB~Br9Xad=Iw%gRS zoPt+rd%muaQ;J&hJml3*^reKmv3&4frO;%9>WU9K)_>M@mT|i;MBdl~nv$d+625}fM5DU}&tvtVs9kcG z*dFnDyI_;(3CZ1IC3vDI$E2l7Ro$wUv>cd$Hg#G-zW@vy9`a(7#;Ya;i$0(pcEdrk z;20c)i0~0JIlChlo>}o3osITGf=5!QV3YnNP#j_>w1ad-&2@O`_BQ&a%zo_?V3FNV zD8)%ln@m1-fGxV!&EbN(FA;(U1TScnB~Wt<4aa2@43F9{J?b2p^eF;Nb2=v_mUmPPh{^F?2v;M0 z0dN{1&}>X{F2c!%D62a^WAOtLZjoZ<)c?_obNr0NsoQ)dV`ziIXSI zJ`ZJoJ#Vr4)?!Fs((PbT)w>Pg*ALt!hXb%bahU)1YmrZNM=stz+_Kdfx%H8;b&0)o zgPmc;`F72~wQBx}GrTf)lBI z7t%4WBFB7VyIdm`Z$j+89-hHqMp79frnxN#a#h;M)+$n9?>Ci4T{KydNMLkc_xqv^e3fB~ej1YI|b3R+b>F{^OPWruKNZO(OmRsh#BR<;i6Uf&SdA|@)3G@jenqD>=@V|{4<1(@*u(v9qtdrmtbA>?%Dn?hq%wH~|RJ_s7*IloqePR-Mcwt<6 zE`(sd|hFDXJj+J%7&ert5pdfq>o9akm3j7jyXE-{t=` z55J{(bUx#xDOodW>ACn`b^W>7Y(~cZ{`DjDt>a!@R(lqQv}TRXrXSpmEIO#LzhY!l z+|}`>-ch;PHQ9a{$D0>sHs!yny^wBSQ%w5q`<_#Q*fM&YCTEwjG%$Mjm8n2U_6r7+ zW5!&@c5#)u#ER`-K+)WD+yI2cX7YG0?cOsTufWD0)&;vYd`wFbZDy_A1A8t3_ zb*rz7`uaoQOKcBMi0#3M5sp^)Wc~mgKKYg_t*bX;a#;Oh$Z^hRw4o{1R_1(203U;u zg6kqhG3vy|vH(&WJ~&U4jg|W-Iwq_`ge&Bk!3=OnuFze^wTr~-oUk3gm|cJk2*-A1 z+p~r{Vo=D8ntF`yFdt%;Z;aJD8J>zsvmXseNZyojN%I^*?{auna$@AntrG3d%CMXo ziVS!dieIuCe)#6$PO2WbLN+m&G zP*rG&IuO2ocD6(bKM#{K&HnWf`Y=IwRCe_x`})wCpWhz;iXbn=&@=v&x}HR?t=e*f z0%40Ex-bv+b9>&B7N3`3IugR)XDC*mwC_6lc+>tbvZ1N*GDPEb^8#`+Ev zE&I%A_FgT(Lau*$hf9;_dJNuW3(;5{OfT;ffahRA(Q-ybvC2OFsQ?c|z!j63W8i-C z5KayDDV0^T!J1JwO1TFCf47}J8Ux+B5PNe!+UkZ(vhm1Qdk!_~kSr}>aH4yv( zq(?_1DEHsNyxi{>>}^O0e$LRGCW#1y%95p76i&!tPCVtE*V6_Gf!a+2t-Q1^EOhnLns!EU!+?_Vk-N5+4vaRt9U432 z^76RS%T~S0=(bC~g&iuM{x6jZFZu4)Qh9mlO+mD%55@$+By_hwh0A6(0-)P3J2t(g zEQot7{g2Q_ivt2$R?kQM^ZhT)APM$ipsPUUO7i=g#g11`{Huz3b>MgM=l<(a#_!@9 zvXjHRATb6buvW4Ee%Bq0UD{CsHCnz?@7*#oSgddS`Ot%XE%BtAk|Wa8D~}fKrRthQ`_W7pl?|z=YrV|6)|DpozM_Bn&UGH}9el@+ zox%FXA&;*dpElI5xE{S1wL)REu!T=x*LRh~vmw2v2R{3L+t+X)DP!~Z_^hl<&bvq@ zprl@+oJnP&blby;aPORGPHs;>2TVAI|Mcw~Y_Na!>Ua9oN6F7jeENg?LhWs`$OL*{ zA5|x`=8?@ukFNK@D(&-c?_6u~Qm;C2k73Z}rNFvi?uqq5H2h2{RVO^vtWRh)*x85c z^ZIFjeS*MDxP&|1FSj^o_vkIUF%y1%-S$%7zssP3h!e#P`xY5zbw^t~Gahc)UY-^v z8QueFR6M*fC=s z2DDtc_c*7tQjOBv#+~HvR#)6lO^uvU+ZWAa@4c$F^!mVeHRY3kuxC}Bs`r@mS6PUy_2oA# zn;#E$n$Mj*qeKg1NvM#i4@EgP!LMJ+yj%M4ITb3u^S56BTp=0mAQpA;*S8XGp21Gn zi)Hg528?vkxzJ-s%_>fGeMrM_bE$k+96nd3LB&D=VoK{`d*7_nFvmEihCl9lQ0=^V zAol8>Hhpu?|=4fic_~u1+Ct__2G$a9>AHMGD z3i{b4PJ4GDMXAHyC;_70Z!#Sn0;=DYrX&rau`c_4lL9Sf>i z0BW{2Bj!{_zKG86&5M|{UZ_`mxV5o7dv{={LrYmIT>~->9Z3EiiBF4|TzKQYq;jVj z1AgEUtXmC95h=(bHR1wJBv)rdkHs<{8g}Ps=#5@}9cug_Aob6;{Nmw0g2u-e5v+p6 zAvrm@a`n4Ee6_Qb;?*?1oGpFeplcEkVP$y7t@X4|qfe4HnsHRM`Zh9TrY7V;s^Lst zl*Q{g#X}c8>Q2U8w75`ve04#j3=4-#WeXek@?4aG^7h0AoQvb95}xsgTU_Hwqk!`**L^TG?>?@w+# z&i|7$JBIH)AJPMo4osiuE--yC_x*E(m6&s}itSG7J)K`QiN&O>oSsn0Rp)LZXxefG z@zvBu`pWpm(2$LeLq^}FdL@|BG*0LH zMBvq}z5&08H~fa#*Tm*gKK$sRVb^`LkIpJQl<2c5q_i$82^u*mDHYRG!bOykeYf3BQ9;HF3->*5g=3%|`d zck>76wkxcnq^F5eK^O54^+m3=#YeB^6$t(+AGvYz!Jox#g8Ixz)CL>fKWUK^IsN>? z$Kc{x+oaONht03fy>_c^#MEQJaOZ%C-I4DP2b{(4RJBlsjv0Xrc>bL{Nq1A=x%6_A@+EdM59@y(X~)Jf2%l~r6W&QJ-#o2JYVVNM_FCpNY@UTReIEXNT@XU z$s#0df3UDRZ@2dD9_Y1T`=rIm3-?b(89n&Wl@J>iHQf+nK+{u113@5>gA(`89Z8VU zQ-~&ywc2Q>G`)YYbZu#&?Duz7r=Qxb(S?l(uD9$y1*e;R4EcN}>0?IfPSrMTA%rD{ zV>8}t;I?Lqf9}XqU;k_y#@aZzST7r8t8uLVLe$5gyXSyc?6CC{-4`1uRm1f3E1_39 zk6bEseYbaYv}j01H8~++aelstuuO7Hm=R$^M@@5PC?vr1b{kys~cwxkU^ zd|F(3&?IW6W90S0@%x&=qkf@|zF&*4BsCqc4ERa@!kUp(OCpM&?tGtl-=|US#Nk&* zbquYSZfm=~v-*7IKZmW9Pw(G%XA7M2p-4UZN2mP#=?-+qx)yl|{wwzF)bGm+*F=i0CABXk>#2h;qbl?$}wJ>)%i8lnsh-=&QP+wEKZ_VxP5T=_5Vs-7z5dO+z4 zjl8;gHtOw!{TKW^qoo? zy!|d((R(xQsfDB3uj&6@{x%#Ly6ox35qII&SDjmJ9q@R^PU6%WZWyI)ZC(FgR%B|;LErWFi9~(2Ff~&a!W6cy_ctXg zUX-otg13bo@I`S9>uWP3h3Di?CXSA%}9myDSH$Uu+vKSEGY=g@-xE&5O*g5Al zToyS}Jf<~&f}Kwj-$9jlX@WIfQ%Bo6*TH!6@z5Ng*4Z2_9IQ=r_1+%{2d0()0}pGy zTGDSFn4v+5V9VuuOIK9v;C*N&UW@v{{0SCf%&!TEah`5F=CmiV4A&9#ai?bY_GbRup4XWyd@NF#Pjx(-2`~^`+66;ENT1fqByH(V zS^-%(S5TaUUHzJmEP;Eail$-dR4;g{TOAX+J=TX|E@;*3iSc*!iicfb0Wug8mA4V( zB_-&TxN-RwX2g*M*vZI#pAGzXA@^c2aEmC@u64(4Z@)VLhB1Eh{*!)p0}fb@0p<8M zBL7=H#=g+_lL8w?Cfd}2dLYWUq!I&)69GeJyL<`;WuZ^+a+=gc<^)E`&yOutP!F~K222%Z&-?-R_?5;MA;MRkm)~>5 z6D+sAMsvIy14t9(Z&L815CjZof+VaD49Il(Hxt9zA&N?{^`wd#SR<;FUytGVpct4| z<@7?es(9_qd@eGiW(p{7>I+Rrb&nyl3?Mk>{#y-T1B4jg%!`Y>TWT`8W}9y_?>#v1 zwE$r=<;rFqP}^4-9qoWXCNRK2a4nu)7|$A6<~bEAK=;gW=I~-i7W8^7u~NM-DmO<> zss$2(E7oP6wz5He(8Wc9#b{tK#`F~PO8WO#%Vn}HPN*+1hY`+sdc@>wLX0k6rR_kZd!qK8H4HbUM$}iWvO&^dz@Se zh+~CykTs{^KXs%K*-jW7TR*`vWJi7WNtuYZ<@l?xMtR%PFK)HU<{`T0&uZ4!ww*Pt zkG2cRKFGQ-;tEI@43I4acIxT=#uS#C9uI94N7*3MUeG`w)M&yrL2TW#ld<^?ucGYF zMPg43|1&??dQ#>&oGIO8p7%aIuvEg!Vx{cHYUZ`mt4W!KZu3#-hbJbQzn?nv>zU*4 z{D+$tbk+_kQvWSUE}c|lENKcdj{({xK>Yw_IGW@KCYj>TyA)}e9&S~sgw5R;+{RI( zF&7I4ZPliXDw4GTMb73BgZiZt9zwq~#k%=(%Ho^(65JCK{j$=Wqk3IiVdB$Zm9O7} zNDeET=rCe1pmf1zI(OR->z)ErcFjs%!zqyvs7ofK12B^`-q)$xzg)Vq8l@5pzXh?K zG0G$baSXWYF$Dp}=hH8I&5!h2QESEUedl2FgOXAuR^*lqcC8*4_K%na$3Z zdh|ed;$eJgc;f^Ke!^n`BUF0ySCDDyc3(_YLeSOJg)&w2D9x&yKO=i8NJx>xhdB~4jXGFK@~IW$s?_|CQ`nP^zf^3wrZ z5F)k&uvv&o0SZWf9Qm<1q>XeZTEB_VXvEDgSSV|9Q ze>mQ4SwYK>U&YkFVZcBq6>+$ifnI309z~krL&*xbakWDSAW;u{nESE6L1~}6wWiS> zin$-1YB#VTBf<>;8kw6OBmR{dVb zZazT~C+|nF{_+4DyZqZXUbiFCo0(e!fD{;(DGi$fBc_5vPA*wO6c)ioYsVT*?Q(FO zBTMh~xBp9F9_y=vF1lPxMJuJF4aq@QIzq4zxzByrvK@R;YnIXRlDJLTR|GlW+q^$; z@%(LJtV5{)CjJMa4U8uAB28o-WzpLZrNCWy;tWR(Uw2q&lp#FQa1Jw1aN{NJkYdpe zA=|=ZI*Dh)J#WGmQ5yJ*RP)gqV^HBROU+pNlFmM<`AIDf9FQ$jmt*~nr*=>BTY&va zk5;5x_8d6R>D?Nz&uNOLR)%6@oc1wZmB=?@Upa442<)4~LA?b+7QxQl3bNpf-yL&1UhAtHt&rq*JCDj)@)p`r)6oNiHGPnW1U z4~{=}SV>3{!#MYYaiH z?hdX@Zm)@cQgeVOh*%?P*BN0Mn+U|w3b5EN;pPa3iT(RS8ZDioA6{~_gsZ03*2Eee zXwO~X??A906^ZRBzJYGM(? zv2*uu&hb07x*}0!K;4})WdC_=j-vK46!dkxQ-4kG<9Z8FS7R)jI&#{l8pbdei+hfU z*4hI&pc(@Mc65;hF|-eObAsmuB||U@W|Tml2TU)#3#6mDj2qb3#|N~? zX;snVfw0RWY)yN*U}RR})ih3B$Rl}%;uX9eqcoQ#c_!B?rU~&*Om;HPIy;4YMtig5 zAkehIy^re$#pbV4eh{TXB{#jN*cl6bqWYZg!*d1aAX~iLA(+2=-IJbvz!n*ifJ!!m zTelpApLl$C9MxVBUwsthLP+!@6i6I1$y?*apP_a#R_3nvRBdvKND}+C)89B@-csWf_?fG);kQTOe%hY5+IAS)SgkNXo$G9ps9V=m!g)R&uQpxs`Z(Bx}cD}tvq#X56A3uy5Nhpp@D#+Yfn%ni3SXbyb34SqYXxjQBAwSc4o3i+_)^!z*p zF651fhlbi}19ot=U%|@B^wUzO1zM`n?g*(D7L&pWj#SqY~c^Qx3@X#ht$42ZYoJESe1< zwYk09=O3~EWQM?yJ3%g8qeiFs>6M&@PjEL{Q2e84h+LTv>H=9k8w+^yJp-i#P#c*< z0z3FAweCtvno5kUkR4)6uqcICm_kx0V>o=rZy*%WBN(AB!___!bT)eWC&GWAkUr}E z8b9)pq~7B`gRqmyPdiEt+)P-q7jY25Ik%D30gpCP9;PlHtJ_k!4N8oUI-XpW!#&=( z+oK7~l0}zpDh#^K!_wUPzFruYgm*7QBTA^6XWB`vMVlxTf%(`Qwv8FpCj?c*y8##$ zQ6^^Qin2PO0H?~1l2Ib2h}!`nmk?!I4HJ z$D|zxDX56KaOx{-U~^cfFmkn&z#vUqh+R!Z&cr}HG|k&1FuxD?Q4 zY?4mgFin+PJ~2}HE_Gk?1hw!KyeD`js+_U_Gmfb9_HQwpW>ar7oH!v9eY7HE!(+*I z*njAUn{bafyj%%#8X3*S37L-~u#gl^=k&*da_dOnpF9&OT7e#DQWx+Y_P2~T+=3t= z$Ub6cd>-j!?S)q#39m{FXUDa$bfN`If>vb~6!-wrMlfb}JpW)yscpwcgQS-gl|7d~ za&TvTAfzVA(LT))$95SRy%#E8a0B%DnBX_sIGYG_(3Mi38A2r$(8FCqIVf2?KyVD} za-o#8>0KLV7Co7$O!I7&UBo$7b}VH-si61@jBZ{|Ja+G_{i%1&vLdu$l5sVM5fAYu zl^sBIxHJ;`qm^#}F1w>_x*ql=htJ%DcrR%?)&bnWIu}W`i6vAbN^ZZED|~=<#br&; zPrTj|?Vj8mEj1KN>AS4vS=M82YB|WAZ#a4do?{y&b93gK!6ZYphBsbrdfop16du3D z%shtOd~f#i^|>C+Q-VKFwAVkL7~AVG;dl@X>1iVJc z_GETcerB7x8mLzu_`wzKvqKtxZHSqst6lEtMf?XQr?Y{-wIDAH#ix!ENp)rz&GqK5 zOlGEO(FWzVP43r`()tWZgiD^V`LU>igwa)=wzL8HA?uYp;BX>FXcHpg3nkMsnmJQ2 zyLBx{#DdmvexXP;Md>391&M@QdVa!kn=SK>F*c$lA4Snc6j6lgG^USUPJ7QOphBLW z{64h(>r#Mm47A4_^iipMmuAz*bXABB0xKan%skLI+#%xH?FJRpllRyiV|OKGAu zJX~^>w$qISSNumpBiBeow8;*g@xV|QsOJrOfO2pHqMnun!%q7~c|5+7{^~d?kV#iM z1RFa1bn5v{?rL`xk&uj+q8rqMIYM6}l#Z#yb`ozHA{C6n6fH}oDS?nm-h*wc*=V2W z_Y;+U*tDd!mNx>`RDJ{y=e!~3GdYGhZMu*(J>j(-N7 zjMx8*Bj)W@;%o#;6QKMwCH)ny~BXllt`sy!9fXYy(8 ze(iYz{}WGjt4wvl0ALfjf7aNYz4&m2yS6&SvQi z^AZLZe+jG8)mPO&r?Ey4HFV}W;;<+Bdbt;g<^)W8yzq>GDuXy%g4EV6vWDIs8;+u? zl2wSMfionMI~abz9H`R~O|2GJPa5smBLr3)EN7%k)qldsjiajx{PP*HiVZ?Tm%63} zl>8M5hT78?@dGO54M-=_U-RhEv-CsmeZs%*vimbN8Z%GTZ_d6JWM6-QcB*gIIPu=3OghpGix6>)Gp9{9v5u^#Sp7zT zFE<+uo=Y?zL{t)&PS-2-c~)xi3k^yv4)NUL3vzmI5xI;*DS3W#XZXRmDa`!CaGZ~> zZ;_$ztQ#BUvfaxEp%T&N%2DOc3sk|^mz>5TzAgfANu718$y$wqq|LtNU_c@+T41J( zKq37>5=CSy8mU!U;(9h8j?gW*ekRKhEqeeEW*w;)UeHcLG10DoA|I-)wgD9`p4XH+ z(9cz6P!)>AQyJU$o49$JshL4(p2RPNJ-o=}j|)s10Lt&+z67Vzvg-a$lzn%x@NKgE7doz4j)f# z<2thl#3fuj??pLq{~c#P7R$uFvqbh}Un<2GJB0AHFd!V5CNz>MQ}GLevlXR`;*B{W zRKtvuFD2QJ(^JTGzh9M9YN=(qG)c>-qt{I@Dn*u)%z_#R&jHkCK=d|D(WFWZLws%! zvLoJ=0X4joEaMtx;M=O*!_rLoFo6nw!kxu@&<~8Q51Wav0?5V9GK1mY!QHqD&TpzHbiE}?oGJZk`@x;EjB5O@Vm_sGxsEV zA#wl+r2LXo6Vjp9S}S(9@SU$=yEU`8{dke~i%%MS)R>NVY|mlN86!e_E5T8_AgfgR zjtn;4ai;E%Vd^$wuFr*UON{0^Q}pCCv0BSj^di$~J_9?&h=${i^OE5q6rYmfkd)&b z2_qS%ga^z=WTdp~2^AO*4>dR^alQ$^cJ*t)h*KKknwjPOI*j_wkmPVhbRGb6BTIw^ zNr+ZoxGa@{@(yJ|lv)f;POHK`pO+&&hp<4|sK~)xkTdP4UFtEr8nt^w>WJNy1fE{+ zSudHu!$dy z0uIUBCW3f0Vd}sMJRrp2vD?V?WHxV;5JlC&ywiH8ZI9zbIVA$U|MDdWWK~G9MkS4f z+1tr}fnBxLVH~DOFBiu;$)3gkEcyi>FC2lTLq?tgV$L^coCi8xpL-z%o%s}8|MJ%? zsO4X0x90uEfA<3FmK}ZmZM{l~-B1izJ5k~M?|bLyySSb{$IOtED?misV`Hl&egV0O zS@+LM~)@Lw0qucrNWPnjKP69@h z1hZGyv@JRADa>&Bh8=ga^Ksq~?eZ?P!A+{>D2^j6WfBF!}#4D*??kwDVz0U@i{|3%` zwq_KyEdEk_42p$<1Y&%&=FF=Opg5(N7acO*k_2kVf-OIBa?(ROX<#HkeUeqmx?MTDmc0@M zcY1;(SM|q7a?42d0-3u3uSJo)77l^TnskIuw33$@%e1usnpOI6p#MpgYDf&b5&rc# zM|^Whbs;lT>0qIw>d(J>zZPG+x0u>=qu8NMG`c@;EZj65{rX2#f%mw}?f#1VF;iaaXQ_N&X$m75d2zA`t=^c7yGM#QR zAM%;hG0=z@n3oO6Q-y{gYjg2?mVr3*5IJX|W~6tgSkK;>hM;vLf3_kz=S<=FEjrg) zG~JdP&%2KSwvlSM*T^EGK@9)_=59}RAZDX1B^qt&7NnJ4soO7UAh#w346qgx>}FwU zO@=9SE*?<|c_1*NmYLYRz})bIBO4+Bo9IOyAH;rN%`LZPHY@2ggNQ}n@(tqjdzI8r zoe#7_a3UPl06mX!OnEhE64Q|~xKB}n;?Qselx zovs%8#1(HjXa27KgF{hu-1dIIZD|@Yc@4O7KFF5j&YHU!7KpTZXSo2Y$1^MI7 zJC4l3?cWh@l=_flN|+2c0b7~``?+4}w_>=u%Z~6)yEYV7hD@gIB@7eWjw}>O-k4%7 zbB&9CO$Eeq7?S0-5{=DuJ$;T5!zv<%-j?nFcsZfM-UpqkavEb&#G92Arb<=NxRNP7MO55`e%&IPiDRw#*i|ssOo{r988! zRH#ya}D!U6|; zOornT3e+1u92SQzncy$d!dPqEM5&S6yw@tY?Q&+I*VB7L+w(^*WAGn*H4-(nR*N^$ zmf>^*+bUNTky%iE8%vT5zar{rG^xie`FY)&B|SKd8o`*CPMK3)WlJ?=>ven0HjV)b zutwtf{f6Y7b_cfkR6a%pfGQ@hQ~&>XIn{@$TU@{haWY7V0Aqv#f){K_O~0}^&!I;}GME%Ut9%3F7M6l@pT`F0i_-)#9hBFl z1-vG_zk zSQVmGst#_2yiAE_n+9PVo;`6*98)Urj_{a!X)`ufA`u}{lWuX?rba7Bi5zKgR0Q$t z3-B{FP#_ivwohdLd3!ze%wp>L$`Z6TCll2!GuB!uqSCY?a00!gygJ2NWZ#+z( zbP;fv^Bg73P%uX$&_W}DTh_%(J^QF_;-dpt#DRox7(yx~*3~mT0)YvS1TB>7Oyn+I z*aCsJs?)EFDUKPE$^U{`Ni5(2xn~*myfLutIAnW}2o6N1E(DaPKDN^Z%;t7oebM*C z&vofA0^>5;KtKe6A;|d5jp2xC(6W0L7|(=<5%VywG@%Ujc3~jLp&(xKW+hqWuafe9 zAEUc8k|OU@24gB;07s0z|0z}m3&^0=IU=e!il?qYBXqQ0oIx}*41a^y%=03kq zQT(k#RZ0@n10rh~@s?i7;B0p+o=BOAL2DbpFZI1j$7r?z=%5NpZpxm+w7ODlZLZ?w zMTx;ZWYkHY5{hw1Sw5pSA`|e>`l#A`nRdigkdNE>TS*R{5QnKC*nv~BQ$5OL3ErRR zd@UCb-mZn~S9dor-1O7y))*~gmTjO?urVRqa|TB`z)z}DLc}1EE)M=)9+PyR=;2VQ zHtOpS^VBvN*8$6a!dExFy%#MeH8qy!qFmB|W*vlmby5+fP{$l9u<8RkG{S2t##`xZ1s=z;K8j)g~3X4M^>dx z)I|*duOkb3JZu8MjwC6*7TP>Q&K-7IJDf_fGx9mvrNI$n$FRCKs$z3RHqZ{(LsZ}l zleLo#B!NJ2+D_7bbQRbZhV0n`T9P~=flS-fG_;1(0ox7y@kMsi!Lhw6nrsjTv@fVf2W`y%l=f({5a zOOT4D2(tiW_|}>sh03b z8x^^Q5V#OivEYa9m6z1YEixdG(HZRTb1|vj8t|{LGj{1F7j6EPtCeB!7la=V^ z2?>M@LnAuGy%9q2*7i`IIe0Eh%0(*__gJzmm!USp6|&L)q;`#P;9j%>S-ECi<-)fJ z)f4EHomB@9dqE997VAiGAo3Pu;hSAB(A7}(Q;ym^8>EB^{wac}M7&n{&EvNjM1`HI z{~P*LZ^(YvPT;hyv2COY)-%KIFm+%s=kTgk_UEdtH+P3+Cq zx1Ks}&N-_B9iX9eV2JdJrqlhp1rw?6J{|WFwfoKK6^>Jk_)daClLqL71^`w85AFo( zR_m}j>=8@f=3xmrqMHgLD^QWCr$Ayi@Ea`Fv9HuJX`J%1dxE4~u$N}cer6P815^Tt67c@v6X)5>$AcI&% zMv4BLA#gOka;RRjIxQL#q7p1*&r^_dwS2@y3Np>Yp$$&F4Q55>&KqH@Qh3u+iYRbl zN=9k_v&$p+bnF26HSpYR9{JN6E$OZD?Y-4`eN!|`(oXquEOwhLdAS_xOOKGbI`(J) zfoB0$rBi}MltM{#Xf3{=v>>w4QL0)YhHVR~wd?Bat#n5tjh{L3a1 z*xrEtRGpbbDt9>c51MeZu)s6+YRkb1ikCz0OQyNyS57-|Eaq5ZzBk%lY&>b7YdvsM zrLPMP625GWT;oKaaZUWD6;u$YApnKo6TKOz;qFzl7_6wgD8Nf2%sli7ZSwGl*G z-K=747_^eDl_0>kN)*sLGy2_;Pn7Qjvfdcm5d>i)N##C$ap`qXHy|alczAX<| z|LXve>qud0tU4sw4$YiE5A7UW%(~Dvi=mCEDM7z?pLZCYjnohAG!PMtBfQ$-SSwL_ zdK3b2yac9es1X012iRzEzr!WJ8N!4T4PG7npnuAUDs{~L`$W;DorT&KCYA@D@jWDe zVv~Fs>4Qi^t}5hoJN_0Jalw(WwB$qJS)e*028%r>eSEej%4S;ReiSM7+ae@=0wQVM zPOK+eN*+3I6i>xKqzNuLQ7IjuigqWkr>^i~JYpHXeqwg~f`;TaQbdMstq8SR1J4ra z)CVV|D>GTD*JvF1ARZ zHQHZ21e(xqql&U4h#lKdNhttd>xDW8-=F8fEJ;zi!J2nnr*lb29V7h{L69GGrbcz| zh?CWzq@E@6k^;ead(NZAp3pwYpDuk_-ekKY1TwMVM8UO1;qmCJfKHuShpwyxJQ3~g}4(o{`7THm2S19axY>f8>kJ^H z7SU$+uv{tCp&JfKX4&wqmSwDjGcor9E znS^=Ca7#|S7ye|TY0e#pl3i~zgluOvlbQ*C%!QChgIF=A*aCIC*G{G{#YdpmXZFK) z{>_7tn(aD}*-AfA_ zCrw?9Ud8OB{Df)a5pWzwlD_7|SeyK2gEq zv$(yBEai6KwDA|I^F0|2G>LQ%F1Gh-LivOwDUbZmEK?k>=w0JTcEaBe_B`a!FcNSH z-wpfG0#_Ylk%cPaMQt8?8=OC%Fh{ELOe@klObg-g3nEtcKO)88Sj)>wtO;=<(UA(p zj_luWc{xy0OZ0r%QY2fv*on*&eZfx#44cnKRs5*A*(vsxG;A-Jl2y zl5CaA&UgpYqD>sd^qV0i#g1#B@Kd4+Eb|o%TO$T5|Ahi*vWl9@)ibj1W2DG+g-SRY zPnB$NyIdHQXXr>FXFZ|?L&&lHp+s07@Pc@AKCDL}lsV25^{bGvqRhj~1sZtBE+X06 z`h9%_yV$2JjQ57IBj0N`(RwaV%2L#b<;FYH-$sTJd@6on?)Axb<6sC(R*KO4ng+~` z3JX)GU@BMwfj$*EXc(s*cD+xhX+`u~ap|l#N86i;>bbM}nZc>y-(LxOp0UZf&P}i^ zHtq#O=ocg#+Yo*rftD-AG;^EL+YkGxda+OZ?pkUutps({9Ayu3N8U_91(24|R|h5F zqBC4Z&7P6`H!wW9kO7nWDfL+PMEHQtBM=ArRREiU82aZ(w6V_k>}By4HD=xT%&+hr zJ-B=hohoCLfWqj@O6SLb&)w=(Dk!|W2%Z}7e1gEdW}d83164FAV2ib38M2p7mddk1 z_d+feT!(r+B{~+i38?y`1@28!vf>RP5~)iG7Yy>JF+~5@zEo3KnbOn~9{4`Y8@!9f zW}ut1e^b1Ud04*>baJ`i^q1ISmkPSF|Gqsu`6d-Y;Aa7dCCq}04FHzhe<;Q&L{X8Kci0rEa>UzC z)UBjDYApL-420dSE6+BgR#o_bzVzN&GFpE0SyA$*f-LV3tLU#l{)d+2lDf*$O>LH) z3#)@n?nHP&LxtfzaNaK$0~{&3VYk`1nC;AetWPE~AiWt-B)(s*-Ncy7KN)+$FU(lB zKUF@9is7C_z?@4henCFDIxx4fWE=_jMZP7ZG;`IcT4nB%R$+0M8NKIxelw{D(t;Rd zZXZER|7bDPC@To#P zun6jK4K8KX!O{`2UQC|Uy&Y^vm=h8phG^rC`ZT8m5F2UX?vPq%o1397v^Ez+jT%mo zoo~5P2frTrN!xs!7vF7CC>}ky?<`BHUKE>h4yq|VASs=Z8*St3KyA-no7bHQvFrUz z;2|zy6D-NUkrcmqBh~7CJ^JQ&(_QnZab#h?E*1VLoXWjZ17xvh{PG+GttTIxc}rRGklH<5Js=i0$EV_lRqo@*pZ*s#P8uL+~`|Qxk~>nJln0G z(V(a(w|Z0KJ|zEB=@Z&B2sPJAxmM@Xb)AZoUtS`>+2x`2rAqy=ZRy5Mae0&SU}M;Kv&z&L8fLk7sa{Kf};B62`KI#o#VY&OhwE7wR%! zv_!|$#pAmqnHHvA2lEu826b{gSy*=GP%6oAO{*%^bupshB3TAFfCj;Ty5=Av<5H7K z{#CO)Rwdx5z*FDkkGpp+W;1oE?yQ{0CGv_c+5{A= z??)REPU-bn*Ll`+B+8+csO{K!%m_%P1N471Khp-`la4`BMd%R0qiJ+r&fVZT7{(=@ZV8;b<$M55MtUOgNQ@yhXUHk-5p4)Tcgn#2zV+H$6YX* zQSZ(IrZp~NSvdq4eB5Sgf@ooEa6|T3l+8l^bDqV-qhFjo&05A8Sb^<&uIsoNpk>!1 zfPeYxc&&l{v^YqM7)nw?QLn=RuIX(?p+b^hyg_HbI02isG+HukEmE!ew*X(XoEC-H zqHYT!mR#tPS??p-2!$UnKy-p&WQf;zrOFfETID+DE$0!|4F=xyS_sn(av-P;=Rq6> za08Pec74}dtvTnAEe?|A3T>A(2+p&QBar`|1XWrDIxJ4jn$xboXWMALHJ_+IBv}1B zH>;Hd`ZuTezTJG--ae)4=j|m!_3}rzqsc%2&4C3kL^0>O$7S-sVpfsBIpkdybc!mR?QS7v1H;M2F2>dt@3RMPrkE@t{>XLuBA0oMHwRzeN-MDA*rC$*IbIr=z;-ss`WspQ0P#tT>I7ciS^l z)W~pqj5II!- zg$Uq#9yr9QWI`|TXVHhs8&)Ncel+SMcoYOuO*Xo6h#-}EJwZO-H~3;YeMdT z+LS9_f8~jimwx@9J}@8IEDXdV%RlBNZ+Xs^M3?{j<<@pjb=q@F?Ah@{<*Pp=fNP1^ ztu+!5DXgr3(H{VOfMR~mCyOI@%2Xd}r6uRrSNkO>Wk%hWLLo`Ab0zKkLs<7xfXx02 z9mc;Cv5U5i!)a`ZHb22eGxhzj*s?loUd$MFDH3Z(Wpt9$8rY?Py)P)yIpw>c?w!?= zcsyZMNYYkZ5q*Ml*C)i6HC%9jNX0b^xeA=CAPO7-yDOhSbb9LmgY7PDZSs~Z@kF7s z)*N$|47XELTBo+fD6Sl>48)QVrF zzd_MP&6sJo^htAxvSlm~Uu%ijms8d!d`+?RfDN=8k0WLjSCFXK3`G9FV%$_k#*xIq zIllO7I(9~SbhbV<{fH#?W8uPHVX9KRZz)^~ymNt^Npy#4GZ2Xh(q;|Uyoau$FD)Dg zjH=@Y&r9%%XqE&msd32sqjSaxBjd3!CBeZe2!k$__kgKb3mG<|(dnp!p&`hH#k>cA zL~$Zwk@D|AD5L`Tv7}&L1}K#<@dC|KU_~430Zee;wlcPLep09`b(qHZ+wJh6M6ZtAKy0#md36{jlvVn-CGDEH*g>)-#+(Tr=Y z(Wi3XBtDfd<=H!EKzoI}9)31pA;J9FX+vQ1SDWyA{<@~b^V89dTmR7OpI^K`-ThcJ zd9yh(aLst@jM2Z3y-@vw09`3vB|{Vd^R}y-aa!$c)-c(7EFueeg17fKvfkUB@bAxl z1Y%dUViV~NT4d_)n9$;O<~tp+Rufr>f=q`!WDyOzt4KbiQsrT}^sq;ezyhtf*pNly zs!K7rl?6Ku-&YI=Ybd(grk!$)t8w0_8wTcIlr)0PH1b%t6 za@^)paGmp@++r8Er!DV12!w}lMiiAq*PNKM_3>kDl>?&}^T$t)qb}8a<sXUe6-2ZVC8S<|WVcdV$~gFgyZhlD6v||oPM3d>kTpX1R197LDOB*ycL@)p9g}$? zRTsst1vKjsT-iziK=lQFtodsLY?&N; z|1$8EVmZduoj)^}0ZjGs16;bzEF>mj?w zK-&%GEH{uRAI?M^Y}TY&a6mMUI`8nEv}6tgr^fNi#tlyA8JZ)2R$p0g3|W>si5HwY-Nr7}xJl@yiikW?tIM@lZ10t()O7I& zopwzxQEzAYYUT`Gc#X|PuCuV<;hO}pIy=oEpBnF=lcHxYSKU-Lz(=D^dBeA1=|KQ? zjs_O3O>C|f;f$OltkY&4%`G*BSL-y~`>BEweEQW1dJ4WUbM}_JQ zmv7gWNnwhA+5Nv|p{W256&k$ZvM^6su_F%bPdjjh8u3*YBrMrbS*F2rY0M@Fv;l&S zh@lG=5QE3nF!rVlyDEXra(u&7eIiFnE307cez$fXj-xpXD|lUjUg)(|)x>ke&HbemjI0qr5!4@}IU9G>FHZ@>PuL#_#x0 zDpl(M4eyH(Rp1cEQwao^YeeWx;=$zv1#K0YWWrO99!wlZ1JVs?^)Ws)yLJMJ;^pOn zPOJFQkJC$e7RzWV4)=&ZK)kJeu%Fqq-sg}Ui=OClTo>CJrSG_>rC#uf_$?oCfD0eN zLH2gcOCw*DD(E75cF&$9gXy6dsC2MMx9K`A;1W^ax6g$#*${!JqVsy(Ekjv-x*hRmDc@D9329h)mSu*1>CVaYU89&v$g!sdTj1&R8t>!)CKBt;)jTW>yQ`S0szq zP=7#4+iY@l@MKC6BfCz}XJA(W8F55qH6tJ28&c`SV_yF)t~Z_zE&eaV^5~TG4c8~8 zH}${egATwlm?uUr2$*4?;l3lh)*8BE2H_!=9k#8G6|;Bd+4WZ}B%0`*ZzL5w-$DPC!55#$Hh%%cmS43V(a-SH-Em?78| zgNQTmi;}N1be*KbdmKQrL>nG~Evr4~n86>AcYg}oFS5gFuMqRt)Y4o^eED=;T%jl0 z;mFVdbF1pDhtzv-!;oF)p6RFBnFBw1Hs?VrH zg8Q==$2-P}S{aKW)-m#WFdIDN;c7~+=eS1JyFw(_Y^o3W>`1U+;$?;tP%|fXk_yX# zlH^BJ%4XX5ueezvV{GvCF^lRG(ul&eh;2d*MHTYjbUGGjmT*BoN{I~8=IS8e`;p2Y z3h>s|&{ZAs#7O+&S-+VdF-37vKhqW7Z~cRAe!Gr*x2CrVR+k@sY*_wnK|yG*u22$U z3lhqlC<&1L`}dvG)@jhz5@^slG1+=MZ!mcc!6yQBD?|AdlE#M-J<>Mr&J8Hyh^@%U zGL%5fwqUJ4pg%Q;r8EcD!M`-n{6)~WR2|T-XV@zHzLXgxY*yI|*whhrGOKp33f3T? zBtX1d9kP<%3zr4DI|vYH0!;y5q&QqiF3Q@r=!UuD!751I43y>*+Cm(;+J8hTmZ%_r zW#S}%!g|GYLV%zwnHpOV=R7H(Rxn1OV)6ET(oOgzSMC$28zvsF)`PfI?VN9tg2auu z;CY-+*fOazo|YWHwNn!hG~RTJ@UkLmR1HALWkd;#%Hs$SR!j>i@~gTt5XC;nfwc>$ z1Fq+TGy$o)0rH|_LA19_lqcBD<?{be%2R3`Rxd!y=Ja_uyVsSiF zlA_s_F~mZI>U(V$TM#lu^0d?uIwW-77^fAN(qx@BNc*vRoLcSJ6j#&BGIF-cRw1F} znsBp<;SP7T+YWflXZq(9zs%BV6{c3ParrodQ4tKzuJUGSmC7m4lee`Ww@DMo>^YQE zVn2qW(o?0ru7SvRR6hFBSIrkab_qDfb06#Io#`_G^s88klqxLZCz2Zk@fNVS(GYWs zvF21duf=DL!9&TGKfmvjBD-Bcu5iD7 zxjYmIf*FGzYiV1=#d>A;dC9`-AnHGO&M$NOde7EagY(_}FBqyo?n|4rYkoO~6Q11< zAb;E0bjY}Iws2z>qI^A(*PftLDPKr;kHD7H#hR4mD%52f0=?EYB7rSZx~#`}lZMpT z8F?f&kp6oSwnz8`|JsFvt_l@*hJ+WRe>!>UYaDy;Iy1Dd1H>+U6)KhIE?~hA7KS!y zw%QnO%f%J;!*9{VCg)+@2n?eKFWVqlA;;B6x$lg}AVSH!T^nv`+ACHXd{|Cf#yqhb zOPV>v$+%lvD8r;rBbeKUQZ$$>)6Iq|xWO7tvt6gQjZM1?f1fy65mQJ<&~_Rdj}C`w zWeK>JAZ|ub9hk+X9w|sI3M$^4kpLtyJQJHMTg5>WRel|GUEJg;2w~o~hSbANI^i(N zVWVqodZbBQ(Q`(x79lmM`4lDGUa-d~!KR{VTQ_40IXF)m1?6&`+W^y0N&sn>aQHp~ zas~n2+lK|+JYh9s16@f=^AwV|5qb@|0$(_#1;{rzb~HS*IS^k^n4wLEARV;ykz5JR$bUAC&ITk|i9u75 z(rKIJqTs{ut3PZ4-hZmF8fI%?Gl(I1Ru&;Rh5$}r>EGkff@>abN;gPSoK7M%r z#tJdBwT_vpL8`a-5&4=DCG(krEMaE*&DJ!U8os*fP|YM-9EQMLwd=AC2!SEpC=th46H%wv zpI`}kHTPM$sX+FHB3@Fy0gq0fH~g4GQUG%$vJ7u0E*T~kn-HX8Gjyq!5#niDG=zEl z*)cFk!$%xH3?*^bmb^l?+saNDbSFz*qEsNKTdwJ(pC$-s=z()VMcf_uPW-%Ki<-JN1gk zOkVZx-|6mdT1IVd2y&~1$jR#GtqOROYPoE|Gwug?J zgI8nj6%|E_Y2bvJv8Q_A_`a>* z|6PeL8Fl)ivC19`pEe8EEa2dMgWB%rM*Js&;7Z0CyPXCqMl#YD3WxSTNk)!wiVWub zu#T>BeuKV|n}6N~r%3z9eW}jA_vY;1)puP7-ra9+cgb8W#{~sd^MpFSN8|2&k_evL znue!bH`yOaTxGlLZ2tK9Tl3-`^u+!)zvirk^3sui@8eW#>pCrcqE({&+8>YTnJ#rd zeV)AhsLriK<=*G{PhASpFHy!4dq^mhB-qHo8F{MI?7tIRD-yblYOe*b#l@99hoD_$ z7;oXnMWE_jq&-3yA|n-cXlal6hgYemPCX~2@4B&m-`lvEr0a9Y5hWo(5X8_*&NS+k zt*ko$tNUh+8owVo+GnyiDPwo;=CsVg!-wl)gbD-?$-}?y_cLy`Io$v|Q@J~O8-k%kR}s<6OPH8F>9zXlXIO2D3HL9( z$n~j;LE{piXk$uea{l}D_;E>zdeXD=8Eup9D0$;UV{+H`gz+h&8+VUc$gS%|A3AyO z0^;7_rmByRR@1M^tM@%McRVR#Ra@scSbROQXV1{ekx4Cl(@$d33MR>N;)eT1eTUcNgV5KxS3Hbc>GoJ5>xvlrX@`Zdve z*9(#6ZrV9luTRsr&vyMz`tzn>U#G>Iuu_fi)1tkUpyJ&6<#LKg_S)Q~%xA|Abli|! zvXga8E!orkI`GtH-TUT%%V90GyG_w(a%0O=m^TL{bqgMyQNt@1vyl7 zb4L^%m$tr=h%^_(J16{88gncxpU$f4I{xHHY;yC^w_~qgwJh~458OMK{Og5SZezlv zF-Eo{BM2eTiS2ng`P-*X{%?~+4N)W3*23v(j7}TeLc^vyzuwmb>{YP zVW|s5UY@|LIWnB;CcByV>(a5G;cn{3%dYa)RHbzN+QMyT&FDr*X z-Tp|4Az3FUuiq-;{Q588;H+nO(T4};vPxE-1~z;MYbBl!poab2A2Z6m^2~6w?af~| zyR}c(%mSaB{rmC5vvD?CClZ~)g2H!vbtx#WaLKSL^DJrVJbVlC?U*UN3Eyop=Z)4} z*SZPSeN=Ywh^SWWl>|657tv+sT!o$DzCB?K~IQ;g{`sZ}d|4P{nDn0_CX8*puSs26blZVgbpVF(a z*0zNhyYB4<@4Nk3Huc6YwZD0?G!Ce#Wl%= z?#!1B<{bC;Jd6W0?*L&Ed3U)Aho0vqOum7!8S+}!{fjzoPQT8u`#o))?(#;Dz=i9g ziuZJOKJeY6e(SlEzI#yP+j^aB%M6+5C%@cfXWz8WzHT}|!!w+5+4WBh&8CiCKl^ie zpz_S<+P60+0xNC*#{XJGI^1!=QK+*aIqkMl)5pvM{|0R~P57S}Ya=Q*CLTD9`BIX1 z%pkTP(x{gdX1;nSyYj*N&e!++Hq(6TFPaa<&qn?=Nj{gnl6`cvF6tGDz3k&KcvW|Y zie<3y^b-?w=X{{k=eVCyOWK*o``W+18bc@73|}sfzFVE;p6FuI9QJ+W&)W+cKAxK^ zn;|7<6Bf>-+wUy5R!Z~EBasjqu5x{h?s}h{C$;$GlyBk<|5w3mU$$$R{hk#yFThlA zo5WA+e6U0fU1Z^ENM|Cs_V!#5)~zVZ9$tafZpMrQJ&<&ju8*PG_x)@@@ZVM*DH7g$ z@MGrFN@Tw3{+hbRw!4d64{2v#RW2kg87>Ce8;mGy9=(5f>*&UxEA^X0_rm|JMT(G< zAq|%RtTV9fwE9I3r2*p}!8OmSc+bye;P?IZ&K58eGr~@vJ^({Vm@U|nKFWeV^0#xz z)@9awF{H{+l65P?ta+!B7u-u-&2#E;O=8eC{1ebR@|Q%55JwRCWnvf)qOU=fxH^OxSI-CG z&FvbB^$x(!(;CzuTKU#VD<>ylPbrdc+3<=`<2rapFCvsz8{F?k1HkVPrTcQmRO1cnBrKxe|`#gZq$#U*^>qV@5Qw z=Bl=bjW~X`#RVKl^8{*q<+y*Fdrhpn!?3zh$j?EFpXjP1lAOK4vNjjxCd6&2?WSez zG`4fx6ha_Mk(4#$jN!ev^CgJg+8Aoz|d)wvqa`*~kRFrFXMez2atI z(!HWAYa{GLg6@n!GXR<61Ax`LC*-4RMW~?SrbY7)+k$nC#? z7!swTKR^*v(!5E+F+nTbu$e)=0CIye9%)>&Nk1Z6gw1gnR$Eo%MxFOwAS0GxeS4{7 zxwbrrE?TyR|Myt2)UTdf*_#_J^~q}ko0G}w>7KG%AFrl#t&D66LqOPfEME&?id=t9 zgf$KFVpr@k_v-qnfIR=DL_29g151s#(FuWRTOhEKo=S|1r==T?%T9L+73@^8thXeA z?IZAlG9A_x(zBtlJbHty+>GxHnV^##$V#MG)vvXCPWJKpH1#LDt<`66d7l$K(j(9B`XoTAsz$AG2tM+Z|mbDFK@ z&xu+VxA)t=AjG0Jfr%;^wDW1a7{__lq3L`>VHOh#oTiDokSJlps(G;BS2H-X54VxpPQejW%qgSl zT(NQZpDK_|@!lTeRna=GfgTTWfzay+$bvj`N)H9g6O1X6=haEQ-(=a58Ez4l73Fd8%Tu4V$ZjH{pfERYsI@P=8tD;(JTE;6*xb?55vKTju|v5A zyKnE^r49ql`__F2H4<_DH9JADW+(Ew!fwHvV<+YHtY^ffH#T|l)C$-~rGvdn^)~^V zUTvJB~m+$N%vZ5K9DUtBXxAFIcwq8%E?|ITAH! z@IkiD&Zr68?z$SD z1{yjY&?s%L-^j#y-PEH3y-roT!GpMTQ84#eIb-QpXAt?^Ve&bwV3!|o>Itw`Bl5_1 zH|ty|aLxcyYN8wQnbytJ-%htZ{R&J}qX&bnrl}2$-dJbT)~Ao@nqT;5`!xyNdx$|3 zh^itnzRJm)Yk^@1PV<)m(Y(RNw<=JA!81P{GsF9>EK7blmQ;vhagFQG|GnC3UIOcW*YNmlQ}3A|Nod6N6T~j%dNi zwPnqu*cFC-%I*NY7nf&?l6g_+#koBVSq-O}GjI*yKQiVUgkh8bP>BaC0MDCD^b~e_9ODD&_VF{Yyp~3L(opxzM+S=HV{ck4(g=zf| zTuKjpj;~vBA>j~SwG8IuZWB}Y!sYT$A&#$kj4Nqm2ZIkfJB60Mxi)uEU{-eNJRDVM z_>oo7PkBZ-8sf@=?K^qbzeTG$$439~pMeFz6SC{_TdCtj9^<1ym9S`o3veXTn= z403}LPS+d1z?L*yauVM174xc?h}ckznA~k0K@u~8)?kr;q_S$} z>Ak0_obo7qk=ulHTpqM)M=3-HP11jvAAG+dy!BYfnR*R@^v&FHajJrt+;s=1Sp`cW z1C0UcGJ%ZifbnCOeR*;=E*%J|#b(+4Wij2TOwpIPbF(To#>vJ~xiI;#8F9mW1uX39 zF)~Z!5=LK?Bdj-SMYA3`U0MJYLxKR5k?_q#Y~%wrd+)GYiU zxaKm7?KLkFVB&R&!*dNMbM2noMmD4QvT!2a{GxRC^q?Sl-eRrR5X7|bvYlf8-8|gA z-g{V>TZ#GI;<;>J*<_#4pZxbez*lhink55(I$(a|AnZW3OWM2my>y2z_X~QJ+Thn@ zBKR_r9GsFL0E;lh{nDs93Z2iizQj^hz_BVw{A3X4hm29{yKdH&w5U)FY;={e;_)r_ zj9)M-*0GEcT0`D#1ThpS1#epews}vu3K-iS?d$wSat1l!Kdkivp*4f!xGy8Uj6OLu z&R9E$TPe&q6{<4Ty7H7?~7`^u1H74&{v_)jqwI- zku@1+s1n&SPZE84R!+0WdU=;19h-ks*wq<$E#M@t}4BoUz?9GKda<_TzW3dnf% z6Mg5%C~w&t0)~ALS7cw||1fke{!H!<9DlYw+nzD(BKLT9HF6nA$Yq;h?o%pCHMd9- zQb(n1Gi+{c?nxP`)X|A@I_h*8Nk~O?I_lSDq?0;MA(bTk{0qLe=lwq% z=BWI@kcy$V3dkmvL=Bt0^<@&D-~a@@z}1y%OWq9v6l=Nq#m&5&&4E8d^k9z1n~<(m zh3YfcpYI@tay%7c%%(vNU6%KcIsoAlD88iH)9LG)Rw@9^lgmS;8!{@gL(=0ldyZ;Y zB>L0`Qx&?fne@NuLTBG7X#$Udg{mXlV>xApi484MXacJrYXM}4A4}Gz!(UIn)NGPY zvcx5={JUpEN}N(9dj(h0KU3pO&{!Q=KB@VIWSPd&9@wBpd+PZ2H#_cOpUj$<=9mp= zz$-MuGtz72LRODBGWs;;WoXkbxm`ywl27R1mb(_#pQrfx7qI}P^4rGT!0&I3wLiUm zZ%p9c|Fyg8$4|t!SJtVo4iZ1THQ1kfi2C*B5iBrw#sx3|CimiCa%l;NA4@>wj_JI? z9Y$?PAJ`3&>|L##9P-75{H+0E4IwH3RGK5s4Fcn-^f~&SW#Z(ZJwAI3zwDu0loPf5a>>(>%UQ!s$Z)B z56XXei0sxIg!+6fh+8TXmgO(m$dZc~C2kuDNM)^f+YXaP5pvY*@z7;zt1Ouit>*Z? zruqxR8`LHrX+r4%AdaR_Vq77^@R`xueP|u(?r!6}GvXwUd05O+5b&qmq6x>QI#^)k zir@|8)H%Il;;_o3^HCIkYU+)XRZ4-*ZP;ixzJ9cH@Gbv_R&FmIFYe;;W!R^UxFLnr z1_BgG*^n+F*x{F}%2^BIr-!_7<}D9cFk@k5t9f|I3HZir-qzpnqXz2Tr?x4n_;bg4 zw|3fe`r)vn#NQDn%)pWsC(c5(STX~I-NB8 zi2Q!{4Kt#E1$3eRzV+nIC56-y@13hNFu`0(ge(0ML9YM2l)g56vOAZcerx(g zhCw+UOg>EgibMAkR*ir0a!MxhYSR5hnDQ{ySV zOwjHqJe#k@g=p&g(6^{CfFa4W`f_)T}}f0vbQvLhPf~@h{6H zEZ_XiGEvl6Xq@H{n6?#VK+Hwo1D!RZ zVqSD@lTu!YE?Rt*Aa=v|O}5eFx)8SSbPaC%3Ic>#2lOH{*~^DeCmMz57wsTV<5{Lr zIm&}%ik|?m{?<841FnDdU0!|@WhTaTQ(kHb!nY^9$4l4ge_H|Tgf#zguKowz(=0QQ zRbX^P6D+%ryi`r-Q>*UrQNZrSUmtb<{6%$h&T8=$R%3NQba;w9vCWG9?Lna#@YVlX z9fDIYbQ;#tz_#CT{;LMJotvu6Z4WBG$UR*A3JGPK_tEbVhqmU4uT~-Yo}Pkpjvd;G zT?^#EBF=#^@q#JhvqW!l5z<;=Ba_4zuxq7AB@x*<(uZc_?}kkQ)HC$FgM4Q8w{|7D z9By1e3SC=rY&&EkD4jf=p1@lhVL_iZ$HkiM+2?M`D0S)K1h;q)pO)~{)#-^@C0k8R z3RXdV!s9xv8DB~7=JuWjGRv)frg0r%8kxW?!=74b%(hyKr`*~k3v<&^c=~nq1v9r= zea9tb=rwvUan+L3mufmile*=;dh2SH2@l}-9*wcwyv@>s%vV5GDE}o(oljEPjUnpWrQxF-kC&2bZRaZ|)z86Ra#URXk{ z#a$r+7n0uNll-a`8D)w{XYCarX0EiRD98S7E4@0uKorj96=T{+V78FVuKuC1@US#Y zFwW_^J+LOQYKX!ZMMkjO3K=yr(-XO|bKY9u(li1HRD3u4s@vykNmN(znL8hC=$ zq$JwKjDd1uw67X1@D2=inLxL|{}wfu%h=Fyk*+MrOu%$1c^~V3=A`c6Q~b_k4=dCTkD(CGZ{*w+CyH2D=1}G@l~`N1s6Q+c-hTMaM=zH0F&o7VzGx_k$+C- zmHxO{ac^-N`*@odCHGs;;rR~CkAX@*nl%Uun168xFm@mcE$DiG~7)#KevIie; z1(gxY{|Cx-u(l0RIwMES^m)0^1PXc1*huc}K=6(Q7GcEaMDh0m@mw&!Kc_bT7v~Ba zS2{2SG-*0XmNiV=3(fL5378?O(e8ECGnGv;L1`6z1=m~b*0E}P0?MzJC28SK#mSw6 znpY$CfOXQfa6xwWZgHVC(LUierKh~)(DC$DS&gwhQhgD5&|j3JiNq2@M~JHzNvqqg zo2HC~-R*gkyJ$z7}7 zakpqyjpWFX^3dA0y6P$oRi7DN8w_FSLOFieS4Mbd7;FsO**ipgcStg0l- zn)eU|eubccbn}&TC<^o;|BadK-Ktai1(7CY9pLG^lQ5&%M`-1C^KS~uXwdDDOFcVk zCP=)xJ9g6ZGIPbMW%{S09wxEd`h8u*X70-s{FX=7?ZD2#TuE6_xAn^VSDyQGM>&65 zLxb1$$NYg87)`;b5gG!i9jc{eZ6eD_V<-~td zpxnpfa|!p8hF94n8H_QfWZR)N-AH`{?$Wq|7SlEH<}gU{G(^;tbMl z7EzkT*P4y4(&QdZ213}j_y5L@S=80OBH4<`PWs@jYjwo=Z^jqH58Hit`>O8a=56C= zex5o!i_+wJ6W*H2~b2eo^< ztsbLRXDSa*%owJrBL)9*j-3u!#xB;f`Y6d;J-Y@3Qt!~U5m%rud5Cn$b?Ou@PwCD` z?Dj@vZtI2-nE8OC@-x36lb`Eci`$)kQbiWB0=u_qV*{oPhKfl4v2?9dnwJr;+O^qI zRLN`*$1T%HxT`gqx6WzMF|a%e+1+YvD8+h0`r7D+W-qJt3bK;ytXFbDV{0r+02;T|+=ZHEnaK7hc z?BA)yW;jz3ntoR^TW%;$#zko}_(bD3+x3@s=Y@&PVlev`391uk?^t#Xj0)vXRR}7D z)ntPv(Ao=y_psxXwzR59u+K_;U`;1%*#tHSEPxYmKk5cSF~>VHZQO9@Uj!wuji+1+ zTJ$V&9D!pdgn>a(>jrtHI|`7cbJ~*mpVA4$Tj_&@QRNU=*HJeU)|o+Eq+ymU@R@m* z@`6SuD9SUQy@}#-k-1)F@t=Av7(JtpFuy1HRiRJ5YbPe04{gFRQ~yQXyF#=#P02{H zA7v60+fXTETaKMyhrJeiR39g@?%>*=*(}H=ZR274F7If`Xoq~G`~I6W7?Pdh_&yN3 z-RP+&MT}a_1W~11Q@0e!5bQo?&TqvF9}P-w{<0OAeY&m)aE-sqt?Sz{&P2AGA^)iV z8vpfTV)(aD*9d}-!pZkQmM*eS?k9dm6+Z`CoOj{OM%k6%Bw<}m=6jiNV8FbMpo32aN!DSa|Jt*4}VqPL1Aks~? zAW^t3Yu++W9>gKbNl!IWp*@?vADFJGmF-I~?%*98y0e{vdr38*b?=Hq zu%932o;O~qfbng{Xp0BQdSlGH^uXoQH zNi3caKZQ`FSA-Bh9yv+pB*(_iO1t>{!zNNv@cL;~k^yP&%e&j{Ijud@z3{RvPi1SS8k5 zpwB{~TEp9uW9tQ#Q#S_n&gBnKe^k((CIlnxqV3M{8EZLK$T6HX9i339lU?%)atQmN zFVuxjcfQ*s=Vpt-VhwMbdXS7-RATKmr^Z6!{NF>;R$XWEQ|k?RC~CnxPXAkQN5tzM zt4(>gtN3GD>iSSO13YV(IiYa1;Q@!a(XuMV`>wjUEzaH6|AFQ_T8k|=G%b7iDM1tr zp|6vp0q63*L&Rt)n-?so4?b5+An0&6FAayvlkL7IRLCFbF7WO62GhLy<(pw_?J-xV zKw>c`%B1A98T=&9h+4-(;5Ld)}jxTiBkOU`I8T+iQi2l6Sm!Rp#@^ zexpDF2^CE)kI6-S8M&VNbln#?9hZG=zybMUllOR+_`{K6)YTOa0zinX6Jw<_<;d1v ztB_3TqG!Sh=>}{0&eNhNr9=1+ysH%%{{EE-eciv-mlYP5E0x!jN}U7t`-~|~YiY4> zn8_vQ8!eE2ApXS56z+KM(ldB$_Uw9}anV7tn;*xe%jCVrG{I1EyLR`VCf2S!N91BH zTk@a#GqXnK0x~cz@ic=Y-q0~^8vL&^)VV=#^eZ9%3bV_#6Va=3M*{qvF6q4YeWr$& zsv@eIoc7eafje+{6x+a7>g!m@20k(J=Co{*#L`O?$K#yV`!$8Uq}OX?r|1E;>$*Ly z#sxZDhu9O!%{)b{6B0`lijuchRX?5QstNh@EpqV^WrO|Pt>wP9dP~Wev~BG1rUpFE z>nrOdQYgDQ@�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�=hzk6#Xh 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ĀZbjI!I(vSe=rv6NLdA_6L687eAjK}0~r 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